@objectstack/console 10.0.0 → 10.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{AdapterProvider-497l4p4y.js → AdapterProvider-CJjaoZJR.js} +1 -1
- package/dist/assets/{AiPendingActionsPage-ux0cUuun.js → AiPendingActionsPage-B4OLmiXS.js} +1 -1
- package/dist/assets/{ApiConsolePage-uUkhblGX.js → ApiConsolePage-D9A9ewr3.js} +1 -1
- package/dist/assets/{AppDocsIndex-BSiJIyVl.js → AppDocsIndex-ChEbT5sV.js} +1 -1
- package/dist/assets/{AppManagementPage-COxgYP-L.js → AppManagementPage-DwyKF7UE.js} +1 -1
- package/dist/assets/{ApprovalsInboxPage-Dfa8zdNx.js → ApprovalsInboxPage-Ca5Bb0JN.js} +1 -1
- package/dist/assets/{AuditLogPage-DD_8Xcar.js → AuditLogPage-BtNmxWyG.js} +1 -1
- package/dist/assets/{ComponentNavView-BxuZYn-k.js → ComponentNavView-naLkSvjF.js} +1 -1
- package/dist/assets/{ConsoleFloatingChatbot-DEn_10k3.js → ConsoleFloatingChatbot-1MfhDZaK.js} +1 -1
- package/dist/assets/DashboardView-Ccnc4ERO.js +1 -0
- package/dist/assets/{DashboardWidgetInspector-DKZkel6E.js → DashboardWidgetInspector-DQvlAqdm.js} +1 -1
- package/dist/assets/{DeveloperHubPage-fRcSSqZS.js → DeveloperHubPage-COHQrdbV.js} +1 -1
- package/dist/assets/{ExpressionProvider-CHhp2xGN.js → ExpressionProvider-C2XzKImE.js} +1 -1
- package/dist/assets/{FlowRunsPage-dkCyzr_z.js → FlowRunsPage-DIO45X3A.js} +1 -1
- package/dist/assets/{IntegrationsPage-BsKw9532.js → IntegrationsPage-Bu6X6rLQ.js} +2 -2
- package/dist/assets/{InterfaceListPage-BChUfRxQ.js → InterfaceListPage-Cfv6Lkis.js} +1 -1
- package/dist/assets/{ManagedByBadge-By7dMA5p.js → ManagedByBadge-DDil8sjK.js} +1 -1
- package/dist/assets/{MarketplaceAccessDenied-BfvByBjR.js → MarketplaceAccessDenied-C3bv4Vmg.js} +1 -1
- package/dist/assets/{MarketplaceInstalledPage-DvncMfVp.js → MarketplaceInstalledPage-C-saIRJu.js} +1 -1
- package/dist/assets/{MarketplacePackagePage-BLKOlOvZ.js → MarketplacePackagePage-CcpJSBrF.js} +2 -2
- package/dist/assets/{MarketplacePage-Dkjj-Z_o.js → MarketplacePage-B0zIXkwO.js} +1 -1
- package/dist/assets/{MetadataInspector-DXNojk_m.js → MetadataInspector-D9KL7Kgi.js} +1 -1
- package/dist/assets/{MetadataProvider-0eg8cMSY.js → MetadataProvider-BO_KcC86.js} +1 -1
- package/dist/assets/{PageView-DCLMAUNP.js → PageView-gzbH9RTq.js} +1 -1
- package/dist/assets/{ProfilePage-D4gJzhqR.js → ProfilePage-BXz0C-TJ.js} +1 -1
- package/dist/assets/{PublicFormsPage-C46q0LJ_.js → PublicFormsPage-D5-EASU8.js} +1 -1
- package/dist/assets/RecordDetailView-ANMXqsUj.js +9 -0
- package/dist/assets/{RecordFormPage-CmfCTKov.js → RecordFormPage-BYeWa90w.js} +1 -1
- package/dist/assets/{ReportDefaultInspector-CRLMz2jp.js → ReportDefaultInspector-B6X1lhzs.js} +3 -3
- package/dist/assets/{ReportView-B4fZ9FuM.js → ReportView-uPqsauzE.js} +1 -1
- package/dist/assets/{SearchResultsPage-BjfVk8_a.js → SearchResultsPage-DraOSIqg.js} +1 -1
- package/dist/assets/{SettingsHub-C_eMjvQA.js → SettingsHub-CzOLpvoR.js} +1 -1
- package/dist/assets/{SettingsView-BRVJ5Qgf.js → SettingsView-BJnPeWpq.js} +1 -1
- package/dist/assets/{SystemHubPage-X9aTvTMd.js → SystemHubPage-CeKubn-w.js} +1 -1
- package/dist/assets/{data-adapter-DISUVKTH.js → data-adapter-QvY0S7Jg.js} +1 -1
- package/dist/assets/{framework-DI54pxGD.js → framework-CsYa1Kaj.js} +6 -6
- package/dist/assets/{highlighted-body-OFNGDK62-13WB1hjG.js → highlighted-body-OFNGDK62-DH1qH6jn.js} +1 -1
- package/dist/assets/index-Bx77jcFN.js +4 -0
- package/dist/assets/index-CYLGNLiD.css +2 -0
- package/dist/assets/mermaid-GHXKKRXX-DlOIGBXr.js +1 -0
- package/dist/assets/metadata-admin--twLAcNF.js +21 -0
- package/dist/assets/{plugin-calendar--KxXPKcZ.js → plugin-calendar-HZM7PnuZ.js} +1 -1
- package/dist/assets/plugin-charts-CHVu5fbZ.js +7 -0
- package/dist/assets/{plugin-chatbot-BnXRjqnw.js → plugin-chatbot-B25XBELF.js} +6 -6
- package/dist/assets/plugin-dashboard-C8TbFk_D.js +6 -0
- package/dist/assets/{plugin-form-CfWEBrxU.js → plugin-form-sm04IEZv.js} +1 -1
- package/dist/assets/plugin-gantt-BAbv_iPP.js +93 -0
- package/dist/assets/plugin-grid-pjPmzTDb.js +6 -0
- package/dist/assets/plugin-kanban-CFOumo0N.js +1 -0
- package/dist/assets/{plugin-map-BJaiEhqS.js → plugin-map-DD4Y0TfP.js} +1 -1
- package/dist/assets/{plugin-markdown-5mHDCnjJ.js → plugin-markdown-Fz2pgiZT.js} +1 -1
- package/dist/assets/plugin-report-DidhEKAB.js +59 -0
- package/dist/assets/{plugin-timeline-CRg278ig.js → plugin-timeline-BEk5SlxQ.js} +1 -1
- package/dist/assets/{plugin-tree-D3iB5Xsc.js → plugin-tree-uFJca_YQ.js} +1 -1
- package/dist/assets/plugin-view-CDxJidrj.js +1 -0
- package/dist/assets/plugins-views-BpKTWXXa.js +4 -0
- package/dist/assets/{skeletons-CCMkzfAg.js → skeletons-DZWz9Ill.js} +1 -1
- package/dist/assets/{src-BTw3UGh8.js → src-CpvBTq6C.js} +1 -1
- package/dist/assets/src-ZyouQodC.js +2 -0
- package/dist/assets/{types-BXXHtG0t.js → types-IRCvjK2K.js} +1 -1
- package/dist/assets/ui-components-DXl7VfQF.js +42 -0
- package/dist/assets/ui-layout-BwKCXo1Z.js +1 -0
- package/dist/assets/{useActionModal-DezoqP6c.js → useActionModal-CYfSmVlP.js} +1 -1
- package/dist/assets/{useOpenRecordList-DjbGsO2B.js → useOpenRecordList-CwVRoKH4.js} +1 -1
- package/dist/assets/{useReconcileOnError-Df2Wf71r.js → useReconcileOnError-BXVpquqp.js} +1 -1
- package/dist/assets/vendor-objectstack-C1teU2a6.js +96 -0
- package/dist/index.html +4 -4
- package/package.json +1 -1
- package/dist/assets/DashboardView-Ca89ME-z.js +0 -1
- package/dist/assets/RecordDetailView-B11-8-pz.js +0 -9
- package/dist/assets/index-BnskSwad.css +0 -2
- package/dist/assets/index-Nsh10i14.js +0 -4
- package/dist/assets/mermaid-GHXKKRXX-CnMh6H1N.js +0 -1
- package/dist/assets/metadata-admin-BI5ITi-1.js +0 -21
- package/dist/assets/plugin-charts-BtGgj50F.js +0 -7
- package/dist/assets/plugin-dashboard-BJU4e4Lc.js +0 -6
- package/dist/assets/plugin-gantt-DWE_Yo3S.js +0 -39
- package/dist/assets/plugin-grid-MJIEbrKE.js +0 -6
- package/dist/assets/plugin-kanban-CuXc4XOR.js +0 -1
- package/dist/assets/plugin-report-DXVbwZO1.js +0 -59
- package/dist/assets/plugin-view-DuycwTEq.js +0 -1
- package/dist/assets/plugins-views-FDlQfg4L.js +0 -4
- package/dist/assets/src-KdhDBRhc.js +0 -2
- package/dist/assets/ui-components-BecTKcFn.js +0 -42
- package/dist/assets/ui-layout-BG3TnLjr.js +0 -1
- package/dist/assets/vendor-objectstack-CMEER4tu.js +0 -96
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-ClIa1CJA.js";import{v as r,y as i}from"./vendor-objectstack-CMEER4tu.js";import{i as a,n as o,r as s,t as c}from"./vendor-i18n-DA5MKfC_.js";var l=new class{components=new Map;lazyEntries=new Map;listeners=new Set;register(e,t,n){let r=n?.namespace?`${n.namespace}:${e}`:e;if(n?.namespace||console.warn(`Registering component "${e}" without a namespace is deprecated. Please provide a namespace in the meta parameter.\n\n Migration:\n // Before (deprecated):\n registry.register('${e}', MyComponent);\n\n // After:\n registry.register('${e}', MyComponent, { namespace: 'my-plugin' });\n\n See: https://github.com/objectstack-ai/objectui/blob/main/MIGRATION_GUIDE.md`),this.components.has(r),this.components.set(r,{type:r,component:t,...n}),n?.namespace&&!n?.skipFallback){let i=this.components.get(e);i&&i.component!==t&&i.type!==r&&console.warn(`Component "${e}" bare-name fallback is being overwritten by "${r}". If this is intentional keep going; otherwise register "${r}" with { skipFallback: true } so it doesn't claim the bare "${e}" key.`),this.components.set(e,{type:r,component:t,...n})}this.lazyEntries.delete(r),this.lazyEntries.delete(e),this.notify()}unregister(e,t){let n=t?`${t}:${e}`:e,r=this.components.delete(n);if(t){let t=this.components.get(e);t&&t.type===n&&this.components.delete(e)}return this.lazyEntries.delete(n),this.lazyEntries.delete(e),r&&this.notify(),r}registerLazy(e,t,n){let r=n?.namespace?`${n.namespace}:${e}`:e,i={loader:t,meta:n};this.lazyEntries.set(r,i),n?.namespace&&!n?.skipFallback&&this.lazyEntries.set(e,i)}hasLazy(e,t){return t?this.lazyEntries.has(`${t}:${e}`):this.lazyEntries.has(e)}loadLazy(e,t){let n=t?`${t}:${e}`:e,r=this.lazyEntries.get(n);if(r)return r.pending||=r.loader().catch(e=>{throw r.pending=void 0,e}),r.pending}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}notify(){for(let e of this.listeners)try{e()}catch(e){console.error(`[Registry] listener error`,e)}}get(e,t){if(t){let n=`${t}:${e}`;return this.components.get(n)?.component}return this.components.get(e)?.component}getConfig(e,t){if(t){let n=`${t}:${e}`;return this.components.get(n)}return this.components.get(e)}has(e,t){if(t){let n=`${t}:${e}`;return this.components.has(n)}return this.components.has(e)}getAllTypes(){return Array.from(this.components.keys())}getAllConfigs(){return Array.from(this.components.values())}getNamespaceComponents(e){return Array.from(this.components.values()).filter(t=>t.namespace===e)}},u={type:{required:!0,validate:e=>typeof e==`string`&&e.length>0,message:`type must be a non-empty string`},id:{required:!1,validate:e=>typeof e==`string`,message:`id must be a string`},className:{required:!1,validate:e=>typeof e==`string`,message:`className must be a string`},visible:{required:!1,validate:e=>typeof e==`boolean`,message:`visible must be a boolean`},disabled:{required:!1,validate:e=>typeof e==`boolean`,message:`disabled must be a boolean`}};function d(e,t=`schema`){let n=[];return!e||typeof e!=`object`?(n.push({path:t,message:`Schema must be an object`,type:`error`,code:`INVALID_SCHEMA`}),n):(Object.entries(u).forEach(([r,i])=>{let a=e[r];i.required&&a===void 0&&n.push({path:`${t}.${r}`,message:`${r} is required`,type:`error`,code:`MISSING_REQUIRED`}),a!==void 0&&!i.validate(a)&&n.push({path:`${t}.${r}`,message:i.message,type:`error`,code:`INVALID_TYPE`})}),n)}function f(e,t=`schema`){let n=[];return e.type===`crud`&&((!e.columns||!Array.isArray(e.columns))&&n.push({path:`${t}.columns`,message:`CRUD schema requires columns array`,type:`error`,code:`MISSING_COLUMNS`}),!e.api&&!e.dataSource&&n.push({path:`${t}.api`,message:`CRUD schema requires api or dataSource`,type:`warning`,code:`MISSING_DATA_SOURCE`}),e.columns&&Array.isArray(e.columns)&&e.columns.forEach((e,r)=>{e.name||n.push({path:`${t}.columns[${r}]`,message:`Column requires name property`,type:`error`,code:`MISSING_COLUMN_NAME`})}),e.fields&&Array.isArray(e.fields)&&e.fields.forEach((e,r)=>{e.name||n.push({path:`${t}.fields[${r}]`,message:`Field requires name property`,type:`error`,code:`MISSING_FIELD_NAME`})})),n}function p(e,t=`schema`){let n=[];return e.type===`form`&&e.fields&&Array.isArray(e.fields)&&e.fields.forEach((r,i)=>{r.name||n.push({path:`${t}.fields[${i}]`,message:`Form field requires name property`,type:`error`,code:`MISSING_FIELD_NAME`}),e.fields.filter(e=>e.name===r.name).length>1&&n.push({path:`${t}.fields[${i}]`,message:`Duplicate field name: ${r.name}`,type:`warning`,code:`DUPLICATE_FIELD_NAME`})}),n}function m(e,t=`schema`){let n=[],r=e.children||e.body;if(r){if(Array.isArray(r))r.forEach((e,r)=>{if(typeof e==`object`&&e){let i=h(e,`${t}.children[${r}]`);n.push(...i.errors,...i.warnings)}});else if(typeof r==`object`&&r){let e=h(r,`${t}.children`);n.push(...e.errors,...e.warnings)}}return n}function h(e,t=`schema`){let n=[];n.push(...d(e,t)),n.push(...f(e,t)),n.push(...p(e,t)),n.push(...m(e,t));let r=n.filter(e=>e.type===`error`),i=n.filter(e=>e.type===`warning`);return{valid:r.length===0,errors:r,warnings:i}}function g(e){return{$eq:`=`,$ne:`!=`,$gt:`>`,$gte:`>=`,$lt:`<`,$lte:`<=`,$in:`in`,$nin:`nin`,$notin:`nin`,$between:`between`,$contains:`contains`,$notContains:`notcontains`,$notcontains:`notcontains`,$startsWith:`startswith`,$startswith:`startswith`,$endsWith:`endswith`,$endswith:`endswith`}[e]||null}function _(e){let t=[];for(let[n,r]of Object.entries(e))if(r!=null)if(typeof r==`object`&&!Array.isArray(r))for(let[e,i]of Object.entries(r)){if(e===`$regex`){console.warn(`[ObjectUI] Warning: \$regex operator is not fully supported. Converting to 'contains' which only supports substring matching, not regex patterns. Field: '${n}', Value: ${JSON.stringify(i)}. Consider using $contains or $startsWith instead.`),t.push([n,`contains`,i]);continue}if(e===`$null`){t.push([n,i?`is_null`:`is_not_null`,!0]);continue}if(e===`$exists`){t.push([n,i?`is_not_null`:`is_null`,!0]);continue}let r=g(e);if(r)t.push([n,r,i]);else throw Error(`[ObjectUI] Unknown filter operator '${e}' for field '${n}'. Supported operators: $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $between, $contains, $notContains, $startsWith, $endsWith, $null, $exists. If you need exact object matching, use the value directly without an operator.`)}else t.push([n,`=`,r]);return t.length===0?e:t.length===1?t[0]:[`and`,...t]}function v(e){if(Array.isArray(e))return e;if(e&&typeof e==`object`){if(Array.isArray(e.records))return e.records;if(Array.isArray(e.data))return e.data;if(Array.isArray(e.value))return e.value}return[]}function y(e,t){if(!e||typeof e!=`object`)return[];let n=[];for(let[t,r]of Object.entries(e))r&&typeof r==`object`&&(r.type===`lookup`||r.type===`master_detail`)&&n.push(t);if(n.length===0)return[];if(t&&Array.isArray(t)&&t.length>0){let e=new Set;for(let n of t)if(typeof n==`string`)e.add(n);else if(n&&typeof n==`object`){let t=n.field??n.name??n.fieldName;t&&e.add(t)}return n.filter(t=>e.has(t))}return n}var b=class e{scopes=[];constructor(e={}){this.scopes.push(new Map(Object.entries(e)))}pushScope(e){this.scopes.push(new Map(Object.entries(e)))}popScope(){this.scopes.length>1&&this.scopes.pop()}get(e){let t=e.split(`.`),n=t[0];for(let e=this.scopes.length-1;e>=0;e--)if(this.scopes[e].has(n)){let r=this.scopes[e].get(n);for(let e=1;e<t.length;e++)if(r&&typeof r==`object`)r=r[t[e]];else return;return r}}set(e,t){this.scopes.length>0&&this.scopes[this.scopes.length-1].set(e,t)}has(e){let t=e.split(`.`)[0];for(let e=this.scopes.length-1;e>=0;e--)if(this.scopes[e].has(t))return!0;return!1}toObject(){let e={};for(let t of this.scopes)for(let[n,r]of t.entries())e[n]=r;return e}createChild(t={}){let n=new e;return n.scopes=[...this.scopes,new Map(Object.entries(t))],n}},x={Math,JSON,parseInt,parseFloat,isNaN,isFinite},ee=new Set([`constructor`,`__proto__`,`prototype`,`__defineGetter__`,`__defineSetter__`,`__lookupGetter__`,`__lookupSetter__`]),S=class e{source=``;pos=0;context={};_evaluating=!0;evaluate(e,t){this.source=e.trim(),this.pos=0,this.context={...x,...t};let n=this.parseTernary();if(this.skipWhitespace(),this.pos<this.source.length)throw SyntaxError(`Unexpected token "${this.source[this.pos]}" at position ${this.pos} in expression "${e}"`);return n}skipWhitespace(){for(;this.pos<this.source.length&&/\s/.test(this.source[this.pos]);)this.pos++}peek(e=0){return this.source[this.pos+e]??``}consume(){return this.source[this.pos++]??``}withEvaluation(e,t){let n=this._evaluating;this._evaluating=e;try{return t()}finally{this._evaluating=n}}assertSafeProp(e){if(typeof e==`string`&&ee.has(e))throw TypeError(`Access to property "${e}" is not permitted in expressions`)}parseTernary(){let e=this.parseNullish();if(this.skipWhitespace(),this.peek()===`?`&&this.peek(1)!==`?`){if(this.pos++,this.skipWhitespace(),!this._evaluating){if(this.parseTernary(),this.skipWhitespace(),this.peek()!==`:`)throw SyntaxError(`Expected ":" in ternary expression`);this.pos++,this.skipWhitespace(),this.parseTernary();return}if(e){let e=this.parseTernary();if(this.skipWhitespace(),this.peek()!==`:`)throw SyntaxError(`Expected ":" in ternary expression`);return this.pos++,this.skipWhitespace(),this.withEvaluation(!1,()=>this.parseTernary()),e}else{if(this.withEvaluation(!1,()=>this.parseTernary()),this.skipWhitespace(),this.peek()!==`:`)throw SyntaxError(`Expected ":" in ternary expression`);return this.pos++,this.skipWhitespace(),this.parseTernary()}}return e}parseNullish(){let e=this.parseOr();for(this.skipWhitespace();this.peek()===`?`&&this.peek(1)===`?`;){if(this.pos+=2,this.skipWhitespace(),this._evaluating&&e!=null)this.withEvaluation(!1,()=>this.parseOr());else{let t=this.parseOr();this._evaluating&&(e??=t)}this.skipWhitespace()}return e}parseOr(){let e=this.parseAnd();for(this.skipWhitespace();this.peek()===`|`&&this.peek(1)===`|`;){if(this.pos+=2,this.skipWhitespace(),this._evaluating&&e)this.withEvaluation(!1,()=>this.parseAnd());else{let t=this.parseAnd();this._evaluating&&(e||=t)}this.skipWhitespace()}return e}parseAnd(){let e=this.parseEquality();for(this.skipWhitespace();this.peek()===`&`&&this.peek(1)===`&`;){if(this.pos+=2,this.skipWhitespace(),this._evaluating&&!e)this.withEvaluation(!1,()=>this.parseEquality());else{let t=this.parseEquality();this._evaluating&&(e&&=t)}this.skipWhitespace()}return e}parseEquality(){let e=this.parseAddition();for(this.skipWhitespace();;){let t=null;if(this.peek()===`=`&&this.peek(1)===`=`&&this.peek(2)===`=`)t=`===`,this.pos+=3;else if(this.peek()===`!`&&this.peek(1)===`=`&&this.peek(2)===`=`)t=`!==`,this.pos+=3;else if(this.peek()===`=`&&this.peek(1)===`=`)t=`==`,this.pos+=2;else if(this.peek()===`!`&&this.peek(1)===`=`)t=`!=`,this.pos+=2;else if(this.peek()===`>`&&this.peek(1)===`=`)t=`>=`,this.pos+=2;else if(this.peek()===`<`&&this.peek(1)===`=`)t=`<=`,this.pos+=2;else if(this.peek()===`>`&&this.peek(1)!==`>`)t=`>`,this.pos++;else if(this.peek()===`<`&&this.peek(1)!==`<`)t=`<`,this.pos++;else break;this.skipWhitespace();let n=this.parseAddition();switch(t){case`===`:e=e===n;break;case`!==`:e=e!==n;break;case`==`:e=e==n;break;case`!=`:e=e!=n;break;case`>`:e=e>n;break;case`<`:e=e<n;break;case`>=`:e=e>=n;break;case`<=`:e=e<=n;break}this.skipWhitespace()}return e}parseAddition(){let e=this.parseMultiplication();for(this.skipWhitespace();(this.peek()===`+`||this.peek()===`-`)&&this.peek(1)!==`=`;){let t=this.consume();this.skipWhitespace();let n=this.parseMultiplication();e=t===`+`?e+n:e-n,this.skipWhitespace()}return e}parseMultiplication(){let e=this.parseUnary();for(this.skipWhitespace();(this.peek()===`*`||this.peek()===`/`||this.peek()===`%`)&&this.peek(1)!==`=`;){let t=this.consume();this.skipWhitespace();let n=this.parseUnary();t===`*`?e*=n:t===`/`?e/=n:e%=n,this.skipWhitespace()}return e}parseUnary(){if(this.skipWhitespace(),this.source.startsWith(`typeof`,this.pos)&&!/[\w$]/.test(this.source[this.pos+6]??``)){this.pos+=6,this.skipWhitespace();try{return typeof this.parseUnary()}catch{return`undefined`}}return this.peek()===`!`?(this.pos++,!this.parseUnary()):this.peek()===`-`?(this.pos++,-this.parseUnary()):this.peek()===`+`?(this.pos++,+this.parseUnary()):this.parseMember()}parseMember(){let e=this.parsePrimary();for(;;){this.skipWhitespace();let t=this.peek()===`?`&&this.peek(1)===`.`;if(this.peek()===`.`&&this.peek(1)!==`.`||t){t&&this.pos++,this.pos++,this.skipWhitespace();let n=this.parseIdentifierName();if(!n)break;if(this.assertSafeProp(n),this.skipWhitespace(),this.peek()===`(`){this.pos++;let t=this.parseArgList();if(this.peek()!==`)`)throw SyntaxError(`Expected ")" after argument list at position ${this.pos}`);if(this.pos++,!this._evaluating){e=void 0;continue}e=e!=null&&typeof e[n]==`function`?e[n](...t):void 0}else{if(!this._evaluating){e=void 0;continue}e=e?.[n]}continue}let n=this.peek()===`?`&&this.peek(1)===`[`;if(this.peek()===`[`||n){n&&this.pos++,this.pos++,this.skipWhitespace();let t=this.parseTernary();if(this.skipWhitespace(),this.peek()!==`]`)throw SyntaxError(`Expected "]" after bracket expression at position ${this.pos}`);if(this.pos++,this.assertSafeProp(t),!this._evaluating){e=void 0;continue}e=e?.[t];continue}if(this.peek()===`(`){this.pos++;let t=this.parseArgList();if(this.peek()!==`)`)throw SyntaxError(`Expected ")" after argument list at position ${this.pos}`);if(this.pos++,!this._evaluating){e=void 0;continue}if(typeof e==`function`)e=e(...t);else throw TypeError(`${String(e)} is not a function`);continue}break}return e}parsePrimary(){this.skipWhitespace();let e=this.peek();if(e===`(`){this.pos++;let e=this.parseTernary();if(this.skipWhitespace(),this.peek()!==`)`)throw SyntaxError(`Expected ")" to close "(" expression at position ${this.pos}`);return this.pos++,e}if(e===`[`)return this.parseArrayLiteral();if(e===`"`||e===`'`)return this.parseString(e);if(/\d/.test(e)||e===`.`&&/\d/.test(this.peek(1)))return this.parseNumber();if(/[a-zA-Z_$]/.test(e))return this.parseIdentifierOrKeyword();throw SyntaxError(`Unexpected character "${e}" at position ${this.pos}`)}parseArrayLiteral(){this.pos++;let e=[];for(this.skipWhitespace();this.peek()!==`]`&&this.pos<this.source.length;)e.push(this.parseTernary()),this.skipWhitespace(),this.peek()===`,`&&(this.pos++,this.skipWhitespace());if(this.peek()!==`]`)throw SyntaxError(`Expected "]" to close array literal at position ${this.pos}`);return this.pos++,e}parseString(e){this.pos++;let t=``;for(;this.pos<this.source.length;){let n=this.source[this.pos];if(n===`\\`){this.pos++;let e=this.source[this.pos++]??``;switch(e){case`n`:t+=`
|
|
2
|
-
`;break;case`t`:t+=` `;break;case`r`:t+=`\r`;break;case`\\`:t+=`\\`;break;case`"`:t+=`"`;break;case`'`:t+=`'`;break;case"`":t+="`";break;default:t+=e}}else if(n===e){this.pos++;break}else t+=n,this.pos++}return t}parseNumber(){let e=this.pos,t=!1;for(;this.pos<this.source.length&&/\d/.test(this.source[this.pos]);)t=!0,this.pos++;if(this.source[this.pos]===`.`)for(this.pos++;this.pos<this.source.length&&/\d/.test(this.source[this.pos]);)t=!0,this.pos++;if(/[eE]/.test(this.source[this.pos]??``)){this.pos++,/[+\-]/.test(this.source[this.pos]??``)&&this.pos++;let t=0;for(;this.pos<this.source.length&&/\d/.test(this.source[this.pos]);)t++,this.pos++;if(t===0)throw SyntaxError(`Invalid numeric literal exponent at position ${e}`)}if(!t)throw SyntaxError(`Invalid numeric literal at position ${e}`);let n=this.source.slice(e,this.pos),r=Number(n);if(!Number.isFinite(r))throw SyntaxError(`Invalid numeric literal "${n}" at position ${e}`);return r}parseIdentifierName(){let e=this.pos;for(;this.pos<this.source.length&&/[\w$]/.test(this.source[this.pos]);)this.pos++;return this.source.slice(e,this.pos)}parseIdentifierOrKeyword(){let e=this.parseIdentifierName();switch(e){case`true`:return!0;case`false`:return!1;case`null`:return null;case`undefined`:return;case`NaN`:return NaN;case`Infinity`:return 1/0}if(e===`new`)return this.parseNewExpression();if(this.skipWhitespace(),this.peek()===`=`&&this.peek(1)===`>`)return this.parseArrowFunction(e);if(this.peek()===`(`){this.pos++;let t=this.parseArgList();if(this.peek()!==`)`)throw SyntaxError(`Expected ")" after argument list at position ${this.pos}`);if(this.pos++,!this._evaluating)return;let n=this.context[e];if(typeof n==`function`)return n(...t);throw TypeError(`"${e}" is not a function`)}if(this._evaluating){if(!(e in this.context))throw ReferenceError(`${e} is not defined`);return this.context[e]}}parseNewExpression(){this.skipWhitespace();let e=this.parseIdentifierName();this.skipWhitespace();let t=[];if(this.peek()===`(`){if(this.pos++,t=this.parseArgList(),this.peek()!==`)`)throw SyntaxError(`Expected ")" after new ${e}() at position ${this.pos}`);this.pos++}if(this._evaluating)switch(e){case`Date`:return new Date(...t);case`RegExp`:return new RegExp(t[0],t[1]);default:throw TypeError(`new ${e}() is not supported in expressions`)}}parseArrowFunction(t){this.pos+=2,this.skipWhitespace();let n=this.pos,r=this.scanExpressionEnd(),i=this.source.slice(n,r).trim();this.pos=r;let a=this.context;return n=>new e().evaluate(i,{...a,[t]:n})}scanExpressionEnd(){let e=this.pos,t=0,n=!1,r=``;for(;e<this.source.length;){let i=this.source[e];if(n){if(i===`\\`){e+=2;continue}i===r&&(n=!1),e++;continue}if(i===`"`||i===`'`){n=!0,r=i,e++;continue}if(i===`(`||i===`[`)t++;else if(i===`)`||i===`]`){if(t===0)break;t--}else if(i===`,`&&t===0)break;e++}return e}parseArgList(){let e=[];for(this.skipWhitespace();this.peek()!==`)`&&this.pos<this.source.length;)e.push(this.parseTernary()),this.skipWhitespace(),this.peek()===`,`&&(this.pos++,this.skipWhitespace());return e}},C=class{cache=new Map;maxSize;constructor(e=1e3){this.maxSize=e}compile(e,t){let n=`${e}::${t.join(`,`)}`;if(this.cache.has(n)){let e=this.cache.get(n);return e.hitCount++,e}this.cache.size>=this.maxSize&&this.evictLFU();let r={fn:this.compileExpression(e,t),varNames:[...t],expression:e,compiledAt:Date.now(),hitCount:1};return this.cache.set(n,r),r}compileExpression(e,t){let n=new S;return(...r)=>{let i={};for(let e=0;e<t.length;e++)i[t[e]]=r[e];return n.evaluate(e,i)}}evictLFU(){let e=null,t=1/0,n=1/0;for(let[r,i]of this.cache.entries())(i.hitCount<n||i.hitCount===n&&i.compiledAt<t)&&(e=r,t=i.compiledAt,n=i.hitCount);e&&this.cache.delete(e)}has(e,t){let n=`${e}::${t.join(`,`)}`;return this.cache.has(n)}clear(){this.cache.clear()}getStats(){let e=0,t=[];for(let n of this.cache.values())e+=n.hitCount,t.push({expression:n.expression,hitCount:n.hitCount});return{size:this.cache.size,maxSize:this.maxSize,totalHits:e,entries:t.sort((e,t)=>t.hitCount-e.hitCount)}}},w=class{functions=new Map;constructor(){this.registerDefaults()}register(e,t){this.functions.set(e.toUpperCase(),t)}get(e){return this.functions.get(e.toUpperCase())}has(e){return this.functions.has(e.toUpperCase())}getNames(){return Array.from(this.functions.keys())}toObject(){let e={};for(let[t,n]of this.functions)e[t]=n;return e}registerDefaults(){this.registerAggregationFunctions(),this.registerDateFunctions(),this.registerLogicFunctions(),this.registerStringFunctions(),this.registerStringSearchFunctions(),this.registerStatisticalFunctions()}registerAggregationFunctions(){this.register(`SUM`,(...e)=>T(e).reduce((e,t)=>e+t,0)),this.register(`AVG`,(...e)=>{let t=T(e);return t.length===0?0:t.reduce((e,t)=>e+t,0)/t.length}),this.register(`COUNT`,(...e)=>E(e).filter(e=>e!=null).length),this.register(`MIN`,(...e)=>{let t=T(e);return t.length===0?0:Math.min(...t)}),this.register(`MAX`,(...e)=>{let t=T(e);return t.length===0?0:Math.max(...t)})}registerDateFunctions(){this.register(`TODAY`,()=>new Date().toISOString().split(`T`)[0]),this.register(`NOW`,()=>new Date().toISOString()),this.register(`DATEADD`,(e,t,n)=>{let r=new Date(e);if(isNaN(r.getTime()))throw Error(`DATEADD: Invalid date "${e}"`);switch(String(n).toLowerCase()){case`day`:case`days`:r.setDate(r.getDate()+t);break;case`month`:case`months`:r.setMonth(r.getMonth()+t);break;case`year`:case`years`:r.setFullYear(r.getFullYear()+t);break;case`hour`:case`hours`:r.setHours(r.getHours()+t);break;case`minute`:case`minutes`:r.setMinutes(r.getMinutes()+t);break;default:throw Error(`DATEADD: Unsupported unit "${n}"`)}return r.toISOString()}),this.register(`DATEDIFF`,(e,t,n)=>{let r=new Date(e),i=new Date(t);if(isNaN(r.getTime()))throw Error(`DATEDIFF: Invalid date "${e}"`);if(isNaN(i.getTime()))throw Error(`DATEDIFF: Invalid date "${t}"`);let a=i.getTime()-r.getTime();switch(String(n).toLowerCase()){case`day`:case`days`:return Math.floor(a/(1e3*60*60*24));case`month`:case`months`:return(i.getFullYear()-r.getFullYear())*12+(i.getMonth()-r.getMonth());case`year`:case`years`:return i.getFullYear()-r.getFullYear();case`hour`:case`hours`:return Math.floor(a/(1e3*60*60));case`minute`:case`minutes`:return Math.floor(a/(1e3*60));default:throw Error(`DATEDIFF: Unsupported unit "${n}"`)}}),this.register(`DATEFORMAT`,(e,t)=>{let n=new Date(e);if(isNaN(n.getTime()))throw Error(`DATEFORMAT: Invalid date "${e}"`);let r=(e,t=2)=>String(e).padStart(t,`0`);return t.replace(`YYYY`,String(n.getFullYear())).replace(`YY`,String(n.getFullYear()).slice(-2)).replace(`MM`,r(n.getMonth()+1)).replace(`DD`,r(n.getDate())).replace(`HH`,r(n.getHours())).replace(`mm`,r(n.getMinutes())).replace(`ss`,r(n.getSeconds()))})}registerLogicFunctions(){this.register(`IF`,(e,t,n)=>e?t:n),this.register(`AND`,(...e)=>e.every(Boolean)),this.register(`OR`,(...e)=>e.some(Boolean)),this.register(`NOT`,e=>!e),this.register(`SWITCH`,(e,...t)=>{for(let n=0;n<t.length-1;n+=2)if(e===t[n])return t[n+1];if(t.length%2==1)return t[t.length-1]})}registerStringFunctions(){this.register(`CONCAT`,(...e)=>e.map(e=>String(e??``)).join(``)),this.register(`LEFT`,(e,t)=>String(e??``).substring(0,t)),this.register(`RIGHT`,(e,t)=>{let n=String(e??``);return n.substring(Math.max(0,n.length-t))}),this.register(`TRIM`,e=>String(e??``).trim()),this.register(`UPPER`,e=>String(e??``).toUpperCase()),this.register(`LOWER`,e=>String(e??``).toLowerCase())}registerStringSearchFunctions(){this.register(`FIND`,(e,t,n)=>String(t??``).indexOf(String(e??``),n??0)),this.register(`REPLACE`,(e,t,n)=>String(e??``).split(String(t??``)).join(String(n??``))),this.register(`SUBSTRING`,(e,t,n)=>{let r=String(e??``);return n===void 0?r.substring(t):r.substring(t,t+n)}),this.register(`REGEX`,(e,t,n)=>{let r=String(e??``);return new RegExp(t,n).test(r)}),this.register(`LEN`,e=>String(e??``).length)}registerStatisticalFunctions(){this.register(`MEDIAN`,(...e)=>{let t=T(e).sort((e,t)=>e-t);if(t.length===0)return 0;let n=Math.floor(t.length/2);return t.length%2==0?(t[n-1]+t[n])/2:t[n]}),this.register(`STDEV`,(...e)=>{let t=T(e);if(t.length<2)return 0;let n=t.reduce((e,t)=>e+t,0)/t.length,r=t.map(e=>(e-n)**2).reduce((e,t)=>e+t,0)/(t.length-1);return Math.sqrt(r)}),this.register(`VARIANCE`,(...e)=>{let t=T(e);if(t.length<2)return 0;let n=t.reduce((e,t)=>e+t,0)/t.length;return t.map(e=>(e-n)**2).reduce((e,t)=>e+t,0)/(t.length-1)}),this.register(`PERCENTILE`,(e,...t)=>{let n=T(t).sort((e,t)=>e-t);if(n.length===0)return 0;let r=Math.max(0,Math.min(100,e))/100*(n.length-1),i=Math.floor(r),a=Math.ceil(r);if(i===a)return n[i];let o=r-i;return n[i]+o*(n[a]-n[i])})}};function T(e){let t=[];for(let n of e)if(Array.isArray(n))t.push(...T(n));else{let e=Number(n);isNaN(e)||t.push(e)}return t}function E(e){let t=[];for(let n of e)Array.isArray(n)?t.push(...E(n)):t.push(n);return t}var D=class e{context;cache;formulas;constructor(e,t,n){e instanceof b?this.context=e:this.context=new b(e||{}),this.cache=t||new C,this.formulas=n||new w}evaluate(e,t={}){if(e&&typeof e==`object`&&typeof e.source==`string`&&(e=e.source),typeof e!=`string`)return e;let{defaultValue:n,throwOnError:r=!1,sanitize:i=!0}=t;try{if(!e.includes("${"))return e;let t=e.match(/^\$\{([^}]+)\}$/);return t?this.evaluateExpression(t[1].trim(),{sanitize:i}):e.replace(/\$\{([^}]+)\}/g,(e,t)=>{try{let e=this.evaluateExpression(t.trim(),{sanitize:i});return String(e??``)}catch(n){if(r)throw n;return console.warn(`Expression evaluation failed for: ${t}`,n),e}})}catch(t){if(r)throw t;return console.warn(`Failed to evaluate expression: ${e}`,t),n??e}}evaluateExpression(e,t={}){let{sanitize:n=!0}=t;if(!(!e||e.trim()===``)){if(n&&this.isDangerous(e))throw Error(`Potentially dangerous expression detected: ${e}`);try{let t=this.context.toObject(),n={...this.formulas.toObject(),...t},r=Object.keys(n),i=Object.values(n);return this.cache.compile(e,r).fn(...i)}catch(t){throw Error(`Failed to evaluate expression "${e}": ${t.message}`)}}}isDangerous(e){return[/eval\s*\(/i,/Function\s*\(/i,/setTimeout\s*\(/i,/setInterval\s*\(/i,/import\s*\(/i,/require\s*\(/i,/process\./i,/global\./i,/window\./i,/document\./i,/__proto__/i,/constructor\s*\(/i,/prototype\./i].some(t=>t.test(e))}evaluateCondition(e,t={}){if(typeof e==`boolean`)return e;if(e&&typeof e==`object`&&typeof e.source==`string`&&(e=e.source),!e)return!0;if(typeof e!=`string`)return!!e;let n=e.trim();if(!n)return!0;if(n.includes("${"))return!!this.evaluate(n,t);try{return!!this.evaluateExpression(n,{sanitize:t.sanitize!==!1})}catch{return!0}}updateContext(e){Object.entries(e).forEach(([e,t])=>{this.context.set(e,t)})}getContext(){return this.context}withContext(t){return new e(this.context.createChild(t),this.cache,this.formulas)}getCacheStats(){return this.cache.getStats()}clearCache(){this.cache.clear()}getFormulas(){return this.formulas}registerFunction(e,t){this.formulas.register(e,t)}},O=new C,te=new w;function ne(e,t){let n=new D({...t,data:t},O,te);try{return(/\$\{/.test(e)?n.evaluate(e,{throwOnError:!0}):n.evaluateExpression(e))===!0}catch{return!1}}function k(e){return typeof e==`string`?{dialect:`cel`,source:e}:{dialect:e.dialect??`cel`,source:e.source}}function re(e,t,n,i,a){if(e==null||typeof e==`string`&&!e.trim())return n;try{let o=r.evaluate(k(e),{record:t,previous:i,...a?{extra:a}:{}});return o.ok?o.value===!0:n}catch{return n}}function A(e,t,n,r,i){let a=e.visibleWhen==null?!0:re(e.visibleWhen,t,!0,r,i),o=n.readonly===!0||(e.readonlyWhen==null?!1:re(e.readonlyWhen,t,!1,r,i)),s=e.requiredWhen??e.conditionalRequired;return{visible:a,readonly:o,required:n.required===!0||(s==null?!1:re(s,t,!1,r,i))}}function ie(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&typeof t.type==`string`&&typeof t.objectName==`string`&&typeof t.recordId==`string`&&typeof t.timestamp==`number`}var j=new class e{undoStack=[];redoStack=[];maxHistory;listeners=new Set;constructor(e){this.maxHistory=e?.maxHistory??50}push(e){this.undoStack.push(e),this.undoStack.length>this.maxHistory&&this.undoStack.shift(),this.redoStack=[],this.notify()}peekUndo(){return this.undoStack[this.undoStack.length-1]}peekRedo(){return this.redoStack[this.redoStack.length-1]}popUndo(){let e=this.undoStack.pop();return e&&(this.redoStack.push(e),this.notify()),e}popRedo(){let e=this.redoStack.pop();return e&&(this.undoStack.push(e),this.notify()),e}clear(){this.undoStack=[],this.redoStack=[],this.notify()}get canUndo(){return this.undoStack.length>0}get canRedo(){return this.redoStack.length>0}get undoCount(){return this.undoStack.length}get redoCount(){return this.redoStack.length}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}getHistory(){return[...this.undoStack]}getRedoHistory(){return[...this.redoStack]}pushBatch(e){e.length!==0&&(this.undoStack.push(...e),this.undoStack.length>this.maxHistory&&this.undoStack.splice(0,this.undoStack.length-this.maxHistory),this.redoStack=[],this.notify())}popUndoBatch(e){let t=Math.min(e,this.undoStack.length);if(t===0)return[];let n=this.undoStack.splice(this.undoStack.length-t,t);return this.redoStack.push(...n),this.notify(),n}popRedoBatch(e){let t=Math.min(e,this.redoStack.length);if(t===0)return[];let n=this.redoStack.splice(this.redoStack.length-t,t);return this.undoStack.push(...n),this.notify(),n}static STORAGE_KEY=`objectui:undo-history`;saveToStorage(){try{let t=JSON.stringify({undoStack:this.undoStack,redoStack:this.redoStack});localStorage.setItem(e.STORAGE_KEY,t)}catch{}}loadFromStorage(){try{if(typeof localStorage>`u`)return;let t=localStorage.getItem(e.STORAGE_KEY);if(!t)return;let n=JSON.parse(t);Array.isArray(n.undoStack)&&(this.undoStack=n.undoStack.filter(ie)),Array.isArray(n.redoStack)&&(this.redoStack=n.redoStack.filter(ie)),this.undoStack.length>this.maxHistory&&this.undoStack.splice(0,this.undoStack.length-this.maxHistory),this.notify()}catch{}}notify(){this.listeners.forEach(e=>e())}},M=class{handlers=new Map;scripts=new Map;evaluator;context;confirmHandler;toastHandler;modalHandler;navigationHandler;paramCollectionHandler;resultDialogHandler;constructor(e={}){this.context=e,this.evaluator=new D(e),this.confirmHandler=async e=>window.confirm(e),this.toastHandler=null,this.modalHandler=null,this.navigationHandler=null,this.paramCollectionHandler=null,this.resultDialogHandler=null}setConfirmHandler(e){this.confirmHandler=e}setToastHandler(e){this.toastHandler=e}setModalHandler(e){this.modalHandler=e}setNavigationHandler(e){this.navigationHandler=e}setParamCollectionHandler(e){this.paramCollectionHandler=e}setResultDialogHandler(e){this.resultDialogHandler=e}registerHandler(e,t){this.handlers.set(e,t)}unregisterHandler(e){this.handlers.delete(e)}registerScript(e,t){this.scripts.set(e,t)}unregisterScript(e){this.scripts.delete(e)}async execute(e){try{let t=e.type||e.actionType||e.name||``;if(e.condition&&!this.evaluator.evaluateCondition(e.condition))return{success:!1,error:`Action condition not met`};if(e.disabled!=null&&e.disabled!==!1){let t=!1;try{t=this.evaluator.evaluateCondition(e.disabled)}catch{t=!1}if(t)return{success:!1,error:`Action is disabled`}}let n=e.confirm?.message||e.confirmText;if(n&&!await this.confirmHandler(this.evaluator.evaluate(n),e.confirm?{title:e.confirm.title,confirmText:e.confirm.confirmText,cancelText:e.confirm.cancelText}:void 0))return{success:!1,error:`Action cancelled by user`};let r=e.actionParams&&Array.isArray(e.actionParams)?e.actionParams:Array.isArray(e.params)?e.params:void 0;if(r&&r.length>0&&this.paramCollectionHandler){let t=await this.paramCollectionHandler(r,e);if(t===null)return{success:!1,error:`Action cancelled by user (params)`};let n=Array.isArray(e.params)?{}:e.params||{},i=n._rowRecord;e.params={...n,...t},i!==void 0&&(e.params._rowRecord=i)}if(t&&this.handlers.has(t)){let n=await this.handlers.get(t)(e,this.context);return await this.handlePostExecution(e,n),n}let i;switch(t){case`script`:i=await this.executeScript(e);break;case`url`:i=await this.executeUrl(e);break;case`modal`:i=await this.executeModal(e);break;case`flow`:i=await this.executeFlow(e);break;case`api`:i=await this.executeAPI(e);break;case`form`:i=await this.executeForm(e);break;case`navigation`:i=await this.executeNavigation(e);break;default:e.navigate?i=await this.executeNavigation(e):e.api||e.endpoint?i=await this.executeAPI(e):e.onClick?(await e.onClick(),i={success:!0}):i=await this.executeActionSchema(e)}return await this.handlePostExecution(e,i),i}catch(t){let n={success:!1,error:t.message};return await this.handlePostExecution(e,n),n}}async executeChain(e,t=`sequential`){if(e.length===0)return{success:!0};if(t===`parallel`){let t=await Promise.allSettled(e.map(e=>this.execute(e)));if(t.filter(e=>e.status===`rejected`||e.status===`fulfilled`&&!e.value.success).length>0)return{success:!1,error:t.find(e=>e.status===`fulfilled`&&!e.value.success)?.value?.error||`One or more parallel actions failed`};let n=t[t.length-1];return n.status===`fulfilled`?n.value:{success:!1,error:`Action failed`}}let n={success:!0};for(let t of e)if(n=await this.execute(t),!n.success)return n;return n}async handlePostExecution(e,t){let n=!!(e.resultDialog&&t.success);if(this.toastHandler){let r=e.toast??{showOnSuccess:!0,showOnError:!0},i=e.toast?.duration;if(t.success&&!n&&!t.silent&&r.showOnSuccess!==!1){let n=(t.data&&typeof t.data==`object`&&typeof t.data.message==`string`?String(t.data.message).trim():``)||e.successMessage||`Action completed successfully`;if(t.undo)try{j.push(t.undo)}catch{}this.toastHandler(n,{type:`success`,duration:i,undo:t.undo?{}:void 0})}if(!t.success&&r.showOnError!==!1&&t.error){let n=e.errorMessage||t.error;this.toastHandler(n,{type:`error`,duration:i})}}if(n)if(this.resultDialogHandler)try{await this.resultDialogHandler(e.resultDialog,t.data,e)}catch(e){console.warn(`[ActionRunner] resultDialog handler rejected; treating as acknowledged`,e)}else console.warn(`[ActionRunner] action.resultDialog set but no resultDialogHandler registered — the response value will not be shown to the user.`,{action:e.name,data:t.data});if(e.refreshAfter&&t.success&&(t.reload=!0),e.chain&&e.chain.length>0&&t.success){let n=await this.executeChain(e.chain,e.chainMode||`sequential`);n.success||(t.success=!1,t.error=n.error),n.data&&(t.data=n.data),n.redirect&&(t.redirect=n.redirect),n.reload&&(t.reload=!0)}if(t.success&&e.onSuccess){let t=Array.isArray(e.onSuccess)?e.onSuccess:[e.onSuccess];await this.executeChain(t,`sequential`)}if(!t.success&&e.onFailure){let t=Array.isArray(e.onFailure)?e.onFailure:[e.onFailure];await this.executeChain(t,`sequential`)}}async executeScript(e){let t=e.execute||e.target;if(!t)return{success:!1,error:`No script provided for script action`};let n=this.scripts.get(t);if(n)try{return await n(e,this.context)}catch(e){return{success:!1,error:`Script execution failed: ${e.message}`}}try{return{success:!0,data:this.evaluator.evaluate(`\${${t}}`)}}catch(e){return{success:!1,error:`Script execution failed: ${e.message}`}}}async executeUrl(e){let t=e.target||e.redirect;if(!t)return{success:!1,error:`No URL provided for url action`};let n=this.interpolateTarget(t,e),r=this.evaluator.evaluate(n);if(!this.isValidUrl(r))return{success:!1,error:`Invalid URL scheme. Only http://, https://, and relative URLs are allowed.`};let i=typeof this.context.apiBase==`string`?this.context.apiBase.replace(/\/+$/,``):``;i&&/^\/(api|_auth|_account)\//.test(r)&&(r=`${i}${r}`);let a=r.startsWith(`http://`)||r.startsWith(`https://`);if(/\/(api|_auth|_account)\//.test(r)&&(a||r.startsWith(`/`)))return window.location.href=r,{success:!0};let o=e.params?.newTab??a;if(this.navigationHandler)return this.navigationHandler(r,{external:a,newTab:o}),{success:!0};if(o)window.open(r,`_blank`,`noopener,noreferrer`);else return{success:!0,redirect:r};return{success:!0}}async executeModal(e){let t=e.modal||e.target||e.params?.schema;return t?this.modalHandler?await this.modalHandler(t,this.context):{success:!0,modal:t}:{success:!1,error:`No modal schema or target provided for modal action`}}async executeFlow(e){let t=e.target||e.name;return t?this.handlers.has(`flow`)?await this.handlers.get(`flow`)(e,this.context):{success:!1,error:`Flow handler not registered. Cannot execute flow: ${t}`}:{success:!1,error:`No flow target provided for flow action`}}async executeActionSchema(e){let t={success:!0};if(e.api||e.endpoint){let n=await this.executeAPI(e);if(!n.success)return n;t.data=n.data}return e.onClick&&await e.onClick(),t.reload=e.reload!==!1,t.close=e.close!==!1,e.redirect&&(t.redirect=this.evaluator.evaluate(e.redirect)),t}async executeForm(e){let t=this.evaluator.evaluate(e.target);if(!t||typeof t!=`string`)return{success:!1,error:`No form target (FormView name) provided for form action`};let n=(this.context.record&&this.context.record.id)??(this.context.data&&this.context.data.id),r=`/forms/${t}`,i=n==null?r:`${r}?recordId=${encodeURIComponent(String(n))}`;return this.navigationHandler?(this.navigationHandler(i,{external:!1}),{success:!0}):{success:!0,redirect:i}}async executeNavigation(e){let t=e.navigate||e,n=this.evaluator.evaluate(t.to||t.target);if(!this.isValidUrl(n))return{success:!1,error:`Invalid URL scheme. Only http://, https://, and relative URLs are allowed.`};let r=t.external||typeof n==`string`&&(n.startsWith(`http://`)||n.startsWith(`https://`));if(this.navigationHandler)return this.navigationHandler(n,{external:r,newTab:t.newTab??r,replace:t.replace}),{success:!0};if(r)window.open(n,`_blank`,`noopener,noreferrer`);else return{success:!0,redirect:n};return{success:!0}}async executeAPI(e){let t=e.api||e.endpoint||e.target;if(!t)return{success:!1,error:`No API endpoint provided`};try{let n,r,i={"Content-Type":`application/json`},a,o=`json`;if(typeof t==`string`)n=this.interpolateTarget(t,e),r=e.method||`POST`,a=JSON.stringify(e.params||this.context.data||{});else{let s=t;if(n=this.interpolateTarget(s.url,e),r=s.method||e.method||`POST`,i={...i,...s.headers},o=s.responseType||`json`,s.queryParams){let e=new URLSearchParams(s.queryParams);n=`${n}${n.includes(`?`)?`&`:`?`}${e.toString()}`}s.body?a=typeof s.body==`string`?s.body:JSON.stringify(s.body):r!==`GET`&&r!==`HEAD`&&(a=JSON.stringify(e.params||this.context.data||{}))}let s={method:r,headers:i};a&&r!==`GET`&&r!==`HEAD`&&(s.body=a);let c=await fetch(n,s);if(!c.ok)throw Error(`HTTP ${c.status}: ${c.statusText}`);let l;switch(o){case`text`:l=await c.text();break;case`blob`:l=await c.blob();break;default:l=await c.json()}return{success:!0,data:l}}catch(e){return{success:!1,error:e.message}}}isValidUrl(e){return typeof e==`string`&&(e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`/`)||e.startsWith(`./`))}interpolateTarget(e,t){if(typeof e!=`string`||e.indexOf("${")===-1)return e;let n=t.params&&typeof t.params==`object`&&!Array.isArray(t.params)?t.params:{},r=this.buildInterpolationContext();return e.replace(/\$\{(param|ctx)\.([\w.]+)\}/g,(e,t,i)=>{let a=ae(t===`param`?n:r,i);return a==null?``:encodeURIComponent(String(a))})}buildInterpolationContext(){let e={origin:typeof window<`u`?window.location.origin:``,apiBase:typeof this.context.apiBase==`string`?this.context.apiBase.replace(/\/+$/,``):``,user:this.context.user??{},org:this.context.org??this.context.organization??{},recordId:this.context.record?.id??this.context.recordId};return this.context.ctx&&typeof this.context.ctx==`object`&&Object.assign(e,this.context.ctx),e}updateContext(e){this.context={...this.context,...e},this.evaluator.updateContext(e)}getContext(){return this.context}getEvaluator(){return this.evaluator}};function ae(e,t){if(e!=null)return t.split(`.`).reduce((e,t)=>{if(e!=null)return e[t]},e)}function oe(e){return/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(e)}function se(e){return{type:`app`,name:e.name,title:e.title,label:e.title,description:e.description,icon:e.icon,logo:e.branding.logo,favicon:e.branding.favicon,branding:e.branding,layout:e.layout,navigation:e.navigation}}function ce(e,t){if(typeof e==`string`)return e;if(e&&typeof e==`object`){let t=e.default;if(typeof t==`string`)return t}return t}function le(e){let t=e.type??`tabular`,n=t===`joined`||t===`tabular`?`tabular`:t,r=(e.values??[]).map(e=>({name:e,label:ce(void 0,e)})),i=(e.rows??[]).map(e=>({field:e,sort:`asc`}));return{type:`report`,title:ce(e.label,e.name),description:e.description?ce(e.description,``):void 0,reportType:n,fields:r,groupBy:i.length>0?i:void 0}}function ue(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.name!=`string`||t.type===`report`&&Array.isArray(t.fields)?!1:typeof t.dataset==`string`||Array.isArray(t.blocks)||typeof t.type==`string`&&[`tabular`,`summary`,`matrix`,`joined`].includes(t.type)}var de=[`list_toolbar`,`list_item`,`record_header`,`record_more`,`record_related`,`record_section`,`global_nav`];i(de);function fe(e){return e.toLowerCase().split(`+`).map(e=>e.trim()).sort().join(`+`)}var pe=new Set;function me(e,t,n){let r=typeof t==`string`?t:t&&typeof t==`object`&&typeof t.source==`string`?t.source:String(t),i=`${String(e)}::${r}`;if(pe.has(i))return;pe.add(i);let a=n instanceof Error?n.message:String(n);console.warn(`[ActionEngine] action "${String(e)}" hidden: its \`visible\` predicate threw — ${a}. Predicate: ${r}. Action predicates evaluate against { record, recordId, objectName, user, … }; use \`record.<field>\` (not a bare field).`)}var he=class{actions=new Map;mappings=[];shortcuts=[];normalizedShortcutMap=new Map;runner;constructor(e={}){this.runner=e instanceof M?e:new M(e)}getRunner(){return this.runner}registerAction(e,t){let n=e.name||e.type||``;if(!n)throw Error(`Action must have a name or type`);this.actions.set(n,{action:e,locations:t?.locations||[],shortcut:t?.shortcut,bulkEnabled:t?.bulkEnabled??!1,priority:t?.priority??100}),t?.shortcut&&(this.shortcuts.push({keys:t.shortcut,actionName:n}),this.normalizedShortcutMap.set(fe(t.shortcut),n))}registerActions(e){for(let t of e)this.registerAction(t,{locations:t.locations,shortcut:t.shortcut,bulkEnabled:t.bulkEnabled})}unregisterAction(e){let t=this.actions.get(e);t?.shortcut&&this.normalizedShortcutMap.delete(fe(t.shortcut)),this.actions.delete(e),this.shortcuts=this.shortcuts.filter(t=>t.actionName!==e),this.mappings=this.mappings.filter(t=>t.actionName!==e)}addMapping(e){this.mappings.push(e)}getActionsForLocation(e){let t=this.runner.getEvaluator();return Array.from(this.actions.values()).filter(t=>t.locations.includes(e)).filter(e=>{let n=e.action.visible;if(n==null||n===``||n===!0)return!0;if(n===!1)return!1;let r;if(typeof n==`string`)r=`\${${n}}`;else if(typeof n==`object`&&typeof n.source==`string`){let e=n.source;if(!e)return!0;r=`\${${e}}`}else r=!!n;try{return t.evaluateCondition(r,{throwOnError:!0})}catch(t){return me(e.action.name,n,t),!1}}).sort((e,t)=>(e.priority??100)-(t.priority??100)).map(e=>e.action)}getBulkActions(){return Array.from(this.actions.values()).filter(e=>e.bulkEnabled).sort((e,t)=>(e.priority??100)-(t.priority??100)).map(e=>e.action)}getShortcuts(){return[...this.shortcuts]}getAction(e){return this.actions.get(e)?.action}async executeAction(e,t){let n=this.actions.get(e);return n?(t&&this.runner.updateContext(t),this.runner.execute(n.action)):{success:!1,error:`Action not found: ${e}`}}async dispatch(e,t){let n=this.mappings.filter(t=>t.event===e);if(n.length===0)return[];let r=[];for(let e of n){if(e.condition&&!this.runner.getEvaluator().evaluateCondition(e.condition))continue;let n=await this.executeAction(e.actionName,t);r.push(n)}return r}async handleShortcut(e,t){let n=this.normalizedShortcutMap.get(fe(e));return n?this.executeAction(n,t):null}async executeBulk(e,t,n){let r=this.actions.get(e);if(!r)return{total:0,succeeded:0,failed:0,results:[{success:!1,error:`Action not found: ${e}`}]};if(!r.bulkEnabled)return{total:0,succeeded:0,failed:0,results:[{success:!1,error:`Action ${e} does not support bulk operations`}]};let i=[],a=0,o=0;if(n?.parallel){let e=t.map(e=>(this.runner.updateContext({record:e,selectedRecords:t}),this.runner.execute(r.action))),n=await Promise.allSettled(e);for(let e of n)e.status===`fulfilled`?(i.push(e.value),e.value.success?a++:o++):(i.push({success:!1,error:e.reason?.message||`Unknown error`}),o++)}else for(let e of t){this.runner.updateContext({record:e,selectedRecords:t});let s=await this.runner.execute(r.action);if(i.push(s),s.success)a++;else if(o++,!n?.continueOnError)break}return{total:t.length,succeeded:a,failed:o,results:i}}updateContext(e){this.runner.updateContext(e)}clear(){this.actions.clear(),this.mappings=[],this.shortcuts=[],this.normalizedShortcutMap.clear()}};async function ge(e,t){let{ids:n,allowBulk:r,offset:i,label:a=`bulk`}=e,o={succeeded:0,failed:0,errors:[]};if(r&&typeof t.bulkCall==`function`)try{let e=await t.bulkCall(n),r=Math.max(0,Math.min(e,n.length));o.succeeded+=r;let s=n.length-r;return s>0&&(o.failed+=s,o.errors.push({id:`batch_${i}`,error:`${s} record${s===1?``:`s`} failed in ${a}`})),o}catch{}return(await Promise.allSettled(n.map(e=>t.perRow(e)))).forEach((e,t)=>{e.status===`fulfilled`?o.succeeded+=1:(o.failed+=1,o.errors.push({id:n[t],error:e.reason instanceof Error?e.reason.message:String(e.reason)}))}),o}function N(e,t){return t?e[t]:e.id??e._id}function _e(e,t){if(!t||t.length===0)return!0;let n=t[0];if(n===`and`)return t.slice(1).every(t=>_e(e,t));if(n===`or`)return t.slice(1).some(t=>_e(e,t));if(t.length===3&&typeof n==`string`){let[n,r,i]=t,a=e[n];switch(r){case`=`:return a===i;case`!=`:return a!==i;case`>`:return a>i;case`>=`:return a>=i;case`<`:return a<i;case`<=`:return a<=i;case`in`:return Array.isArray(i)&&i.includes(a);case`not in`:case`not_in`:case`nin`:case`notin`:return Array.isArray(i)&&!i.includes(a);case`contains`:{let e=typeof a==`string`?a.toLowerCase():``;return typeof a==`string`&&e.includes(String(i).toLowerCase())}case`notcontains`:{let e=typeof a==`string`?a.toLowerCase():``;return typeof a==`string`&&!e.includes(String(i).toLowerCase())}case`startswith`:{let e=typeof a==`string`?a.toLowerCase():``;return typeof a==`string`&&e.startsWith(String(i).toLowerCase())}case`between`:return Array.isArray(i)&&i.length===2&&a>=i[0]&&a<=i[1];default:return!0}}return!0}function ve(e,t){for(let[n,r]of Object.entries(t)){let t=e[n];if(r&&typeof r==`object`&&!Array.isArray(r))for(let[e,n]of Object.entries(r))switch(e){case`$gt`:if(!(t>n))return!1;break;case`$gte`:if(!(t>=n))return!1;break;case`$lt`:if(!(t<n))return!1;break;case`$lte`:if(!(t<=n))return!1;break;case`$ne`:if(t===n)return!1;break;case`$in`:if(!Array.isArray(n)||!n.includes(t))return!1;break;case`$contains`:if(typeof t!=`string`||!t.toLowerCase().includes(String(n).toLowerCase()))return!1;break;default:break}else if(t!==r)return!1}return!0}function ye(e,t){if(!t)return e;let n=[];return Array.isArray(t)?n=t.map(e=>typeof e==`string`?e.startsWith(`-`)?{field:e.slice(1),order:`desc`}:{field:e,order:`asc`}:{field:e.field,order:e.order??`asc`}):typeof t==`object`&&(n=Object.entries(t).map(([e,t])=>({field:e,order:t}))),n.length===0?e:[...e].sort((e,t)=>{for(let{field:r,order:i}of n){let n=e[r],a=t[r];if(n===a)continue;if(n==null)return i===`asc`?-1:1;if(a==null)return i===`asc`?1:-1;let o=n<a?-1:1;return i===`asc`?o:-o}return 0})}function be(e,t){if(!t||t.length===0)return e;let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}var xe=class{items;idField;mutationListeners=new Set;constructor(e){this.items=JSON.parse(JSON.stringify(e.items)),this.idField=e.idField}emitMutation(e){for(let t of this.mutationListeners)try{t(e)}catch(e){console.warn(`ValueDataSource: mutation listener error`,e)}}async find(e,t){let n=[...this.items];if(t?.$filter&&(Array.isArray(t.$filter)&&t.$filter.length>0?n=n.filter(e=>_e(e,t.$filter)):!Array.isArray(t.$filter)&&Object.keys(t.$filter).length>0&&(n=n.filter(e=>ve(e,t.$filter)))),t?.$search){let e=t.$search.toLowerCase();n=n.filter(t=>Object.values(t).some(t=>typeof t==`string`&&t.toLowerCase().includes(e)))}let r=n.length;n=ye(n,t?.$orderby);let i=t?.$skip??0,a=t?.$top;return i>0&&(n=n.slice(i)),a!==void 0&&(n=n.slice(0,a)),t?.$select?.length&&(n=n.map(e=>be(e,t.$select))),{data:n,total:r,hasMore:i+(a??n.length)<r}}async findOne(e,t,n){let r=this.items.find(e=>String(N(e,this.idField))===String(t));return r?n?.$select?.length?be(r,n.$select):{...r}:null}async create(e,t){let n={...t};if(!N(n,this.idField)){let e=this.idField??`id`;n[e]=`auto_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}return this.items.push(n),this.emitMutation({type:`create`,resource:e,record:{...n}}),{...n}}async update(e,t,n){let r=this.items.findIndex(e=>String(N(e,this.idField))===String(t));if(r===-1)throw Error(`ValueDataSource: Record with id "${t}" not found`);return this.items[r]={...this.items[r],...n},this.emitMutation({type:`update`,resource:e,id:t,record:{...this.items[r]}}),{...this.items[r]}}async delete(e,t){let n=this.items.findIndex(e=>String(N(e,this.idField))===String(t));return n===-1?!1:(this.items.splice(n,1),this.emitMutation({type:`delete`,resource:e,id:t}),!0)}async bulk(e,t,n){let r=[];for(let i of n)switch(t){case`create`:r.push(await this.create(e,i));break;case`update`:{let t=N(i,this.idField);t!==void 0&&r.push(await this.update(e,t,i));break}case`delete`:{let t=N(i,this.idField);t!==void 0&&await this.delete(e,t);break}}return r}async getObjectSchema(e){if(this.items.length===0)return{name:e,fields:{}};let t=this.items[0],n={};for(let[e,r]of Object.entries(t))n[e]={type:typeof r};return{name:e,fields:n}}async getView(e,t){return null}async getApp(e){return null}async aggregate(e,t){let{field:n,function:r,groupBy:i}=t,a={};for(let e of this.items){let t=String(e[i]??`Unknown`);a[t]||(a[t]=[]),a[t].push(e)}return Object.entries(a).map(([e,t])=>{let a=t.map(e=>Number(e[n])||0),o;switch(r){case`count`:o=t.length;break;case`avg`:o=a.length>0?a.reduce((e,t)=>e+t,0)/a.length:0;break;case`min`:o=a.length>0?Math.min(...a):0;break;case`max`:o=a.length>0?Math.max(...a):0;break;default:o=a.reduce((e,t)=>e+t,0);break}return{[i]:e,[n]:o}})}onMutation(e){return this.mutationListeners.add(e),()=>{this.mutationListeners.delete(e)}}get count(){return this.items.length}getAll(){return JSON.parse(JSON.stringify(this.items))}},P=`https://objectui.dev/docs/errors`,Se={"OBJUI-001":{code:`OBJUI-001`,message:'Unknown component type: "${type}"',suggestion:`Ensure the component is registered via registry.register() before rendering. Check for typos in the component type name.`,docUrl:`${P}/OBJUI-001`},"OBJUI-002":{code:`OBJUI-002`,message:"Schema validation failed: ${reason}",suggestion:`Verify the schema against the ObjectUI JSON spec. Run the built-in schema validator for details.`,docUrl:`${P}/OBJUI-002`},"OBJUI-003":{code:`OBJUI-003`,message:"Expression evaluation failed: ${expression}",suggestion:`Check the expression syntax and ensure all referenced variables exist in the current data scope.`,docUrl:`${P}/OBJUI-003`},"OBJUI-004":{code:`OBJUI-004`,message:'Plugin dependency missing: "${dependency}"',suggestion:`Install the required dependency and register it before loading this plugin.`,docUrl:`${P}/OBJUI-004`},"OBJUI-005":{code:`OBJUI-005`,message:'Plugin already loaded: "${plugin}"',suggestion:`A plugin with the same name is already registered. Remove the duplicate or use a unique plugin name.`,docUrl:`${P}/OBJUI-005`},"OBJUI-006":{code:`OBJUI-006`,message:'Plugin not found: "${plugin}"',suggestion:`Verify the plugin name and ensure it has been registered before access.`,docUrl:`${P}/OBJUI-006`},"OBJUI-007":{code:`OBJUI-007`,message:'Registry namespace deprecated: "${namespace}"',suggestion:`Migrate to the new namespace format. See the migration guide for details.`,docUrl:`${P}/OBJUI-007`},"OBJUI-008":{code:`OBJUI-008`,message:'Read-only scope violation: "${scope}"',suggestion:`You are trying to mutate a read-only data scope. Use a writable scope or clone the data before modifying.`,docUrl:`${P}/OBJUI-008`},"OBJUI-009":{code:`OBJUI-009`,message:'Invalid field configuration: "${field}"',suggestion:`Check the field schema for required properties (type, name). Ensure the field widget is registered.`,docUrl:`${P}/OBJUI-009`},"OBJUI-010":{code:`OBJUI-010`,message:'Action execution failed: "${action}"',suggestion:`Verify the action handler is registered and that all required parameters are provided.`,docUrl:`${P}/OBJUI-010`}},Ce=class extends Error{code;details;constructor(e,t,n){super(e),this.code=t,this.details=n,this.name=`ObjectUIError`,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,message:this.message,code:this.code,details:this.details,stack:this.stack}}};function we(e){return e instanceof Ce}var F=`__debug`;function Te(e){let t=e;if(t===void 0)try{t=typeof window<`u`?window.location.search:``}catch{t=``}let n=new URLSearchParams(t),r=n.has(F),i=n.has(`${F}_schema`),a=n.has(`${F}_perf`),o=n.has(`${F}_data`),s=n.has(`${F}_expr`),c=n.has(`${F}_events`),l=n.has(`${F}_registry`);return{enabled:r||i||a||o||s||c||l,...i&&{schema:i},...a&&{perf:a},...o&&{data:o},...s&&{expr:s},...c&&{events:c},...l&&{registry:l}}}function Ee(){try{if(typeof window<`u`)try{if(Te(window.location.search).enabled)return!0}catch{}let e=typeof globalThis<`u`&&globalThis.OBJECTUI_DEBUG;return e===!0||e===`true`||globalThis.process?.env?.OBJECTUI_DEBUG===`true`}catch{return!1}}function De(e,t,n){Ee()&&(n===void 0?console.log(`[ObjectUI Debug][${e}] ${t}`):console.log(`[ObjectUI Debug][${e}] ${t}`,n))}var Oe=new Map;function ke(e){Ee()&&Oe.set(e,performance.now())}function Ae(e){if(!Ee())return;let t=Oe.get(e);if(t!==void 0){let n=(performance.now()-t).toFixed(2);console.log(`[ObjectUI Debug][perf] ${e}: ${n}ms`),Oe.delete(e)}}var je=200,Me=class e{static instance=null;entries=[];subscribers=new Set;static getInstance(){return e.instance||=new e,e.instance}static resetInstance(){e.instance=null}addPerf(e){this.push({kind:`perf`,data:e})}addExpr(e){this.push({kind:`expr`,data:e})}addEvent(e){this.push({kind:`event`,data:e})}getEntries(e){return e?this.entries.filter(t=>t.kind===e):this.entries.slice()}clear(){this.entries=[]}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}push(e){this.entries.push(e),this.entries.length>je&&(this.entries=this.entries.slice(-200));for(let t of this.subscribers)try{t(e)}catch{}}},Ne=/\$\{event\.([a-zA-Z0-9_]+)\}/g;function Pe(e,t){return typeof e!=`string`||e.indexOf("${event.")===-1?e:e.replace(Ne,(e,n)=>{let r=t[n];return r==null?``:String(r)})}function Fe(e,t){if(typeof e==`string`){let n=e.match(/^\$\{event\.([a-zA-Z0-9_]+)\}$/);if(n){let e=t[n[1]];return e===``||e===void 0?null:e}return Pe(e,t)}if(Array.isArray(e))return e.map(e=>Fe(e,t));if(e&&typeof e==`object`){let n={};for(let[r,i]of Object.entries(e))n[r]=Fe(i,t);return n}return e}function Ie(e,t,n={}){if(e?.filter)return Fe(e.filter,t);let r={},{rowField:i,columnField:a,groupByField:o}=n,s=t.scope??`cell`;return s===`total`?r:((s===`cell`||s===`row`)&&i&&`rowKey`in t&&(r[i]=t.rowKey===``?null:t.rowKey),(s===`cell`||s===`column`)&&a&&`colKey`in t&&(r[a]=t.colKey===``?null:t.colKey),o&&`category`in t&&(r[o]=t.category===``?null:t.category),r)}function Le(e,t,n=`Details`){if(e?.title){let n=Pe(e.title,t).trim();if(n)return n}let r=[];return t.rowLabel&&r.push(t.rowLabel),t.colLabel&&r.push(t.colLabel),t.categoryLabel?r.push(t.categoryLabel):t.category&&r.push(t.category),t.series&&r.push(t.series),r.length>0?r.join(` × `):n}function Re(e){return e?e.enabled!==!1:!1}function ze(e,t=new Date){if(e==null)return e;let n=e=>{let t=new Date(e);return t.setHours(0,0,0,0),t},r=e=>{let t=n(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`},i=e=>{let t=n(e),r=(t.getDay()+6)%7;return t.setDate(t.getDate()-r),t},a=e=>new Date(e.getFullYear(),e.getMonth(),1),o=e=>{let t=Math.floor(e.getMonth()/3);return new Date(e.getFullYear(),t*3,1)},s=e=>new Date(e.getFullYear(),0,1),c=(e,t)=>new Date(e.getFullYear(),e.getMonth()+t,1),l=(e,t)=>{let r=n(e);return r.setDate(r.getDate()+t),r},u=e=>l(c(a(e),1),-1),d=e=>l(i(e),6),f=e=>l(c(o(e),3),-1),p=e=>new Date(e.getFullYear(),11,31),m={today:()=>r(t),yesterday:()=>r(l(t,-1)),tomorrow:()=>r(l(t,1)),now:()=>t.toISOString(),current_week_start:()=>r(i(t)),current_week_end:()=>r(d(t)),current_month_start:()=>r(a(t)),current_month_end:()=>r(u(t)),current_quarter_start:()=>r(o(t)),current_quarter_end:()=>r(f(t)),current_year_start:()=>r(s(t)),current_year_end:()=>r(p(t)),last_week_start:()=>r(l(i(t),-7)),last_week_end:()=>r(l(i(t),-1)),last_month_start:()=>r(c(a(t),-1)),last_month_end:()=>r(l(a(t),-1)),last_quarter_start:()=>r(c(o(t),-3)),last_quarter_end:()=>r(l(o(t),-1)),last_year_start:()=>r(new Date(t.getFullYear()-1,0,1)),last_year_end:()=>r(new Date(t.getFullYear()-1,11,31)),next_week_start:()=>r(l(i(t),7)),next_month_start:()=>r(c(a(t),1)),next_quarter_start:()=>r(c(o(t),3)),next_year_start:()=>r(new Date(t.getFullYear()+1,0,1))};for(let[e,t]of Object.entries({week_start:`current_week_start`,week_end:`current_week_end`,month_start:`current_month_start`,month_end:`current_month_end`,quarter_start:`current_quarter_start`,quarter_end:`current_quarter_end`,year_start:`current_year_start`,year_end:`current_year_end`}))m[e]=m[t];let h=/^(\d+)_(minutes?|hours?|days?|weeks?|months?|years?)_(ago|from_now)$/,g=e=>{let n=e.match(h);if(!n)return null;let i=parseInt(n[1],10);if(!Number.isFinite(i))return null;let a=n[3]===`ago`?-1:1,o=n[2].replace(/s$/,``);return o===`minute`?new Date(t.getTime()+a*i*60*1e3).toISOString():o===`hour`?new Date(t.getTime()+a*i*60*60*1e3).toISOString():o===`day`?r(l(t,a*i)):o===`week`?r(l(t,a*i*7)):o===`month`?r(new Date(t.getFullYear(),t.getMonth()+a*i,t.getDate())):o===`year`?r(new Date(t.getFullYear()+a*i,t.getMonth(),t.getDate())):null},_=/\$?\{([a-zA-Z0-9_]+)\}/g,v=e=>{if(e==null)return e;if(typeof e==`string`){let t=e.match(/^\$?\{([a-zA-Z0-9_]+)\}$/);if(t){let e=t[1];if(m[e])return m[e]();let n=g(e);if(n!=null)return n}let n=!1,r=e.replace(_,(e,t)=>{if(m[t])return n=!0,m[t]();let r=g(t);return r==null?e:(n=!0,r)});return n?r:e}if(Array.isArray(e))return e.map(v);if(typeof e==`object`){let t={};for(let n of Object.keys(e))t[n]=v(e[n]);return t}return e};return v(e)}var Be={current_week_start:`last_week_start`,current_week_end:`last_week_end`,current_month_start:`last_month_start`,current_month_end:`last_month_end`,current_quarter_start:`last_quarter_start`,current_quarter_end:`last_quarter_end`,current_year_start:`last_year_start`,current_year_end:`last_year_end`,week_start:`last_week_start`,week_end:`last_week_end`,month_start:`last_month_start`,month_end:`last_month_end`,quarter_start:`last_quarter_start`,quarter_end:`last_quarter_end`,year_start:`last_year_start`,year_end:`last_year_end`,today:`yesterday`};function Ve(e,t){if(e==null)return e;if(typeof e==`string`)return e.replace(/\$?\{([a-zA-Z0-9_]+)\}/g,(e,n)=>{let r=t[n];return r?`{${r}}`:e});if(Array.isArray(e))return e.map(e=>Ve(e,t));if(typeof e==`object`){let n={};for(let r of Object.keys(e))n[r]=Ve(e[r],t);return n}return e}function He(e,t){let n=t.match(/^(\d+)([dwMy])$/);if(!n)return null;let r=parseInt(n[1],10),i=n[2],a=new Date(e);if(i===`d`)a.setDate(a.getDate()-r);else if(i===`w`)a.setDate(a.getDate()-r*7);else if(i===`M`)a.setMonth(a.getMonth()-r);else if(i===`y`)a.setFullYear(a.getFullYear()-r);else return null;return a}function Ue(e,t,n=new Date){if(t===`previousYear`)return ze(e,new Date(n.getFullYear()-1,n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds()));if(typeof t==`object`&&t&&`offset`in t){let r=He(n,t.offset);return r?ze(e,r):ze(e,n)}return ze(Ve(e,Be),n)}function We(e,t){if(e===`previousYear`)return`vsLastYear`;if(typeof e==`object`&&e&&`offset`in e)return`vsPreviousPeriod`;let n=t?JSON.stringify(t):``;return/current_year_|year_start|year_end/.test(n)?`vsLastYear`:/current_quarter_|quarter_start|quarter_end/.test(n)?`vsLastQuarter`:/current_month_|month_start|month_end/.test(n)?`vsLastMonth`:/current_week_|week_start|week_end/.test(n)?`vsLastWeek`:/\btoday\b/.test(n)?`vsYesterday`:`vsPreviousPeriod`}function Ge(e,t,n,r){let i=(t??[]).filter(Boolean),a=(n??[]).filter(Boolean),o=Array.isArray(e)?e:[],s=e=>(r??[]).find(t=>t.name===e)?.label??e;if(i.length>=2&&a.length===1){let e=i[0],t=i[1],n=a[0],r=[],s=new Map;for(let i of o){let a=i[e],o=String(a??``);s.has(o)||s.set(o,{[e]:a});let c=String(i[t]??``);c!==``&&!r.includes(c)&&r.push(c),s.get(o)[c]=i[n]}return{data:Array.from(s.values()),xAxisKey:e,series:r.map(e=>({dataKey:e,label:e}))}}return{data:o,xAxisKey:i[0],series:a.map(e=>({dataKey:e,label:s(e)}))}}function Ke(e,t,n,r,i){let a=(t??[]).filter(Boolean),o=(n??[]).filter(Boolean),s=Array.isArray(e)?e:[],c=a[0];if(!c)return-1;let l=String(r??``);if(a.length>=2&&o.length===1){let e=a[1],t=String(i??``);return s.findIndex(n=>String(n[c]??``)===l&&String(n[e]??``)===t)}return s.findIndex(e=>String(e[c]??``)===l)}function qe(e,t,n){if(e==null)return`—`;if(typeof e!=`number`)return String(e);let r=t?t.split(`.`)[1]?.match(/0/g)?.length??0:void 0;if(n)try{return new Intl.NumberFormat(void 0,{style:`currency`,currency:n,minimumFractionDigits:r??0,maximumFractionDigits:r??2}).format(e)}catch{}if(!t)return Number.isInteger(e)?String(e):e.toLocaleString(void 0,{maximumFractionDigits:2});let i=t.includes(`%`);return`${t.includes(`$`)?`$`:``}${e.toLocaleString(void 0,{minimumFractionDigits:r??0,maximumFractionDigits:r??0})}${i?`%`:``}`}function Je(e){return e==null?`—`:typeof e==`number`?Number.isInteger(e)?String(e):e.toLocaleString(void 0,{maximumFractionDigits:2}):String(e)}function Ye(e,t,n){let r=new Map((e??[]).map(e=>[e.name,e])),i=e=>r.get(e);return{measureField:i,headerLabel:e=>{let r=i(e)?.label??e;return t&&n?n(t,e,r):r}}}function Xe(e,t,n,r){let i={};for(let r of t){let t=e?.[r];i[n[r]]=t===``||t===void 0?null:t}return r?{...r,...i}:i}var I=e(t(),1),L=n(),Ze=(0,I.createContext)(null),Qe=({children:e,dataSource:t,debug:n,debugFlags:r})=>{let i=(0,I.useMemo)(()=>({dataSource:t,debug:n,debugFlags:r}),[t,n,r]);return(0,L.jsx)(Ze.Provider,{value:i,children:e})},$e=()=>{let e=(0,I.useContext)(Ze);if(!e)throw Error(`useSchemaContext must be used within a SchemaRendererProvider`);return e},et=e=>{let t=(0,I.useContext)(Ze)?.dataSource;if(e&&t)return e.split(`.`).reduce((e,t)=>e&&e[t],t)},tt=(0,I.createContext)({});function nt({scope:e,children:t}){return(0,I.createElement)(tt.Provider,{value:e},t)}function rt(){return(0,I.useContext)(tt)}function it(e){if(!(e==null||e===``)){if(typeof e==`boolean`)return e;if(typeof e==`string`)return`\${${e}}`;if(typeof e==`object`&&typeof e.source==`string`){let t=e.source;return t?`\${${t}}`:void 0}}}function at(e,t={}){let n=rt();return(0,I.useMemo)(()=>new D({...n,...t}).evaluateCondition(e),[e,t,n])}function ot(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var st=(()=>{try{return!1}catch{return!0}})(),ct=typeof WeakMap<`u`?new WeakMap:{set(){},get(){},has(){return!1}},lt=typeof WeakSet<`u`?new WeakSet:{add(){},has(){return!1}};function ut(e){if(!st||!e||typeof e!=`object`)return{valid:!0,messages:[]};let t=ct.get(e);if(t)return t;let n={valid:!0,messages:[]};try{let t=h(e);if(!t.valid){let r=t.errors.map(e=>`${e.path}: ${e.message}`);n={valid:!1,messages:r},lt.has(e)||(lt.add(e),console.warn(`[ObjectUI] Invalid schema detected:
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-ClIa1CJA.js";import{v as r,y as i}from"./vendor-objectstack-C1teU2a6.js";import{i as a,n as o,r as s,t as c}from"./vendor-i18n-DA5MKfC_.js";var l=new class{components=new Map;lazyEntries=new Map;listeners=new Set;register(e,t,n){let r=n?.namespace?`${n.namespace}:${e}`:e;if(n?.namespace||console.warn(`Registering component "${e}" without a namespace is deprecated. Please provide a namespace in the meta parameter.\n\n Migration:\n // Before (deprecated):\n registry.register('${e}', MyComponent);\n\n // After:\n registry.register('${e}', MyComponent, { namespace: 'my-plugin' });\n\n See: https://github.com/objectstack-ai/objectui/blob/main/MIGRATION_GUIDE.md`),this.components.has(r),this.components.set(r,{type:r,component:t,...n}),n?.namespace&&!n?.skipFallback){let i=this.components.get(e);i&&i.component!==t&&i.type!==r&&console.warn(`Component "${e}" bare-name fallback is being overwritten by "${r}". If this is intentional keep going; otherwise register "${r}" with { skipFallback: true } so it doesn't claim the bare "${e}" key.`),this.components.set(e,{type:r,component:t,...n})}this.lazyEntries.delete(r),this.lazyEntries.delete(e),this.notify()}unregister(e,t){let n=t?`${t}:${e}`:e,r=this.components.delete(n);if(t){let t=this.components.get(e);t&&t.type===n&&this.components.delete(e)}return this.lazyEntries.delete(n),this.lazyEntries.delete(e),r&&this.notify(),r}registerLazy(e,t,n){let r=n?.namespace?`${n.namespace}:${e}`:e,i={loader:t,meta:n};this.lazyEntries.set(r,i),n?.namespace&&!n?.skipFallback&&this.lazyEntries.set(e,i)}hasLazy(e,t){return t?this.lazyEntries.has(`${t}:${e}`):this.lazyEntries.has(e)}loadLazy(e,t){let n=t?`${t}:${e}`:e,r=this.lazyEntries.get(n);if(r)return r.pending||=r.loader().catch(e=>{throw r.pending=void 0,e}),r.pending}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}notify(){for(let e of this.listeners)try{e()}catch(e){console.error(`[Registry] listener error`,e)}}get(e,t){if(t){let n=`${t}:${e}`;return this.components.get(n)?.component}return this.components.get(e)?.component}getConfig(e,t){if(t){let n=`${t}:${e}`;return this.components.get(n)}return this.components.get(e)}has(e,t){if(t){let n=`${t}:${e}`;return this.components.has(n)}return this.components.has(e)}getAllTypes(){return Array.from(this.components.keys())}getAllConfigs(){return Array.from(this.components.values())}getNamespaceComponents(e){return Array.from(this.components.values()).filter(t=>t.namespace===e)}},u={type:{required:!0,validate:e=>typeof e==`string`&&e.length>0,message:`type must be a non-empty string`},id:{required:!1,validate:e=>typeof e==`string`,message:`id must be a string`},className:{required:!1,validate:e=>typeof e==`string`,message:`className must be a string`},visible:{required:!1,validate:e=>typeof e==`boolean`,message:`visible must be a boolean`},disabled:{required:!1,validate:e=>typeof e==`boolean`,message:`disabled must be a boolean`}};function d(e,t=`schema`){let n=[];return!e||typeof e!=`object`?(n.push({path:t,message:`Schema must be an object`,type:`error`,code:`INVALID_SCHEMA`}),n):(Object.entries(u).forEach(([r,i])=>{let a=e[r];i.required&&a===void 0&&n.push({path:`${t}.${r}`,message:`${r} is required`,type:`error`,code:`MISSING_REQUIRED`}),a!==void 0&&!i.validate(a)&&n.push({path:`${t}.${r}`,message:i.message,type:`error`,code:`INVALID_TYPE`})}),n)}function f(e,t=`schema`){let n=[];return e.type===`crud`&&((!e.columns||!Array.isArray(e.columns))&&n.push({path:`${t}.columns`,message:`CRUD schema requires columns array`,type:`error`,code:`MISSING_COLUMNS`}),!e.api&&!e.dataSource&&n.push({path:`${t}.api`,message:`CRUD schema requires api or dataSource`,type:`warning`,code:`MISSING_DATA_SOURCE`}),e.columns&&Array.isArray(e.columns)&&e.columns.forEach((e,r)=>{e.name||n.push({path:`${t}.columns[${r}]`,message:`Column requires name property`,type:`error`,code:`MISSING_COLUMN_NAME`})}),e.fields&&Array.isArray(e.fields)&&e.fields.forEach((e,r)=>{e.name||n.push({path:`${t}.fields[${r}]`,message:`Field requires name property`,type:`error`,code:`MISSING_FIELD_NAME`})})),n}function p(e,t=`schema`){let n=[];return e.type===`form`&&e.fields&&Array.isArray(e.fields)&&e.fields.forEach((r,i)=>{r.name||n.push({path:`${t}.fields[${i}]`,message:`Form field requires name property`,type:`error`,code:`MISSING_FIELD_NAME`}),e.fields.filter(e=>e.name===r.name).length>1&&n.push({path:`${t}.fields[${i}]`,message:`Duplicate field name: ${r.name}`,type:`warning`,code:`DUPLICATE_FIELD_NAME`})}),n}function m(e,t=`schema`){let n=[],r=e.children||e.body;if(r){if(Array.isArray(r))r.forEach((e,r)=>{if(typeof e==`object`&&e){let i=h(e,`${t}.children[${r}]`);n.push(...i.errors,...i.warnings)}});else if(typeof r==`object`&&r){let e=h(r,`${t}.children`);n.push(...e.errors,...e.warnings)}}return n}function h(e,t=`schema`){let n=[];n.push(...d(e,t)),n.push(...f(e,t)),n.push(...p(e,t)),n.push(...m(e,t));let r=n.filter(e=>e.type===`error`),i=n.filter(e=>e.type===`warning`);return{valid:r.length===0,errors:r,warnings:i}}function g(e){return{$eq:`=`,$ne:`!=`,$gt:`>`,$gte:`>=`,$lt:`<`,$lte:`<=`,$in:`in`,$nin:`nin`,$notin:`nin`,$between:`between`,$contains:`contains`,$notContains:`notcontains`,$notcontains:`notcontains`,$startsWith:`startswith`,$startswith:`startswith`,$endsWith:`endswith`,$endswith:`endswith`}[e]||null}function _(e){let t=[];for(let[n,r]of Object.entries(e))if(r!=null)if(typeof r==`object`&&!Array.isArray(r))for(let[e,i]of Object.entries(r)){if(e===`$regex`){console.warn(`[ObjectUI] Warning: \$regex operator is not fully supported. Converting to 'contains' which only supports substring matching, not regex patterns. Field: '${n}', Value: ${JSON.stringify(i)}. Consider using $contains or $startsWith instead.`),t.push([n,`contains`,i]);continue}if(e===`$null`){t.push([n,i?`is_null`:`is_not_null`,!0]);continue}if(e===`$exists`){t.push([n,i?`is_not_null`:`is_null`,!0]);continue}let r=g(e);if(r)t.push([n,r,i]);else throw Error(`[ObjectUI] Unknown filter operator '${e}' for field '${n}'. Supported operators: $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $between, $contains, $notContains, $startsWith, $endsWith, $null, $exists. If you need exact object matching, use the value directly without an operator.`)}else t.push([n,`=`,r]);return t.length===0?e:t.length===1?t[0]:[`and`,...t]}function v(e){if(Array.isArray(e))return e;if(e&&typeof e==`object`){if(Array.isArray(e.records))return e.records;if(Array.isArray(e.data))return e.data;if(Array.isArray(e.value))return e.value}return[]}function y(e,t){if(!e||typeof e!=`object`)return[];let n=[];for(let[t,r]of Object.entries(e))r&&typeof r==`object`&&(r.type===`lookup`||r.type===`master_detail`)&&n.push(t);if(n.length===0)return[];if(t&&Array.isArray(t)&&t.length>0){let e=new Set;for(let n of t)if(typeof n==`string`)e.add(n);else if(n&&typeof n==`object`){let t=n.field??n.name??n.fieldName;t&&e.add(t)}return n.filter(t=>e.has(t))}return n}var b=class e{scopes=[];constructor(e={}){this.scopes.push(new Map(Object.entries(e)))}pushScope(e){this.scopes.push(new Map(Object.entries(e)))}popScope(){this.scopes.length>1&&this.scopes.pop()}get(e){let t=e.split(`.`),n=t[0];for(let e=this.scopes.length-1;e>=0;e--)if(this.scopes[e].has(n)){let r=this.scopes[e].get(n);for(let e=1;e<t.length;e++)if(r&&typeof r==`object`)r=r[t[e]];else return;return r}}set(e,t){this.scopes.length>0&&this.scopes[this.scopes.length-1].set(e,t)}has(e){let t=e.split(`.`)[0];for(let e=this.scopes.length-1;e>=0;e--)if(this.scopes[e].has(t))return!0;return!1}toObject(){let e={};for(let t of this.scopes)for(let[n,r]of t.entries())e[n]=r;return e}createChild(t={}){let n=new e;return n.scopes=[...this.scopes,new Map(Object.entries(t))],n}},x={Math,JSON,parseInt,parseFloat,isNaN,isFinite},ee=new Set([`constructor`,`__proto__`,`prototype`,`__defineGetter__`,`__defineSetter__`,`__lookupGetter__`,`__lookupSetter__`]),S=class e{source=``;pos=0;context={};_evaluating=!0;evaluate(e,t){this.source=e.trim(),this.pos=0,this.context={...x,...t};let n=this.parseTernary();if(this.skipWhitespace(),this.pos<this.source.length)throw SyntaxError(`Unexpected token "${this.source[this.pos]}" at position ${this.pos} in expression "${e}"`);return n}skipWhitespace(){for(;this.pos<this.source.length&&/\s/.test(this.source[this.pos]);)this.pos++}peek(e=0){return this.source[this.pos+e]??``}consume(){return this.source[this.pos++]??``}withEvaluation(e,t){let n=this._evaluating;this._evaluating=e;try{return t()}finally{this._evaluating=n}}assertSafeProp(e){if(typeof e==`string`&&ee.has(e))throw TypeError(`Access to property "${e}" is not permitted in expressions`)}parseTernary(){let e=this.parseNullish();if(this.skipWhitespace(),this.peek()===`?`&&this.peek(1)!==`?`){if(this.pos++,this.skipWhitespace(),!this._evaluating){if(this.parseTernary(),this.skipWhitespace(),this.peek()!==`:`)throw SyntaxError(`Expected ":" in ternary expression`);this.pos++,this.skipWhitespace(),this.parseTernary();return}if(e){let e=this.parseTernary();if(this.skipWhitespace(),this.peek()!==`:`)throw SyntaxError(`Expected ":" in ternary expression`);return this.pos++,this.skipWhitespace(),this.withEvaluation(!1,()=>this.parseTernary()),e}else{if(this.withEvaluation(!1,()=>this.parseTernary()),this.skipWhitespace(),this.peek()!==`:`)throw SyntaxError(`Expected ":" in ternary expression`);return this.pos++,this.skipWhitespace(),this.parseTernary()}}return e}parseNullish(){let e=this.parseOr();for(this.skipWhitespace();this.peek()===`?`&&this.peek(1)===`?`;){if(this.pos+=2,this.skipWhitespace(),this._evaluating&&e!=null)this.withEvaluation(!1,()=>this.parseOr());else{let t=this.parseOr();this._evaluating&&(e??=t)}this.skipWhitespace()}return e}parseOr(){let e=this.parseAnd();for(this.skipWhitespace();this.peek()===`|`&&this.peek(1)===`|`;){if(this.pos+=2,this.skipWhitespace(),this._evaluating&&e)this.withEvaluation(!1,()=>this.parseAnd());else{let t=this.parseAnd();this._evaluating&&(e||=t)}this.skipWhitespace()}return e}parseAnd(){let e=this.parseEquality();for(this.skipWhitespace();this.peek()===`&`&&this.peek(1)===`&`;){if(this.pos+=2,this.skipWhitespace(),this._evaluating&&!e)this.withEvaluation(!1,()=>this.parseEquality());else{let t=this.parseEquality();this._evaluating&&(e&&=t)}this.skipWhitespace()}return e}parseEquality(){let e=this.parseAddition();for(this.skipWhitespace();;){let t=null;if(this.peek()===`=`&&this.peek(1)===`=`&&this.peek(2)===`=`)t=`===`,this.pos+=3;else if(this.peek()===`!`&&this.peek(1)===`=`&&this.peek(2)===`=`)t=`!==`,this.pos+=3;else if(this.peek()===`=`&&this.peek(1)===`=`)t=`==`,this.pos+=2;else if(this.peek()===`!`&&this.peek(1)===`=`)t=`!=`,this.pos+=2;else if(this.peek()===`>`&&this.peek(1)===`=`)t=`>=`,this.pos+=2;else if(this.peek()===`<`&&this.peek(1)===`=`)t=`<=`,this.pos+=2;else if(this.peek()===`>`&&this.peek(1)!==`>`)t=`>`,this.pos++;else if(this.peek()===`<`&&this.peek(1)!==`<`)t=`<`,this.pos++;else break;this.skipWhitespace();let n=this.parseAddition();switch(t){case`===`:e=e===n;break;case`!==`:e=e!==n;break;case`==`:e=e==n;break;case`!=`:e=e!=n;break;case`>`:e=e>n;break;case`<`:e=e<n;break;case`>=`:e=e>=n;break;case`<=`:e=e<=n;break}this.skipWhitespace()}return e}parseAddition(){let e=this.parseMultiplication();for(this.skipWhitespace();(this.peek()===`+`||this.peek()===`-`)&&this.peek(1)!==`=`;){let t=this.consume();this.skipWhitespace();let n=this.parseMultiplication();e=t===`+`?e+n:e-n,this.skipWhitespace()}return e}parseMultiplication(){let e=this.parseUnary();for(this.skipWhitespace();(this.peek()===`*`||this.peek()===`/`||this.peek()===`%`)&&this.peek(1)!==`=`;){let t=this.consume();this.skipWhitespace();let n=this.parseUnary();t===`*`?e*=n:t===`/`?e/=n:e%=n,this.skipWhitespace()}return e}parseUnary(){if(this.skipWhitespace(),this.source.startsWith(`typeof`,this.pos)&&!/[\w$]/.test(this.source[this.pos+6]??``)){this.pos+=6,this.skipWhitespace();try{return typeof this.parseUnary()}catch{return`undefined`}}return this.peek()===`!`?(this.pos++,!this.parseUnary()):this.peek()===`-`?(this.pos++,-this.parseUnary()):this.peek()===`+`?(this.pos++,+this.parseUnary()):this.parseMember()}parseMember(){let e=this.parsePrimary();for(;;){this.skipWhitespace();let t=this.peek()===`?`&&this.peek(1)===`.`;if(this.peek()===`.`&&this.peek(1)!==`.`||t){t&&this.pos++,this.pos++,this.skipWhitespace();let n=this.parseIdentifierName();if(!n)break;if(this.assertSafeProp(n),this.skipWhitespace(),this.peek()===`(`){this.pos++;let t=this.parseArgList();if(this.peek()!==`)`)throw SyntaxError(`Expected ")" after argument list at position ${this.pos}`);if(this.pos++,!this._evaluating){e=void 0;continue}e=e!=null&&typeof e[n]==`function`?e[n](...t):void 0}else{if(!this._evaluating){e=void 0;continue}e=e?.[n]}continue}let n=this.peek()===`?`&&this.peek(1)===`[`;if(this.peek()===`[`||n){n&&this.pos++,this.pos++,this.skipWhitespace();let t=this.parseTernary();if(this.skipWhitespace(),this.peek()!==`]`)throw SyntaxError(`Expected "]" after bracket expression at position ${this.pos}`);if(this.pos++,this.assertSafeProp(t),!this._evaluating){e=void 0;continue}e=e?.[t];continue}if(this.peek()===`(`){this.pos++;let t=this.parseArgList();if(this.peek()!==`)`)throw SyntaxError(`Expected ")" after argument list at position ${this.pos}`);if(this.pos++,!this._evaluating){e=void 0;continue}if(typeof e==`function`)e=e(...t);else throw TypeError(`${String(e)} is not a function`);continue}break}return e}parsePrimary(){this.skipWhitespace();let e=this.peek();if(e===`(`){this.pos++;let e=this.parseTernary();if(this.skipWhitespace(),this.peek()!==`)`)throw SyntaxError(`Expected ")" to close "(" expression at position ${this.pos}`);return this.pos++,e}if(e===`[`)return this.parseArrayLiteral();if(e===`"`||e===`'`)return this.parseString(e);if(/\d/.test(e)||e===`.`&&/\d/.test(this.peek(1)))return this.parseNumber();if(/[a-zA-Z_$]/.test(e))return this.parseIdentifierOrKeyword();throw SyntaxError(`Unexpected character "${e}" at position ${this.pos}`)}parseArrayLiteral(){this.pos++;let e=[];for(this.skipWhitespace();this.peek()!==`]`&&this.pos<this.source.length;)e.push(this.parseTernary()),this.skipWhitespace(),this.peek()===`,`&&(this.pos++,this.skipWhitespace());if(this.peek()!==`]`)throw SyntaxError(`Expected "]" to close array literal at position ${this.pos}`);return this.pos++,e}parseString(e){this.pos++;let t=``;for(;this.pos<this.source.length;){let n=this.source[this.pos];if(n===`\\`){this.pos++;let e=this.source[this.pos++]??``;switch(e){case`n`:t+=`
|
|
2
|
+
`;break;case`t`:t+=` `;break;case`r`:t+=`\r`;break;case`\\`:t+=`\\`;break;case`"`:t+=`"`;break;case`'`:t+=`'`;break;case"`":t+="`";break;default:t+=e}}else if(n===e){this.pos++;break}else t+=n,this.pos++}return t}parseNumber(){let e=this.pos,t=!1;for(;this.pos<this.source.length&&/\d/.test(this.source[this.pos]);)t=!0,this.pos++;if(this.source[this.pos]===`.`)for(this.pos++;this.pos<this.source.length&&/\d/.test(this.source[this.pos]);)t=!0,this.pos++;if(/[eE]/.test(this.source[this.pos]??``)){this.pos++,/[+\-]/.test(this.source[this.pos]??``)&&this.pos++;let t=0;for(;this.pos<this.source.length&&/\d/.test(this.source[this.pos]);)t++,this.pos++;if(t===0)throw SyntaxError(`Invalid numeric literal exponent at position ${e}`)}if(!t)throw SyntaxError(`Invalid numeric literal at position ${e}`);let n=this.source.slice(e,this.pos),r=Number(n);if(!Number.isFinite(r))throw SyntaxError(`Invalid numeric literal "${n}" at position ${e}`);return r}parseIdentifierName(){let e=this.pos;for(;this.pos<this.source.length&&/[\w$]/.test(this.source[this.pos]);)this.pos++;return this.source.slice(e,this.pos)}parseIdentifierOrKeyword(){let e=this.parseIdentifierName();switch(e){case`true`:return!0;case`false`:return!1;case`null`:return null;case`undefined`:return;case`NaN`:return NaN;case`Infinity`:return 1/0}if(e===`new`)return this.parseNewExpression();if(this.skipWhitespace(),this.peek()===`=`&&this.peek(1)===`>`)return this.parseArrowFunction(e);if(this.peek()===`(`){this.pos++;let t=this.parseArgList();if(this.peek()!==`)`)throw SyntaxError(`Expected ")" after argument list at position ${this.pos}`);if(this.pos++,!this._evaluating)return;let n=this.context[e];if(typeof n==`function`)return n(...t);throw TypeError(`"${e}" is not a function`)}if(this._evaluating){if(!(e in this.context))throw ReferenceError(`${e} is not defined`);return this.context[e]}}parseNewExpression(){this.skipWhitespace();let e=this.parseIdentifierName();this.skipWhitespace();let t=[];if(this.peek()===`(`){if(this.pos++,t=this.parseArgList(),this.peek()!==`)`)throw SyntaxError(`Expected ")" after new ${e}() at position ${this.pos}`);this.pos++}if(this._evaluating)switch(e){case`Date`:return new Date(...t);case`RegExp`:return new RegExp(t[0],t[1]);default:throw TypeError(`new ${e}() is not supported in expressions`)}}parseArrowFunction(t){this.pos+=2,this.skipWhitespace();let n=this.pos,r=this.scanExpressionEnd(),i=this.source.slice(n,r).trim();this.pos=r;let a=this.context;return n=>new e().evaluate(i,{...a,[t]:n})}scanExpressionEnd(){let e=this.pos,t=0,n=!1,r=``;for(;e<this.source.length;){let i=this.source[e];if(n){if(i===`\\`){e+=2;continue}i===r&&(n=!1),e++;continue}if(i===`"`||i===`'`){n=!0,r=i,e++;continue}if(i===`(`||i===`[`)t++;else if(i===`)`||i===`]`){if(t===0)break;t--}else if(i===`,`&&t===0)break;e++}return e}parseArgList(){let e=[];for(this.skipWhitespace();this.peek()!==`)`&&this.pos<this.source.length;)e.push(this.parseTernary()),this.skipWhitespace(),this.peek()===`,`&&(this.pos++,this.skipWhitespace());return e}},C=class{cache=new Map;maxSize;constructor(e=1e3){this.maxSize=e}compile(e,t){let n=`${e}::${t.join(`,`)}`;if(this.cache.has(n)){let e=this.cache.get(n);return e.hitCount++,e}this.cache.size>=this.maxSize&&this.evictLFU();let r={fn:this.compileExpression(e,t),varNames:[...t],expression:e,compiledAt:Date.now(),hitCount:1};return this.cache.set(n,r),r}compileExpression(e,t){let n=new S;return(...r)=>{let i={};for(let e=0;e<t.length;e++)i[t[e]]=r[e];return n.evaluate(e,i)}}evictLFU(){let e=null,t=1/0,n=1/0;for(let[r,i]of this.cache.entries())(i.hitCount<n||i.hitCount===n&&i.compiledAt<t)&&(e=r,t=i.compiledAt,n=i.hitCount);e&&this.cache.delete(e)}has(e,t){let n=`${e}::${t.join(`,`)}`;return this.cache.has(n)}clear(){this.cache.clear()}getStats(){let e=0,t=[];for(let n of this.cache.values())e+=n.hitCount,t.push({expression:n.expression,hitCount:n.hitCount});return{size:this.cache.size,maxSize:this.maxSize,totalHits:e,entries:t.sort((e,t)=>t.hitCount-e.hitCount)}}},w=class{functions=new Map;constructor(){this.registerDefaults()}register(e,t){this.functions.set(e.toUpperCase(),t)}get(e){return this.functions.get(e.toUpperCase())}has(e){return this.functions.has(e.toUpperCase())}getNames(){return Array.from(this.functions.keys())}toObject(){let e={};for(let[t,n]of this.functions)e[t]=n;return e}registerDefaults(){this.registerAggregationFunctions(),this.registerDateFunctions(),this.registerLogicFunctions(),this.registerStringFunctions(),this.registerStringSearchFunctions(),this.registerStatisticalFunctions()}registerAggregationFunctions(){this.register(`SUM`,(...e)=>T(e).reduce((e,t)=>e+t,0)),this.register(`AVG`,(...e)=>{let t=T(e);return t.length===0?0:t.reduce((e,t)=>e+t,0)/t.length}),this.register(`COUNT`,(...e)=>E(e).filter(e=>e!=null).length),this.register(`MIN`,(...e)=>{let t=T(e);return t.length===0?0:Math.min(...t)}),this.register(`MAX`,(...e)=>{let t=T(e);return t.length===0?0:Math.max(...t)})}registerDateFunctions(){this.register(`TODAY`,()=>new Date().toISOString().split(`T`)[0]),this.register(`NOW`,()=>new Date().toISOString()),this.register(`DATEADD`,(e,t,n)=>{let r=new Date(e);if(isNaN(r.getTime()))throw Error(`DATEADD: Invalid date "${e}"`);switch(String(n).toLowerCase()){case`day`:case`days`:r.setDate(r.getDate()+t);break;case`month`:case`months`:r.setMonth(r.getMonth()+t);break;case`year`:case`years`:r.setFullYear(r.getFullYear()+t);break;case`hour`:case`hours`:r.setHours(r.getHours()+t);break;case`minute`:case`minutes`:r.setMinutes(r.getMinutes()+t);break;default:throw Error(`DATEADD: Unsupported unit "${n}"`)}return r.toISOString()}),this.register(`DATEDIFF`,(e,t,n)=>{let r=new Date(e),i=new Date(t);if(isNaN(r.getTime()))throw Error(`DATEDIFF: Invalid date "${e}"`);if(isNaN(i.getTime()))throw Error(`DATEDIFF: Invalid date "${t}"`);let a=i.getTime()-r.getTime();switch(String(n).toLowerCase()){case`day`:case`days`:return Math.floor(a/(1e3*60*60*24));case`month`:case`months`:return(i.getFullYear()-r.getFullYear())*12+(i.getMonth()-r.getMonth());case`year`:case`years`:return i.getFullYear()-r.getFullYear();case`hour`:case`hours`:return Math.floor(a/(1e3*60*60));case`minute`:case`minutes`:return Math.floor(a/(1e3*60));default:throw Error(`DATEDIFF: Unsupported unit "${n}"`)}}),this.register(`DATEFORMAT`,(e,t)=>{let n=new Date(e);if(isNaN(n.getTime()))throw Error(`DATEFORMAT: Invalid date "${e}"`);let r=(e,t=2)=>String(e).padStart(t,`0`);return t.replace(`YYYY`,String(n.getFullYear())).replace(`YY`,String(n.getFullYear()).slice(-2)).replace(`MM`,r(n.getMonth()+1)).replace(`DD`,r(n.getDate())).replace(`HH`,r(n.getHours())).replace(`mm`,r(n.getMinutes())).replace(`ss`,r(n.getSeconds()))})}registerLogicFunctions(){this.register(`IF`,(e,t,n)=>e?t:n),this.register(`AND`,(...e)=>e.every(Boolean)),this.register(`OR`,(...e)=>e.some(Boolean)),this.register(`NOT`,e=>!e),this.register(`SWITCH`,(e,...t)=>{for(let n=0;n<t.length-1;n+=2)if(e===t[n])return t[n+1];if(t.length%2==1)return t[t.length-1]})}registerStringFunctions(){this.register(`CONCAT`,(...e)=>e.map(e=>String(e??``)).join(``)),this.register(`LEFT`,(e,t)=>String(e??``).substring(0,t)),this.register(`RIGHT`,(e,t)=>{let n=String(e??``);return n.substring(Math.max(0,n.length-t))}),this.register(`TRIM`,e=>String(e??``).trim()),this.register(`UPPER`,e=>String(e??``).toUpperCase()),this.register(`LOWER`,e=>String(e??``).toLowerCase())}registerStringSearchFunctions(){this.register(`FIND`,(e,t,n)=>String(t??``).indexOf(String(e??``),n??0)),this.register(`REPLACE`,(e,t,n)=>String(e??``).split(String(t??``)).join(String(n??``))),this.register(`SUBSTRING`,(e,t,n)=>{let r=String(e??``);return n===void 0?r.substring(t):r.substring(t,t+n)}),this.register(`REGEX`,(e,t,n)=>{let r=String(e??``);return new RegExp(t,n).test(r)}),this.register(`LEN`,e=>String(e??``).length)}registerStatisticalFunctions(){this.register(`MEDIAN`,(...e)=>{let t=T(e).sort((e,t)=>e-t);if(t.length===0)return 0;let n=Math.floor(t.length/2);return t.length%2==0?(t[n-1]+t[n])/2:t[n]}),this.register(`STDEV`,(...e)=>{let t=T(e);if(t.length<2)return 0;let n=t.reduce((e,t)=>e+t,0)/t.length,r=t.map(e=>(e-n)**2).reduce((e,t)=>e+t,0)/(t.length-1);return Math.sqrt(r)}),this.register(`VARIANCE`,(...e)=>{let t=T(e);if(t.length<2)return 0;let n=t.reduce((e,t)=>e+t,0)/t.length;return t.map(e=>(e-n)**2).reduce((e,t)=>e+t,0)/(t.length-1)}),this.register(`PERCENTILE`,(e,...t)=>{let n=T(t).sort((e,t)=>e-t);if(n.length===0)return 0;let r=Math.max(0,Math.min(100,e))/100*(n.length-1),i=Math.floor(r),a=Math.ceil(r);if(i===a)return n[i];let o=r-i;return n[i]+o*(n[a]-n[i])})}};function T(e){let t=[];for(let n of e)if(Array.isArray(n))t.push(...T(n));else{let e=Number(n);isNaN(e)||t.push(e)}return t}function E(e){let t=[];for(let n of e)Array.isArray(n)?t.push(...E(n)):t.push(n);return t}var D=class e{context;cache;formulas;constructor(e,t,n){e instanceof b?this.context=e:this.context=new b(e||{}),this.cache=t||new C,this.formulas=n||new w}evaluate(e,t={}){if(e&&typeof e==`object`&&typeof e.source==`string`&&(e=e.source),typeof e!=`string`)return e;let{defaultValue:n,throwOnError:r=!1,sanitize:i=!0}=t;try{if(!e.includes("${"))return e;let t=e.match(/^\$\{([^}]+)\}$/);return t?this.evaluateExpression(t[1].trim(),{sanitize:i}):e.replace(/\$\{([^}]+)\}/g,(e,t)=>{try{let e=this.evaluateExpression(t.trim(),{sanitize:i});return String(e??``)}catch(n){if(r)throw n;return console.warn(`Expression evaluation failed for: ${t}`,n),e}})}catch(t){if(r)throw t;return console.warn(`Failed to evaluate expression: ${e}`,t),n??e}}evaluateExpression(e,t={}){let{sanitize:n=!0}=t;if(!(!e||e.trim()===``)){if(n&&this.isDangerous(e))throw Error(`Potentially dangerous expression detected: ${e}`);try{let t=this.context.toObject(),n={...this.formulas.toObject(),...t},r=Object.keys(n),i=Object.values(n);return this.cache.compile(e,r).fn(...i)}catch(t){throw Error(`Failed to evaluate expression "${e}": ${t.message}`)}}}isDangerous(e){return[/eval\s*\(/i,/Function\s*\(/i,/setTimeout\s*\(/i,/setInterval\s*\(/i,/import\s*\(/i,/require\s*\(/i,/process\./i,/global\./i,/window\./i,/document\./i,/__proto__/i,/constructor\s*\(/i,/prototype\./i].some(t=>t.test(e))}evaluateCondition(e,t={}){if(typeof e==`boolean`)return e;if(e&&typeof e==`object`&&typeof e.source==`string`&&(e=e.source),!e)return!0;if(typeof e!=`string`)return!!e;let n=e.trim();if(!n)return!0;if(n.includes("${"))return!!this.evaluate(n,t);try{return!!this.evaluateExpression(n,{sanitize:t.sanitize!==!1})}catch{return!0}}updateContext(e){Object.entries(e).forEach(([e,t])=>{this.context.set(e,t)})}getContext(){return this.context}withContext(t){return new e(this.context.createChild(t),this.cache,this.formulas)}getCacheStats(){return this.cache.getStats()}clearCache(){this.cache.clear()}getFormulas(){return this.formulas}registerFunction(e,t){this.formulas.register(e,t)}},O=new C,te=new w;function ne(e,t){let n=new D({...t,data:t},O,te);try{return(/\$\{/.test(e)?n.evaluate(e,{throwOnError:!0}):n.evaluateExpression(e))===!0}catch{return!1}}function k(e){return typeof e==`string`?{dialect:`cel`,source:e}:{dialect:e.dialect??`cel`,source:e.source}}function re(e,t,n,i,a){if(e==null||typeof e==`string`&&!e.trim())return n;try{let o=r.evaluate(k(e),{record:t,previous:i,...a?{extra:a}:{}});return o.ok?o.value===!0:n}catch{return n}}function A(e,t,n,r,i){let a=e.visibleWhen==null?!0:re(e.visibleWhen,t,!0,r,i),o=n.readonly===!0||(e.readonlyWhen==null?!1:re(e.readonlyWhen,t,!1,r,i)),s=e.requiredWhen??e.conditionalRequired;return{visible:a,readonly:o,required:n.required===!0||(s==null?!1:re(s,t,!1,r,i))}}function ie(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&typeof t.type==`string`&&typeof t.objectName==`string`&&typeof t.recordId==`string`&&typeof t.timestamp==`number`}var j=new class e{undoStack=[];redoStack=[];maxHistory;listeners=new Set;constructor(e){this.maxHistory=e?.maxHistory??50}push(e){this.undoStack.push(e),this.undoStack.length>this.maxHistory&&this.undoStack.shift(),this.redoStack=[],this.notify()}peekUndo(){return this.undoStack[this.undoStack.length-1]}peekRedo(){return this.redoStack[this.redoStack.length-1]}popUndo(){let e=this.undoStack.pop();return e&&(this.redoStack.push(e),this.notify()),e}popRedo(){let e=this.redoStack.pop();return e&&(this.undoStack.push(e),this.notify()),e}clear(){this.undoStack=[],this.redoStack=[],this.notify()}get canUndo(){return this.undoStack.length>0}get canRedo(){return this.redoStack.length>0}get undoCount(){return this.undoStack.length}get redoCount(){return this.redoStack.length}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}getHistory(){return[...this.undoStack]}getRedoHistory(){return[...this.redoStack]}pushBatch(e){e.length!==0&&(this.undoStack.push(...e),this.undoStack.length>this.maxHistory&&this.undoStack.splice(0,this.undoStack.length-this.maxHistory),this.redoStack=[],this.notify())}popUndoBatch(e){let t=Math.min(e,this.undoStack.length);if(t===0)return[];let n=this.undoStack.splice(this.undoStack.length-t,t);return this.redoStack.push(...n),this.notify(),n}popRedoBatch(e){let t=Math.min(e,this.redoStack.length);if(t===0)return[];let n=this.redoStack.splice(this.redoStack.length-t,t);return this.undoStack.push(...n),this.notify(),n}static STORAGE_KEY=`objectui:undo-history`;saveToStorage(){try{let t=JSON.stringify({undoStack:this.undoStack,redoStack:this.redoStack});localStorage.setItem(e.STORAGE_KEY,t)}catch{}}loadFromStorage(){try{if(typeof localStorage>`u`)return;let t=localStorage.getItem(e.STORAGE_KEY);if(!t)return;let n=JSON.parse(t);Array.isArray(n.undoStack)&&(this.undoStack=n.undoStack.filter(ie)),Array.isArray(n.redoStack)&&(this.redoStack=n.redoStack.filter(ie)),this.undoStack.length>this.maxHistory&&this.undoStack.splice(0,this.undoStack.length-this.maxHistory),this.notify()}catch{}}notify(){this.listeners.forEach(e=>e())}},M=class{handlers=new Map;scripts=new Map;evaluator;context;confirmHandler;toastHandler;modalHandler;navigationHandler;paramCollectionHandler;resultDialogHandler;constructor(e={}){this.context=e,this.evaluator=new D(e),this.confirmHandler=async e=>window.confirm(e),this.toastHandler=null,this.modalHandler=null,this.navigationHandler=null,this.paramCollectionHandler=null,this.resultDialogHandler=null}setConfirmHandler(e){this.confirmHandler=e}setToastHandler(e){this.toastHandler=e}setModalHandler(e){this.modalHandler=e}setNavigationHandler(e){this.navigationHandler=e}setParamCollectionHandler(e){this.paramCollectionHandler=e}setResultDialogHandler(e){this.resultDialogHandler=e}registerHandler(e,t){this.handlers.set(e,t)}unregisterHandler(e){this.handlers.delete(e)}registerScript(e,t){this.scripts.set(e,t)}unregisterScript(e){this.scripts.delete(e)}async execute(e){try{let t=e.type||e.actionType||e.name||``;if(e.condition&&!this.evaluator.evaluateCondition(e.condition))return{success:!1,error:`Action condition not met`};if(e.disabled!=null&&e.disabled!==!1){let t=!1;try{t=this.evaluator.evaluateCondition(e.disabled)}catch{t=!1}if(t)return{success:!1,error:`Action is disabled`}}let n=e.confirm?.message||e.confirmText;if(n&&!await this.confirmHandler(this.evaluator.evaluate(n),e.confirm?{title:e.confirm.title,confirmText:e.confirm.confirmText,cancelText:e.confirm.cancelText}:void 0))return{success:!1,error:`Action cancelled by user`};let r=e.actionParams&&Array.isArray(e.actionParams)?e.actionParams:Array.isArray(e.params)?e.params:void 0;if(r&&r.length>0&&this.paramCollectionHandler){let t=await this.paramCollectionHandler(r,e);if(t===null)return{success:!1,error:`Action cancelled by user (params)`};let n=Array.isArray(e.params)?{}:e.params||{},i=n._rowRecord;e.params={...n,...t},i!==void 0&&(e.params._rowRecord=i)}if(t&&this.handlers.has(t)){let n=await this.handlers.get(t)(e,this.context);return await this.handlePostExecution(e,n),n}let i;switch(t){case`script`:i=await this.executeScript(e);break;case`url`:i=await this.executeUrl(e);break;case`modal`:i=await this.executeModal(e);break;case`flow`:i=await this.executeFlow(e);break;case`api`:i=await this.executeAPI(e);break;case`form`:i=await this.executeForm(e);break;case`navigation`:i=await this.executeNavigation(e);break;default:e.navigate?i=await this.executeNavigation(e):e.api||e.endpoint?i=await this.executeAPI(e):e.onClick?(await e.onClick(),i={success:!0}):i=await this.executeActionSchema(e)}return await this.handlePostExecution(e,i),i}catch(t){let n={success:!1,error:t.message};return await this.handlePostExecution(e,n),n}}async executeChain(e,t=`sequential`){if(e.length===0)return{success:!0};if(t===`parallel`){let t=await Promise.allSettled(e.map(e=>this.execute(e)));if(t.filter(e=>e.status===`rejected`||e.status===`fulfilled`&&!e.value.success).length>0)return{success:!1,error:t.find(e=>e.status===`fulfilled`&&!e.value.success)?.value?.error||`One or more parallel actions failed`};let n=t[t.length-1];return n.status===`fulfilled`?n.value:{success:!1,error:`Action failed`}}let n={success:!0};for(let t of e)if(n=await this.execute(t),!n.success)return n;return n}async handlePostExecution(e,t){let n=!!(e.resultDialog&&t.success);if(this.toastHandler){let r=e.toast??{showOnSuccess:!0,showOnError:!0},i=e.toast?.duration;if(t.success&&!n&&!t.silent&&r.showOnSuccess!==!1){let n=(t.data&&typeof t.data==`object`&&typeof t.data.message==`string`?String(t.data.message).trim():``)||e.successMessage||`Action completed successfully`;if(t.undo)try{j.push(t.undo)}catch{}this.toastHandler(n,{type:`success`,duration:i,undo:t.undo?{}:void 0})}if(!t.success&&r.showOnError!==!1&&t.error){let n=e.errorMessage||t.error;this.toastHandler(n,{type:`error`,duration:i})}}if(n)if(this.resultDialogHandler)try{await this.resultDialogHandler(e.resultDialog,t.data,e)}catch(e){console.warn(`[ActionRunner] resultDialog handler rejected; treating as acknowledged`,e)}else console.warn(`[ActionRunner] action.resultDialog set but no resultDialogHandler registered — the response value will not be shown to the user.`,{action:e.name,data:t.data});if(e.refreshAfter&&t.success&&(t.reload=!0),e.chain&&e.chain.length>0&&t.success){let n=await this.executeChain(e.chain,e.chainMode||`sequential`);n.success||(t.success=!1,t.error=n.error),n.data&&(t.data=n.data),n.redirect&&(t.redirect=n.redirect),n.reload&&(t.reload=!0)}if(t.success&&e.onSuccess){let t=Array.isArray(e.onSuccess)?e.onSuccess:[e.onSuccess];await this.executeChain(t,`sequential`)}if(!t.success&&e.onFailure){let t=Array.isArray(e.onFailure)?e.onFailure:[e.onFailure];await this.executeChain(t,`sequential`)}}async executeScript(e){let t=e.execute||e.target;if(!t)return{success:!1,error:`No script provided for script action`};let n=this.scripts.get(t);if(n)try{return await n(e,this.context)}catch(e){return{success:!1,error:`Script execution failed: ${e.message}`}}try{return{success:!0,data:this.evaluator.evaluate(`\${${t}}`)}}catch(e){return{success:!1,error:`Script execution failed: ${e.message}`}}}async executeUrl(e){let t=e.target||e.redirect;if(!t)return{success:!1,error:`No URL provided for url action`};let n=this.interpolateTarget(t,e),r=this.evaluator.evaluate(n);if(!this.isValidUrl(r))return{success:!1,error:`Invalid URL scheme. Only http://, https://, and relative URLs are allowed.`};let i=typeof this.context.apiBase==`string`?this.context.apiBase.replace(/\/+$/,``):``;i&&/^\/(api|_auth|_account)\//.test(r)&&(r=`${i}${r}`);let a=r.startsWith(`http://`)||r.startsWith(`https://`);if(/\/(api|_auth|_account)\//.test(r)&&(a||r.startsWith(`/`)))return window.location.href=r,{success:!0};let o=e.params?.newTab??a;if(this.navigationHandler)return this.navigationHandler(r,{external:a,newTab:o}),{success:!0};if(o)window.open(r,`_blank`,`noopener,noreferrer`);else return{success:!0,redirect:r};return{success:!0}}async executeModal(e){let t=e.modal||e.target||e.params?.schema;return t?this.modalHandler?await this.modalHandler(t,this.context):{success:!0,modal:t}:{success:!1,error:`No modal schema or target provided for modal action`}}async executeFlow(e){let t=e.target||e.name;return t?this.handlers.has(`flow`)?await this.handlers.get(`flow`)(e,this.context):{success:!1,error:`Flow handler not registered. Cannot execute flow: ${t}`}:{success:!1,error:`No flow target provided for flow action`}}async executeActionSchema(e){let t={success:!0};if(e.api||e.endpoint){let n=await this.executeAPI(e);if(!n.success)return n;t.data=n.data}return e.onClick&&await e.onClick(),t.reload=e.reload!==!1,t.close=e.close!==!1,e.redirect&&(t.redirect=this.evaluator.evaluate(e.redirect)),t}async executeForm(e){let t=this.evaluator.evaluate(e.target);if(!t||typeof t!=`string`)return{success:!1,error:`No form target (FormView name) provided for form action`};let n=(this.context.record&&this.context.record.id)??(this.context.data&&this.context.data.id),r=`/forms/${t}`,i=n==null?r:`${r}?recordId=${encodeURIComponent(String(n))}`;return this.navigationHandler?(this.navigationHandler(i,{external:!1}),{success:!0}):{success:!0,redirect:i}}async executeNavigation(e){let t=e.navigate||e,n=this.evaluator.evaluate(t.to||t.target);if(!this.isValidUrl(n))return{success:!1,error:`Invalid URL scheme. Only http://, https://, and relative URLs are allowed.`};let r=t.external||typeof n==`string`&&(n.startsWith(`http://`)||n.startsWith(`https://`));if(this.navigationHandler)return this.navigationHandler(n,{external:r,newTab:t.newTab??r,replace:t.replace}),{success:!0};if(r)window.open(n,`_blank`,`noopener,noreferrer`);else return{success:!0,redirect:n};return{success:!0}}async executeAPI(e){let t=e.api||e.endpoint||e.target;if(!t)return{success:!1,error:`No API endpoint provided`};try{let n,r,i={"Content-Type":`application/json`},a,o=`json`;if(typeof t==`string`)n=this.interpolateTarget(t,e),r=e.method||`POST`,a=JSON.stringify(e.params||this.context.data||{});else{let s=t;if(n=this.interpolateTarget(s.url,e),r=s.method||e.method||`POST`,i={...i,...s.headers},o=s.responseType||`json`,s.queryParams){let e=new URLSearchParams(s.queryParams);n=`${n}${n.includes(`?`)?`&`:`?`}${e.toString()}`}s.body?a=typeof s.body==`string`?s.body:JSON.stringify(s.body):r!==`GET`&&r!==`HEAD`&&(a=JSON.stringify(e.params||this.context.data||{}))}let s={method:r,headers:i};a&&r!==`GET`&&r!==`HEAD`&&(s.body=a);let c=await fetch(n,s);if(!c.ok)throw Error(`HTTP ${c.status}: ${c.statusText}`);let l;switch(o){case`text`:l=await c.text();break;case`blob`:l=await c.blob();break;default:l=await c.json()}return{success:!0,data:l}}catch(e){return{success:!1,error:e.message}}}isValidUrl(e){return typeof e==`string`&&(e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`/`)||e.startsWith(`./`))}interpolateTarget(e,t){if(typeof e!=`string`||e.indexOf("${")===-1)return e;let n=t.params&&typeof t.params==`object`&&!Array.isArray(t.params)?t.params:{},r=this.buildInterpolationContext();return e.replace(/\$\{(param|ctx)\.([\w.]+)\}/g,(e,t,i)=>{let a=ae(t===`param`?n:r,i);return a==null?``:encodeURIComponent(String(a))})}buildInterpolationContext(){let e={origin:typeof window<`u`?window.location.origin:``,apiBase:typeof this.context.apiBase==`string`?this.context.apiBase.replace(/\/+$/,``):``,user:this.context.user??{},org:this.context.org??this.context.organization??{},recordId:this.context.record?.id??this.context.recordId};return this.context.ctx&&typeof this.context.ctx==`object`&&Object.assign(e,this.context.ctx),e}updateContext(e){this.context={...this.context,...e},this.evaluator.updateContext(e)}getContext(){return this.context}getEvaluator(){return this.evaluator}};function ae(e,t){if(e!=null)return t.split(`.`).reduce((e,t)=>{if(e!=null)return e[t]},e)}function oe(e){return/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(e)}function se(e){return{type:`app`,name:e.name,title:e.title,label:e.title,description:e.description,icon:e.icon,logo:e.branding.logo,favicon:e.branding.favicon,branding:e.branding,layout:e.layout,navigation:e.navigation}}function ce(e,t){if(typeof e==`string`)return e;if(e&&typeof e==`object`){let t=e.default;if(typeof t==`string`)return t}return t}function le(e){let t=e.type??`tabular`,n=t===`joined`||t===`tabular`?`tabular`:t,r=(e.values??[]).map(e=>({name:e,label:ce(void 0,e)})),i=(e.rows??[]).map(e=>({field:e,sort:`asc`}));return{type:`report`,title:ce(e.label,e.name),description:e.description?ce(e.description,``):void 0,reportType:n,fields:r,groupBy:i.length>0?i:void 0}}function ue(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.name!=`string`||t.type===`report`&&Array.isArray(t.fields)?!1:typeof t.dataset==`string`||Array.isArray(t.blocks)||typeof t.type==`string`&&[`tabular`,`summary`,`matrix`,`joined`].includes(t.type)}var de=[`list_toolbar`,`list_item`,`record_header`,`record_more`,`record_related`,`record_section`,`global_nav`];i(de);function fe(e){return e.toLowerCase().split(`+`).map(e=>e.trim()).sort().join(`+`)}var pe=new Set;function me(e,t,n){let r=typeof t==`string`?t:t&&typeof t==`object`&&typeof t.source==`string`?t.source:String(t),i=`${String(e)}::${r}`;if(pe.has(i))return;pe.add(i);let a=n instanceof Error?n.message:String(n);console.warn(`[ActionEngine] action "${String(e)}" hidden: its \`visible\` predicate threw — ${a}. Predicate: ${r}. Action predicates evaluate against { record, recordId, objectName, user, … }; use \`record.<field>\` (not a bare field).`)}var he=class{actions=new Map;mappings=[];shortcuts=[];normalizedShortcutMap=new Map;runner;constructor(e={}){this.runner=e instanceof M?e:new M(e)}getRunner(){return this.runner}registerAction(e,t){let n=e.name||e.type||``;if(!n)throw Error(`Action must have a name or type`);this.actions.set(n,{action:e,locations:t?.locations||[],shortcut:t?.shortcut,bulkEnabled:t?.bulkEnabled??!1,priority:t?.priority??100}),t?.shortcut&&(this.shortcuts.push({keys:t.shortcut,actionName:n}),this.normalizedShortcutMap.set(fe(t.shortcut),n))}registerActions(e){for(let t of e)this.registerAction(t,{locations:t.locations,shortcut:t.shortcut,bulkEnabled:t.bulkEnabled})}unregisterAction(e){let t=this.actions.get(e);t?.shortcut&&this.normalizedShortcutMap.delete(fe(t.shortcut)),this.actions.delete(e),this.shortcuts=this.shortcuts.filter(t=>t.actionName!==e),this.mappings=this.mappings.filter(t=>t.actionName!==e)}addMapping(e){this.mappings.push(e)}getActionsForLocation(e){let t=this.runner.getEvaluator();return Array.from(this.actions.values()).filter(t=>t.locations.includes(e)).filter(e=>{let n=e.action.visible;if(n==null||n===``||n===!0)return!0;if(n===!1)return!1;let r;if(typeof n==`string`)r=`\${${n}}`;else if(typeof n==`object`&&typeof n.source==`string`){let e=n.source;if(!e)return!0;r=`\${${e}}`}else r=!!n;try{return t.evaluateCondition(r,{throwOnError:!0})}catch(t){return me(e.action.name,n,t),!1}}).sort((e,t)=>(e.priority??100)-(t.priority??100)).map(e=>e.action)}getBulkActions(){return Array.from(this.actions.values()).filter(e=>e.bulkEnabled).sort((e,t)=>(e.priority??100)-(t.priority??100)).map(e=>e.action)}getShortcuts(){return[...this.shortcuts]}getAction(e){return this.actions.get(e)?.action}async executeAction(e,t){let n=this.actions.get(e);return n?(t&&this.runner.updateContext(t),this.runner.execute(n.action)):{success:!1,error:`Action not found: ${e}`}}async dispatch(e,t){let n=this.mappings.filter(t=>t.event===e);if(n.length===0)return[];let r=[];for(let e of n){if(e.condition&&!this.runner.getEvaluator().evaluateCondition(e.condition))continue;let n=await this.executeAction(e.actionName,t);r.push(n)}return r}async handleShortcut(e,t){let n=this.normalizedShortcutMap.get(fe(e));return n?this.executeAction(n,t):null}async executeBulk(e,t,n){let r=this.actions.get(e);if(!r)return{total:0,succeeded:0,failed:0,results:[{success:!1,error:`Action not found: ${e}`}]};if(!r.bulkEnabled)return{total:0,succeeded:0,failed:0,results:[{success:!1,error:`Action ${e} does not support bulk operations`}]};let i=[],a=0,o=0;if(n?.parallel){let e=t.map(e=>(this.runner.updateContext({record:e,selectedRecords:t}),this.runner.execute(r.action))),n=await Promise.allSettled(e);for(let e of n)e.status===`fulfilled`?(i.push(e.value),e.value.success?a++:o++):(i.push({success:!1,error:e.reason?.message||`Unknown error`}),o++)}else for(let e of t){this.runner.updateContext({record:e,selectedRecords:t});let s=await this.runner.execute(r.action);if(i.push(s),s.success)a++;else if(o++,!n?.continueOnError)break}return{total:t.length,succeeded:a,failed:o,results:i}}updateContext(e){this.runner.updateContext(e)}clear(){this.actions.clear(),this.mappings=[],this.shortcuts=[],this.normalizedShortcutMap.clear()}};async function ge(e,t){let{ids:n,allowBulk:r,offset:i,label:a=`bulk`}=e,o={succeeded:0,failed:0,errors:[]};if(r&&typeof t.bulkCall==`function`)try{let e=await t.bulkCall(n),r=Math.max(0,Math.min(e,n.length));o.succeeded+=r;let s=n.length-r;return s>0&&(o.failed+=s,o.errors.push({id:`batch_${i}`,error:`${s} record${s===1?``:`s`} failed in ${a}`})),o}catch{}return(await Promise.allSettled(n.map(e=>t.perRow(e)))).forEach((e,t)=>{e.status===`fulfilled`?o.succeeded+=1:(o.failed+=1,o.errors.push({id:n[t],error:e.reason instanceof Error?e.reason.message:String(e.reason)}))}),o}function N(e,t){return t?e[t]:e.id??e._id}function _e(e,t){if(!t||t.length===0)return!0;let n=t[0];if(n===`and`)return t.slice(1).every(t=>_e(e,t));if(n===`or`)return t.slice(1).some(t=>_e(e,t));if(t.length===3&&typeof n==`string`){let[n,r,i]=t,a=e[n];switch(r){case`=`:return a===i;case`!=`:return a!==i;case`>`:return a>i;case`>=`:return a>=i;case`<`:return a<i;case`<=`:return a<=i;case`in`:return Array.isArray(i)&&i.includes(a);case`not in`:case`not_in`:case`nin`:case`notin`:return Array.isArray(i)&&!i.includes(a);case`contains`:{let e=typeof a==`string`?a.toLowerCase():``;return typeof a==`string`&&e.includes(String(i).toLowerCase())}case`notcontains`:{let e=typeof a==`string`?a.toLowerCase():``;return typeof a==`string`&&!e.includes(String(i).toLowerCase())}case`startswith`:{let e=typeof a==`string`?a.toLowerCase():``;return typeof a==`string`&&e.startsWith(String(i).toLowerCase())}case`between`:return Array.isArray(i)&&i.length===2&&a>=i[0]&&a<=i[1];default:return!0}}return!0}function ve(e,t){for(let[n,r]of Object.entries(t)){let t=e[n];if(r&&typeof r==`object`&&!Array.isArray(r))for(let[e,n]of Object.entries(r))switch(e){case`$gt`:if(!(t>n))return!1;break;case`$gte`:if(!(t>=n))return!1;break;case`$lt`:if(!(t<n))return!1;break;case`$lte`:if(!(t<=n))return!1;break;case`$ne`:if(t===n)return!1;break;case`$in`:if(!Array.isArray(n)||!n.includes(t))return!1;break;case`$contains`:if(typeof t!=`string`||!t.toLowerCase().includes(String(n).toLowerCase()))return!1;break;default:break}else if(t!==r)return!1}return!0}function ye(e,t){if(!t)return e;let n=[];return Array.isArray(t)?n=t.map(e=>typeof e==`string`?e.startsWith(`-`)?{field:e.slice(1),order:`desc`}:{field:e,order:`asc`}:{field:e.field,order:e.order??`asc`}):typeof t==`object`&&(n=Object.entries(t).map(([e,t])=>({field:e,order:t}))),n.length===0?e:[...e].sort((e,t)=>{for(let{field:r,order:i}of n){let n=e[r],a=t[r];if(n===a)continue;if(n==null)return i===`asc`?-1:1;if(a==null)return i===`asc`?1:-1;let o=n<a?-1:1;return i===`asc`?o:-o}return 0})}function be(e,t){if(!t||t.length===0)return e;let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}var xe=class{items;idField;mutationListeners=new Set;constructor(e){this.items=JSON.parse(JSON.stringify(e.items)),this.idField=e.idField}emitMutation(e){for(let t of this.mutationListeners)try{t(e)}catch(e){console.warn(`ValueDataSource: mutation listener error`,e)}}async find(e,t){let n=[...this.items];if(t?.$filter&&(Array.isArray(t.$filter)&&t.$filter.length>0?n=n.filter(e=>_e(e,t.$filter)):!Array.isArray(t.$filter)&&Object.keys(t.$filter).length>0&&(n=n.filter(e=>ve(e,t.$filter)))),t?.$search){let e=t.$search.toLowerCase();n=n.filter(t=>Object.values(t).some(t=>typeof t==`string`&&t.toLowerCase().includes(e)))}let r=n.length;n=ye(n,t?.$orderby);let i=t?.$skip??0,a=t?.$top;return i>0&&(n=n.slice(i)),a!==void 0&&(n=n.slice(0,a)),t?.$select?.length&&(n=n.map(e=>be(e,t.$select))),{data:n,total:r,hasMore:i+(a??n.length)<r}}async findOne(e,t,n){let r=this.items.find(e=>String(N(e,this.idField))===String(t));return r?n?.$select?.length?be(r,n.$select):{...r}:null}async create(e,t){let n={...t};if(!N(n,this.idField)){let e=this.idField??`id`;n[e]=`auto_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}return this.items.push(n),this.emitMutation({type:`create`,resource:e,record:{...n}}),{...n}}async update(e,t,n){let r=this.items.findIndex(e=>String(N(e,this.idField))===String(t));if(r===-1)throw Error(`ValueDataSource: Record with id "${t}" not found`);return this.items[r]={...this.items[r],...n},this.emitMutation({type:`update`,resource:e,id:t,record:{...this.items[r]}}),{...this.items[r]}}async delete(e,t){let n=this.items.findIndex(e=>String(N(e,this.idField))===String(t));return n===-1?!1:(this.items.splice(n,1),this.emitMutation({type:`delete`,resource:e,id:t}),!0)}async bulk(e,t,n){let r=[];for(let i of n)switch(t){case`create`:r.push(await this.create(e,i));break;case`update`:{let t=N(i,this.idField);t!==void 0&&r.push(await this.update(e,t,i));break}case`delete`:{let t=N(i,this.idField);t!==void 0&&await this.delete(e,t);break}}return r}async getObjectSchema(e){if(this.items.length===0)return{name:e,fields:{}};let t=this.items[0],n={};for(let[e,r]of Object.entries(t))n[e]={type:typeof r};return{name:e,fields:n}}async getView(e,t){return null}async getApp(e){return null}async aggregate(e,t){let{field:n,function:r,groupBy:i}=t,a={};for(let e of this.items){let t=String(e[i]??`Unknown`);a[t]||(a[t]=[]),a[t].push(e)}return Object.entries(a).map(([e,t])=>{let a=t.map(e=>Number(e[n])||0),o;switch(r){case`count`:o=t.length;break;case`avg`:o=a.length>0?a.reduce((e,t)=>e+t,0)/a.length:0;break;case`min`:o=a.length>0?Math.min(...a):0;break;case`max`:o=a.length>0?Math.max(...a):0;break;default:o=a.reduce((e,t)=>e+t,0);break}return{[i]:e,[n]:o}})}onMutation(e){return this.mutationListeners.add(e),()=>{this.mutationListeners.delete(e)}}get count(){return this.items.length}getAll(){return JSON.parse(JSON.stringify(this.items))}},P=`https://objectui.dev/docs/errors`,Se={"OBJUI-001":{code:`OBJUI-001`,message:'Unknown component type: "${type}"',suggestion:`Ensure the component is registered via registry.register() before rendering. Check for typos in the component type name.`,docUrl:`${P}/OBJUI-001`},"OBJUI-002":{code:`OBJUI-002`,message:"Schema validation failed: ${reason}",suggestion:`Verify the schema against the ObjectUI JSON spec. Run the built-in schema validator for details.`,docUrl:`${P}/OBJUI-002`},"OBJUI-003":{code:`OBJUI-003`,message:"Expression evaluation failed: ${expression}",suggestion:`Check the expression syntax and ensure all referenced variables exist in the current data scope.`,docUrl:`${P}/OBJUI-003`},"OBJUI-004":{code:`OBJUI-004`,message:'Plugin dependency missing: "${dependency}"',suggestion:`Install the required dependency and register it before loading this plugin.`,docUrl:`${P}/OBJUI-004`},"OBJUI-005":{code:`OBJUI-005`,message:'Plugin already loaded: "${plugin}"',suggestion:`A plugin with the same name is already registered. Remove the duplicate or use a unique plugin name.`,docUrl:`${P}/OBJUI-005`},"OBJUI-006":{code:`OBJUI-006`,message:'Plugin not found: "${plugin}"',suggestion:`Verify the plugin name and ensure it has been registered before access.`,docUrl:`${P}/OBJUI-006`},"OBJUI-007":{code:`OBJUI-007`,message:'Registry namespace deprecated: "${namespace}"',suggestion:`Migrate to the new namespace format. See the migration guide for details.`,docUrl:`${P}/OBJUI-007`},"OBJUI-008":{code:`OBJUI-008`,message:'Read-only scope violation: "${scope}"',suggestion:`You are trying to mutate a read-only data scope. Use a writable scope or clone the data before modifying.`,docUrl:`${P}/OBJUI-008`},"OBJUI-009":{code:`OBJUI-009`,message:'Invalid field configuration: "${field}"',suggestion:`Check the field schema for required properties (type, name). Ensure the field widget is registered.`,docUrl:`${P}/OBJUI-009`},"OBJUI-010":{code:`OBJUI-010`,message:'Action execution failed: "${action}"',suggestion:`Verify the action handler is registered and that all required parameters are provided.`,docUrl:`${P}/OBJUI-010`}},Ce=class extends Error{code;details;constructor(e,t,n){super(e),this.code=t,this.details=n,this.name=`ObjectUIError`,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,message:this.message,code:this.code,details:this.details,stack:this.stack}}};function we(e){return e instanceof Ce}var F=`__debug`;function Te(e){let t=e;if(t===void 0)try{t=typeof window<`u`?window.location.search:``}catch{t=``}let n=new URLSearchParams(t),r=n.has(F),i=n.has(`${F}_schema`),a=n.has(`${F}_perf`),o=n.has(`${F}_data`),s=n.has(`${F}_expr`),c=n.has(`${F}_events`),l=n.has(`${F}_registry`);return{enabled:r||i||a||o||s||c||l,...i&&{schema:i},...a&&{perf:a},...o&&{data:o},...s&&{expr:s},...c&&{events:c},...l&&{registry:l}}}function Ee(){try{if(typeof window<`u`)try{if(Te(window.location.search).enabled)return!0}catch{}let e=typeof globalThis<`u`&&globalThis.OBJECTUI_DEBUG;return e===!0||e===`true`||globalThis.process?.env?.OBJECTUI_DEBUG===`true`}catch{return!1}}function De(e,t,n){Ee()&&(n===void 0?console.log(`[ObjectUI Debug][${e}] ${t}`):console.log(`[ObjectUI Debug][${e}] ${t}`,n))}var Oe=new Map;function ke(e){Ee()&&Oe.set(e,performance.now())}function Ae(e){if(!Ee())return;let t=Oe.get(e);if(t!==void 0){let n=(performance.now()-t).toFixed(2);console.log(`[ObjectUI Debug][perf] ${e}: ${n}ms`),Oe.delete(e)}}var je=200,Me=class e{static instance=null;entries=[];subscribers=new Set;static getInstance(){return e.instance||=new e,e.instance}static resetInstance(){e.instance=null}addPerf(e){this.push({kind:`perf`,data:e})}addExpr(e){this.push({kind:`expr`,data:e})}addEvent(e){this.push({kind:`event`,data:e})}getEntries(e){return e?this.entries.filter(t=>t.kind===e):this.entries.slice()}clear(){this.entries=[]}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}push(e){this.entries.push(e),this.entries.length>je&&(this.entries=this.entries.slice(-200));for(let t of this.subscribers)try{t(e)}catch{}}},Ne=/\$\{event\.([a-zA-Z0-9_]+)\}/g;function Pe(e,t){return typeof e!=`string`||e.indexOf("${event.")===-1?e:e.replace(Ne,(e,n)=>{let r=t[n];return r==null?``:String(r)})}function Fe(e,t){if(typeof e==`string`){let n=e.match(/^\$\{event\.([a-zA-Z0-9_]+)\}$/);if(n){let e=t[n[1]];return e===``||e===void 0?null:e}return Pe(e,t)}if(Array.isArray(e))return e.map(e=>Fe(e,t));if(e&&typeof e==`object`){let n={};for(let[r,i]of Object.entries(e))n[r]=Fe(i,t);return n}return e}function Ie(e,t,n={}){if(e?.filter)return Fe(e.filter,t);let r={},{rowField:i,columnField:a,groupByField:o}=n,s=t.scope??`cell`;return s===`total`?r:((s===`cell`||s===`row`)&&i&&`rowKey`in t&&(r[i]=t.rowKey===``?null:t.rowKey),(s===`cell`||s===`column`)&&a&&`colKey`in t&&(r[a]=t.colKey===``?null:t.colKey),o&&`category`in t&&(r[o]=t.category===``?null:t.category),r)}function Le(e,t,n=`Details`){if(e?.title){let n=Pe(e.title,t).trim();if(n)return n}let r=[];return t.rowLabel&&r.push(t.rowLabel),t.colLabel&&r.push(t.colLabel),t.categoryLabel?r.push(t.categoryLabel):t.category&&r.push(t.category),t.series&&r.push(t.series),r.length>0?r.join(` × `):n}function Re(e){return e?e.enabled!==!1:!1}function ze(e,t=new Date){if(e==null)return e;let n=e=>{let t=new Date(e);return t.setHours(0,0,0,0),t},r=e=>{let t=n(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`},i=e=>{let t=n(e),r=(t.getDay()+6)%7;return t.setDate(t.getDate()-r),t},a=e=>new Date(e.getFullYear(),e.getMonth(),1),o=e=>{let t=Math.floor(e.getMonth()/3);return new Date(e.getFullYear(),t*3,1)},s=e=>new Date(e.getFullYear(),0,1),c=(e,t)=>new Date(e.getFullYear(),e.getMonth()+t,1),l=(e,t)=>{let r=n(e);return r.setDate(r.getDate()+t),r},u=e=>l(c(a(e),1),-1),d=e=>l(i(e),6),f=e=>l(c(o(e),3),-1),p=e=>new Date(e.getFullYear(),11,31),m={today:()=>r(t),yesterday:()=>r(l(t,-1)),tomorrow:()=>r(l(t,1)),now:()=>t.toISOString(),current_week_start:()=>r(i(t)),current_week_end:()=>r(d(t)),current_month_start:()=>r(a(t)),current_month_end:()=>r(u(t)),current_quarter_start:()=>r(o(t)),current_quarter_end:()=>r(f(t)),current_year_start:()=>r(s(t)),current_year_end:()=>r(p(t)),last_week_start:()=>r(l(i(t),-7)),last_week_end:()=>r(l(i(t),-1)),last_month_start:()=>r(c(a(t),-1)),last_month_end:()=>r(l(a(t),-1)),last_quarter_start:()=>r(c(o(t),-3)),last_quarter_end:()=>r(l(o(t),-1)),last_year_start:()=>r(new Date(t.getFullYear()-1,0,1)),last_year_end:()=>r(new Date(t.getFullYear()-1,11,31)),next_week_start:()=>r(l(i(t),7)),next_month_start:()=>r(c(a(t),1)),next_quarter_start:()=>r(c(o(t),3)),next_year_start:()=>r(new Date(t.getFullYear()+1,0,1))};for(let[e,t]of Object.entries({week_start:`current_week_start`,week_end:`current_week_end`,month_start:`current_month_start`,month_end:`current_month_end`,quarter_start:`current_quarter_start`,quarter_end:`current_quarter_end`,year_start:`current_year_start`,year_end:`current_year_end`}))m[e]=m[t];let h=/^(\d+)_(minutes?|hours?|days?|weeks?|months?|years?)_(ago|from_now)$/,g=e=>{let n=e.match(h);if(!n)return null;let i=parseInt(n[1],10);if(!Number.isFinite(i))return null;let a=n[3]===`ago`?-1:1,o=n[2].replace(/s$/,``);return o===`minute`?new Date(t.getTime()+a*i*60*1e3).toISOString():o===`hour`?new Date(t.getTime()+a*i*60*60*1e3).toISOString():o===`day`?r(l(t,a*i)):o===`week`?r(l(t,a*i*7)):o===`month`?r(new Date(t.getFullYear(),t.getMonth()+a*i,t.getDate())):o===`year`?r(new Date(t.getFullYear()+a*i,t.getMonth(),t.getDate())):null},_=/\$?\{([a-zA-Z0-9_]+)\}/g,v=e=>{if(e==null)return e;if(typeof e==`string`){let t=e.match(/^\$?\{([a-zA-Z0-9_]+)\}$/);if(t){let e=t[1];if(m[e])return m[e]();let n=g(e);if(n!=null)return n}let n=!1,r=e.replace(_,(e,t)=>{if(m[t])return n=!0,m[t]();let r=g(t);return r==null?e:(n=!0,r)});return n?r:e}if(Array.isArray(e))return e.map(v);if(typeof e==`object`){let t={};for(let n of Object.keys(e))t[n]=v(e[n]);return t}return e};return v(e)}var Be={current_week_start:`last_week_start`,current_week_end:`last_week_end`,current_month_start:`last_month_start`,current_month_end:`last_month_end`,current_quarter_start:`last_quarter_start`,current_quarter_end:`last_quarter_end`,current_year_start:`last_year_start`,current_year_end:`last_year_end`,week_start:`last_week_start`,week_end:`last_week_end`,month_start:`last_month_start`,month_end:`last_month_end`,quarter_start:`last_quarter_start`,quarter_end:`last_quarter_end`,year_start:`last_year_start`,year_end:`last_year_end`,today:`yesterday`};function Ve(e,t){if(e==null)return e;if(typeof e==`string`)return e.replace(/\$?\{([a-zA-Z0-9_]+)\}/g,(e,n)=>{let r=t[n];return r?`{${r}}`:e});if(Array.isArray(e))return e.map(e=>Ve(e,t));if(typeof e==`object`){let n={};for(let r of Object.keys(e))n[r]=Ve(e[r],t);return n}return e}function He(e,t){let n=t.match(/^(\d+)([dwMy])$/);if(!n)return null;let r=parseInt(n[1],10),i=n[2],a=new Date(e);if(i===`d`)a.setDate(a.getDate()-r);else if(i===`w`)a.setDate(a.getDate()-r*7);else if(i===`M`)a.setMonth(a.getMonth()-r);else if(i===`y`)a.setFullYear(a.getFullYear()-r);else return null;return a}function Ue(e,t,n=new Date){if(t===`previousYear`)return ze(e,new Date(n.getFullYear()-1,n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds()));if(typeof t==`object`&&t&&`offset`in t){let r=He(n,t.offset);return r?ze(e,r):ze(e,n)}return ze(Ve(e,Be),n)}function We(e,t){if(e===`previousYear`)return`vsLastYear`;if(typeof e==`object`&&e&&`offset`in e)return`vsPreviousPeriod`;let n=t?JSON.stringify(t):``;return/current_year_|year_start|year_end/.test(n)?`vsLastYear`:/current_quarter_|quarter_start|quarter_end/.test(n)?`vsLastQuarter`:/current_month_|month_start|month_end/.test(n)?`vsLastMonth`:/current_week_|week_start|week_end/.test(n)?`vsLastWeek`:/\btoday\b/.test(n)?`vsYesterday`:`vsPreviousPeriod`}function Ge(e,t,n,r){let i=(t??[]).filter(Boolean),a=(n??[]).filter(Boolean),o=Array.isArray(e)?e:[],s=e=>(r??[]).find(t=>t.name===e)?.label??e;if(i.length>=2&&a.length===1){let e=i[0],t=i[1],n=a[0],r=[],s=new Map;for(let i of o){let a=i[e],o=String(a??``);s.has(o)||s.set(o,{[e]:a});let c=String(i[t]??``);c!==``&&!r.includes(c)&&r.push(c),s.get(o)[c]=i[n]}return{data:Array.from(s.values()),xAxisKey:e,series:r.map(e=>({dataKey:e,label:e}))}}return{data:o,xAxisKey:i[0],series:a.map(e=>({dataKey:e,label:s(e)}))}}function Ke(e,t,n,r,i){let a=(t??[]).filter(Boolean),o=(n??[]).filter(Boolean),s=Array.isArray(e)?e:[],c=a[0];if(!c)return-1;let l=String(r??``);if(a.length>=2&&o.length===1){let e=a[1],t=String(i??``);return s.findIndex(n=>String(n[c]??``)===l&&String(n[e]??``)===t)}return s.findIndex(e=>String(e[c]??``)===l)}function qe(e){return e>-1&&e<1?e*100:e}function Je(e,t,n){if(e==null)return`—`;if(typeof e!=`number`)return String(e);let r=t?t.split(`.`)[1]?.match(/0/g)?.length??0:void 0;if(n)try{return new Intl.NumberFormat(void 0,{style:`currency`,currency:n,minimumFractionDigits:r??0,maximumFractionDigits:r??2}).format(e)}catch{}if(!t)return Number.isInteger(e)?String(e):e.toLocaleString(void 0,{maximumFractionDigits:2});let i=t.includes(`%`);return`${t.includes(`$`)?`$`:``}${(i?qe(e):e).toLocaleString(void 0,{minimumFractionDigits:r??0,maximumFractionDigits:r??0})}${i?`%`:``}`}function Ye(e){return e==null?`—`:typeof e==`number`?Number.isInteger(e)?String(e):e.toLocaleString(void 0,{maximumFractionDigits:2}):String(e)}function Xe(e,t,n){let r=new Map((e??[]).map(e=>[e.name,e])),i=e=>r.get(e);return{measureField:i,headerLabel:e=>{let r=i(e)?.label??e;return t&&n?n(t,e,r):r}}}function Ze(e,t,n,r){let i={};for(let r of t){let t=e?.[r];i[n[r]]=t===``||t===void 0?null:t}return r?{...r,...i}:i}var I=e(t(),1),L=n(),Qe=(0,I.createContext)(null),$e=({children:e,dataSource:t,debug:n,debugFlags:r})=>{let i=(0,I.useMemo)(()=>({dataSource:t,debug:n,debugFlags:r}),[t,n,r]);return(0,L.jsx)(Qe.Provider,{value:i,children:e})},et=()=>{let e=(0,I.useContext)(Qe);if(!e)throw Error(`useSchemaContext must be used within a SchemaRendererProvider`);return e},tt=e=>{let t=(0,I.useContext)(Qe)?.dataSource;if(e&&t)return e.split(`.`).reduce((e,t)=>e&&e[t],t)},nt=(0,I.createContext)({});function rt({scope:e,children:t}){return(0,I.createElement)(nt.Provider,{value:e},t)}function it(){return(0,I.useContext)(nt)}function at(e){if(!(e==null||e===``)){if(typeof e==`boolean`)return e;if(typeof e==`string`)return`\${${e}}`;if(typeof e==`object`&&typeof e.source==`string`){let t=e.source;return t?`\${${t}}`:void 0}}}function ot(e,t={}){let n=it();return(0,I.useMemo)(()=>new D({...n,...t}).evaluateCondition(e),[e,t,n])}function st(e){if(e!=null)return typeof e==`string`?e:e.defaultValue||e.key}var ct=(()=>{try{return!1}catch{return!0}})(),lt=typeof WeakMap<`u`?new WeakMap:{set(){},get(){},has(){return!1}},ut=typeof WeakSet<`u`?new WeakSet:{add(){},has(){return!1}};function dt(e){if(!ct||!e||typeof e!=`object`)return{valid:!0,messages:[]};let t=lt.get(e);if(t)return t;let n={valid:!0,messages:[]};try{let t=h(e);if(!t.valid){let r=t.errors.map(e=>`${e.path}: ${e.message}`);n={valid:!1,messages:r},ut.has(e)||(ut.add(e),console.warn(`[ObjectUI] Invalid schema detected:
|
|
3
3
|
`+r.join(`
|
|
4
|
-
`),e))}}catch(t){lt.has(e)||(lt.add(e),console.warn(`[ObjectUI] Schema validator threw:`,t))}return ct.set(e,n),n}function dt(e){let t={};return e.ariaLabel&&(t[`aria-label`]=ot(e.ariaLabel)),e.ariaDescribedBy&&(t[`aria-describedby`]=e.ariaDescribedBy),e.role&&(t.role=e.role),t}var ft=class extends I.Component{state={hasError:!1,error:null};static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidUpdate(e){this.state.hasError&&(e.componentType!==this.props.componentType||e.resetKey!==this.props.resetKey)&&this.setState({hasError:!1,error:null})}handleRetry=()=>{this.setState({hasError:!1,error:null})};render(){if(this.state.hasError&&this.state.error){let e=this.state.error;return we(e),(0,L.jsxs)(`div`,{className:`p-4 border border-orange-400 rounded bg-orange-50 text-orange-700 my-2`,role:`alert`,children:[(0,L.jsxs)(`p`,{className:`font-medium`,children:[`Component`,this.props.componentType?` "${this.props.componentType}"`:``,` failed to render`]}),(0,L.jsx)(`p`,{className:`text-sm mt-1`,children:e.message}),!1,(0,L.jsx)(`button`,{onClick:this.handleRetry,className:`mt-2 text-sm underline hover:no-underline`,children:`Retry`})]})}return this.props.children}},pt=(0,I.forwardRef)(({schema:e,...t},n)=>{let r=(0,I.useContext)(Ze),i=r?.dataSource||{},a=rt(),[,o]=(0,I.useReducer)(e=>e+1,0);(0,I.useEffect)(()=>{let e=l.subscribe(o);return o(),e},[]);let[s,c]=(0,I.useState)(null),u=(0,I.useMemo)(()=>{if(!e||typeof e==`string`)return e;let t=new D({...a,current_user:a?.user,data:i}),n={...e};if(n.properties){let e=n.type,t=n.id,r=n.properties;for(let[e,t]of Object.entries(r))e===`type`||e===`id`||(n[e]=t);e!==void 0&&(n.type=e),t!==void 0&&(n.id=t),n.properties=r}if(typeof n.content==`string`&&(n.content=t.evaluate(n.content)),n.props){let e={...n.props};for(let[n,r]of Object.entries(e))e[n]=t.evaluate(r);n.props=e}return(n.visible===void 0?n.visibleOn===void 0?n.hidden===void 0?n.hiddenOn!==void 0&&t.evaluateCondition(n.hiddenOn):t.evaluateCondition(n.hidden):!t.evaluateCondition(n.visibleOn):!t.evaluateCondition(n.visible))&&(n._hidden=!0),(n.disabled===void 0?n.disabledOn!==void 0&&t.evaluateCondition(n.disabledOn):t.evaluateCondition(n.disabled))&&(n._disabled=!0),n},[e,i,a]);if(!u||u?._hidden)return null;if(typeof u==`string`)return(0,L.jsx)(L.Fragment,{children:u});let d=st?ut(e):{valid:!0,messages:[]};De(`schema`,`Rendering schema node`,{type:u.type,id:u.id});let f=l.get(u.type);if(!f){if(!s&&l.hasLazy(u.type)){let e=l.loadLazy(u.type);if(e)return e.catch(e=>{c(e instanceof Error?e:Error(String(e)))}),(0,L.jsxs)(`div`,{className:`p-2 text-sm text-muted-foreground animate-pulse`,role:`status`,"aria-live":`polite`,"data-lazy-loading":u.type,children:[`Loading `,(0,L.jsx)(`code`,{children:u.type}),`…`]})}return De(`schema`,`Component not found in registry`,{type:u.type}),Se[`OBJUI-001`],(0,L.jsxs)(`div`,{className:`p-4 border border-red-500 rounded text-red-500 bg-red-50 my-2`,role:`alert`,children:[(0,L.jsxs)(`p`,{className:`font-medium`,children:[`Unknown component type: `,(0,L.jsx)(`strong`,{children:u.type})]}),s&&(0,L.jsxs)(`p`,{className:`text-xs mt-1`,children:[`Failed to load plugin: `,s.message]}),!1,(0,L.jsx)(`pre`,{className:`text-xs mt-2 overflow-auto`,children:JSON.stringify(u,null,2)})]})}let{type:p,children:m,body:h,schema:g,visible:_,visibleOn:v,hidden:y,hiddenOn:b,disabled:x,disabledOn:ee,_hidden:S,_disabled:C,...w}=u,T=dt(u),E=r?.debug||r?.debugFlags?.enabled,O={};E&&(O[`data-debug-type`]=u.type,u.id&&(O[`data-debug-id`]=u.id)),ke(`render:${u.type}:${u.id??`anon`}`);let te=E?performance.now():0,ne=(0,L.jsx)(ft,{componentType:u.type,resetKey:u.id??null,children:I.createElement(f,{schema:u,...w,...u.props||{},...T,...O,disabled:C||void 0,className:u.className,"data-obj-id":u.id,"data-obj-type":u.type,...st&&!d.valid?{"data-obj-schema-invalid":`true`}:{},...t})});if(Ae(`render:${u.type}:${u.id??`anon`}`),E&&te){let e=performance.now()-te;Me.getInstance().addPerf({type:u.type,id:u.id,durationMs:e,timestamp:Date.now()})}return ne});pt.displayName=`SchemaRenderer`;function mt(e={}){let{context:t={},onConfirm:n,onToast:r,onModal:i,onNavigate:a,onParamCollection:o,onResultDialog:s}=`context`in e?e:{context:e},[c,l]=(0,I.useState)(!1),[u,d]=(0,I.useState)(null),[f,p]=(0,I.useState)(null),m=(0,I.useMemo)(()=>{let e=new M(t);return n&&e.setConfirmHandler(n),r&&e.setToastHandler(r),i&&e.setModalHandler(i),a&&e.setNavigationHandler(a),o&&e.setParamCollectionHandler(o),s&&e.setResultDialogHandler(s),e},[JSON.stringify(t)]);return{execute:(0,I.useCallback)(async e=>{l(!0),d(null),p(null);try{let t=await m.execute(e);return p(t),t.success||d(t.error||`Action failed`),t}catch(e){let t=e.message;d(t);let n={success:!1,error:t};return p(n),n}finally{l(!1)}},[m]),loading:c,error:u,result:f,updateContext:(0,I.useCallback)(e=>{m.updateContext(e)},[m]),runner:m}}function ht(e){let{navigation:t,objectName:n,onNavigate:r,onRowClick:i}=e,[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(null),l=t?.mode??`page`,u=t?.width,d=t?.view,f=l===`drawer`||l===`modal`||l===`split`||l===`popover`,p=(0,I.useCallback)(()=>{o(!1),c(null)},[]),m=(0,I.useCallback)(e=>{c(e),o(!0)},[]),h=(0,I.useCallback)((e,a)=>{if(i){i(e,a);return}if(a&&(a.metaKey||a.ctrlKey||a.button===1)){let t=e.id||e._id;if(r&&t!=null){r(t,`new_window`);return}}if(!t){let t=e.id||e._id;r&&t!=null&&r(t,d??`view`);return}if(!(l===`none`||t.preventNavigation)){if(l===`new_window`||t.openNewTab){let t=e.id||e._id;if(r&&t!=null){r(t,`new_window`);return}let i=encodeURIComponent(String(t)),a=n?`/${n}/record/${i}`:`/${i}`;window.open(a,`_blank`);return}if(l===`page`){let t=e.id||e._id;r&&t!=null&&r(t,d??`view`);return}if(f){c(e),o(!0);return}}},[i,t,l,n,r,f,d]);return(0,I.useMemo)(()=>({isOpen:a,selectedRecord:s,mode:l,close:p,open:m,setIsOpen:o,handleClick:h,width:u,view:d,isOverlay:f}),[a,s,l,p,m,h,u,d,f])}var gt=(0,I.createContext)(null);function _t(e){if(!e||e.length===0)return{};let t={};for(let n of e)if(n.defaultValue!==void 0)t[n.name]=n.defaultValue;else switch(n.type){case`number`:t[n.name]=0;break;case`boolean`:t[n.name]=!1;break;case`object`:t[n.name]={};break;case`array`:t[n.name]=[];break;default:t[n.name]=``;break}return t}var vt=({definitions:e,children:t})=>{let[n,r]=(0,I.useState)(()=>_t(e)),i=(0,I.useCallback)((e,t)=>{r(n=>({...n,[e]:t}))},[]),a=(0,I.useCallback)(e=>{r(t=>({...t,...e}))},[]),o=(0,I.useCallback)(()=>{r(_t(e))},[e]),s=(0,I.useMemo)(()=>({variables:n,setVariable:i,setVariables:a,resetVariables:o}),[n,i,a,o]);return(0,L.jsx)(gt.Provider,{value:s,children:t})};vt.displayName=`PageVariablesProvider`;function yt(){let e=(0,I.useContext)(Ze)?.dataSource,[t,n]=(0,I.useState)(null),[r,i]=(0,I.useState)(!0),[a,o]=(0,I.useState)(null);return(0,I.useEffect)(()=>{let t=!1;async function r(){if(!e){i(!1);return}try{if(i(!0),typeof e.getDiscovery==`function`){let r=await e.getDiscovery();t||(n(r),o(null))}else t||(n(null),o(null))}catch(e){t||(o(e instanceof Error?e:Error(`Failed to fetch discovery`)),n(null))}finally{t||i(!1)}}return r(),()=>{t=!0}},[e]),{discovery:t,isLoading:r,error:a,isAuthEnabled:t?.services?.auth?.enabled??!0,isAiEnabled:t?.services?.ai?.enabled===!0&&t?.services?.ai?.status===`available`}}[`a[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`].join(`, `);var bt={compact:32,comfortable:40,spacious:52},xt={compact:`py-1 px-2`,comfortable:`py-2 px-3`,spacious:`py-3 px-4`},St={compact:`text-xs`,comfortable:`text-sm`,spacious:`text-base`},Ct=[`compact`,`comfortable`,`spacious`];function wt(e=`comfortable`,t){let[n,r]=(0,I.useState)(e),i=t?.rowHeights??bt,a=t?.paddingClasses??xt,o=t?.fontSizeClasses??St,s=(0,I.useRef)(t?.onChange);(0,I.useEffect)(()=>{s.current=t?.onChange},[t?.onChange]);let c=(0,I.useRef)(e);(0,I.useEffect)(()=>{e!==c.current&&(c.current=e,r(e))},[e]);let l=(0,I.useCallback)(e=>{r(t=>t===e?t:(queueMicrotask(()=>s.current?.(e)),e))},[]),u=(0,I.useCallback)(()=>{r(e=>{let t=Ct[(Ct.indexOf(e)+1)%Ct.length];return queueMicrotask(()=>s.current?.(t)),t})},[]);return(0,I.useMemo)(()=>({mode:n,setMode:l,cycle:u,rowHeight:i[n],paddingClass:a[n],fontSizeClass:o[n]}),[n,l,u,i,a,o])}var Tt=0,Et=(0,I.createContext)(null),Dt=({children:e,config:t={},onToast:n})=>{let r=(0,I.useMemo)(()=>({position:`top-right`,defaultDuration:5e3,maxVisible:5,stacking:!0,...t}),[JSON.stringify(t)]),[i,a]=(0,I.useState)([]),o=(0,I.useCallback)(e=>{let t=`notification-${++Tt}`,i={...e,id:t,createdAt:new Date,read:!1};a(e=>[i,...e]),n&&n(i);let o=e.duration??r.defaultDuration??5e3;return o>0&&setTimeout(()=>{a(e=>e.filter(e=>e.id!==t))},o),t},[r.defaultDuration,n]),s=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`info`}),[o]),c=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`success`}),[o]),l=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`warning`}),[o]),u=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`error`}),[o]),d=(0,I.useCallback)(e=>{a(t=>t.map(t=>t.id===e?{...t,read:!0}:t))},[]),f=(0,I.useCallback)(()=>{a(e=>e.map(e=>({...e,read:!0})))},[]),p=(0,I.useCallback)(e=>{a(t=>t.filter(t=>t.id!==e))},[]),m=(0,I.useCallback)(()=>{a([])},[]),h=(0,I.useMemo)(()=>i.filter(e=>!e.read).length,[i]),g=(0,I.useMemo)(()=>({notifications:i,unreadCount:h,notify:o,info:s,success:c,warning:l,error:u,markAsRead:d,markAllAsRead:f,dismiss:p,clearAll:m,config:r}),[i,h,o,s,c,l,u,d,f,p,m,r]);return(0,L.jsx)(Et.Provider,{value:g,children:e})};Dt.displayName=`NotificationProvider`;function Ot(e){return typeof window>`u`?()=>{}:(window.addEventListener(`online`,e),window.addEventListener(`offline`,e),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,e)})}function kt(){return typeof navigator<`u`?navigator.onLine:!0}function At(){return!0}var jt=`objectui-offline-queue`;function Mt(){if(typeof localStorage>`u`)return[];try{let e=localStorage.getItem(jt);return e?JSON.parse(e):[]}catch{return[]}}function Nt(e){if(!(typeof localStorage>`u`))try{localStorage.setItem(jt,JSON.stringify(e))}catch{}}var Pt=0;function Ft(){return Pt+=1,`mut_${Date.now()}_${Pt}`}var It={enabled:!0,strategy:`network_first`,offlineIndicator:!0,offlineMessage:`You are currently offline. Changes will be synced when reconnected.`,queueMaxSize:100};function Lt(e={}){let{enabled:t=It.enabled,strategy:n=It.strategy,offlineIndicator:r=It.offlineIndicator,offlineMessage:i=It.offlineMessage,queueMaxSize:a=It.queueMaxSize,sync:o}=e,s=(0,I.useSyncExternalStore)(Ot,kt,At),[c,l]=(0,I.useState)(Mt),[u,d]=(0,I.useState)(`idle`),f=(0,I.useRef)(o);f.current=o,(0,I.useEffect)(()=>{Nt(c)},[c]),(0,I.useEffect)(()=>{t&&(s?u===`offline`&&d(`idle`):d(`offline`))},[s,t,u]);let p=(0,I.useCallback)(e=>{t&&l(t=>{let n={...e,id:Ft(),timestamp:Date.now()},r=[...t,n];return r.length>a?r.slice(r.length-a):r})},[t,a]),m=(0,I.useCallback)(()=>{l([])},[]),h=(0,I.useCallback)(async()=>{if(!(!t||c.length===0)){d(`syncing`);try{let e=f.current?.batchSize??c.length,t=c.slice(0,e);await new Promise(e=>setTimeout(e,0)),l(e=>e.filter(e=>!t.some(t=>t.id===e.id))),d(`idle`)}catch{d(`error`)}}},[t,c]);return(0,I.useEffect)(()=>{if(!t||!s||c.length===0)return;let e=setTimeout(()=>{h()},100);return()=>clearTimeout(e)},[s,t]),(0,I.useMemo)(()=>({isOnline:s,enabled:t,syncState:u,strategy:n,pendingCount:c.length,queueMutation:p,sync:h,clearQueue:m,showIndicator:r&&!s,offlineMessage:i}),[s,t,u,n,c.length,p,h,m,r,i])}function Rt(){return{canUndo:j.canUndo,canRedo:j.canRedo,undoDescription:j.peekUndo()?.description,redoDescription:j.peekRedo()?.description,history:j.getHistory()}}function zt(){return{canUndo:!1,canRedo:!1,undoDescription:void 0,redoDescription:void 0,history:[]}}var Bt=Rt();function Vt(e){return j.subscribe(()=>{Bt=Rt(),e()})}function Ht(){return Bt}function Ut(e={}){let t=(0,I.useRef)(e);t.current=e;let n=(0,I.useSyncExternalStore)(Vt,Ht,zt),r=(0,I.useCallback)(async(e,n,r)=>{let i=t.current.dataSource;if(!i)return;let a=r===`undo`?{create:`delete`,update:`update`,delete:`create`}[e.type]:e.type;a===`delete`?await i.delete(e.objectName,e.recordId):a===`update`?await i.update(e.objectName,e.recordId,n):await i.create(e.objectName,n)},[]),i=(0,I.useCallback)(async()=>{let e=j.popUndo();e&&(await r(e,e.undoData,`undo`),t.current.onUndo?.(e))},[r]),a=(0,I.useCallback)(async()=>{let e=j.popRedo();e&&(await r(e,e.redoData,`redo`),t.current.onRedo?.(e))},[r]);return(0,I.useEffect)(()=>{let e=e=>{!(e.ctrlKey||e.metaKey)||e.key.toLowerCase()!==`z`||(e.preventDefault(),e.shiftKey?a():i())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i,a]),(0,I.useMemo)(()=>({...n,undo:i,redo:a}),[n,i,a])}var Wt=(0,I.createContext)(null),Gt=({children:e,context:t={},onConfirm:n,onToast:r,onModal:i,onNavigate:a,onParamCollection:o,onResultDialog:s,handlers:c})=>{let[l,u]=(0,I.useState)(!1),[d,f]=(0,I.useState)(null),[p,m]=(0,I.useState)(null),h=(0,I.useMemo)(()=>{let e=new M({...t,ctx:t&&typeof t.ctx==`object`?{...t,...t.ctx}:{...t}});return n&&e.setConfirmHandler(n),r&&e.setToastHandler(r),i&&e.setModalHandler(i),a&&e.setNavigationHandler(a),o&&e.setParamCollectionHandler(o),s&&e.setResultDialogHandler(s),c&&Object.entries(c).forEach(([t,n])=>{e.registerHandler(t,n)}),e},[JSON.stringify(t)]),g=(0,I.useCallback)(async e=>{u(!0),f(null),m(null);try{let t=await h.execute(e);return m(t),t.success||f(t.error||`Action failed`),t}catch(e){let t=e.message;f(t);let n={success:!1,error:t};return m(n),n}finally{u(!1)}},[h]),_=(0,I.useCallback)(async(e,t)=>{u(!0),f(null),m(null);try{let n=await h.executeChain(e,t);return m(n),n.success||f(n.error||`Chain failed`),n}catch(e){let t=e.message;f(t);let n={success:!1,error:t};return m(n),n}finally{u(!1)}},[h]),v=(0,I.useCallback)(e=>{h.updateContext(e)},[h]),y=(0,I.useMemo)(()=>({execute:g,executeChain:_,loading:l,error:d,result:p,runner:h,updateContext:v}),[g,_,l,d,p,h,v]);return(0,L.jsx)(Wt.Provider,{value:y,children:e})};Gt.displayName=`ActionProvider`;function Kt(){let e=(0,I.useContext)(Wt);if(!e){let e=new M;return{execute:t=>e.execute(t),executeChain:(t,n)=>e.executeChain(t,n),loading:!1,error:null,result:null,runner:e,updateContext:t=>e.updateContext(t)}}return e}function qt(e={}){let{actions:t=[],context:n={}}=e,r=(0,I.useContext)(Wt)?.runner??null,i=(0,I.useMemo)(()=>{let e=n&&Object.keys(n).length>0?{...n,ctx:n.ctx&&typeof n.ctx==`object`?{...n,...n.ctx}:{...n}}:n,i=r?new he(r):new he(e);if(r&&n&&Object.keys(n).length>0){let e=i.getRunner(),t=e.getEvaluator().getContext().toObject(),r=t&&typeof t.ctx==`object`?t.ctx:{},a=n.ctx&&typeof n.ctx==`object`?n.ctx:n,o={...n,ctx:{...r,...a}};e.updateContext(o)}return i.registerActions(t),i},[r,JSON.stringify(t),JSON.stringify(n)]);return{getActionsForLocation:(0,I.useCallback)(e=>i.getActionsForLocation(e),[i]),getBulkActions:(0,I.useCallback)(()=>i.getBulkActions(),[i]),executeAction:(0,I.useCallback)((e,t)=>i.executeAction(e,t),[i]),handleShortcut:(0,I.useCallback)(e=>i.handleShortcut(e),[i]),engine:i}}var Jt=(0,I.createContext)(null);function Yt(){return(0,I.useContext)(Jt)}var Xt=(0,I.createContext)(null);function Zt(){return(0,I.useContext)(Xt)||{apps:[],objects:[],dashboards:[],reports:[],pages:[],loading:!1,error:null,refresh:async()=>{},invalidate:()=>{},ensureType:async()=>[],getItem:async()=>null,getItemsByType:()=>[],getTypeStatus:()=>`ready`}}function Qt(e,t){let{getItem:n}=Zt(),[r,i]=(0,I.useState)({item:null,loading:!!t,error:null});return(0,I.useEffect)(()=>{if(!t){i({item:null,loading:!1,error:null});return}let r=!1;return i(e=>({...e,loading:!0,error:null})),n(e,t).then(e=>{r||i({item:e,loading:!1,error:null})}).catch(e=>{r||i({item:null,loading:!1,error:e instanceof Error?e:Error(String(e))})}),()=>{r=!0}},[e,t,n]),r}function $t(e,t){return!0}function en(e,t={}){let n=Zt(),[r,i]=(0,I.useState)(!1),[a,o]=(0,I.useState)(null);(0,I.useEffect)(()=>{let e=!1;if(!n.ensureType){i(!0);return}return n.ensureType(`page`).then(()=>{e||(i(!0),o(null))}).catch(t=>{e||(o(t instanceof Error?t:Error(String(t))),i(!0))}),()=>{e=!0}},[n]);let s=(0,I.useMemo)(()=>{if(!e&&!t.pageName)return null;let r=Array.isArray(n.pages)?n.pages:[];if(!r.length)return null;if(t.pageName)return r.find(e=>e?.name===t.pageName)??null;let i=r.filter(n=>!n||(n.pageType??(n.type===`record`?`record`:void 0))!==`record`||n.object!==e?!1:$t(n,t));return i.length?(i.sort((e,t)=>(t?.priority??0)-(e?.priority??0)),i[0]):null},[n.pages,e,t.pageName,t.recordType,t.profile,t.app,t.formFactor]),{page:c,slots:l}=(0,I.useMemo)(()=>s?s.kind===`slotted`?{page:null,slots:s.slots??{}}:{page:s,slots:null}:{page:null,slots:null},[s]);return{page:c,slots:l,loading:n.loading||!r,error:a??n.error??null}}function tn(e,t){let n=e?.titleFormat;if(n&&typeof n==`string`){let e=n.replace(/\{\{\s*([\w.]+)\s*\}\}/g,(e,n)=>{let r=n.split(`.`).reduce((e,t)=>e==null?e:e[t],t);return r==null?``:String(r)}).trim();if(e.length>0)return e}return t?.name||t?.full_name||t?.fullName||t?.title||t?.label||t?.subject||t?.id||t?._id||`Untitled`}function nn(e,t,n){if(!e)return 0;let r=e.toLowerCase(),i=(t||``).toLowerCase();return(n||``).toLowerCase()===r?110:i===r?100:i.startsWith(r)?80:i.split(/[\s_\-/.,:;()[\]]+/).filter(Boolean).some(e=>e.startsWith(r))?60:i.includes(r)?40:0}function rn(e){let{query:t,objects:n,dataSource:r,objectNames:i,maxObjectsQueried:a=8,topPerObject:o=3,minLength:s=2,debounceMs:c=250,enabled:l=!0,getDisplayName:u=tn}=e,[d,f]=(0,I.useState)([]),[p,m]=(0,I.useState)(!1),[h,g]=(0,I.useState)(void 0),_=(0,I.useMemo)(()=>{if(!Array.isArray(n)||n.length===0)return[];let e=n;if(Array.isArray(i)&&i.length>0){let t=new Map;for(let e of n){let n=e?.name;typeof n==`string`&&t.set(n,e)}e=i.map(e=>t.get(e)).filter(e=>e!=null)}else e=n.filter(e=>e?.searchable!==!1);return e.slice(0,a)},[n,i,a]),v=(0,I.useMemo)(()=>_.map(e=>`${e?.name}:${e?.titleField??``}`).join(`|`),[_]),y=(0,I.useRef)(0);return(0,I.useEffect)(()=>{if(!l||!r||_.length===0){f([]),m(!1),g(void 0);return}let e=(t??``).trim();if(e.length<s){f([]),m(!1),g(void 0);return}let n=++y.current;m(!0),g(void 0);let i=setTimeout(()=>{if(y.current!==n)return;let t=_.map(t=>Promise.resolve().then(()=>r.find(t.name,{$search:e,$top:o})).then(e=>({obj:t,res:e,err:null})).catch(e=>({obj:t,res:null,err:e})));Promise.allSettled(t).then(t=>{if(y.current!==n)return;let r=[],i;for(let n of t){if(n.status!==`fulfilled`)continue;let{obj:t,res:a,err:s}=n.value;if(s){let e=s?.httpStatus??s?.status,t=s?.code;if(e===404||t===`object_not_found`)continue;i=s instanceof Error?s:Error(String(s));continue}let c=Array.isArray(a?.data)?a.data:Array.isArray(a)?a:[];for(let n of c.slice(0,o)){let i=n?.id??n?._id;if(i==null)continue;let a=u(t,n);r.push({objectName:t.name,objectLabel:typeof t.label==`string`&&t.label.length>0?t.label:t.name,recordId:String(i),display:a,icon:t?.icon,score:nn(e,a,String(i)),raw:n})}}r.sort((e,t)=>t.score-e.score),f(r),m(!1),g(i)})},c);return()=>{clearTimeout(i)}},[t,l,r,v,o,s,c,u]),{results:d,isSearching:p,error:h}}var an=(0,I.createContext)(!1),on=({value:e=!0,children:t})=>(0,L.jsx)(an.Provider,{value:e,children:t}),sn=()=>(0,I.useContext)(an);(0,I.createContext)(null);var cn=(0,I.createContext)(null),ln=({children:e,config:t={},onDragStart:n,onDrop:r,onDragCancel:i})=>{let a=(0,I.useMemo)(()=>({enabled:!0,showPreview:!0,autoScroll:!0,...t}),[JSON.stringify(t)]),[o,s]=(0,I.useState)(null),[c]=(0,I.useState)(()=>new Map),l=(0,I.useCallback)(e=>{a.enabled&&(s(e),n?.({item:e,targetZoneId:null,effect:`move`}))},[a.enabled,n]),u=(0,I.useCallback)(e=>{if(!o)return;let t=(e?c.get(e):void 0)?.effect??`move`;r?.({item:o,targetZoneId:e??null,effect:t}),s(null)},[o,c,r]),d=(0,I.useCallback)(()=>{o&&(i?.({item:o,targetZoneId:null,effect:`none`}),s(null))},[o,i]),f=(0,I.useCallback)(e=>{c.set(e.id,e)},[c]),p=(0,I.useCallback)(e=>{c.delete(e)},[c]),m=(0,I.useCallback)((e,t)=>{let n=c.get(e);return!n||n.disabled?!1:n.acceptTypes.includes(t)},[c]),h=(0,I.useMemo)(()=>({config:a,enabled:a.enabled??!0,activeItem:o,dropZones:c,startDrag:l,endDrag:u,cancelDrag:d,registerDropZone:f,unregisterDropZone:p,canDrop:m}),[a,o,c,l,u,d,f,p,m]);return(0,L.jsx)(cn.Provider,{value:h,children:e})};ln.displayName=`DndProvider`;function un(){let e=(0,I.useContext)(cn);if(!e)throw Error(`useDnd must be used within a <DndProvider>. Wrap your app with <DndProvider> to use the drag and drop system.`);return e}function dn(){return(0,I.useContext)(cn)!==null}var fn=I.createContext(null),pn=({children:e})=>{let t=I.useMemo(()=>{let e=new Map,t=vn,n=new Set,r=()=>{let r=new Set;for(let t of e.values())for(let e of t)r.add(e);if(r.size===t.size){let e=!0;for(let n of r)if(!t.has(n)){e=!1;break}if(e)return}t=r,n.forEach(e=>e())};return{getNames:()=>t,subscribe:e=>(n.add(e),()=>{n.delete(e)}),register:(t,n)=>{let i=e.get(t);i&&i.length===n.length&&i.every((e,t)=>e===n[t])||(e.set(t,[...n]),r())},unregister:t=>{e.delete(t)&&r()}}},[]);return(0,L.jsx)(fn.Provider,{value:t,children:e})};function mn(){let e=I.useContext(fn);return I.useSyncExternalStore(e?e.subscribe:gn,e?e.getNames:_n,e?e.getNames:_n)}function hn(e,t){let n=I.useContext(fn),r=t.join(`|`);I.useEffect(()=>{if(n)return n.register(e,r.length===0?[]:r.split(`|`)),()=>n.unregister(e)},[n,e,r])}var gn=e=>()=>{},_n=()=>vn,vn=new Set,yn=I.createContext(null),bn=({children:e,...t})=>{let n=I.useMemo(()=>t,[t.objectName,t.recordId,t.dataSource,t.data,t.objectSchema,t.loading,t.error,t.refresh,t.embedded,t.headerSystemActions,t.isFavorite,t.onToggleFavorite]);return(0,L.jsx)(yn.Provider,{value:n,children:e})};function xn(){return I.useContext(yn)}var Sn=I.createContext(null),Cn=({children:e,...t})=>{let n=I.useMemo(()=>t,[t.items,t.onAddComment,t.onAddReply,t.onToggleReaction,t.mentionSuggestions,t.onUploadAttachments,t.loading,t.error]);return(0,L.jsx)(Sn.Provider,{value:n,children:e})};function wn(){return I.useContext(Sn)}var Tn=(0,I.createContext)({}),En=({value:e,children:t})=>(0,L.jsx)(Tn.Provider,{value:e,children:t});function Dn(){return(0,I.useContext)(Tn)}var On=e=>e.type===`checkbox`,R=e=>e instanceof Date,z=e=>e==null,kn=e=>typeof e==`object`,B=e=>!z(e)&&!Array.isArray(e)&&kn(e)&&!R(e),An=e=>B(e)&&e.target?On(e.target)?e.target.checked:e.target.value:e,jn=(e,t)=>t.split(`.`).some((t,n,r)=>!isNaN(Number(t))&&e.has(r.slice(0,n).join(`.`))),Mn=e=>{let t=e.constructor&&e.constructor.prototype;return B(t)&&t.hasOwnProperty(`isPrototypeOf`)},Nn=typeof window<`u`&&window.HTMLElement!==void 0&&typeof document<`u`;function V(e){if(e instanceof Date)return new Date(e);let t=typeof FileList<`u`&&e instanceof FileList;if(Nn&&(e instanceof Blob||t))return e;let n=Array.isArray(e);if(!n&&!(B(e)&&Mn(e)))return e;let r=n?[]:Object.create(Object.getPrototypeOf(e));for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=V(e[t]));return r}var H={BLUR:`blur`,FOCUS_OUT:`focusout`,CHANGE:`change`,SUBMIT:`submit`,TRIGGER:`trigger`,VALID:`valid`},U={onBlur:`onBlur`,onChange:`onChange`,onSubmit:`onSubmit`,onTouched:`onTouched`,all:`all`},W={max:`max`,min:`min`,maxLength:`maxLength`,minLength:`minLength`,pattern:`pattern`,required:`required`,validate:`validate`},Pn=`root`,Fn=[`__proto__`,`constructor`,`prototype`],In=/^\w*$/,Ln=e=>In.test(e),G=e=>e===void 0,Rn=/[.[\]'"]/,zn=e=>e.split(Rn).filter(Boolean),K=(e,t,n)=>{if(!t||!B(e))return n;let r=Ln(t)?[t]:zn(t);if(r.some(e=>Fn.includes(e)))return n;let i=r.reduce((e,t)=>z(e)?void 0:e[t],e);return G(i)||i===e?G(e[t])?n:e[t]:i},q=e=>typeof e==`boolean`,J=e=>typeof e==`function`,Y=(e,t,n)=>{let r=-1,i=Ln(t)?[t]:zn(t),a=i.length,o=a-1;for(;++r<a;){let t=i[r],a=n;if(r!==o){let n=e[t];a=B(n)||Array.isArray(n)?n:isNaN(+i[r+1])?{}:[]}if(Fn.includes(t))return;e[t]=a,e=e[t]}},Bn=I.createContext(null);Bn.displayName=`HookFormControlContext`;var Vn=()=>I.useContext(Bn),Hn=(e,t,n,r=!0)=>{let i={};for(let a in e)Object.defineProperty(i,a,{get:()=>{let i=a;return t._proxyFormState[i]!==U.all&&(t._proxyFormState[i]=!r||U.all),n&&(n[i]=!0),e[i]}});return i},Un=Nn?I.useLayoutEffect:I.useEffect;function Wn(e){let t=Vn(),{control:n=t,disabled:r,name:i,exact:a}=e||{},[o,s]=I.useState(()=>({...n._formState,defaultValues:n._defaultValues})),c=I.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,validatingFields:!1,isValidating:!1,isValid:!1,errors:!1});return Un(()=>n._subscribe({name:i,formState:c.current,exact:a,callback:e=>{!r&&s({...n._formState,...e,defaultValues:n._defaultValues})}}),[i,r,a]),I.useEffect(()=>{c.current.isValid&&n._setValid(!0)},[n]),I.useMemo(()=>Hn(o,n,c.current,!1),[o,n])}var X=e=>typeof e==`string`,Gn=(e,t,n,r,i)=>X(e)?(r&&t.watch.add(e),K(n,e,i)):Array.isArray(e)?e.map(e=>(r&&t.watch.add(e),K(n,e))):(r&&(t.watchAll=!0),n),Kn=e=>z(e)||!kn(e),qn=(e,t)=>t.length===0&&!Array.isArray(e)&&!Mn(e);function Z(e,t,n=new WeakMap){if(e===t)return!0;if(Kn(e)||Kn(t))return Object.is(e,t);if(R(e)&&R(t))return Object.is(e.getTime(),t.getTime());let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;if(qn(e,r)||qn(t,i))return Object.is(e,t);if(!r.length&&Array.isArray(e)!==Array.isArray(t))return!1;let a=n.get(e);if(a&&a.has(t))return!0;if(a)a.add(t);else{let r=new WeakSet;r.add(t),n.set(e,r)}for(let i of r){let r=e[i];if(!(i in t))return!1;if(i!==`ref`){let e=t[i];if(R(r)&&R(e)||(B(r)||Array.isArray(r))&&(B(e)||Array.isArray(e))?!Z(r,e,n):!Object.is(r,e))return!1}}return!0}function Jn(e){let t=Vn(),{control:n=t,name:r,defaultValue:i,disabled:a,exact:o,compute:s}=e||{},c=I.useRef(i),l=I.useRef(s),u=I.useRef(void 0),d=I.useRef(n),f=I.useRef(r);l.current=s;let[p,m]=I.useState(()=>{let e=n._getWatch(r,c.current);return l.current?l.current(e):e}),h=I.useCallback(e=>{let t=Gn(r,n._names,e||n._formValues,!1,c.current);return l.current?l.current(t):t},[n._formValues,n._names,r]),g=I.useCallback(e=>{if(!a){let t=Gn(r,n._names,e||n._formValues,!1,c.current);if(l.current){let e=l.current(t);Z(e,u.current)||(m(e),u.current=e)}else m(t)}},[n._formValues,n._names,a,r]);Un(()=>((d.current!==n||!Z(f.current,r))&&(d.current=n,f.current=r,g()),n._subscribe({name:r,formState:{values:!0},exact:o,callback:e=>{g(e.values)}})),[n,o,r,g]),I.useEffect(()=>n._removeUnmounted());let _=d.current!==n,v=f.current,y=I.useMemo(()=>{if(a)return null;let e=!_&&!Z(v,r);return _||e?h():null},[a,_,r,v,h]);return y===null?p:y}function Yn(e){let t=Vn(),{name:n,disabled:r,control:i=t,shouldUnregister:a,defaultValue:o,exact:s=!0}=e,c=jn(i._names.array,n),l=Jn({control:i,name:n,defaultValue:I.useMemo(()=>K(i._formValues,n,K(i._defaultValues,n,o)),[i,n,o]),exact:s}),u=Wn({control:i,name:n,exact:s}),d=I.useRef(e),f=I.useRef(null),p=I.useRef(i.register(n,{...e.rules,value:l,...q(e.disabled)?{disabled:e.disabled}:{}}));d.current=e;let m=I.useMemo(()=>Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!K(u.errors,n)},isDirty:{enumerable:!0,get:()=>!!K(u.dirtyFields,n)},isTouched:{enumerable:!0,get:()=>!!K(u.touchedFields,n)},isValidating:{enumerable:!0,get:()=>!!K(u.validatingFields,n)},error:{enumerable:!0,get:()=>K(u.errors,n)}}),[u,n]),h=I.useCallback(e=>{let t=An(e);return K(i._fields,n)||(p.current=i.register(n,{...d.current.rules,value:t})),p.current.onChange({target:{value:An(e),name:n},type:H.CHANGE})},[n,i]),g=I.useCallback(()=>p.current.onBlur({target:{value:K(i._formValues,n),name:n},type:H.BLUR}),[n,i._formValues]),_=I.useCallback(e=>{e&&(f.current={focus:()=>J(e.focus)&&e.focus(),select:()=>J(e.select)&&e.select(),setCustomValidity:t=>J(e.setCustomValidity)&&e.setCustomValidity(t),reportValidity:()=>J(e.reportValidity)&&e.reportValidity()});let t=K(i._fields,n);t&&t._f&&e&&(t._f.ref=f.current)},[i._fields,n]),v=I.useMemo(()=>({name:n,value:l,...q(r)||u.disabled?{disabled:u.disabled||r}:{},onChange:h,onBlur:g,ref:_}),[n,r,u.disabled,h,g,_,l]);return I.useEffect(()=>{let e=i._options.shouldUnregister||a;i.register(n,{...d.current.rules,...q(d.current.disabled)?{disabled:d.current.disabled}:{}});let t=(e,t)=>{let n=K(i._fields,e);n&&n._f&&(n._f.mount=t)};if(t(n,!0),e){let e=V(K(a?i._defaultValues:i._options.values||i._defaultValues,n,K(i._options.defaultValues,n,d.current.defaultValue)));Y(i._defaultValues,n,e),G(K(i._formValues,n))&&Y(i._formValues,n,e)}if(!c&&i.register(n),f.current){let e=K(i._fields,n);e&&e._f&&(e._f.ref=f.current)}return()=>{(c?e&&!i._state.action:e)?i.unregister(n):t(n,!1)}},[n,i,c,a]),I.useEffect(()=>{i._setDisabledField({disabled:r,name:n})},[r,n,i]),I.useMemo(()=>({field:v,formState:u,fieldState:m}),[v,u,m])}var Xn=e=>e.render(Yn(e)),Zn=I.createContext(null);Zn.displayName=`HookFormContext`;var Qn=()=>I.useContext(Zn),$n=({children:e,watch:t,getValues:n,getFieldState:r,setError:i,clearErrors:a,setValue:o,setValues:s,trigger:c,formState:l,resetField:u,reset:d,handleSubmit:f,unregister:p,control:m,register:h,setFocus:g,subscribe:_})=>{let v=I.useMemo(()=>({watch:t,getValues:n,getFieldState:r,setError:i,clearErrors:a,setValue:o,setValues:s,trigger:c,formState:l,resetField:u,reset:d,handleSubmit:f,unregister:p,control:m,register:h,setFocus:g,subscribe:_}),[a,m,l,r,n,f,h,d,u,i,g,o,s,_,c,p,t]);return I.createElement(Zn.Provider,{value:v},I.createElement(Bn.Provider,{value:v.control},e))},er=(e,t,n,r,i)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:i||!0}}:{},tr=e=>Array.isArray(e)?e.filter(Boolean):[],nr=e=>Array.isArray(e)?e:[e],rr=()=>{let e=[];return{get observers(){return e},next:t=>{for(let n of e)n.next&&n.next(t)},subscribe:t=>(e.push(t),{unsubscribe:()=>{e=e.filter(e=>e!==t)}}),unsubscribe:()=>{e=[]}}};function ir(e,t){let n={};for(let r in e)if(e.hasOwnProperty(r)){let i=e[r],a=t[r];if(i&&B(i)&&a){let e=ir(i,a);B(e)&&(n[r]=e)}else e[r]&&(n[r]=a)}return n}var Q=e=>B(e)&&!Object.keys(e).length,ar=e=>e.type===`file`,or=e=>{if(!Nn)return!1;let t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},sr=e=>e.type===`select-multiple`,cr=e=>e.type===`radio`,lr=e=>cr(e)||On(e),ur=e=>or(e)&&e.isConnected;function dr(e,t){let n=t.slice(0,-1).length,r=0;for(;r<n;){if(z(e)){e=void 0;break}e=e[t[r]],r++}return e}function fr(e){for(let t in e)if(e.hasOwnProperty(t)&&!G(e[t]))return!1;return!0}function $(e,t){if(X(t)&&Object.prototype.hasOwnProperty.call(e,t))return delete e[t],e;let n=Array.isArray(t)?t:Ln(t)?[t]:zn(t),r=n.length===1?e:dr(e,n),i=n.length-1,a=n[i];return r&&delete r[a],i!==0&&(B(r)&&Q(r)||Array.isArray(r)&&fr(r))&&$(e,n.slice(0,-1)),e}var pr=e=>{for(let t in e)if(J(e[t]))return!0;return!1};function mr(e){return Array.isArray(e)||B(e)&&!pr(e)}function hr(e,t={}){for(let n in e){let r=e[n];mr(r)?(t[n]=Array.isArray(r)?[]:{},hr(r,t[n])):G(r)||(t[n]=!0)}return t}function gr(e){if(e!==!1){if(e===!0)return!0;if(Array.isArray(e)){let t=e.map(e=>gr(e));return t.some(e=>e!==void 0)?t:void 0}if(B(e)){let t={};for(let n in e){let r=gr(e[n]);G(r)||(t[n]=r)}return Object.keys(t).length?t:void 0}}}function _r(e,t,n){n||=hr(t);for(let r in e){let i=e[r];if(mr(i))G(t)||Kn(n[r])?n[r]=hr(i,Array.isArray(i)?[]:{}):_r(i,z(t)?{}:t[r],n[r]);else{let e=t[r];n[r]=!Z(i,e)}}return gr(n)||{}}var vr={value:!1,isValid:!1},yr={value:!0,isValid:!0},br=e=>{if(Array.isArray(e)){if(e.length>1){let t=e.filter(e=>e&&e.checked&&!e.disabled).map(e=>e.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!G(e[0].attributes.value)?G(e[0].value)||e[0].value===``?yr:{value:e[0].value,isValid:!0}:yr:vr}return vr},xr=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>G(e)?e:t?e===``?NaN:e&&+e:n&&X(e)?new Date(e):r?r(e):e,Sr={isValid:!1,value:null},Cr=e=>Array.isArray(e)?e.reduce((e,t)=>t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:e,Sr):Sr;function wr(e){let t=e.ref;return ar(t)?t.files:cr(t)?Cr(e.refs).value:sr(t)?[...t.selectedOptions].map(({value:e})=>e):On(t)?br(e.refs).value:xr(G(t.value)?e.ref.value:t.value,e)}var Tr=(e,t,n,r)=>{let i={};for(let n of e){let e=K(t,n);e&&Y(i,n,e._f)}return{criteriaMode:n,names:[...e],fields:i,shouldUseNativeValidation:r}},Er=e=>e instanceof RegExp,Dr=e=>G(e)?e:Er(e)?e.source:B(e)?Er(e.value)?e.value.source:e.value:e,Or=e=>({isOnSubmit:!e||e===U.onSubmit,isOnBlur:e===U.onBlur,isOnChange:e===U.onChange,isOnAll:e===U.all,isOnTouch:e===U.onTouched}),kr=`AsyncFunction`,Ar=e=>{if(!e||!e.validate)return!1;if(J(e.validate))return e.validate.constructor.name===kr;if(B(e.validate)){for(let t in e.validate)if(e.validate[t].constructor.name===kr)return!0}return!1},jr=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),Mr=(e,t,n)=>{if(n)return!1;if(t.watchAll||t.watch.has(e))return!0;for(let n of t.watch)if(e.startsWith(n)&&e.charAt(n.length)===`.`)return!0;return!1},Nr=(e,t,n,r)=>{for(let i of n||Object.keys(e)){let n=K(e,i);if(n){let{_f:e,...a}=n;if(e){if(e.refs&&e.refs[0]&&t(e.refs[0],i)&&!r||e.ref&&t(e.ref,e.name)&&!r)return!0;if(Nr(a,t))break}else if(B(a)&&Nr(a,t))break}}};function Pr(e,t,n){let r=K(e,n);if(r||Ln(n))return{error:r,name:n};let i=n.split(`.`);for(;i.length;){let r=i.join(`.`),a=K(t,r),o=K(e,r);if(a&&!Array.isArray(a)&&n!==r)return{name:n};if(o&&o.type)return{name:r,error:o};if(o&&o.root&&o.root.type)return{name:`${r}.root`,error:o.root};i.pop()}return{name:n}}var Fr=(e,t,n,r)=>{n(e);let{name:i,...a}=e,o=Object.keys(a);return!o.length||r&&o.length>=Object.keys(t).length||o.find(e=>t[e]===(!r||U.all))},Ir=(e,t,n)=>!e||!t||e===t||nr(e).some(e=>e&&(n?e===t:e.startsWith(t)||t.startsWith(e))),Lr=(e,t,n,r,i)=>i.isOnAll?!1:!n&&i.isOnTouch?!(t||e):(n?r.isOnBlur:i.isOnBlur)?!e:(n?r.isOnChange:i.isOnChange)?e:!0,Rr=(e,t)=>!tr(K(e,t)).length&&$(e,t),zr=(e,t,n)=>{let r=K(e,n),i=Array.isArray(r)?r:[];return Y(i,Pn,t[n]),Y(e,n,i),e};function Br(e,t,n=`validate`){if(X(e)||Array.isArray(e)&&e.every(X)||q(e)&&!e)return{type:n,message:X(e)?e:``,ref:t}}var Vr=e=>B(e)&&!Er(e)?e:{value:e,message:``},Hr=async(e,t,n,r,i,a)=>{let{ref:o,refs:s,required:c,maxLength:l,minLength:u,min:d,max:f,pattern:p,validate:m,name:h,valueAsNumber:g,mount:_}=e._f,v=K(n,h);if(!_||t.has(h))return{};let y=s?s[0]:o,b=e=>{if(i&&y.reportValidity){let t=q(e)?``:e||``;s?s.forEach(e=>e.setCustomValidity(t)):y.setCustomValidity(t),y.reportValidity()}},x={},ee=cr(o),S=On(o),C=ee||S,w=(g||ar(o))&&G(o.value)&&G(v)||or(o)&&o.value===``||v===``||Array.isArray(v)&&!v.length,T=er.bind(null,h,r,x),E=(e,t,n,r=W.maxLength,i=W.minLength)=>{let a=e?t:n;x[h]={type:e?r:i,message:a,ref:o,...T(e?r:i,a)}};if(a?!Array.isArray(v)||!v.length:c&&(!C&&(w||z(v))||q(v)&&!v||S&&!br(s).isValid||ee&&!Cr(s).isValid)){let{value:e,message:t}=X(c)?{value:!!c,message:c}:Vr(c);if(e&&(x[h]={type:W.required,message:t,ref:y,...T(W.required,t)},!r))return b(t),x}if(!w&&(!z(d)||!z(f))){let e,t,n=Vr(f),i=Vr(d);if(!z(v)&&!isNaN(v)){let r=o.valueAsNumber||v&&+v;z(n.value)||(e=r>n.value),z(i.value)||(t=r<i.value)}else{let r=o.valueAsDate||new Date(v),a=e=>new Date(new Date().toDateString()+` `+e),s=o.type==`time`,c=o.type==`week`;X(n.value)&&v&&(e=s?a(v)>a(n.value):c?v>n.value:r>new Date(n.value)),X(i.value)&&v&&(t=s?a(v)<a(i.value):c?v<i.value:r<new Date(i.value))}if((e||t)&&(E(!!e,n.message,i.message,W.max,W.min),!r))return b(x[h].message),x}if((l||u)&&!w&&(X(v)||a&&Array.isArray(v))){let e=Vr(l),t=Vr(u),n=!z(e.value)&&v.length>+e.value,i=!z(t.value)&&v.length<+t.value;if((n||i)&&(E(n,e.message,t.message),!r))return b(x[h].message),x}if(p&&!w&&X(v)){let{value:e,message:t}=Vr(p);if(Er(e)&&!v.match(e)&&(x[h]={type:W.pattern,message:t,ref:o,...T(W.pattern,t)},!r))return b(t),x}if(m){if(J(m)){let e=Br(await m(v,n),y);if(e&&(x[h]={...e,...T(W.validate,e.message)},!r))return b(e.message),x}else if(B(m)){let e={};for(let t in m){if(!Q(e)&&!r)break;let i=Br(await m[t](v,n),y,t);i&&(e={...i,...T(t,i.message)},b(i.message),r&&(x[h]=e))}if(!Q(e)&&(x[h]={ref:y,...e},!r))return x}}return b(!0),x},Ur={mode:U.onSubmit,reValidateMode:U.onChange,shouldFocusError:!0},Wr=`form`,Gr={submitCount:0,isDirty:!1,isReady:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{}};function Kr(e={}){let t={...Ur,...e},n={...V(Gr),isLoading:J(t.defaultValues),errors:t.errors||{},disabled:t.disabled||!1},r={},i=(B(t.defaultValues)||B(t.values))&&V(t.defaultValues||t.values)||{},a=t.shouldUnregister?{}:V(i),o={action:!1,mount:!1,watch:!1,keepIsValid:!1},s={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set,registerName:new Set},c,l=0,u=0,d=Or(t.mode),f=Or(t.reValidateMode),p={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},m={...p},h={...m},g={array:rr(),state:rr()},_=t.criteriaMode===U.all,v=e=>t=>{clearTimeout(l),l=setTimeout(e,t)},y=async e=>{if(!o.keepIsValid&&!t.disabled&&(m.isValid||h.isValid||e)){let e;t.resolver?(e=Q((await O()).errors),b()):e=await k({fields:r,onlyCheckValid:!0,eventType:H.VALID}),e!==n.isValid&&g.state.next({isValid:e})}},b=(e,r)=>{!t.disabled&&(m.isValidating||m.validatingFields||h.isValidating||h.validatingFields)&&((e||Array.from(s.mount)).forEach(e=>{e&&(r?Y(n.validatingFields,e,r):$(n.validatingFields,e))}),g.state.next({validatingFields:n.validatingFields,isValidating:!Q(n.validatingFields)}))},x=()=>{n.dirtyFields=_r(i,a)},ee=(e,i=[],s,c,l=!0,u=!0)=>{if(c&&s&&!t.disabled){if(o.action=!0,u&&Array.isArray(K(r,e))){let t=s(K(r,e),c.argA,c.argB);l&&Y(r,e,t)}if(u&&Array.isArray(K(n.errors,e))){let t=s(K(n.errors,e),c.argA,c.argB);l&&Y(n.errors,e,t),Rr(n.errors,e)}if((m.touchedFields||h.touchedFields)&&u&&Array.isArray(K(n.touchedFields,e))){let t=s(K(n.touchedFields,e),c.argA,c.argB);l&&Y(n.touchedFields,e,t)}(m.dirtyFields||h.dirtyFields)&&x(),g.state.next({name:e,isDirty:A(e,i),dirtyFields:n.dirtyFields,errors:n.errors,isValid:n.isValid})}else Y(a,e,i)},S=(e,t)=>{Y(n.errors,e,t),n.errors={...n.errors},g.state.next({errors:n.errors})},C=e=>{n.errors=e,g.state.next({errors:n.errors,isValid:!1})},w=e=>{let t=Ln(e)?[e]:zn(e),n=a,r=i;for(let e=0;e<t.length-1;e++){let i=t[e];if(n=z(n)?n:n[i],r=z(r)?r:r[i],n===null&&r!==null)return!0}return!1},T=(t,c,l,u)=>{let d=K(r,t);if(d){if(w(t))return;let r=G(K(a,t)),f=K(a,t,G(l)?K(i,t):l);G(f)||u&&u.defaultChecked||c?Y(a,t,c?f:wr(d._f)):M(t,f),o.mount&&!o.action&&(y(),r&&n.isDirty&&(m.isDirty||h.isDirty)&&(A()||(n.isDirty=!1,g.state.next({...n}))),e.shouldUnregister&&r&&!G(K(a,t))&&Mr(t,s)&&(o.watch=!0))}},E=(e,r,o,s,c)=>{let l=!1,u=!1,d={name:e};if(!t.disabled){if(!o||s){let t=Z(K(i,e),r);(m.isDirty||h.isDirty)&&(u=n.isDirty,n.isDirty=d.isDirty=!t||A(),l=u!==d.isDirty),u=!!K(n.dirtyFields,e),t===n.isDirty?t?$(n.dirtyFields,e):Y(n.dirtyFields,e,!0):n.dirtyFields=_r(i,a),d.dirtyFields=n.dirtyFields,l||=(m.dirtyFields||h.dirtyFields)&&u!==!t}if(o){let t=K(n.touchedFields,e);t||(Y(n.touchedFields,e,o),d.touchedFields=n.touchedFields,l||=(m.touchedFields||h.touchedFields)&&t!==o)}l&&c&&g.state.next(d)}return l?d:{}},D=(e,r,i,a)=>{let o=K(n.errors,e),s=(m.isValid||h.isValid)&&q(r)&&n.isValid!==r;if(t.delayError&&i?(c=v(()=>S(e,i)),c(t.delayError)):(clearTimeout(l),c=null,i?Y(n.errors,e,i):$(n.errors,e),n.errors={...n.errors}),(i?!Z(o,i):o)||!Q(a)||s){let t={...a,...s&&q(r)?{isValid:r}:{},errors:n.errors,name:e};n={...n,...t},g.state.next(t)}},O=async e=>(b(e,!0),await t.resolver(a,t.context,Tr(e||s.mount,r,t.criteriaMode,t.shouldUseNativeValidation))),te=async e=>{let{errors:t}=await O(e);if(b(e),e){for(let r of e){let e=K(t,r);e?s.array.has(r)&&B(e)&&!Object.keys(e).some(e=>!Number.isNaN(Number(e)))?zr(n.errors,{[r]:e},r):Y(n.errors,r,e):$(n.errors,r)}n.errors={...n.errors}}else n.errors=t;return t},ne=async({name:t,eventType:r})=>{if(e.validate){let i=await e.validate({formValues:a,formState:n,name:t,eventType:r});if(B(i))for(let e in i){let t=i[e];t&&he(`${Wr}.${e}`,{message:X(t.message)?t.message:``,type:t.type||W.validate})}else X(i)||!i?he(Wr,{message:i||``,type:W.validate}):me(Wr);return i}return!0},k=async({fields:r,onlyCheckValid:i,name:o,eventType:c,context:l={valid:!0,runRootValidation:!1}})=>{if(e.validate&&(l.runRootValidation=!0,!await ne({name:o,eventType:c})&&(l.valid=!1,i)))return l.valid;for(let o in r){let u=r[o];if(u){let{_f:r,...d}=u;if(r){let o=s.array.has(r.name),c=u._f&&Ar(u._f),d=m.validatingFields||m.isValidating||h.validatingFields||h.isValidating;c&&d&&b([r.name],!0);let f=await Hr(u,s.disabled,a,_,t.shouldUseNativeValidation&&!i,o);if(c&&d&&b([r.name]),f[r.name]&&(l.valid=!1,i)||(!i&&(K(f,r.name)?o?zr(n.errors,f,r.name):Y(n.errors,r.name,f[r.name]):$(n.errors,r.name)),e.shouldUseNativeValidation&&f[r.name]))break}!Q(d)&&await k({context:l,onlyCheckValid:i,fields:d,name:o,eventType:c})}}return l.valid},re=()=>{for(let e of s.unMount){let t=K(r,e);t&&(t._f.refs?t._f.refs.every(e=>!ur(e)):!ur(t._f.ref))&&ve(e)}s.unMount=new Set},A=(e,n)=>!t.disabled&&(e&&n&&Y(a,e,n),!Z(o.mount?a:i,i)),ie=(e,t,n)=>Gn(e,s,{...o.mount?a:G(t)?i:X(e)?{[e]:t}:t},n,t),j=e=>tr(K(o.mount?a:i,e,t.shouldUnregister?K(i,e,[]):[])),M=(e,t,n={},i=!1,o=!1)=>{let s=K(r,e),c=t;if(s){let n=s._f;n&&(!n.disabled&&Y(a,e,xr(t,n)),c=or(n.ref)&&z(t)?``:t,sr(n.ref)?[...n.ref.options].forEach(e=>e.selected=c.includes(e.value)):n.refs?On(n.ref)?n.refs.forEach(e=>{(!e.defaultChecked||!e.disabled)&&(Array.isArray(c)?e.checked=!!c.find(t=>t===e.value):e.checked=c===e.value||!!c)}):n.refs.forEach(e=>e.checked=e.value===c):ar(n.ref)?n.ref.value=``:(n.ref.value=c,!n.ref.type&&!o&&g.state.next({name:e,values:i?a:V(a)})))}(n.shouldDirty||n.shouldTouch)&&E(e,c,n.shouldTouch,n.shouldDirty,!o),n.shouldValidate&&de(e)},ae=(e,t,n,i=!1,a=!1)=>{for(let o in t){if(!t.hasOwnProperty(o))return;let c=t[o],l=e+`.`+o,u=K(r,l);(s.array.has(e)||B(c)||u&&!u._f)&&!R(c)?ae(l,c,n,i,a):M(l,c,n,i,a)}},oe=(e,t,i,c,l=!1)=>{let u=K(r,e),d=s.array.has(e),f=c?t:V(t),p=Z(K(a,e),f);if(p||Y(a,e,f),d)g.array.next({name:e,values:c?a:V(a)}),(m.isDirty||m.dirtyFields||h.isDirty||h.dirtyFields)&&i.shouldDirty&&(x(),l||g.state.next({name:e,dirtyFields:n.dirtyFields,isDirty:A(e,f)}));else{let t=Array.isArray(f)&&!f.length||Q(f);!u||u._f||z(f)||t?M(e,f,i,c,l):ae(e,f,i,c,l)}if(!p&&!l){let t=Mr(e,s),r=c?a:V(a);g.state.next({...t&&n,name:o.mount||t?e:void 0,values:r})}},se=(e,t,n={})=>oe(e,t,n,!1),ce=(e,t={})=>{let r=J(e)?e(a):e;if(!Z(a,r)){a={...a,...r};for(let e of s.mount)oe(e,K(r,e),t,!0,!0);g.state.next({...n,name:void 0,type:void 0,...u?{values:a}:{}}),t.shouldValidate&&y()}},le=async i=>{o.mount=!0;let l=i.target,p=l.name,v=!0,x=K(r,p),ee=e=>{v=Number.isNaN(e)||R(e)&&isNaN(e.getTime())||Z(e,K(a,p,e))};if(x){let o,S,C=l.type?wr(x._f):An(i),w=i.type===H.BLUR||i.type===H.FOCUS_OUT,T=!jr(x._f)&&!e.validate&&!t.resolver&&!K(n.errors,p)&&!x._f.deps,te=T||Lr(w,K(n.touchedFields,p),n.isSubmitted,f,d),re=Mr(p,s,w);Y(a,p,C),w?(!l||!l.readOnly)&&(x._f.onBlur&&x._f.onBlur(i),c&&c(0)):x._f.onChange&&x._f.onChange(i);let A=E(p,C,w),ie=!Q(A)||re;if(!w&&g.state.next({name:p,type:i.type,...u?{values:V(a)}:{}}),te)return(!T||!n.isValid)&&(m.isValid||h.isValid)&&(t.mode===`onBlur`?w&&y():w||y()),ie&&g.state.next({name:p,...re?{}:A});if(!t.resolver&&e.validate&&await ne({name:p,eventType:i.type}),!w&&re&&g.state.next({...n}),t.resolver){let{errors:e}=await O([p]);if(b([p]),ee(C),!v){!Q(A)&&g.state.next(A);return}let t=Pr(n.errors,r,p),i=Pr(e,r,t.name||p);o=i.error,p=i.name,S=Q(e)}else b([p],!0),o=(await Hr(x,s.disabled,a,_,t.shouldUseNativeValidation))[p],b([p]),ee(C),v&&(o?S=!1:(m.isValid||h.isValid)&&(S=await k({fields:r,onlyCheckValid:!0,name:p,eventType:i.type})));v&&(x._f.deps&&(!Array.isArray(x._f.deps)||x._f.deps.length>0)&&de(x._f.deps),D(p,S,o,A))}},ue=(e,t)=>{if(K(n.errors,t)&&e.focus)return e.focus(),1},de=async(e,i={})=>{let a,o,c=nr(e);if(t.resolver){let t=await te(G(e)?e:c);a=Q(t),o=e?!c.some(e=>K(t,e)):a}else e?(o=(await Promise.all(c.map(async e=>{let t=K(r,e);return await k({fields:t&&t._f?{[e]:t}:t,eventType:H.TRIGGER})}))).every(Boolean),!(!o&&!n.isValid)&&y()):o=a=await k({fields:r,name:e,eventType:H.TRIGGER});return g.state.next({...!X(e)||(m.isValid||h.isValid)&&a!==n.isValid?{}:{name:e},...t.resolver||!e?{isValid:a}:{},errors:n.errors}),i.shouldFocus&&!o&&Nr(r,ue,e?c:s.mount),o},fe=(e,t)=>{let r={...o.mount?a:i};return t&&(r=ir(t.dirtyFields?n.dirtyFields:n.touchedFields,r)),G(e)?r:X(e)?K(r,e):e.map(e=>K(r,e))},pe=(e,t)=>({invalid:!!K((t||n).errors,e),isDirty:!!K((t||n).dirtyFields,e),error:K((t||n).errors,e),isValidating:!!K(n.validatingFields,e),isTouched:!!K((t||n).touchedFields,e)}),me=e=>{let t=e?nr(e):void 0;t?.forEach(e=>$(n.errors,e)),t?t.forEach(e=>{g.state.next({name:e,errors:n.errors})}):g.state.next({errors:{}})},he=(e,t,i)=>{let a=(K(r,e,{_f:{}})._f||{}).ref,{ref:o,message:s,type:c,...l}=K(n.errors,e)||{};Y(n.errors,e,{...l,...t,ref:a}),g.state.next({name:e,errors:n.errors,isValid:!1}),i&&i.shouldFocus&&a&&a.focus&&a.focus()},ge=(e,t)=>{if(J(e)){u++;let{unsubscribe:n}=g.state.subscribe({next:n=>`values`in n&&e(n.values||ie(void 0,t),n)}),r=!1;return{unsubscribe:()=>{r||(r=!0,u--,n())}}}return ie(e,t,!0)},N=e=>{let t=!!e.formState?.values;t&&u++;let{unsubscribe:r}=g.state.subscribe({next:t=>{if(Ir(e.name,t.name,e.exact)&&Fr(t,e.formState||m,Ee,e.reRenderRoot)){let r={...a};e.callback({values:r,...n,...t,defaultValues:i})}}});if(!t)return r;let o=!1;return()=>{o||(o=!0,u--,r())}},_e=e=>(o.mount=!0,h={...h,...e.formState},N({...e,formState:{...p,...e.formState}})),ve=(e,o={})=>{for(let c of e?nr(e):s.mount)s.mount.delete(c),s.array.delete(c),o.keepValue||($(r,c),$(a,c)),!o.keepError&&$(n.errors,c),!o.keepDirty&&$(n.dirtyFields,c),!o.keepTouched&&$(n.touchedFields,c),!o.keepIsValidating&&$(n.validatingFields,c),!t.shouldUnregister&&!o.keepDefaultValue&&$(i,c);g.state.next({values:V(a)}),g.state.next({...n,...o.keepDirty?{isDirty:A()}:{}}),!o.keepIsValid&&y()},ye=({disabled:e,name:t})=>{if(q(e)&&o.mount||e||s.disabled.has(t)){let n=s.disabled.has(t)!==!!e;e?s.disabled.add(t):s.disabled.delete(t),n&&o.mount&&!o.action&&y()}},be=(e,n={})=>{let a=K(r,e),c=q(n.disabled)||q(t.disabled),l=!s.registerName.has(e)&&a&&a._f&&!a._f.mount;return Y(r,e,{...a||{},_f:{...a&&a._f?a._f:{ref:{name:e}},name:e,mount:!0,...n}}),s.mount.add(e),a&&!l?ye({disabled:q(n.disabled)?n.disabled:t.disabled,name:e}):T(e,!0,n.value),{...c?{disabled:n.disabled||t.disabled}:{},...t.progressive?{required:!!n.required,min:Dr(n.min),max:Dr(n.max),minLength:Dr(n.minLength),maxLength:Dr(n.maxLength),pattern:Dr(n.pattern)}:{},name:e,onChange:le,onBlur:le,ref:c=>{if(c){s.registerName.add(e),be(e,n),s.registerName.delete(e),a=K(r,e);let t=G(c.value)&&c.querySelectorAll&&c.querySelectorAll(`input,select,textarea`)[0]||c,o=lr(t),l=a._f.refs||[];if(o?l.find(e=>e===t):t===a._f.ref)return;Y(r,e,{_f:{...a._f,...o?{refs:[...l.filter(ur),t,...Array.isArray(K(i,e))?[{}]:[]],ref:{type:t.type,name:e}}:{ref:t}}}),T(e,!1,void 0,t)}else a=K(r,e,{}),a._f&&(a._f.mount=!1),(t.shouldUnregister||n.shouldUnregister)&&!(jn(s.array,e)&&o.action)&&s.unMount.add(e)}}},xe=()=>t.shouldFocusError&&!t.shouldUseNativeValidation&&Nr(r,ue,s.mount),P=e=>{q(e)&&(g.state.next({disabled:e}),Nr(r,(t,n)=>{let i=K(r,n);i&&(t.disabled=i._f.disabled||e,Array.isArray(i._f.refs)&&i._f.refs.forEach(t=>{t.disabled=i._f.disabled||e}))},0,!1))},Se=(e,i)=>async o=>{let c;o&&(o.preventDefault&&o.preventDefault(),o.persist&&o.persist());let l=V(a);if(g.state.next({isSubmitting:!0}),t.resolver){let{errors:e,values:t}=await O();b(),n.errors=e,l=V(t)}else await k({fields:r,eventType:H.SUBMIT});if(s.disabled.size)for(let e of s.disabled)$(l,e);if($(n.errors,Pn),Q(n.errors)){g.state.next({errors:{}});try{await e(l,o)}catch(e){c=e}}else i&&await i({...n.errors},o),xe(),setTimeout(xe);if(g.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:Q(n.errors)&&!c,submitCount:n.submitCount+1,errors:n.errors}),c)throw c},Ce=(e,t={})=>{K(r,e)&&(G(t.defaultValue)?se(e,V(K(i,e))):(se(e,t.defaultValue),Y(i,e,V(t.defaultValue))),t.keepTouched||$(n.touchedFields,e),t.keepDirty||($(n.dirtyFields,e),n.isDirty=t.defaultValue?A(e,V(K(i,e))):A()),t.keepError||($(n.errors,e),m.isValid&&y()),g.state.next({...n}))},we=(e,c={})=>{let l=e?V(e):i,u=V(l),d=Q(e),f=u;if(c.keepDefaultValues||(i=l),!c.keepValues){if(c.keepDirtyValues){let e=new Set([...s.mount,...Object.keys(_r(i,a))]);for(let t of Array.from(e)){let e=K(n.dirtyFields,t),r=K(a,t),i=K(f,t);e&&!G(r)?Y(f,t,r):!e&&!G(i)&&se(t,i)}}else{if(Nn&&G(e))for(let e of s.mount){let t=K(r,e);if(t&&t._f){let e=Array.isArray(t._f.refs)?t._f.refs[0]:t._f.ref;if(or(e)){let t=e.closest(`form`);if(t){t.reset();break}}}}if(c.keepFieldsRef)for(let e of s.mount)se(e,K(f,e));else r={}}if(t.shouldUnregister){if(a=c.keepDefaultValues?V(i):{},c.keepFieldsRef)for(let e of s.mount)Y(a,e,K(f,e))}else a=V(f);g.array.next({values:{...f}}),g.state.next({values:{...f}})}s={mount:c.keepDirtyValues?s.mount:new Set,unMount:new Set,array:new Set,registerName:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:``},o.mount=!m.isValid||!!c.keepIsValid||!!c.keepDirtyValues||!t.shouldUnregister&&!Q(f),o.watch=!!t.shouldUnregister,o.keepIsValid=!!c.keepIsValid,o.action=!1,c.keepErrors||(n.errors={}),g.state.next({submitCount:c.keepSubmitCount?n.submitCount:0,isDirty:d?!1:c.keepDirty?n.isDirty:c.keepValues?A():!!(c.keepDefaultValues&&!Z(e,i)),isSubmitted:c.keepIsSubmitted?n.isSubmitted:!1,dirtyFields:d?{}:c.keepDirtyValues?c.keepDefaultValues&&a?_r(i,a):n.dirtyFields:c.keepDefaultValues&&e?_r(i,e):c.keepDirty?n.dirtyFields:{},touchedFields:c.keepTouched?n.touchedFields:{},errors:c.keepErrors?n.errors:{},isSubmitSuccessful:c.keepIsSubmitSuccessful?n.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:i})},F=(e,n)=>we(J(e)?e(a):e,{...t.resetOptions,...n}),Te=(e,t={})=>{let n=K(r,e),i=n&&n._f;if(i){let e=i.refs?i.refs[0]:i.ref;e.focus&&setTimeout(()=>{e.focus(),t.shouldSelect&&J(e.select)&&e.select()})}},Ee=e=>{n={...n,...e}},De={control:{register:be,unregister:ve,getFieldState:pe,handleSubmit:Se,setError:he,_subscribe:N,_runSchema:O,_updateIsValidating:b,_focusError:xe,_getWatch:ie,_getDirty:A,_setValid:y,_setFieldArray:ee,_setDisabledField:ye,_setErrors:C,_getFieldArray:j,_reset:we,_resetDefaultValues:()=>J(t.defaultValues)&&t.defaultValues().then(e=>{F(e,t.resetOptions),g.state.next({isLoading:!1})}),_removeUnmounted:re,_disableForm:P,_subjects:g,_proxyFormState:m,get _fields(){return r},get _formValues(){return a},get _state(){return o},set _state(e){o=e},get _defaultValues(){return i},get _names(){return s},set _names(e){s=e},get _formState(){return n},get _options(){return t},set _options(e){t={...t,...e},d=Or(t.mode),f=Or(t.reValidateMode)}},subscribe:_e,trigger:de,register:be,handleSubmit:Se,watch:ge,setValue:se,setValues:ce,getValues:fe,reset:F,resetField:Ce,resetDefaultValues:(e,t={})=>{if(i=V(e),!t.keepDirty){let e=_r(i,a);n.dirtyFields=e,n.isDirty=!Q(e)}t.keepIsValid||y(),g.state.next({...n,defaultValues:i})},clearErrors:me,unregister:ve,setError:he,setFocus:Te,getFieldState:pe};return{...De,formControl:De}}function qr(e={}){let t=I.useRef(void 0),n=I.useRef(void 0),r=I.useRef(e.formControl),[i,a]=I.useState(()=>({...V(Gr),isLoading:J(e.defaultValues),errors:e.errors||{},disabled:e.disabled||!1,defaultValues:J(e.defaultValues)?void 0:e.defaultValues}));if(!t.current||e.formControl&&r.current!==e.formControl)if(r.current=e.formControl,e.formControl)t.current={...e.formControl,formState:i},e.defaultValues&&!J(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{let{formControl:n,...r}=Kr(e);t.current={...r,formState:i}}let o=t.current.control;return o._options=e,Un(()=>{let e=o._subscribe({formState:o._proxyFormState,callback:()=>a({...o._formState,defaultValues:o._defaultValues}),reRenderRoot:!0});return a(e=>({...e,isReady:!0})),o._formState.isReady=!0,e},[o]),I.useEffect(()=>o._disableForm(e.disabled),[o,e.disabled]),I.useEffect(()=>{e.mode&&(o._options.mode=e.mode),e.reValidateMode&&(o._options.reValidateMode=e.reValidateMode)},[o,e.mode,e.reValidateMode]),I.useEffect(()=>{e.errors&&(o._setErrors(e.errors),o._focusError())},[o,e.errors]),I.useEffect(()=>{e.shouldUnregister&&o._subjects.state.next({values:o._getWatch()})},[o,e.shouldUnregister]),I.useEffect(()=>{if(o._proxyFormState.isDirty){let e=o._getDirty();e!==i.isDirty&&o._subjects.state.next({isDirty:e})}},[o,i.isDirty]),I.useEffect(()=>{e.values&&!Z(e.values,n.current)?(o._reset(e.values,{keepFieldsRef:!0,...o._options.resetOptions}),o._options.resetOptions?.keepIsValid||o._setValid(),n.current=e.values,a(e=>({...e}))):o._resetDefaultValues()},[o,e.values]),I.useEffect(()=>{o._state.mount||(o._setValid(),o._state.mount=!0),o._state.watch&&(o._state.watch=!1,o._subjects.state.next({...o._formState})),o._removeUnmounted()}),t.current.formState=I.useMemo(()=>Hn(i,o),[o,i]),t.current}var Jr={lookup:{recentlyUsed:`Recently used`,allResults:`All results`,loading:`Loading…`,noOptions:`No options found`,noRecords:`No records found`,createNew:`Create new`,createNamed:`Create new "{{name}}"`,showingResults:`Showing {{shown}} of {{total}} results`,showAllResults:`Show all results ({{count}})`,selectedBadge:`Selected`,browseAll:`Browse all records`,remove:`Remove {{label}}`,selectFirst:`Select {{fields}} first`,selectRecord:`Select record`,recordCount:`{{count}} records`,recordCountOne:`1 record`,pageOf:`Page {{current}} of {{total}}`,filters:`Filters`,clear:`Clear`,yes:`Yes`,filterPlaceholder:`Filter {{label}}`,prevPage:`Previous page`,nextPage:`Next page`,jumpToPage:`Jump to page`,retry:`Retry`},common:{loading:`Loading...`,save:`Save`,cancel:`Cancel`,delete:`Delete`,edit:`Edit`,create:`Create`,search:`Search`,filter:`Filter`,reset:`Reset`,confirm:`Confirm`,close:`Close`,back:`Back`,next:`Next`,previous:`Previous`,submit:`Submit`,refresh:`Refresh`,export:`Export`,import:`Import`,yes:`Yes`,no:`No`,ok:`OK`,actions:`Actions`,more:`More`,selectAll:`Select All`,clearAll:`Clear All`,addToFavorites:`Add to favorites`,removeFromFavorites:`Remove from favorites`,noData:`No data`,noResults:`No results found`,required:`Required`,optional:`Optional`,selectOption:`Select an option`,select:`Select...`,openChat:`Open chat`,closeChat:`Close chat`,toggleSidebar:`Toggle sidebar`,package:`Package`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}} is required`,minLength:`{{field}} must be at least {{min}} characters`,maxLength:`{{field}} must be at most {{max}} characters`,min:`{{field}} must be at least {{min}}`,max:`{{field}} must be at most {{max}}`,email:`Please enter a valid email address`,url:`Please enter a valid URL`,pattern:`{{field}} format is invalid`,unique:`{{field}} must be unique`,type:`{{field}} must be a valid {{type}}`},form:{addItem:`Add item`,removeItem:`Remove item`,fieldRequired:`This field is required`,invalidFormat:`Invalid format`,saveSuccess:`Saved successfully`,saveError:`Failed to save`,unsavedChanges:`You have unsaved changes. Are you sure you want to leave?`,stepOf:`Step {{current}} of {{total}}`,createTitle:`Create {{object}}`,editTitle:`Edit {{object}}`,createDescription:`Add a new {{object}} to your database.`,editDescription:`Update details for {{object}}`,saveRecord:`Save`,create:`Create`,update:`Update`,createSuccess:`{{object}} created successfully`,updateSuccess:`{{object}} updated successfully`,deleteSuccess:`{{object}} deleted successfully`},fields:{richText:{format:`Format: {{format}}`,basicEditorHint:`Rich text editor (basic)`,placeholder:`Enter text...`}},table:{rowsPerPage:`Rows per page`,showing:`Showing {{from}} to {{to}} of {{total}}`,noRows:`No rows to display`,sortAsc:`Sort ascending`,sortDesc:`Sort descending`,filterColumn:`Filter {{column}}`,columns:`Columns`,exportCSV:`Export CSV`,exportExcel:`Export Excel`,selectRow:`Select row`,selectAllRows:`Select all rows`,expandRow:`Expand row`,collapseRow:`Collapse row`,hideColumn:`Hide column`,freezeColumn:`Freeze column`,unfreezeColumn:`Unfreeze column`,pageInfo:`Page {{current}} of {{total}}`,totalRecords:`{{count}} total`,noResults:`No results found`,noResultsHint:`Try adjusting your filters or search query.`,cancelAll:`Cancel All`,saveAll:`Save All ({{count}})`,addRecord:`Add record`,open:`Open`,search:`Search...`,modified:`{{count}} row modified`,selected:`{{count}} selected`,edit:`Edit`,delete:`Delete`},grid:{actions:`Actions`,edit:`Edit`,delete:`Delete`,export:`Export`,exportAs:`Export as {{format}}`,loading:`Loading grid...`,errorLoading:`Error loading grid`,pullToRefresh:`Pull to refresh`,refreshing:`Refreshing…`,openRecord:`Open record`,openMenu:`Open menu`,rowHeight:`Row height: {{mode}}`,empty:`Empty`,yes:`Yes`,no:`No`,systemFields:`System`,toolbar:{densityMode:`Density`,densityCompact:`Compact`,densityComfortable:`Comfortable`,densitySpacious:`Spacious`,densityCycleHint:`{{label}} (click to cycle)`,densityCycleShortHint:`Click to cycle`},import:{title:`Import {{object}}`,stepUpload:`Upload`,stepMapping:`Mapping`,stepPreview:`Preview`,uploadDescription:`Upload a CSV file to get started.`,mappingDescription:`Map CSV columns to object fields.`,previewDescription:`Review data before importing.`,dragDrop:`Drag & drop a CSV file here, or click to browse`,browseFiles:`Browse Files`,onlyCsv:`Only CSV files are supported.`,fileNeedsHeader:`File must contain a header row and at least one data row.`,mappingTemplate:`Mapping template:`,chooseTemplate:`Choose template…`,noSavedTemplates:`No saved templates`,noneOption:`— None —`,saveCurrent:`Save current`,templateName:`Template name`,save:`Save`,deleteTemplate:`Delete template`,csvColumn:`CSV Column`,mapsTo:`Maps To`,status:`Status`,skipColumn:`Skip column`,skip:`— Skip —`,mapped:`Mapped`,skipped:`Skipped`,rowsWithErrors:`{{count}} row(s) with errors`,rowsCorrected:`{{count}} row(s) corrected`,clickToFix:`— click a highlighted cell to fix it inline.`,showingRows:`Showing {{shown}} of {{total}} rows`,importing:`Importing… {{progress}}%`,importComplete:`Import Complete`,imported:`{{count}} imported`,skippedCount:`{{count}} skipped`,moreErrors:`…and {{count}} more errors`,cancel:`Cancel`,back:`Back`,next:`Next`,close:`Close`,importNRows:`Import {{count}} Rows`,importingProgress:`Importing…`,requiredMark:`*`,required:`Required`,invalidType:`Invalid {{type}}`}},calendar:{today:`Today`,month:`Month`,week:`Week`,day:`Day`,agenda:`Agenda`,allDay:`All Day`,noEvents:`No events`,newEvent:`New event`,moreEvents:`+{{count}} more`},list:{loading:`Loading records…`,recordCount:`{{count}} records`,recordCountOne:`{{count}} record`,addRecord:`Add record`,tabs:`Tabs`,allRecords:`All Records`,search:`Search`,filter:`Filter`,filterRecords:`Filter Records`,sort:`Sort`,sortRecords:`Sort Records`,group:`Group`,groupBy:`Group By`,export:`Export`,exportAs:`Export as {{format}}`,color:`Color`,rowColor:`Row Color`,colorByField:`Color by field`,clear:`Clear`,none:`None`,hideFields:`Hide fields`,noItems:`No items found`,noItemsMessage:`There are no records to display. Try adjusting your filters or adding new data.`,firstRunTitle:`Nothing here yet`,firstRunMessage:`Create your first record to get started.`,noMatches:`No matching records`,noMatchesMessage:`No records match your current filters or search. Try adjusting or clearing them.`,loadErrorTitle:`Couldn’t load records`,loadErrorMessage:`Something went wrong while loading this data. Check your connection and try again.`,retry:`Retry`,managedBy:{system:{title:`Nothing here yet`,message:`Entries appear automatically when their source action runs (e.g. Submit for Approval, Share, Invite). Trigger one of those on a source record to create a row.`},appendOnly:{title:`No events recorded`,message:`This is an immutable audit log. Rows are written by the platform when events occur — you can export the history but cannot create entries from here.`},betterAuth:{title:`No identity records`,message:`Identity rows are managed by the authentication provider. Use the dedicated identity workflows (Invite User, Reset Password, …) to create new entries.`}},showAll:`Show all`,pullToRefresh:`Pull to refresh`,refreshing:`Refreshing…`,share:`Share`,print:`Print`,hideFieldsTitle:`Hide Fields`,dataLimitReached:`Showing first {{limit}} records. More data may be available.`,viewSettings:`View settings`,viewSettingsHint:`Grouping, color, density, and visible fields.`,addGroup:`Add group field`,collapsedByDefault:`Collapsed by default`,removeGroup:`Remove`},kanban:{addCard:`Add card`,addColumn:`Add column`,moveCard:`Move card`,deleteCard:`Delete card`,deleteColumn:`Delete column`,noCards:`No cards`,cardTitlePlaceholder:`Enter card title...`},timeline:{bucket:{overdue:`Overdue`,today:`Today`,tomorrow:`Tomorrow`,thisWeek:`This week`,nextWeek:`Next week`,later:`Later`,noDate:`No date`,unassigned:`Unassigned`}},gantt:{column:{taskName:`Task Name`,start:`Start`,end:`End`},toolbar:{prevPeriod:`Previous period`,nextPeriod:`Next period`,zoomIn:`Zoom in`,zoomOut:`Zoom out`,jumpToToday:`Jump to today`,today:`Today`,thisWeek:`This week`,thisMonth:`This month`,showTaskList:`Show task list`,hideTaskList:`Hide task list`,viewMode:`Timeline granularity`,enterFullscreen:`Enter fullscreen`,exitFullscreen:`Exit fullscreen`,criticalPath:`Highlight critical path`,autoSchedule:`Auto-schedule dependencies`,exportPng:`Export as PNG`,exportPdf:`Export PDF`,saveLayout:`Save layout`,undo:`Undo`,redo:`Redo`},viewMode:{day:`Day`,week:`Week`,month:`Month`,quarter:`Quarter`,year:`Year`},row:{expand:`Expand`,collapse:`Collapse`,locate:`Locate on timeline`},aria:{taskList:`Task list`},tooltip:{days:`d`},menu:{view:`View details`,edit:`Edit inline`,delete:`Delete`,addPredecessor:`Add predecessor…`,addSuccessor:`Add successor…`,removeDependency:`Remove dependency`,noCandidates:`No available tasks`},linkType:{fs:`Finish → Start`,ss:`Start → Start`,ff:`Finish → Finish`,sf:`Start → Finish`},conflict:{title:`Schedule conflict`,body:`This move conflicts with dependency constraints. Auto-reschedule {{count}} affected task(s)?`,confirm:`Auto-reschedule`,cancel:`Keep as is`},resource:{header:`Resource`,peak:`Peak`,over:`overloaded`,empty:`No tasks to allocate.`},readOnly:`Read-only`,readOnlyHint:`Editing is disabled for this view.`},view:{editViewConfig:`Edit view config`,rename:`Rename`,duplicateView:`Duplicate View`,shareView:`Share View`,setAsDefault:`Set as Default`,pinView:`Pin View`,unpinView:`Unpin View`,changeViewType:`Change View Type`,deleteView:`Delete View`,addView:`Add View`,unsavedChanges:`Unsaved changes`,saveAsView:`Save as View`,moreViews:`{{count}} more`,activeFilters:`Active filters`,activeSort:`Active sort`,manageViews:`Manage views`,manageAllViews:`Manage all views…`,manageViewsDescription:`Reorder, rename, pin, or delete every view in this object.`,searchViews:`Search views`,addNewView:`Add new view`,done:`Done`,noViewsFound:`No views match your search.`,dragToReorder:`Drag to reorder`,defaultView:`Default view`,defaultBadge:`default`,tabActionsFor:`View actions for {{name}}`,readonlyAriaLabel:`Read-only view`,readonlyTooltip:`System view — defined in code, read-only.`},detail:{back:`Back`,edit:`Edit`,editInline:`Edit`,save:`Save`,saveChanges:`Save changes`,saving:`Saving…`,editFieldsInline:`Edit fields`,lockedByApproval:`Locked for approval`,lockedTooltip:`This record has a pending approval request; editing is locked`,cancelApproval:`Recall approval`,cancelApprovalInFlight:`Recalling…`,cancelApprovalTooltip:`Recall the pending approval request to unlock this record`,cancelApprovalFailed:`Failed to recall approval`,cancelApprovalUnavailable:`Recalling approvals is not supported on this data source`,linkCopied:`Link copied to clipboard`,linkCopyFailed:`Failed to copy link`,cancel:`Cancel`,cancelEdit:`Discard changes`,sectionMoreDetails:`More details`,concurrentUpdateTitle:`This record was modified by someone else`,concurrentUpdateDescription:`Another user saved a newer version of {{field}} while you were editing. To prevent silently overwriting their change, please choose how to resolve the conflict.`,concurrentUpdateYourEdit:`Your edit`,concurrentUpdateCurrentValue:`Current value`,concurrentUpdateUpdatedBy:`Updated by {{name}}`,concurrentUpdateUpdatedAt:`Updated at {{when}}`,concurrentUpdateReload:`Reload latest`,concurrentUpdateOverwrite:`Overwrite anyway`,concurrentUpdateCancel:`Cancel`,openInNewTab:`Open in new tab`,share:`Share`,duplicate:`Duplicate`,export:`Export`,viewHistory:`View history`,delete:`Delete`,moreActions:`More actions`,addToFavorites:`Add to favorites`,removeFromFavorites:`Remove from favorites`,previousRecord:`Previous record`,nextRecord:`Next record`,recordOf:`{{current}} of {{total}}`,recordNotFound:`Record not found`,recordNotFoundDescription:`The record you are looking for does not exist or may have been deleted.`,goBack:`Go back`,details:`Details`,related:`Related`,relatedRecords:`{{count}} records`,relatedRecordOne:`{{count}} record`,noRelatedRecords:`No related records found`,loading:`Loading...`,copyToClipboard:`Copy to clipboard`,copied:`Copied!`,deleteConfirmation:`Are you sure you want to delete this record?`,editRecord:`Edit record`,viewAll:`View All`,new:`New`,emptyValue:`—`,activity:`Activity`,history:`History`,editRow:`Edit`,deleteRow:`Delete`,deleteRowConfirmation:`Are you sure you want to delete this record?`,deleteRowTitle:`Delete record`,actions:`Actions`,previousPage:`Previous`,nextPage:`Next`,pageOf:`Page {{current}} of {{total}}`,sortBy:`Sort by`,filterPlaceholder:`Filter...`,highlightFields:`Key Fields`,comments:`Comments`,searchComments:`Search comments…`,addCommentPlaceholder:`Add a comment… (Ctrl+Enter to submit)`,noMatchingComments:`No matching comments`,noCommentsYet:`No comments yet`,pinned:`Pinned`,pin:`Pin`,unpin:`Unpin`,justNow:`just now`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`,systemActor:`System`,unknownUser:`Unknown`,createdBy:`Created by`,updatedBy:`Updated by`,dropFilesToUpload:`Drop files here or click to upload`,attachmentCount:`{{count}} attachment`,attachmentCountPlural:`{{count}} attachments`,removeAttachment:`Remove attachment`,unifiedDiff:`Unified diff`,sideBySideDiff:`Side-by-side diff`,noChanges:`No changes`,previousVersion:`Previous`,currentVersion:`Current`,discussion:`Discussion`,showDiscussion:`Show Discussion ({{count}})`,hideDiscussion:`Hide discussion`,bold:`Bold (Ctrl+B)`,italic:`Italic (Ctrl+I)`,listFormat:`List`,inlineCode:`Inline code`,mentionSomeone:`Mention someone`,preview:`Preview`,submitComment:`Submit (Ctrl+Enter)`,sendComment:`Send`,writeComment:`Write a comment…`,subscribedTooltip:`Subscribed — click to unsubscribe`,unsubscribedTooltip:`Subscribe to notifications`,firstRecord:`First record (Home)`,previousRecordKey:`Previous record (←)`,nextRecordKey:`Next record (→)`,lastRecord:`Last record (End)`,noRecords:`No records`,showEmptyRelated_one:`+ {{count}} empty`,showEmptyRelated_other:`+ {{count}} empty`,searchWhileNavigating:`Search while navigating`,searchRecords:`Search records…`,allActivity:`All Activity`,commentsOnly:`Comments Only`,fieldChangesFilter:`Field Changes`,tasksOnly:`Tasks Only`,leaveCommentPlaceholder:`Leave a comment… (Ctrl+Enter to submit)`,noActivity:`No activity recorded`,loadMore:`Load more`,edited:`(edited)`,via:`via {{source}}`,replyCount:`{{count}} reply`,replyCountPlural:`{{count}} replies`,replyPlaceholder:`Reply…`,filterActivity:`Filter activity`,openDiscussion:`Open discussion panel`,closeDiscussion:`Close discussion panel`,subscribeAriaLabel:`Subscribe to notifications`,unsubscribeAriaLabel:`Unsubscribe from notifications`,clearSearch:`Clear search`,copyEmail:`Copy email`,copyPhone:`Copy phone number`,copyRecordId:`Copy record ID`,showEmptyFields:`Show {{count}} empty fields`,hideEmptyFields:`Hide empty fields`,noValue:`No value`},chart:{noData:`No chart data available`,loading:`Loading chart...`},report:{total:`Total`,rowTotal:`Row Total`,columnTotal:`Column Total`,grandTotal:`Grand Total`,totals:`Totals`,rowsLabel:`Row`,columnsLabel:`Column`,allLabel:`(All)`,emptyLabel:`(Empty)`,loading:`Loading…`,failedToLoad:`Failed to load matrix: {{message}}`,needsAcross:"Matrix report requires at least one `groupingsAcross` field.",aggregate:{count:`Count`,countDistinct:`Distinct Count`,sum:`Sum`,avg:`Average`,min:`Min`,max:`Max`,first:`First`},editor:{breadcrumb:`Configuration`,basic:`Basic`,title:`Title`,titlePlaceholder:`e.g. Pipeline by Quarter`,description:`Description`,descriptionPlaceholder:`What does this report show?`,type:`Report type`,typeTabular:`Tabular — flat list`,typeSummary:`Summary — grouped with totals`,typeMatrix:`Matrix — pivot rows × columns`,typeJoined:`Joined — multiple blocks`,typeHelp:`Pick the layout that matches what you want to see.`,data:`Data`,objectName:`Data source`,objectNamePlaceholder:`e.g. opportunity`,objectNameHelp:`Which object should this report query?`,limit:`Row limit`,limitPlaceholder:`e.g. 100`,columns:`Columns`,columnsHint:`Pick which fields appear as columns. Add an aggregate (Sum, Count…) on Summary or Matrix reports.`,filters:`Filters`,filtersHint:`Limit the rows that go into this report.`,filtersComplex:`This report uses an advanced filter that cannot be edited here. Save will keep it unchanged.`,groupBy:`Group by`,groupByHint:`Group the data and compute subtotals.`,rows:`Rows`,rowsHint:`Group rows by these fields.`,columnsAxis:`Columns`,columnsAxisHint:`Pivot these fields across the top.`,values:`Values`,valuesHint:`Numbers shown in each cell. Pick one or more fields and add an aggregate (Sum, Count…).`,grouping:`Grouping`,addGrouping:`Add grouping`,dateGranularity:`Date bucket`,dateGranularityNone:`(use raw value)`,day:`Day`,week:`Week`,month:`Month`,quarter:`Quarter`,year:`Year`,sortAsc:`Ascending`,sortDesc:`Descending`,chart:`Chart`,chartHint:`Optional visualization rendered alongside the table.`,chartType:`Chart type`,chartTitle:`Chart title`,chartTitlePlaceholder:`Defaults to the report title`,chartXAxis:`X-axis (category)`,chartYAxis:`Y-axis (value)`,chartShowLegend:`Show legend`,chartShowDataLabels:`Show data labels`,chartNone:`(no chart)`,chartBar:`Bar`,chartLine:`Line`,chartArea:`Area`,chartPie:`Pie`,chartDonut:`Donut`,chartFunnel:`Funnel`,validationNeedsObject:`Pick a data source before adding columns.`,validationMatrixNeedsRowsCols:`Matrix reports need at least one Row and one Column.`,validationSummaryNeedsRows:`Summary reports need at least one grouping field.`,blocks:`Blocks`,blocksHint:`Each block is its own table or chart. Block-level filters are ANDed with the report filter.`,addBlock:`Add block`,removeBlock:`Remove block`,blockName:`Block name`,blockNamePlaceholder:`unique_block_name`,blockLabel:`Display label`,blockLabelPlaceholder:`Shown above the block`,blockDescription:`Description`,blockDescriptionPlaceholder:`Optional context for this block`,validationJoinedNeedsBlocks:`Joined reports need at least one block.`,validationBlockNameRequired:`Every block needs a non-empty name.`,validationBlockNameDuplicate:`Block names must be unique within the report.`,validationBlockNeedsColumns:`Every block needs at least one column.`,noneOption:`(none)`,addCondition:`Add condition`,combineLogic:`Combine with`,opContains:`contains`,opIsEmpty:`is empty`,opIsNotEmpty:`is not empty`,formatAuto:`Auto`,formatCurrency:`Currency`,formatPercent:`Percent`,formatInteger:`Integer`,formatDate:`Date`,formatDatetime:`Date & time`,columnLabelPlaceholder:`Label override`,aggregateColumn:`Aggregate`,formatColumn:`Format`,addColumns:`Add fields`,searchFields:`Search fields…`,noMatchingFields:`No fields match your search.`,noFieldsAvailable:`No fields available.`,columnsCount:`{n} column(s) selected`,columnsEmpty:`No columns selected yet.`,fieldPickerTitle:`Select fields`,fieldPickerDescription:`Pick one or more fields to add. Use the search box to narrow the list.`,fieldPickerChangeTitle:`Change field`,fieldPickerAddGroupingTitle:`Add grouping`,fieldPickerEmpty:`(pick field)`,fieldPickerSelected:`{n} selected`,fieldPickerClear:`Clear selection`,fieldPickerAdd:`Add`,fieldPickerAddN:`Add {n}`}},map:{searchLocations:`Search locations…`,locationDetails:`Location Details`,markersCount:`{{count}} markers`,invalidCoordinates:`{{count}} record with missing or invalid coordinates excluded from the map.`,invalidCoordinatesPlural:`{{count}} records with missing or invalid coordinates excluded from the map.`},workflow:{draft:`Draft`,active:`Active`,paused:`Paused`,completed:`Completed`,cancelled:`Cancelled`,save:`Save`,publish:`Publish`,addNode:`Add Node`,workflowFlow:`Workflow Flow`,properties:`Properties`,connections:`Connections`,quickConnect:`Quick Connect`,fromPlaceholder:`From...`,toPlaceholder:`To...`,connect:`Connect`,label:`Label`,type:`Type`,description:`Description`,assignee:`Assignee`,assigneeType:`Assignee Type`,user:`User`,role:`Role`,group:`Group`,expression:`Expression`,timeoutMinutes:`Timeout (minutes)`,selectNodeToEdit:`Select a node to edit its properties`,workflowTitle:`Workflow Title`,newWorkflow:`New Workflow`,outConnections:`{{count}} out`,start:`Start`,end:`End`,task:`Task`,userTask:`User Task`,serviceTask:`Service Task`,scriptTask:`Script Task`,approval:`Approval`,condition:`Condition`,parallelGateway:`Parallel Gateway`,joinGateway:`Join Gateway`,boundaryEvent:`Boundary Event`,delay:`Delay`,notification:`Notification`,webhook:`Webhook`,allowConcurrency:`Allow (run concurrently)`,forbidConcurrency:`Forbid (skip new)`,replaceConcurrency:`Replace (cancel existing)`,queueConcurrency:`Queue (run after current)`,conditionEvent:`Condition`,manualEvent:`Manual`,webhookEvent:`Webhook`,timerEvent:`Timer`,signalEvent:`Signal`,versionHistory:`Version History`,importBpmn:`Import BPMN`,exportBpmn:`Export BPMN`,undo:`Undo`,redo:`Redo`,resetZoom:`Reset zoom`},designer:{undo:`Undo`,redo:`Redo`},dashboard:{addWidget:`Add widget`,removeWidget:`Remove widget`,editLayout:`Edit layout`,saveLayout:`Save layout`,resetLayout:`Reset layout`,total:`Total`,noDataAvailable:`No data available`,noDataSourceFor:`No data source available for`,noRows:`No rows`,pickMeasures:`Pick measures (values) for this dataset widget.`,datasetUnsupported:`This data source does not support dataset queries.`,details:`Details`,exportCsv:`Export CSV`,openInList:`Open in list`,trend:{vsLastQuarter:`vs last quarter`,vsLastMonth:`vs last month`,vsLastWeek:`vs last week`,vsLastYear:`vs last year`,vsYesterday:`vs yesterday`,vsPreviousPeriod:`vs previous period`}},configPanel:{save:`Save`,discard:`Discard`,close:`Close`,layout:`Layout`,columns:`Columns`,gap:`Gap`,rowHeight:`Row height`,data:`Data`,refreshInterval:`Refresh interval`,appearance:`Appearance`,title:`Title`,showDescription:`Show description`,theme:`Theme`,configuration:`Configuration`,general:`General`,advanced:`Advanced`},appDesigner:{createApp:`Create Application`,editApp:`Edit Application`,basicInfo:`Basic Info`,objects:`Objects`,navigation:`Navigation`,branding:`Branding`,appName:`App Name`,appTitle:`Title`,appDescription:`Description`,appIcon:`Icon`,template:`Template`,layout:`Layout`,layoutSidebar:`Sidebar`,layoutHeader:`Header`,layoutEmpty:`Empty`,selectObjects:`Select Objects`,searchObjects:`Search objects…`,selectAll:`Select All`,deselectAll:`Deselect All`,navBuilder:`Navigation Builder`,addGroup:`Add Group`,addUrl:`Add URL`,addSeparator:`Add Separator`,noNavItems:`No navigation items yet.`,logoUrl:`Logo URL`,primaryColor:`Primary Color`,faviconUrl:`Favicon URL`,preview:`Preview`,complete:`Complete`,snakeCaseHint:`Must be snake_case (e.g. my_app)`,modeEdit:`Edit`,modePreview:`Preview`,modeCode:`Code`,addWidget:`Add Widget`,widgetProperties:`Widget Properties`,dataSource:`Data Source`,valueField:`Value Field`,aggregate:`Aggregate`,colorVariant:`Color Variant`,addComponent:`Add Component`,componentProperties:`Component Properties`,viewType:`View Type`,fields:`Fields`,toolbar:`Toolbar`,showSearch:`Show Search`,showFilters:`Show Filters`,showSort:`Show Sort`,appearance:`Appearance`,rowHeight:`Row Height`,stripedRows:`Striped Rows`,bordered:`Bordered`,livePreview:`Live Preview`,stepBasicDesc:`Name, title, and layout`,stepObjectsDesc:`Select business objects`,stepNavigationDesc:`Build navigation tree`,stepBrandingDesc:`Logo, colors, and favicon`,noObjectsFound:`No objects found.`,noNavItemsHint:`No navigation items yet. Select objects in the previous step or add items manually.`,separator:`Separator`,separatorLabel:`— Separator —`,newGroup:`New Group`,newLink:`New Link`,saveDraft:`Save Draft`,cancelConfirmTitle:`Discard changes?`,cancelConfirmMessage:`You have unsaved changes. Are you sure you want to cancel?`,confirmDiscard:`Discard`,keepEditing:`Keep Editing`,navNoItems:`No navigation items. Click buttons above to add items.`,navNoPreviewItems:`No items`,navLivePreview:`Live Preview`,navCollapseGroup:`Collapse group`,navExpandGroup:`Expand group`,navAddChild:`Add child`,navMoveUp:`Move up`,navMoveDown:`Move down`,navRemove:`Remove`,navObjectPage:`Object Page`,navDashboard:`Dashboard`,navPage:`Page`,navReport:`Report`,navGroup:`Group`,navUrl:`URL`,navSeparator:`Separator`,navTypeObject:`Object`,navTypeDashboard:`Dashboard`,navTypePage:`Page`,navTypeReport:`Report`,navTypeUrl:`URL`,navTypeGroup:`Group`,navTypeSeparator:`Separator`,navTypeAction:`Action`,navEditIcon:`Edit icon`,navToggleVisible:`Toggle visibility`,navHidden:`Hidden`,navExportSchema:`Export JSON`,navImportSchema:`Import JSON`,navExportSuccess:`Navigation schema exported`,navImportSuccess:`Navigation schema imported`,navImportError:`Invalid navigation JSON`,navIconPlaceholder:`Icon name (e.g. Users)`,dashboardEditor:`Dashboard Editor`,noWidgets:`No widgets. Click a button above to add one.`,widgetLayoutSize:`Layout Size`,widgetWidth:`Width`,widgetHeight:`Height`,dashboardPreview:`Dashboard Preview`,noWidgetsPreview:`No widgets to preview`,pageCanvasEditor:`Page Canvas Editor`,emptyPage:`Empty page. Click a button above to add a component.`,pagePreview:`Page Preview`,noComponentsPreview:`No components to preview`,modePage:`Page`,modeDashboard:`Dashboard`,undo:`Undo`,redo:`Redo`,brandingEditor:`Branding Editor`,brandingExport:`Export JSON`,brandingImport:`Import JSON`,brandingPreview:`Preview`,brandingSampleButton:`Sample Button`,brandingSampleText:`This is how your brand theme will look.`,colorPalette:`Color Palette`,fontFamily:`Font Family`,fontDefault:`Default (System)`,modeLight:`Light`,modeDark:`Dark`,mobilePreview:`Mobile Preview`,objectManager:{title:`Object Manager`,addObject:`New Object`,searchPlaceholder:`Search objects…`,noObjects:`No objects found.`,objectName:`API Name`,objectLabel:`Label`,pluralLabel:`Plural Label`,icon:`Icon`,selectIcon:`Select icon…`,group:`Group`,noGroup:`No Group`,sortOrder:`Sort Order`,enabled:`Enabled`,relationships:`Relationships`,systemBadge:`System`,fieldCount:`{{count}} fields`,ungrouped:`Ungrouped`,deleteConfirmTitle:`Delete Object?`,deleteConfirmMessage:`This will permanently delete the object and all its fields. This action cannot be undone.`},fieldDesigner:{title:`Field Designer`,addField:`New Field`,searchPlaceholder:`Search fields…`,allTypes:`All Types`,noFields:`No fields found.`,fieldName:`API Name`,fieldLabel:`Label`,fieldType:`Type`,fieldGroup:`Group`,description:`Description`,required:`Required`,unique:`Unique`,readOnly:`Read Only`,hidden:`Hidden`,indexed:`Indexed`,externalId:`External ID`,trackHistory:`Track History`,defaultValue:`Default Value`,placeholder:`Placeholder`,referenceTo:`Reference To`,formula:`Formula`,options:`Options`,addOption:`Add Option`,validationRules:`Validation Rules`,addRule:`Add Rule`,systemBadge:`System`,ungrouped:`General`,deleteConfirmTitle:`Delete Field?`,deleteConfirmMessage:`This will permanently delete the field. Existing data in this field will be lost.`,basicSection:`Basic`,typeSpecificSection:`Type Settings`,advancedSection:`Advanced`,typeCategory:{text:`Text`,number:`Number`,date:`Date & Time`,choice:`Choice`,relation:`Relation`,advanced:`Advanced`}}},console:{title:`ObjectOS`,initializing:`Initializing application...`,search:`Search…`,breadcrumb:{dashboards:`Dashboards`,pages:`Pages`,reports:`Reports`,system:`System`},nav:{pinItem:`Pin {{name}}`,unpinItem:`Unpin {{name}}`,dragToReorder:`Drag to reorder`,favorites:`Favorites`},loadingSteps:{connecting:`Connecting to data source`,loadingConfig:`Loading configuration`,preparingWorkspace:`Preparing workspace`},error:{connectionFailed:`Cannot connect to server`,serverUnreachable:`The server at {{url}} is unreachable.`,checkServer:`Please check your network connection or that the backend is running.`,timeout:`Connection timed out after 10 seconds.`},actions:{retry:`Retry`,retrying:`Retrying…`},shortcuts:{title:`Keyboard Shortcuts`,description:`Quick reference for all available keyboard shortcuts.`,groups:{general:`General`,navigation:`Navigation`,dataViews:`Data Views`,preferences:`Preferences`},openCommandPalette:`Open command palette`,showShortcuts:`Show keyboard shortcuts`,closeDialog:`Close dialog / panel`,toggleSidebar:`Toggle sidebar`,focusSearch:`Focus search`,createRecord:`Create new record`,refreshData:`Refresh data`,editRecord:`Edit selected record`,toggleDarkMode:`Toggle dark mode`},commandPalette:{title:`Command palette`,placeholder:`Type a command or search...`,noResults:`No results found.`,searching:`Searching…`,records:`Records`,recentRecords:`Recently viewed`,objects:`Objects`,dashboards:`Dashboards`,pages:`Pages`,reports:`Reports`,switchApp:`Switch App`,current:`Current`,preferences:`Preferences`,lightTheme:`Light Theme`,darkTheme:`Dark Theme`,systemTheme:`System Theme`,actions:`Actions`,openFullSearch:`Open Full Search Page`,createApp:`Create New App`},ai:{workspaceTitle:`AI Workspace`,workspaceSubtitle:`Ask, inspect, and resume conversations`,openChats:`Open chats`,chats:`Chats`,chatsDescription:`Browse and manage AI conversations.`,share:`Share`,shareTitle:`Share this conversation`,shareDisabledTitle:`Start chatting to enable sharing`,newChat:`New`,searchChats:`Search chats...`,noChatsYet:`No chats yet`,noChatsDescription:`Start a new conversation to see it here.`,noMatchingChats:`No matching chats.`,newConversation:`New conversation`,renameConversation:`Rename conversation`,deleteConversation:`Delete conversation`,saveRename:`Save rename`,cancelRename:`Cancel rename`,loadingHistory:`Loading conversation history...`,conversationReady:`Conversation ready`,preparingConversation:`Preparing a new conversation`,offlineDemoMode:`Offline demo mode — agent list unavailable`,askAgent:`Ask {{agent}}...`,assistant:`Assistant`,loadingAgents:`Loading agents...`,askAnything:`Ask anything...`,emptyTitle:`Start a conversation`,emptyDescription:`Ask anything — the assistant has access to your current app context.`,switchAssistant:`Switch assistant`,chooseAgent:`Choose assistant…`,empty:{build:{title:`Build with AI`,description:`Describe an app or workflow in plain language — I draft the objects, screens and automations, then you review and publish.`},ask:{title:`Ask your data`,description:`Ask questions about your records — counts, lists, and summaries across the data you can access.`}},clearConversation:`Clear`,sendHint:`to send`,agentActivity:`Agent activity`,toolCompleted:`Completed`,toolRunning:`Running`,toolAwaitingApproval:`Awaiting approval`,toolFailed:`Failed`,toolDetailsHidden:`Tool inputs and raw results are hidden in this view.`,copy:`Copy`,copied:`Copied`,regenerate:`Regenerate`,model:`Model`,submit:`Submit`,uploadFiles:`Upload files`,stopResponse:`Stop response`,trace:`trace`,viewTrace:`View trace`,nextSteps:`What's next`,publishDrafts:`Publish`,publishOk:`Published — objects are now live.`,seedWarn:`Published, but some sample data failed to load.`,openBuiltApp:`Open app`,previewDraft:`Preview`,resizeSplit:`Resize chat and preview`,hideChats:`Hide chats`,showChats:`Show chats`,planTitle:`Proposed plan`,planQuestions:`Confirm before building`,planAssumptions:`Assumptions`,planApproveHint:`Reply to approve or adjust this plan.`,planApprove:`Build it`,planAdjust:`Adjust`,planApproveMessage:`Looks good — build it as proposed.`,planApproveDefaultsMessage:`Build it with your best assumptions; use sensible defaults for the open questions.`,planAnswerMessage:`For "{{question}}", go with: {{option}}.`,justNow:`just now`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`,agentLabels:{ask:`Ask`,build:`Build`,dataChat:`Assistant`,metadataAssistant:`Metadata Assistant`},suggestions:{dataChat:{userCount:`How many users are in the system? List their emails.`,recentRecords:`List the 5 most recently created records.`,recordCounts:`Count records for each object.`},metadataAssistant:{buildCrm:`Build a sales CRM — customers, contacts, and a deal pipeline I can total by stage.`,buildApp:`Create a project tracker — projects, tasks with owners and due dates, and a board by status.`,buildFlow:`Design a support desk — tickets with priority, a status workflow, and customer links.`,buildInventory:`Build an inventory app — products, stock levels, suppliers, and low-stock visibility.`,buildRecruiting:`Make an applicant tracker — candidates, open roles, interview stages, and notes.`},generic:{help:`What can you help me with?`,availableObjects:`List the available data objects.`,recentActivity:`Summarize my recent activity.`}}},errors:{somethingWentWrong:`Something went wrong`,unexpectedError:`An unexpected error occurred while rendering this view.`,tryAgain:`Try Again`,goHome:`Go Home`,errorDetails:`Error Details (dev only)`},theme:{toggle:`Toggle theme`,light:`Light`,dark:`Dark`,system:`System`},objectView:{objectNotFound:`Object Not Found`,objectNotFoundDescription:`The object "{{objectName}}" does not exist in the current configuration.`,objectNotFoundHint:`Check your app navigation settings or select a different object from the sidebar.`,systemViewReadonly:`System view defined in code — read-only.`,expandToPage:`Open as full page`,allRecords:`All Records`,exitDesignMode:`Exit Design Mode`,enterDesignMode:`Enter Design Mode`,metadataInspector:`Metadata Inspector`,editView:`Edit View`,addView:`Add View`,designTools:`Design tools`,new:`New`,import:`Import`,importTitle:`Import from CSV`,importedToast:`Imported {{count}} row(s).`,importedWithSkipped:`Imported {{ok}} row(s); skipped {{skipped}}.`,configureView:`Configure View`,closePanel:`Close panel`,showAdvancedSettings:`Show advanced settings`,showFewerSettings:`Show fewer settings`,page:`Page`,pageConfigHint:`Toolbar, navigation & view shell settings`,listConfigHint:`Data rendering, columns & appearance for this list type`,general:`General`,generalHint:`View title, description, and type`,toolbar:`Toolbar`,toolbarHint:`Search, filter, sort, group, and density toggles`,toolbarEnabledCount:`{{count}} of {{total}} enabled`,navigationSection:`Navigation`,navigationHint:`Row click behavior and detail view settings`,records:`Records`,recordsHint:`Selection mode, add record, and inline editing`,exportPrint:`Export & Print`,exportPrintHint:`Export formats, printing, and record count display`,showAllFields:`Show All`,hideAllFields:`Hide All`,searchFields:`Search fields...`,title:`Title`,description:`Description`,data:`Data`,source:`Source`,columns:`Columns`,filterBy:`Filter by`,sortBy:`Sort by`,appearance:`Appearance`,showDescription:`Show description`,viewType:`View type`,userFilters:`User filters`,enableSearch:`Enable search`,enableFilter:`Enable filter`,enableSort:`Enable sort`,enableHideFields:`Enable hide fields`,enableGroup:`Enable group`,enableColor:`Enable color`,enableDensity:`Enable density`,userActions:`User actions`,addRecordViaForm:`Add records through a form`,advanced:`Advanced`,allowExport:`Allow export`,recordCount:`{{count}} records`,noDescription:`No description`,none:`None`,columnsConfigured:`{{count}} columns`,save:`Save`,discard:`Discard`,createView:`Create View`,createViewDesc:`Pick a view type, then give it a name. You can change every setting afterwards.`,cancel:`Cancel`,create:`Create`,delete:`Delete`,deleteViewTitle:`Delete view`,deleteViewConfirm:`Are you sure you want to delete the view "{{name}}"? This cannot be undone.`,bulkDeleteConfirm:`Delete {{count}} selected records? This cannot be undone.`,duplicateViewName:`A view with this name already exists.`,viewTypeGrid:`Grid`,viewTypeGridDesc:`A spreadsheet-style table of records.`,viewTypeKanban:`Kanban`,viewTypeKanbanDesc:`Cards grouped into columns by a single-select field.`,viewTypeCalendar:`Calendar`,viewTypeCalendarDesc:`Records placed on a monthly calendar by date.`,viewTypeGallery:`Gallery`,viewTypeGalleryDesc:`Large image cards driven by an attachment field.`,viewTypeTimeline:`Timeline`,viewTypeTimelineDesc:`Records along a horizontal time axis.`,viewTypeGantt:`Gantt`,viewTypeGanttDesc:`Project bars with start / end and dependencies.`,viewTypeMap:`Map`,viewTypeMapDesc:`Geographic markers from latitude / longitude fields.`,viewTypeChart:`Chart`,viewTypeChartDesc:`Aggregated bar / line / pie visualisations.`,newView:`New View`,typeOptions:`Type Options`,groupByField:`Group by field`,groupByFieldHelp:`The kanban groups records into columns by this field's values.`,startDateField:`Start date field`,startDateFieldHelp:`The calendar places records on the cell matching this date.`,ganttStartDateFieldHelp:`The left edge of each Gantt bar uses this date.`,ganttEndDateFieldHelp:`The right edge of each Gantt bar uses this date.`,timelineDateFieldHelp:`Records are placed on the timeline by this date.`,titleField:`Title field`,latitudeField:`Latitude field`,latitudeFieldHelp:`Field providing the latitude coordinate (geo fields only).`,longitudeField:`Longitude field`,longitudeFieldHelp:`Field providing the longitude coordinate (geo fields only).`,imageField:`Image field`,imageFieldHelp:`The gallery cover comes from this image or attachment field.`,dateField:`Date field`,selectField:`Select field...`,selectOption:`Select...`,noEligibleFieldForType:`No eligible field of this type. Add one to the object first.`,viewTypeUnavailable:`This object has no field that can serve as "{{field}}".`,viewTypeUnavailableShort:`Not supported by this object.`,chartType:`Chart type`,chartTypeHelp:`Determines how the data is rendered.`,chartTypeBar:`Bar chart`,chartTypeLine:`Line chart`,chartTypePie:`Pie chart`,chartTypeArea:`Area chart`,chartTypeScatter:`Scatter chart`,xAxisField:`X-axis field`,xAxisFieldHelp:`The categorical or time dimension.`,yAxisField:`Y-axis field`,yAxisFieldHelp:`The numeric field to aggregate.`,gridOptionsHint:`Grid view uses the columns configured above.`,groupBy:`Group by`,prefixField:`Prefix field`,fields:`Fields`,fieldsVisible:`{{count}} visible`,sortsCount:`{{count}} sorts`,filtersCount:`{{count}} filters`,endDateField:`End date field`,color:`Color`,fieldTextColor:`Field text color`,rowHeight:`Row height`,wrapHeaders:`Wrap headers`,showFieldDescriptions:`Show field descriptions`,collapseAllByDefault:`Collapse all by default`,striped:`Striped rows`,bordered:`Bordered cells`,inlineEdit:`Edit records inline`,addDeleteRecordsInline:`Add/delete records inline`,clickIntoRecordDetails:`Click into record details`,navigationMode:`Navigation mode`,navigationWidth:`Navigation width`,navigationWidthHint:`Available for drawer, modal, and split navigation modes`,openNewTab:`Open in new tab`,openNewTabHint:`Available for page and new window navigation modes`,selectionMode:`Selection mode`,selectionNone:`None`,selectionSingle:`Single`,selectionMultiple:`Multiple`,pageSize:`Page size`,pageSizeOptions:`Page size options`,exportFormats:`Export formats`,exportMaxRecords:`Max records`,exportIncludeHeaders:`Include headers`,exportFileNamePrefix:`File name prefix`,searchableFields:`Searchable fields`,filterableFields:`Filterable fields`,resizableColumns:`Resizable columns`,densityCompact:`Compact`,densityComfortable:`Comfortable`,densitySpacious:`Spacious`,densityMode:`Density mode`,hiddenFields:`Hidden fields`,rowActions:`Row actions`,bulkActions:`Bulk actions`,sharing:`Sharing`,sharingEnabled:`Enable sharing`,sharingVisibility:`Visibility`,addRecordEnabled:`Enable add record`,addRecordPosition:`Position`,addRecordMode:`Mode`,addRecordFormView:`Form view`,conditionalFormatting:`Conditional formatting`,addRule:`Add rule`,quickFilters:`Quick filters`,addQuickFilter:`Add quick filter`,ufElements:`Elements`,ufDropdown:`Dropdown`,ufTabs:`Tabs`,ufToggle:`Toggle`,ufAddField:`+ Add filter field...`,ufNoFields:`No fields available`,ufAddTab:`+ Add tab`,ufTabLabel:`Label`,ufShowAllRecords:`Show "All records" tab`,ufAllowAddTab:`Allow adding tabs`,showRecordCount:`Show record count`,allowPrinting:`Allow printing`,virtualScroll:`Virtual scroll`,emptyStateTitle:`Empty state title`,emptyStateMessage:`Empty state message`,emptyStateIcon:`Empty state icon`,ariaLabel:`ARIA label`,ariaDescribedBy:`ARIA described by`,ariaLive:`ARIA live`,accessibility:`Accessibility`,viewTabs:`View Tabs`},localeSwitcher:{label:`Language`}},auth:{login:{title:`Sign in to your account`,description:`Enter your email and password to continue`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,passwordLabel:`Password`,passwordPlaceholder:`Enter your password`,forgotPasswordText:`Forgot password?`,submitButton:`Sign In`,submittingButton:`Signing in...`,noAccountText:`Don't have an account?`,signUpText:`Sign up`,signingIn:`Signing you in…`,ssoHandoff:`Continue to {{target}}`,errors:{invalidCredentials:`Invalid email or password. Please try again.`,emailNotVerified:`Please verify your email address before signing in.`}},register:{title:`Create an account`,description:`Enter your information to get started`,nameLabel:`Name`,namePlaceholder:`John Doe`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,passwordLabel:`Password`,passwordPlaceholder:`Create a password (min. 8 characters)`,confirmPasswordLabel:`Confirm Password`,confirmPasswordPlaceholder:`Confirm your password`,passwordMismatchError:`Passwords do not match`,passwordTooShortError:`Password must be at least 8 characters`,submitButton:`Create Account`,submittingButton:`Creating account...`,hasAccountText:`Already have an account?`,signInText:`Sign in`,errors:{userExists:`An account with this email already exists. Try signing in instead.`},verifyInbox:{title:`Check your inbox`,description:`We've sent a verification link to {{email}}. Click the link to activate your account.`,resend:`Resend verification email`,resending:`Sending…`,resent:`Verification email sent.`,backToSignIn:`Back to sign in`}},forgotPassword:{title:`Reset your password`,description:`Enter your email address and we'll send you a link to reset your password`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,submitButton:`Send Reset Link`,submittingButton:`Sending...`,successTitle:`Check your email`,successDescription:`We've sent a password reset link to {{email}}. Please check your inbox.`,backToSignInText:`Back to sign in`,rememberPasswordText:`Remember your password?`,signInText:`Sign in`},resetPassword:{title:`Set a new password`,description:`Choose a password you have not used before.`,newPassword:`New password`,confirmPassword:`Confirm password`,submit:`Update password`,submitting:`Updating…`,success:`Password updated`,failed:`Reset failed`,invalidToken:`This reset link is invalid or has expired.`,missingToken:`Reset link is missing or expired`,passwordsMismatch:`Passwords do not match`,requestNewLink:`Request a new link`},verifyEmail:{title:`Verify your email address`,description:`We sent a verification link to your email address. Please click the link to verify your account.`,sentTo:`Sent to:`,verifyingTitle:`Verifying…`,verifyingDescription:`Hang tight while we confirm your email.`,successTitle:`Email verified`,successDescription:`Your email is confirmed. You can now sign in.`,errorTitle:`Verification failed`,errorDescription:`Verification failed. Please request a new link.`,missingToken:`Verification link is missing a token.`,emailMissing:`Email address is missing`,resendButton:`Resend verification email`,resending:`Sending…`,resent:`Email sent! Check your inbox`,resentSuccess:`Verification email sent!`,resentDescription:`Please check your inbox and click the verification link.`,resendFailed:`Cannot resend verification email`,signInLink:`Go to sign in`,backToSignIn:`Back to sign in`,backToLogin:`Back to login`,checkSpam:`Didn't receive the email? Check your spam folder or contact support.`,or:`Or`},setup:{welcomeTitle:`Welcome to ObjectStack`,description:`Create the first owner account to finish setting up this deployment.`,yourName:`Your name`,orgName:`Organization name`,orgNamePlaceholder:`Acme Inc.`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,passwordLabel:`Password`,passwordHint:`Minimum 8 characters`,submit:`Create owner account`,submitting:`Setting up…`,failed:`Setup failed`},device:{title:`Authorize new device`,subtitle:`Approve this device to sign in as {{email}}.`,userCodeLabel:`Device code`,requesterLabel:`Connection request from`,approveWarning:`Only approve if you started this connection yourself a moment ago. Once approved, this runtime can access your organization's private packages.`,loggedInAs:`Signed in as {{email}}`,approve:`Approve device`,approving:`Approving…`,approvedTitle:`Device authorized`,approvedDescription:`You can return to the device — it should sign in shortly.`,approveSuccess:`Device authorized`,approveSuccessDescription:`You can close this window.`,approveFailed:`Approval failed`,deny:`Deny request`,denying:`Denying…`,deniedTitle:`Access denied`,deniedDescription:`The device will not be granted access.`,denyFailed:`Failed to deny request`,invalidTitle:`Invalid device link`,invalidDescription:`No device code was provided in the URL.`,loading:`Loading…`,cancel:`Cancel`},shell:{tenantHostHint:`You are signing in to this workspace`}},errors:{networkError:`Network error. Please check your connection.`,serverError:`Server error. Please try again later.`,notFound:`Resource not found.`,unauthorized:`You are not authorized to perform this action.`,forbidden:`Access denied.`,timeout:`Request timed out. Please try again.`,unknown:`An unexpected error occurred.`},workspace:{label:`Workspaces`,default:`My Workspace`,switch:`Switch workspace`,create:`Create workspace`,createTitle:`Create a workspace`,createDescription:`A workspace is a shared space for your team to collaborate.`,createButton:`Create workspace`,nameLabel:`Workspace name`,namePlaceholder:`e.g., Acme Inc`,slugLabel:`URL slug`,slugHint:`Used in URLs. Only lowercase letters, numbers, and hyphens.`,invite:`Invite member`,members:`Members`,settings:`Workspace settings`},help:{onThisPage:`On this page`,appDocs:`This app's docs`,allDocs:`All documentation`,keyboardShortcuts:`Keyboard shortcuts`,onlineDocs:`Online documentation`},sidebar:{settings:`Settings`,help:`Help`,helpTooltip:`Help & Documentation`,activityFeed:`Activity feed`,notifications:`Notifications`,approvals:`Approvals`,inbox:`Inbox`,inboxAriaLabel:`Open inbox`,area:`Area`,scope:`Scope`,packageManagement:`Package management`,searchNavigation:`Search navigation...`,recent:`Recent`,favorites:`Favorites`,starred:`Starred`,removeFromFavorites:`Remove {{name}} from favorites`},topbar:{aiAssistant:`AI Assistant`,openAssistant:`Open {{name}} assistant`,offline:`Offline`,usersOnline:`Users currently online`,switchView:`Switch view`,connection:{connected:`Connected`,connecting:`Connecting...`,reconnecting:`Reconnecting...`,disconnected:`Disconnected`,error:`Connection Error`}},home:{title:`Home`,subtitle:`Your workspace dashboard`,nav:`Home`,allApps:`All Applications`,greetingMorning:`Good morning`,greetingAfternoon:`Good afternoon`,greetingEvening:`Good evening`,greetingNight:`Working late`,heroTagline:`Pick up where you left off, or explore something new.`,open:`Open`,stats:{apps:`Applications`,starred:`Starred`,recent:`Recent items`},loading:`Loading workspace...`,recent:`Recent`,starred:`Starred`,welcome:`Build your business system with AI`,welcomeDescription:`Describe your business in one sentence — AI generates the objects, screens, APIs and agent tools. Or start from scratch.`,welcomeAdminDescription:`Describe your business in one sentence — AI generates the objects, screens, APIs and agent tools. Or set things up yourself from the menu on the left.`,welcomeAdminDescriptionNoBuild:`Set up your first application from the Administration menu on the left. Once you have data, the AI assistant can help you explore it.`,welcomeAdminDescriptionNoAi:`Set up your first application from the Administration menu on the left.`,noAppsTitle:`No applications yet`,noAppsDescription:`There are no applications available to you yet. Please contact your workspace administrator.`,buildWithAI:`Build with AI`,askAI:`Ask AI`,recoveryReminder:{message:`Set a recovery password so you can still sign in if single sign-on is ever unavailable.`,cta:`Set password`,dismiss:`Dismiss`},pendingDrafts:{message:`You have {{count}} unpublished change(s) — publish to make them live.`,cta:`Publish`,publishing:`Publishing…`,published:`Published! Your changes are live.`,publishFailed:`Publish failed`},createFirstApp:`Create app manually`,systemSettings:`System Settings`,browseMarketplace:`Browse App Marketplace`,quickActions:{title:`Quick Actions`,createApp:`Create App`,createAppDesc:`Start with a new application`,manageObjects:`Manage Objects`,manageObjectsDesc:`Configure data models`,systemSettings:`System Settings`,systemSettingsDesc:`Configure your workspace`},recentApps:{title:`Recently Accessed`,itemType:{object:`Object`,dashboard:`Dashboard`,page:`Page`,record:`Record`}},starredApps:{title:`Starred`},gettingStarted:{title:`Make this home yours`,description:`Star an app to pin it here for one-click access. Anything you open will show up under Recently Accessed automatically.`,cta:`Browse all applications`},appCard:{noDescription:`No description`,default:`Default`}},layout:{appSwitcher:{home:`Home`,switchApplication:`Switch Application`,appsAvailable:`{{count}} apps available`,addApp:`Add App`,editApp:`Edit App`,manageAllApps:`Manage All Apps`,systemConsole:`System Console`,noAppsConfigured:`No apps configured`},systemNav:{systemSettings:`System Settings`,applications:`Applications`,appMarketplace:`App Marketplace`,objectManager:`Object Manager`,users:`Users`,organizations:`Organizations`,roles:`Roles`,configuration:`Configuration`,createApp:`Create App`},activityFeed:{title:`Recent Activity`,filter:`Filter`,empty:`No recent activity`,viewAll:`View all activity`,ariaLabel:`Activity feed`,typeCreate:`Create`,typeUpdate:`Update`,typeDelete:`Delete`,typeComment:`Comment`,relativeJustNow:`just now`,relativeSecondsAgo:`{{count}}s ago`,relativeMinutesAgo:`{{count}}m ago`,relativeHoursAgo:`{{count}}h ago`,relativeDaysAgo:`{{count}}d ago`},metadata:{label:`Metadata`,toggleTitle:`Toggle Metadata Inspector`,panelTitle:`Metadata Inspector`,jsonBadge:`JSON`,copyJson:`Copy JSON`}},search:{title:`Search`,back:`Back`,placeholder:`Search objects, dashboards, pages, reports...`,inputAriaLabel:`Search objects, dashboards, pages, reports`,resultsCount:`{{count}} result for "{{query}}"`,resultsCountPlural:`{{count}} results for "{{query}}"`,itemsAvailable:`{{count}} items available`,noResults:`No results found`,noResultsHint:`Try adjusting your search terms`,typeObjects:`Objects`,typeDashboards:`Dashboards`,typePages:`Pages`,typeReports:`Reports`,badgeObject:`object`,badgeDashboard:`dashboard`,badgePage:`page`,badgeReport:`report`},empty:{objectNotFound:`Object Not Found`,objectNotFoundDescription:`Object "{{name}}" definition missing. Check your configuration or navigate back to select a valid object.`,recordNotFound:`Record not found`,recordNotFoundDescription:`The record you are looking for does not exist or may have been deleted.`,pageNotFound:`Page Not Found`,pageNotFoundDescription:`The page "{{name}}" could not be found. It may have been removed or renamed.`,dashboardNotFound:`Dashboard Not Found`,dashboardNotFoundDescription:`The dashboard "{{name}}" could not be found. It may have been removed or renamed.`,reportNotFound:`Report Not Found`,reportNotFoundDescription:`The report "{{name}}" could not be found. It may have been removed or renamed.`,noAppsConfigured:`No Apps Configured`,noAppsConfiguredDescription:`No applications have been registered. Create your first app or visit System Settings to configure your environment.`,createFirstApp:`Create Your First App`,systemSettings:`System Settings`,back:`Back`},preview:{empty:{loadFailedTitle:`Draft preview failed to load`,loadFailedDescription:`The draft overlay could not be read. Retry, or check your connection.`,notReadyTitle:`“{{app}}” isn’t in the draft yet`,notReadyDescription:`The build may still be running, or it may have failed before this app was staged. Check the conversation for the build status — this pane refreshes as drafts land.`,nothingTitle:`Nothing to preview yet`,retry:`Retry`},draftBar:{message:`Draft preview — you are seeing unpublished changes. Nothing here is live until you publish.`,publish:`Publish`,publishing:`Publishing…`,exit:`Exit preview`,changes:`Changes`},changes:{title:`Pending changes`,description:`What publishing will change. New items are added; updates overwrite the live version.`,loading:`Loading pending changes…`,loadFailed:`Could not load pending changes:`,empty:`Nothing pending — every draft has been published.`,kindNew:`New`,kindUpdate:`Update`}},renderer:{noPageSchema:`No page schema provided`,noFormSchema:`No form schema provided`,noDashboardSchema:`No dashboard schema provided`,pageRendering:`Page rendering: {{name}}`,dashboardRendering:`Dashboard rendering: {{name}}`,formRenderingMode:`Form rendering in {{mode}} mode`,formRenderingFor:`for record {{id}}`,createRecord:`Create Record`,editRecord:`Edit Record`,page:`Page`,dashboard:`Dashboard`,save:`Save`,cancel:`Cancel`},actionDialog:{title:`Action Parameters`,description:`Please provide the required information to continue.`,selectPlaceholder:`Select {{label}}`,requiredError:`{{label}} is required`,lookupPlaceholder:`Paste the {{label}} record id (UUID)`,lookupHelpText:`Enter the record id of the referenced object. A picker is coming soon.`,cancel:`Cancel`,confirm:`Confirm`,defaultActionTitle:`Action`,ok:`OK`},actionConfirm:{title:`Confirm Action`,confirm:`Continue`,cancel:`Cancel`},rowAction:{openMenu:`Open menu`,edit:`Edit`,delete:`Delete`},navigationSync:{addedPage:`Navigation updated: added page "{{name}}"`,addedDashboard:`Navigation updated: added dashboard "{{name}}"`,removedPage:`Navigation updated: removed page "{{name}}"`,removedDashboard:`Navigation updated: removed dashboard "{{name}}"`,renamedPage:`Navigation updated: renamed page "{{oldName}}" → "{{newName}}"`,renamedDashboard:`Navigation updated: renamed dashboard "{{oldName}}" → "{{newName}}"`,undoLabel:`Undo`,undone:`Navigation change undone`,undoFailed:`Failed to undo navigation change`,updateFailed:`Failed to update navigation`},objectActions:{deleteSuccess:`{{label}} deleted successfully`,deleteFailed:`Failed to delete {{label}}`,noRecordId:`No record ID provided`,deleteConfirm:`Are you sure you want to delete this record?`,bulkDeleteSuccess:`Deleted {{count}} {{label}} records`,bulkDeletePartial:`{{succeeded}} deleted, {{failed}} failed`},objectViewActions:{renameFailed:`Failed to rename view`,deleteFailed:`Failed to delete view`},dashboardActions:{pdfPreparing:`Preparing PDF export…`,exportFailed:`Export failed: {{message}}`,forecastSoon:`Forecast view coming soon`},recordDetail:{viewersTooltip:`Users viewing this record`},cellRender:{empty:`Empty`,yes:`Yes`,no:`No`,systemFields:`System`},user:{profile:`Profile`,settings:`Settings`,logout:`Log out`,preferences:`Preferences`,theme:`Theme`,language:`Language`},organizations:{mine:`My Organizations`,title:`Organizations`,heading:`Your Organizations`,subtitle:`Select an organization to continue, or create a new one.`,searchPlaceholder:`Search for an organization`,new:`New organization`,current:`Current organization`,manage:`Manage`,emptyTitle:`No organizations yet`,emptyDescription:`Create your first organization to get started.`,noMatches:`No organizations match your search.`},notifications:{regionLabel:`Notifications`,empty:`No notifications`,emptyUnread:`You're all caught up`,filterUnread:`Unread`,filterAll:`All`,markAllRead:`Mark all read`,viewAll:`View all notifications`,approvalsPending:`{{count}} pending approvals`,viewApprovals:`View approvals`,noPendingApprovals:`No pending approvals`,openApprovalsInbox:`Open Approvals Inbox`},publicForm:{submit:`Submit`,submitting:`Submitting…`,submitAnother:`Submit another response`,poweredBy:`Powered by ObjectStack`,secureNotice:`Your information is transmitted securely and only used to respond to your request.`,thankYouTitle:`Thank you!`,thankYouMessage:`Your submission has been received successfully.`,redirecting:`Redirecting in {{seconds}} seconds…`,unavailableTitle:`Form unavailable`,unavailableDescription:`No public form is available at this URL. Make sure the underlying view has anonymous sharing enabled and matches this slug.`,tryDemo:`Try the demo`,retry:`Retry`,loading:`Loading form…`,requiredHint:`* Required field`,consentLabelDefault:`I agree to the privacy policy and consent to my data being processed for this request.`,consentLink:`Privacy policy`,consentRequired:`Please accept the privacy policy to continue.`,rateLimited:`Please take a moment to review your answers before submitting.`,redirectBlocked:`Submission accepted, but the redirect URL was blocked for security.`,demo:{contactTitle:`Contact us`,contactDescription:`Tell us about your project and a sales representative will get back to you within one business day.`,supportTitle:`Submit a support request`,supportDescription:`Tell us what is going wrong — our team responds within one business day.`,thankYouSalesTitle:`Thanks — we received your message!`,thankYouSalesMessage:`A sales representative will be in touch within one business day.`,thankYouSupportTitle:`Got it — your request is in the queue.`,thankYouSupportMessage:`A support engineer will follow up shortly. Save this page if you have more screenshots to add.`,field:{firstName:`First name`,lastName:`Last name`,email:`Work email`,phone:`Phone`,jobTitle:`Job title`,company:`Company`,website:`Website`,industry:`Industry`,companySize:`Company size`,howCanWeHelp:`How can we help?`,subject:`Subject`,description:`Description`,issueType:`Issue type`,priority:`Priority`},industry:{technology:`Technology`,software:`Software / SaaS`,finance:`Finance`,healthcare:`Healthcare`,retail:`Retail`,other:`Other`},issueType:{question:`Question`,problem:`Problem`,bug:`Bug`,feature_request:`Feature request`},priority:{low:`Low`,medium:`Medium`,high:`High`,critical:`Critical`}}},marketplace:{title:`App Marketplace`,subtitle:`Browse approved apps published to the ObjectStack catalog. Click an app to view details and install it into one of your environments.`,searchPlaceholder:`Search apps by name or manifest ID…`,searchAria:`Search marketplace apps`,installed:`Installed`,installedCount:`Installed ({{count}})`,refresh:`Refresh`,all:`All`,noApprovedYet:`No apps have been approved for the marketplace yet.`,noMatchFilters:`No apps match your filters.`,noDescription:`No description provided.`,back:`Back to marketplace`,installedTitle:`Installed Apps`,installedSubtitle:`Marketplace packages currently installed into this runtime's kernel. Cached manifests live in <code>.objectstack/installed-packages/</code> and survive restarts.`,installedEmpty:`No marketplace apps installed in this runtime yet.`,browseLink:`Browse the marketplace →`,installedAdditiveNote:`<strong>Note:</strong> The kernel API is additive only — uninstall removes the on-disk manifest so the package won't load on next boot, but the running kernel keeps the app registered until you restart the runtime.`,installedAt:`Installed {{when}}`,installedBy:`by {{user}}`,installedPackageId:`package`,cachedAs:`Cached as <code>{{path}}</code>`,versionBadge:`v{{version}}`,installedBadge:`Installed v{{version}}`,load:{failed:`Failed to load marketplace`,failedHint:`By default this runtime points at the public ObjectStack cloud. Check the runtime is online, or override <code>OS_CLOUD_URL</code> to point at a self-hosted control plane.`,packageFailed:`Failed to load package`,notFound:`Not found.`},detail:{homepage:`Homepage`,installedV:`Installed · v{{version}}`,about:`About`,noReadme:`No readme provided.`,versions:`Versions`,noApprovedVersions:`No approved versions.`,prerelease:`pre`,moreOptions:`More install options`,uninstallFromRuntime:`Uninstall from this runtime`,addSampleData:`Add sample data`,reseedAgain:`Re-seed sample data`,purgeSampleData:`Purge sample data`,purgeConfirm:`Delete all sample records seeded by this package? User-added records will NOT be touched.`,purgeSuccess:`Removed {{count}} sample record(s).`,purgeNoData:`No sample records found to purge.`,reseedQueued:`Sample data will be re-seeded on next environment access.`,reseedLocalSuccess:`Re-seeded sample data: {{inserted}} inserted, {{updated}} updated.`,reseedPartialErrors:`({{count}} record(s) failed to write)`,updateAvailable:`Update available`},action:{install:`Install`,reinstall:`Reinstall`,working:`Working…`,installToCloud:`Install to cloud…`,installed:`Installed`,installing:`Installing…`,uninstall:`Uninstall`,uninstalling:`Uninstalling…`,details:`Details`,close:`Close`,dismiss:`Dismiss`,openOnCloud:`Open on cloud`,backHome:`Back to home`},install:{dialogTitle:`Install {{name}}`,dialogDescCurrent:`Install into this environment ({{host}}).`,dialogDescPicker:`Choose an environment to install this app into. You need to be signed into ObjectStack Cloud.`,environment:`Environment`,environmentPlaceholder:`Pick an environment`,includeSampleData:`Include sample data`,noEnvs:`No environments found in your active organization.`,noPermission:`You do not have permission to install apps in any environment. Only organization owners and admins can install — ask your workspace admin.`,signInFirst:`You need to sign into ObjectStack Cloud first. Click "Open on cloud" below.`,success:`Installed successfully. Open the environment to see the new app.`,localSuccess:`Installed v{{version}} to this runtime. "{{name}}" should now appear in the app switcher.`,localManifestConflict:`{{message}}
|
|
4
|
+
`),e))}}catch(t){ut.has(e)||(ut.add(e),console.warn(`[ObjectUI] Schema validator threw:`,t))}return lt.set(e,n),n}function ft(e){let t={};return e.ariaLabel&&(t[`aria-label`]=st(e.ariaLabel)),e.ariaDescribedBy&&(t[`aria-describedby`]=e.ariaDescribedBy),e.role&&(t.role=e.role),t}var pt=class extends I.Component{state={hasError:!1,error:null};static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidUpdate(e){this.state.hasError&&(e.componentType!==this.props.componentType||e.resetKey!==this.props.resetKey)&&this.setState({hasError:!1,error:null})}handleRetry=()=>{this.setState({hasError:!1,error:null})};render(){if(this.state.hasError&&this.state.error){let e=this.state.error;return we(e),(0,L.jsxs)(`div`,{className:`p-4 border border-orange-400 rounded bg-orange-50 text-orange-700 my-2`,role:`alert`,children:[(0,L.jsxs)(`p`,{className:`font-medium`,children:[`Component`,this.props.componentType?` "${this.props.componentType}"`:``,` failed to render`]}),(0,L.jsx)(`p`,{className:`text-sm mt-1`,children:e.message}),!1,(0,L.jsx)(`button`,{onClick:this.handleRetry,className:`mt-2 text-sm underline hover:no-underline`,children:`Retry`})]})}return this.props.children}},mt=(0,I.forwardRef)(({schema:e,...t},n)=>{let r=(0,I.useContext)(Qe),i=r?.dataSource||{},a=it(),[,o]=(0,I.useReducer)(e=>e+1,0);(0,I.useEffect)(()=>{let e=l.subscribe(o);return o(),e},[]);let[s,c]=(0,I.useState)(null),u=(0,I.useMemo)(()=>{if(!e||typeof e==`string`)return e;let t=new D({...a,current_user:a?.user,data:i}),n={...e};if(n.properties){let e=n.type,t=n.id,r=n.properties;for(let[e,t]of Object.entries(r))e===`type`||e===`id`||(n[e]=t);e!==void 0&&(n.type=e),t!==void 0&&(n.id=t),n.properties=r}if(typeof n.content==`string`&&(n.content=t.evaluate(n.content)),n.props){let e={...n.props};for(let[n,r]of Object.entries(e))e[n]=t.evaluate(r);n.props=e}return(n.visible===void 0?n.visibleOn===void 0?n.hidden===void 0?n.hiddenOn!==void 0&&t.evaluateCondition(n.hiddenOn):t.evaluateCondition(n.hidden):!t.evaluateCondition(n.visibleOn):!t.evaluateCondition(n.visible))&&(n._hidden=!0),(n.disabled===void 0?n.disabledOn!==void 0&&t.evaluateCondition(n.disabledOn):t.evaluateCondition(n.disabled))&&(n._disabled=!0),n},[e,i,a]);if(!u||u?._hidden)return null;if(typeof u==`string`)return(0,L.jsx)(L.Fragment,{children:u});let d=ct?dt(e):{valid:!0,messages:[]};De(`schema`,`Rendering schema node`,{type:u.type,id:u.id});let f=l.get(u.type);if(!f){if(!s&&l.hasLazy(u.type)){let e=l.loadLazy(u.type);if(e)return e.catch(e=>{c(e instanceof Error?e:Error(String(e)))}),(0,L.jsxs)(`div`,{className:`p-2 text-sm text-muted-foreground animate-pulse`,role:`status`,"aria-live":`polite`,"data-lazy-loading":u.type,children:[`Loading `,(0,L.jsx)(`code`,{children:u.type}),`…`]})}return De(`schema`,`Component not found in registry`,{type:u.type}),Se[`OBJUI-001`],(0,L.jsxs)(`div`,{className:`p-4 border border-red-500 rounded text-red-500 bg-red-50 my-2`,role:`alert`,children:[(0,L.jsxs)(`p`,{className:`font-medium`,children:[`Unknown component type: `,(0,L.jsx)(`strong`,{children:u.type})]}),s&&(0,L.jsxs)(`p`,{className:`text-xs mt-1`,children:[`Failed to load plugin: `,s.message]}),!1,(0,L.jsx)(`pre`,{className:`text-xs mt-2 overflow-auto`,children:JSON.stringify(u,null,2)})]})}let{type:p,children:m,body:h,schema:g,visible:_,visibleOn:v,hidden:y,hiddenOn:b,disabled:x,disabledOn:ee,_hidden:S,_disabled:C,...w}=u,T=ft(u),E=r?.debug||r?.debugFlags?.enabled,O={};E&&(O[`data-debug-type`]=u.type,u.id&&(O[`data-debug-id`]=u.id)),ke(`render:${u.type}:${u.id??`anon`}`);let te=E?performance.now():0,ne=(0,L.jsx)(pt,{componentType:u.type,resetKey:u.id??null,children:I.createElement(f,{schema:u,...w,...u.props||{},...T,...O,disabled:C||void 0,className:u.className,"data-obj-id":u.id,"data-obj-type":u.type,...ct&&!d.valid?{"data-obj-schema-invalid":`true`}:{},...t})});if(Ae(`render:${u.type}:${u.id??`anon`}`),E&&te){let e=performance.now()-te;Me.getInstance().addPerf({type:u.type,id:u.id,durationMs:e,timestamp:Date.now()})}return ne});mt.displayName=`SchemaRenderer`;function ht(e={}){let{context:t={},onConfirm:n,onToast:r,onModal:i,onNavigate:a,onParamCollection:o,onResultDialog:s}=`context`in e?e:{context:e},[c,l]=(0,I.useState)(!1),[u,d]=(0,I.useState)(null),[f,p]=(0,I.useState)(null),m=(0,I.useMemo)(()=>{let e=new M(t);return n&&e.setConfirmHandler(n),r&&e.setToastHandler(r),i&&e.setModalHandler(i),a&&e.setNavigationHandler(a),o&&e.setParamCollectionHandler(o),s&&e.setResultDialogHandler(s),e},[JSON.stringify(t)]);return{execute:(0,I.useCallback)(async e=>{l(!0),d(null),p(null);try{let t=await m.execute(e);return p(t),t.success||d(t.error||`Action failed`),t}catch(e){let t=e.message;d(t);let n={success:!1,error:t};return p(n),n}finally{l(!1)}},[m]),loading:c,error:u,result:f,updateContext:(0,I.useCallback)(e=>{m.updateContext(e)},[m]),runner:m}}function gt(e){let{navigation:t,objectName:n,onNavigate:r,onRowClick:i}=e,[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(null),l=t?.mode??`page`,u=t?.width,d=t?.view,f=l===`drawer`||l===`modal`||l===`split`||l===`popover`,p=(0,I.useCallback)(()=>{o(!1),c(null)},[]),m=(0,I.useCallback)(e=>{c(e),o(!0)},[]),h=(0,I.useCallback)((e,a)=>{if(i){i(e,a);return}if(a&&(a.metaKey||a.ctrlKey||a.button===1)){let t=e.id||e._id;if(r&&t!=null){r(t,`new_window`);return}}if(!t){let t=e.id||e._id;r&&t!=null&&r(t,d??`view`);return}if(!(l===`none`||t.preventNavigation)){if(l===`new_window`||t.openNewTab){let t=e.id||e._id;if(r&&t!=null){r(t,`new_window`);return}let i=encodeURIComponent(String(t)),a=n?`/${n}/record/${i}`:`/${i}`;window.open(a,`_blank`);return}if(l===`page`){let t=e.id||e._id;r&&t!=null&&r(t,d??`view`);return}if(f){c(e),o(!0);return}}},[i,t,l,n,r,f,d]);return(0,I.useMemo)(()=>({isOpen:a,selectedRecord:s,mode:l,close:p,open:m,setIsOpen:o,handleClick:h,width:u,view:d,isOverlay:f}),[a,s,l,p,m,h,u,d,f])}var _t=(0,I.createContext)(null);function vt(e){if(!e||e.length===0)return{};let t={};for(let n of e)if(n.defaultValue!==void 0)t[n.name]=n.defaultValue;else switch(n.type){case`number`:t[n.name]=0;break;case`boolean`:t[n.name]=!1;break;case`object`:t[n.name]={};break;case`array`:t[n.name]=[];break;default:t[n.name]=``;break}return t}var yt=({definitions:e,children:t})=>{let[n,r]=(0,I.useState)(()=>vt(e)),i=(0,I.useCallback)((e,t)=>{r(n=>({...n,[e]:t}))},[]),a=(0,I.useCallback)(e=>{r(t=>({...t,...e}))},[]),o=(0,I.useCallback)(()=>{r(vt(e))},[e]),s=(0,I.useMemo)(()=>({variables:n,setVariable:i,setVariables:a,resetVariables:o}),[n,i,a,o]);return(0,L.jsx)(_t.Provider,{value:s,children:t})};yt.displayName=`PageVariablesProvider`;function bt(){let e=(0,I.useContext)(Qe)?.dataSource,[t,n]=(0,I.useState)(null),[r,i]=(0,I.useState)(!0),[a,o]=(0,I.useState)(null);return(0,I.useEffect)(()=>{let t=!1;async function r(){if(!e){i(!1);return}try{if(i(!0),typeof e.getDiscovery==`function`){let r=await e.getDiscovery();t||(n(r),o(null))}else t||(n(null),o(null))}catch(e){t||(o(e instanceof Error?e:Error(`Failed to fetch discovery`)),n(null))}finally{t||i(!1)}}return r(),()=>{t=!0}},[e]),{discovery:t,isLoading:r,error:a,isAuthEnabled:t?.services?.auth?.enabled??!0,isAiEnabled:t?.services?.ai?.enabled===!0&&t?.services?.ai?.status===`available`}}[`a[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`].join(`, `);var xt={compact:32,comfortable:40,spacious:52},St={compact:`py-1 px-2`,comfortable:`py-2 px-3`,spacious:`py-3 px-4`},Ct={compact:`text-xs`,comfortable:`text-sm`,spacious:`text-base`},wt=[`compact`,`comfortable`,`spacious`];function Tt(e=`comfortable`,t){let[n,r]=(0,I.useState)(e),i=t?.rowHeights??xt,a=t?.paddingClasses??St,o=t?.fontSizeClasses??Ct,s=(0,I.useRef)(t?.onChange);(0,I.useEffect)(()=>{s.current=t?.onChange},[t?.onChange]);let c=(0,I.useRef)(e);(0,I.useEffect)(()=>{e!==c.current&&(c.current=e,r(e))},[e]);let l=(0,I.useCallback)(e=>{r(t=>t===e?t:(queueMicrotask(()=>s.current?.(e)),e))},[]),u=(0,I.useCallback)(()=>{r(e=>{let t=wt[(wt.indexOf(e)+1)%wt.length];return queueMicrotask(()=>s.current?.(t)),t})},[]);return(0,I.useMemo)(()=>({mode:n,setMode:l,cycle:u,rowHeight:i[n],paddingClass:a[n],fontSizeClass:o[n]}),[n,l,u,i,a,o])}var Et=0,Dt=(0,I.createContext)(null),Ot=({children:e,config:t={},onToast:n})=>{let r=(0,I.useMemo)(()=>({position:`top-right`,defaultDuration:5e3,maxVisible:5,stacking:!0,...t}),[JSON.stringify(t)]),[i,a]=(0,I.useState)([]),o=(0,I.useCallback)(e=>{let t=`notification-${++Et}`,i={...e,id:t,createdAt:new Date,read:!1};a(e=>[i,...e]),n&&n(i);let o=e.duration??r.defaultDuration??5e3;return o>0&&setTimeout(()=>{a(e=>e.filter(e=>e.id!==t))},o),t},[r.defaultDuration,n]),s=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`info`}),[o]),c=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`success`}),[o]),l=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`warning`}),[o]),u=(0,I.useCallback)((e,t)=>o({title:e,message:t,severity:`error`}),[o]),d=(0,I.useCallback)(e=>{a(t=>t.map(t=>t.id===e?{...t,read:!0}:t))},[]),f=(0,I.useCallback)(()=>{a(e=>e.map(e=>({...e,read:!0})))},[]),p=(0,I.useCallback)(e=>{a(t=>t.filter(t=>t.id!==e))},[]),m=(0,I.useCallback)(()=>{a([])},[]),h=(0,I.useMemo)(()=>i.filter(e=>!e.read).length,[i]),g=(0,I.useMemo)(()=>({notifications:i,unreadCount:h,notify:o,info:s,success:c,warning:l,error:u,markAsRead:d,markAllAsRead:f,dismiss:p,clearAll:m,config:r}),[i,h,o,s,c,l,u,d,f,p,m,r]);return(0,L.jsx)(Dt.Provider,{value:g,children:e})};Ot.displayName=`NotificationProvider`;function kt(e){return typeof window>`u`?()=>{}:(window.addEventListener(`online`,e),window.addEventListener(`offline`,e),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,e)})}function At(){return typeof navigator<`u`?navigator.onLine:!0}function jt(){return!0}var Mt=`objectui-offline-queue`;function Nt(){if(typeof localStorage>`u`)return[];try{let e=localStorage.getItem(Mt);return e?JSON.parse(e):[]}catch{return[]}}function Pt(e){if(!(typeof localStorage>`u`))try{localStorage.setItem(Mt,JSON.stringify(e))}catch{}}var Ft=0;function It(){return Ft+=1,`mut_${Date.now()}_${Ft}`}var Lt={enabled:!0,strategy:`network_first`,offlineIndicator:!0,offlineMessage:`You are currently offline. Changes will be synced when reconnected.`,queueMaxSize:100};function Rt(e={}){let{enabled:t=Lt.enabled,strategy:n=Lt.strategy,offlineIndicator:r=Lt.offlineIndicator,offlineMessage:i=Lt.offlineMessage,queueMaxSize:a=Lt.queueMaxSize,sync:o}=e,s=(0,I.useSyncExternalStore)(kt,At,jt),[c,l]=(0,I.useState)(Nt),[u,d]=(0,I.useState)(`idle`),f=(0,I.useRef)(o);f.current=o,(0,I.useEffect)(()=>{Pt(c)},[c]),(0,I.useEffect)(()=>{t&&(s?u===`offline`&&d(`idle`):d(`offline`))},[s,t,u]);let p=(0,I.useCallback)(e=>{t&&l(t=>{let n={...e,id:It(),timestamp:Date.now()},r=[...t,n];return r.length>a?r.slice(r.length-a):r})},[t,a]),m=(0,I.useCallback)(()=>{l([])},[]),h=(0,I.useCallback)(async()=>{if(!(!t||c.length===0)){d(`syncing`);try{let e=f.current?.batchSize??c.length,t=c.slice(0,e);await new Promise(e=>setTimeout(e,0)),l(e=>e.filter(e=>!t.some(t=>t.id===e.id))),d(`idle`)}catch{d(`error`)}}},[t,c]);return(0,I.useEffect)(()=>{if(!t||!s||c.length===0)return;let e=setTimeout(()=>{h()},100);return()=>clearTimeout(e)},[s,t]),(0,I.useMemo)(()=>({isOnline:s,enabled:t,syncState:u,strategy:n,pendingCount:c.length,queueMutation:p,sync:h,clearQueue:m,showIndicator:r&&!s,offlineMessage:i}),[s,t,u,n,c.length,p,h,m,r,i])}function zt(){return{canUndo:j.canUndo,canRedo:j.canRedo,undoDescription:j.peekUndo()?.description,redoDescription:j.peekRedo()?.description,history:j.getHistory()}}function Bt(){return{canUndo:!1,canRedo:!1,undoDescription:void 0,redoDescription:void 0,history:[]}}var Vt=zt();function Ht(e){return j.subscribe(()=>{Vt=zt(),e()})}function Ut(){return Vt}function Wt(e={}){let t=(0,I.useRef)(e);t.current=e;let n=(0,I.useSyncExternalStore)(Ht,Ut,Bt),r=(0,I.useCallback)(async(e,n,r)=>{let i=t.current.dataSource;if(!i)return;let a=r===`undo`?{create:`delete`,update:`update`,delete:`create`}[e.type]:e.type;a===`delete`?await i.delete(e.objectName,e.recordId):a===`update`?await i.update(e.objectName,e.recordId,n):await i.create(e.objectName,n)},[]),i=(0,I.useCallback)(async()=>{let e=j.popUndo();e&&(await r(e,e.undoData,`undo`),t.current.onUndo?.(e))},[r]),a=(0,I.useCallback)(async()=>{let e=j.popRedo();e&&(await r(e,e.redoData,`redo`),t.current.onRedo?.(e))},[r]);return(0,I.useEffect)(()=>{let e=e=>{!(e.ctrlKey||e.metaKey)||e.key.toLowerCase()!==`z`||(e.preventDefault(),e.shiftKey?a():i())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i,a]),(0,I.useMemo)(()=>({...n,undo:i,redo:a}),[n,i,a])}var Gt=(0,I.createContext)(null),Kt=({children:e,context:t={},onConfirm:n,onToast:r,onModal:i,onNavigate:a,onParamCollection:o,onResultDialog:s,handlers:c})=>{let[l,u]=(0,I.useState)(!1),[d,f]=(0,I.useState)(null),[p,m]=(0,I.useState)(null),h=(0,I.useMemo)(()=>{let e=new M({...t,ctx:t&&typeof t.ctx==`object`?{...t,...t.ctx}:{...t}});return n&&e.setConfirmHandler(n),r&&e.setToastHandler(r),i&&e.setModalHandler(i),a&&e.setNavigationHandler(a),o&&e.setParamCollectionHandler(o),s&&e.setResultDialogHandler(s),c&&Object.entries(c).forEach(([t,n])=>{e.registerHandler(t,n)}),e},[JSON.stringify(t)]),g=(0,I.useCallback)(async e=>{u(!0),f(null),m(null);try{let t=await h.execute(e);return m(t),t.success||f(t.error||`Action failed`),t}catch(e){let t=e.message;f(t);let n={success:!1,error:t};return m(n),n}finally{u(!1)}},[h]),_=(0,I.useCallback)(async(e,t)=>{u(!0),f(null),m(null);try{let n=await h.executeChain(e,t);return m(n),n.success||f(n.error||`Chain failed`),n}catch(e){let t=e.message;f(t);let n={success:!1,error:t};return m(n),n}finally{u(!1)}},[h]),v=(0,I.useCallback)(e=>{h.updateContext(e)},[h]),y=(0,I.useMemo)(()=>({execute:g,executeChain:_,loading:l,error:d,result:p,runner:h,updateContext:v}),[g,_,l,d,p,h,v]);return(0,L.jsx)(Gt.Provider,{value:y,children:e})};Kt.displayName=`ActionProvider`;function qt(){let e=(0,I.useContext)(Gt);if(!e){let e=new M;return{execute:t=>e.execute(t),executeChain:(t,n)=>e.executeChain(t,n),loading:!1,error:null,result:null,runner:e,updateContext:t=>e.updateContext(t)}}return e}function Jt(e={}){let{actions:t=[],context:n={}}=e,r=(0,I.useContext)(Gt)?.runner??null,i=(0,I.useMemo)(()=>{let e=n&&Object.keys(n).length>0?{...n,ctx:n.ctx&&typeof n.ctx==`object`?{...n,...n.ctx}:{...n}}:n,i=r?new he(r):new he(e);if(r&&n&&Object.keys(n).length>0){let e=i.getRunner(),t=e.getEvaluator().getContext().toObject(),r=t&&typeof t.ctx==`object`?t.ctx:{},a=n.ctx&&typeof n.ctx==`object`?n.ctx:n,o={...n,ctx:{...r,...a}};e.updateContext(o)}return i.registerActions(t),i},[r,JSON.stringify(t),JSON.stringify(n)]);return{getActionsForLocation:(0,I.useCallback)(e=>i.getActionsForLocation(e),[i]),getBulkActions:(0,I.useCallback)(()=>i.getBulkActions(),[i]),executeAction:(0,I.useCallback)((e,t)=>i.executeAction(e,t),[i]),handleShortcut:(0,I.useCallback)(e=>i.handleShortcut(e),[i]),engine:i}}var Yt=(0,I.createContext)(null);function Xt(){return(0,I.useContext)(Yt)}var Zt=(0,I.createContext)(null);function Qt(){return(0,I.useContext)(Zt)||{apps:[],objects:[],dashboards:[],reports:[],pages:[],loading:!1,error:null,refresh:async()=>{},invalidate:()=>{},ensureType:async()=>[],getItem:async()=>null,getItemsByType:()=>[],getTypeStatus:()=>`ready`}}function $t(e,t){let{getItem:n}=Qt(),[r,i]=(0,I.useState)({item:null,loading:!!t,error:null});return(0,I.useEffect)(()=>{if(!t){i({item:null,loading:!1,error:null});return}let r=!1;return i(e=>({...e,loading:!0,error:null})),n(e,t).then(e=>{r||i({item:e,loading:!1,error:null})}).catch(e=>{r||i({item:null,loading:!1,error:e instanceof Error?e:Error(String(e))})}),()=>{r=!0}},[e,t,n]),r}function en(e,t){return!0}function tn(e,t={}){let n=Qt(),[r,i]=(0,I.useState)(!1),[a,o]=(0,I.useState)(null);(0,I.useEffect)(()=>{let e=!1;if(!n.ensureType){i(!0);return}return n.ensureType(`page`).then(()=>{e||(i(!0),o(null))}).catch(t=>{e||(o(t instanceof Error?t:Error(String(t))),i(!0))}),()=>{e=!0}},[n]);let s=(0,I.useMemo)(()=>{if(!e&&!t.pageName)return null;let r=Array.isArray(n.pages)?n.pages:[];if(!r.length)return null;if(t.pageName)return r.find(e=>e?.name===t.pageName)??null;let i=r.filter(n=>!n||(n.pageType??(n.type===`record`?`record`:void 0))!==`record`||n.object!==e?!1:en(n,t));return i.length?(i.sort((e,t)=>(t?.priority??0)-(e?.priority??0)),i[0]):null},[n.pages,e,t.pageName,t.recordType,t.profile,t.app,t.formFactor]),{page:c,slots:l}=(0,I.useMemo)(()=>s?s.kind===`slotted`?{page:null,slots:s.slots??{}}:{page:s,slots:null}:{page:null,slots:null},[s]);return{page:c,slots:l,loading:n.loading||!r,error:a??n.error??null}}function nn(e,t){let n=e?.titleFormat;if(n&&typeof n==`string`){let e=n.replace(/\{\{\s*([\w.]+)\s*\}\}/g,(e,n)=>{let r=n.split(`.`).reduce((e,t)=>e==null?e:e[t],t);return r==null?``:String(r)}).trim();if(e.length>0)return e}return t?.name||t?.full_name||t?.fullName||t?.title||t?.label||t?.subject||t?.id||t?._id||`Untitled`}function rn(e,t,n){if(!e)return 0;let r=e.toLowerCase(),i=(t||``).toLowerCase();return(n||``).toLowerCase()===r?110:i===r?100:i.startsWith(r)?80:i.split(/[\s_\-/.,:;()[\]]+/).filter(Boolean).some(e=>e.startsWith(r))?60:i.includes(r)?40:0}function an(e){let{query:t,objects:n,dataSource:r,objectNames:i,maxObjectsQueried:a=8,topPerObject:o=3,minLength:s=2,debounceMs:c=250,enabled:l=!0,getDisplayName:u=nn}=e,[d,f]=(0,I.useState)([]),[p,m]=(0,I.useState)(!1),[h,g]=(0,I.useState)(void 0),_=(0,I.useMemo)(()=>{if(!Array.isArray(n)||n.length===0)return[];let e=n;if(Array.isArray(i)&&i.length>0){let t=new Map;for(let e of n){let n=e?.name;typeof n==`string`&&t.set(n,e)}e=i.map(e=>t.get(e)).filter(e=>e!=null)}else e=n.filter(e=>e?.searchable!==!1);return e.slice(0,a)},[n,i,a]),v=(0,I.useMemo)(()=>_.map(e=>`${e?.name}:${e?.titleField??``}`).join(`|`),[_]),y=(0,I.useRef)(0);return(0,I.useEffect)(()=>{if(!l||!r||_.length===0){f([]),m(!1),g(void 0);return}let e=(t??``).trim();if(e.length<s){f([]),m(!1),g(void 0);return}let n=++y.current;m(!0),g(void 0);let i=setTimeout(()=>{if(y.current!==n)return;let t=_.map(t=>Promise.resolve().then(()=>r.find(t.name,{$search:e,$top:o})).then(e=>({obj:t,res:e,err:null})).catch(e=>({obj:t,res:null,err:e})));Promise.allSettled(t).then(t=>{if(y.current!==n)return;let r=[],i;for(let n of t){if(n.status!==`fulfilled`)continue;let{obj:t,res:a,err:s}=n.value;if(s){let e=s?.httpStatus??s?.status,t=s?.code;if(e===404||t===`object_not_found`)continue;i=s instanceof Error?s:Error(String(s));continue}let c=Array.isArray(a?.data)?a.data:Array.isArray(a)?a:[];for(let n of c.slice(0,o)){let i=n?.id??n?._id;if(i==null)continue;let a=u(t,n);r.push({objectName:t.name,objectLabel:typeof t.label==`string`&&t.label.length>0?t.label:t.name,recordId:String(i),display:a,icon:t?.icon,score:rn(e,a,String(i)),raw:n})}}r.sort((e,t)=>t.score-e.score),f(r),m(!1),g(i)})},c);return()=>{clearTimeout(i)}},[t,l,r,v,o,s,c,u]),{results:d,isSearching:p,error:h}}var on=(0,I.createContext)(!1),sn=({value:e=!0,children:t})=>(0,L.jsx)(on.Provider,{value:e,children:t}),cn=()=>(0,I.useContext)(on);(0,I.createContext)(null);var ln=(0,I.createContext)(null),un=({children:e,config:t={},onDragStart:n,onDrop:r,onDragCancel:i})=>{let a=(0,I.useMemo)(()=>({enabled:!0,showPreview:!0,autoScroll:!0,...t}),[JSON.stringify(t)]),[o,s]=(0,I.useState)(null),[c]=(0,I.useState)(()=>new Map),l=(0,I.useCallback)(e=>{a.enabled&&(s(e),n?.({item:e,targetZoneId:null,effect:`move`}))},[a.enabled,n]),u=(0,I.useCallback)(e=>{if(!o)return;let t=(e?c.get(e):void 0)?.effect??`move`;r?.({item:o,targetZoneId:e??null,effect:t}),s(null)},[o,c,r]),d=(0,I.useCallback)(()=>{o&&(i?.({item:o,targetZoneId:null,effect:`none`}),s(null))},[o,i]),f=(0,I.useCallback)(e=>{c.set(e.id,e)},[c]),p=(0,I.useCallback)(e=>{c.delete(e)},[c]),m=(0,I.useCallback)((e,t)=>{let n=c.get(e);return!n||n.disabled?!1:n.acceptTypes.includes(t)},[c]),h=(0,I.useMemo)(()=>({config:a,enabled:a.enabled??!0,activeItem:o,dropZones:c,startDrag:l,endDrag:u,cancelDrag:d,registerDropZone:f,unregisterDropZone:p,canDrop:m}),[a,o,c,l,u,d,f,p,m]);return(0,L.jsx)(ln.Provider,{value:h,children:e})};un.displayName=`DndProvider`;function dn(){let e=(0,I.useContext)(ln);if(!e)throw Error(`useDnd must be used within a <DndProvider>. Wrap your app with <DndProvider> to use the drag and drop system.`);return e}function fn(){return(0,I.useContext)(ln)!==null}var pn=I.createContext(null),mn=({children:e})=>{let t=I.useMemo(()=>{let e=new Map,t=yn,n=new Set,r=()=>{let r=new Set;for(let t of e.values())for(let e of t)r.add(e);if(r.size===t.size){let e=!0;for(let n of r)if(!t.has(n)){e=!1;break}if(e)return}t=r,n.forEach(e=>e())};return{getNames:()=>t,subscribe:e=>(n.add(e),()=>{n.delete(e)}),register:(t,n)=>{let i=e.get(t);i&&i.length===n.length&&i.every((e,t)=>e===n[t])||(e.set(t,[...n]),r())},unregister:t=>{e.delete(t)&&r()}}},[]);return(0,L.jsx)(pn.Provider,{value:t,children:e})};function hn(){let e=I.useContext(pn);return I.useSyncExternalStore(e?e.subscribe:_n,e?e.getNames:vn,e?e.getNames:vn)}function gn(e,t){let n=I.useContext(pn),r=t.join(`|`);I.useEffect(()=>{if(n)return n.register(e,r.length===0?[]:r.split(`|`)),()=>n.unregister(e)},[n,e,r])}var _n=e=>()=>{},vn=()=>yn,yn=new Set,bn=I.createContext(null),xn=({children:e,...t})=>{let n=I.useMemo(()=>t,[t.objectName,t.recordId,t.dataSource,t.data,t.objectSchema,t.loading,t.error,t.refresh,t.embedded,t.headerSystemActions,t.isFavorite,t.onToggleFavorite]);return(0,L.jsx)(bn.Provider,{value:n,children:e})};function Sn(){return I.useContext(bn)}var Cn=I.createContext(null),wn=({children:e,...t})=>{let n=I.useMemo(()=>t,[t.items,t.onAddComment,t.onAddReply,t.onToggleReaction,t.mentionSuggestions,t.onUploadAttachments,t.loading,t.error]);return(0,L.jsx)(Cn.Provider,{value:n,children:e})};function Tn(){return I.useContext(Cn)}var En=(0,I.createContext)({}),Dn=({value:e,children:t})=>(0,L.jsx)(En.Provider,{value:e,children:t});function On(){return(0,I.useContext)(En)}var kn=e=>e.type===`checkbox`,R=e=>e instanceof Date,z=e=>e==null,An=e=>typeof e==`object`,B=e=>!z(e)&&!Array.isArray(e)&&An(e)&&!R(e),jn=e=>B(e)&&e.target?kn(e.target)?e.target.checked:e.target.value:e,Mn=(e,t)=>t.split(`.`).some((t,n,r)=>!isNaN(Number(t))&&e.has(r.slice(0,n).join(`.`))),Nn=e=>{let t=e.constructor&&e.constructor.prototype;return B(t)&&t.hasOwnProperty(`isPrototypeOf`)},Pn=typeof window<`u`&&window.HTMLElement!==void 0&&typeof document<`u`;function V(e){if(e instanceof Date)return new Date(e);let t=typeof FileList<`u`&&e instanceof FileList;if(Pn&&(e instanceof Blob||t))return e;let n=Array.isArray(e);if(!n&&!(B(e)&&Nn(e)))return e;let r=n?[]:Object.create(Object.getPrototypeOf(e));for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=V(e[t]));return r}var H={BLUR:`blur`,FOCUS_OUT:`focusout`,CHANGE:`change`,SUBMIT:`submit`,TRIGGER:`trigger`,VALID:`valid`},U={onBlur:`onBlur`,onChange:`onChange`,onSubmit:`onSubmit`,onTouched:`onTouched`,all:`all`},W={max:`max`,min:`min`,maxLength:`maxLength`,minLength:`minLength`,pattern:`pattern`,required:`required`,validate:`validate`},Fn=`root`,In=[`__proto__`,`constructor`,`prototype`],Ln=/^\w*$/,Rn=e=>Ln.test(e),G=e=>e===void 0,zn=/[.[\]'"]/,Bn=e=>e.split(zn).filter(Boolean),K=(e,t,n)=>{if(!t||!B(e))return n;let r=Rn(t)?[t]:Bn(t);if(r.some(e=>In.includes(e)))return n;let i=r.reduce((e,t)=>z(e)?void 0:e[t],e);return G(i)||i===e?G(e[t])?n:e[t]:i},q=e=>typeof e==`boolean`,J=e=>typeof e==`function`,Y=(e,t,n)=>{let r=-1,i=Rn(t)?[t]:Bn(t),a=i.length,o=a-1;for(;++r<a;){let t=i[r],a=n;if(r!==o){let n=e[t];a=B(n)||Array.isArray(n)?n:isNaN(+i[r+1])?{}:[]}if(In.includes(t))return;e[t]=a,e=e[t]}},Vn=I.createContext(null);Vn.displayName=`HookFormControlContext`;var Hn=()=>I.useContext(Vn),Un=(e,t,n,r=!0)=>{let i={};for(let a in e)Object.defineProperty(i,a,{get:()=>{let i=a;return t._proxyFormState[i]!==U.all&&(t._proxyFormState[i]=!r||U.all),n&&(n[i]=!0),e[i]}});return i},Wn=Pn?I.useLayoutEffect:I.useEffect;function Gn(e){let t=Hn(),{control:n=t,disabled:r,name:i,exact:a}=e||{},[o,s]=I.useState(()=>({...n._formState,defaultValues:n._defaultValues})),c=I.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,validatingFields:!1,isValidating:!1,isValid:!1,errors:!1});return Wn(()=>n._subscribe({name:i,formState:c.current,exact:a,callback:e=>{!r&&s({...n._formState,...e,defaultValues:n._defaultValues})}}),[i,r,a]),I.useEffect(()=>{c.current.isValid&&n._setValid(!0)},[n]),I.useMemo(()=>Un(o,n,c.current,!1),[o,n])}var X=e=>typeof e==`string`,Kn=(e,t,n,r,i)=>X(e)?(r&&t.watch.add(e),K(n,e,i)):Array.isArray(e)?e.map(e=>(r&&t.watch.add(e),K(n,e))):(r&&(t.watchAll=!0),n),qn=e=>z(e)||!An(e),Jn=(e,t)=>t.length===0&&!Array.isArray(e)&&!Nn(e);function Z(e,t,n=new WeakMap){if(e===t)return!0;if(qn(e)||qn(t))return Object.is(e,t);if(R(e)&&R(t))return Object.is(e.getTime(),t.getTime());let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;if(Jn(e,r)||Jn(t,i))return Object.is(e,t);if(!r.length&&Array.isArray(e)!==Array.isArray(t))return!1;let a=n.get(e);if(a&&a.has(t))return!0;if(a)a.add(t);else{let r=new WeakSet;r.add(t),n.set(e,r)}for(let i of r){let r=e[i];if(!(i in t))return!1;if(i!==`ref`){let e=t[i];if(R(r)&&R(e)||(B(r)||Array.isArray(r))&&(B(e)||Array.isArray(e))?!Z(r,e,n):!Object.is(r,e))return!1}}return!0}function Yn(e){let t=Hn(),{control:n=t,name:r,defaultValue:i,disabled:a,exact:o,compute:s}=e||{},c=I.useRef(i),l=I.useRef(s),u=I.useRef(void 0),d=I.useRef(n),f=I.useRef(r);l.current=s;let[p,m]=I.useState(()=>{let e=n._getWatch(r,c.current);return l.current?l.current(e):e}),h=I.useCallback(e=>{let t=Kn(r,n._names,e||n._formValues,!1,c.current);return l.current?l.current(t):t},[n._formValues,n._names,r]),g=I.useCallback(e=>{if(!a){let t=Kn(r,n._names,e||n._formValues,!1,c.current);if(l.current){let e=l.current(t);Z(e,u.current)||(m(e),u.current=e)}else m(t)}},[n._formValues,n._names,a,r]);Wn(()=>((d.current!==n||!Z(f.current,r))&&(d.current=n,f.current=r,g()),n._subscribe({name:r,formState:{values:!0},exact:o,callback:e=>{g(e.values)}})),[n,o,r,g]),I.useEffect(()=>n._removeUnmounted());let _=d.current!==n,v=f.current,y=I.useMemo(()=>{if(a)return null;let e=!_&&!Z(v,r);return _||e?h():null},[a,_,r,v,h]);return y===null?p:y}function Xn(e){let t=Hn(),{name:n,disabled:r,control:i=t,shouldUnregister:a,defaultValue:o,exact:s=!0}=e,c=Mn(i._names.array,n),l=Yn({control:i,name:n,defaultValue:I.useMemo(()=>K(i._formValues,n,K(i._defaultValues,n,o)),[i,n,o]),exact:s}),u=Gn({control:i,name:n,exact:s}),d=I.useRef(e),f=I.useRef(null),p=I.useRef(i.register(n,{...e.rules,value:l,...q(e.disabled)?{disabled:e.disabled}:{}}));d.current=e;let m=I.useMemo(()=>Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!K(u.errors,n)},isDirty:{enumerable:!0,get:()=>!!K(u.dirtyFields,n)},isTouched:{enumerable:!0,get:()=>!!K(u.touchedFields,n)},isValidating:{enumerable:!0,get:()=>!!K(u.validatingFields,n)},error:{enumerable:!0,get:()=>K(u.errors,n)}}),[u,n]),h=I.useCallback(e=>{let t=jn(e);return K(i._fields,n)||(p.current=i.register(n,{...d.current.rules,value:t})),p.current.onChange({target:{value:jn(e),name:n},type:H.CHANGE})},[n,i]),g=I.useCallback(()=>p.current.onBlur({target:{value:K(i._formValues,n),name:n},type:H.BLUR}),[n,i._formValues]),_=I.useCallback(e=>{e&&(f.current={focus:()=>J(e.focus)&&e.focus(),select:()=>J(e.select)&&e.select(),setCustomValidity:t=>J(e.setCustomValidity)&&e.setCustomValidity(t),reportValidity:()=>J(e.reportValidity)&&e.reportValidity()});let t=K(i._fields,n);t&&t._f&&e&&(t._f.ref=f.current)},[i._fields,n]),v=I.useMemo(()=>({name:n,value:l,...q(r)||u.disabled?{disabled:u.disabled||r}:{},onChange:h,onBlur:g,ref:_}),[n,r,u.disabled,h,g,_,l]);return I.useEffect(()=>{let e=i._options.shouldUnregister||a;i.register(n,{...d.current.rules,...q(d.current.disabled)?{disabled:d.current.disabled}:{}});let t=(e,t)=>{let n=K(i._fields,e);n&&n._f&&(n._f.mount=t)};if(t(n,!0),e){let e=V(K(a?i._defaultValues:i._options.values||i._defaultValues,n,K(i._options.defaultValues,n,d.current.defaultValue)));Y(i._defaultValues,n,e),G(K(i._formValues,n))&&Y(i._formValues,n,e)}if(!c&&i.register(n),f.current){let e=K(i._fields,n);e&&e._f&&(e._f.ref=f.current)}return()=>{(c?e&&!i._state.action:e)?i.unregister(n):t(n,!1)}},[n,i,c,a]),I.useEffect(()=>{i._setDisabledField({disabled:r,name:n})},[r,n,i]),I.useMemo(()=>({field:v,formState:u,fieldState:m}),[v,u,m])}var Zn=e=>e.render(Xn(e)),Qn=I.createContext(null);Qn.displayName=`HookFormContext`;var $n=()=>I.useContext(Qn),er=({children:e,watch:t,getValues:n,getFieldState:r,setError:i,clearErrors:a,setValue:o,setValues:s,trigger:c,formState:l,resetField:u,reset:d,handleSubmit:f,unregister:p,control:m,register:h,setFocus:g,subscribe:_})=>{let v=I.useMemo(()=>({watch:t,getValues:n,getFieldState:r,setError:i,clearErrors:a,setValue:o,setValues:s,trigger:c,formState:l,resetField:u,reset:d,handleSubmit:f,unregister:p,control:m,register:h,setFocus:g,subscribe:_}),[a,m,l,r,n,f,h,d,u,i,g,o,s,_,c,p,t]);return I.createElement(Qn.Provider,{value:v},I.createElement(Vn.Provider,{value:v.control},e))},tr=(e,t,n,r,i)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:i||!0}}:{},nr=e=>Array.isArray(e)?e.filter(Boolean):[],rr=e=>Array.isArray(e)?e:[e],ir=()=>{let e=[];return{get observers(){return e},next:t=>{for(let n of e)n.next&&n.next(t)},subscribe:t=>(e.push(t),{unsubscribe:()=>{e=e.filter(e=>e!==t)}}),unsubscribe:()=>{e=[]}}};function ar(e,t){let n={};for(let r in e)if(e.hasOwnProperty(r)){let i=e[r],a=t[r];if(i&&B(i)&&a){let e=ar(i,a);B(e)&&(n[r]=e)}else e[r]&&(n[r]=a)}return n}var Q=e=>B(e)&&!Object.keys(e).length,or=e=>e.type===`file`,sr=e=>{if(!Pn)return!1;let t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},cr=e=>e.type===`select-multiple`,lr=e=>e.type===`radio`,ur=e=>lr(e)||kn(e),dr=e=>sr(e)&&e.isConnected;function fr(e,t){let n=t.slice(0,-1).length,r=0;for(;r<n;){if(z(e)){e=void 0;break}e=e[t[r]],r++}return e}function pr(e){for(let t in e)if(e.hasOwnProperty(t)&&!G(e[t]))return!1;return!0}function $(e,t){if(X(t)&&Object.prototype.hasOwnProperty.call(e,t))return delete e[t],e;let n=Array.isArray(t)?t:Rn(t)?[t]:Bn(t),r=n.length===1?e:fr(e,n),i=n.length-1,a=n[i];return r&&delete r[a],i!==0&&(B(r)&&Q(r)||Array.isArray(r)&&pr(r))&&$(e,n.slice(0,-1)),e}var mr=e=>{for(let t in e)if(J(e[t]))return!0;return!1};function hr(e){return Array.isArray(e)||B(e)&&!mr(e)}function gr(e,t={}){for(let n in e){let r=e[n];hr(r)?(t[n]=Array.isArray(r)?[]:{},gr(r,t[n])):G(r)||(t[n]=!0)}return t}function _r(e){if(e!==!1){if(e===!0)return!0;if(Array.isArray(e)){let t=e.map(e=>_r(e));return t.some(e=>e!==void 0)?t:void 0}if(B(e)){let t={};for(let n in e){let r=_r(e[n]);G(r)||(t[n]=r)}return Object.keys(t).length?t:void 0}}}function vr(e,t,n){n||=gr(t);for(let r in e){let i=e[r];if(hr(i))G(t)||qn(n[r])?n[r]=gr(i,Array.isArray(i)?[]:{}):vr(i,z(t)?{}:t[r],n[r]);else{let e=t[r];n[r]=!Z(i,e)}}return _r(n)||{}}var yr={value:!1,isValid:!1},br={value:!0,isValid:!0},xr=e=>{if(Array.isArray(e)){if(e.length>1){let t=e.filter(e=>e&&e.checked&&!e.disabled).map(e=>e.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!G(e[0].attributes.value)?G(e[0].value)||e[0].value===``?br:{value:e[0].value,isValid:!0}:br:yr}return yr},Sr=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>G(e)?e:t?e===``?NaN:e&&+e:n&&X(e)?new Date(e):r?r(e):e,Cr={isValid:!1,value:null},wr=e=>Array.isArray(e)?e.reduce((e,t)=>t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:e,Cr):Cr;function Tr(e){let t=e.ref;return or(t)?t.files:lr(t)?wr(e.refs).value:cr(t)?[...t.selectedOptions].map(({value:e})=>e):kn(t)?xr(e.refs).value:Sr(G(t.value)?e.ref.value:t.value,e)}var Er=(e,t,n,r)=>{let i={};for(let n of e){let e=K(t,n);e&&Y(i,n,e._f)}return{criteriaMode:n,names:[...e],fields:i,shouldUseNativeValidation:r}},Dr=e=>e instanceof RegExp,Or=e=>G(e)?e:Dr(e)?e.source:B(e)?Dr(e.value)?e.value.source:e.value:e,kr=e=>({isOnSubmit:!e||e===U.onSubmit,isOnBlur:e===U.onBlur,isOnChange:e===U.onChange,isOnAll:e===U.all,isOnTouch:e===U.onTouched}),Ar=`AsyncFunction`,jr=e=>{if(!e||!e.validate)return!1;if(J(e.validate))return e.validate.constructor.name===Ar;if(B(e.validate)){for(let t in e.validate)if(e.validate[t].constructor.name===Ar)return!0}return!1},Mr=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),Nr=(e,t,n)=>{if(n)return!1;if(t.watchAll||t.watch.has(e))return!0;for(let n of t.watch)if(e.startsWith(n)&&e.charAt(n.length)===`.`)return!0;return!1},Pr=(e,t,n,r)=>{for(let i of n||Object.keys(e)){let n=K(e,i);if(n){let{_f:e,...a}=n;if(e){if(e.refs&&e.refs[0]&&t(e.refs[0],i)&&!r||e.ref&&t(e.ref,e.name)&&!r)return!0;if(Pr(a,t))break}else if(B(a)&&Pr(a,t))break}}};function Fr(e,t,n){let r=K(e,n);if(r||Rn(n))return{error:r,name:n};let i=n.split(`.`);for(;i.length;){let r=i.join(`.`),a=K(t,r),o=K(e,r);if(a&&!Array.isArray(a)&&n!==r)return{name:n};if(o&&o.type)return{name:r,error:o};if(o&&o.root&&o.root.type)return{name:`${r}.root`,error:o.root};i.pop()}return{name:n}}var Ir=(e,t,n,r)=>{n(e);let{name:i,...a}=e,o=Object.keys(a);return!o.length||r&&o.length>=Object.keys(t).length||o.find(e=>t[e]===(!r||U.all))},Lr=(e,t,n)=>!e||!t||e===t||rr(e).some(e=>e&&(n?e===t:e.startsWith(t)||t.startsWith(e))),Rr=(e,t,n,r,i)=>i.isOnAll?!1:!n&&i.isOnTouch?!(t||e):(n?r.isOnBlur:i.isOnBlur)?!e:(n?r.isOnChange:i.isOnChange)?e:!0,zr=(e,t)=>!nr(K(e,t)).length&&$(e,t),Br=(e,t,n)=>{let r=K(e,n),i=Array.isArray(r)?r:[];return Y(i,Fn,t[n]),Y(e,n,i),e};function Vr(e,t,n=`validate`){if(X(e)||Array.isArray(e)&&e.every(X)||q(e)&&!e)return{type:n,message:X(e)?e:``,ref:t}}var Hr=e=>B(e)&&!Dr(e)?e:{value:e,message:``},Ur=async(e,t,n,r,i,a)=>{let{ref:o,refs:s,required:c,maxLength:l,minLength:u,min:d,max:f,pattern:p,validate:m,name:h,valueAsNumber:g,mount:_}=e._f,v=K(n,h);if(!_||t.has(h))return{};let y=s?s[0]:o,b=e=>{if(i&&y.reportValidity){let t=q(e)?``:e||``;s?s.forEach(e=>e.setCustomValidity(t)):y.setCustomValidity(t),y.reportValidity()}},x={},ee=lr(o),S=kn(o),C=ee||S,w=(g||or(o))&&G(o.value)&&G(v)||sr(o)&&o.value===``||v===``||Array.isArray(v)&&!v.length,T=tr.bind(null,h,r,x),E=(e,t,n,r=W.maxLength,i=W.minLength)=>{let a=e?t:n;x[h]={type:e?r:i,message:a,ref:o,...T(e?r:i,a)}};if(a?!Array.isArray(v)||!v.length:c&&(!C&&(w||z(v))||q(v)&&!v||S&&!xr(s).isValid||ee&&!wr(s).isValid)){let{value:e,message:t}=X(c)?{value:!!c,message:c}:Hr(c);if(e&&(x[h]={type:W.required,message:t,ref:y,...T(W.required,t)},!r))return b(t),x}if(!w&&(!z(d)||!z(f))){let e,t,n=Hr(f),i=Hr(d);if(!z(v)&&!isNaN(v)){let r=o.valueAsNumber||v&&+v;z(n.value)||(e=r>n.value),z(i.value)||(t=r<i.value)}else{let r=o.valueAsDate||new Date(v),a=e=>new Date(new Date().toDateString()+` `+e),s=o.type==`time`,c=o.type==`week`;X(n.value)&&v&&(e=s?a(v)>a(n.value):c?v>n.value:r>new Date(n.value)),X(i.value)&&v&&(t=s?a(v)<a(i.value):c?v<i.value:r<new Date(i.value))}if((e||t)&&(E(!!e,n.message,i.message,W.max,W.min),!r))return b(x[h].message),x}if((l||u)&&!w&&(X(v)||a&&Array.isArray(v))){let e=Hr(l),t=Hr(u),n=!z(e.value)&&v.length>+e.value,i=!z(t.value)&&v.length<+t.value;if((n||i)&&(E(n,e.message,t.message),!r))return b(x[h].message),x}if(p&&!w&&X(v)){let{value:e,message:t}=Hr(p);if(Dr(e)&&!v.match(e)&&(x[h]={type:W.pattern,message:t,ref:o,...T(W.pattern,t)},!r))return b(t),x}if(m){if(J(m)){let e=Vr(await m(v,n),y);if(e&&(x[h]={...e,...T(W.validate,e.message)},!r))return b(e.message),x}else if(B(m)){let e={};for(let t in m){if(!Q(e)&&!r)break;let i=Vr(await m[t](v,n),y,t);i&&(e={...i,...T(t,i.message)},b(i.message),r&&(x[h]=e))}if(!Q(e)&&(x[h]={ref:y,...e},!r))return x}}return b(!0),x},Wr={mode:U.onSubmit,reValidateMode:U.onChange,shouldFocusError:!0},Gr=`form`,Kr={submitCount:0,isDirty:!1,isReady:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{}};function qr(e={}){let t={...Wr,...e},n={...V(Kr),isLoading:J(t.defaultValues),errors:t.errors||{},disabled:t.disabled||!1},r={},i=(B(t.defaultValues)||B(t.values))&&V(t.defaultValues||t.values)||{},a=t.shouldUnregister?{}:V(i),o={action:!1,mount:!1,watch:!1,keepIsValid:!1},s={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set,registerName:new Set},c,l=0,u=0,d=kr(t.mode),f=kr(t.reValidateMode),p={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},m={...p},h={...m},g={array:ir(),state:ir()},_=t.criteriaMode===U.all,v=e=>t=>{clearTimeout(l),l=setTimeout(e,t)},y=async e=>{if(!o.keepIsValid&&!t.disabled&&(m.isValid||h.isValid||e)){let e;t.resolver?(e=Q((await O()).errors),b()):e=await k({fields:r,onlyCheckValid:!0,eventType:H.VALID}),e!==n.isValid&&g.state.next({isValid:e})}},b=(e,r)=>{!t.disabled&&(m.isValidating||m.validatingFields||h.isValidating||h.validatingFields)&&((e||Array.from(s.mount)).forEach(e=>{e&&(r?Y(n.validatingFields,e,r):$(n.validatingFields,e))}),g.state.next({validatingFields:n.validatingFields,isValidating:!Q(n.validatingFields)}))},x=()=>{n.dirtyFields=vr(i,a)},ee=(e,i=[],s,c,l=!0,u=!0)=>{if(c&&s&&!t.disabled){if(o.action=!0,u&&Array.isArray(K(r,e))){let t=s(K(r,e),c.argA,c.argB);l&&Y(r,e,t)}if(u&&Array.isArray(K(n.errors,e))){let t=s(K(n.errors,e),c.argA,c.argB);l&&Y(n.errors,e,t),zr(n.errors,e)}if((m.touchedFields||h.touchedFields)&&u&&Array.isArray(K(n.touchedFields,e))){let t=s(K(n.touchedFields,e),c.argA,c.argB);l&&Y(n.touchedFields,e,t)}(m.dirtyFields||h.dirtyFields)&&x(),g.state.next({name:e,isDirty:A(e,i),dirtyFields:n.dirtyFields,errors:n.errors,isValid:n.isValid})}else Y(a,e,i)},S=(e,t)=>{Y(n.errors,e,t),n.errors={...n.errors},g.state.next({errors:n.errors})},C=e=>{n.errors=e,g.state.next({errors:n.errors,isValid:!1})},w=e=>{let t=Rn(e)?[e]:Bn(e),n=a,r=i;for(let e=0;e<t.length-1;e++){let i=t[e];if(n=z(n)?n:n[i],r=z(r)?r:r[i],n===null&&r!==null)return!0}return!1},T=(t,c,l,u)=>{let d=K(r,t);if(d){if(w(t))return;let r=G(K(a,t)),f=K(a,t,G(l)?K(i,t):l);G(f)||u&&u.defaultChecked||c?Y(a,t,c?f:Tr(d._f)):M(t,f),o.mount&&!o.action&&(y(),r&&n.isDirty&&(m.isDirty||h.isDirty)&&(A()||(n.isDirty=!1,g.state.next({...n}))),e.shouldUnregister&&r&&!G(K(a,t))&&Nr(t,s)&&(o.watch=!0))}},E=(e,r,o,s,c)=>{let l=!1,u=!1,d={name:e};if(!t.disabled){if(!o||s){let t=Z(K(i,e),r);(m.isDirty||h.isDirty)&&(u=n.isDirty,n.isDirty=d.isDirty=!t||A(),l=u!==d.isDirty),u=!!K(n.dirtyFields,e),t===n.isDirty?t?$(n.dirtyFields,e):Y(n.dirtyFields,e,!0):n.dirtyFields=vr(i,a),d.dirtyFields=n.dirtyFields,l||=(m.dirtyFields||h.dirtyFields)&&u!==!t}if(o){let t=K(n.touchedFields,e);t||(Y(n.touchedFields,e,o),d.touchedFields=n.touchedFields,l||=(m.touchedFields||h.touchedFields)&&t!==o)}l&&c&&g.state.next(d)}return l?d:{}},D=(e,r,i,a)=>{let o=K(n.errors,e),s=(m.isValid||h.isValid)&&q(r)&&n.isValid!==r;if(t.delayError&&i?(c=v(()=>S(e,i)),c(t.delayError)):(clearTimeout(l),c=null,i?Y(n.errors,e,i):$(n.errors,e),n.errors={...n.errors}),(i?!Z(o,i):o)||!Q(a)||s){let t={...a,...s&&q(r)?{isValid:r}:{},errors:n.errors,name:e};n={...n,...t},g.state.next(t)}},O=async e=>(b(e,!0),await t.resolver(a,t.context,Er(e||s.mount,r,t.criteriaMode,t.shouldUseNativeValidation))),te=async e=>{let{errors:t}=await O(e);if(b(e),e){for(let r of e){let e=K(t,r);e?s.array.has(r)&&B(e)&&!Object.keys(e).some(e=>!Number.isNaN(Number(e)))?Br(n.errors,{[r]:e},r):Y(n.errors,r,e):$(n.errors,r)}n.errors={...n.errors}}else n.errors=t;return t},ne=async({name:t,eventType:r})=>{if(e.validate){let i=await e.validate({formValues:a,formState:n,name:t,eventType:r});if(B(i))for(let e in i){let t=i[e];t&&he(`${Gr}.${e}`,{message:X(t.message)?t.message:``,type:t.type||W.validate})}else X(i)||!i?he(Gr,{message:i||``,type:W.validate}):me(Gr);return i}return!0},k=async({fields:r,onlyCheckValid:i,name:o,eventType:c,context:l={valid:!0,runRootValidation:!1}})=>{if(e.validate&&(l.runRootValidation=!0,!await ne({name:o,eventType:c})&&(l.valid=!1,i)))return l.valid;for(let o in r){let u=r[o];if(u){let{_f:r,...d}=u;if(r){let o=s.array.has(r.name),c=u._f&&jr(u._f),d=m.validatingFields||m.isValidating||h.validatingFields||h.isValidating;c&&d&&b([r.name],!0);let f=await Ur(u,s.disabled,a,_,t.shouldUseNativeValidation&&!i,o);if(c&&d&&b([r.name]),f[r.name]&&(l.valid=!1,i)||(!i&&(K(f,r.name)?o?Br(n.errors,f,r.name):Y(n.errors,r.name,f[r.name]):$(n.errors,r.name)),e.shouldUseNativeValidation&&f[r.name]))break}!Q(d)&&await k({context:l,onlyCheckValid:i,fields:d,name:o,eventType:c})}}return l.valid},re=()=>{for(let e of s.unMount){let t=K(r,e);t&&(t._f.refs?t._f.refs.every(e=>!dr(e)):!dr(t._f.ref))&&ve(e)}s.unMount=new Set},A=(e,n)=>!t.disabled&&(e&&n&&Y(a,e,n),!Z(o.mount?a:i,i)),ie=(e,t,n)=>Kn(e,s,{...o.mount?a:G(t)?i:X(e)?{[e]:t}:t},n,t),j=e=>nr(K(o.mount?a:i,e,t.shouldUnregister?K(i,e,[]):[])),M=(e,t,n={},i=!1,o=!1)=>{let s=K(r,e),c=t;if(s){let n=s._f;n&&(!n.disabled&&Y(a,e,Sr(t,n)),c=sr(n.ref)&&z(t)?``:t,cr(n.ref)?[...n.ref.options].forEach(e=>e.selected=c.includes(e.value)):n.refs?kn(n.ref)?n.refs.forEach(e=>{(!e.defaultChecked||!e.disabled)&&(Array.isArray(c)?e.checked=!!c.find(t=>t===e.value):e.checked=c===e.value||!!c)}):n.refs.forEach(e=>e.checked=e.value===c):or(n.ref)?n.ref.value=``:(n.ref.value=c,!n.ref.type&&!o&&g.state.next({name:e,values:i?a:V(a)})))}(n.shouldDirty||n.shouldTouch)&&E(e,c,n.shouldTouch,n.shouldDirty,!o),n.shouldValidate&&de(e)},ae=(e,t,n,i=!1,a=!1)=>{for(let o in t){if(!t.hasOwnProperty(o))return;let c=t[o],l=e+`.`+o,u=K(r,l);(s.array.has(e)||B(c)||u&&!u._f)&&!R(c)?ae(l,c,n,i,a):M(l,c,n,i,a)}},oe=(e,t,i,c,l=!1)=>{let u=K(r,e),d=s.array.has(e),f=c?t:V(t),p=Z(K(a,e),f);if(p||Y(a,e,f),d)g.array.next({name:e,values:c?a:V(a)}),(m.isDirty||m.dirtyFields||h.isDirty||h.dirtyFields)&&i.shouldDirty&&(x(),l||g.state.next({name:e,dirtyFields:n.dirtyFields,isDirty:A(e,f)}));else{let t=Array.isArray(f)&&!f.length||Q(f);!u||u._f||z(f)||t?M(e,f,i,c,l):ae(e,f,i,c,l)}if(!p&&!l){let t=Nr(e,s),r=c?a:V(a);g.state.next({...t&&n,name:o.mount||t?e:void 0,values:r})}},se=(e,t,n={})=>oe(e,t,n,!1),ce=(e,t={})=>{let r=J(e)?e(a):e;if(!Z(a,r)){a={...a,...r};for(let e of s.mount)oe(e,K(r,e),t,!0,!0);g.state.next({...n,name:void 0,type:void 0,...u?{values:a}:{}}),t.shouldValidate&&y()}},le=async i=>{o.mount=!0;let l=i.target,p=l.name,v=!0,x=K(r,p),ee=e=>{v=Number.isNaN(e)||R(e)&&isNaN(e.getTime())||Z(e,K(a,p,e))};if(x){let o,S,C=l.type?Tr(x._f):jn(i),w=i.type===H.BLUR||i.type===H.FOCUS_OUT,T=!Mr(x._f)&&!e.validate&&!t.resolver&&!K(n.errors,p)&&!x._f.deps,te=T||Rr(w,K(n.touchedFields,p),n.isSubmitted,f,d),re=Nr(p,s,w);Y(a,p,C),w?(!l||!l.readOnly)&&(x._f.onBlur&&x._f.onBlur(i),c&&c(0)):x._f.onChange&&x._f.onChange(i);let A=E(p,C,w),ie=!Q(A)||re;if(!w&&g.state.next({name:p,type:i.type,...u?{values:V(a)}:{}}),te)return(!T||!n.isValid)&&(m.isValid||h.isValid)&&(t.mode===`onBlur`?w&&y():w||y()),ie&&g.state.next({name:p,...re?{}:A});if(!t.resolver&&e.validate&&await ne({name:p,eventType:i.type}),!w&&re&&g.state.next({...n}),t.resolver){let{errors:e}=await O([p]);if(b([p]),ee(C),!v){!Q(A)&&g.state.next(A);return}let t=Fr(n.errors,r,p),i=Fr(e,r,t.name||p);o=i.error,p=i.name,S=Q(e)}else b([p],!0),o=(await Ur(x,s.disabled,a,_,t.shouldUseNativeValidation))[p],b([p]),ee(C),v&&(o?S=!1:(m.isValid||h.isValid)&&(S=await k({fields:r,onlyCheckValid:!0,name:p,eventType:i.type})));v&&(x._f.deps&&(!Array.isArray(x._f.deps)||x._f.deps.length>0)&&de(x._f.deps),D(p,S,o,A))}},ue=(e,t)=>{if(K(n.errors,t)&&e.focus)return e.focus(),1},de=async(e,i={})=>{let a,o,c=rr(e);if(t.resolver){let t=await te(G(e)?e:c);a=Q(t),o=e?!c.some(e=>K(t,e)):a}else e?(o=(await Promise.all(c.map(async e=>{let t=K(r,e);return await k({fields:t&&t._f?{[e]:t}:t,eventType:H.TRIGGER})}))).every(Boolean),!(!o&&!n.isValid)&&y()):o=a=await k({fields:r,name:e,eventType:H.TRIGGER});return g.state.next({...!X(e)||(m.isValid||h.isValid)&&a!==n.isValid?{}:{name:e},...t.resolver||!e?{isValid:a}:{},errors:n.errors}),i.shouldFocus&&!o&&Pr(r,ue,e?c:s.mount),o},fe=(e,t)=>{let r={...o.mount?a:i};return t&&(r=ar(t.dirtyFields?n.dirtyFields:n.touchedFields,r)),G(e)?r:X(e)?K(r,e):e.map(e=>K(r,e))},pe=(e,t)=>({invalid:!!K((t||n).errors,e),isDirty:!!K((t||n).dirtyFields,e),error:K((t||n).errors,e),isValidating:!!K(n.validatingFields,e),isTouched:!!K((t||n).touchedFields,e)}),me=e=>{let t=e?rr(e):void 0;t?.forEach(e=>$(n.errors,e)),t?t.forEach(e=>{g.state.next({name:e,errors:n.errors})}):g.state.next({errors:{}})},he=(e,t,i)=>{let a=(K(r,e,{_f:{}})._f||{}).ref,{ref:o,message:s,type:c,...l}=K(n.errors,e)||{};Y(n.errors,e,{...l,...t,ref:a}),g.state.next({name:e,errors:n.errors,isValid:!1}),i&&i.shouldFocus&&a&&a.focus&&a.focus()},ge=(e,t)=>{if(J(e)){u++;let{unsubscribe:n}=g.state.subscribe({next:n=>`values`in n&&e(n.values||ie(void 0,t),n)}),r=!1;return{unsubscribe:()=>{r||(r=!0,u--,n())}}}return ie(e,t,!0)},N=e=>{let t=!!e.formState?.values;t&&u++;let{unsubscribe:r}=g.state.subscribe({next:t=>{if(Lr(e.name,t.name,e.exact)&&Ir(t,e.formState||m,Ee,e.reRenderRoot)){let r={...a};e.callback({values:r,...n,...t,defaultValues:i})}}});if(!t)return r;let o=!1;return()=>{o||(o=!0,u--,r())}},_e=e=>(o.mount=!0,h={...h,...e.formState},N({...e,formState:{...p,...e.formState}})),ve=(e,o={})=>{for(let c of e?rr(e):s.mount)s.mount.delete(c),s.array.delete(c),o.keepValue||($(r,c),$(a,c)),!o.keepError&&$(n.errors,c),!o.keepDirty&&$(n.dirtyFields,c),!o.keepTouched&&$(n.touchedFields,c),!o.keepIsValidating&&$(n.validatingFields,c),!t.shouldUnregister&&!o.keepDefaultValue&&$(i,c);g.state.next({values:V(a)}),g.state.next({...n,...o.keepDirty?{isDirty:A()}:{}}),!o.keepIsValid&&y()},ye=({disabled:e,name:t})=>{if(q(e)&&o.mount||e||s.disabled.has(t)){let n=s.disabled.has(t)!==!!e;e?s.disabled.add(t):s.disabled.delete(t),n&&o.mount&&!o.action&&y()}},be=(e,n={})=>{let a=K(r,e),c=q(n.disabled)||q(t.disabled),l=!s.registerName.has(e)&&a&&a._f&&!a._f.mount;return Y(r,e,{...a||{},_f:{...a&&a._f?a._f:{ref:{name:e}},name:e,mount:!0,...n}}),s.mount.add(e),a&&!l?ye({disabled:q(n.disabled)?n.disabled:t.disabled,name:e}):T(e,!0,n.value),{...c?{disabled:n.disabled||t.disabled}:{},...t.progressive?{required:!!n.required,min:Or(n.min),max:Or(n.max),minLength:Or(n.minLength),maxLength:Or(n.maxLength),pattern:Or(n.pattern)}:{},name:e,onChange:le,onBlur:le,ref:c=>{if(c){s.registerName.add(e),be(e,n),s.registerName.delete(e),a=K(r,e);let t=G(c.value)&&c.querySelectorAll&&c.querySelectorAll(`input,select,textarea`)[0]||c,o=ur(t),l=a._f.refs||[];if(o?l.find(e=>e===t):t===a._f.ref)return;Y(r,e,{_f:{...a._f,...o?{refs:[...l.filter(dr),t,...Array.isArray(K(i,e))?[{}]:[]],ref:{type:t.type,name:e}}:{ref:t}}}),T(e,!1,void 0,t)}else a=K(r,e,{}),a._f&&(a._f.mount=!1),(t.shouldUnregister||n.shouldUnregister)&&!(Mn(s.array,e)&&o.action)&&s.unMount.add(e)}}},xe=()=>t.shouldFocusError&&!t.shouldUseNativeValidation&&Pr(r,ue,s.mount),P=e=>{q(e)&&(g.state.next({disabled:e}),Pr(r,(t,n)=>{let i=K(r,n);i&&(t.disabled=i._f.disabled||e,Array.isArray(i._f.refs)&&i._f.refs.forEach(t=>{t.disabled=i._f.disabled||e}))},0,!1))},Se=(e,i)=>async o=>{let c;o&&(o.preventDefault&&o.preventDefault(),o.persist&&o.persist());let l=V(a);if(g.state.next({isSubmitting:!0}),t.resolver){let{errors:e,values:t}=await O();b(),n.errors=e,l=V(t)}else await k({fields:r,eventType:H.SUBMIT});if(s.disabled.size)for(let e of s.disabled)$(l,e);if($(n.errors,Fn),Q(n.errors)){g.state.next({errors:{}});try{await e(l,o)}catch(e){c=e}}else i&&await i({...n.errors},o),xe(),setTimeout(xe);if(g.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:Q(n.errors)&&!c,submitCount:n.submitCount+1,errors:n.errors}),c)throw c},Ce=(e,t={})=>{K(r,e)&&(G(t.defaultValue)?se(e,V(K(i,e))):(se(e,t.defaultValue),Y(i,e,V(t.defaultValue))),t.keepTouched||$(n.touchedFields,e),t.keepDirty||($(n.dirtyFields,e),n.isDirty=t.defaultValue?A(e,V(K(i,e))):A()),t.keepError||($(n.errors,e),m.isValid&&y()),g.state.next({...n}))},we=(e,c={})=>{let l=e?V(e):i,u=V(l),d=Q(e),f=u;if(c.keepDefaultValues||(i=l),!c.keepValues){if(c.keepDirtyValues){let e=new Set([...s.mount,...Object.keys(vr(i,a))]);for(let t of Array.from(e)){let e=K(n.dirtyFields,t),r=K(a,t),i=K(f,t);e&&!G(r)?Y(f,t,r):!e&&!G(i)&&se(t,i)}}else{if(Pn&&G(e))for(let e of s.mount){let t=K(r,e);if(t&&t._f){let e=Array.isArray(t._f.refs)?t._f.refs[0]:t._f.ref;if(sr(e)){let t=e.closest(`form`);if(t){t.reset();break}}}}if(c.keepFieldsRef)for(let e of s.mount)se(e,K(f,e));else r={}}if(t.shouldUnregister){if(a=c.keepDefaultValues?V(i):{},c.keepFieldsRef)for(let e of s.mount)Y(a,e,K(f,e))}else a=V(f);g.array.next({values:{...f}}),g.state.next({values:{...f}})}s={mount:c.keepDirtyValues?s.mount:new Set,unMount:new Set,array:new Set,registerName:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:``},o.mount=!m.isValid||!!c.keepIsValid||!!c.keepDirtyValues||!t.shouldUnregister&&!Q(f),o.watch=!!t.shouldUnregister,o.keepIsValid=!!c.keepIsValid,o.action=!1,c.keepErrors||(n.errors={}),g.state.next({submitCount:c.keepSubmitCount?n.submitCount:0,isDirty:d?!1:c.keepDirty?n.isDirty:c.keepValues?A():!!(c.keepDefaultValues&&!Z(e,i)),isSubmitted:c.keepIsSubmitted?n.isSubmitted:!1,dirtyFields:d?{}:c.keepDirtyValues?c.keepDefaultValues&&a?vr(i,a):n.dirtyFields:c.keepDefaultValues&&e?vr(i,e):c.keepDirty?n.dirtyFields:{},touchedFields:c.keepTouched?n.touchedFields:{},errors:c.keepErrors?n.errors:{},isSubmitSuccessful:c.keepIsSubmitSuccessful?n.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:i})},F=(e,n)=>we(J(e)?e(a):e,{...t.resetOptions,...n}),Te=(e,t={})=>{let n=K(r,e),i=n&&n._f;if(i){let e=i.refs?i.refs[0]:i.ref;e.focus&&setTimeout(()=>{e.focus(),t.shouldSelect&&J(e.select)&&e.select()})}},Ee=e=>{n={...n,...e}},De={control:{register:be,unregister:ve,getFieldState:pe,handleSubmit:Se,setError:he,_subscribe:N,_runSchema:O,_updateIsValidating:b,_focusError:xe,_getWatch:ie,_getDirty:A,_setValid:y,_setFieldArray:ee,_setDisabledField:ye,_setErrors:C,_getFieldArray:j,_reset:we,_resetDefaultValues:()=>J(t.defaultValues)&&t.defaultValues().then(e=>{F(e,t.resetOptions),g.state.next({isLoading:!1})}),_removeUnmounted:re,_disableForm:P,_subjects:g,_proxyFormState:m,get _fields(){return r},get _formValues(){return a},get _state(){return o},set _state(e){o=e},get _defaultValues(){return i},get _names(){return s},set _names(e){s=e},get _formState(){return n},get _options(){return t},set _options(e){t={...t,...e},d=kr(t.mode),f=kr(t.reValidateMode)}},subscribe:_e,trigger:de,register:be,handleSubmit:Se,watch:ge,setValue:se,setValues:ce,getValues:fe,reset:F,resetField:Ce,resetDefaultValues:(e,t={})=>{if(i=V(e),!t.keepDirty){let e=vr(i,a);n.dirtyFields=e,n.isDirty=!Q(e)}t.keepIsValid||y(),g.state.next({...n,defaultValues:i})},clearErrors:me,unregister:ve,setError:he,setFocus:Te,getFieldState:pe};return{...De,formControl:De}}function Jr(e={}){let t=I.useRef(void 0),n=I.useRef(void 0),r=I.useRef(e.formControl),[i,a]=I.useState(()=>({...V(Kr),isLoading:J(e.defaultValues),errors:e.errors||{},disabled:e.disabled||!1,defaultValues:J(e.defaultValues)?void 0:e.defaultValues}));if(!t.current||e.formControl&&r.current!==e.formControl)if(r.current=e.formControl,e.formControl)t.current={...e.formControl,formState:i},e.defaultValues&&!J(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{let{formControl:n,...r}=qr(e);t.current={...r,formState:i}}let o=t.current.control;return o._options=e,Wn(()=>{let e=o._subscribe({formState:o._proxyFormState,callback:()=>a({...o._formState,defaultValues:o._defaultValues}),reRenderRoot:!0});return a(e=>({...e,isReady:!0})),o._formState.isReady=!0,e},[o]),I.useEffect(()=>o._disableForm(e.disabled),[o,e.disabled]),I.useEffect(()=>{e.mode&&(o._options.mode=e.mode),e.reValidateMode&&(o._options.reValidateMode=e.reValidateMode)},[o,e.mode,e.reValidateMode]),I.useEffect(()=>{e.errors&&(o._setErrors(e.errors),o._focusError())},[o,e.errors]),I.useEffect(()=>{e.shouldUnregister&&o._subjects.state.next({values:o._getWatch()})},[o,e.shouldUnregister]),I.useEffect(()=>{if(o._proxyFormState.isDirty){let e=o._getDirty();e!==i.isDirty&&o._subjects.state.next({isDirty:e})}},[o,i.isDirty]),I.useEffect(()=>{e.values&&!Z(e.values,n.current)?(o._reset(e.values,{keepFieldsRef:!0,...o._options.resetOptions}),o._options.resetOptions?.keepIsValid||o._setValid(),n.current=e.values,a(e=>({...e}))):o._resetDefaultValues()},[o,e.values]),I.useEffect(()=>{o._state.mount||(o._setValid(),o._state.mount=!0),o._state.watch&&(o._state.watch=!1,o._subjects.state.next({...o._formState})),o._removeUnmounted()}),t.current.formState=I.useMemo(()=>Un(i,o),[o,i]),t.current}var Yr={lookup:{recentlyUsed:`Recently used`,allResults:`All results`,loading:`Loading…`,noOptions:`No options found`,noRecords:`No records found`,createNew:`Create new`,createNamed:`Create new "{{name}}"`,showingResults:`Showing {{shown}} of {{total}} results`,showAllResults:`Show all results ({{count}})`,selectedBadge:`Selected`,browseAll:`Browse all records`,remove:`Remove {{label}}`,selectFirst:`Select {{fields}} first`,selectRecord:`Select record`,recordCount:`{{count}} records`,recordCountOne:`1 record`,pageOf:`Page {{current}} of {{total}}`,filters:`Filters`,clear:`Clear`,yes:`Yes`,filterPlaceholder:`Filter {{label}}`,prevPage:`Previous page`,nextPage:`Next page`,jumpToPage:`Jump to page`,retry:`Retry`},common:{loading:`Loading...`,save:`Save`,cancel:`Cancel`,delete:`Delete`,edit:`Edit`,create:`Create`,search:`Search`,filter:`Filter`,reset:`Reset`,confirm:`Confirm`,close:`Close`,back:`Back`,next:`Next`,previous:`Previous`,submit:`Submit`,refresh:`Refresh`,export:`Export`,import:`Import`,yes:`Yes`,no:`No`,ok:`OK`,actions:`Actions`,more:`More`,selectAll:`Select All`,clearAll:`Clear All`,addToFavorites:`Add to favorites`,removeFromFavorites:`Remove from favorites`,noData:`No data`,noResults:`No results found`,required:`Required`,optional:`Optional`,selectOption:`Select an option`,select:`Select...`,openChat:`Open chat`,closeChat:`Close chat`,toggleSidebar:`Toggle sidebar`,package:`Package`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}} is required`,minLength:`{{field}} must be at least {{min}} characters`,maxLength:`{{field}} must be at most {{max}} characters`,min:`{{field}} must be at least {{min}}`,max:`{{field}} must be at most {{max}}`,email:`Please enter a valid email address`,url:`Please enter a valid URL`,pattern:`{{field}} format is invalid`,unique:`{{field}} must be unique`,type:`{{field}} must be a valid {{type}}`},form:{addItem:`Add item`,removeItem:`Remove item`,fieldRequired:`This field is required`,invalidFormat:`Invalid format`,saveSuccess:`Saved successfully`,saveError:`Failed to save`,unsavedChanges:`You have unsaved changes. Are you sure you want to leave?`,stepOf:`Step {{current}} of {{total}}`,createTitle:`Create {{object}}`,editTitle:`Edit {{object}}`,createDescription:`Add a new {{object}} to your database.`,editDescription:`Update details for {{object}}`,saveRecord:`Save`,create:`Create`,update:`Update`,createSuccess:`{{object}} created successfully`,updateSuccess:`{{object}} updated successfully`,deleteSuccess:`{{object}} deleted successfully`},fields:{richText:{format:`Format: {{format}}`,basicEditorHint:`Rich text editor (basic)`,placeholder:`Enter text...`}},table:{rowsPerPage:`Rows per page`,showing:`Showing {{from}} to {{to}} of {{total}}`,noRows:`No rows to display`,sortAsc:`Sort ascending`,sortDesc:`Sort descending`,filterColumn:`Filter {{column}}`,columns:`Columns`,exportCSV:`Export CSV`,exportExcel:`Export Excel`,selectRow:`Select row`,selectAllRows:`Select all rows`,expandRow:`Expand row`,collapseRow:`Collapse row`,hideColumn:`Hide column`,freezeColumn:`Freeze column`,unfreezeColumn:`Unfreeze column`,pageInfo:`Page {{current}} of {{total}}`,totalRecords:`{{count}} total`,noResults:`No results found`,noResultsHint:`Try adjusting your filters or search query.`,cancelAll:`Cancel All`,saveAll:`Save All ({{count}})`,addRecord:`Add record`,open:`Open`,search:`Search...`,modified:`{{count}} row modified`,selected:`{{count}} selected`,edit:`Edit`,delete:`Delete`},grid:{actions:`Actions`,edit:`Edit`,delete:`Delete`,export:`Export`,exportAs:`Export as {{format}}`,loading:`Loading grid...`,errorLoading:`Error loading grid`,pullToRefresh:`Pull to refresh`,refreshing:`Refreshing…`,openRecord:`Open record`,openMenu:`Open menu`,rowHeight:`Row height: {{mode}}`,empty:`Empty`,yes:`Yes`,no:`No`,systemFields:`System`,toolbar:{densityMode:`Density`,densityCompact:`Compact`,densityComfortable:`Comfortable`,densitySpacious:`Spacious`,densityCycleHint:`{{label}} (click to cycle)`,densityCycleShortHint:`Click to cycle`},import:{title:`Import {{object}}`,stepUpload:`Upload`,stepMapping:`Mapping`,stepPreview:`Preview`,uploadDescription:`Upload a CSV file to get started.`,mappingDescription:`Map CSV columns to object fields.`,previewDescription:`Review data before importing.`,dragDrop:`Drag & drop a CSV file here, or click to browse`,browseFiles:`Browse Files`,onlyCsv:`Only CSV files are supported.`,fileNeedsHeader:`File must contain a header row and at least one data row.`,mappingTemplate:`Mapping template:`,chooseTemplate:`Choose template…`,noSavedTemplates:`No saved templates`,noneOption:`— None —`,saveCurrent:`Save current`,templateName:`Template name`,save:`Save`,deleteTemplate:`Delete template`,csvColumn:`CSV Column`,mapsTo:`Maps To`,status:`Status`,skipColumn:`Skip column`,skip:`— Skip —`,mapped:`Mapped`,skipped:`Skipped`,rowsWithErrors:`{{count}} row(s) with errors`,rowsCorrected:`{{count}} row(s) corrected`,clickToFix:`— click a highlighted cell to fix it inline.`,showingRows:`Showing {{shown}} of {{total}} rows`,importing:`Importing… {{progress}}%`,importComplete:`Import Complete`,imported:`{{count}} imported`,skippedCount:`{{count}} skipped`,moreErrors:`…and {{count}} more errors`,cancel:`Cancel`,back:`Back`,next:`Next`,close:`Close`,importNRows:`Import {{count}} Rows`,importingProgress:`Importing…`,requiredMark:`*`,required:`Required`,invalidType:`Invalid {{type}}`}},calendar:{today:`Today`,month:`Month`,week:`Week`,day:`Day`,agenda:`Agenda`,allDay:`All Day`,noEvents:`No events`,newEvent:`New event`,moreEvents:`+{{count}} more`},list:{loading:`Loading records…`,recordCount:`{{count}} records`,recordCountOne:`{{count}} record`,addRecord:`Add record`,tabs:`Tabs`,allRecords:`All Records`,search:`Search`,filter:`Filter`,filterRecords:`Filter Records`,sort:`Sort`,sortRecords:`Sort Records`,group:`Group`,groupBy:`Group By`,export:`Export`,exportAs:`Export as {{format}}`,color:`Color`,rowColor:`Row Color`,colorByField:`Color by field`,clear:`Clear`,none:`None`,hideFields:`Hide fields`,noItems:`No items found`,noItemsMessage:`There are no records to display. Try adjusting your filters or adding new data.`,firstRunTitle:`Nothing here yet`,firstRunMessage:`Create your first record to get started.`,noMatches:`No matching records`,noMatchesMessage:`No records match your current filters or search. Try adjusting or clearing them.`,loadErrorTitle:`Couldn’t load records`,loadErrorMessage:`Something went wrong while loading this data. Check your connection and try again.`,retry:`Retry`,managedBy:{system:{title:`Nothing here yet`,message:`Entries appear automatically when their source action runs (e.g. Submit for Approval, Share, Invite). Trigger one of those on a source record to create a row.`},appendOnly:{title:`No events recorded`,message:`This is an immutable audit log. Rows are written by the platform when events occur — you can export the history but cannot create entries from here.`},betterAuth:{title:`No identity records`,message:`Identity rows are managed by the authentication provider. Use the dedicated identity workflows (Invite User, Reset Password, …) to create new entries.`}},showAll:`Show all`,pullToRefresh:`Pull to refresh`,refreshing:`Refreshing…`,share:`Share`,print:`Print`,hideFieldsTitle:`Hide Fields`,dataLimitReached:`Showing first {{limit}} records. More data may be available.`,viewSettings:`View settings`,viewSettingsHint:`Grouping, color, density, and visible fields.`,addGroup:`Add group field`,collapsedByDefault:`Collapsed by default`,removeGroup:`Remove`},kanban:{addCard:`Add card`,addColumn:`Add column`,moveCard:`Move card`,deleteCard:`Delete card`,deleteColumn:`Delete column`,noCards:`No cards`,cardTitlePlaceholder:`Enter card title...`},timeline:{bucket:{overdue:`Overdue`,today:`Today`,tomorrow:`Tomorrow`,thisWeek:`This week`,nextWeek:`Next week`,later:`Later`,noDate:`No date`,unassigned:`Unassigned`}},gantt:{column:{taskName:`Task Name`,start:`Start`,end:`End`},toolbar:{prevPeriod:`Previous period`,nextPeriod:`Next period`,zoomIn:`Zoom in`,zoomOut:`Zoom out`,jumpToToday:`Jump to today`,today:`Today`,thisWeek:`This week`,thisMonth:`This month`,showTaskList:`Show task list`,hideTaskList:`Hide task list`,viewMode:`Timeline granularity`,enterFullscreen:`Enter fullscreen`,exitFullscreen:`Exit fullscreen`,criticalPath:`Highlight critical path`,autoSchedule:`Auto-schedule dependencies`,exportPng:`Export as PNG`,exportPdf:`Export PDF`,saveLayout:`Save layout`,undo:`Undo`,redo:`Redo`},viewMode:{day:`Day`,week:`Week`,month:`Month`,quarter:`Quarter`,year:`Year`},row:{expand:`Expand`,collapse:`Collapse`,locate:`Locate on timeline`},aria:{taskList:`Task list`},tooltip:{days:`d`},menu:{view:`View details`,edit:`Edit inline`,delete:`Delete`,addPredecessor:`Add predecessor…`,addSuccessor:`Add successor…`,removeDependency:`Remove dependency`,noCandidates:`No available tasks`},linkType:{fs:`Finish → Start`,ss:`Start → Start`,ff:`Finish → Finish`,sf:`Start → Finish`},conflict:{title:`Schedule conflict`,body:`This move conflicts with dependency constraints. Auto-reschedule {{count}} affected task(s)?`,confirm:`Auto-reschedule`,cancel:`Keep as is`},resource:{header:`Resource`,peak:`Peak`,over:`overloaded`,empty:`No tasks to allocate.`},readOnly:`Read-only`,readOnlyHint:`Editing is disabled for this view.`},view:{editViewConfig:`Edit view config`,rename:`Rename`,duplicateView:`Duplicate View`,shareView:`Share View`,setAsDefault:`Set as Default`,pinView:`Pin View`,unpinView:`Unpin View`,changeViewType:`Change View Type`,deleteView:`Delete View`,addView:`Add View`,unsavedChanges:`Unsaved changes`,saveAsView:`Save as View`,moreViews:`{{count}} more`,activeFilters:`Active filters`,activeSort:`Active sort`,manageViews:`Manage views`,manageAllViews:`Manage all views…`,manageViewsDescription:`Reorder, rename, pin, or delete every view in this object.`,searchViews:`Search views`,addNewView:`Add new view`,done:`Done`,noViewsFound:`No views match your search.`,dragToReorder:`Drag to reorder`,defaultView:`Default view`,defaultBadge:`default`,tabActionsFor:`View actions for {{name}}`,readonlyAriaLabel:`Read-only view`,readonlyTooltip:`System view — defined in code, read-only.`},detail:{back:`Back`,edit:`Edit`,editInline:`Edit`,save:`Save`,saveChanges:`Save changes`,saving:`Saving…`,editFieldsInline:`Edit fields`,lockedByApproval:`Locked for approval`,lockedTooltip:`This record has a pending approval request; editing is locked`,cancelApproval:`Recall approval`,cancelApprovalInFlight:`Recalling…`,cancelApprovalTooltip:`Recall the pending approval request to unlock this record`,cancelApprovalFailed:`Failed to recall approval`,cancelApprovalUnavailable:`Recalling approvals is not supported on this data source`,linkCopied:`Link copied to clipboard`,linkCopyFailed:`Failed to copy link`,cancel:`Cancel`,cancelEdit:`Discard changes`,sectionMoreDetails:`More details`,concurrentUpdateTitle:`This record was modified by someone else`,concurrentUpdateDescription:`Another user saved a newer version of {{field}} while you were editing. To prevent silently overwriting their change, please choose how to resolve the conflict.`,concurrentUpdateYourEdit:`Your edit`,concurrentUpdateCurrentValue:`Current value`,concurrentUpdateUpdatedBy:`Updated by {{name}}`,concurrentUpdateUpdatedAt:`Updated at {{when}}`,concurrentUpdateReload:`Reload latest`,concurrentUpdateOverwrite:`Overwrite anyway`,concurrentUpdateCancel:`Cancel`,openInNewTab:`Open in new tab`,share:`Share`,duplicate:`Duplicate`,export:`Export`,viewHistory:`View history`,delete:`Delete`,moreActions:`More actions`,addToFavorites:`Add to favorites`,removeFromFavorites:`Remove from favorites`,previousRecord:`Previous record`,nextRecord:`Next record`,recordOf:`{{current}} of {{total}}`,recordNotFound:`Record not found`,recordNotFoundDescription:`The record you are looking for does not exist or may have been deleted.`,goBack:`Go back`,details:`Details`,related:`Related`,relatedRecords:`{{count}} records`,relatedRecordOne:`{{count}} record`,noRelatedRecords:`No related records found`,loading:`Loading...`,copyToClipboard:`Copy to clipboard`,copied:`Copied!`,deleteConfirmation:`Are you sure you want to delete this record?`,editRecord:`Edit record`,viewAll:`View All`,new:`New`,emptyValue:`—`,activity:`Activity`,history:`History`,editRow:`Edit`,deleteRow:`Delete`,deleteRowConfirmation:`Are you sure you want to delete this record?`,deleteRowTitle:`Delete record`,actions:`Actions`,previousPage:`Previous`,nextPage:`Next`,pageOf:`Page {{current}} of {{total}}`,sortBy:`Sort by`,filterPlaceholder:`Filter...`,highlightFields:`Key Fields`,comments:`Comments`,searchComments:`Search comments…`,addCommentPlaceholder:`Add a comment… (Ctrl+Enter to submit)`,noMatchingComments:`No matching comments`,noCommentsYet:`No comments yet`,pinned:`Pinned`,pin:`Pin`,unpin:`Unpin`,justNow:`just now`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`,systemActor:`System`,unknownUser:`Unknown`,createdBy:`Created by`,updatedBy:`Updated by`,dropFilesToUpload:`Drop files here or click to upload`,attachmentCount:`{{count}} attachment`,attachmentCountPlural:`{{count}} attachments`,removeAttachment:`Remove attachment`,unifiedDiff:`Unified diff`,sideBySideDiff:`Side-by-side diff`,noChanges:`No changes`,previousVersion:`Previous`,currentVersion:`Current`,discussion:`Discussion`,showDiscussion:`Show Discussion ({{count}})`,hideDiscussion:`Hide discussion`,bold:`Bold (Ctrl+B)`,italic:`Italic (Ctrl+I)`,listFormat:`List`,inlineCode:`Inline code`,mentionSomeone:`Mention someone`,preview:`Preview`,submitComment:`Submit (Ctrl+Enter)`,sendComment:`Send`,writeComment:`Write a comment…`,subscribedTooltip:`Subscribed — click to unsubscribe`,unsubscribedTooltip:`Subscribe to notifications`,firstRecord:`First record (Home)`,previousRecordKey:`Previous record (←)`,nextRecordKey:`Next record (→)`,lastRecord:`Last record (End)`,noRecords:`No records`,showEmptyRelated_one:`+ {{count}} empty`,showEmptyRelated_other:`+ {{count}} empty`,searchWhileNavigating:`Search while navigating`,searchRecords:`Search records…`,allActivity:`All Activity`,commentsOnly:`Comments Only`,fieldChangesFilter:`Field Changes`,tasksOnly:`Tasks Only`,leaveCommentPlaceholder:`Leave a comment… (Ctrl+Enter to submit)`,noActivity:`No activity recorded`,loadMore:`Load more`,edited:`(edited)`,via:`via {{source}}`,replyCount:`{{count}} reply`,replyCountPlural:`{{count}} replies`,replyPlaceholder:`Reply…`,filterActivity:`Filter activity`,openDiscussion:`Open discussion panel`,closeDiscussion:`Close discussion panel`,subscribeAriaLabel:`Subscribe to notifications`,unsubscribeAriaLabel:`Unsubscribe from notifications`,clearSearch:`Clear search`,copyEmail:`Copy email`,copyPhone:`Copy phone number`,copyRecordId:`Copy record ID`,showEmptyFields:`Show {{count}} empty fields`,hideEmptyFields:`Hide empty fields`,noValue:`No value`},chart:{noData:`No chart data available`,loading:`Loading chart...`},report:{total:`Total`,rowTotal:`Row Total`,columnTotal:`Column Total`,grandTotal:`Grand Total`,totals:`Totals`,rowsLabel:`Row`,columnsLabel:`Column`,allLabel:`(All)`,emptyLabel:`(Empty)`,loading:`Loading…`,failedToLoad:`Failed to load matrix: {{message}}`,needsAcross:"Matrix report requires at least one `groupingsAcross` field.",aggregate:{count:`Count`,countDistinct:`Distinct Count`,sum:`Sum`,avg:`Average`,min:`Min`,max:`Max`,first:`First`},editor:{breadcrumb:`Configuration`,basic:`Basic`,title:`Title`,titlePlaceholder:`e.g. Pipeline by Quarter`,description:`Description`,descriptionPlaceholder:`What does this report show?`,type:`Report type`,typeTabular:`Tabular — flat list`,typeSummary:`Summary — grouped with totals`,typeMatrix:`Matrix — pivot rows × columns`,typeJoined:`Joined — multiple blocks`,typeHelp:`Pick the layout that matches what you want to see.`,data:`Data`,objectName:`Data source`,objectNamePlaceholder:`e.g. opportunity`,objectNameHelp:`Which object should this report query?`,limit:`Row limit`,limitPlaceholder:`e.g. 100`,columns:`Columns`,columnsHint:`Pick which fields appear as columns. Add an aggregate (Sum, Count…) on Summary or Matrix reports.`,filters:`Filters`,filtersHint:`Limit the rows that go into this report.`,filtersComplex:`This report uses an advanced filter that cannot be edited here. Save will keep it unchanged.`,groupBy:`Group by`,groupByHint:`Group the data and compute subtotals.`,rows:`Rows`,rowsHint:`Group rows by these fields.`,columnsAxis:`Columns`,columnsAxisHint:`Pivot these fields across the top.`,values:`Values`,valuesHint:`Numbers shown in each cell. Pick one or more fields and add an aggregate (Sum, Count…).`,grouping:`Grouping`,addGrouping:`Add grouping`,dateGranularity:`Date bucket`,dateGranularityNone:`(use raw value)`,day:`Day`,week:`Week`,month:`Month`,quarter:`Quarter`,year:`Year`,sortAsc:`Ascending`,sortDesc:`Descending`,chart:`Chart`,chartHint:`Optional visualization rendered alongside the table.`,chartType:`Chart type`,chartTitle:`Chart title`,chartTitlePlaceholder:`Defaults to the report title`,chartXAxis:`X-axis (category)`,chartYAxis:`Y-axis (value)`,chartShowLegend:`Show legend`,chartShowDataLabels:`Show data labels`,chartNone:`(no chart)`,chartBar:`Bar`,chartLine:`Line`,chartArea:`Area`,chartPie:`Pie`,chartDonut:`Donut`,chartFunnel:`Funnel`,validationNeedsObject:`Pick a data source before adding columns.`,validationMatrixNeedsRowsCols:`Matrix reports need at least one Row and one Column.`,validationSummaryNeedsRows:`Summary reports need at least one grouping field.`,blocks:`Blocks`,blocksHint:`Each block is its own table or chart. Block-level filters are ANDed with the report filter.`,addBlock:`Add block`,removeBlock:`Remove block`,blockName:`Block name`,blockNamePlaceholder:`unique_block_name`,blockLabel:`Display label`,blockLabelPlaceholder:`Shown above the block`,blockDescription:`Description`,blockDescriptionPlaceholder:`Optional context for this block`,validationJoinedNeedsBlocks:`Joined reports need at least one block.`,validationBlockNameRequired:`Every block needs a non-empty name.`,validationBlockNameDuplicate:`Block names must be unique within the report.`,validationBlockNeedsColumns:`Every block needs at least one column.`,noneOption:`(none)`,addCondition:`Add condition`,combineLogic:`Combine with`,opContains:`contains`,opIsEmpty:`is empty`,opIsNotEmpty:`is not empty`,formatAuto:`Auto`,formatCurrency:`Currency`,formatPercent:`Percent`,formatInteger:`Integer`,formatDate:`Date`,formatDatetime:`Date & time`,columnLabelPlaceholder:`Label override`,aggregateColumn:`Aggregate`,formatColumn:`Format`,addColumns:`Add fields`,searchFields:`Search fields…`,noMatchingFields:`No fields match your search.`,noFieldsAvailable:`No fields available.`,columnsCount:`{n} column(s) selected`,columnsEmpty:`No columns selected yet.`,fieldPickerTitle:`Select fields`,fieldPickerDescription:`Pick one or more fields to add. Use the search box to narrow the list.`,fieldPickerChangeTitle:`Change field`,fieldPickerAddGroupingTitle:`Add grouping`,fieldPickerEmpty:`(pick field)`,fieldPickerSelected:`{n} selected`,fieldPickerClear:`Clear selection`,fieldPickerAdd:`Add`,fieldPickerAddN:`Add {n}`}},map:{searchLocations:`Search locations…`,locationDetails:`Location Details`,markersCount:`{{count}} markers`,invalidCoordinates:`{{count}} record with missing or invalid coordinates excluded from the map.`,invalidCoordinatesPlural:`{{count}} records with missing or invalid coordinates excluded from the map.`},workflow:{draft:`Draft`,active:`Active`,paused:`Paused`,completed:`Completed`,cancelled:`Cancelled`,save:`Save`,publish:`Publish`,addNode:`Add Node`,workflowFlow:`Workflow Flow`,properties:`Properties`,connections:`Connections`,quickConnect:`Quick Connect`,fromPlaceholder:`From...`,toPlaceholder:`To...`,connect:`Connect`,label:`Label`,type:`Type`,description:`Description`,assignee:`Assignee`,assigneeType:`Assignee Type`,user:`User`,role:`Role`,group:`Group`,expression:`Expression`,timeoutMinutes:`Timeout (minutes)`,selectNodeToEdit:`Select a node to edit its properties`,workflowTitle:`Workflow Title`,newWorkflow:`New Workflow`,outConnections:`{{count}} out`,start:`Start`,end:`End`,task:`Task`,userTask:`User Task`,serviceTask:`Service Task`,scriptTask:`Script Task`,approval:`Approval`,condition:`Condition`,parallelGateway:`Parallel Gateway`,joinGateway:`Join Gateway`,boundaryEvent:`Boundary Event`,delay:`Delay`,notification:`Notification`,webhook:`Webhook`,allowConcurrency:`Allow (run concurrently)`,forbidConcurrency:`Forbid (skip new)`,replaceConcurrency:`Replace (cancel existing)`,queueConcurrency:`Queue (run after current)`,conditionEvent:`Condition`,manualEvent:`Manual`,webhookEvent:`Webhook`,timerEvent:`Timer`,signalEvent:`Signal`,versionHistory:`Version History`,importBpmn:`Import BPMN`,exportBpmn:`Export BPMN`,undo:`Undo`,redo:`Redo`,resetZoom:`Reset zoom`},designer:{undo:`Undo`,redo:`Redo`},dashboard:{addWidget:`Add widget`,removeWidget:`Remove widget`,editLayout:`Edit layout`,saveLayout:`Save layout`,resetLayout:`Reset layout`,total:`Total`,noDataAvailable:`No data available`,noDataSourceFor:`No data source available for`,noRows:`No rows`,pickMeasures:`Pick measures (values) for this dataset widget.`,datasetUnsupported:`This data source does not support dataset queries.`,details:`Details`,exportCsv:`Export CSV`,openInList:`Open in list`,trend:{vsLastQuarter:`vs last quarter`,vsLastMonth:`vs last month`,vsLastWeek:`vs last week`,vsLastYear:`vs last year`,vsYesterday:`vs yesterday`,vsPreviousPeriod:`vs previous period`}},configPanel:{save:`Save`,discard:`Discard`,close:`Close`,layout:`Layout`,columns:`Columns`,gap:`Gap`,rowHeight:`Row height`,data:`Data`,refreshInterval:`Refresh interval`,appearance:`Appearance`,title:`Title`,showDescription:`Show description`,theme:`Theme`,configuration:`Configuration`,general:`General`,advanced:`Advanced`},appDesigner:{createApp:`Create Application`,editApp:`Edit Application`,basicInfo:`Basic Info`,objects:`Objects`,navigation:`Navigation`,branding:`Branding`,appName:`App Name`,appTitle:`Title`,appDescription:`Description`,appIcon:`Icon`,template:`Template`,layout:`Layout`,layoutSidebar:`Sidebar`,layoutHeader:`Header`,layoutEmpty:`Empty`,selectObjects:`Select Objects`,searchObjects:`Search objects…`,selectAll:`Select All`,deselectAll:`Deselect All`,navBuilder:`Navigation Builder`,addGroup:`Add Group`,addUrl:`Add URL`,addSeparator:`Add Separator`,noNavItems:`No navigation items yet.`,logoUrl:`Logo URL`,primaryColor:`Primary Color`,faviconUrl:`Favicon URL`,preview:`Preview`,complete:`Complete`,snakeCaseHint:`Must be snake_case (e.g. my_app)`,modeEdit:`Edit`,modePreview:`Preview`,modeCode:`Code`,addWidget:`Add Widget`,widgetProperties:`Widget Properties`,dataSource:`Data Source`,valueField:`Value Field`,aggregate:`Aggregate`,colorVariant:`Color Variant`,addComponent:`Add Component`,componentProperties:`Component Properties`,viewType:`View Type`,fields:`Fields`,toolbar:`Toolbar`,showSearch:`Show Search`,showFilters:`Show Filters`,showSort:`Show Sort`,appearance:`Appearance`,rowHeight:`Row Height`,stripedRows:`Striped Rows`,bordered:`Bordered`,livePreview:`Live Preview`,stepBasicDesc:`Name, title, and layout`,stepObjectsDesc:`Select business objects`,stepNavigationDesc:`Build navigation tree`,stepBrandingDesc:`Logo, colors, and favicon`,noObjectsFound:`No objects found.`,noNavItemsHint:`No navigation items yet. Select objects in the previous step or add items manually.`,separator:`Separator`,separatorLabel:`— Separator —`,newGroup:`New Group`,newLink:`New Link`,saveDraft:`Save Draft`,cancelConfirmTitle:`Discard changes?`,cancelConfirmMessage:`You have unsaved changes. Are you sure you want to cancel?`,confirmDiscard:`Discard`,keepEditing:`Keep Editing`,navNoItems:`No navigation items. Click buttons above to add items.`,navNoPreviewItems:`No items`,navLivePreview:`Live Preview`,navCollapseGroup:`Collapse group`,navExpandGroup:`Expand group`,navAddChild:`Add child`,navMoveUp:`Move up`,navMoveDown:`Move down`,navRemove:`Remove`,navObjectPage:`Object Page`,navDashboard:`Dashboard`,navPage:`Page`,navReport:`Report`,navGroup:`Group`,navUrl:`URL`,navSeparator:`Separator`,navTypeObject:`Object`,navTypeDashboard:`Dashboard`,navTypePage:`Page`,navTypeReport:`Report`,navTypeUrl:`URL`,navTypeGroup:`Group`,navTypeSeparator:`Separator`,navTypeAction:`Action`,navEditIcon:`Edit icon`,navToggleVisible:`Toggle visibility`,navHidden:`Hidden`,navExportSchema:`Export JSON`,navImportSchema:`Import JSON`,navExportSuccess:`Navigation schema exported`,navImportSuccess:`Navigation schema imported`,navImportError:`Invalid navigation JSON`,navIconPlaceholder:`Icon name (e.g. Users)`,dashboardEditor:`Dashboard Editor`,noWidgets:`No widgets. Click a button above to add one.`,widgetLayoutSize:`Layout Size`,widgetWidth:`Width`,widgetHeight:`Height`,dashboardPreview:`Dashboard Preview`,noWidgetsPreview:`No widgets to preview`,pageCanvasEditor:`Page Canvas Editor`,emptyPage:`Empty page. Click a button above to add a component.`,pagePreview:`Page Preview`,noComponentsPreview:`No components to preview`,modePage:`Page`,modeDashboard:`Dashboard`,undo:`Undo`,redo:`Redo`,brandingEditor:`Branding Editor`,brandingExport:`Export JSON`,brandingImport:`Import JSON`,brandingPreview:`Preview`,brandingSampleButton:`Sample Button`,brandingSampleText:`This is how your brand theme will look.`,colorPalette:`Color Palette`,fontFamily:`Font Family`,fontDefault:`Default (System)`,modeLight:`Light`,modeDark:`Dark`,mobilePreview:`Mobile Preview`,objectManager:{title:`Object Manager`,addObject:`New Object`,searchPlaceholder:`Search objects…`,noObjects:`No objects found.`,objectName:`API Name`,objectLabel:`Label`,pluralLabel:`Plural Label`,icon:`Icon`,selectIcon:`Select icon…`,group:`Group`,noGroup:`No Group`,sortOrder:`Sort Order`,enabled:`Enabled`,relationships:`Relationships`,systemBadge:`System`,fieldCount:`{{count}} fields`,ungrouped:`Ungrouped`,deleteConfirmTitle:`Delete Object?`,deleteConfirmMessage:`This will permanently delete the object and all its fields. This action cannot be undone.`},fieldDesigner:{title:`Field Designer`,addField:`New Field`,searchPlaceholder:`Search fields…`,allTypes:`All Types`,noFields:`No fields found.`,fieldName:`API Name`,fieldLabel:`Label`,fieldType:`Type`,fieldGroup:`Group`,description:`Description`,required:`Required`,unique:`Unique`,readOnly:`Read Only`,hidden:`Hidden`,indexed:`Indexed`,externalId:`External ID`,trackHistory:`Track History`,defaultValue:`Default Value`,placeholder:`Placeholder`,referenceTo:`Reference To`,formula:`Formula`,options:`Options`,addOption:`Add Option`,validationRules:`Validation Rules`,addRule:`Add Rule`,systemBadge:`System`,ungrouped:`General`,deleteConfirmTitle:`Delete Field?`,deleteConfirmMessage:`This will permanently delete the field. Existing data in this field will be lost.`,basicSection:`Basic`,typeSpecificSection:`Type Settings`,advancedSection:`Advanced`,typeCategory:{text:`Text`,number:`Number`,date:`Date & Time`,choice:`Choice`,relation:`Relation`,advanced:`Advanced`}}},console:{title:`ObjectOS`,initializing:`Initializing application...`,search:`Search…`,breadcrumb:{dashboards:`Dashboards`,pages:`Pages`,reports:`Reports`,system:`System`},nav:{pinItem:`Pin {{name}}`,unpinItem:`Unpin {{name}}`,dragToReorder:`Drag to reorder`,favorites:`Favorites`},loadingSteps:{connecting:`Connecting to data source`,loadingConfig:`Loading configuration`,preparingWorkspace:`Preparing workspace`},error:{connectionFailed:`Cannot connect to server`,serverUnreachable:`The server at {{url}} is unreachable.`,checkServer:`Please check your network connection or that the backend is running.`,timeout:`Connection timed out after 10 seconds.`},actions:{retry:`Retry`,retrying:`Retrying…`},shortcuts:{title:`Keyboard Shortcuts`,description:`Quick reference for all available keyboard shortcuts.`,groups:{general:`General`,navigation:`Navigation`,dataViews:`Data Views`,preferences:`Preferences`},openCommandPalette:`Open command palette`,showShortcuts:`Show keyboard shortcuts`,closeDialog:`Close dialog / panel`,toggleSidebar:`Toggle sidebar`,focusSearch:`Focus search`,createRecord:`Create new record`,refreshData:`Refresh data`,editRecord:`Edit selected record`,toggleDarkMode:`Toggle dark mode`},commandPalette:{title:`Command palette`,placeholder:`Type a command or search...`,noResults:`No results found.`,searching:`Searching…`,records:`Records`,recentRecords:`Recently viewed`,objects:`Objects`,dashboards:`Dashboards`,pages:`Pages`,reports:`Reports`,switchApp:`Switch App`,current:`Current`,preferences:`Preferences`,lightTheme:`Light Theme`,darkTheme:`Dark Theme`,systemTheme:`System Theme`,actions:`Actions`,openFullSearch:`Open Full Search Page`,createApp:`Create New App`},ai:{workspaceTitle:`AI Workspace`,workspaceSubtitle:`Ask, inspect, and resume conversations`,openChats:`Open chats`,chats:`Chats`,chatsDescription:`Browse and manage AI conversations.`,share:`Share`,shareTitle:`Share this conversation`,shareDisabledTitle:`Start chatting to enable sharing`,newChat:`New`,searchChats:`Search chats...`,noChatsYet:`No chats yet`,noChatsDescription:`Start a new conversation to see it here.`,noMatchingChats:`No matching chats.`,newConversation:`New conversation`,renameConversation:`Rename conversation`,deleteConversation:`Delete conversation`,saveRename:`Save rename`,cancelRename:`Cancel rename`,loadingHistory:`Loading conversation history...`,conversationReady:`Conversation ready`,preparingConversation:`Preparing a new conversation`,offlineDemoMode:`Offline demo mode — agent list unavailable`,askAgent:`Ask {{agent}}...`,assistant:`Assistant`,loadingAgents:`Loading agents...`,askAnything:`Ask anything...`,emptyTitle:`Start a conversation`,emptyDescription:`Ask anything — the assistant has access to your current app context.`,switchAssistant:`Switch assistant`,chooseAgent:`Choose assistant…`,empty:{build:{title:`Build with AI`,description:`Describe an app or workflow in plain language — I draft the objects, screens and automations, then you review and publish.`},ask:{title:`Ask your data`,description:`Ask questions about your records — counts, lists, and summaries across the data you can access.`}},clearConversation:`Clear`,sendHint:`to send`,agentActivity:`Agent activity`,toolCompleted:`Completed`,toolRunning:`Running`,toolAwaitingApproval:`Awaiting approval`,toolFailed:`Failed`,toolDetailsHidden:`Tool inputs and raw results are hidden in this view.`,copy:`Copy`,copied:`Copied`,regenerate:`Regenerate`,model:`Model`,submit:`Submit`,uploadFiles:`Upload files`,stopResponse:`Stop response`,trace:`trace`,viewTrace:`View trace`,nextSteps:`What's next`,publishDrafts:`Publish`,publishOk:`Published — objects are now live.`,seedWarn:`Published, but some sample data failed to load.`,openBuiltApp:`Open app`,previewDraft:`Preview`,resizeSplit:`Resize chat and preview`,hideChats:`Hide chats`,showChats:`Show chats`,planTitle:`Proposed plan`,planQuestions:`Confirm before building`,planAssumptions:`Assumptions`,planApproveHint:`Reply to approve or adjust this plan.`,planApprove:`Build it`,planAdjust:`Adjust`,planApproveMessage:`Looks good — build it as proposed.`,planApproveDefaultsMessage:`Build it with your best assumptions; use sensible defaults for the open questions.`,planAnswerMessage:`For "{{question}}", go with: {{option}}.`,justNow:`just now`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`,agentLabels:{ask:`Ask`,build:`Build`,dataChat:`Assistant`,metadataAssistant:`Metadata Assistant`},suggestions:{dataChat:{userCount:`How many users are in the system? List their emails.`,recentRecords:`List the 5 most recently created records.`,recordCounts:`Count records for each object.`},metadataAssistant:{buildCrm:`Build a sales CRM — customers, contacts, and a deal pipeline I can total by stage.`,buildApp:`Create a project tracker — projects, tasks with owners and due dates, and a board by status.`,buildFlow:`Design a support desk — tickets with priority, a status workflow, and customer links.`,buildInventory:`Build an inventory app — products, stock levels, suppliers, and low-stock visibility.`,buildRecruiting:`Make an applicant tracker — candidates, open roles, interview stages, and notes.`},generic:{help:`What can you help me with?`,availableObjects:`List the available data objects.`,recentActivity:`Summarize my recent activity.`}}},errors:{somethingWentWrong:`Something went wrong`,unexpectedError:`An unexpected error occurred while rendering this view.`,tryAgain:`Try Again`,goHome:`Go Home`,errorDetails:`Error Details (dev only)`},theme:{toggle:`Toggle theme`,light:`Light`,dark:`Dark`,system:`System`},objectView:{objectNotFound:`Object Not Found`,objectNotFoundDescription:`The object "{{objectName}}" does not exist in the current configuration.`,objectNotFoundHint:`Check your app navigation settings or select a different object from the sidebar.`,systemViewReadonly:`System view defined in code — read-only.`,expandToPage:`Open as full page`,allRecords:`All Records`,exitDesignMode:`Exit Design Mode`,enterDesignMode:`Enter Design Mode`,metadataInspector:`Metadata Inspector`,editView:`Edit View`,addView:`Add View`,designTools:`Design tools`,new:`New`,import:`Import`,importTitle:`Import from CSV`,importedToast:`Imported {{count}} row(s).`,importedWithSkipped:`Imported {{ok}} row(s); skipped {{skipped}}.`,configureView:`Configure View`,closePanel:`Close panel`,showAdvancedSettings:`Show advanced settings`,showFewerSettings:`Show fewer settings`,page:`Page`,pageConfigHint:`Toolbar, navigation & view shell settings`,listConfigHint:`Data rendering, columns & appearance for this list type`,general:`General`,generalHint:`View title, description, and type`,toolbar:`Toolbar`,toolbarHint:`Search, filter, sort, group, and density toggles`,toolbarEnabledCount:`{{count}} of {{total}} enabled`,navigationSection:`Navigation`,navigationHint:`Row click behavior and detail view settings`,records:`Records`,recordsHint:`Selection mode, add record, and inline editing`,exportPrint:`Export & Print`,exportPrintHint:`Export formats, printing, and record count display`,showAllFields:`Show All`,hideAllFields:`Hide All`,searchFields:`Search fields...`,title:`Title`,description:`Description`,data:`Data`,source:`Source`,columns:`Columns`,filterBy:`Filter by`,sortBy:`Sort by`,appearance:`Appearance`,showDescription:`Show description`,viewType:`View type`,userFilters:`User filters`,enableSearch:`Enable search`,enableFilter:`Enable filter`,enableSort:`Enable sort`,enableHideFields:`Enable hide fields`,enableGroup:`Enable group`,enableColor:`Enable color`,enableDensity:`Enable density`,userActions:`User actions`,addRecordViaForm:`Add records through a form`,advanced:`Advanced`,allowExport:`Allow export`,recordCount:`{{count}} records`,noDescription:`No description`,none:`None`,columnsConfigured:`{{count}} columns`,save:`Save`,discard:`Discard`,createView:`Create View`,createViewDesc:`Pick a view type, then give it a name. You can change every setting afterwards.`,cancel:`Cancel`,create:`Create`,delete:`Delete`,deleteViewTitle:`Delete view`,deleteViewConfirm:`Are you sure you want to delete the view "{{name}}"? This cannot be undone.`,bulkDeleteConfirm:`Delete {{count}} selected records? This cannot be undone.`,duplicateViewName:`A view with this name already exists.`,viewTypeGrid:`Grid`,viewTypeGridDesc:`A spreadsheet-style table of records.`,viewTypeKanban:`Kanban`,viewTypeKanbanDesc:`Cards grouped into columns by a single-select field.`,viewTypeCalendar:`Calendar`,viewTypeCalendarDesc:`Records placed on a monthly calendar by date.`,viewTypeGallery:`Gallery`,viewTypeGalleryDesc:`Large image cards driven by an attachment field.`,viewTypeTimeline:`Timeline`,viewTypeTimelineDesc:`Records along a horizontal time axis.`,viewTypeGantt:`Gantt`,viewTypeGanttDesc:`Project bars with start / end and dependencies.`,viewTypeMap:`Map`,viewTypeMapDesc:`Geographic markers from latitude / longitude fields.`,viewTypeChart:`Chart`,viewTypeChartDesc:`Aggregated bar / line / pie visualisations.`,newView:`New View`,typeOptions:`Type Options`,groupByField:`Group by field`,groupByFieldHelp:`The kanban groups records into columns by this field's values.`,startDateField:`Start date field`,startDateFieldHelp:`The calendar places records on the cell matching this date.`,ganttStartDateFieldHelp:`The left edge of each Gantt bar uses this date.`,ganttEndDateFieldHelp:`The right edge of each Gantt bar uses this date.`,timelineDateFieldHelp:`Records are placed on the timeline by this date.`,titleField:`Title field`,latitudeField:`Latitude field`,latitudeFieldHelp:`Field providing the latitude coordinate (geo fields only).`,longitudeField:`Longitude field`,longitudeFieldHelp:`Field providing the longitude coordinate (geo fields only).`,imageField:`Image field`,imageFieldHelp:`The gallery cover comes from this image or attachment field.`,dateField:`Date field`,selectField:`Select field...`,selectOption:`Select...`,noEligibleFieldForType:`No eligible field of this type. Add one to the object first.`,viewTypeUnavailable:`This object has no field that can serve as "{{field}}".`,viewTypeUnavailableShort:`Not supported by this object.`,chartType:`Chart type`,chartTypeHelp:`Determines how the data is rendered.`,chartTypeBar:`Bar chart`,chartTypeLine:`Line chart`,chartTypePie:`Pie chart`,chartTypeArea:`Area chart`,chartTypeScatter:`Scatter chart`,xAxisField:`X-axis field`,xAxisFieldHelp:`The categorical or time dimension.`,yAxisField:`Y-axis field`,yAxisFieldHelp:`The numeric field to aggregate.`,gridOptionsHint:`Grid view uses the columns configured above.`,groupBy:`Group by`,prefixField:`Prefix field`,fields:`Fields`,fieldsVisible:`{{count}} visible`,sortsCount:`{{count}} sorts`,filtersCount:`{{count}} filters`,endDateField:`End date field`,color:`Color`,fieldTextColor:`Field text color`,rowHeight:`Row height`,wrapHeaders:`Wrap headers`,showFieldDescriptions:`Show field descriptions`,collapseAllByDefault:`Collapse all by default`,striped:`Striped rows`,bordered:`Bordered cells`,inlineEdit:`Edit records inline`,addDeleteRecordsInline:`Add/delete records inline`,clickIntoRecordDetails:`Click into record details`,navigationMode:`Navigation mode`,navigationWidth:`Navigation width`,navigationWidthHint:`Available for drawer, modal, and split navigation modes`,openNewTab:`Open in new tab`,openNewTabHint:`Available for page and new window navigation modes`,selectionMode:`Selection mode`,selectionNone:`None`,selectionSingle:`Single`,selectionMultiple:`Multiple`,pageSize:`Page size`,pageSizeOptions:`Page size options`,exportFormats:`Export formats`,exportMaxRecords:`Max records`,exportIncludeHeaders:`Include headers`,exportFileNamePrefix:`File name prefix`,searchableFields:`Searchable fields`,filterableFields:`Filterable fields`,resizableColumns:`Resizable columns`,densityCompact:`Compact`,densityComfortable:`Comfortable`,densitySpacious:`Spacious`,densityMode:`Density mode`,hiddenFields:`Hidden fields`,rowActions:`Row actions`,bulkActions:`Bulk actions`,sharing:`Sharing`,sharingEnabled:`Enable sharing`,sharingVisibility:`Visibility`,addRecordEnabled:`Enable add record`,addRecordPosition:`Position`,addRecordMode:`Mode`,addRecordFormView:`Form view`,conditionalFormatting:`Conditional formatting`,addRule:`Add rule`,quickFilters:`Quick filters`,addQuickFilter:`Add quick filter`,ufElements:`Elements`,ufDropdown:`Dropdown`,ufTabs:`Tabs`,ufToggle:`Toggle`,ufAddField:`+ Add filter field...`,ufNoFields:`No fields available`,ufAddTab:`+ Add tab`,ufTabLabel:`Label`,ufShowAllRecords:`Show "All records" tab`,ufAllowAddTab:`Allow adding tabs`,showRecordCount:`Show record count`,allowPrinting:`Allow printing`,virtualScroll:`Virtual scroll`,emptyStateTitle:`Empty state title`,emptyStateMessage:`Empty state message`,emptyStateIcon:`Empty state icon`,ariaLabel:`ARIA label`,ariaDescribedBy:`ARIA described by`,ariaLive:`ARIA live`,accessibility:`Accessibility`,viewTabs:`View Tabs`},localeSwitcher:{label:`Language`}},auth:{login:{title:`Sign in to your account`,description:`Enter your email and password to continue`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,passwordLabel:`Password`,passwordPlaceholder:`Enter your password`,forgotPasswordText:`Forgot password?`,submitButton:`Sign In`,submittingButton:`Signing in...`,noAccountText:`Don't have an account?`,signUpText:`Sign up`,signingIn:`Signing you in…`,ssoHandoff:`Continue to {{target}}`,errors:{invalidCredentials:`Invalid email or password. Please try again.`,emailNotVerified:`Please verify your email address before signing in.`}},register:{title:`Create an account`,description:`Enter your information to get started`,nameLabel:`Name`,namePlaceholder:`John Doe`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,passwordLabel:`Password`,passwordPlaceholder:`Create a password (min. 8 characters)`,confirmPasswordLabel:`Confirm Password`,confirmPasswordPlaceholder:`Confirm your password`,passwordMismatchError:`Passwords do not match`,passwordTooShortError:`Password must be at least 8 characters`,submitButton:`Create Account`,submittingButton:`Creating account...`,hasAccountText:`Already have an account?`,signInText:`Sign in`,errors:{userExists:`An account with this email already exists. Try signing in instead.`},verifyInbox:{title:`Check your inbox`,description:`We've sent a verification link to {{email}}. Click the link to activate your account.`,resend:`Resend verification email`,resending:`Sending…`,resent:`Verification email sent.`,backToSignIn:`Back to sign in`}},forgotPassword:{title:`Reset your password`,description:`Enter your email address and we'll send you a link to reset your password`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,submitButton:`Send Reset Link`,submittingButton:`Sending...`,successTitle:`Check your email`,successDescription:`We've sent a password reset link to {{email}}. Please check your inbox.`,backToSignInText:`Back to sign in`,rememberPasswordText:`Remember your password?`,signInText:`Sign in`},resetPassword:{title:`Set a new password`,description:`Choose a password you have not used before.`,newPassword:`New password`,confirmPassword:`Confirm password`,submit:`Update password`,submitting:`Updating…`,success:`Password updated`,failed:`Reset failed`,invalidToken:`This reset link is invalid or has expired.`,missingToken:`Reset link is missing or expired`,passwordsMismatch:`Passwords do not match`,requestNewLink:`Request a new link`},verifyEmail:{title:`Verify your email address`,description:`We sent a verification link to your email address. Please click the link to verify your account.`,sentTo:`Sent to:`,verifyingTitle:`Verifying…`,verifyingDescription:`Hang tight while we confirm your email.`,successTitle:`Email verified`,successDescription:`Your email is confirmed. You can now sign in.`,errorTitle:`Verification failed`,errorDescription:`Verification failed. Please request a new link.`,missingToken:`Verification link is missing a token.`,emailMissing:`Email address is missing`,resendButton:`Resend verification email`,resending:`Sending…`,resent:`Email sent! Check your inbox`,resentSuccess:`Verification email sent!`,resentDescription:`Please check your inbox and click the verification link.`,resendFailed:`Cannot resend verification email`,signInLink:`Go to sign in`,backToSignIn:`Back to sign in`,backToLogin:`Back to login`,checkSpam:`Didn't receive the email? Check your spam folder or contact support.`,or:`Or`},setup:{welcomeTitle:`Welcome to ObjectStack`,description:`Create the first owner account to finish setting up this deployment.`,yourName:`Your name`,orgName:`Organization name`,orgNamePlaceholder:`Acme Inc.`,emailLabel:`Email`,emailPlaceholder:`name@example.com`,passwordLabel:`Password`,passwordHint:`Minimum 8 characters`,submit:`Create owner account`,submitting:`Setting up…`,failed:`Setup failed`},device:{title:`Authorize new device`,subtitle:`Approve this device to sign in as {{email}}.`,userCodeLabel:`Device code`,requesterLabel:`Connection request from`,approveWarning:`Only approve if you started this connection yourself a moment ago. Once approved, this runtime can access your organization's private packages.`,loggedInAs:`Signed in as {{email}}`,approve:`Approve device`,approving:`Approving…`,approvedTitle:`Device authorized`,approvedDescription:`You can return to the device — it should sign in shortly.`,approveSuccess:`Device authorized`,approveSuccessDescription:`You can close this window.`,approveFailed:`Approval failed`,deny:`Deny request`,denying:`Denying…`,deniedTitle:`Access denied`,deniedDescription:`The device will not be granted access.`,denyFailed:`Failed to deny request`,invalidTitle:`Invalid device link`,invalidDescription:`No device code was provided in the URL.`,loading:`Loading…`,cancel:`Cancel`},shell:{tenantHostHint:`You are signing in to this workspace`}},errors:{networkError:`Network error. Please check your connection.`,serverError:`Server error. Please try again later.`,notFound:`Resource not found.`,unauthorized:`You are not authorized to perform this action.`,forbidden:`Access denied.`,timeout:`Request timed out. Please try again.`,unknown:`An unexpected error occurred.`},workspace:{label:`Workspaces`,default:`My Workspace`,switch:`Switch workspace`,create:`Create workspace`,createTitle:`Create a workspace`,createDescription:`A workspace is a shared space for your team to collaborate.`,createButton:`Create workspace`,nameLabel:`Workspace name`,namePlaceholder:`e.g., Acme Inc`,slugLabel:`URL slug`,slugHint:`Used in URLs. Only lowercase letters, numbers, and hyphens.`,invite:`Invite member`,members:`Members`,settings:`Workspace settings`},help:{onThisPage:`On this page`,appDocs:`This app's docs`,allDocs:`All documentation`,keyboardShortcuts:`Keyboard shortcuts`,onlineDocs:`Online documentation`},sidebar:{settings:`Settings`,help:`Help`,helpTooltip:`Help & Documentation`,activityFeed:`Activity feed`,notifications:`Notifications`,approvals:`Approvals`,inbox:`Inbox`,inboxAriaLabel:`Open inbox`,area:`Area`,scope:`Scope`,packageManagement:`Package management`,searchNavigation:`Search navigation...`,recent:`Recent`,favorites:`Favorites`,starred:`Starred`,removeFromFavorites:`Remove {{name}} from favorites`},topbar:{aiAssistant:`AI Assistant`,openAssistant:`Open {{name}} assistant`,offline:`Offline`,usersOnline:`Users currently online`,switchView:`Switch view`,connection:{connected:`Connected`,connecting:`Connecting...`,reconnecting:`Reconnecting...`,disconnected:`Disconnected`,error:`Connection Error`}},home:{title:`Home`,subtitle:`Your workspace dashboard`,nav:`Home`,allApps:`All Applications`,greetingMorning:`Good morning`,greetingAfternoon:`Good afternoon`,greetingEvening:`Good evening`,greetingNight:`Working late`,heroTagline:`Pick up where you left off, or explore something new.`,open:`Open`,stats:{apps:`Applications`,starred:`Starred`,recent:`Recent items`},loading:`Loading workspace...`,recent:`Recent`,starred:`Starred`,welcome:`Build your business system with AI`,welcomeDescription:`Describe your business in one sentence — AI generates the objects, screens, APIs and agent tools. Or start from scratch.`,welcomeAdminDescription:`Describe your business in one sentence — AI generates the objects, screens, APIs and agent tools. Or set things up yourself from the menu on the left.`,welcomeAdminDescriptionNoBuild:`Set up your first application from the Administration menu on the left. Once you have data, the AI assistant can help you explore it.`,welcomeAdminDescriptionNoAi:`Set up your first application from the Administration menu on the left.`,noAppsTitle:`No applications yet`,noAppsDescription:`There are no applications available to you yet. Please contact your workspace administrator.`,buildWithAI:`Build with AI`,askAI:`Ask AI`,recoveryReminder:{message:`Set a recovery password so you can still sign in if single sign-on is ever unavailable.`,cta:`Set password`,dismiss:`Dismiss`},pendingDrafts:{message:`You have {{count}} unpublished change(s) — publish to make them live.`,cta:`Publish`,publishing:`Publishing…`,published:`Published! Your changes are live.`,publishFailed:`Publish failed`},createFirstApp:`Create app manually`,systemSettings:`System Settings`,browseMarketplace:`Browse App Marketplace`,quickActions:{title:`Quick Actions`,createApp:`Create App`,createAppDesc:`Start with a new application`,manageObjects:`Manage Objects`,manageObjectsDesc:`Configure data models`,systemSettings:`System Settings`,systemSettingsDesc:`Configure your workspace`},recentApps:{title:`Recently Accessed`,itemType:{object:`Object`,dashboard:`Dashboard`,page:`Page`,record:`Record`}},starredApps:{title:`Starred`},gettingStarted:{title:`Make this home yours`,description:`Star an app to pin it here for one-click access. Anything you open will show up under Recently Accessed automatically.`,cta:`Browse all applications`},appCard:{noDescription:`No description`,default:`Default`}},layout:{appSwitcher:{home:`Home`,switchApplication:`Switch Application`,appsAvailable:`{{count}} apps available`,addApp:`Add App`,editApp:`Edit App`,manageAllApps:`Manage All Apps`,systemConsole:`System Console`,noAppsConfigured:`No apps configured`},systemNav:{systemSettings:`System Settings`,applications:`Applications`,appMarketplace:`App Marketplace`,objectManager:`Object Manager`,users:`Users`,organizations:`Organizations`,roles:`Roles`,configuration:`Configuration`,createApp:`Create App`},activityFeed:{title:`Recent Activity`,filter:`Filter`,empty:`No recent activity`,viewAll:`View all activity`,ariaLabel:`Activity feed`,typeCreate:`Create`,typeUpdate:`Update`,typeDelete:`Delete`,typeComment:`Comment`,relativeJustNow:`just now`,relativeSecondsAgo:`{{count}}s ago`,relativeMinutesAgo:`{{count}}m ago`,relativeHoursAgo:`{{count}}h ago`,relativeDaysAgo:`{{count}}d ago`},metadata:{label:`Metadata`,toggleTitle:`Toggle Metadata Inspector`,panelTitle:`Metadata Inspector`,jsonBadge:`JSON`,copyJson:`Copy JSON`}},search:{title:`Search`,back:`Back`,placeholder:`Search objects, dashboards, pages, reports...`,inputAriaLabel:`Search objects, dashboards, pages, reports`,resultsCount:`{{count}} result for "{{query}}"`,resultsCountPlural:`{{count}} results for "{{query}}"`,itemsAvailable:`{{count}} items available`,noResults:`No results found`,noResultsHint:`Try adjusting your search terms`,typeObjects:`Objects`,typeDashboards:`Dashboards`,typePages:`Pages`,typeReports:`Reports`,badgeObject:`object`,badgeDashboard:`dashboard`,badgePage:`page`,badgeReport:`report`},empty:{objectNotFound:`Object Not Found`,objectNotFoundDescription:`Object "{{name}}" definition missing. Check your configuration or navigate back to select a valid object.`,recordNotFound:`Record not found`,recordNotFoundDescription:`The record you are looking for does not exist or may have been deleted.`,pageNotFound:`Page Not Found`,pageNotFoundDescription:`The page "{{name}}" could not be found. It may have been removed or renamed.`,dashboardNotFound:`Dashboard Not Found`,dashboardNotFoundDescription:`The dashboard "{{name}}" could not be found. It may have been removed or renamed.`,reportNotFound:`Report Not Found`,reportNotFoundDescription:`The report "{{name}}" could not be found. It may have been removed or renamed.`,noAppsConfigured:`No Apps Configured`,noAppsConfiguredDescription:`No applications have been registered. Create your first app or visit System Settings to configure your environment.`,createFirstApp:`Create Your First App`,systemSettings:`System Settings`,back:`Back`},preview:{empty:{loadFailedTitle:`Draft preview failed to load`,loadFailedDescription:`The draft overlay could not be read. Retry, or check your connection.`,notReadyTitle:`“{{app}}” isn’t in the draft yet`,notReadyDescription:`The build may still be running, or it may have failed before this app was staged. Check the conversation for the build status — this pane refreshes as drafts land.`,nothingTitle:`Nothing to preview yet`,retry:`Retry`},draftBar:{message:`Draft preview — you are seeing unpublished changes. Nothing here is live until you publish.`,publish:`Publish`,publishing:`Publishing…`,exit:`Exit preview`,changes:`Changes`},changes:{title:`Pending changes`,description:`What publishing will change. New items are added; updates overwrite the live version.`,loading:`Loading pending changes…`,loadFailed:`Could not load pending changes:`,empty:`Nothing pending — every draft has been published.`,kindNew:`New`,kindUpdate:`Update`}},renderer:{noPageSchema:`No page schema provided`,noFormSchema:`No form schema provided`,noDashboardSchema:`No dashboard schema provided`,pageRendering:`Page rendering: {{name}}`,dashboardRendering:`Dashboard rendering: {{name}}`,formRenderingMode:`Form rendering in {{mode}} mode`,formRenderingFor:`for record {{id}}`,createRecord:`Create Record`,editRecord:`Edit Record`,page:`Page`,dashboard:`Dashboard`,save:`Save`,cancel:`Cancel`},actionDialog:{title:`Action Parameters`,description:`Please provide the required information to continue.`,selectPlaceholder:`Select {{label}}`,requiredError:`{{label}} is required`,lookupPlaceholder:`Paste the {{label}} record id (UUID)`,lookupHelpText:`Enter the record id of the referenced object. A picker is coming soon.`,cancel:`Cancel`,confirm:`Confirm`,defaultActionTitle:`Action`,ok:`OK`},actionConfirm:{title:`Confirm Action`,confirm:`Continue`,cancel:`Cancel`},rowAction:{openMenu:`Open menu`,edit:`Edit`,delete:`Delete`},navigationSync:{addedPage:`Navigation updated: added page "{{name}}"`,addedDashboard:`Navigation updated: added dashboard "{{name}}"`,removedPage:`Navigation updated: removed page "{{name}}"`,removedDashboard:`Navigation updated: removed dashboard "{{name}}"`,renamedPage:`Navigation updated: renamed page "{{oldName}}" → "{{newName}}"`,renamedDashboard:`Navigation updated: renamed dashboard "{{oldName}}" → "{{newName}}"`,undoLabel:`Undo`,undone:`Navigation change undone`,undoFailed:`Failed to undo navigation change`,updateFailed:`Failed to update navigation`},objectActions:{deleteSuccess:`{{label}} deleted successfully`,deleteFailed:`Failed to delete {{label}}`,noRecordId:`No record ID provided`,deleteConfirm:`Are you sure you want to delete this record?`,bulkDeleteSuccess:`Deleted {{count}} {{label}} records`,bulkDeletePartial:`{{succeeded}} deleted, {{failed}} failed`},objectViewActions:{renameFailed:`Failed to rename view`,deleteFailed:`Failed to delete view`},dashboardActions:{pdfPreparing:`Preparing PDF export…`,exportFailed:`Export failed: {{message}}`,forecastSoon:`Forecast view coming soon`},recordDetail:{viewersTooltip:`Users viewing this record`},cellRender:{empty:`Empty`,yes:`Yes`,no:`No`,systemFields:`System`},user:{profile:`Profile`,settings:`Settings`,logout:`Log out`,preferences:`Preferences`,theme:`Theme`,language:`Language`},organizations:{mine:`My Organizations`,title:`Organizations`,heading:`Your Organizations`,subtitle:`Select an organization to continue, or create a new one.`,searchPlaceholder:`Search for an organization`,new:`New organization`,current:`Current organization`,manage:`Manage`,emptyTitle:`No organizations yet`,emptyDescription:`Create your first organization to get started.`,noMatches:`No organizations match your search.`},notifications:{regionLabel:`Notifications`,empty:`No notifications`,emptyUnread:`You're all caught up`,filterUnread:`Unread`,filterAll:`All`,markAllRead:`Mark all read`,viewAll:`View all notifications`,approvalsPending:`{{count}} pending approvals`,viewApprovals:`View approvals`,noPendingApprovals:`No pending approvals`,openApprovalsInbox:`Open Approvals Inbox`},publicForm:{submit:`Submit`,submitting:`Submitting…`,submitAnother:`Submit another response`,poweredBy:`Powered by ObjectStack`,secureNotice:`Your information is transmitted securely and only used to respond to your request.`,thankYouTitle:`Thank you!`,thankYouMessage:`Your submission has been received successfully.`,redirecting:`Redirecting in {{seconds}} seconds…`,unavailableTitle:`Form unavailable`,unavailableDescription:`No public form is available at this URL. Make sure the underlying view has anonymous sharing enabled and matches this slug.`,tryDemo:`Try the demo`,retry:`Retry`,loading:`Loading form…`,requiredHint:`* Required field`,consentLabelDefault:`I agree to the privacy policy and consent to my data being processed for this request.`,consentLink:`Privacy policy`,consentRequired:`Please accept the privacy policy to continue.`,rateLimited:`Please take a moment to review your answers before submitting.`,redirectBlocked:`Submission accepted, but the redirect URL was blocked for security.`,demo:{contactTitle:`Contact us`,contactDescription:`Tell us about your project and a sales representative will get back to you within one business day.`,supportTitle:`Submit a support request`,supportDescription:`Tell us what is going wrong — our team responds within one business day.`,thankYouSalesTitle:`Thanks — we received your message!`,thankYouSalesMessage:`A sales representative will be in touch within one business day.`,thankYouSupportTitle:`Got it — your request is in the queue.`,thankYouSupportMessage:`A support engineer will follow up shortly. Save this page if you have more screenshots to add.`,field:{firstName:`First name`,lastName:`Last name`,email:`Work email`,phone:`Phone`,jobTitle:`Job title`,company:`Company`,website:`Website`,industry:`Industry`,companySize:`Company size`,howCanWeHelp:`How can we help?`,subject:`Subject`,description:`Description`,issueType:`Issue type`,priority:`Priority`},industry:{technology:`Technology`,software:`Software / SaaS`,finance:`Finance`,healthcare:`Healthcare`,retail:`Retail`,other:`Other`},issueType:{question:`Question`,problem:`Problem`,bug:`Bug`,feature_request:`Feature request`},priority:{low:`Low`,medium:`Medium`,high:`High`,critical:`Critical`}}},marketplace:{title:`App Marketplace`,subtitle:`Browse approved apps published to the ObjectStack catalog. Click an app to view details and install it into one of your environments.`,searchPlaceholder:`Search apps by name or manifest ID…`,searchAria:`Search marketplace apps`,installed:`Installed`,installedCount:`Installed ({{count}})`,refresh:`Refresh`,all:`All`,noApprovedYet:`No apps have been approved for the marketplace yet.`,noMatchFilters:`No apps match your filters.`,noDescription:`No description provided.`,back:`Back to marketplace`,installedTitle:`Installed Apps`,installedSubtitle:`Marketplace packages currently installed into this runtime's kernel. Cached manifests live in <code>.objectstack/installed-packages/</code> and survive restarts.`,installedEmpty:`No marketplace apps installed in this runtime yet.`,browseLink:`Browse the marketplace →`,installedAdditiveNote:`<strong>Note:</strong> The kernel API is additive only — uninstall removes the on-disk manifest so the package won't load on next boot, but the running kernel keeps the app registered until you restart the runtime.`,installedAt:`Installed {{when}}`,installedBy:`by {{user}}`,installedPackageId:`package`,cachedAs:`Cached as <code>{{path}}</code>`,versionBadge:`v{{version}}`,installedBadge:`Installed v{{version}}`,load:{failed:`Failed to load marketplace`,failedHint:`By default this runtime points at the public ObjectStack cloud. Check the runtime is online, or override <code>OS_CLOUD_URL</code> to point at a self-hosted control plane.`,packageFailed:`Failed to load package`,notFound:`Not found.`},detail:{homepage:`Homepage`,installedV:`Installed · v{{version}}`,about:`About`,noReadme:`No readme provided.`,versions:`Versions`,noApprovedVersions:`No approved versions.`,prerelease:`pre`,moreOptions:`More install options`,uninstallFromRuntime:`Uninstall from this runtime`,addSampleData:`Add sample data`,reseedAgain:`Re-seed sample data`,purgeSampleData:`Purge sample data`,purgeConfirm:`Delete all sample records seeded by this package? User-added records will NOT be touched.`,purgeSuccess:`Removed {{count}} sample record(s).`,purgeNoData:`No sample records found to purge.`,reseedQueued:`Sample data will be re-seeded on next environment access.`,reseedLocalSuccess:`Re-seeded sample data: {{inserted}} inserted, {{updated}} updated.`,reseedPartialErrors:`({{count}} record(s) failed to write)`,updateAvailable:`Update available`},action:{install:`Install`,reinstall:`Reinstall`,working:`Working…`,installToCloud:`Install to cloud…`,installed:`Installed`,installing:`Installing…`,uninstall:`Uninstall`,uninstalling:`Uninstalling…`,details:`Details`,close:`Close`,dismiss:`Dismiss`,openOnCloud:`Open on cloud`,backHome:`Back to home`},install:{dialogTitle:`Install {{name}}`,dialogDescCurrent:`Install into this environment ({{host}}).`,dialogDescPicker:`Choose an environment to install this app into. You need to be signed into ObjectStack Cloud.`,environment:`Environment`,environmentPlaceholder:`Pick an environment`,includeSampleData:`Include sample data`,noEnvs:`No environments found in your active organization.`,noPermission:`You do not have permission to install apps in any environment. Only organization owners and admins can install — ask your workspace admin.`,signInFirst:`You need to sign into ObjectStack Cloud first. Click "Open on cloud" below.`,success:`Installed successfully. Open the environment to see the new app.`,localSuccess:`Installed v{{version}} to this runtime. "{{name}}" should now appear in the app switcher.`,localManifestConflict:`{{message}}
|
|
5
5
|
Tip: a local app already owns this manifest_id. Remove it from objectstack.config.ts first.`,localUnauthorized:`Sign in to this runtime first, then try again.`,localMarketplaceUnavailable:`This runtime has no OS_CLOUD_URL configured, so the marketplace catalog is unreachable.`},uninstall:{confirm:`Uninstall {{manifestId}} v{{version}} from this runtime?
|
|
6
6
|
|
|
7
|
-
The cached manifest will be removed. The app will remain loaded in the running kernel until the next restart.`,successInList:`Removed {{manifestId}}. Restart the runtime to fully unload it from the running kernel.`,successInDetail:`Removed cached manifest for {{manifestId}}. Restart the runtime to fully unload the app from the running kernel.`},accessDenied:{title:`App Marketplace is admin-only`,description:`You don't have permission to install apps in this environment. Ask an owner or admin of this organization for access.`},category:{crm:`CRM`,erp:`ERP`,hr:`Human Resources`,finance:`Finance`,project:`Project Management`,collaboration:`Collaboration`,analytics:`Analytics`,integration:`Integration`,automation:`Automation`,ai:`AI`,security:`Security`,"developer-tools":`Developer Tools`,"ui-theme":`UI Theme`,storage:`Storage`,other:`Other`},pricing:{free:`Free`,freemium:`Freemium`,paid:`Paid`,subscription:`Subscription`,"usage-based":`Usage-based`,"contact-sales":`Contact Sales`},relativeTime:{today:`today`,daysAgo:`{{count}}d ago`,monthsAgo:`{{count}}mo ago`,yearsAgo:`{{count}}y ago`}},approvalsInbox:{loadMore:`Load more`,loadingMore:`Loading…`,loadedOf:`Loaded {{loaded}} of {{total}}`,actEscalate:`SLA escalated`,systemSlaActor:`System (SLA)`,reassignBtn:`Reassign`,reassignTitle:`Hand this approval to someone else?`,reassignBody:`Your approver slot moves to the person you pick — they are notified and can act immediately.`,reassignTo:`New approver`,reassignToPlaceholder:`Pick a user or type an email / role:<name>`,reassignSuccess:`Handed to {{to}}`,requestInfoBtn:`Request info`,requestInfoTitle:`Ask the requester for more information?`,requestInfoBody:`The request stays pending; the requester is notified and can reply on the thread.`,requestInfoPlaceholder:`What do you need from the requester?`,requestInfoSent:`Sent back to the requester for more information`,remindBtn:`Send reminder`,remindSuccess:`Reminder sent to {{count}} approver(s)`,remindThrottled:`A reminder was sent recently — try again later.`,replyPlaceholder:`Reply on this request…`,slaRemaining:`SLA {{dur}} left`,slaOverdue:`SLA overdue {{dur}}`,actReassign:`Reassigned`,actRemind:`Reminder sent`,actRequestInfo:`Requested more info`,actComment:`Commented`,stepProgress:`Approval steps`,prevRequest:`Previous`,nextRequest:`Next`,positionOf:`{{index}} of {{total}}`,quickPhrase1:`Approved — meets requirements.`,quickPhrase2:`Approved with conditions — please monitor execution.`,quickPhrase3:`Please add supporting material and resubmit.`,title:`Approvals Inbox`,subtitle:`Review and act on approval requests.`,refresh:`Refresh`,tabMyPending:`My Pending`,tabSubmitted:`Submitted by me`,tabAll:`All`,searchPlaceholder:`Search record, process, requester…`,clearSearch:`Clear search`,statusFilter:`Status`,allStatuses:`All statuses`,processFilter:`Process`,allProcesses:`All processes`,objectFilter:`Object`,allObjects:`All objects`,filterCount:`{{shown}} of {{total}}`,selected:`selected`,actionableCount:`({{count}} actionable)`,selectAll:`Select all`,selectRow:`Select request`,colRequest:`Request`,colRecord:`Record`,colRequester:`Requester`,colStatus:`Status`,colWaiting:`Submitted`,colActions:`Actions`,statusPending:`Pending`,statusApproved:`Approved`,statusRejected:`Rejected`,statusRecalled:`Recalled`,statusReturned:`Returned for revision`,sendBackBtn:`Send back`,sendBackTitle:`Send this request back for revision?`,sendBackBody:`This round ends and the record unlocks so the requester can fix the data. When they resubmit, a fresh approval round opens for all approvers.`,sendBackPlaceholder:`What needs to be fixed before this can be approved?`,sendBackSuccess:`Sent back for revision — the requester can now edit and resubmit`,sendBackAutoRejected:`Revision limit reached — the request was auto-rejected`,actRevise:`Sent back for revision`,actResubmit:`Resubmitted`,roundChip:`Round {{n}}`,returnedHint:`An approver sent this back to you. The record is unlocked — fix the data, then resubmit to start a new approval round.`,resubmitBtn:`Resubmit`,resubmitting:`Resubmitting…`,resubmitSuccess:`Resubmitted — a new approval round has opened`,resubmitPlaceholder:`What did you change?`,editRecordBtn:`Edit record`,abandonTitle:`Abandon this revision?`,abandonBody:`This withdraws the request instead of resubmitting it. The approval ends here.`,emptyTitle:`No requests`,emptyPending:`You're all caught up — nothing is waiting on you.`,emptyOther:`Nothing here yet.`,emptyViewAll:`Browse all requests`,noMatches:`No matches for current filters.`,keyboardHint:`Keyboard: j/k move · Enter open · x select · a approve · r reject`,drawerTitle:`Approval Request`,submittedAgo:`Submitted {{when}}`,completedAt:`Completed {{when}}`,waitingOn:`Waiting on`,history:`Activity`,noActions:`No actions yet.`,actSubmit:`Submitted`,actApprove:`Approved`,actReject:`Rejected`,actRecall:`Recalled`,rawData:`Raw data (JSON)`,copy:`Copy`,copied:`Copied`,copyFailed:`Copy failed`,overrideActor:`Act as another identity (admin)`,actor:`Actor`,auto:`Auto`,overrideHint:`e.g. role:sales_manager. Leave blank to use the auto-detected identity.`,comment:`Comment (optional)`,approve:`Approve`,approving:`Approving…`,reject:`Reject`,rejecting:`Rejecting…`,recall:`Recall`,recalling:`Recalling…`,cancel:`Cancel`,clear:`Clear`,approveN:`Approve {{count}}`,rejectN:`Reject {{count}}`,bulkApproveTitle:`Approve {{count}} requests?`,bulkApproveBody:`Each request is approved with your identity and its flow continues down the approve branch.`,bulkRejectTitle:`Reject {{count}} requests?`,bulkRejectBody:`This rejects the selected requests and notifies their submitters.`,bulkApproved:`Approved {{count}} requests`,bulkRejected:`Rejected {{count}} requests`,bulkPartial:`{{ok}} succeeded, {{fail}} failed: {{which}}`,rejectOneTitle:`Reject "{{title}}"?`,rejectOneBody:`This rejects the request and notifies the submitter.`,rejectTitle:`Reject this request?`,rejectBody:`This marks the request as rejected and notifies the submitter.`,recallTitle:`Recall this request?`,recallBody:`This withdraws your request. Approvers can no longer act on it, and the record is unlocked.`,inlineApproved:`Approved "{{title}}"`,inlineRejected:`Rejected "{{title}}"`,approvedFinal:`Approved`,approvedWaiting:`Approved — waiting on the remaining approvers`,rejectedToast:`Rejected`,recalledToast:`Request recalled`,whyDisabled:`Only the assigned approvers can act on this request. It is waiting on: {{who}}.`,whyDisabledSubmitter:`You submitted this request, so you can recall it — but only the assigned approvers can approve or reject.`,noActor:`Cannot determine the acting identity`,actionFailed:`Action failed`,loadFailed:`Failed to load request`,recallUnavailable:`Recall is not available on this deployment.`,requestGone:`This request no longer exists. Refresh the list.`,notAllowed:`You are not allowed to perform this action.`,alreadyDecided:`This request was already decided. Refresh the list.`,justNow:`just now`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`},filterBuilder:{where:`Where`,and:`AND`,or:`OR`,clearAll:`Clear all`,selectField:`Select field`,operator:`Operator`,selectValue:`Select value`,value:`Value`,addFilter:`Add filter`,removeCondition:`Remove condition`,trueLabel:`True`,falseLabel:`False`,noResults:`No results`,searchField:`Search {{label}}…`,enterId:`Enter {{label}} id`,operators:{equals:`Equals`,notEquals:`Does not equal`,contains:`Contains`,notContains:`Does not contain`,isEmpty:`Is empty`,isNotEmpty:`Is not empty`,greaterThan:`Greater than`,lessThan:`Less than`,greaterOrEqual:`Greater than or equal`,lessOrEqual:`Less than or equal`,before:`Before`,after:`After`,between:`Between`,in:`In`,notIn:`Not in`}},sortBuilder:{sortBy:`Sort by`,thenBy:`Then by`,selectField:`Select field`,ascending:`A → Z`,descending:`Z → A`,addSort:`Add sort`,removeSort:`Remove sort`}},Yr={lookup:{recentlyUsed:`最近使用`,allResults:`全部结果`,loading:`加载中…`,noOptions:`未找到选项`,noRecords:`未找到记录`,createNew:`新建`,createNamed:`新建“{{name}}”`,showingResults:`显示 {{total}} 条结果中的 {{shown}} 条`,showAllResults:`查看全部结果({{count}})`,selectedBadge:`已选`,browseAll:`浏览全部记录`,remove:`移除 {{label}}`,selectFirst:`请先选择{{fields}}`,selectRecord:`选择记录`,recordCount:`{{count}} 条记录`,recordCountOne:`1 条记录`,pageOf:`第 {{current}}/{{total}} 页`,filters:`筛选`,clear:`清除`,yes:`是`,filterPlaceholder:`筛选{{label}}`,prevPage:`上一页`,nextPage:`下一页`,jumpToPage:`跳转到指定页`,retry:`重试`},common:{loading:`加载中...`,save:`保存`,cancel:`取消`,delete:`删除`,edit:`编辑`,create:`新建`,search:`搜索`,filter:`筛选`,reset:`重置`,confirm:`确认`,close:`关闭`,back:`返回`,next:`下一步`,previous:`上一步`,submit:`提交`,refresh:`刷新`,export:`导出`,import:`导入`,yes:`是`,no:`否`,ok:`确定`,actions:`操作`,more:`更多`,selectAll:`全选`,clearAll:`清除全部`,addToFavorites:`添加到收藏`,removeFromFavorites:`从收藏中移除`,noData:`暂无数据`,noResults:`未找到结果`,required:`必填`,optional:`选填`,selectOption:`请选择`,select:`选择...`,openChat:`打开聊天`,closeChat:`关闭聊天`,toggleSidebar:`切换侧边栏`,package:`软件包`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}}不能为空`,minLength:`{{field}}至少需要{{min}}个字符`,maxLength:`{{field}}最多{{max}}个字符`,min:`{{field}}不能小于{{min}}`,max:`{{field}}不能大于{{max}}`,email:`请输入有效的邮箱地址`,url:`请输入有效的URL`,pattern:`{{field}}格式不正确`,unique:`{{field}}必须唯一`,type:`{{field}}必须是有效的{{type}}`},form:{addItem:`添加项目`,removeItem:`移除项目`,fieldRequired:`此字段为必填项`,invalidFormat:`格式不正确`,saveSuccess:`保存成功`,saveError:`保存失败`,unsavedChanges:`您有未保存的更改,确定要离开吗?`,stepOf:`第{{current}}步,共{{total}}步`,createTitle:`新建{{object}}`,editTitle:`编辑{{object}}`,createDescription:`向数据库添加新的{{object}}。`,editDescription:`更新{{object}}的详情`,saveRecord:`保存`,create:`创建`,update:`更新`,createSuccess:`{{object}}创建成功`,updateSuccess:`{{object}}更新成功`,deleteSuccess:`{{object}}删除成功`},fields:{richText:{format:`格式: {{format}}`,basicEditorHint:`富文本编辑器(基础)`,placeholder:`请输入文字...`}},table:{rowsPerPage:`每页行数`,showing:`显示第{{from}}到{{to}}条,共{{total}}条`,noRows:`暂无数据`,sortAsc:`升序排列`,sortDesc:`降序排列`,filterColumn:`筛选{{column}}`,columns:`列`,exportCSV:`导出CSV`,exportExcel:`导出Excel`,selectRow:`选择行`,selectAllRows:`选择所有行`,expandRow:`展开行`,collapseRow:`折叠行`,hideColumn:`隐藏列`,freezeColumn:`冻结列`,unfreezeColumn:`取消冻结列`,pageInfo:`第 {{current}} 页,共 {{total}} 页`,totalRecords:`共 {{count}} 条`,noResults:`未找到结果`,noResultsHint:`请尝试调整筛选条件或搜索关键词。`,cancelAll:`全部取消`,saveAll:`全部保存 ({{count}})`,addRecord:`添加记录`,open:`打开`,search:`搜索...`,modified:`{{count}} 行已修改`,selected:`已选择 {{count}} 项`,edit:`编辑`,delete:`删除`},grid:{actions:`操作`,edit:`编辑`,delete:`删除`,export:`导出`,exportAs:`导出为 {{format}}`,loading:`加载数据中...`,errorLoading:`数据加载失败`,pullToRefresh:`下拉刷新`,refreshing:`刷新中…`,openRecord:`打开记录`,openMenu:`更多操作`,rowHeight:`行高: {{mode}}`,empty:`空`,yes:`是`,no:`否`,systemFields:`系统字段`,toolbar:{densityMode:`密度`,densityCompact:`紧凑`,densityComfortable:`舒适`,densitySpacious:`宽松`,densityCycleHint:`{{label}}(点击切换)`,densityCycleShortHint:`点击切换`},import:{title:`导入{{object}}`,stepUpload:`上传`,stepMapping:`字段映射`,stepPreview:`预览`,uploadDescription:`上传 CSV 文件以开始导入。`,mappingDescription:`将 CSV 列映射到对象字段。`,previewDescription:`导入前预览数据。`,dragDrop:`拖拽 CSV 文件到此处,或点击选择文件`,browseFiles:`选择文件`,onlyCsv:`仅支持 CSV 文件。`,fileNeedsHeader:`文件必须包含表头行和至少一行数据。`,mappingTemplate:`映射模板:`,chooseTemplate:`选择模板…`,noSavedTemplates:`暂无保存的模板`,noneOption:`— 无 —`,saveCurrent:`保存当前映射`,templateName:`模板名称`,save:`保存`,deleteTemplate:`删除模板`,csvColumn:`CSV 列`,mapsTo:`映射到`,status:`状态`,skipColumn:`跳过此列`,skip:`— 跳过 —`,mapped:`已映射`,skipped:`已跳过`,rowsWithErrors:`{{count}} 行有错误`,rowsCorrected:`已修正 {{count}} 行`,clickToFix:`— 点击高亮单元格可直接修改。`,showingRows:`显示第 {{shown}} 行,共 {{total}} 行`,importing:`导入中… {{progress}}%`,importComplete:`导入完成`,imported:`已导入 {{count}} 条`,skippedCount:`已跳过 {{count}} 条`,moreErrors:`…还有 {{count}} 个错误`,cancel:`取消`,back:`上一步`,next:`下一步`,close:`关闭`,importNRows:`导入 {{count}} 行`,importingProgress:`导入中…`,requiredMark:`*`,required:`必填`,invalidType:`{{type}} 格式无效`}},calendar:{today:`今天`,month:`月`,week:`周`,day:`日`,agenda:`日程`,allDay:`全天`,noEvents:`暂无事件`,newEvent:`新建事件`,moreEvents:`+{{count}} 更多`},list:{loading:`正在加载记录...`,recordCount:`{{count}} 条记录`,recordCountOne:`{{count}} 条记录`,addRecord:`添加记录`,tabs:`标签页`,allRecords:`全部记录`,search:`搜索`,filter:`筛选`,filterRecords:`筛选记录`,sort:`排序`,sortRecords:`排序记录`,group:`分组`,groupBy:`分组依据`,export:`导出`,exportAs:`导出为 {{format}}`,color:`颜色`,rowColor:`行颜色`,colorByField:`按字段着色`,clear:`清除`,none:`无`,hideFields:`隐藏字段`,noItems:`暂无数据`,noItemsMessage:`当前没有可显示的记录。请尝试调整筛选条件或新建一条数据。`,firstRunTitle:`这里还没有数据`,firstRunMessage:`创建第一条记录即可开始。`,noMatches:`没有匹配的记录`,noMatchesMessage:`没有符合当前筛选或搜索条件的记录,试试调整或清除它们。`,loadErrorTitle:`无法加载记录`,loadErrorMessage:`加载数据时出错。请检查网络连接后重试。`,retry:`重试`,managedBy:{system:{title:`这里还没有数据`,message:`当其来源操作运行时(例如提交审批、共享、邀请),记录会自动出现。请在来源记录上触发其中一个操作来创建数据。`},appendOnly:{title:`暂无事件记录`,message:`这是一份不可变更的审计日志。记录由平台在事件发生时写入——你可以导出历史,但无法在此处创建条目。`},betterAuth:{title:`暂无身份记录`,message:`身份记录由认证提供方管理。请使用专门的身份流程(邀请用户、重置密码……)来创建新条目。`}},showAll:`显示全部`,pullToRefresh:`下拉刷新`,refreshing:`刷新中…`,share:`分享`,print:`打印`,hideFieldsTitle:`隐藏字段`,dataLimitReached:`显示前 {{limit}} 条记录。可能有更多数据。`,viewSettings:`视图设置`,viewSettingsHint:`分组、行颜色、密度与可见字段。`,addGroup:`添加分组字段`,collapsedByDefault:`默认折叠`,removeGroup:`删除`},kanban:{addCard:`添加卡片`,addColumn:`添加列`,moveCard:`移动卡片`,deleteCard:`删除卡片`,deleteColumn:`删除列`,noCards:`暂无卡片`,cardTitlePlaceholder:`输入卡片标题...`},timeline:{bucket:{overdue:`已逾期`,today:`今天`,tomorrow:`明天`,thisWeek:`本周`,nextWeek:`下周`,later:`更晚`,noDate:`无日期`,unassigned:`未分配`}},gantt:{column:{taskName:`任务名称`,start:`开始`,end:`结束`},toolbar:{prevPeriod:`上一周期`,nextPeriod:`下一周期`,zoomIn:`放大`,zoomOut:`缩小`,jumpToToday:`跳到今天`,today:`今天`,thisWeek:`本周`,thisMonth:`本月`,showTaskList:`展开任务列表`,hideTaskList:`收起任务列表`,viewMode:`时间粒度`,enterFullscreen:`进入全屏`,exitFullscreen:`退出全屏`,criticalPath:`高亮关键路径`,autoSchedule:`自动排程依赖`,exportPng:`导出 PNG`,exportPdf:`导出 PDF`,saveLayout:`保存布局`,undo:`撤销`,redo:`重做`},viewMode:{day:`日`,week:`周`,month:`月`,quarter:`季度`,year:`年`},row:{expand:`展开`,collapse:`收起`,locate:`在甘特图上定位`},aria:{taskList:`任务列表`},tooltip:{days:`天`},menu:{view:`查看详情`,edit:`行内编辑`,delete:`删除`,addPredecessor:`添加前置任务…`,addSuccessor:`添加后置任务…`,removeDependency:`移除依赖`,noCandidates:`无可用任务`},linkType:{fs:`完成 → 开始`,ss:`开始 → 开始`,ff:`完成 → 完成`,sf:`开始 → 完成`},conflict:{title:`排程冲突`,body:`此次移动与依赖约束冲突。是否自动重新排程 {{count}} 个受影响的任务?`,confirm:`自动重新排程`,cancel:`保持不变`},resource:{header:`资源`,peak:`峰值`,over:`超载`,empty:`没有可分配的任务。`},readOnly:`只读`,readOnlyHint:`此视图已禁用编辑。`},view:{editViewConfig:`编辑视图配置`,rename:`重命名`,duplicateView:`复制视图`,shareView:`共享视图`,setAsDefault:`设为默认`,pinView:`固定视图`,unpinView:`取消固定`,changeViewType:`更改视图类型`,deleteView:`删除视图`,addView:`添加视图`,unsavedChanges:`未保存的更改`,saveAsView:`另存为视图`,moreViews:`还有 {{count}} 个`,activeFilters:`筛选条件生效中`,activeSort:`排序生效中`,manageViews:`管理视图`,manageAllViews:`管理所有视图…`,manageViewsDescription:`对该对象的所有视图进行重新排序、重命名、固定或删除。`,searchViews:`搜索视图`,addNewView:`新建视图`,done:`完成`,noViewsFound:`没有匹配的视图。`,dragToReorder:`拖动排序`,defaultView:`默认视图`,defaultBadge:`默认`,tabActionsFor:`{{name}} 的视图操作`,readonlyAriaLabel:`只读视图`,readonlyTooltip:`系统视图 — 由代码定义,只读。`},designer:{undo:`Undo`,redo:`Redo`},detail:{back:`返回`,edit:`编辑`,editInline:`编辑`,save:`保存`,saveChanges:`保存更改`,saving:`保存中…`,editFieldsInline:`编辑字段`,lockedByApproval:`审批中已锁定`,lockedTooltip:`该记录有待审批的请求,编辑已被锁定`,cancelApproval:`撤回审批`,cancelApprovalInFlight:`撤回中…`,cancelApprovalTooltip:`撤回当前的待审批请求以解除记录锁定`,cancelApprovalFailed:`撤回审批失败`,cancelApprovalUnavailable:`当前数据源不支持撤回审批`,linkCopied:`链接已复制到剪贴板`,linkCopyFailed:`复制链接失败`,cancel:`取消`,cancelEdit:`放弃更改`,sectionMoreDetails:`更多详情`,concurrentUpdateTitle:`该记录已被他人修改`,concurrentUpdateDescription:`在你编辑期间,另一位用户保存了 {{field}} 的新版本。为避免无声覆盖对方的改动,请选择如何处理该冲突。`,concurrentUpdateYourEdit:`你的修改`,concurrentUpdateCurrentValue:`当前值`,concurrentUpdateUpdatedBy:`由 {{name}} 更新`,concurrentUpdateUpdatedAt:`更新于 {{when}}`,concurrentUpdateReload:`加载最新`,concurrentUpdateOverwrite:`仍然覆盖`,concurrentUpdateCancel:`取消`,openInNewTab:`在新标签页打开`,share:`分享`,duplicate:`复制`,export:`导出`,viewHistory:`查看历史`,delete:`删除`,moreActions:`更多操作`,addToFavorites:`添加到收藏`,removeFromFavorites:`从收藏中移除`,previousRecord:`上一条记录`,nextRecord:`下一条记录`,recordOf:`第 {{current}} 条,共 {{total}} 条`,recordNotFound:`未找到记录`,recordNotFoundDescription:`您查找的记录不存在或已被删除。`,goBack:`返回`,details:`详情`,related:`相关`,relatedRecords:`{{count}} 条记录`,relatedRecordOne:`{{count}} 条记录`,noRelatedRecords:`暂无相关记录`,loading:`加载中...`,copyToClipboard:`复制到剪贴板`,copied:`已复制!`,deleteConfirmation:`确定要删除此记录吗?`,editRecord:`编辑记录`,viewAll:`查看全部`,new:`新建`,emptyValue:`—`,activity:`活动`,history:`历史`,editRow:`编辑`,deleteRow:`删除`,deleteRowConfirmation:`确定要删除此记录吗?`,deleteRowTitle:`删除记录`,actions:`操作`,previousPage:`上一页`,nextPage:`下一页`,pageOf:`第 {{current}} 页,共 {{total}} 页`,sortBy:`排序`,filterPlaceholder:`筛选...`,highlightFields:`关键字段`,comments:`评论`,searchComments:`搜索评论…`,addCommentPlaceholder:`添加评论… (Ctrl+Enter 提交)`,noMatchingComments:`没有匹配的评论`,noCommentsYet:`暂无评论`,pinned:`已置顶`,pin:`置顶`,unpin:`取消置顶`,justNow:`刚刚`,minutesAgo:`{{count}}分钟前`,hoursAgo:`{{count}}小时前`,daysAgo:`{{count}}天前`,systemActor:`系统`,unknownUser:`未知用户`,createdBy:`创建于`,updatedBy:`更新于`,dropFilesToUpload:`拖拽文件到此处或点击上传`,attachmentCount:`{{count}} 个附件`,attachmentCountPlural:`{{count}} 个附件`,removeAttachment:`移除附件`,unifiedDiff:`统一视图`,sideBySideDiff:`并排视图`,noChanges:`无变更`,previousVersion:`旧版本`,currentVersion:`新版本`,discussion:`讨论`,showDiscussion:`显示讨论 ({{count}})`,hideDiscussion:`隐藏讨论`,bold:`粗体 (Ctrl+B)`,italic:`斜体 (Ctrl+I)`,listFormat:`列表`,inlineCode:`行内代码`,mentionSomeone:`提及某人`,preview:`预览`,submitComment:`提交 (Ctrl+Enter)`,sendComment:`发送`,writeComment:`写评论…`,subscribedTooltip:`已订阅 — 点击取消订阅`,unsubscribedTooltip:`订阅通知`,firstRecord:`第一条记录 (Home)`,previousRecordKey:`上一条记录 (←)`,nextRecordKey:`下一条记录 (→)`,lastRecord:`最后一条记录 (End)`,noRecords:`无记录`,showEmptyRelated_one:`+ {{count}} 个为空`,showEmptyRelated_other:`+ {{count}} 个为空`,searchWhileNavigating:`导航时搜索`,searchRecords:`搜索记录…`,allActivity:`全部动态`,commentsOnly:`仅评论`,fieldChangesFilter:`字段变更`,tasksOnly:`仅任务`,leaveCommentPlaceholder:`留下评论… (Ctrl+Enter 提交)`,noActivity:`暂无活动记录`,loadMore:`加载更多`,edited:`(已编辑)`,via:`通过 {{source}}`,replyCount:`{{count}} 条回复`,replyCountPlural:`{{count}} 条回复`,replyPlaceholder:`回复…`,filterActivity:`筛选活动`,openDiscussion:`打开讨论面板`,closeDiscussion:`关闭讨论面板`,subscribeAriaLabel:`订阅通知`,unsubscribeAriaLabel:`取消订阅通知`,clearSearch:`清除搜索`,copyEmail:`复制邮箱`,copyPhone:`复制电话号码`,copyRecordId:`复制记录 ID`,showEmptyFields:`显示 {{count}} 个空字段`,hideEmptyFields:`隐藏空字段`,noValue:`无`},chart:{noData:`暂无图表数据`,loading:`图表加载中...`},report:{total:`总计`,rowTotal:`行合计`,columnTotal:`列合计`,grandTotal:`总计`,totals:`汇总`,rowsLabel:`行`,columnsLabel:`列`,allLabel:`(全部)`,emptyLabel:`(空)`,loading:`加载中…`,failedToLoad:`矩阵报表加载失败:{{message}}`,needsAcross:"矩阵报表至少需要一个 `groupingsAcross` 字段。",aggregate:{count:`计数`,countDistinct:`去重计数`,sum:`求和`,avg:`平均`,min:`最小值`,max:`最大值`,first:`首个`},editor:{breadcrumb:`配置`,basic:`基础`,title:`标题`,titlePlaceholder:`例如:按季度的销售管道`,description:`描述`,descriptionPlaceholder:`此报表展示什么?`,type:`报表类型`,typeTabular:`表格 — 平铺列表`,typeSummary:`汇总 — 分组带合计`,typeMatrix:`矩阵 — 行列透视`,typeJoined:`拼接 — 多块组合`,typeHelp:`选择最贴合需求的布局方式。`,data:`数据`,objectName:`数据源`,objectNamePlaceholder:`例如:opportunity`,objectNameHelp:`此报表应查询哪个对象?`,limit:`行数上限`,limitPlaceholder:`例如:100`,columns:`列`,columnsHint:`选择要展示的字段。汇总或矩阵报表可添加聚合(求和、计数…)。`,filters:`筛选`,filtersHint:`限定参与报表的数据行。`,filtersComplex:`此报表使用了高级筛选条件,此处无法编辑。保存时将原样保留。`,groupBy:`分组`,groupByHint:`按字段分组并计算小计。`,rows:`行`,rowsHint:`按这些字段对行分组。`,columnsAxis:`列`,columnsAxisHint:`将这些字段透视到顶部。`,values:`度量`,valuesHint:`每个单元格里展示的数字。选择一个或多个字段并设置聚合方式(求和、计数…)。`,grouping:`分组`,addGrouping:`添加分组`,dateGranularity:`日期粒度`,dateGranularityNone:`(使用原始值)`,day:`日`,week:`周`,month:`月`,quarter:`季度`,year:`年`,sortAsc:`升序`,sortDesc:`降序`,chart:`图表`,chartHint:`在表格旁可选展示的可视化。`,chartType:`图表类型`,chartTitle:`图表标题`,chartTitlePlaceholder:`默认使用报表标题`,chartXAxis:`X 轴(类别)`,chartYAxis:`Y 轴(数值)`,chartShowLegend:`显示图例`,chartShowDataLabels:`显示数据标签`,chartNone:`(无图表)`,chartBar:`柱状图`,chartLine:`折线图`,chartArea:`面积图`,chartPie:`饼图`,chartDonut:`环形图`,chartFunnel:`漏斗图`,validationNeedsObject:`请先选择数据源,再添加列。`,validationMatrixNeedsRowsCols:`矩阵报表至少需要一个行字段和一个列字段。`,validationSummaryNeedsRows:`汇总报表至少需要一个分组字段。`,blocks:`区块`,blocksHint:`每个区块都是独立的表格或图表。区块筛选会与报表筛选合并(AND)。`,addBlock:`添加区块`,removeBlock:`删除区块`,blockName:`区块名称`,blockNamePlaceholder:`唯一的区块名`,blockLabel:`显示标题`,blockLabelPlaceholder:`显示在区块上方`,blockDescription:`说明`,blockDescriptionPlaceholder:`该区块的可选说明`,validationJoinedNeedsBlocks:`组合报表至少需要一个区块。`,validationBlockNameRequired:`每个区块都必须有非空的名称。`,validationBlockNameDuplicate:`区块名称在报表内必须唯一。`,validationBlockNeedsColumns:`每个区块至少需要一列。`,noneOption:`(无)`,addCondition:`添加条件`,combineLogic:`组合方式`,opContains:`包含`,opIsEmpty:`为空`,opIsNotEmpty:`不为空`,formatAuto:`自动`,formatCurrency:`货币`,formatPercent:`百分比`,formatInteger:`整数`,formatDate:`日期`,formatDatetime:`日期 + 时间`,columnLabelPlaceholder:`自定义标签`,aggregateColumn:`聚合`,formatColumn:`格式`,addColumns:`添加字段`,searchFields:`搜索字段…`,noMatchingFields:`没有匹配的字段。`,noFieldsAvailable:`暂无可用字段。`,columnsCount:`已选择 {n} 个列`,columnsEmpty:`尚未选择任何列。`,fieldPickerTitle:`选择字段`,fieldPickerDescription:`可选择一个或多个字段添加到报表,输入关键字可快速筛选。`,fieldPickerChangeTitle:`更换字段`,fieldPickerAddGroupingTitle:`添加分组`,fieldPickerEmpty:`(请选择字段)`,fieldPickerSelected:`已选 {n} 个`,fieldPickerClear:`清空选择`,fieldPickerAdd:`添加`,fieldPickerAddN:`添加 {n} 个`}},map:{searchLocations:`搜索位置…`,locationDetails:`位置详情`,markersCount:`{{count}} 个标记`,invalidCoordinates:`{{count}} 条记录因坐标缺失或无效已从地图中排除。`,invalidCoordinatesPlural:`{{count}} 条记录因坐标缺失或无效已从地图中排除。`},workflow:{draft:`草稿`,active:`活跃`,paused:`已暂停`,completed:`已完成`,cancelled:`已取消`,save:`保存`,publish:`发布`,addNode:`添加节点`,workflowFlow:`工作流程`,properties:`属性`,connections:`连接`,quickConnect:`快速连接`,fromPlaceholder:`从...`,toPlaceholder:`到...`,connect:`连接`,label:`标签`,type:`类型`,description:`描述`,assignee:`负责人`,assigneeType:`负责人类型`,user:`用户`,role:`角色`,group:`组`,expression:`表达式`,timeoutMinutes:`超时时间(分钟)`,selectNodeToEdit:`选择节点以编辑其属性`,workflowTitle:`工作流标题`,newWorkflow:`新工作流`,outConnections:`{{count}} 个输出`,start:`开始`,end:`结束`,task:`任务`,userTask:`用户任务`,serviceTask:`服务任务`,scriptTask:`脚本任务`,approval:`审批`,condition:`条件`,parallelGateway:`并行网关`,joinGateway:`合并网关`,boundaryEvent:`边界事件`,delay:`延迟`,notification:`通知`,webhook:`Webhook`,allowConcurrency:`允许(并发执行)`,forbidConcurrency:`禁止(跳过新任务)`,replaceConcurrency:`替换(取消现有任务)`,queueConcurrency:`排队(等待当前完成)`,conditionEvent:`条件`,manualEvent:`手动`,webhookEvent:`Webhook`,timerEvent:`定时器`,signalEvent:`信号`,versionHistory:`版本历史`,importBpmn:`导入 BPMN`,exportBpmn:`导出 BPMN`,undo:`撤销`,redo:`重做`,resetZoom:`重置缩放`},dashboard:{addWidget:`添加组件`,removeWidget:`移除组件`,editLayout:`编辑布局`,saveLayout:`保存布局`,resetLayout:`重置布局`,total:`总计`,noDataAvailable:`暂无数据`,noDataSourceFor:`没有可用的数据源:`,noRows:`暂无数据行`,pickMeasures:`请为该数据集组件选择度量(值)。`,datasetUnsupported:`当前数据源不支持数据集查询。`,details:`明细`,exportCsv:`导出 CSV`,openInList:`在列表中打开`,trend:{vsLastQuarter:`较上季度`,vsLastMonth:`较上月`,vsLastWeek:`较上周`,vsLastYear:`较去年`,vsYesterday:`较昨日`,vsPreviousPeriod:`较上期`}},configPanel:{save:`保存`,discard:`丢弃`,close:`关闭`,layout:`布局`,columns:`列数`,gap:`间距`,rowHeight:`行高`,data:`数据`,refreshInterval:`刷新间隔`,appearance:`外观`,title:`标题`,showDescription:`显示描述`,theme:`主题`,configuration:`配置`,general:`基本`,advanced:`高级`},appDesigner:{createApp:`创建应用`,editApp:`编辑应用`,basicInfo:`基本信息`,objects:`业务对象`,navigation:`导航`,branding:`品牌`,appName:`应用名称`,appTitle:`标题`,appDescription:`描述`,appIcon:`图标`,template:`模板`,layout:`布局`,layoutSidebar:`侧边栏`,layoutHeader:`顶部导航`,layoutEmpty:`空白`,selectObjects:`选择对象`,searchObjects:`搜索对象…`,selectAll:`全选`,deselectAll:`取消全选`,navBuilder:`导航构建器`,addGroup:`添加分组`,addUrl:`添加链接`,addSeparator:`添加分隔线`,noNavItems:`暂无导航项。`,logoUrl:`Logo 链接`,primaryColor:`主色调`,faviconUrl:`网站图标链接`,preview:`预览`,complete:`完成`,snakeCaseHint:`必须使用 snake_case 格式(如 my_app)`,modeEdit:`编辑`,modePreview:`预览`,modeCode:`代码`,addWidget:`添加组件`,widgetProperties:`组件属性`,dataSource:`数据源`,valueField:`数值字段`,aggregate:`聚合`,colorVariant:`颜色`,addComponent:`添加组件`,componentProperties:`组件属性`,viewType:`视图类型`,fields:`字段`,toolbar:`工具栏`,showSearch:`显示搜索`,showFilters:`显示筛选`,showSort:`显示排序`,appearance:`外观`,rowHeight:`行高`,stripedRows:`斑马纹`,bordered:`边框`,livePreview:`实时预览`,stepBasicDesc:`名称、标题和布局`,stepObjectsDesc:`选择业务对象`,stepNavigationDesc:`构建导航树`,stepBrandingDesc:`Logo、颜色和图标`,noObjectsFound:`未找到对象。`,noNavItemsHint:`暂无导航项。请在上一步选择对象或手动添加项目。`,separator:`分隔线`,separatorLabel:`— 分隔线 —`,newGroup:`新建分组`,newLink:`新建链接`,saveDraft:`保存草稿`,cancelConfirmTitle:`放弃更改?`,cancelConfirmMessage:`您有未保存的更改。确定要取消吗?`,confirmDiscard:`放弃`,keepEditing:`继续编辑`,navNoItems:`暂无导航项。点击上方按钮添加项目。`,navNoPreviewItems:`无项目`,navLivePreview:`实时预览`,navCollapseGroup:`折叠分组`,navExpandGroup:`展开分组`,navAddChild:`添加子项`,navMoveUp:`上移`,navMoveDown:`下移`,navRemove:`移除`,navObjectPage:`对象页面`,navDashboard:`仪表盘`,navPage:`页面`,navReport:`报表`,navGroup:`分组`,navUrl:`链接`,navSeparator:`分隔线`,navTypeObject:`对象`,navTypeDashboard:`仪表盘`,navTypePage:`页面`,navTypeReport:`报表`,navTypeUrl:`链接`,navTypeGroup:`分组`,navTypeSeparator:`分隔线`,navTypeAction:`操作`,navEditIcon:`编辑图标`,navToggleVisible:`切换可见性`,navHidden:`已隐藏`,navExportSchema:`导出 JSON`,navImportSchema:`导入 JSON`,navExportSuccess:`导航结构已导出`,navImportSuccess:`导航结构已导入`,navImportError:`无效的导航 JSON`,navIconPlaceholder:`图标名称(如 Users)`,dashboardEditor:`仪表盘编辑器`,noWidgets:`暂无小组件。点击上方按钮添加。`,widgetLayoutSize:`布局尺寸`,widgetWidth:`宽度`,widgetHeight:`高度`,dashboardPreview:`仪表盘预览`,noWidgetsPreview:`暂无可预览的小组件`,pageCanvasEditor:`页面画布编辑器`,emptyPage:`空白页面。点击上方按钮添加组件。`,pagePreview:`页面预览`,noComponentsPreview:`暂无可预览的组件`,modePage:`页面`,modeDashboard:`仪表盘`,undo:`撤销`,redo:`重做`,brandingEditor:`品牌编辑器`,brandingExport:`导出 JSON`,brandingImport:`导入 JSON`,brandingPreview:`预览`,brandingSampleButton:`示例按钮`,brandingSampleText:`这是您的品牌主题效果预览。`,colorPalette:`颜色面板`,fontFamily:`字体`,fontDefault:`默认(系统)`,modeLight:`浅色`,modeDark:`深色`,mobilePreview:`移动端预览`,objectManager:{title:`对象管理器`,addObject:`新建对象`,searchPlaceholder:`搜索对象…`,noObjects:`未找到对象。`,objectName:`API 名称`,objectLabel:`标签`,pluralLabel:`复数标签`,icon:`图标`,selectIcon:`选择图标…`,group:`分组`,noGroup:`无分组`,sortOrder:`排序`,enabled:`启用`,relationships:`关系`,systemBadge:`系统`,fieldCount:`{{count}} 个字段`,ungrouped:`未分组`,deleteConfirmTitle:`删除对象?`,deleteConfirmMessage:`这将永久删除该对象及其所有字段。此操作无法撤销。`},fieldDesigner:{title:`字段设计器`,addField:`新建字段`,searchPlaceholder:`搜索字段…`,allTypes:`所有类型`,noFields:`未找到字段。`,fieldName:`API 名称`,fieldLabel:`标签`,fieldType:`类型`,fieldGroup:`分组`,description:`描述`,required:`必填`,unique:`唯一`,readOnly:`只读`,hidden:`隐藏`,indexed:`索引`,externalId:`外部 ID`,trackHistory:`追踪历史`,defaultValue:`默认值`,placeholder:`占位文本`,referenceTo:`引用对象`,formula:`公式`,options:`选项`,addOption:`添加选项`,validationRules:`验证规则`,addRule:`添加规则`,systemBadge:`系统`,ungrouped:`通用`,deleteConfirmTitle:`删除字段?`,deleteConfirmMessage:`这将永久删除该字段。此字段中的现有数据将丢失。`,basicSection:`基础`,typeSpecificSection:`类型设置`,advancedSection:`高级`,typeCategory:{text:`文本`,number:`数字`,date:`日期时间`,choice:`选择`,relation:`关联`,advanced:`高级`}}},console:{title:`ObjectStack 控制台`,initializing:`正在初始化应用程序...`,search:`搜索…`,breadcrumb:{dashboards:`仪表盘`,pages:`页面`,reports:`报告`,system:`系统`},nav:{pinItem:`固定 {{name}}`,unpinItem:`取消固定 {{name}}`,dragToReorder:`拖动以重新排序`,favorites:`收藏`},loadingSteps:{connecting:`正在连接数据源`,loadingConfig:`正在加载配置`,preparingWorkspace:`正在准备工作区`},error:{connectionFailed:`无法连接到服务器`,serverUnreachable:`无法访问服务器 {{url}}。`,checkServer:`请检查网络连接,或确认后端服务正在运行。`,timeout:`连接超时(10 秒)。`},actions:{retry:`重试`,retrying:`正在重试…`},shortcuts:{title:`键盘快捷键`,description:`所有可用键盘快捷键的快速参考。`,groups:{general:`通用`,navigation:`导航`,dataViews:`数据视图`,preferences:`偏好设置`},openCommandPalette:`打开命令面板`,showShortcuts:`显示键盘快捷键`,closeDialog:`关闭对话框/面板`,toggleSidebar:`切换侧边栏`,focusSearch:`聚焦搜索`,createRecord:`新建记录`,refreshData:`刷新数据`,editRecord:`编辑选中记录`,toggleDarkMode:`切换深色模式`},commandPalette:{placeholder:`输入命令或搜索...`,noResults:`未找到结果。`,searching:`搜索中…`,records:`记录`,recentRecords:`最近访问`,objects:`对象`,dashboards:`仪表盘`,pages:`页面`,reports:`报表`,switchApp:`切换应用`,current:`当前`,preferences:`偏好设置`,lightTheme:`浅色主题`,darkTheme:`深色主题`,systemTheme:`系统主题`,actions:`操作`,openFullSearch:`打开完整搜索页面`,createApp:`创建新应用`},ai:{workspaceTitle:`AI 工作区`,workspaceSubtitle:`提问、查看并继续历史对话`,openChats:`打开对话列表`,chats:`对话`,chatsDescription:`浏览和管理 AI 对话。`,share:`分享`,shareTitle:`分享此对话`,shareDisabledTitle:`开始对话后即可分享`,newChat:`新对话`,searchChats:`搜索对话...`,noChatsYet:`暂无对话`,noChatsDescription:`开始新的对话后会显示在这里。`,noMatchingChats:`没有匹配的对话。`,newConversation:`新对话`,renameConversation:`重命名对话`,deleteConversation:`删除对话`,saveRename:`保存重命名`,cancelRename:`取消重命名`,loadingHistory:`正在加载对话历史...`,conversationReady:`对话已就绪`,preparingConversation:`正在准备新对话`,offlineDemoMode:`离线演示模式 — 无法获取助手列表`,askAgent:`向 {{agent}} 提问...`,assistant:`助手`,loadingAgents:`正在加载助手...`,askAnything:`输入你的问题...`,emptyTitle:`开始对话`,emptyDescription:`可以直接提问,助手会结合当前应用上下文提供帮助。`,switchAssistant:`切换助手`,chooseAgent:`选择助手…`,empty:{build:{title:`用 AI 搭建`,description:`用自然语言描述一个应用或流程 —— 我会起草对象、界面和自动化,随后你审阅并发布。`},ask:{title:`向你的数据提问`,description:`针对你的记录提问 —— 在你有权访问的数据范围内进行计数、列举和汇总。`}},clearConversation:`清空`,sendHint:`发送`,agentActivity:`执行过程`,toolCompleted:`已完成`,toolRunning:`运行中`,toolAwaitingApproval:`等待确认`,toolFailed:`失败`,toolDetailsHidden:`已隐藏工具参数和原始结果,仅保留过程摘要。`,copy:`复制`,copied:`已复制`,regenerate:`重新生成`,model:`模型`,submit:`发送`,uploadFiles:`上传文件`,stopResponse:`停止生成`,trace:`调试 trace`,viewTrace:`查看调试 trace`,nextSteps:`下一步`,publishDrafts:`发布`,publishOk:`已发布,对象已生效。`,seedWarn:`已发布,但部分示例数据未能载入。`,openBuiltApp:`打开应用`,previewDraft:`预览`,resizeSplit:`调整对话与预览的宽度`,hideChats:`隐藏对话列表`,showChats:`显示对话列表`,planTitle:`方案预览`,planQuestions:`搭建前请确认`,planAssumptions:`假设`,planApproveHint:`回复以确认或调整该方案。`,planApprove:`开始搭建`,planAdjust:`调整方案`,planApproveMessage:`就按这个方案搭建吧。`,planApproveDefaultsMessage:`就按你的合理假设直接搭建,未决问题用默认即可。`,planAnswerMessage:`关于「{{question}}」,我选择「{{option}}」。`,justNow:`刚刚`,minutesAgo:`{{count}} 分钟前`,hoursAgo:`{{count}} 小时前`,daysAgo:`{{count}} 天前`,agentLabels:{ask:`提问`,build:`构建`,dataChat:`智能助手`,metadataAssistant:`元数据开发助手`},suggestions:{dataChat:{userCount:`系统里有多少个用户?列出他们的邮箱。`,recentRecords:`帮我列出最近创建的 5 条记录。`,recordCounts:`统计每个对象的记录数。`},metadataAssistant:{buildCrm:`帮我搭建一个 CRM:客户、联系人、商机,并建立它们之间的关系。`,buildApp:`做一个项目管理应用:项目、任务、成员。`,buildFlow:`设计一个工单系统:工单、优先级、状态流转。`},generic:{help:`你可以帮我做什么?`,availableObjects:`列出可用的数据对象。`,recentActivity:`总结我的最近动态。`}}},errors:{somethingWentWrong:`出错了`,unexpectedError:`渲染此视图时发生意外错误。`,tryAgain:`重试`,goHome:`返回首页`,errorDetails:`错误详情(仅开发模式)`},theme:{toggle:`切换主题`,light:`浅色`,dark:`深色`,system:`系统`},objectView:{systemViewReadonly:`系统视图由代码定义,只读。`,expandToPage:`以完整页面打开`,objectNotFound:`未找到对象`,objectNotFoundDescription:`对象"{{objectName}}"在当前配置中不存在。`,objectNotFoundHint:`请检查您的应用导航设置或从侧边栏选择其他对象。`,allRecords:`所有记录`,exitDesignMode:`退出设计模式`,enterDesignMode:`进入设计模式`,metadataInspector:`元数据检查器`,editView:`编辑视图`,addView:`添加视图`,designTools:`设计工具`,new:`新建`,import:`导入`,importTitle:`从 CSV 文件导入`,importedToast:`成功导入 {{count}} 行。`,importedWithSkipped:`已导入 {{ok}} 行;跳过 {{skipped}} 行。`,configureView:`配置视图`,closePanel:`关闭面板`,showAdvancedSettings:`显示高级设置`,showFewerSettings:`显示精简设置`,page:`页面`,pageConfigHint:`工具栏、导航与视图外壳设置`,listConfigHint:`此列表类型的数据渲染、列与外观`,general:`常规`,generalHint:`视图标题、描述和类型`,toolbar:`工具栏`,toolbarHint:`搜索、筛选、排序、分组和密度切换`,toolbarEnabledCount:`已启用 {{count}}/{{total}} 项`,navigationSection:`导航`,navigationHint:`行点击行为和详情视图设置`,records:`记录`,recordsHint:`选择模式、添加记录和内联编辑`,exportPrint:`导出与打印`,exportPrintHint:`导出格式、打印和记录数显示`,showAllFields:`全部显示`,hideAllFields:`全部隐藏`,searchFields:`搜索字段...`,title:`标题`,description:`描述`,data:`数据`,source:`数据源`,columns:`列`,filterBy:`筛选条件`,sortBy:`排序条件`,appearance:`外观`,showDescription:`显示描述`,viewType:`视图类型`,userFilters:`用户筛选器`,enableSearch:`启用搜索`,enableFilter:`启用筛选`,enableSort:`启用排序`,enableHideFields:`启用隐藏字段`,enableGroup:`启用分组`,enableColor:`启用颜色`,enableDensity:`启用密度`,userActions:`用户操作`,addRecordViaForm:`通过表单添加记录`,advanced:`高级`,allowExport:`允许导出`,recordCount:`{{count}} 条记录`,noDescription:`无描述`,none:`无`,columnsConfigured:`{{count}} 列`,save:`保存`,discard:`丢弃`,createView:`创建视图`,createViewDesc:`先选择视图类型,再为它命名。所有设置之后都可以修改。`,cancel:`取消`,create:`创建`,delete:`删除`,deleteViewTitle:`删除视图`,deleteViewConfirm:`确定要删除视图 "{{name}}" 吗?此操作无法撤销。`,bulkDeleteConfirm:`确定要删除选中的 {{count}} 条记录吗?此操作无法撤销。`,duplicateViewName:`已存在同名视图。`,viewTypeGrid:`表格`,viewTypeGridDesc:`电子表格风格的记录表格。`,viewTypeKanban:`看板`,viewTypeKanbanDesc:`按单选字段分列的卡片视图。`,viewTypeCalendar:`日历`,viewTypeCalendarDesc:`按日期把记录放到月历上。`,viewTypeGallery:`画廊`,viewTypeGalleryDesc:`由附件字段驱动的大图卡片。`,viewTypeTimeline:`时间线`,viewTypeTimelineDesc:`记录按横向时间轴展开。`,viewTypeGantt:`甘特图`,viewTypeGanttDesc:`展示项目起止时间和依赖。`,viewTypeMap:`地图`,viewTypeMapDesc:`根据经纬度字段显示地理标记。`,viewTypeChart:`图表`,viewTypeChartDesc:`聚合的柱状/折线/饼状图。`,newView:`新视图`,typeOptions:`类型选项`,groupByField:`分组字段`,groupByFieldHelp:`看板会按该字段的不同取值分列。`,startDateField:`开始日期字段`,startDateFieldHelp:`日历将按该日期把记录放到对应日期格。`,ganttStartDateFieldHelp:`甘特条形图的左端使用该日期。`,ganttEndDateFieldHelp:`甘特条形图的右端使用该日期。`,timelineDateFieldHelp:`记录在时间轴上按该日期定位。`,titleField:`标题字段`,latitudeField:`纬度字段`,latitudeFieldHelp:`提供纬度坐标的字段(仅地理坐标字段可选)。`,longitudeField:`经度字段`,longitudeFieldHelp:`提供经度坐标的字段(仅地理坐标字段可选)。`,imageField:`图片字段`,imageFieldHelp:`画廊封面来自该图片或附件字段。`,dateField:`日期字段`,selectField:`选择字段...`,selectOption:`选择...`,noEligibleFieldForType:`没有符合条件的字段。请先在对象上添加该类型字段。`,viewTypeUnavailable:`该对象缺少所需的“{{field}}”字段。`,viewTypeUnavailableShort:`当前对象不支持。`,chartType:`图表类型`,chartTypeHelp:`决定数据如何呈现。`,chartTypeBar:`柱状图`,chartTypeLine:`折线图`,chartTypePie:`饼图`,chartTypeArea:`面积图`,chartTypeScatter:`散点图`,xAxisField:`X 轴字段`,xAxisFieldHelp:`用于分类或时间维度的字段。`,yAxisField:`Y 轴字段`,yAxisFieldHelp:`用于数值聚合的字段。`,gridOptionsHint:`网格视图使用上方配置的列。`,groupBy:`分组依据`,prefixField:`前缀字段`,fields:`字段`,fieldsVisible:`{{count}} 个可见`,sortsCount:`{{count}} 个排序`,filtersCount:`{{count}} 个筛选`,endDateField:`结束日期字段`,color:`颜色`,fieldTextColor:`字段文字颜色`,rowHeight:`行高`,wrapHeaders:`自动换行标题`,showFieldDescriptions:`显示字段描述`,collapseAllByDefault:`默认全部折叠`,striped:`斑马纹行`,bordered:`边框单元格`,inlineEdit:`内联编辑记录`,addDeleteRecordsInline:`内联添加/删除记录`,clickIntoRecordDetails:`点击进入记录详情`,navigationMode:`导航模式`,navigationWidth:`导航宽度`,navigationWidthHint:`适用于抽屉、弹窗和分屏导航模式`,openNewTab:`在新标签页打开`,openNewTabHint:`适用于页面和新窗口导航模式`,selectionMode:`选择模式`,selectionNone:`无`,selectionSingle:`单选`,selectionMultiple:`多选`,pageSize:`每页记录数`,pageSizeOptions:`每页选项`,exportFormats:`导出格式`,exportMaxRecords:`最大记录数`,exportIncludeHeaders:`包含表头`,exportFileNamePrefix:`文件名前缀`,searchableFields:`可搜索字段`,filterableFields:`可筛选字段`,resizableColumns:`可调整列宽`,densityCompact:`紧凑`,densityComfortable:`舒适`,densitySpacious:`宽松`,densityMode:`密度模式`,hiddenFields:`隐藏字段`,rowActions:`行操作`,bulkActions:`批量操作`,sharing:`共享`,sharingEnabled:`启用共享`,sharingVisibility:`可见性`,addRecordEnabled:`启用添加记录`,addRecordPosition:`位置`,addRecordMode:`模式`,addRecordFormView:`表单视图`,conditionalFormatting:`条件格式`,addRule:`添加规则`,quickFilters:`快速筛选`,addQuickFilter:`添加快速筛选`,ufElements:`元素类型`,ufDropdown:`下拉菜单`,ufTabs:`标签页`,ufToggle:`开关`,ufAddField:`+ 添加筛选字段...`,ufNoFields:`无可用字段`,ufAddTab:`+ 添加标签页`,ufTabLabel:`标签`,ufShowAllRecords:`显示"全部记录"标签页`,ufAllowAddTab:`允许添加标签页`,showRecordCount:`显示记录计数`,allowPrinting:`允许打印`,virtualScroll:`虚拟滚动`,emptyStateTitle:`空状态标题`,emptyStateMessage:`空状态消息`,emptyStateIcon:`空状态图标`,ariaLabel:`ARIA 标签`,ariaDescribedBy:`ARIA 描述`,ariaLive:`ARIA 实时区域`,accessibility:`无障碍`,viewTabs:`视图标签`},localeSwitcher:{label:`语言`}},auth:{login:{title:`登录您的账户`,description:`输入您的邮箱和密码以继续`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,passwordLabel:`密码`,passwordPlaceholder:`输入您的密码`,forgotPasswordText:`忘记密码?`,submitButton:`登录`,submittingButton:`登录中...`,noAccountText:`还没有账户?`,signUpText:`注册`,signingIn:`正在登录…`,ssoHandoff:`继续前往 {{target}}`,errors:{invalidCredentials:`邮箱或密码错误,请重试。`,emailNotVerified:`请先验证您的邮箱后再登录。`}},register:{title:`创建账户`,description:`输入您的信息以开始使用`,nameLabel:`姓名`,namePlaceholder:`张三`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,passwordLabel:`密码`,passwordPlaceholder:`创建密码(至少8个字符)`,confirmPasswordLabel:`确认密码`,confirmPasswordPlaceholder:`确认您的密码`,passwordMismatchError:`两次输入的密码不一致`,passwordTooShortError:`密码至少需要8个字符`,submitButton:`创建账户`,submittingButton:`创建中...`,hasAccountText:`已有账户?`,signInText:`登录`,errors:{userExists:`该邮箱已被注册,请直接登录或更换邮箱。`},verifyInbox:{title:`请检查您的邮箱`,description:`我们已向 {{email}} 发送了一封验证邮件,请点击邮件中的链接激活账户。`,resend:`重新发送验证邮件`,resending:`发送中…`,resent:`验证邮件已发送。`,backToSignIn:`返回登录`}},forgotPassword:{title:`重置密码`,description:`输入您的邮箱地址,我们将发送重置密码链接`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,submitButton:`发送重置链接`,submittingButton:`发送中...`,successTitle:`请查看您的邮箱`,successDescription:`我们已将密码重置链接发送至 {{email}},请检查您的收件箱。`,backToSignInText:`返回登录`,rememberPasswordText:`记住密码了?`,signInText:`登录`},setPassword:{title:`设置一个备用密码`,description:`您是通过单点登录进入的。设置一个本地密码,这样即使单点登录不可用,您仍能直接登录此环境。`,email:`邮箱`,newPassword:`新密码`,confirmPassword:`确认密码`,submit:`设置密码`,submitting:`保存中…`,success:`本地密码已设置`,failed:`无法设置密码`,passwordsMismatch:`两次输入的密码不一致`,noSession:`您的会话已过期。`,backToSignIn:`重新登录`},resetPassword:{title:`设置新密码`,description:`请选择一个您未使用过的密码。`,newPassword:`新密码`,confirmPassword:`确认密码`,submit:`更新密码`,submitting:`更新中…`,success:`密码已更新`,failed:`重置失败`,invalidToken:`此重置链接无效或已过期。`,missingToken:`重置链接缺失或已过期`,passwordsMismatch:`两次输入的密码不一致`,requestNewLink:`获取新链接`},verifyEmail:{title:`验证您的邮箱地址`,description:`我们已向您的邮箱发送了一封验证邮件,请点击邮件中的链接以验证您的账户。`,sentTo:`发送至:`,verifyingTitle:`验证中…`,verifyingDescription:`正在确认您的邮箱,请稍候。`,successTitle:`邮箱已验证`,successDescription:`您的邮箱已确认,现在可以登录了。`,errorTitle:`验证失败`,errorDescription:`验证失败,请重新获取验证链接。`,missingToken:`验证链接缺少令牌。`,emailMissing:`缺少邮箱地址`,resendButton:`重新发送验证邮件`,resending:`发送中…`,resent:`邮件已发送!请查看收件箱`,resentSuccess:`验证邮件已发送!`,resentDescription:`请查看收件箱并点击验证链接。`,resendFailed:`无法重新发送验证邮件`,signInLink:`前往登录`,backToSignIn:`返回登录`,backToLogin:`返回登录`,checkSpam:`没有收到邮件?请检查垃圾邮件文件夹或联系支持。`,or:`或`},setup:{welcomeTitle:`欢迎使用 ObjectStack`,description:`创建第一个所有者账户以完成本次部署的初始化。`,yourName:`您的姓名`,orgName:`组织名称`,orgNamePlaceholder:`Acme Inc.`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,passwordLabel:`密码`,passwordHint:`至少 8 个字符`,submit:`创建所有者账户`,submitting:`设置中…`,failed:`设置失败`},device:{title:`授权新设备`,subtitle:`批准此设备以 {{email}} 的身份登录。`,userCodeLabel:`设备代码`,requesterLabel:`连接请求来自`,approveWarning:`仅当这是你刚刚自己发起的连接时才批准。批准后,该运行时将能访问你所在组织的私有软件包。`,loggedInAs:`已以 {{email}} 身份登录`,approve:`批准设备`,approving:`批准中…`,approvedTitle:`设备已授权`,approvedDescription:`您可以返回该设备,它应该很快就会登录。`,approveSuccess:`设备已授权`,approveSuccessDescription:`您可以关闭此窗口。`,approveFailed:`批准失败`,deny:`拒绝请求`,denying:`拒绝中…`,deniedTitle:`访问被拒绝`,deniedDescription:`该设备将不会被授予访问权限。`,denyFailed:`拒绝请求失败`,invalidTitle:`无效的设备链接`,invalidDescription:`URL 中未提供设备代码。`,loading:`加载中…`,cancel:`取消`},shell:{tenantHostHint:`您正在登录此工作区`}},errors:{networkError:`网络错误,请检查网络连接。`,serverError:`服务器错误,请稍后重试。`,notFound:`资源未找到。`,unauthorized:`您没有权限执行此操作。`,forbidden:`访问被拒绝。`,timeout:`请求超时,请重试。`,unknown:`发生未知错误。`},workspace:{label:`工作区`,default:`我的工作区`,switch:`切换工作区`,create:`创建工作区`,createTitle:`创建工作区`,createDescription:`工作区是团队协作的共享空间。`,createButton:`创建工作区`,nameLabel:`工作区名称`,namePlaceholder:`例如:极客科技`,slugLabel:`URL 标识`,slugHint:`用于 URL 中,仅支持小写字母、数字和连字符。`,invite:`邀请成员`,members:`成员`,settings:`工作区设置`},help:{onThisPage:`本页目录`,appDocs:`本应用文档`,allDocs:`全部文档`,onlineDocs:`在线文档`},sidebar:{settings:`设置`,help:`帮助`,helpTooltip:`帮助与文档`,activityFeed:`活动动态`,notifications:`通知`,approvals:`审批`,inbox:`消息中心`,inboxAriaLabel:`打开消息中心`,area:`区域`,scope:`范围`,packageManagement:`软件包管理`,searchNavigation:`搜索导航...`,recent:`最近使用`,favorites:`收藏`,starred:`已收藏`,removeFromFavorites:`从收藏中移除 {{name}}`},topbar:{aiAssistant:`AI 助手`,openAssistant:`打开{{name}}助手`,offline:`离线`,usersOnline:`当前在线用户`,switchView:`切换视图`,connection:{connected:`已连接`,connecting:`连接中...`,reconnecting:`正在重新连接...`,disconnected:`已断开连接`,error:`连接错误`}},home:{title:`首页`,subtitle:`您的工作区仪表盘`,nav:`首页`,allApps:`全部应用`,greetingMorning:`早上好`,greetingAfternoon:`下午好`,greetingEvening:`晚上好`,greetingNight:`夜深了`,heroTagline:`从上次离开的地方继续,或者探索新的内容。`,open:`打开`,stats:{apps:`应用`,starred:`收藏`,recent:`最近访问`},loading:`正在加载工作区...`,recent:`最近使用`,starred:`收藏`,welcome:`用 AI 搭建你的业务系统`,welcomeDescription:`用一句话描述你的业务,AI 帮你生成对象、界面、API 和 agent 工具。也可以手动从零开始。`,welcomeAdminDescription:`用一句话描述你的业务,AI 会为你生成对象、界面、API 和智能体工具;也可以从左侧菜单自行搭建。`,welcomeAdminDescriptionNoBuild:`从左侧的「管理」菜单创建你的第一个应用。有了数据后,AI 助手可以帮你查询和分析。`,welcomeAdminDescriptionNoAi:`从左侧的「管理」菜单创建你的第一个应用。`,noAppsTitle:`还没有应用`,noAppsDescription:`当前还没有可用的应用。请联系你的工作区管理员。`,buildWithAI:`用 AI 搭建`,askAI:`问 AI`,recoveryReminder:{message:`建议设置一个备用密码,这样即使单点登录不可用,你仍能直接登录此环境。`,cta:`设置密码`,dismiss:`关闭`},pendingDrafts:{message:`你有 {{count}} 项未发布的更改 —— 点击发布即可生效。`,cta:`发布`,publishing:`发布中…`,published:`已发布!更改已生效。`,publishFailed:`发布失败`},createFirstApp:`手动创建应用`,systemSettings:`系统设置`,browseMarketplace:`浏览应用市场`,quickActions:{title:`快捷操作`,createApp:`创建应用`,createAppDesc:`从新应用开始`,manageObjects:`管理对象`,manageObjectsDesc:`配置数据模型`,systemSettings:`系统设置`,systemSettingsDesc:`配置您的工作区`},recentApps:{title:`最近访问`,itemType:{object:`对象`,dashboard:`仪表盘`,page:`页面`,record:`记录`}},starredApps:{title:`收藏`},gettingStarted:{title:`把首页布置成你喜欢的样子`,description:`收藏一个应用即可固定到此处,一键直达。打开过的内容会自动出现在「最近访问」中。`,cta:`浏览全部应用`},appCard:{noDescription:`暂无描述`,default:`默认`}},layout:{appSwitcher:{home:`首页`,switchApplication:`切换应用`,appsAvailable:`共 {{count}} 个可用应用`,addApp:`新增应用`,editApp:`编辑应用`,manageAllApps:`管理所有应用`,systemConsole:`系统控制台`,noAppsConfigured:`尚未配置任何应用`},systemNav:{systemSettings:`系统设置`,applications:`应用`,appMarketplace:`应用市场`,objectManager:`对象管理器`,users:`用户`,organizations:`组织`,roles:`角色`,configuration:`配置`,createApp:`创建应用`},activityFeed:{title:`最近动态`,filter:`筛选`,empty:`暂无最近动态`,viewAll:`查看全部动态`,ariaLabel:`动态消息`,typeCreate:`创建`,typeUpdate:`更新`,typeDelete:`删除`,typeComment:`评论`,relativeJustNow:`刚刚`,relativeSecondsAgo:`{{count}} 秒前`,relativeMinutesAgo:`{{count}} 分钟前`,relativeHoursAgo:`{{count}} 小时前`,relativeDaysAgo:`{{count}} 天前`},metadata:{label:`元数据`,toggleTitle:`切换元数据检视器`,panelTitle:`元数据检视器`,jsonBadge:`JSON`,copyJson:`复制 JSON`}},search:{title:`搜索`,back:`返回`,placeholder:`搜索对象、仪表板、页面、报表…`,inputAriaLabel:`搜索对象、仪表板、页面、报表`,resultsCount:`找到 {{count}} 条与“{{query}}”相关的结果`,resultsCountPlural:`找到 {{count}} 条与“{{query}}”相关的结果`,itemsAvailable:`共 {{count}} 项可搜索`,noResults:`未找到结果`,noResultsHint:`请尝试调整搜索关键字`,typeObjects:`对象`,typeDashboards:`仪表板`,typePages:`页面`,typeReports:`报表`,badgeObject:`对象`,badgeDashboard:`仪表板`,badgePage:`页面`,badgeReport:`报表`},empty:{objectNotFound:`未找到对象`,objectNotFoundDescription:`对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。`,recordNotFound:`未找到记录`,recordNotFoundDescription:`您查找的记录不存在或已被删除。`,pageNotFound:`未找到页面`,pageNotFoundDescription:`未找到页面 “{{name}}”,可能已被删除或重命名。`,dashboardNotFound:`未找到仪表板`,dashboardNotFoundDescription:`未找到仪表板 “{{name}}”,可能已被删除或重命名。`,reportNotFound:`未找到报表`,reportNotFoundDescription:`未找到报表 “{{name}}”,可能已被删除或重命名。`,noAppsConfigured:`尚未配置应用`,noAppsConfiguredDescription:`当前没有任何已注册的应用。请创建您的第一个应用,或前往系统设置进行配置。`,createFirstApp:`创建您的第一个应用`,systemSettings:`系统设置`,back:`返回`},preview:{empty:{loadFailedTitle:`草稿预览加载失败`,loadFailedDescription:`无法读取草稿数据。请重试,或检查网络连接。`,notReadyTitle:`“{{app}}” 尚未进入草稿`,notReadyDescription:`构建可能仍在进行,或在该应用落稿前失败了。请回到对话查看构建状态 —— 草稿就绪后此窗口会自动刷新。`,nothingTitle:`暂无可预览的内容`,retry:`重试`},draftBar:{message:`草稿预览 —— 您看到的是未发布的更改,发布前不会生效。`,publish:`发布`,publishing:`发布中…`,exit:`退出预览`,changes:`变更`},changes:{title:`待发布的变更`,description:`发布将带来以下变更。“新增”为全新内容,“更新”将覆盖线上版本。`,loading:`正在加载待发布变更…`,loadFailed:`无法加载待发布变更:`,empty:`没有待发布的内容 —— 所有草稿均已发布。`,kindNew:`新增`,kindUpdate:`更新`}},renderer:{noPageSchema:`未提供页面 schema`,noFormSchema:`未提供表单 schema`,noDashboardSchema:`未提供仪表板 schema`,pageRendering:`页面渲染中:{{name}}`,dashboardRendering:`仪表板渲染中:{{name}}`,formRenderingMode:`正在以 {{mode}} 模式渲染表单`,formRenderingFor:`记录 {{id}}`,createRecord:`新建记录`,editRecord:`编辑记录`,page:`页面`,dashboard:`仪表板`,save:`保存`,cancel:`取消`},actionDialog:{title:`操作参数`,description:`请填写以下信息以继续操作。`,selectPlaceholder:`请选择 {{label}}`,requiredError:`{{label}} 为必填项`,lookupPlaceholder:`粘贴 {{label}} 的记录 ID(UUID)`,lookupHelpText:`请输入引用记录的 ID。可视化选择器即将上线。`,cancel:`取消`,confirm:`确认`,defaultActionTitle:`操作`,ok:`确定`},actionConfirm:{title:`确认操作`,confirm:`继续`,cancel:`取消`},rowAction:{openMenu:`更多操作`,edit:`编辑`,delete:`删除`},navigationSync:{addedPage:`导航已更新:已添加页面 “{{name}}”`,addedDashboard:`导航已更新:已添加仪表板 “{{name}}”`,removedPage:`导航已更新:已移除页面 “{{name}}”`,removedDashboard:`导航已更新:已移除仪表板 “{{name}}”`,renamedPage:`导航已更新:页面 “{{oldName}}” 已重命名为 “{{newName}}”`,renamedDashboard:`导航已更新:仪表板 “{{oldName}}” 已重命名为 “{{newName}}”`,undoLabel:`撤销`,undone:`已撤销导航变更`,undoFailed:`撤销导航变更失败`,updateFailed:`更新导航失败`},objectActions:{deleteSuccess:`{{label}} 删除成功`,deleteFailed:`删除 {{label}} 失败`,noRecordId:`未提供记录 ID`,deleteConfirm:`确定要删除此记录吗?`,bulkDeleteSuccess:`已删除 {{count}} 条 {{label}} 记录`,bulkDeletePartial:`成功 {{succeeded}} 条,失败 {{failed}} 条`},objectViewActions:{renameFailed:`重命名视图失败`,deleteFailed:`删除视图失败`},dashboardActions:{pdfPreparing:`正在准备 PDF 导出…`,exportFailed:`导出失败:{{message}}`,forecastSoon:`预测视图即将上线`},recordDetail:{viewersTooltip:`正在查看此记录的用户`},cellRender:{empty:`空`,yes:`是`,no:`否`,systemFields:`系统字段`},user:{profile:`个人资料`,settings:`设置`,logout:`注销`,preferences:`偏好设置`,theme:`主题`,language:`语言`},organizations:{mine:`我的组织`,title:`组织`,heading:`您的组织`,subtitle:`选择一个组织以继续,或新建一个组织。`,searchPlaceholder:`搜索组织`,new:`新建组织`,current:`当前组织`,manage:`管理`,emptyTitle:`尚无组织`,emptyDescription:`创建您的第一个组织以开始使用。`,noMatches:`没有匹配的组织。`},notifications:{regionLabel:`通知`,empty:`暂无通知`,emptyUnread:`已读完所有通知`,filterUnread:`未读`,filterAll:`全部`,markAllRead:`全部标记为已读`,viewAll:`查看全部通知`,approvalsPending:`{{count}} 条待审批`,viewApprovals:`查看审批`,noPendingApprovals:`暂无待审批事项`,openApprovalsInbox:`打开审批中心`},publicForm:{submit:`提交`,submitting:`提交中…`,submitAnother:`再填一份`,poweredBy:`由 ObjectStack 提供技术支持`,secureNotice:`您的信息将通过安全通道传输,仅用于回复您本次请求。`,thankYouTitle:`感谢您的提交!`,thankYouMessage:`我们已成功收到您的信息。`,redirecting:`将在 {{seconds}} 秒后跳转…`,unavailableTitle:`表单不可用`,unavailableDescription:`该链接当前没有可用的公开表单。请确认对应视图已启用匿名分享并匹配此 slug。`,tryDemo:`试用演示`,retry:`重试`,loading:`正在加载表单…`,requiredHint:`* 为必填项`,consentLabelDefault:`我已阅读并同意隐私政策,授权对本次请求所提供的信息进行处理。`,consentLink:`隐私政策`,consentRequired:`请先勾选同意隐私政策。`,rateLimited:`请再花点时间核对一下您的填写内容,再点击提交。`,redirectBlocked:`提交成功,但出于安全考虑,跳转链接已被阻止。`,demo:{contactTitle:`联系我们`,contactDescription:`告诉我们您的项目需求,销售代表将在一个工作日内与您联系。`,supportTitle:`提交支持请求`,supportDescription:`描述您遇到的问题,我们的团队会在一个工作日内回复。`,thankYouSalesTitle:`已收到您的信息,感谢联系!`,thankYouSalesMessage:`我们的销售代表将在一个工作日内与您取得联系。`,thankYouSupportTitle:`您的请求已进入处理队列。`,thankYouSupportMessage:`支持工程师将尽快跟进。如需补充截图,请保留此页面。`,field:{firstName:`名字`,lastName:`姓氏`,email:`工作邮箱`,phone:`电话`,jobTitle:`职位`,company:`公司`,website:`官网`,industry:`行业`,companySize:`公司规模`,howCanWeHelp:`我们可以为您做些什么?`,subject:`主题`,description:`问题描述`,issueType:`问题类型`,priority:`优先级`},industry:{technology:`科技`,software:`软件 / SaaS`,finance:`金融`,healthcare:`医疗健康`,retail:`零售`,other:`其他`},issueType:{question:`咨询`,problem:`问题`,bug:`缺陷`,feature_request:`功能建议`},priority:{low:`低`,medium:`中`,high:`高`,critical:`紧急`}}},marketplace:{title:`应用市场`,subtitle:`浏览已通过审核、发布到 ObjectStack 目录中的应用。点击应用查看详情并安装到你的某个环境中。`,searchPlaceholder:`按名称或 manifest ID 搜索应用…`,searchAria:`搜索市场应用`,installed:`已安装`,installedCount:`已安装({{count}})`,refresh:`刷新`,all:`全部`,noApprovedYet:`应用市场暂无已通过审核的应用。`,noMatchFilters:`没有应用匹配当前筛选条件。`,noDescription:`未提供描述。`,back:`返回应用市场`,installedTitle:`已安装的应用`,installedSubtitle:`当前已安装到本运行时内核的应用市场软件包。缓存的清单文件位于 <code>.objectstack/installed-packages/</code>,重启后仍然保留。`,installedEmpty:`本运行时尚未安装任何应用市场应用。`,browseLink:`去应用市场看看 →`,installedAdditiveNote:`<strong>说明:</strong>内核 API 仅支持新增 — 卸载会移除磁盘上的清单,下次启动时不再加载;但运行中的内核仍会保留该应用,直到下次重启运行时才会真正卸载。`,installedAt:`安装于 {{when}}`,installedBy:`由 {{user}}`,installedPackageId:`包`,cachedAs:`缓存为 <code>{{path}}</code>`,versionBadge:`v{{version}}`,installedBadge:`已安装 v{{version}}`,load:{failed:`应用市场加载失败`,failedHint:`本运行时默认指向公共 ObjectStack 云端。请检查运行时是否在线,或通过 <code>OS_CLOUD_URL</code> 指向自托管控制面。`,packageFailed:`应用加载失败`,notFound:`未找到。`},detail:{homepage:`主页`,installedV:`已安装 · v{{version}}`,about:`简介`,noReadme:`未提供 README。`,versions:`版本`,noApprovedVersions:`暂无已审核版本。`,prerelease:`预发布`,moreOptions:`更多安装选项`,uninstallFromRuntime:`从本运行时卸载`,addSampleData:`添加示例数据`,reseedAgain:`重新加载示例数据`,purgeSampleData:`清除示例数据`,purgeConfirm:`删除此应用预置的所有示例记录?用户自行添加的记录不会被删除。`,purgeSuccess:`已删除 {{count}} 条示例记录。`,purgeNoData:`没有可清除的示例记录。`,reseedQueued:`示例数据将在下次访问该环境时重新加载。`,reseedLocalSuccess:`已重新加载示例数据:新增 {{inserted}} 条,更新 {{updated}} 条。`,reseedPartialErrors:`(有 {{count}} 条记录写入失败)`,updateAvailable:`有可用更新`},action:{install:`安装`,reinstall:`重新安装`,working:`处理中…`,installToCloud:`安装到云端…`,installed:`已安装`,installing:`安装中…`,uninstall:`卸载`,uninstalling:`卸载中…`,details:`详情`,close:`关闭`,dismiss:`关闭`,openOnCloud:`在云端打开`,backHome:`返回首页`},install:{dialogTitle:`安装 {{name}}`,dialogDescCurrent:`安装到当前环境({{host}})。`,dialogDescPicker:`选择要将此应用安装到的环境。需要先登录 ObjectStack Cloud。`,environment:`环境`,environmentPlaceholder:`选择一个环境`,includeSampleData:`包含示例数据`,noEnvs:`当前组织没有可用的环境。`,noPermission:`你没有权限在任何环境中安装应用。仅组织所有者和管理员可以安装 — 请联系你的工作区管理员。`,signInFirst:`请先登录 ObjectStack Cloud,然后点击下方"在云端打开"。`,success:`安装成功。打开环境即可看到新应用。`,localSuccess:`已将 v{{version}} 安装到本运行时。"{{name}}" 应该已经出现在应用切换器中。`,localManifestConflict:`{{message}}
|
|
7
|
+
The cached manifest will be removed. The app will remain loaded in the running kernel until the next restart.`,successInList:`Removed {{manifestId}}. Restart the runtime to fully unload it from the running kernel.`,successInDetail:`Removed cached manifest for {{manifestId}}. Restart the runtime to fully unload the app from the running kernel.`},accessDenied:{title:`App Marketplace is admin-only`,description:`You don't have permission to install apps in this environment. Ask an owner or admin of this organization for access.`},category:{crm:`CRM`,erp:`ERP`,hr:`Human Resources`,finance:`Finance`,project:`Project Management`,collaboration:`Collaboration`,analytics:`Analytics`,integration:`Integration`,automation:`Automation`,ai:`AI`,security:`Security`,"developer-tools":`Developer Tools`,"ui-theme":`UI Theme`,storage:`Storage`,other:`Other`},pricing:{free:`Free`,freemium:`Freemium`,paid:`Paid`,subscription:`Subscription`,"usage-based":`Usage-based`,"contact-sales":`Contact Sales`},relativeTime:{today:`today`,daysAgo:`{{count}}d ago`,monthsAgo:`{{count}}mo ago`,yearsAgo:`{{count}}y ago`}},approvalsInbox:{loadMore:`Load more`,loadingMore:`Loading…`,loadedOf:`Loaded {{loaded}} of {{total}}`,actEscalate:`SLA escalated`,systemSlaActor:`System (SLA)`,reassignBtn:`Reassign`,reassignTitle:`Hand this approval to someone else?`,reassignBody:`Your approver slot moves to the person you pick — they are notified and can act immediately.`,reassignTo:`New approver`,reassignToPlaceholder:`Pick a user or type an email / role:<name>`,reassignSuccess:`Handed to {{to}}`,requestInfoBtn:`Request info`,requestInfoTitle:`Ask the requester for more information?`,requestInfoBody:`The request stays pending; the requester is notified and can reply on the thread.`,requestInfoPlaceholder:`What do you need from the requester?`,requestInfoSent:`Sent back to the requester for more information`,remindBtn:`Send reminder`,remindSuccess:`Reminder sent to {{count}} approver(s)`,remindThrottled:`A reminder was sent recently — try again later.`,replyPlaceholder:`Reply on this request…`,slaRemaining:`SLA {{dur}} left`,slaOverdue:`SLA overdue {{dur}}`,actReassign:`Reassigned`,actRemind:`Reminder sent`,actRequestInfo:`Requested more info`,actComment:`Commented`,stepProgress:`Approval steps`,prevRequest:`Previous`,nextRequest:`Next`,positionOf:`{{index}} of {{total}}`,quickPhrase1:`Approved — meets requirements.`,quickPhrase2:`Approved with conditions — please monitor execution.`,quickPhrase3:`Please add supporting material and resubmit.`,title:`Approvals Inbox`,subtitle:`Review and act on approval requests.`,refresh:`Refresh`,tabMyPending:`My Pending`,tabSubmitted:`Submitted by me`,tabAll:`All`,searchPlaceholder:`Search record, process, requester…`,clearSearch:`Clear search`,statusFilter:`Status`,allStatuses:`All statuses`,processFilter:`Process`,allProcesses:`All processes`,objectFilter:`Object`,allObjects:`All objects`,filterCount:`{{shown}} of {{total}}`,selected:`selected`,actionableCount:`({{count}} actionable)`,selectAll:`Select all`,selectRow:`Select request`,colRequest:`Request`,colRecord:`Record`,colRequester:`Requester`,colStatus:`Status`,colWaiting:`Submitted`,colActions:`Actions`,statusPending:`Pending`,statusApproved:`Approved`,statusRejected:`Rejected`,statusRecalled:`Recalled`,statusReturned:`Returned for revision`,sendBackBtn:`Send back`,sendBackTitle:`Send this request back for revision?`,sendBackBody:`This round ends and the record unlocks so the requester can fix the data. When they resubmit, a fresh approval round opens for all approvers.`,sendBackPlaceholder:`What needs to be fixed before this can be approved?`,sendBackSuccess:`Sent back for revision — the requester can now edit and resubmit`,sendBackAutoRejected:`Revision limit reached — the request was auto-rejected`,actRevise:`Sent back for revision`,actResubmit:`Resubmitted`,roundChip:`Round {{n}}`,returnedHint:`An approver sent this back to you. The record is unlocked — fix the data, then resubmit to start a new approval round.`,resubmitBtn:`Resubmit`,resubmitting:`Resubmitting…`,resubmitSuccess:`Resubmitted — a new approval round has opened`,resubmitPlaceholder:`What did you change?`,editRecordBtn:`Edit record`,abandonTitle:`Abandon this revision?`,abandonBody:`This withdraws the request instead of resubmitting it. The approval ends here.`,emptyTitle:`No requests`,emptyPending:`You're all caught up — nothing is waiting on you.`,emptyOther:`Nothing here yet.`,emptyViewAll:`Browse all requests`,noMatches:`No matches for current filters.`,keyboardHint:`Keyboard: j/k move · Enter open · x select · a approve · r reject`,drawerTitle:`Approval Request`,submittedAgo:`Submitted {{when}}`,completedAt:`Completed {{when}}`,waitingOn:`Waiting on`,history:`Activity`,noActions:`No actions yet.`,actSubmit:`Submitted`,actApprove:`Approved`,actReject:`Rejected`,actRecall:`Recalled`,rawData:`Raw data (JSON)`,copy:`Copy`,copied:`Copied`,copyFailed:`Copy failed`,overrideActor:`Act as another identity (admin)`,actor:`Actor`,auto:`Auto`,overrideHint:`e.g. role:sales_manager. Leave blank to use the auto-detected identity.`,comment:`Comment (optional)`,approve:`Approve`,approving:`Approving…`,reject:`Reject`,rejecting:`Rejecting…`,recall:`Recall`,recalling:`Recalling…`,cancel:`Cancel`,clear:`Clear`,approveN:`Approve {{count}}`,rejectN:`Reject {{count}}`,bulkApproveTitle:`Approve {{count}} requests?`,bulkApproveBody:`Each request is approved with your identity and its flow continues down the approve branch.`,bulkRejectTitle:`Reject {{count}} requests?`,bulkRejectBody:`This rejects the selected requests and notifies their submitters.`,bulkApproved:`Approved {{count}} requests`,bulkRejected:`Rejected {{count}} requests`,bulkPartial:`{{ok}} succeeded, {{fail}} failed: {{which}}`,rejectOneTitle:`Reject "{{title}}"?`,rejectOneBody:`This rejects the request and notifies the submitter.`,rejectTitle:`Reject this request?`,rejectBody:`This marks the request as rejected and notifies the submitter.`,recallTitle:`Recall this request?`,recallBody:`This withdraws your request. Approvers can no longer act on it, and the record is unlocked.`,inlineApproved:`Approved "{{title}}"`,inlineRejected:`Rejected "{{title}}"`,approvedFinal:`Approved`,approvedWaiting:`Approved — waiting on the remaining approvers`,rejectedToast:`Rejected`,recalledToast:`Request recalled`,whyDisabled:`Only the assigned approvers can act on this request. It is waiting on: {{who}}.`,whyDisabledSubmitter:`You submitted this request, so you can recall it — but only the assigned approvers can approve or reject.`,noActor:`Cannot determine the acting identity`,actionFailed:`Action failed`,loadFailed:`Failed to load request`,recallUnavailable:`Recall is not available on this deployment.`,requestGone:`This request no longer exists. Refresh the list.`,notAllowed:`You are not allowed to perform this action.`,alreadyDecided:`This request was already decided. Refresh the list.`,justNow:`just now`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`},filterBuilder:{where:`Where`,and:`AND`,or:`OR`,clearAll:`Clear all`,selectField:`Select field`,operator:`Operator`,selectValue:`Select value`,value:`Value`,addFilter:`Add filter`,removeCondition:`Remove condition`,trueLabel:`True`,falseLabel:`False`,noResults:`No results`,searchField:`Search {{label}}…`,enterId:`Enter {{label}} id`,operators:{equals:`Equals`,notEquals:`Does not equal`,contains:`Contains`,notContains:`Does not contain`,isEmpty:`Is empty`,isNotEmpty:`Is not empty`,greaterThan:`Greater than`,lessThan:`Less than`,greaterOrEqual:`Greater than or equal`,lessOrEqual:`Less than or equal`,before:`Before`,after:`After`,between:`Between`,in:`In`,notIn:`Not in`}},sortBuilder:{sortBy:`Sort by`,thenBy:`Then by`,selectField:`Select field`,ascending:`A → Z`,descending:`Z → A`,addSort:`Add sort`,removeSort:`Remove sort`}},Xr={lookup:{recentlyUsed:`最近使用`,allResults:`全部结果`,loading:`加载中…`,noOptions:`未找到选项`,noRecords:`未找到记录`,createNew:`新建`,createNamed:`新建“{{name}}”`,showingResults:`显示 {{total}} 条结果中的 {{shown}} 条`,showAllResults:`查看全部结果({{count}})`,selectedBadge:`已选`,browseAll:`浏览全部记录`,remove:`移除 {{label}}`,selectFirst:`请先选择{{fields}}`,selectRecord:`选择记录`,recordCount:`{{count}} 条记录`,recordCountOne:`1 条记录`,pageOf:`第 {{current}}/{{total}} 页`,filters:`筛选`,clear:`清除`,yes:`是`,filterPlaceholder:`筛选{{label}}`,prevPage:`上一页`,nextPage:`下一页`,jumpToPage:`跳转到指定页`,retry:`重试`},common:{loading:`加载中...`,save:`保存`,cancel:`取消`,delete:`删除`,edit:`编辑`,create:`新建`,search:`搜索`,filter:`筛选`,reset:`重置`,confirm:`确认`,close:`关闭`,back:`返回`,next:`下一步`,previous:`上一步`,submit:`提交`,refresh:`刷新`,export:`导出`,import:`导入`,yes:`是`,no:`否`,ok:`确定`,actions:`操作`,more:`更多`,selectAll:`全选`,clearAll:`清除全部`,addToFavorites:`添加到收藏`,removeFromFavorites:`从收藏中移除`,noData:`暂无数据`,noResults:`未找到结果`,required:`必填`,optional:`选填`,selectOption:`请选择`,select:`选择...`,openChat:`打开聊天`,closeChat:`关闭聊天`,toggleSidebar:`切换侧边栏`,package:`软件包`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}}不能为空`,minLength:`{{field}}至少需要{{min}}个字符`,maxLength:`{{field}}最多{{max}}个字符`,min:`{{field}}不能小于{{min}}`,max:`{{field}}不能大于{{max}}`,email:`请输入有效的邮箱地址`,url:`请输入有效的URL`,pattern:`{{field}}格式不正确`,unique:`{{field}}必须唯一`,type:`{{field}}必须是有效的{{type}}`},form:{addItem:`添加项目`,removeItem:`移除项目`,fieldRequired:`此字段为必填项`,invalidFormat:`格式不正确`,saveSuccess:`保存成功`,saveError:`保存失败`,unsavedChanges:`您有未保存的更改,确定要离开吗?`,stepOf:`第{{current}}步,共{{total}}步`,createTitle:`新建{{object}}`,editTitle:`编辑{{object}}`,createDescription:`向数据库添加新的{{object}}。`,editDescription:`更新{{object}}的详情`,saveRecord:`保存`,create:`创建`,update:`更新`,createSuccess:`{{object}}创建成功`,updateSuccess:`{{object}}更新成功`,deleteSuccess:`{{object}}删除成功`},fields:{richText:{format:`格式: {{format}}`,basicEditorHint:`富文本编辑器(基础)`,placeholder:`请输入文字...`}},table:{rowsPerPage:`每页行数`,showing:`显示第{{from}}到{{to}}条,共{{total}}条`,noRows:`暂无数据`,sortAsc:`升序排列`,sortDesc:`降序排列`,filterColumn:`筛选{{column}}`,columns:`列`,exportCSV:`导出CSV`,exportExcel:`导出Excel`,selectRow:`选择行`,selectAllRows:`选择所有行`,expandRow:`展开行`,collapseRow:`折叠行`,hideColumn:`隐藏列`,freezeColumn:`冻结列`,unfreezeColumn:`取消冻结列`,pageInfo:`第 {{current}} 页,共 {{total}} 页`,totalRecords:`共 {{count}} 条`,noResults:`未找到结果`,noResultsHint:`请尝试调整筛选条件或搜索关键词。`,cancelAll:`全部取消`,saveAll:`全部保存 ({{count}})`,addRecord:`添加记录`,open:`打开`,search:`搜索...`,modified:`{{count}} 行已修改`,selected:`已选择 {{count}} 项`,edit:`编辑`,delete:`删除`},grid:{actions:`操作`,edit:`编辑`,delete:`删除`,export:`导出`,exportAs:`导出为 {{format}}`,loading:`加载数据中...`,errorLoading:`数据加载失败`,pullToRefresh:`下拉刷新`,refreshing:`刷新中…`,openRecord:`打开记录`,openMenu:`更多操作`,rowHeight:`行高: {{mode}}`,empty:`空`,yes:`是`,no:`否`,systemFields:`系统字段`,toolbar:{densityMode:`密度`,densityCompact:`紧凑`,densityComfortable:`舒适`,densitySpacious:`宽松`,densityCycleHint:`{{label}}(点击切换)`,densityCycleShortHint:`点击切换`},import:{title:`导入{{object}}`,stepUpload:`上传`,stepMapping:`字段映射`,stepPreview:`预览`,uploadDescription:`上传 CSV 文件以开始导入。`,mappingDescription:`将 CSV 列映射到对象字段。`,previewDescription:`导入前预览数据。`,dragDrop:`拖拽 CSV 文件到此处,或点击选择文件`,browseFiles:`选择文件`,onlyCsv:`仅支持 CSV 文件。`,fileNeedsHeader:`文件必须包含表头行和至少一行数据。`,mappingTemplate:`映射模板:`,chooseTemplate:`选择模板…`,noSavedTemplates:`暂无保存的模板`,noneOption:`— 无 —`,saveCurrent:`保存当前映射`,templateName:`模板名称`,save:`保存`,deleteTemplate:`删除模板`,csvColumn:`CSV 列`,mapsTo:`映射到`,status:`状态`,skipColumn:`跳过此列`,skip:`— 跳过 —`,mapped:`已映射`,skipped:`已跳过`,rowsWithErrors:`{{count}} 行有错误`,rowsCorrected:`已修正 {{count}} 行`,clickToFix:`— 点击高亮单元格可直接修改。`,showingRows:`显示第 {{shown}} 行,共 {{total}} 行`,importing:`导入中… {{progress}}%`,importComplete:`导入完成`,imported:`已导入 {{count}} 条`,skippedCount:`已跳过 {{count}} 条`,moreErrors:`…还有 {{count}} 个错误`,cancel:`取消`,back:`上一步`,next:`下一步`,close:`关闭`,importNRows:`导入 {{count}} 行`,importingProgress:`导入中…`,requiredMark:`*`,required:`必填`,invalidType:`{{type}} 格式无效`}},calendar:{today:`今天`,month:`月`,week:`周`,day:`日`,agenda:`日程`,allDay:`全天`,noEvents:`暂无事件`,newEvent:`新建事件`,moreEvents:`+{{count}} 更多`},list:{loading:`正在加载记录...`,recordCount:`{{count}} 条记录`,recordCountOne:`{{count}} 条记录`,addRecord:`添加记录`,tabs:`标签页`,allRecords:`全部记录`,search:`搜索`,filter:`筛选`,filterRecords:`筛选记录`,sort:`排序`,sortRecords:`排序记录`,group:`分组`,groupBy:`分组依据`,export:`导出`,exportAs:`导出为 {{format}}`,color:`颜色`,rowColor:`行颜色`,colorByField:`按字段着色`,clear:`清除`,none:`无`,hideFields:`隐藏字段`,noItems:`暂无数据`,noItemsMessage:`当前没有可显示的记录。请尝试调整筛选条件或新建一条数据。`,firstRunTitle:`这里还没有数据`,firstRunMessage:`创建第一条记录即可开始。`,noMatches:`没有匹配的记录`,noMatchesMessage:`没有符合当前筛选或搜索条件的记录,试试调整或清除它们。`,loadErrorTitle:`无法加载记录`,loadErrorMessage:`加载数据时出错。请检查网络连接后重试。`,retry:`重试`,managedBy:{system:{title:`这里还没有数据`,message:`当其来源操作运行时(例如提交审批、共享、邀请),记录会自动出现。请在来源记录上触发其中一个操作来创建数据。`},appendOnly:{title:`暂无事件记录`,message:`这是一份不可变更的审计日志。记录由平台在事件发生时写入——你可以导出历史,但无法在此处创建条目。`},betterAuth:{title:`暂无身份记录`,message:`身份记录由认证提供方管理。请使用专门的身份流程(邀请用户、重置密码……)来创建新条目。`}},showAll:`显示全部`,pullToRefresh:`下拉刷新`,refreshing:`刷新中…`,share:`分享`,print:`打印`,hideFieldsTitle:`隐藏字段`,dataLimitReached:`显示前 {{limit}} 条记录。可能有更多数据。`,viewSettings:`视图设置`,viewSettingsHint:`分组、行颜色、密度与可见字段。`,addGroup:`添加分组字段`,collapsedByDefault:`默认折叠`,removeGroup:`删除`},kanban:{addCard:`添加卡片`,addColumn:`添加列`,moveCard:`移动卡片`,deleteCard:`删除卡片`,deleteColumn:`删除列`,noCards:`暂无卡片`,cardTitlePlaceholder:`输入卡片标题...`},timeline:{bucket:{overdue:`已逾期`,today:`今天`,tomorrow:`明天`,thisWeek:`本周`,nextWeek:`下周`,later:`更晚`,noDate:`无日期`,unassigned:`未分配`}},gantt:{column:{taskName:`任务名称`,start:`开始`,end:`结束`},toolbar:{prevPeriod:`上一周期`,nextPeriod:`下一周期`,zoomIn:`放大`,zoomOut:`缩小`,jumpToToday:`跳到今天`,today:`今天`,thisWeek:`本周`,thisMonth:`本月`,showTaskList:`展开任务列表`,hideTaskList:`收起任务列表`,viewMode:`时间粒度`,enterFullscreen:`进入全屏`,exitFullscreen:`退出全屏`,criticalPath:`高亮关键路径`,autoSchedule:`自动排程依赖`,exportPng:`导出 PNG`,exportPdf:`导出 PDF`,saveLayout:`保存布局`,undo:`撤销`,redo:`重做`},viewMode:{day:`日`,week:`周`,month:`月`,quarter:`季度`,year:`年`},row:{expand:`展开`,collapse:`收起`,locate:`在甘特图上定位`},aria:{taskList:`任务列表`},tooltip:{days:`天`},menu:{view:`查看详情`,edit:`行内编辑`,delete:`删除`,addPredecessor:`添加前置任务…`,addSuccessor:`添加后置任务…`,removeDependency:`移除依赖`,noCandidates:`无可用任务`},linkType:{fs:`完成 → 开始`,ss:`开始 → 开始`,ff:`完成 → 完成`,sf:`开始 → 完成`},conflict:{title:`排程冲突`,body:`此次移动与依赖约束冲突。是否自动重新排程 {{count}} 个受影响的任务?`,confirm:`自动重新排程`,cancel:`保持不变`},resource:{header:`资源`,peak:`峰值`,over:`超载`,empty:`没有可分配的任务。`},readOnly:`只读`,readOnlyHint:`此视图已禁用编辑。`},view:{editViewConfig:`编辑视图配置`,rename:`重命名`,duplicateView:`复制视图`,shareView:`共享视图`,setAsDefault:`设为默认`,pinView:`固定视图`,unpinView:`取消固定`,changeViewType:`更改视图类型`,deleteView:`删除视图`,addView:`添加视图`,unsavedChanges:`未保存的更改`,saveAsView:`另存为视图`,moreViews:`还有 {{count}} 个`,activeFilters:`筛选条件生效中`,activeSort:`排序生效中`,manageViews:`管理视图`,manageAllViews:`管理所有视图…`,manageViewsDescription:`对该对象的所有视图进行重新排序、重命名、固定或删除。`,searchViews:`搜索视图`,addNewView:`新建视图`,done:`完成`,noViewsFound:`没有匹配的视图。`,dragToReorder:`拖动排序`,defaultView:`默认视图`,defaultBadge:`默认`,tabActionsFor:`{{name}} 的视图操作`,readonlyAriaLabel:`只读视图`,readonlyTooltip:`系统视图 — 由代码定义,只读。`},designer:{undo:`Undo`,redo:`Redo`},detail:{back:`返回`,edit:`编辑`,editInline:`编辑`,save:`保存`,saveChanges:`保存更改`,saving:`保存中…`,editFieldsInline:`编辑字段`,lockedByApproval:`审批中已锁定`,lockedTooltip:`该记录有待审批的请求,编辑已被锁定`,cancelApproval:`撤回审批`,cancelApprovalInFlight:`撤回中…`,cancelApprovalTooltip:`撤回当前的待审批请求以解除记录锁定`,cancelApprovalFailed:`撤回审批失败`,cancelApprovalUnavailable:`当前数据源不支持撤回审批`,linkCopied:`链接已复制到剪贴板`,linkCopyFailed:`复制链接失败`,cancel:`取消`,cancelEdit:`放弃更改`,sectionMoreDetails:`更多详情`,concurrentUpdateTitle:`该记录已被他人修改`,concurrentUpdateDescription:`在你编辑期间,另一位用户保存了 {{field}} 的新版本。为避免无声覆盖对方的改动,请选择如何处理该冲突。`,concurrentUpdateYourEdit:`你的修改`,concurrentUpdateCurrentValue:`当前值`,concurrentUpdateUpdatedBy:`由 {{name}} 更新`,concurrentUpdateUpdatedAt:`更新于 {{when}}`,concurrentUpdateReload:`加载最新`,concurrentUpdateOverwrite:`仍然覆盖`,concurrentUpdateCancel:`取消`,openInNewTab:`在新标签页打开`,share:`分享`,duplicate:`复制`,export:`导出`,viewHistory:`查看历史`,delete:`删除`,moreActions:`更多操作`,addToFavorites:`添加到收藏`,removeFromFavorites:`从收藏中移除`,previousRecord:`上一条记录`,nextRecord:`下一条记录`,recordOf:`第 {{current}} 条,共 {{total}} 条`,recordNotFound:`未找到记录`,recordNotFoundDescription:`您查找的记录不存在或已被删除。`,goBack:`返回`,details:`详情`,related:`相关`,relatedRecords:`{{count}} 条记录`,relatedRecordOne:`{{count}} 条记录`,noRelatedRecords:`暂无相关记录`,loading:`加载中...`,copyToClipboard:`复制到剪贴板`,copied:`已复制!`,deleteConfirmation:`确定要删除此记录吗?`,editRecord:`编辑记录`,viewAll:`查看全部`,new:`新建`,emptyValue:`—`,activity:`活动`,history:`历史`,editRow:`编辑`,deleteRow:`删除`,deleteRowConfirmation:`确定要删除此记录吗?`,deleteRowTitle:`删除记录`,actions:`操作`,previousPage:`上一页`,nextPage:`下一页`,pageOf:`第 {{current}} 页,共 {{total}} 页`,sortBy:`排序`,filterPlaceholder:`筛选...`,highlightFields:`关键字段`,comments:`评论`,searchComments:`搜索评论…`,addCommentPlaceholder:`添加评论… (Ctrl+Enter 提交)`,noMatchingComments:`没有匹配的评论`,noCommentsYet:`暂无评论`,pinned:`已置顶`,pin:`置顶`,unpin:`取消置顶`,justNow:`刚刚`,minutesAgo:`{{count}}分钟前`,hoursAgo:`{{count}}小时前`,daysAgo:`{{count}}天前`,systemActor:`系统`,unknownUser:`未知用户`,createdBy:`创建于`,updatedBy:`更新于`,dropFilesToUpload:`拖拽文件到此处或点击上传`,attachmentCount:`{{count}} 个附件`,attachmentCountPlural:`{{count}} 个附件`,removeAttachment:`移除附件`,unifiedDiff:`统一视图`,sideBySideDiff:`并排视图`,noChanges:`无变更`,previousVersion:`旧版本`,currentVersion:`新版本`,discussion:`讨论`,showDiscussion:`显示讨论 ({{count}})`,hideDiscussion:`隐藏讨论`,bold:`粗体 (Ctrl+B)`,italic:`斜体 (Ctrl+I)`,listFormat:`列表`,inlineCode:`行内代码`,mentionSomeone:`提及某人`,preview:`预览`,submitComment:`提交 (Ctrl+Enter)`,sendComment:`发送`,writeComment:`写评论…`,subscribedTooltip:`已订阅 — 点击取消订阅`,unsubscribedTooltip:`订阅通知`,firstRecord:`第一条记录 (Home)`,previousRecordKey:`上一条记录 (←)`,nextRecordKey:`下一条记录 (→)`,lastRecord:`最后一条记录 (End)`,noRecords:`无记录`,showEmptyRelated_one:`+ {{count}} 个为空`,showEmptyRelated_other:`+ {{count}} 个为空`,searchWhileNavigating:`导航时搜索`,searchRecords:`搜索记录…`,allActivity:`全部动态`,commentsOnly:`仅评论`,fieldChangesFilter:`字段变更`,tasksOnly:`仅任务`,leaveCommentPlaceholder:`留下评论… (Ctrl+Enter 提交)`,noActivity:`暂无活动记录`,loadMore:`加载更多`,edited:`(已编辑)`,via:`通过 {{source}}`,replyCount:`{{count}} 条回复`,replyCountPlural:`{{count}} 条回复`,replyPlaceholder:`回复…`,filterActivity:`筛选活动`,openDiscussion:`打开讨论面板`,closeDiscussion:`关闭讨论面板`,subscribeAriaLabel:`订阅通知`,unsubscribeAriaLabel:`取消订阅通知`,clearSearch:`清除搜索`,copyEmail:`复制邮箱`,copyPhone:`复制电话号码`,copyRecordId:`复制记录 ID`,showEmptyFields:`显示 {{count}} 个空字段`,hideEmptyFields:`隐藏空字段`,noValue:`无`},chart:{noData:`暂无图表数据`,loading:`图表加载中...`},report:{total:`总计`,rowTotal:`行合计`,columnTotal:`列合计`,grandTotal:`总计`,totals:`汇总`,rowsLabel:`行`,columnsLabel:`列`,allLabel:`(全部)`,emptyLabel:`(空)`,loading:`加载中…`,failedToLoad:`矩阵报表加载失败:{{message}}`,needsAcross:"矩阵报表至少需要一个 `groupingsAcross` 字段。",aggregate:{count:`计数`,countDistinct:`去重计数`,sum:`求和`,avg:`平均`,min:`最小值`,max:`最大值`,first:`首个`},editor:{breadcrumb:`配置`,basic:`基础`,title:`标题`,titlePlaceholder:`例如:按季度的销售管道`,description:`描述`,descriptionPlaceholder:`此报表展示什么?`,type:`报表类型`,typeTabular:`表格 — 平铺列表`,typeSummary:`汇总 — 分组带合计`,typeMatrix:`矩阵 — 行列透视`,typeJoined:`拼接 — 多块组合`,typeHelp:`选择最贴合需求的布局方式。`,data:`数据`,objectName:`数据源`,objectNamePlaceholder:`例如:opportunity`,objectNameHelp:`此报表应查询哪个对象?`,limit:`行数上限`,limitPlaceholder:`例如:100`,columns:`列`,columnsHint:`选择要展示的字段。汇总或矩阵报表可添加聚合(求和、计数…)。`,filters:`筛选`,filtersHint:`限定参与报表的数据行。`,filtersComplex:`此报表使用了高级筛选条件,此处无法编辑。保存时将原样保留。`,groupBy:`分组`,groupByHint:`按字段分组并计算小计。`,rows:`行`,rowsHint:`按这些字段对行分组。`,columnsAxis:`列`,columnsAxisHint:`将这些字段透视到顶部。`,values:`度量`,valuesHint:`每个单元格里展示的数字。选择一个或多个字段并设置聚合方式(求和、计数…)。`,grouping:`分组`,addGrouping:`添加分组`,dateGranularity:`日期粒度`,dateGranularityNone:`(使用原始值)`,day:`日`,week:`周`,month:`月`,quarter:`季度`,year:`年`,sortAsc:`升序`,sortDesc:`降序`,chart:`图表`,chartHint:`在表格旁可选展示的可视化。`,chartType:`图表类型`,chartTitle:`图表标题`,chartTitlePlaceholder:`默认使用报表标题`,chartXAxis:`X 轴(类别)`,chartYAxis:`Y 轴(数值)`,chartShowLegend:`显示图例`,chartShowDataLabels:`显示数据标签`,chartNone:`(无图表)`,chartBar:`柱状图`,chartLine:`折线图`,chartArea:`面积图`,chartPie:`饼图`,chartDonut:`环形图`,chartFunnel:`漏斗图`,validationNeedsObject:`请先选择数据源,再添加列。`,validationMatrixNeedsRowsCols:`矩阵报表至少需要一个行字段和一个列字段。`,validationSummaryNeedsRows:`汇总报表至少需要一个分组字段。`,blocks:`区块`,blocksHint:`每个区块都是独立的表格或图表。区块筛选会与报表筛选合并(AND)。`,addBlock:`添加区块`,removeBlock:`删除区块`,blockName:`区块名称`,blockNamePlaceholder:`唯一的区块名`,blockLabel:`显示标题`,blockLabelPlaceholder:`显示在区块上方`,blockDescription:`说明`,blockDescriptionPlaceholder:`该区块的可选说明`,validationJoinedNeedsBlocks:`组合报表至少需要一个区块。`,validationBlockNameRequired:`每个区块都必须有非空的名称。`,validationBlockNameDuplicate:`区块名称在报表内必须唯一。`,validationBlockNeedsColumns:`每个区块至少需要一列。`,noneOption:`(无)`,addCondition:`添加条件`,combineLogic:`组合方式`,opContains:`包含`,opIsEmpty:`为空`,opIsNotEmpty:`不为空`,formatAuto:`自动`,formatCurrency:`货币`,formatPercent:`百分比`,formatInteger:`整数`,formatDate:`日期`,formatDatetime:`日期 + 时间`,columnLabelPlaceholder:`自定义标签`,aggregateColumn:`聚合`,formatColumn:`格式`,addColumns:`添加字段`,searchFields:`搜索字段…`,noMatchingFields:`没有匹配的字段。`,noFieldsAvailable:`暂无可用字段。`,columnsCount:`已选择 {n} 个列`,columnsEmpty:`尚未选择任何列。`,fieldPickerTitle:`选择字段`,fieldPickerDescription:`可选择一个或多个字段添加到报表,输入关键字可快速筛选。`,fieldPickerChangeTitle:`更换字段`,fieldPickerAddGroupingTitle:`添加分组`,fieldPickerEmpty:`(请选择字段)`,fieldPickerSelected:`已选 {n} 个`,fieldPickerClear:`清空选择`,fieldPickerAdd:`添加`,fieldPickerAddN:`添加 {n} 个`}},map:{searchLocations:`搜索位置…`,locationDetails:`位置详情`,markersCount:`{{count}} 个标记`,invalidCoordinates:`{{count}} 条记录因坐标缺失或无效已从地图中排除。`,invalidCoordinatesPlural:`{{count}} 条记录因坐标缺失或无效已从地图中排除。`},workflow:{draft:`草稿`,active:`活跃`,paused:`已暂停`,completed:`已完成`,cancelled:`已取消`,save:`保存`,publish:`发布`,addNode:`添加节点`,workflowFlow:`工作流程`,properties:`属性`,connections:`连接`,quickConnect:`快速连接`,fromPlaceholder:`从...`,toPlaceholder:`到...`,connect:`连接`,label:`标签`,type:`类型`,description:`描述`,assignee:`负责人`,assigneeType:`负责人类型`,user:`用户`,role:`角色`,group:`组`,expression:`表达式`,timeoutMinutes:`超时时间(分钟)`,selectNodeToEdit:`选择节点以编辑其属性`,workflowTitle:`工作流标题`,newWorkflow:`新工作流`,outConnections:`{{count}} 个输出`,start:`开始`,end:`结束`,task:`任务`,userTask:`用户任务`,serviceTask:`服务任务`,scriptTask:`脚本任务`,approval:`审批`,condition:`条件`,parallelGateway:`并行网关`,joinGateway:`合并网关`,boundaryEvent:`边界事件`,delay:`延迟`,notification:`通知`,webhook:`Webhook`,allowConcurrency:`允许(并发执行)`,forbidConcurrency:`禁止(跳过新任务)`,replaceConcurrency:`替换(取消现有任务)`,queueConcurrency:`排队(等待当前完成)`,conditionEvent:`条件`,manualEvent:`手动`,webhookEvent:`Webhook`,timerEvent:`定时器`,signalEvent:`信号`,versionHistory:`版本历史`,importBpmn:`导入 BPMN`,exportBpmn:`导出 BPMN`,undo:`撤销`,redo:`重做`,resetZoom:`重置缩放`},dashboard:{addWidget:`添加组件`,removeWidget:`移除组件`,editLayout:`编辑布局`,saveLayout:`保存布局`,resetLayout:`重置布局`,total:`总计`,noDataAvailable:`暂无数据`,noDataSourceFor:`没有可用的数据源:`,noRows:`暂无数据行`,pickMeasures:`请为该数据集组件选择度量(值)。`,datasetUnsupported:`当前数据源不支持数据集查询。`,details:`明细`,exportCsv:`导出 CSV`,openInList:`在列表中打开`,trend:{vsLastQuarter:`较上季度`,vsLastMonth:`较上月`,vsLastWeek:`较上周`,vsLastYear:`较去年`,vsYesterday:`较昨日`,vsPreviousPeriod:`较上期`}},configPanel:{save:`保存`,discard:`丢弃`,close:`关闭`,layout:`布局`,columns:`列数`,gap:`间距`,rowHeight:`行高`,data:`数据`,refreshInterval:`刷新间隔`,appearance:`外观`,title:`标题`,showDescription:`显示描述`,theme:`主题`,configuration:`配置`,general:`基本`,advanced:`高级`},appDesigner:{createApp:`创建应用`,editApp:`编辑应用`,basicInfo:`基本信息`,objects:`业务对象`,navigation:`导航`,branding:`品牌`,appName:`应用名称`,appTitle:`标题`,appDescription:`描述`,appIcon:`图标`,template:`模板`,layout:`布局`,layoutSidebar:`侧边栏`,layoutHeader:`顶部导航`,layoutEmpty:`空白`,selectObjects:`选择对象`,searchObjects:`搜索对象…`,selectAll:`全选`,deselectAll:`取消全选`,navBuilder:`导航构建器`,addGroup:`添加分组`,addUrl:`添加链接`,addSeparator:`添加分隔线`,noNavItems:`暂无导航项。`,logoUrl:`Logo 链接`,primaryColor:`主色调`,faviconUrl:`网站图标链接`,preview:`预览`,complete:`完成`,snakeCaseHint:`必须使用 snake_case 格式(如 my_app)`,modeEdit:`编辑`,modePreview:`预览`,modeCode:`代码`,addWidget:`添加组件`,widgetProperties:`组件属性`,dataSource:`数据源`,valueField:`数值字段`,aggregate:`聚合`,colorVariant:`颜色`,addComponent:`添加组件`,componentProperties:`组件属性`,viewType:`视图类型`,fields:`字段`,toolbar:`工具栏`,showSearch:`显示搜索`,showFilters:`显示筛选`,showSort:`显示排序`,appearance:`外观`,rowHeight:`行高`,stripedRows:`斑马纹`,bordered:`边框`,livePreview:`实时预览`,stepBasicDesc:`名称、标题和布局`,stepObjectsDesc:`选择业务对象`,stepNavigationDesc:`构建导航树`,stepBrandingDesc:`Logo、颜色和图标`,noObjectsFound:`未找到对象。`,noNavItemsHint:`暂无导航项。请在上一步选择对象或手动添加项目。`,separator:`分隔线`,separatorLabel:`— 分隔线 —`,newGroup:`新建分组`,newLink:`新建链接`,saveDraft:`保存草稿`,cancelConfirmTitle:`放弃更改?`,cancelConfirmMessage:`您有未保存的更改。确定要取消吗?`,confirmDiscard:`放弃`,keepEditing:`继续编辑`,navNoItems:`暂无导航项。点击上方按钮添加项目。`,navNoPreviewItems:`无项目`,navLivePreview:`实时预览`,navCollapseGroup:`折叠分组`,navExpandGroup:`展开分组`,navAddChild:`添加子项`,navMoveUp:`上移`,navMoveDown:`下移`,navRemove:`移除`,navObjectPage:`对象页面`,navDashboard:`仪表盘`,navPage:`页面`,navReport:`报表`,navGroup:`分组`,navUrl:`链接`,navSeparator:`分隔线`,navTypeObject:`对象`,navTypeDashboard:`仪表盘`,navTypePage:`页面`,navTypeReport:`报表`,navTypeUrl:`链接`,navTypeGroup:`分组`,navTypeSeparator:`分隔线`,navTypeAction:`操作`,navEditIcon:`编辑图标`,navToggleVisible:`切换可见性`,navHidden:`已隐藏`,navExportSchema:`导出 JSON`,navImportSchema:`导入 JSON`,navExportSuccess:`导航结构已导出`,navImportSuccess:`导航结构已导入`,navImportError:`无效的导航 JSON`,navIconPlaceholder:`图标名称(如 Users)`,dashboardEditor:`仪表盘编辑器`,noWidgets:`暂无小组件。点击上方按钮添加。`,widgetLayoutSize:`布局尺寸`,widgetWidth:`宽度`,widgetHeight:`高度`,dashboardPreview:`仪表盘预览`,noWidgetsPreview:`暂无可预览的小组件`,pageCanvasEditor:`页面画布编辑器`,emptyPage:`空白页面。点击上方按钮添加组件。`,pagePreview:`页面预览`,noComponentsPreview:`暂无可预览的组件`,modePage:`页面`,modeDashboard:`仪表盘`,undo:`撤销`,redo:`重做`,brandingEditor:`品牌编辑器`,brandingExport:`导出 JSON`,brandingImport:`导入 JSON`,brandingPreview:`预览`,brandingSampleButton:`示例按钮`,brandingSampleText:`这是您的品牌主题效果预览。`,colorPalette:`颜色面板`,fontFamily:`字体`,fontDefault:`默认(系统)`,modeLight:`浅色`,modeDark:`深色`,mobilePreview:`移动端预览`,objectManager:{title:`对象管理器`,addObject:`新建对象`,searchPlaceholder:`搜索对象…`,noObjects:`未找到对象。`,objectName:`API 名称`,objectLabel:`标签`,pluralLabel:`复数标签`,icon:`图标`,selectIcon:`选择图标…`,group:`分组`,noGroup:`无分组`,sortOrder:`排序`,enabled:`启用`,relationships:`关系`,systemBadge:`系统`,fieldCount:`{{count}} 个字段`,ungrouped:`未分组`,deleteConfirmTitle:`删除对象?`,deleteConfirmMessage:`这将永久删除该对象及其所有字段。此操作无法撤销。`},fieldDesigner:{title:`字段设计器`,addField:`新建字段`,searchPlaceholder:`搜索字段…`,allTypes:`所有类型`,noFields:`未找到字段。`,fieldName:`API 名称`,fieldLabel:`标签`,fieldType:`类型`,fieldGroup:`分组`,description:`描述`,required:`必填`,unique:`唯一`,readOnly:`只读`,hidden:`隐藏`,indexed:`索引`,externalId:`外部 ID`,trackHistory:`追踪历史`,defaultValue:`默认值`,placeholder:`占位文本`,referenceTo:`引用对象`,formula:`公式`,options:`选项`,addOption:`添加选项`,validationRules:`验证规则`,addRule:`添加规则`,systemBadge:`系统`,ungrouped:`通用`,deleteConfirmTitle:`删除字段?`,deleteConfirmMessage:`这将永久删除该字段。此字段中的现有数据将丢失。`,basicSection:`基础`,typeSpecificSection:`类型设置`,advancedSection:`高级`,typeCategory:{text:`文本`,number:`数字`,date:`日期时间`,choice:`选择`,relation:`关联`,advanced:`高级`}}},console:{title:`ObjectStack 控制台`,initializing:`正在初始化应用程序...`,search:`搜索…`,breadcrumb:{dashboards:`仪表盘`,pages:`页面`,reports:`报告`,system:`系统`},nav:{pinItem:`固定 {{name}}`,unpinItem:`取消固定 {{name}}`,dragToReorder:`拖动以重新排序`,favorites:`收藏`},loadingSteps:{connecting:`正在连接数据源`,loadingConfig:`正在加载配置`,preparingWorkspace:`正在准备工作区`},error:{connectionFailed:`无法连接到服务器`,serverUnreachable:`无法访问服务器 {{url}}。`,checkServer:`请检查网络连接,或确认后端服务正在运行。`,timeout:`连接超时(10 秒)。`},actions:{retry:`重试`,retrying:`正在重试…`},shortcuts:{title:`键盘快捷键`,description:`所有可用键盘快捷键的快速参考。`,groups:{general:`通用`,navigation:`导航`,dataViews:`数据视图`,preferences:`偏好设置`},openCommandPalette:`打开命令面板`,showShortcuts:`显示键盘快捷键`,closeDialog:`关闭对话框/面板`,toggleSidebar:`切换侧边栏`,focusSearch:`聚焦搜索`,createRecord:`新建记录`,refreshData:`刷新数据`,editRecord:`编辑选中记录`,toggleDarkMode:`切换深色模式`},commandPalette:{placeholder:`输入命令或搜索...`,noResults:`未找到结果。`,searching:`搜索中…`,records:`记录`,recentRecords:`最近访问`,objects:`对象`,dashboards:`仪表盘`,pages:`页面`,reports:`报表`,switchApp:`切换应用`,current:`当前`,preferences:`偏好设置`,lightTheme:`浅色主题`,darkTheme:`深色主题`,systemTheme:`系统主题`,actions:`操作`,openFullSearch:`打开完整搜索页面`,createApp:`创建新应用`},ai:{workspaceTitle:`AI 工作区`,workspaceSubtitle:`提问、查看并继续历史对话`,openChats:`打开对话列表`,chats:`对话`,chatsDescription:`浏览和管理 AI 对话。`,share:`分享`,shareTitle:`分享此对话`,shareDisabledTitle:`开始对话后即可分享`,newChat:`新对话`,searchChats:`搜索对话...`,noChatsYet:`暂无对话`,noChatsDescription:`开始新的对话后会显示在这里。`,noMatchingChats:`没有匹配的对话。`,newConversation:`新对话`,renameConversation:`重命名对话`,deleteConversation:`删除对话`,saveRename:`保存重命名`,cancelRename:`取消重命名`,loadingHistory:`正在加载对话历史...`,conversationReady:`对话已就绪`,preparingConversation:`正在准备新对话`,offlineDemoMode:`离线演示模式 — 无法获取助手列表`,askAgent:`向 {{agent}} 提问...`,assistant:`助手`,loadingAgents:`正在加载助手...`,askAnything:`输入你的问题...`,emptyTitle:`开始对话`,emptyDescription:`可以直接提问,助手会结合当前应用上下文提供帮助。`,switchAssistant:`切换助手`,chooseAgent:`选择助手…`,empty:{build:{title:`用 AI 搭建`,description:`用自然语言描述一个应用或流程 —— 我会起草对象、界面和自动化,随后你审阅并发布。`},ask:{title:`向你的数据提问`,description:`针对你的记录提问 —— 在你有权访问的数据范围内进行计数、列举和汇总。`}},clearConversation:`清空`,sendHint:`发送`,agentActivity:`执行过程`,toolCompleted:`已完成`,toolRunning:`运行中`,toolAwaitingApproval:`等待确认`,toolFailed:`失败`,toolDetailsHidden:`已隐藏工具参数和原始结果,仅保留过程摘要。`,copy:`复制`,copied:`已复制`,regenerate:`重新生成`,model:`模型`,submit:`发送`,uploadFiles:`上传文件`,stopResponse:`停止生成`,trace:`调试 trace`,viewTrace:`查看调试 trace`,nextSteps:`下一步`,publishDrafts:`发布`,publishOk:`已发布,对象已生效。`,seedWarn:`已发布,但部分示例数据未能载入。`,openBuiltApp:`打开应用`,previewDraft:`预览`,resizeSplit:`调整对话与预览的宽度`,hideChats:`隐藏对话列表`,showChats:`显示对话列表`,planTitle:`方案预览`,planQuestions:`搭建前请确认`,planAssumptions:`假设`,planApproveHint:`回复以确认或调整该方案。`,planApprove:`开始搭建`,planAdjust:`调整方案`,planApproveMessage:`就按这个方案搭建吧。`,planApproveDefaultsMessage:`就按你的合理假设直接搭建,未决问题用默认即可。`,planAnswerMessage:`关于「{{question}}」,我选择「{{option}}」。`,justNow:`刚刚`,minutesAgo:`{{count}} 分钟前`,hoursAgo:`{{count}} 小时前`,daysAgo:`{{count}} 天前`,agentLabels:{ask:`提问`,build:`构建`,dataChat:`智能助手`,metadataAssistant:`元数据开发助手`},suggestions:{dataChat:{userCount:`系统里有多少个用户?列出他们的邮箱。`,recentRecords:`帮我列出最近创建的 5 条记录。`,recordCounts:`统计每个对象的记录数。`},metadataAssistant:{buildCrm:`帮我搭建一个 CRM:客户、联系人、商机,并建立它们之间的关系。`,buildApp:`做一个项目管理应用:项目、任务、成员。`,buildFlow:`设计一个工单系统:工单、优先级、状态流转。`},generic:{help:`你可以帮我做什么?`,availableObjects:`列出可用的数据对象。`,recentActivity:`总结我的最近动态。`}}},errors:{somethingWentWrong:`出错了`,unexpectedError:`渲染此视图时发生意外错误。`,tryAgain:`重试`,goHome:`返回首页`,errorDetails:`错误详情(仅开发模式)`},theme:{toggle:`切换主题`,light:`浅色`,dark:`深色`,system:`系统`},objectView:{systemViewReadonly:`系统视图由代码定义,只读。`,expandToPage:`以完整页面打开`,objectNotFound:`未找到对象`,objectNotFoundDescription:`对象"{{objectName}}"在当前配置中不存在。`,objectNotFoundHint:`请检查您的应用导航设置或从侧边栏选择其他对象。`,allRecords:`所有记录`,exitDesignMode:`退出设计模式`,enterDesignMode:`进入设计模式`,metadataInspector:`元数据检查器`,editView:`编辑视图`,addView:`添加视图`,designTools:`设计工具`,new:`新建`,import:`导入`,importTitle:`从 CSV 文件导入`,importedToast:`成功导入 {{count}} 行。`,importedWithSkipped:`已导入 {{ok}} 行;跳过 {{skipped}} 行。`,configureView:`配置视图`,closePanel:`关闭面板`,showAdvancedSettings:`显示高级设置`,showFewerSettings:`显示精简设置`,page:`页面`,pageConfigHint:`工具栏、导航与视图外壳设置`,listConfigHint:`此列表类型的数据渲染、列与外观`,general:`常规`,generalHint:`视图标题、描述和类型`,toolbar:`工具栏`,toolbarHint:`搜索、筛选、排序、分组和密度切换`,toolbarEnabledCount:`已启用 {{count}}/{{total}} 项`,navigationSection:`导航`,navigationHint:`行点击行为和详情视图设置`,records:`记录`,recordsHint:`选择模式、添加记录和内联编辑`,exportPrint:`导出与打印`,exportPrintHint:`导出格式、打印和记录数显示`,showAllFields:`全部显示`,hideAllFields:`全部隐藏`,searchFields:`搜索字段...`,title:`标题`,description:`描述`,data:`数据`,source:`数据源`,columns:`列`,filterBy:`筛选条件`,sortBy:`排序条件`,appearance:`外观`,showDescription:`显示描述`,viewType:`视图类型`,userFilters:`用户筛选器`,enableSearch:`启用搜索`,enableFilter:`启用筛选`,enableSort:`启用排序`,enableHideFields:`启用隐藏字段`,enableGroup:`启用分组`,enableColor:`启用颜色`,enableDensity:`启用密度`,userActions:`用户操作`,addRecordViaForm:`通过表单添加记录`,advanced:`高级`,allowExport:`允许导出`,recordCount:`{{count}} 条记录`,noDescription:`无描述`,none:`无`,columnsConfigured:`{{count}} 列`,save:`保存`,discard:`丢弃`,createView:`创建视图`,createViewDesc:`先选择视图类型,再为它命名。所有设置之后都可以修改。`,cancel:`取消`,create:`创建`,delete:`删除`,deleteViewTitle:`删除视图`,deleteViewConfirm:`确定要删除视图 "{{name}}" 吗?此操作无法撤销。`,bulkDeleteConfirm:`确定要删除选中的 {{count}} 条记录吗?此操作无法撤销。`,duplicateViewName:`已存在同名视图。`,viewTypeGrid:`表格`,viewTypeGridDesc:`电子表格风格的记录表格。`,viewTypeKanban:`看板`,viewTypeKanbanDesc:`按单选字段分列的卡片视图。`,viewTypeCalendar:`日历`,viewTypeCalendarDesc:`按日期把记录放到月历上。`,viewTypeGallery:`画廊`,viewTypeGalleryDesc:`由附件字段驱动的大图卡片。`,viewTypeTimeline:`时间线`,viewTypeTimelineDesc:`记录按横向时间轴展开。`,viewTypeGantt:`甘特图`,viewTypeGanttDesc:`展示项目起止时间和依赖。`,viewTypeMap:`地图`,viewTypeMapDesc:`根据经纬度字段显示地理标记。`,viewTypeChart:`图表`,viewTypeChartDesc:`聚合的柱状/折线/饼状图。`,newView:`新视图`,typeOptions:`类型选项`,groupByField:`分组字段`,groupByFieldHelp:`看板会按该字段的不同取值分列。`,startDateField:`开始日期字段`,startDateFieldHelp:`日历将按该日期把记录放到对应日期格。`,ganttStartDateFieldHelp:`甘特条形图的左端使用该日期。`,ganttEndDateFieldHelp:`甘特条形图的右端使用该日期。`,timelineDateFieldHelp:`记录在时间轴上按该日期定位。`,titleField:`标题字段`,latitudeField:`纬度字段`,latitudeFieldHelp:`提供纬度坐标的字段(仅地理坐标字段可选)。`,longitudeField:`经度字段`,longitudeFieldHelp:`提供经度坐标的字段(仅地理坐标字段可选)。`,imageField:`图片字段`,imageFieldHelp:`画廊封面来自该图片或附件字段。`,dateField:`日期字段`,selectField:`选择字段...`,selectOption:`选择...`,noEligibleFieldForType:`没有符合条件的字段。请先在对象上添加该类型字段。`,viewTypeUnavailable:`该对象缺少所需的“{{field}}”字段。`,viewTypeUnavailableShort:`当前对象不支持。`,chartType:`图表类型`,chartTypeHelp:`决定数据如何呈现。`,chartTypeBar:`柱状图`,chartTypeLine:`折线图`,chartTypePie:`饼图`,chartTypeArea:`面积图`,chartTypeScatter:`散点图`,xAxisField:`X 轴字段`,xAxisFieldHelp:`用于分类或时间维度的字段。`,yAxisField:`Y 轴字段`,yAxisFieldHelp:`用于数值聚合的字段。`,gridOptionsHint:`网格视图使用上方配置的列。`,groupBy:`分组依据`,prefixField:`前缀字段`,fields:`字段`,fieldsVisible:`{{count}} 个可见`,sortsCount:`{{count}} 个排序`,filtersCount:`{{count}} 个筛选`,endDateField:`结束日期字段`,color:`颜色`,fieldTextColor:`字段文字颜色`,rowHeight:`行高`,wrapHeaders:`自动换行标题`,showFieldDescriptions:`显示字段描述`,collapseAllByDefault:`默认全部折叠`,striped:`斑马纹行`,bordered:`边框单元格`,inlineEdit:`内联编辑记录`,addDeleteRecordsInline:`内联添加/删除记录`,clickIntoRecordDetails:`点击进入记录详情`,navigationMode:`导航模式`,navigationWidth:`导航宽度`,navigationWidthHint:`适用于抽屉、弹窗和分屏导航模式`,openNewTab:`在新标签页打开`,openNewTabHint:`适用于页面和新窗口导航模式`,selectionMode:`选择模式`,selectionNone:`无`,selectionSingle:`单选`,selectionMultiple:`多选`,pageSize:`每页记录数`,pageSizeOptions:`每页选项`,exportFormats:`导出格式`,exportMaxRecords:`最大记录数`,exportIncludeHeaders:`包含表头`,exportFileNamePrefix:`文件名前缀`,searchableFields:`可搜索字段`,filterableFields:`可筛选字段`,resizableColumns:`可调整列宽`,densityCompact:`紧凑`,densityComfortable:`舒适`,densitySpacious:`宽松`,densityMode:`密度模式`,hiddenFields:`隐藏字段`,rowActions:`行操作`,bulkActions:`批量操作`,sharing:`共享`,sharingEnabled:`启用共享`,sharingVisibility:`可见性`,addRecordEnabled:`启用添加记录`,addRecordPosition:`位置`,addRecordMode:`模式`,addRecordFormView:`表单视图`,conditionalFormatting:`条件格式`,addRule:`添加规则`,quickFilters:`快速筛选`,addQuickFilter:`添加快速筛选`,ufElements:`元素类型`,ufDropdown:`下拉菜单`,ufTabs:`标签页`,ufToggle:`开关`,ufAddField:`+ 添加筛选字段...`,ufNoFields:`无可用字段`,ufAddTab:`+ 添加标签页`,ufTabLabel:`标签`,ufShowAllRecords:`显示"全部记录"标签页`,ufAllowAddTab:`允许添加标签页`,showRecordCount:`显示记录计数`,allowPrinting:`允许打印`,virtualScroll:`虚拟滚动`,emptyStateTitle:`空状态标题`,emptyStateMessage:`空状态消息`,emptyStateIcon:`空状态图标`,ariaLabel:`ARIA 标签`,ariaDescribedBy:`ARIA 描述`,ariaLive:`ARIA 实时区域`,accessibility:`无障碍`,viewTabs:`视图标签`},localeSwitcher:{label:`语言`}},auth:{login:{title:`登录您的账户`,description:`输入您的邮箱和密码以继续`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,passwordLabel:`密码`,passwordPlaceholder:`输入您的密码`,forgotPasswordText:`忘记密码?`,submitButton:`登录`,submittingButton:`登录中...`,noAccountText:`还没有账户?`,signUpText:`注册`,signingIn:`正在登录…`,ssoHandoff:`继续前往 {{target}}`,errors:{invalidCredentials:`邮箱或密码错误,请重试。`,emailNotVerified:`请先验证您的邮箱后再登录。`}},register:{title:`创建账户`,description:`输入您的信息以开始使用`,nameLabel:`姓名`,namePlaceholder:`张三`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,passwordLabel:`密码`,passwordPlaceholder:`创建密码(至少8个字符)`,confirmPasswordLabel:`确认密码`,confirmPasswordPlaceholder:`确认您的密码`,passwordMismatchError:`两次输入的密码不一致`,passwordTooShortError:`密码至少需要8个字符`,submitButton:`创建账户`,submittingButton:`创建中...`,hasAccountText:`已有账户?`,signInText:`登录`,errors:{userExists:`该邮箱已被注册,请直接登录或更换邮箱。`},verifyInbox:{title:`请检查您的邮箱`,description:`我们已向 {{email}} 发送了一封验证邮件,请点击邮件中的链接激活账户。`,resend:`重新发送验证邮件`,resending:`发送中…`,resent:`验证邮件已发送。`,backToSignIn:`返回登录`}},forgotPassword:{title:`重置密码`,description:`输入您的邮箱地址,我们将发送重置密码链接`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,submitButton:`发送重置链接`,submittingButton:`发送中...`,successTitle:`请查看您的邮箱`,successDescription:`我们已将密码重置链接发送至 {{email}},请检查您的收件箱。`,backToSignInText:`返回登录`,rememberPasswordText:`记住密码了?`,signInText:`登录`},setPassword:{title:`设置一个备用密码`,description:`您是通过单点登录进入的。设置一个本地密码,这样即使单点登录不可用,您仍能直接登录此环境。`,email:`邮箱`,newPassword:`新密码`,confirmPassword:`确认密码`,submit:`设置密码`,submitting:`保存中…`,success:`本地密码已设置`,failed:`无法设置密码`,passwordsMismatch:`两次输入的密码不一致`,noSession:`您的会话已过期。`,backToSignIn:`重新登录`},resetPassword:{title:`设置新密码`,description:`请选择一个您未使用过的密码。`,newPassword:`新密码`,confirmPassword:`确认密码`,submit:`更新密码`,submitting:`更新中…`,success:`密码已更新`,failed:`重置失败`,invalidToken:`此重置链接无效或已过期。`,missingToken:`重置链接缺失或已过期`,passwordsMismatch:`两次输入的密码不一致`,requestNewLink:`获取新链接`},verifyEmail:{title:`验证您的邮箱地址`,description:`我们已向您的邮箱发送了一封验证邮件,请点击邮件中的链接以验证您的账户。`,sentTo:`发送至:`,verifyingTitle:`验证中…`,verifyingDescription:`正在确认您的邮箱,请稍候。`,successTitle:`邮箱已验证`,successDescription:`您的邮箱已确认,现在可以登录了。`,errorTitle:`验证失败`,errorDescription:`验证失败,请重新获取验证链接。`,missingToken:`验证链接缺少令牌。`,emailMissing:`缺少邮箱地址`,resendButton:`重新发送验证邮件`,resending:`发送中…`,resent:`邮件已发送!请查看收件箱`,resentSuccess:`验证邮件已发送!`,resentDescription:`请查看收件箱并点击验证链接。`,resendFailed:`无法重新发送验证邮件`,signInLink:`前往登录`,backToSignIn:`返回登录`,backToLogin:`返回登录`,checkSpam:`没有收到邮件?请检查垃圾邮件文件夹或联系支持。`,or:`或`},setup:{welcomeTitle:`欢迎使用 ObjectStack`,description:`创建第一个所有者账户以完成本次部署的初始化。`,yourName:`您的姓名`,orgName:`组织名称`,orgNamePlaceholder:`Acme Inc.`,emailLabel:`邮箱`,emailPlaceholder:`name@example.com`,passwordLabel:`密码`,passwordHint:`至少 8 个字符`,submit:`创建所有者账户`,submitting:`设置中…`,failed:`设置失败`},device:{title:`授权新设备`,subtitle:`批准此设备以 {{email}} 的身份登录。`,userCodeLabel:`设备代码`,requesterLabel:`连接请求来自`,approveWarning:`仅当这是你刚刚自己发起的连接时才批准。批准后,该运行时将能访问你所在组织的私有软件包。`,loggedInAs:`已以 {{email}} 身份登录`,approve:`批准设备`,approving:`批准中…`,approvedTitle:`设备已授权`,approvedDescription:`您可以返回该设备,它应该很快就会登录。`,approveSuccess:`设备已授权`,approveSuccessDescription:`您可以关闭此窗口。`,approveFailed:`批准失败`,deny:`拒绝请求`,denying:`拒绝中…`,deniedTitle:`访问被拒绝`,deniedDescription:`该设备将不会被授予访问权限。`,denyFailed:`拒绝请求失败`,invalidTitle:`无效的设备链接`,invalidDescription:`URL 中未提供设备代码。`,loading:`加载中…`,cancel:`取消`},shell:{tenantHostHint:`您正在登录此工作区`}},errors:{networkError:`网络错误,请检查网络连接。`,serverError:`服务器错误,请稍后重试。`,notFound:`资源未找到。`,unauthorized:`您没有权限执行此操作。`,forbidden:`访问被拒绝。`,timeout:`请求超时,请重试。`,unknown:`发生未知错误。`},workspace:{label:`工作区`,default:`我的工作区`,switch:`切换工作区`,create:`创建工作区`,createTitle:`创建工作区`,createDescription:`工作区是团队协作的共享空间。`,createButton:`创建工作区`,nameLabel:`工作区名称`,namePlaceholder:`例如:极客科技`,slugLabel:`URL 标识`,slugHint:`用于 URL 中,仅支持小写字母、数字和连字符。`,invite:`邀请成员`,members:`成员`,settings:`工作区设置`},help:{onThisPage:`本页目录`,appDocs:`本应用文档`,allDocs:`全部文档`,onlineDocs:`在线文档`},sidebar:{settings:`设置`,help:`帮助`,helpTooltip:`帮助与文档`,activityFeed:`活动动态`,notifications:`通知`,approvals:`审批`,inbox:`消息中心`,inboxAriaLabel:`打开消息中心`,area:`区域`,scope:`范围`,packageManagement:`软件包管理`,searchNavigation:`搜索导航...`,recent:`最近使用`,favorites:`收藏`,starred:`已收藏`,removeFromFavorites:`从收藏中移除 {{name}}`},topbar:{aiAssistant:`AI 助手`,openAssistant:`打开{{name}}助手`,offline:`离线`,usersOnline:`当前在线用户`,switchView:`切换视图`,connection:{connected:`已连接`,connecting:`连接中...`,reconnecting:`正在重新连接...`,disconnected:`已断开连接`,error:`连接错误`}},home:{title:`首页`,subtitle:`您的工作区仪表盘`,nav:`首页`,allApps:`全部应用`,greetingMorning:`早上好`,greetingAfternoon:`下午好`,greetingEvening:`晚上好`,greetingNight:`夜深了`,heroTagline:`从上次离开的地方继续,或者探索新的内容。`,open:`打开`,stats:{apps:`应用`,starred:`收藏`,recent:`最近访问`},loading:`正在加载工作区...`,recent:`最近使用`,starred:`收藏`,welcome:`用 AI 搭建你的业务系统`,welcomeDescription:`用一句话描述你的业务,AI 帮你生成对象、界面、API 和 agent 工具。也可以手动从零开始。`,welcomeAdminDescription:`用一句话描述你的业务,AI 会为你生成对象、界面、API 和智能体工具;也可以从左侧菜单自行搭建。`,welcomeAdminDescriptionNoBuild:`从左侧的「管理」菜单创建你的第一个应用。有了数据后,AI 助手可以帮你查询和分析。`,welcomeAdminDescriptionNoAi:`从左侧的「管理」菜单创建你的第一个应用。`,noAppsTitle:`还没有应用`,noAppsDescription:`当前还没有可用的应用。请联系你的工作区管理员。`,buildWithAI:`用 AI 搭建`,askAI:`问 AI`,recoveryReminder:{message:`建议设置一个备用密码,这样即使单点登录不可用,你仍能直接登录此环境。`,cta:`设置密码`,dismiss:`关闭`},pendingDrafts:{message:`你有 {{count}} 项未发布的更改 —— 点击发布即可生效。`,cta:`发布`,publishing:`发布中…`,published:`已发布!更改已生效。`,publishFailed:`发布失败`},createFirstApp:`手动创建应用`,systemSettings:`系统设置`,browseMarketplace:`浏览应用市场`,quickActions:{title:`快捷操作`,createApp:`创建应用`,createAppDesc:`从新应用开始`,manageObjects:`管理对象`,manageObjectsDesc:`配置数据模型`,systemSettings:`系统设置`,systemSettingsDesc:`配置您的工作区`},recentApps:{title:`最近访问`,itemType:{object:`对象`,dashboard:`仪表盘`,page:`页面`,record:`记录`}},starredApps:{title:`收藏`},gettingStarted:{title:`把首页布置成你喜欢的样子`,description:`收藏一个应用即可固定到此处,一键直达。打开过的内容会自动出现在「最近访问」中。`,cta:`浏览全部应用`},appCard:{noDescription:`暂无描述`,default:`默认`}},layout:{appSwitcher:{home:`首页`,switchApplication:`切换应用`,appsAvailable:`共 {{count}} 个可用应用`,addApp:`新增应用`,editApp:`编辑应用`,manageAllApps:`管理所有应用`,systemConsole:`系统控制台`,noAppsConfigured:`尚未配置任何应用`},systemNav:{systemSettings:`系统设置`,applications:`应用`,appMarketplace:`应用市场`,objectManager:`对象管理器`,users:`用户`,organizations:`组织`,roles:`角色`,configuration:`配置`,createApp:`创建应用`},activityFeed:{title:`最近动态`,filter:`筛选`,empty:`暂无最近动态`,viewAll:`查看全部动态`,ariaLabel:`动态消息`,typeCreate:`创建`,typeUpdate:`更新`,typeDelete:`删除`,typeComment:`评论`,relativeJustNow:`刚刚`,relativeSecondsAgo:`{{count}} 秒前`,relativeMinutesAgo:`{{count}} 分钟前`,relativeHoursAgo:`{{count}} 小时前`,relativeDaysAgo:`{{count}} 天前`},metadata:{label:`元数据`,toggleTitle:`切换元数据检视器`,panelTitle:`元数据检视器`,jsonBadge:`JSON`,copyJson:`复制 JSON`}},search:{title:`搜索`,back:`返回`,placeholder:`搜索对象、仪表板、页面、报表…`,inputAriaLabel:`搜索对象、仪表板、页面、报表`,resultsCount:`找到 {{count}} 条与“{{query}}”相关的结果`,resultsCountPlural:`找到 {{count}} 条与“{{query}}”相关的结果`,itemsAvailable:`共 {{count}} 项可搜索`,noResults:`未找到结果`,noResultsHint:`请尝试调整搜索关键字`,typeObjects:`对象`,typeDashboards:`仪表板`,typePages:`页面`,typeReports:`报表`,badgeObject:`对象`,badgeDashboard:`仪表板`,badgePage:`页面`,badgeReport:`报表`},empty:{objectNotFound:`未找到对象`,objectNotFoundDescription:`对象 “{{name}}” 的定义不存在。请检查配置或返回选择有效的对象。`,recordNotFound:`未找到记录`,recordNotFoundDescription:`您查找的记录不存在或已被删除。`,pageNotFound:`未找到页面`,pageNotFoundDescription:`未找到页面 “{{name}}”,可能已被删除或重命名。`,dashboardNotFound:`未找到仪表板`,dashboardNotFoundDescription:`未找到仪表板 “{{name}}”,可能已被删除或重命名。`,reportNotFound:`未找到报表`,reportNotFoundDescription:`未找到报表 “{{name}}”,可能已被删除或重命名。`,noAppsConfigured:`尚未配置应用`,noAppsConfiguredDescription:`当前没有任何已注册的应用。请创建您的第一个应用,或前往系统设置进行配置。`,createFirstApp:`创建您的第一个应用`,systemSettings:`系统设置`,back:`返回`},preview:{empty:{loadFailedTitle:`草稿预览加载失败`,loadFailedDescription:`无法读取草稿数据。请重试,或检查网络连接。`,notReadyTitle:`“{{app}}” 尚未进入草稿`,notReadyDescription:`构建可能仍在进行,或在该应用落稿前失败了。请回到对话查看构建状态 —— 草稿就绪后此窗口会自动刷新。`,nothingTitle:`暂无可预览的内容`,retry:`重试`},draftBar:{message:`草稿预览 —— 您看到的是未发布的更改,发布前不会生效。`,publish:`发布`,publishing:`发布中…`,exit:`退出预览`,changes:`变更`},changes:{title:`待发布的变更`,description:`发布将带来以下变更。“新增”为全新内容,“更新”将覆盖线上版本。`,loading:`正在加载待发布变更…`,loadFailed:`无法加载待发布变更:`,empty:`没有待发布的内容 —— 所有草稿均已发布。`,kindNew:`新增`,kindUpdate:`更新`}},renderer:{noPageSchema:`未提供页面 schema`,noFormSchema:`未提供表单 schema`,noDashboardSchema:`未提供仪表板 schema`,pageRendering:`页面渲染中:{{name}}`,dashboardRendering:`仪表板渲染中:{{name}}`,formRenderingMode:`正在以 {{mode}} 模式渲染表单`,formRenderingFor:`记录 {{id}}`,createRecord:`新建记录`,editRecord:`编辑记录`,page:`页面`,dashboard:`仪表板`,save:`保存`,cancel:`取消`},actionDialog:{title:`操作参数`,description:`请填写以下信息以继续操作。`,selectPlaceholder:`请选择 {{label}}`,requiredError:`{{label}} 为必填项`,lookupPlaceholder:`粘贴 {{label}} 的记录 ID(UUID)`,lookupHelpText:`请输入引用记录的 ID。可视化选择器即将上线。`,cancel:`取消`,confirm:`确认`,defaultActionTitle:`操作`,ok:`确定`},actionConfirm:{title:`确认操作`,confirm:`继续`,cancel:`取消`},rowAction:{openMenu:`更多操作`,edit:`编辑`,delete:`删除`},navigationSync:{addedPage:`导航已更新:已添加页面 “{{name}}”`,addedDashboard:`导航已更新:已添加仪表板 “{{name}}”`,removedPage:`导航已更新:已移除页面 “{{name}}”`,removedDashboard:`导航已更新:已移除仪表板 “{{name}}”`,renamedPage:`导航已更新:页面 “{{oldName}}” 已重命名为 “{{newName}}”`,renamedDashboard:`导航已更新:仪表板 “{{oldName}}” 已重命名为 “{{newName}}”`,undoLabel:`撤销`,undone:`已撤销导航变更`,undoFailed:`撤销导航变更失败`,updateFailed:`更新导航失败`},objectActions:{deleteSuccess:`{{label}} 删除成功`,deleteFailed:`删除 {{label}} 失败`,noRecordId:`未提供记录 ID`,deleteConfirm:`确定要删除此记录吗?`,bulkDeleteSuccess:`已删除 {{count}} 条 {{label}} 记录`,bulkDeletePartial:`成功 {{succeeded}} 条,失败 {{failed}} 条`},objectViewActions:{renameFailed:`重命名视图失败`,deleteFailed:`删除视图失败`},dashboardActions:{pdfPreparing:`正在准备 PDF 导出…`,exportFailed:`导出失败:{{message}}`,forecastSoon:`预测视图即将上线`},recordDetail:{viewersTooltip:`正在查看此记录的用户`},cellRender:{empty:`空`,yes:`是`,no:`否`,systemFields:`系统字段`},user:{profile:`个人资料`,settings:`设置`,logout:`注销`,preferences:`偏好设置`,theme:`主题`,language:`语言`},organizations:{mine:`我的组织`,title:`组织`,heading:`您的组织`,subtitle:`选择一个组织以继续,或新建一个组织。`,searchPlaceholder:`搜索组织`,new:`新建组织`,current:`当前组织`,manage:`管理`,emptyTitle:`尚无组织`,emptyDescription:`创建您的第一个组织以开始使用。`,noMatches:`没有匹配的组织。`},notifications:{regionLabel:`通知`,empty:`暂无通知`,emptyUnread:`已读完所有通知`,filterUnread:`未读`,filterAll:`全部`,markAllRead:`全部标记为已读`,viewAll:`查看全部通知`,approvalsPending:`{{count}} 条待审批`,viewApprovals:`查看审批`,noPendingApprovals:`暂无待审批事项`,openApprovalsInbox:`打开审批中心`},publicForm:{submit:`提交`,submitting:`提交中…`,submitAnother:`再填一份`,poweredBy:`由 ObjectStack 提供技术支持`,secureNotice:`您的信息将通过安全通道传输,仅用于回复您本次请求。`,thankYouTitle:`感谢您的提交!`,thankYouMessage:`我们已成功收到您的信息。`,redirecting:`将在 {{seconds}} 秒后跳转…`,unavailableTitle:`表单不可用`,unavailableDescription:`该链接当前没有可用的公开表单。请确认对应视图已启用匿名分享并匹配此 slug。`,tryDemo:`试用演示`,retry:`重试`,loading:`正在加载表单…`,requiredHint:`* 为必填项`,consentLabelDefault:`我已阅读并同意隐私政策,授权对本次请求所提供的信息进行处理。`,consentLink:`隐私政策`,consentRequired:`请先勾选同意隐私政策。`,rateLimited:`请再花点时间核对一下您的填写内容,再点击提交。`,redirectBlocked:`提交成功,但出于安全考虑,跳转链接已被阻止。`,demo:{contactTitle:`联系我们`,contactDescription:`告诉我们您的项目需求,销售代表将在一个工作日内与您联系。`,supportTitle:`提交支持请求`,supportDescription:`描述您遇到的问题,我们的团队会在一个工作日内回复。`,thankYouSalesTitle:`已收到您的信息,感谢联系!`,thankYouSalesMessage:`我们的销售代表将在一个工作日内与您取得联系。`,thankYouSupportTitle:`您的请求已进入处理队列。`,thankYouSupportMessage:`支持工程师将尽快跟进。如需补充截图,请保留此页面。`,field:{firstName:`名字`,lastName:`姓氏`,email:`工作邮箱`,phone:`电话`,jobTitle:`职位`,company:`公司`,website:`官网`,industry:`行业`,companySize:`公司规模`,howCanWeHelp:`我们可以为您做些什么?`,subject:`主题`,description:`问题描述`,issueType:`问题类型`,priority:`优先级`},industry:{technology:`科技`,software:`软件 / SaaS`,finance:`金融`,healthcare:`医疗健康`,retail:`零售`,other:`其他`},issueType:{question:`咨询`,problem:`问题`,bug:`缺陷`,feature_request:`功能建议`},priority:{low:`低`,medium:`中`,high:`高`,critical:`紧急`}}},marketplace:{title:`应用市场`,subtitle:`浏览已通过审核、发布到 ObjectStack 目录中的应用。点击应用查看详情并安装到你的某个环境中。`,searchPlaceholder:`按名称或 manifest ID 搜索应用…`,searchAria:`搜索市场应用`,installed:`已安装`,installedCount:`已安装({{count}})`,refresh:`刷新`,all:`全部`,noApprovedYet:`应用市场暂无已通过审核的应用。`,noMatchFilters:`没有应用匹配当前筛选条件。`,noDescription:`未提供描述。`,back:`返回应用市场`,installedTitle:`已安装的应用`,installedSubtitle:`当前已安装到本运行时内核的应用市场软件包。缓存的清单文件位于 <code>.objectstack/installed-packages/</code>,重启后仍然保留。`,installedEmpty:`本运行时尚未安装任何应用市场应用。`,browseLink:`去应用市场看看 →`,installedAdditiveNote:`<strong>说明:</strong>内核 API 仅支持新增 — 卸载会移除磁盘上的清单,下次启动时不再加载;但运行中的内核仍会保留该应用,直到下次重启运行时才会真正卸载。`,installedAt:`安装于 {{when}}`,installedBy:`由 {{user}}`,installedPackageId:`包`,cachedAs:`缓存为 <code>{{path}}</code>`,versionBadge:`v{{version}}`,installedBadge:`已安装 v{{version}}`,load:{failed:`应用市场加载失败`,failedHint:`本运行时默认指向公共 ObjectStack 云端。请检查运行时是否在线,或通过 <code>OS_CLOUD_URL</code> 指向自托管控制面。`,packageFailed:`应用加载失败`,notFound:`未找到。`},detail:{homepage:`主页`,installedV:`已安装 · v{{version}}`,about:`简介`,noReadme:`未提供 README。`,versions:`版本`,noApprovedVersions:`暂无已审核版本。`,prerelease:`预发布`,moreOptions:`更多安装选项`,uninstallFromRuntime:`从本运行时卸载`,addSampleData:`添加示例数据`,reseedAgain:`重新加载示例数据`,purgeSampleData:`清除示例数据`,purgeConfirm:`删除此应用预置的所有示例记录?用户自行添加的记录不会被删除。`,purgeSuccess:`已删除 {{count}} 条示例记录。`,purgeNoData:`没有可清除的示例记录。`,reseedQueued:`示例数据将在下次访问该环境时重新加载。`,reseedLocalSuccess:`已重新加载示例数据:新增 {{inserted}} 条,更新 {{updated}} 条。`,reseedPartialErrors:`(有 {{count}} 条记录写入失败)`,updateAvailable:`有可用更新`},action:{install:`安装`,reinstall:`重新安装`,working:`处理中…`,installToCloud:`安装到云端…`,installed:`已安装`,installing:`安装中…`,uninstall:`卸载`,uninstalling:`卸载中…`,details:`详情`,close:`关闭`,dismiss:`关闭`,openOnCloud:`在云端打开`,backHome:`返回首页`},install:{dialogTitle:`安装 {{name}}`,dialogDescCurrent:`安装到当前环境({{host}})。`,dialogDescPicker:`选择要将此应用安装到的环境。需要先登录 ObjectStack Cloud。`,environment:`环境`,environmentPlaceholder:`选择一个环境`,includeSampleData:`包含示例数据`,noEnvs:`当前组织没有可用的环境。`,noPermission:`你没有权限在任何环境中安装应用。仅组织所有者和管理员可以安装 — 请联系你的工作区管理员。`,signInFirst:`请先登录 ObjectStack Cloud,然后点击下方"在云端打开"。`,success:`安装成功。打开环境即可看到新应用。`,localSuccess:`已将 v{{version}} 安装到本运行时。"{{name}}" 应该已经出现在应用切换器中。`,localManifestConflict:`{{message}}
|
|
8
8
|
提示:本地已有应用占用此 manifest_id,请先从 objectstack.config.ts 中移除。`,localUnauthorized:`请先登录本运行时再试。`,localMarketplaceUnavailable:`本运行时未配置 OS_CLOUD_URL,无法访问应用市场目录。`},uninstall:{confirm:`从本运行时卸载 {{manifestId}} v{{version}}?
|
|
9
9
|
|
|
10
|
-
磁盘上的清单缓存将被移除。运行中的内核仍会保留该应用,直到下次重启运行时才会真正卸载。`,successInList:`已移除 {{manifestId}}。重启运行时即可从内核中彻底卸载。`,successInDetail:`已移除 {{manifestId}} 的清单缓存。重启运行时即可从内核中彻底卸载该应用。`},accessDenied:{title:`应用市场仅限管理员使用`,description:`你没有权限在本环境中安装应用。请联系组织的所有者或管理员申请权限。`},category:{crm:`客户关系`,erp:`企业资源`,hr:`人力资源`,finance:`财务`,project:`项目管理`,collaboration:`协作`,analytics:`分析`,integration:`集成`,automation:`自动化`,ai:`人工智能`,security:`安全`,"developer-tools":`开发者工具`,"ui-theme":`界面主题`,storage:`存储`,other:`其他`},pricing:{free:`免费`,freemium:`免费增值`,paid:`付费`,subscription:`订阅`,"usage-based":`按用量计费`,"contact-sales":`联系销售`},relativeTime:{today:`今天`,daysAgo:`{{count}} 天前`,monthsAgo:`{{count}} 个月前`,yearsAgo:`{{count}} 年前`}},approvalsInbox:{loadMore:`加载更多`,loadingMore:`加载中…`,loadedOf:`已加载 {{loaded}} / 共 {{total}} 条`,actEscalate:`SLA 升级`,systemSlaActor:`系统(SLA)`,reassignBtn:`转签`,reassignTitle:`将该审批转签给其他人?`,reassignBody:`你的审批席位将转移给所选人员,对方会收到通知并可立即处理。`,reassignTo:`新审批人`,reassignToPlaceholder:`选择用户,或输入邮箱 / role:<角色名>`,reassignSuccess:`已转签给 {{to}}`,requestInfoBtn:`退回补充`,requestInfoTitle:`请申请人补充材料?`,requestInfoBody:`请求保持待审批状态;申请人会收到通知并可在动态中回复。`,requestInfoPlaceholder:`需要申请人补充什么?`,requestInfoSent:`已退回给申请人补充材料`,remindBtn:`催办`,remindSuccess:`已提醒 {{count}} 位审批人`,remindThrottled:`刚刚已发送过催办,请稍后再试。`,replyPlaceholder:`在此回复…`,slaRemaining:`SLA 剩余 {{dur}}`,slaOverdue:`SLA 已超期 {{dur}}`,actReassign:`转签`,actRemind:`催办`,actRequestInfo:`要求补充材料`,actComment:`评论`,stepProgress:`审批步骤`,prevRequest:`上一条`,nextRequest:`下一条`,positionOf:`第 {{index}} / {{total}} 条`,quickPhrase1:`同意,符合要求。`,quickPhrase2:`有条件同意,请关注执行情况。`,quickPhrase3:`请补充相关材料后重新提交。`,title:`审批中心`,subtitle:`查看并处理审批请求。`,refresh:`刷新`,tabMyPending:`待我审批`,tabSubmitted:`我发起的`,tabAll:`全部`,searchPlaceholder:`搜索记录、流程、申请人…`,clearSearch:`清除搜索`,statusFilter:`状态`,allStatuses:`全部状态`,processFilter:`流程`,allProcesses:`全部流程`,objectFilter:`对象`,allObjects:`全部对象`,filterCount:`{{shown}} / {{total}} 条`,selected:`已选择`,actionableCount:`({{count}} 条可操作)`,selectAll:`全选`,selectRow:`选择该请求`,colRequest:`审批事项`,colRecord:`记录`,colRequester:`申请人`,colStatus:`状态`,colWaiting:`提交时间`,colActions:`操作`,statusPending:`待审批`,statusApproved:`已通过`,statusRejected:`已拒绝`,statusRecalled:`已撤回`,statusReturned:`已退回修改`,sendBackBtn:`退回修改`,sendBackTitle:`将该申请退回修改?`,sendBackBody:`本轮审批结束,记录解锁,申请人可修改数据。重新提交后将为所有审批人开启新一轮审批。`,sendBackPlaceholder:`需要修改什么才能通过审批?`,sendBackSuccess:`已退回修改——申请人现在可以编辑并重新提交`,sendBackAutoRejected:`已达退回次数上限——申请已被自动拒绝`,actRevise:`退回修改`,actResubmit:`重新提交`,roundChip:`第 {{n}} 轮`,returnedHint:`审批人将申请退回给你。记录已解锁——修改数据后重新提交,将开启新一轮审批。`,resubmitBtn:`重新提交`,resubmitting:`正在重新提交…`,resubmitSuccess:`已重新提交——新一轮审批已开启`,resubmitPlaceholder:`你修改了什么?`,editRecordBtn:`编辑记录`,abandonTitle:`放弃本次修改?`,abandonBody:`撤回申请而不重新提交,审批到此结束。`,emptyTitle:`暂无请求`,emptyPending:`全部处理完毕,没有等待你审批的请求。`,emptyOther:`这里还没有内容。`,emptyViewAll:`查看全部请求`,noMatches:`没有符合当前筛选条件的请求。`,keyboardHint:`快捷键:j/k 移动 · Enter 打开 · x 选择 · a 通过 · r 拒绝`,drawerTitle:`审批请求`,submittedAgo:`提交于{{when}}`,completedAt:`完成于{{when}}`,waitingOn:`等待以下审批人`,history:`审批动态`,noActions:`暂无操作记录。`,actSubmit:`提交`,actApprove:`通过`,actReject:`拒绝`,actRecall:`撤回`,rawData:`原始数据(JSON)`,copy:`复制`,copied:`已复制`,copyFailed:`复制失败`,overrideActor:`以其他身份操作(管理员)`,actor:`操作身份`,auto:`自动`,overrideHint:`例如 role:sales_manager。留空则使用自动识别的身份。`,comment:`审批意见(可选)`,approve:`通过`,approving:`正在通过…`,reject:`拒绝`,rejecting:`正在拒绝…`,recall:`撤回`,recalling:`正在撤回…`,cancel:`取消`,clear:`清除`,approveN:`通过 {{count}} 条`,rejectN:`拒绝 {{count}} 条`,bulkApproveTitle:`通过这 {{count}} 条请求?`,bulkApproveBody:`每条请求都将以你的身份通过,对应流程沿“通过”分支继续。`,bulkRejectTitle:`拒绝这 {{count}} 条请求?`,bulkRejectBody:`将拒绝所选请求并通知各申请人。`,bulkApproved:`已通过 {{count}} 条请求`,bulkRejected:`已拒绝 {{count}} 条请求`,bulkPartial:`{{ok}} 条成功,{{fail}} 条失败:{{which}}`,rejectOneTitle:`拒绝“{{title}}”?`,rejectOneBody:`将拒绝该请求并通知申请人。`,rejectTitle:`拒绝该请求?`,rejectBody:`将把该请求标记为已拒绝,并通知申请人。`,recallTitle:`撤回该请求?`,recallBody:`撤回后审批人将无法继续处理,记录随即解锁。`,inlineApproved:`已通过“{{title}}”`,inlineRejected:`已拒绝“{{title}}”`,approvedFinal:`已通过`,approvedWaiting:`已通过——等待其余审批人`,rejectedToast:`已拒绝`,recalledToast:`请求已撤回`,whyDisabled:`只有指定的审批人才能处理该请求。当前等待:{{who}}。`,whyDisabledSubmitter:`这是你发起的请求,你可以撤回;但只有指定审批人才能通过或拒绝。`,noActor:`无法确定操作身份`,actionFailed:`操作失败`,loadFailed:`加载请求失败`,recallUnavailable:`当前部署暂不支持撤回。`,requestGone:`该请求已不存在,请刷新列表。`,notAllowed:`你没有权限执行此操作。`,alreadyDecided:`该请求已被处理,请刷新列表。`,justNow:`刚刚`,minutesAgo:`{{count}} 分钟前`,hoursAgo:`{{count}} 小时前`,daysAgo:`{{count}} 天前`},filterBuilder:{where:`其中`,and:`且`,or:`或`,clearAll:`清除全部`,selectField:`选择字段`,operator:`运算符`,selectValue:`选择值`,value:`值`,addFilter:`添加筛选`,removeCondition:`移除条件`,trueLabel:`是`,falseLabel:`否`,noResults:`无结果`,searchField:`搜索 {{label}}…`,enterId:`输入 {{label}} ID`,operators:{equals:`等于`,notEquals:`不等于`,contains:`包含`,notContains:`不包含`,isEmpty:`为空`,isNotEmpty:`不为空`,greaterThan:`大于`,lessThan:`小于`,greaterOrEqual:`大于或等于`,lessOrEqual:`小于或等于`,before:`早于`,after:`晚于`,between:`介于`,in:`属于`,notIn:`不属于`}},sortBuilder:{sortBy:`排序依据`,thenBy:`然后按`,selectField:`选择字段`,ascending:`A → Z`,descending:`Z → A`,addSort:`添加排序`,removeSort:`删除排序`}},Xr={en:Jr,zh:Yr,ja:{lookup:{recentlyUsed:`最近使用したもの`,allResults:`すべての結果`,createNew:`新規作成`,createNamed:`「{{name}}」を新規作成`,showingResults:`{{total}} 件中 {{shown}} 件を表示`,showAllResults:`すべての結果を表示 ({{count}})`,selectedBadge:`選択済み`,browseAll:`すべてのレコードを参照`,remove:`{{label}} を削除`,selectFirst:`まず {{fields}} を選択してください`,selectRecord:`レコードを選択`,recordCount:`{{count}} 件のレコード`,recordCountOne:`1 件のレコード`,pageOf:`{{total}} ページ中 {{current}} ページ`,filters:`フィルター`,clear:`クリア`,yes:`はい`,filterPlaceholder:`{{label}} で絞り込み`,prevPage:`前のページ`,nextPage:`次のページ`,jumpToPage:`ページへ移動`,retry:`再試行`,loading:`読み込み中…`,noOptions:`オプションが見つかりません`,noRecords:`レコードが見つかりません`},common:{addToFavorites:`お気に入りに追加`,removeFromFavorites:`お気に入りから削除`,loading:`読み込み中...`,save:`保存`,cancel:`キャンセル`,delete:`削除`,edit:`編集`,create:`作成`,search:`検索`,filter:`フィルター`,reset:`リセット`,confirm:`確認`,close:`閉じる`,back:`戻る`,next:`次へ`,previous:`前へ`,submit:`送信`,refresh:`更新`,export:`エクスポート`,import:`インポート`,yes:`はい`,no:`いいえ`,ok:`OK`,actions:`操作`,more:`もっと見る`,selectAll:`すべて選択`,clearAll:`すべてクリア`,noData:`データがありません`,noResults:`結果が見つかりません`,required:`必須`,optional:`任意`,selectOption:`選択してください`,select:`選択...`,openChat:`チャットを開く`,closeChat:`チャットを閉じる`,toggleSidebar:`サイドバーを切り替え`,package:`パッケージ`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}}は必須です`,minLength:`{{field}}は{{min}}文字以上で入力してください`,maxLength:`{{field}}は{{max}}文字以下で入力してください`,min:`{{field}}は{{min}}以上にしてください`,max:`{{field}}は{{max}}以下にしてください`,email:`有効なメールアドレスを入力してください`,url:`有効なURLを入力してください`,pattern:`{{field}}の形式が正しくありません`,unique:`{{field}}は一意である必要があります`,type:`{{field}}は有効な{{type}}である必要があります`},form:{addItem:`項目を追加`,removeItem:`項目を削除`,fieldRequired:`この項目は必須です`,invalidFormat:`形式が正しくありません`,saveSuccess:`保存しました`,saveError:`保存に失敗しました`,unsavedChanges:`保存されていない変更があります。このページを離れますか?`,stepOf:`ステップ {{current}} / {{total}}`,createTitle:`{{object}}を作成`,editTitle:`{{object}}を編集`,createDescription:`新しい{{object}}をデータベースに追加します。`,editDescription:`{{object}}の詳細を更新`,saveRecord:`レコードを保存`,create:`作成`,update:`更新`,createSuccess:`{{object}}が作成されました`,updateSuccess:`{{object}}が更新されました`,deleteSuccess:`{{object}}が削除されました`},fields:{richText:{format:`フォーマット: {{format}}`,basicEditorHint:`リッチテキストエディター(基本)`,placeholder:`テキストを入力...`}},table:{rowsPerPage:`1ページの行数`,showing:`{{total}}件中{{from}}〜{{to}}件を表示`,noRows:`表示するデータがありません`,sortAsc:`昇順`,sortDesc:`降順`,filterColumn:`{{column}}でフィルター`,columns:`列`,exportCSV:`CSVエクスポート`,exportExcel:`Excelエクスポート`,selectRow:`行を選択`,selectAllRows:`すべての行を選択`,expandRow:`行を展開`,collapseRow:`行を折りたたむ`,hideColumn:`列を非表示`,freezeColumn:`列を固定`,unfreezeColumn:`列の固定を解除`,pageInfo:`{{total}}ページ中{{current}}ページ`,totalRecords:`合計{{count}}件`,noResults:`結果が見つかりません`,noResultsHint:`フィルターや検索クエリを調整してみてください。`,cancelAll:`すべてキャンセル`,saveAll:`すべて保存 ({{count}})`,addRecord:`レコードを追加`,open:`開く`,search:`検索...`,modified:`{{count}} 行が変更されました`,selected:`{{count}} 件選択中`,edit:`編集`,delete:`削除`},grid:{actions:`アクション`,edit:`編集`,delete:`削除`,export:`エクスポート`,exportAs:`{{format}}でエクスポート`,loading:`グリッドを読み込み中...`,errorLoading:`グリッドの読み込みエラー`,pullToRefresh:`引っ張って更新`,refreshing:`更新中…`,openRecord:`レコードを開く`,rowHeight:`行の高さ: {{mode}}`,openMenu:`メニューを開く`,empty:`空`,yes:`はい`,no:`いいえ`,systemFields:`システム`,toolbar:{densityMode:`密度`,densityCompact:`コンパクト`,densityComfortable:`標準`,densitySpacious:`広め`,densityCycleHint:`{{label}}(クリックで切り替え)`,densityCycleShortHint:`クリックで切り替え`},import:{title:`{{object}}をインポート`,stepUpload:`アップロード`,stepMapping:`マッピング`,stepPreview:`プレビュー`,uploadDescription:`CSVファイルをアップロードして開始してください。`,mappingDescription:`CSV列をオブジェクトフィールドにマッピングします。`,previewDescription:`インポート前にデータを確認してください。`,dragDrop:`CSVファイルをここにドラッグ&ドロップするか、クリックして参照`,browseFiles:`ファイルを参照`,onlyCsv:`CSVファイルのみサポートされています。`,fileNeedsHeader:`ファイルにはヘッダー行と少なくとも1行のデータが必要です。`,mappingTemplate:`マッピングテンプレート:`,chooseTemplate:`テンプレートを選択…`,noSavedTemplates:`保存されたテンプレートはありません`,noneOption:`— なし —`,saveCurrent:`現在を保存`,templateName:`テンプレート名`,save:`保存`,deleteTemplate:`テンプレートを削除`,csvColumn:`CSV列`,mapsTo:`マッピング先`,status:`ステータス`,skipColumn:`列をスキップ`,skip:`— スキップ —`,mapped:`マッピング済み`,skipped:`スキップ済み`,rowsWithErrors:`{{count}} 行にエラー`,rowsCorrected:`{{count}} 行が修正されました`,clickToFix:`— ハイライトされたセルをクリックしてインラインで修正。`,showingRows:`{{total}} 行中 {{shown}} 行を表示`,importing:`インポート中… {{progress}}%`,importComplete:`インポート完了`,imported:`{{count}} 件インポートされました`,skippedCount:`{{count}} 件スキップされました`,moreErrors:`…他 {{count}} 件のエラー`,cancel:`キャンセル`,back:`戻る`,next:`次へ`,close:`閉じる`,importNRows:`{{count}} 行をインポート`,importingProgress:`インポート中…`,requiredMark:`*`,required:`必須`,invalidType:`無効な{{type}}`}},calendar:{today:`今日`,month:`月`,week:`週`,day:`日`,agenda:`予定表`,allDay:`終日`,noEvents:`予定はありません`,newEvent:`新しい予定`,moreEvents:`+{{count}} 件`},list:{loading:`Loading records...`,recordCount:`{{count}} 件のレコード`,recordCountOne:`{{count}} 件のレコード`,addRecord:`レコードを追加`,tabs:`タブ`,allRecords:`すべてのレコード`,search:`検索`,filter:`フィルター`,filterRecords:`レコードをフィルター`,sort:`並べ替え`,sortRecords:`レコードを並べ替え`,group:`グループ`,groupBy:`グループ化`,export:`エクスポート`,exportAs:`{{format}}としてエクスポート`,color:`色`,rowColor:`行の色`,colorByField:`フィールドで色分け`,clear:`クリア`,none:`なし`,hideFields:`フィールドを非表示`,noItems:`項目が見つかりません`,noItemsMessage:`表示するレコードがありません。フィルターを調整するか、新しいデータを追加してください。`,showAll:`すべて表示`,pullToRefresh:`引っ張って更新`,refreshing:`更新中…`,share:`共有`,print:`印刷`,hideFieldsTitle:`フィールドを非表示`,dataLimitReached:`最初の {{limit}} 件のレコードを表示しています。さらにデータがある場合があります。`,viewSettings:`ビュー設定`,viewSettingsHint:`グループ化、色、密度、表示フィールド。`,addGroup:`グループフィールドを追加`,collapsedByDefault:`デフォルトで折りたたむ`,removeGroup:`削除`},kanban:{addCard:`カードを追加`,addColumn:`カラムを追加`,moveCard:`カードを移動`,deleteCard:`カードを削除`,deleteColumn:`カラムを削除`,noCards:`カードがありません`,cardTitlePlaceholder:`カードのタイトルを入力...`},timeline:{bucket:{overdue:`期限超過`,today:`今日`,tomorrow:`明日`,thisWeek:`今週`,nextWeek:`来週`,later:`後ほど`,noDate:`日付なし`,unassigned:`未割当`}},gantt:{column:{taskName:`タスク名`,start:`開始`,end:`終了`},toolbar:{prevPeriod:`前の期間`,nextPeriod:`次の期間`,zoomIn:`拡大`,zoomOut:`縮小`,jumpToToday:`今日に移動`,today:`今日`,showTaskList:`タスクリストを表示`,hideTaskList:`タスクリストを非表示`}},view:{editViewConfig:`ビュー設定を編集`,rename:`名前を変更`,duplicateView:`ビューを複製`,shareView:`ビューを共有`,setAsDefault:`デフォルトに設定`,pinView:`ビューをピン留め`,unpinView:`ピン解除`,changeViewType:`ビュータイプを変更`,deleteView:`ビューを削除`,addView:`ビューを追加`,unsavedChanges:`未保存の変更`,saveAsView:`ビューとして保存`,moreViews:`あと {{count}} 件`,activeFilters:`フィルター適用中`,activeSort:`ソート適用中`,manageViews:`ビューを管理`,manageAllViews:`すべてのビューを管理…`,manageViewsDescription:`このオブジェクトのすべてのビューを並べ替え、名前変更、固定、削除できます。`,searchViews:`ビューを検索`,addNewView:`新しいビューを追加`,done:`完了`,noViewsFound:`検索に一致するビューはありません。`,dragToReorder:`ドラッグして並べ替え`,defaultView:`デフォルトビュー`,defaultBadge:`デフォルト`,tabActionsFor:`{{name}} のビュー操作`,readonlyAriaLabel:`読み取り専用ビュー`,readonlyTooltip:`システムビュー — 複製してカスタマイズしてください。`},designer:{undo:`Undo`,redo:`Redo`},detail:{back:`戻る`,edit:`編集`,editInline:`編集`,save:`保存`,saveChanges:`変更を保存`,editFieldsInline:`フィールドを編集`,share:`共有`,duplicate:`複製`,export:`エクスポート`,viewHistory:`履歴を表示`,delete:`削除`,moreActions:`その他の操作`,addToFavorites:`お気に入りに追加`,removeFromFavorites:`お気に入りから削除`,previousRecord:`前のレコード`,nextRecord:`次のレコード`,recordOf:`{{current}} / {{total}}`,recordNotFound:`レコードが見つかりません`,recordNotFoundDescription:`お探しのレコードは存在しないか、削除された可能性があります。`,goBack:`戻る`,details:`詳細`,related:`関連`,relatedRecords:`{{count}} 件のレコード`,relatedRecordOne:`{{count}} 件のレコード`,noRelatedRecords:`関連レコードが見つかりません`,loading:`読み込み中...`,copyToClipboard:`クリップボードにコピー`,copied:`コピーしました!`,deleteConfirmation:`このレコードを削除してもよろしいですか?`,editRecord:`レコードを編集`,viewAll:`すべて表示`,new:`新規`,emptyValue:`—`,activity:`アクティビティ`,editRow:`編集`,deleteRow:`削除`,deleteRowConfirmation:`このレコードを削除してもよろしいですか?`,actions:`操作`,previousPage:`前へ`,nextPage:`次へ`,pageOf:`ページ {{current}} / {{total}}`,sortBy:`並べ替え`,filterPlaceholder:`フィルター...`,highlightFields:`主要フィールド`,comments:`コメント`,searchComments:`コメントを検索…`,addCommentPlaceholder:`コメントを追加… (Ctrl+Enterで送信)`,noMatchingComments:`一致するコメントがありません`,noCommentsYet:`コメントはまだありません`,pinned:`ピン留め`,pin:`ピン留め`,unpin:`ピン解除`,justNow:`たった今`,minutesAgo:`{{count}}分前`,hoursAgo:`{{count}}時間前`,daysAgo:`{{count}}日前`,dropFilesToUpload:`ファイルをここにドロップまたはクリックしてアップロード`,attachmentCount:`{{count}} 件の添付ファイル`,attachmentCountPlural:`{{count}} 件の添付ファイル`,removeAttachment:`添付ファイルを削除`,unifiedDiff:`統合差分`,sideBySideDiff:`横並び差分`,noChanges:`変更なし`,previousVersion:`前のバージョン`,currentVersion:`現在のバージョン`,discussion:`ディスカッション`,showDiscussion:`ディスカッションを表示 ({{count}})`,hideDiscussion:`ディスカッションを非表示`,bold:`太字 (Ctrl+B)`,italic:`斜体 (Ctrl+I)`,listFormat:`リスト`,inlineCode:`インラインコード`,mentionSomeone:`メンションする`,preview:`プレビュー`,submitComment:`送信 (Ctrl+Enter)`,sendComment:`送信`,writeComment:`コメントを入力…`,subscribedTooltip:`購読中 — クリックで解除`,unsubscribedTooltip:`通知を購読`,firstRecord:`最初のレコード (Home)`,previousRecordKey:`前のレコード (←)`,nextRecordKey:`次のレコード (→)`,lastRecord:`最後のレコード (End)`,noRecords:`レコードなし`,searchWhileNavigating:`ナビゲーション中に検索`,searchRecords:`レコードを検索…`,allActivity:`すべてのアクティビティ`,commentsOnly:`コメントのみ`,fieldChangesFilter:`フィールド変更`,tasksOnly:`タスクのみ`,leaveCommentPlaceholder:`コメントを入力… (Ctrl+Enterで送信)`,noActivity:`アクティビティの記録なし`,loadMore:`さらに読み込む`,edited:`(編集済み)`,via:`{{source}} 経由`,replyCount:`{{count}} 件の返信`,replyCountPlural:`{{count}} 件の返信`,replyPlaceholder:`返信…`,filterActivity:`アクティビティをフィルター`,openDiscussion:`ディスカッションパネルを開く`,closeDiscussion:`ディスカッションパネルを閉じる`,subscribeAriaLabel:`通知を購読`,unsubscribeAriaLabel:`通知の購読を解除`,clearSearch:`検索をクリア`,saving:`保存中…`,lockedByApproval:`承認のためロック中`,lockedTooltip:`このレコードには承認待ちのリクエストがあります。編集はロックされています`,cancelApproval:`承認を取り消す`,cancelApprovalInFlight:`取り消し中…`,cancelApprovalTooltip:`承認待ちリクエストを取り消してレコードのロックを解除する`,cancelApprovalFailed:`承認の取り消しに失敗しました`,cancelApprovalUnavailable:`このデータソースでは承認の取り消しはサポートされていません`,linkCopied:`リンクをクリップボードにコピーしました`,linkCopyFailed:`リンクのコピーに失敗しました`,cancel:`キャンセル`,cancelEdit:`変更を破棄`,sectionMoreDetails:`詳細情報`,concurrentUpdateTitle:`このレコードは他のユーザーによって変更されました`,concurrentUpdateDescription:`編集中に他のユーザーが {{field}} の新しいバージョンを保存しました。変更を上書きしないよう、競合の解決方法を選択してください。`,concurrentUpdateYourEdit:`自分の編集`,concurrentUpdateCurrentValue:`現在の値`,concurrentUpdateUpdatedBy:`{{name}} が更新`,concurrentUpdateUpdatedAt:`{{when}} に更新`,concurrentUpdateReload:`最新を読み込む`,concurrentUpdateOverwrite:`上書きする`,concurrentUpdateCancel:`キャンセル`,openInNewTab:`新しいタブで開く`,history:`履歴`,deleteRowTitle:`レコードを削除`,createdBy:`作成者`,updatedBy:`更新者`,showEmptyRelated_one:`+ {{count}} 件(空)`,showEmptyRelated_other:`+ {{count}} 件(空)`,copyEmail:`メールをコピー`,copyPhone:`電話番号をコピー`,copyRecordId:`レコードIDをコピー`,showEmptyFields:`{{count}} 件の空フィールドを表示`,hideEmptyFields:`空フィールドを非表示`,noValue:`値なし`},chart:{noData:`チャートデータがありません`,loading:`チャート読み込み中...`},map:{searchLocations:`場所を検索…`,locationDetails:`場所の詳細`,markersCount:`{{count}} 個のマーカー`,invalidCoordinates:`座標が欠落または無効なため、{{count}} 件のレコードが地図から除外されました。`,invalidCoordinatesPlural:`座標が欠落または無効なため、{{count}} 件のレコードが地図から除外されました。`},workflow:{draft:`下書き`,active:`アクティブ`,paused:`一時停止`,completed:`完了`,cancelled:`キャンセル`,save:`保存`,publish:`公開`,addNode:`ノードを追加`,workflowFlow:`ワークフロー`,properties:`プロパティ`,connections:`接続`,quickConnect:`クイック接続`,fromPlaceholder:`開始...`,toPlaceholder:`終了...`,connect:`接続`,label:`ラベル`,type:`タイプ`,description:`説明`,assignee:`担当者`,assigneeType:`担当者タイプ`,user:`ユーザー`,role:`ロール`,group:`グループ`,expression:`式`,timeoutMinutes:`タイムアウト(分)`,selectNodeToEdit:`ノードを選択してプロパティを編集`,workflowTitle:`ワークフロータイトル`,newWorkflow:`新規ワークフロー`,outConnections:`{{count}} 個の出力`,start:`開始`,end:`終了`,task:`タスク`,userTask:`ユーザータスク`,serviceTask:`サービスタスク`,scriptTask:`スクリプトタスク`,approval:`承認`,condition:`条件`,parallelGateway:`並列ゲートウェイ`,joinGateway:`結合ゲートウェイ`,boundaryEvent:`境界イベント`,delay:`遅延`,notification:`通知`,webhook:`Webhook`,allowConcurrency:`許可(並行実行)`,forbidConcurrency:`禁止(新規スキップ)`,replaceConcurrency:`置換(既存キャンセル)`,queueConcurrency:`キュー(完了後に実行)`,conditionEvent:`条件`,manualEvent:`手動`,webhookEvent:`Webhook`,timerEvent:`タイマー`,signalEvent:`シグナル`,versionHistory:`バージョン履歴`,importBpmn:`BPMNをインポート`,exportBpmn:`BPMNをエクスポート`,undo:`元に戻す`,redo:`やり直す`,resetZoom:`ズームをリセット`},dashboard:{addWidget:`ウィジェットを追加`,removeWidget:`ウィジェットを削除`,editLayout:`レイアウトを編集`,saveLayout:`レイアウトを保存`,resetLayout:`レイアウトをリセット`,total:`合計`,noDataAvailable:`データがありません`,noDataSourceFor:`データソースが利用できません:`,trend:{vsLastQuarter:`前四半期比`,vsLastMonth:`先月比`,vsLastWeek:`先週比`,vsLastYear:`前年比`,vsYesterday:`昨日比`,vsPreviousPeriod:`前期比`}},configPanel:{save:`保存`,discard:`破棄`,close:`閉じる`,layout:`レイアウト`,columns:`列数`,gap:`間隔`,rowHeight:`行の高さ`,data:`データ`,refreshInterval:`更新間隔`,appearance:`外観`,title:`タイトル`,showDescription:`説明を表示`,theme:`テーマ`,configuration:`設定`,general:`基本`,advanced:`詳細`},appDesigner:{createApp:`アプリケーション作成`,editApp:`アプリケーション編集`,basicInfo:`基本情報`,objects:`オブジェクト`,navigation:`ナビゲーション`,branding:`ブランディング`,appName:`アプリ名`,appTitle:`タイトル`,appDescription:`説明`,appIcon:`アイコン`,template:`テンプレート`,layout:`レイアウト`,layoutSidebar:`サイドバー`,layoutHeader:`ヘッダー`,layoutEmpty:`空`,selectObjects:`オブジェクトを選択`,searchObjects:`オブジェクトを検索…`,selectAll:`すべて選択`,deselectAll:`すべて解除`,navBuilder:`ナビゲーションビルダー`,addGroup:`グループを追加`,addUrl:`URLを追加`,addSeparator:`区切りを追加`,noNavItems:`ナビゲーション項目がありません。`,logoUrl:`ロゴURL`,primaryColor:`プライマリカラー`,faviconUrl:`ファビコンURL`,preview:`プレビュー`,complete:`完了`,snakeCaseHint:`snake_case形式が必要です(例: my_app)`,modeEdit:`編集`,modePreview:`プレビュー`,modeCode:`コード`,addWidget:`ウィジェットを追加`,widgetProperties:`ウィジェットプロパティ`,dataSource:`データソース`,valueField:`値フィールド`,aggregate:`集計`,colorVariant:`カラーバリアント`,addComponent:`コンポーネントを追加`,componentProperties:`コンポーネントプロパティ`,viewType:`ビュータイプ`,fields:`フィールド`,toolbar:`ツールバー`,showSearch:`検索を表示`,showFilters:`フィルターを表示`,showSort:`ソートを表示`,appearance:`外観`,rowHeight:`行高さ`,stripedRows:`ストライプ行`,bordered:`枠線`,livePreview:`リアルタイムプレビュー`,stepBasicDesc:`名前、タイトル、レイアウト`,stepObjectsDesc:`ビジネスオブジェクトを選択`,stepNavigationDesc:`ナビゲーションツリーを構築`,stepBrandingDesc:`ロゴ、色、ファビコン`,noObjectsFound:`オブジェクトが見つかりません。`,noNavItemsHint:`ナビゲーション項目がありません。前のステップでオブジェクトを選択するか、手動で追加してください。`,separator:`セパレーター`,separatorLabel:`— セパレーター —`,newGroup:`新しいグループ`,newLink:`新しいリンク`,saveDraft:`下書き保存`,cancelConfirmTitle:`変更を破棄しますか?`,cancelConfirmMessage:`保存されていない変更があります。キャンセルしてもよろしいですか?`,confirmDiscard:`破棄`,keepEditing:`編集を続ける`,navNoItems:`ナビゲーション項目がありません。上のボタンをクリックして追加してください。`,navNoPreviewItems:`項目なし`,navLivePreview:`ライブプレビュー`,navCollapseGroup:`グループを折りたたむ`,navExpandGroup:`グループを展開`,navAddChild:`子項目を追加`,navMoveUp:`上に移動`,navMoveDown:`下に移動`,navRemove:`削除`,navObjectPage:`オブジェクトページ`,navDashboard:`ダッシュボード`,navPage:`ページ`,navReport:`レポート`,navGroup:`グループ`,navUrl:`URL`,navSeparator:`区切り`,navTypeObject:`オブジェクト`,navTypeDashboard:`ダッシュボード`,navTypePage:`ページ`,navTypeReport:`レポート`,navTypeUrl:`URL`,navTypeGroup:`グループ`,navTypeSeparator:`区切り`,navTypeAction:`アクション`,navEditIcon:`アイコンを編集`,navToggleVisible:`表示を切り替え`,navHidden:`非表示`,navExportSchema:`JSON エクスポート`,navImportSchema:`JSON インポート`,navExportSuccess:`ナビゲーションスキーマをエクスポートしました`,navImportSuccess:`ナビゲーションスキーマをインポートしました`,navImportError:`無効なナビゲーションJSON`,navIconPlaceholder:`アイコン名(例:Users)`,dashboardEditor:`ダッシュボードエディター`,noWidgets:`ウィジェットがありません。上のボタンをクリックして追加してください。`,widgetLayoutSize:`レイアウトサイズ`,widgetWidth:`幅`,widgetHeight:`高さ`,dashboardPreview:`ダッシュボードプレビュー`,noWidgetsPreview:`プレビューするウィジェットがありません`,pageCanvasEditor:`ページキャンバスエディター`,emptyPage:`空のページ。上のボタンをクリックしてコンポーネントを追加してください。`,pagePreview:`ページプレビュー`,noComponentsPreview:`プレビューするコンポーネントがありません`,modePage:`ページ`,modeDashboard:`ダッシュボード`,undo:`元に戻す`,redo:`やり直す`,brandingEditor:`ブランディングエディター`,brandingExport:`JSON エクスポート`,brandingImport:`JSON インポート`,brandingPreview:`プレビュー`,brandingSampleButton:`サンプルボタン`,brandingSampleText:`ブランドテーマの外観です。`,colorPalette:`カラーパレット`,fontFamily:`フォントファミリー`,fontDefault:`デフォルト(システム)`,modeLight:`ライト`,modeDark:`ダーク`,mobilePreview:`モバイルプレビュー`,objectManager:{title:`オブジェクトマネージャー`,addObject:`新しいオブジェクト`,searchPlaceholder:`オブジェクトを検索…`,noObjects:`オブジェクトが見つかりません。`,objectName:`API名`,objectLabel:`ラベル`,pluralLabel:`複数ラベル`,icon:`アイコン`,selectIcon:`アイコンを選択…`,group:`グループ`,noGroup:`グループなし`,sortOrder:`並べ替え順`,enabled:`有効`,relationships:`リレーション`,systemBadge:`システム`,fieldCount:`{{count}} フィールド`,ungrouped:`グループなし`,deleteConfirmTitle:`オブジェクトを削除しますか?`,deleteConfirmMessage:`このオブジェクトとそのすべてのフィールドが永久に削除されます。この操作は元に戻せません。`},fieldDesigner:{title:`フィールドデザイナー`,addField:`新しいフィールド`,searchPlaceholder:`フィールドを検索…`,allTypes:`すべてのタイプ`,noFields:`フィールドが見つかりません。`,fieldName:`API名`,fieldLabel:`ラベル`,fieldType:`タイプ`,fieldGroup:`グループ`,description:`説明`,required:`必須`,unique:`ユニーク`,readOnly:`読み取り専用`,hidden:`非表示`,indexed:`インデックス`,externalId:`外部ID`,trackHistory:`履歴追跡`,defaultValue:`デフォルト値`,placeholder:`プレースホルダー`,referenceTo:`参照先`,formula:`数式`,options:`オプション`,addOption:`オプションを追加`,validationRules:`検証ルール`,addRule:`ルールを追加`,systemBadge:`システム`,ungrouped:`一般`,deleteConfirmTitle:`フィールドを削除しますか?`,deleteConfirmMessage:`このフィールドは永久に削除されます。このフィールドの既存データは失われます。`,basicSection:`基本`,typeSpecificSection:`タイプ設定`,advancedSection:`詳細設定`,typeCategory:{text:`テキスト`,number:`数値`,date:`日付と時刻`,choice:`選択`,relation:`リレーション`,advanced:`詳細`}}},console:{title:`ObjectStack コンソール`,initializing:`アプリケーションを初期化中...`,breadcrumb:{dashboards:`ダッシュボード`,pages:`ページ`,reports:`レポート`,system:`システム`},loadingSteps:{connecting:`データソースに接続中`,loadingConfig:`設定を読み込み中`,preparingWorkspace:`ワークスペースを準備中`},error:{connectionFailed:`サーバーに接続できません`,serverUnreachable:`サーバー {{url}} に接続できません。`,checkServer:`ネットワーク接続、またはバックエンドが稼働していることを確認してください。`,timeout:`接続がタイムアウトしました(10秒)。`},actions:{retry:`再試行`,retrying:`再試行中…`},shortcuts:{title:`キーボードショートカット`,description:`利用可能なすべてのキーボードショートカットのクイックリファレンス。`,groups:{general:`一般`,navigation:`ナビゲーション`,dataViews:`データビュー`,preferences:`設定`},openCommandPalette:`コマンドパレットを開く`,showShortcuts:`キーボードショートカットを表示`,closeDialog:`ダイアログ / パネルを閉じる`,toggleSidebar:`サイドバーを切り替え`,focusSearch:`検索にフォーカス`,createRecord:`新しいレコードを作成`,refreshData:`データを更新`,editRecord:`選択したレコードを編集`,toggleDarkMode:`ダークモードを切り替え`},commandPalette:{placeholder:`コマンドを入力または検索...`,noResults:`結果が見つかりません。`,objects:`オブジェクト`,dashboards:`ダッシュボード`,pages:`ページ`,reports:`レポート`,switchApp:`アプリを切り替え`,current:`現在`,preferences:`設定`,lightTheme:`ライトテーマ`,darkTheme:`ダークテーマ`,systemTheme:`システムテーマ`,actions:`アクション`,openFullSearch:`完全な検索ページを開く`,createApp:`新しいアプリを作成`,searching:`検索中…`,records:`レコード`,recentRecords:`最近閲覧`},errors:{somethingWentWrong:`問題が発生しました`,unexpectedError:`このビューのレンダリング中に予期しないエラーが発生しました。`,tryAgain:`再試行`,goHome:`ホームに戻る`,errorDetails:`エラー詳細(開発モードのみ)`},theme:{toggle:`テーマを切り替え`,light:`ライト`,dark:`ダーク`,system:`システム`},objectView:{systemViewReadonly:`System view defined in code - duplicate to customize.`,expandToPage:`Open as full page`,objectNotFound:`オブジェクトが見つかりません`,objectNotFoundDescription:`オブジェクト「{{objectName}}」は現在の設定に存在しません。`,objectNotFoundHint:`アプリのナビゲーション設定を確認するか、サイドバーから別のオブジェクトを選択してください。`,allRecords:`すべてのレコード`,exitDesignMode:`デザインモードを終了`,enterDesignMode:`デザインモードに入る`,metadataInspector:`メタデータインスペクター`,editView:`ビューを編集`,addView:`ビューを追加`,designTools:`デザインツール`,new:`新規`,configureView:`ビューを設定`,closePanel:`パネルを閉じる`,page:`ページ`,pageConfigHint:`ツールバー、ナビゲーション、ビューシェル設定`,listConfigHint:`このリストタイプのデータレンダリング、列、外観`,general:`一般`,generalHint:`ビューのタイトル、説明、タイプ`,toolbar:`ツールバー`,toolbarHint:`検索、フィルター、ソート、グループ、密度の切り替え`,toolbarEnabledCount:`{{total}} 件中 {{count}} 件有効`,navigationSection:`ナビゲーション`,navigationHint:`行クリック時の動作と詳細ビューの設定`,records:`レコード`,recordsHint:`選択モード、レコード追加、インライン編集`,exportPrint:`エクスポートと印刷`,exportPrintHint:`エクスポート形式、印刷、レコード数の表示`,showAllFields:`すべて表示`,hideAllFields:`すべて非表示`,searchFields:`フィールドを検索...`,title:`タイトル`,description:`説明`,data:`データ`,source:`ソース`,columns:`列`,filterBy:`フィルター条件`,sortBy:`並べ替え条件`,appearance:`外観`,showDescription:`説明を表示`,viewType:`ビュータイプ`,userFilters:`ユーザーフィルター`,enableSearch:`検索を有効化`,enableFilter:`フィルターを有効化`,enableSort:`並べ替えを有効化`,enableHideFields:`フィールド非表示を有効化`,enableGroup:`グループを有効化`,enableColor:`カラーを有効化`,enableDensity:`密度を有効化`,userActions:`ユーザーアクション`,addRecordViaForm:`フォームからレコードを追加`,advanced:`詳細設定`,allowExport:`エクスポートを許可`,recordCount:`{{count}} 件のレコード`,noDescription:`説明なし`,none:`なし`,columnsConfigured:`{{count}} 列`,save:`保存`,discard:`破棄`,createView:`ビューを作成`,newView:`新しいビュー`,typeOptions:`タイプオプション`,groupByField:`グループ化フィールド`,startDateField:`開始日フィールド`,titleField:`タイトルフィールド`,latitudeField:`緯度フィールド`,longitudeField:`経度フィールド`,imageField:`画像フィールド`,dateField:`日付フィールド`,selectField:`フィールドを選択...`,gridOptionsHint:`グリッドビューは上記で設定された列を使用します。`,groupBy:`グループ化`,prefixField:`プレフィックスフィールド`,fields:`フィールド`,fieldsVisible:`{{count}} 件表示`,sortsCount:`{{count}} 件の並べ替え`,filtersCount:`{{count}} 件のフィルター`,endDateField:`終了日フィールド`,color:`カラー`,fieldTextColor:`フィールドテキストカラー`,rowHeight:`行の高さ`,wrapHeaders:`ヘッダーの折り返し`,showFieldDescriptions:`フィールド説明を表示`,collapseAllByDefault:`デフォルトですべて折りたたむ`,striped:`ストライプ行`,bordered:`ボーダーセル`,inlineEdit:`インラインでレコードを編集`,addDeleteRecordsInline:`インラインでレコードを追加/削除`,clickIntoRecordDetails:`レコード詳細をクリックで表示`,navigationMode:`ナビゲーションモード`,navigationWidth:`ナビゲーション幅`,navigationWidthHint:`ドロワー、モーダル、スプリットナビゲーションモードで使用可能`,openNewTab:`新しいタブで開く`,openNewTabHint:`ページおよび新しいウィンドウナビゲーションモードで使用可能`,import:`インポート`,importTitle:`CSVからインポート`,importedToast:`{{count}} 行をインポートしました。`,importedWithSkipped:`{{ok}} 行をインポートしました。{{skipped}} 行をスキップしました。`,showAdvancedSettings:`詳細設定を表示`,showFewerSettings:`設定を減らす`,createViewDesc:`ビュータイプを選択して名前を付けてください。設定は後で変更できます。`,cancel:`キャンセル`,create:`作成`,delete:`削除`,deleteViewTitle:`ビューを削除`,deleteViewConfirm:`ビュー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。`,bulkDeleteConfirm:`選択した {{count}} 件のレコードを削除しますか?この操作は元に戻せません。`,duplicateViewName:`この名前のビューはすでに存在します。`,viewTypeGrid:`グリッド`,viewTypeGridDesc:`スプレッドシート形式のレコード一覧。`,viewTypeKanban:`かんばん`,viewTypeKanbanDesc:`単一選択フィールドでカードをカラムにグループ化。`,viewTypeCalendar:`カレンダー`,viewTypeCalendarDesc:`日付でレコードを月次カレンダーに配置。`,viewTypeGallery:`ギャラリー`,viewTypeGalleryDesc:`添付フィールドで大きな画像カードを表示。`,viewTypeTimeline:`タイムライン`,viewTypeTimelineDesc:`水平時間軸にレコードを配置。`,viewTypeGantt:`ガントチャート`,viewTypeGanttDesc:`開始/終了と依存関係のあるプロジェクトバー。`,viewTypeMap:`マップ`,viewTypeMapDesc:`緯度/経度フィールドから地理マーカーを表示。`,viewTypeChart:`チャート`,viewTypeChartDesc:`集計された棒グラフ/折れ線グラフ/円グラフ。`,groupByFieldHelp:`かんばんはこのフィールドの値でレコードをカラムにグループ化します。`,startDateFieldHelp:`カレンダーはこの日付に一致するセルにレコードを配置します。`,ganttStartDateFieldHelp:`各ガントバーの左端はこの日付を使用します。`,ganttEndDateFieldHelp:`各ガントバーの右端はこの日付を使用します。`,timelineDateFieldHelp:`レコードはこの日付でタイムラインに配置されます。`,latitudeFieldHelp:`緯度座標を提供するフィールド(地理フィールドのみ)。`,longitudeFieldHelp:`経度座標を提供するフィールド(地理フィールドのみ)。`,imageFieldHelp:`ギャラリーのカバーはこの画像または添付フィールドから取得されます。`,selectOption:`選択...`,noEligibleFieldForType:`このタイプに適したフィールドがありません。最初にオブジェクトに追加してください。`,viewTypeUnavailable:`このオブジェクトには「{{field}}」として機能するフィールドがありません。`,viewTypeUnavailableShort:`このオブジェクトではサポートされていません。`,chartType:`チャートタイプ`,chartTypeHelp:`データのレンダリング方法を決定します。`,chartTypeBar:`棒グラフ`,chartTypeLine:`折れ線グラフ`,chartTypePie:`円グラフ`,chartTypeArea:`面積グラフ`,chartTypeScatter:`散布図`,xAxisField:`X軸フィールド`,xAxisFieldHelp:`カテゴリまたは時間の次元。`,yAxisField:`Y軸フィールド`,yAxisFieldHelp:`集計する数値フィールド。`,selectionMode:`選択モード`,selectionNone:`なし`,selectionSingle:`単一`,selectionMultiple:`複数`,pageSize:`ページサイズ`,pageSizeOptions:`ページサイズのオプション`,exportFormats:`エクスポート形式`,exportMaxRecords:`最大レコード数`,exportIncludeHeaders:`ヘッダーを含む`,exportFileNamePrefix:`ファイル名プレフィックス`,searchableFields:`検索可能フィールド`,filterableFields:`フィルター可能フィールド`,resizableColumns:`サイズ変更可能な列`,densityCompact:`コンパクト`,densityComfortable:`標準`,densitySpacious:`広め`,densityMode:`密度モード`,hiddenFields:`非表示フィールド`,rowActions:`行アクション`,bulkActions:`一括アクション`,sharing:`共有`,sharingEnabled:`共有を有効にする`,sharingVisibility:`表示設定`,addRecordEnabled:`レコード追加を有効にする`,addRecordPosition:`位置`,addRecordMode:`モード`,addRecordFormView:`フォームビュー`,conditionalFormatting:`条件付き書式`,addRule:`ルールを追加`,quickFilters:`クイックフィルター`,addQuickFilter:`クイックフィルターを追加`,ufElements:`要素`,ufDropdown:`ドロップダウン`,ufTabs:`タブ`,ufToggle:`トグル`,ufAddField:`+ フィルターフィールドを追加...`,ufNoFields:`利用可能なフィールドがありません`,ufAddTab:`+ タブを追加`,ufTabLabel:`ラベル`,ufShowAllRecords:`「すべてのレコード」タブを表示`,ufAllowAddTab:`タブの追加を許可`,showRecordCount:`レコード数を表示`,allowPrinting:`印刷を許可`,virtualScroll:`仮想スクロール`,emptyStateTitle:`空の状態のタイトル`,emptyStateMessage:`空の状態のメッセージ`,emptyStateIcon:`空の状態のアイコン`,ariaLabel:`ARIAラベル`,ariaDescribedBy:`ARIA説明`,ariaLive:`ARIAライブ`,accessibility:`アクセシビリティ`,viewTabs:`ビュータブ`},localeSwitcher:{label:`言語`},search:`検索…`,nav:{pinItem:`{{name}} をピン留め`,unpinItem:`{{name}} のピンを外す`,dragToReorder:`ドラッグして並べ替え`,favorites:`お気に入り`}},auth:{login:{title:`アカウントにサインイン`,description:`メールアドレスとパスワードを入力してください`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,passwordLabel:`パスワード`,passwordPlaceholder:`パスワードを入力`,forgotPasswordText:`パスワードをお忘れですか?`,submitButton:`サインイン`,submittingButton:`サインイン中...`,noAccountText:`アカウントをお持ちでないですか?`,signUpText:`新規登録`,errors:{invalidCredentials:`メールアドレスまたはパスワードが正しくありません。再試行してください。`,emailNotVerified:`サインインする前にメールアドレスを確認してください。`}},register:{title:`アカウントを作成`,description:`情報を入力して始めましょう`,nameLabel:`名前`,namePlaceholder:`田中太郎`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,passwordLabel:`パスワード`,passwordPlaceholder:`パスワードを作成(8文字以上)`,confirmPasswordLabel:`パスワード確認`,confirmPasswordPlaceholder:`パスワードを再入力`,passwordMismatchError:`パスワードが一致しません`,passwordTooShortError:`パスワードは8文字以上必要です`,submitButton:`アカウント作成`,submittingButton:`アカウント作成中...`,hasAccountText:`すでにアカウントをお持ちですか?`,signInText:`サインイン`,errors:{userExists:`このメールアドレスのアカウントはすでに存在します。代わりにサインインしてください。`},verifyInbox:{title:`受信箱を確認してください`,description:`{{email}} に確認リンクを送信しました。リンクをクリックしてアカウントを有効にしてください。`,resend:`確認メールを再送信`,resending:`送信中…`,resent:`確認メールが送信されました。`,backToSignIn:`サインインに戻る`}},forgotPassword:{title:`パスワードをリセット`,description:`メールアドレスを入力してください。パスワードリセットリンクをお送りします`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,submitButton:`リセットリンクを送信`,submittingButton:`送信中...`,successTitle:`メールをご確認ください`,successDescription:`{{email}} にパスワードリセットリンクを送信しました。受信箱をご確認ください。`,backToSignInText:`サインインに戻る`,rememberPasswordText:`パスワードを覚えていますか?`,signInText:`サインイン`},resetPassword:{title:`新しいパスワードを設定`,description:`以前に使用していないパスワードを選択してください。`,newPassword:`新しいパスワード`,confirmPassword:`パスワードの確認`,submit:`パスワードを更新`,submitting:`更新中…`,success:`パスワードが更新されました`,failed:`リセットに失敗しました`,invalidToken:`このリセットリンクは無効か期限切れです。`,missingToken:`リセットリンクが見つからないか期限切れです`,passwordsMismatch:`パスワードが一致しません`,requestNewLink:`新しいリンクをリクエスト`},verifyEmail:{title:`メールアドレスを確認してください`,description:`メールアドレスに確認リンクを送信しました。リンクをクリックしてアカウントを確認してください。`,sentTo:`送信先:`,verifyingTitle:`確認中…`,verifyingDescription:`メールを確認中です。少々お待ちください。`,successTitle:`メールが確認されました`,successDescription:`メールが確認されました。サインインできます。`,errorTitle:`確認に失敗しました`,errorDescription:`確認に失敗しました。新しいリンクをリクエストしてください。`,missingToken:`確認リンクにトークンがありません。`,emailMissing:`メールアドレスがありません`,resendButton:`確認メールを再送信`,resending:`送信中…`,resent:`メールが送信されました!受信箱を確認してください`,resentSuccess:`確認メールが送信されました!`,resentDescription:`受信箱を確認して確認リンクをクリックしてください。`,resendFailed:`確認メールを再送信できません`,signInLink:`サインインへ`,backToSignIn:`サインインに戻る`,backToLogin:`ログインに戻る`,checkSpam:`メールが届きませんか?スパムフォルダーを確認するか、サポートに連絡してください。`,or:`または`},setup:{welcomeTitle:`ObjectStackへようこそ`,description:`このデプロイメントの設定を完了するために、最初のオーナーアカウントを作成してください。`,yourName:`お名前`,orgName:`組織名`,orgNamePlaceholder:`Acme Inc.`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,passwordLabel:`パスワード`,passwordHint:`最低8文字`,submit:`オーナーアカウントを作成`,submitting:`設定中…`,failed:`設定に失敗しました`},device:{title:`新しいデバイスを認証`,subtitle:`{{email}} としてサインインするためにこのデバイスを承認します。`,userCodeLabel:`デバイスコード`,requesterLabel:`接続リクエスト元`,approveWarning:`この接続を直前にご自身で開始した場合にのみ承認してください。承認すると、このランタイムは組織のプライベートパッケージにアクセスできます。`,loggedInAs:`{{email}} としてサインイン中`,approve:`デバイスを承認`,approving:`承認中…`,approvedTitle:`デバイスが認証されました`,approvedDescription:`デバイスに戻ることができます。まもなくサインインするはずです。`,approveSuccess:`デバイスが認証されました`,approveSuccessDescription:`このウィンドウを閉じることができます。`,approveFailed:`承認に失敗しました`,deny:`リクエストを拒否`,denying:`拒否中…`,deniedTitle:`アクセスが拒否されました`,deniedDescription:`このデバイスはアクセスを許可されません。`,denyFailed:`リクエストの拒否に失敗しました`,invalidTitle:`無効なデバイスリンク`,invalidDescription:`URLにデバイスコードが指定されていません。`,loading:`読み込み中…`,cancel:`キャンセル`},shell:{tenantHostHint:`このワークスペースにサインインしています`}},errors:{networkError:`ネットワークエラーです。接続を確認してください。`,serverError:`サーバーエラーです。後でもう一度お試しください。`,notFound:`リソースが見つかりません。`,unauthorized:`この操作を実行する権限がありません。`,forbidden:`アクセスが拒否されました。`,timeout:`リクエストがタイムアウトしました。もう一度お試しください。`,unknown:`予期しないエラーが発生しました。`},workspace:{label:`ワークスペース`,default:`マイワークスペース`,switch:`ワークスペースを切り替え`,create:`ワークスペースを作成`,createTitle:`ワークスペースの作成`,createDescription:`ワークスペースはチームで協力するための共有スペースです。`,createButton:`ワークスペースを作成`,nameLabel:`ワークスペース名`,namePlaceholder:`例: Acme Inc`,slugLabel:`URL スラッグ`,slugHint:`URL に使用されます。小文字、数字、ハイフンのみ。`,invite:`メンバーを招待`,members:`メンバー`,settings:`ワークスペース設定`},help:{appDocs:`このアプリのドキュメント`,allDocs:`すべてのドキュメント`,onlineDocs:`オンラインドキュメント`},sidebar:{settings:`設定`,help:`ヘルプ`,helpTooltip:`ヘルプとドキュメント`,activityFeed:`アクティビティフィード`,notifications:`通知`,approvals:`承認`,inbox:`受信箱`,inboxAriaLabel:`受信箱を開く`,area:`エリア`,scope:`スコープ`,recent:`最近`,favorites:`お気に入り`,starred:`スター付き`,removeFromFavorites:`お気に入りから {{name}} を削除`},topbar:{aiAssistant:`AI アシスタント`},home:{title:`ホーム`,subtitle:`ワークスペースのダッシュボード`,nav:`ホーム`,allApps:`すべてのアプリケーション`,loading:`ワークスペースを読み込み中...`,recent:`最近`,starred:`スター付き`,welcome:`ObjectUI へようこそ`,welcomeDescription:`最初のアプリケーションを作成するか、システム設定を行ってください。`,createFirstApp:`最初のアプリを作成`,systemSettings:`システム設定`,browseMarketplace:`アプリマーケットプレイスを参照`,quickActions:{title:`クイックアクション`,createApp:`アプリを作成`,createAppDesc:`新しいアプリケーションを開始`,manageObjects:`オブジェクトを管理`,manageObjectsDesc:`データモデルを設定`,systemSettings:`システム設定`,systemSettingsDesc:`ワークスペースを設定`},appCard:{noDescription:`説明なし`,default:`デフォルト`},greetingMorning:`おはようございます`,greetingAfternoon:`こんにちは`,greetingEvening:`こんばんは`,greetingNight:`夜遅くまで作業中`,heroTagline:`前回の続きを始めるか、新しいものを探索してください。`,open:`開く`,stats:{apps:`アプリケーション`,starred:`スター付き`,recent:`最近のアイテム`},recentApps:{title:`最近アクセスしたもの`,itemType:{object:`オブジェクト`,dashboard:`ダッシュボード`,page:`ページ`,record:`レコード`}},starredApps:{title:`スター付き`},gettingStarted:{title:`ホームをカスタマイズ`,description:`アプリにスターを付けてここにピン留めし、ワンクリックでアクセスできます。開いたものはすべて「最近アクセスしたもの」に自動的に表示されます。`,cta:`すべてのアプリを参照`}},layout:{appSwitcher:{home:`ホーム`,addApp:`アプリを追加`,editApp:`アプリを編集`,manageAllApps:`すべてのアプリを管理`,systemConsole:`システムコンソール`,noAppsConfigured:`アプリが設定されていません`},activityFeed:{title:`最近の活動`,filter:`フィルター`,empty:`最近の活動はありません`,ariaLabel:`アクティビティフィード`,typeCreate:`作成`,typeUpdate:`更新`,typeDelete:`削除`,typeComment:`コメント`,relativeJustNow:`たった今`,relativeSecondsAgo:`{{count}}秒前`,relativeMinutesAgo:`{{count}}分前`,relativeHoursAgo:`{{count}}時間前`,relativeDaysAgo:`{{count}}日前`,viewAll:`すべての活動を表示`},metadata:{label:`メタデータ`,toggleTitle:`メタデータインスペクターを切り替え`,panelTitle:`メタデータインスペクター`,jsonBadge:`JSON`,copyJson:`JSONをコピー`}},search:{title:`検索`,back:`戻る`,placeholder:`オブジェクト、ダッシュボード、ページ、レポートを検索...`,inputAriaLabel:`オブジェクト、ダッシュボード、ページ、レポートを検索`,resultsCount:`"{{query}}" の結果 {{count}} 件`,resultsCountPlural:`"{{query}}" の結果 {{count}} 件`,itemsAvailable:`{{count}} 件利用可能`,noResults:`結果が見つかりません`,noResultsHint:`検索語句を調整してみてください`,typeObjects:`オブジェクト`,typeDashboards:`ダッシュボード`,typePages:`ページ`,typeReports:`レポート`,badgeObject:`オブジェクト`,badgeDashboard:`ダッシュボード`,badgePage:`ページ`,badgeReport:`レポート`},empty:{objectNotFound:`オブジェクトが見つかりません`,objectNotFoundDescription:`オブジェクト「{{name}}」の定義が見つかりません。設定を確認するか、有効なオブジェクトを選択してください。`,pageNotFound:`ページが見つかりません`,pageNotFoundDescription:`ページ「{{name}}」が見つかりません。削除または名前変更された可能性があります。`,dashboardNotFound:`ダッシュボードが見つかりません`,dashboardNotFoundDescription:`ダッシュボード「{{name}}」が見つかりません。削除または名前変更された可能性があります。`,reportNotFound:`レポートが見つかりません`,reportNotFoundDescription:`レポート「{{name}}」が見つかりません。削除または名前変更された可能性があります。`,noAppsConfigured:`アプリが設定されていません`,noAppsConfiguredDescription:`登録されているアプリケーションがありません。最初のアプリを作成するか、システム設定を参照してください。`,createFirstApp:`最初のアプリを作成`,systemSettings:`システム設定`,back:`戻る`,recordNotFound:`レコードが見つかりません`,recordNotFoundDescription:`お探しのレコードは存在しないか、削除された可能性があります。`},renderer:{noPageSchema:`ページスキーマが指定されていません`,noFormSchema:`フォームスキーマが指定されていません`,noDashboardSchema:`ダッシュボードスキーマが指定されていません`,pageRendering:`ページレンダリング中:{{name}}`,dashboardRendering:`ダッシュボードレンダリング中:{{name}}`,formRenderingMode:`{{mode}} モードでフォームをレンダリング中`,formRenderingFor:`レコード {{id}} 用`,createRecord:`レコードを作成`,editRecord:`レコードを編集`,page:`ページ`,dashboard:`ダッシュボード`,save:`保存`,cancel:`キャンセル`},actionDialog:{title:`アクションパラメーター`,description:`続行するために必要な情報を入力してください。`,selectPlaceholder:`{{label}} を選択`,requiredError:`{{label}} は必須です`,cancel:`キャンセル`,confirm:`確認`,defaultActionTitle:`アクション`,ok:`OK`,lookupPlaceholder:`{{label}} のレコードID(UUID)を貼り付け`,lookupHelpText:`参照オブジェクトのレコードIDを入力してください。ピッカーは近日公開予定です。`},actionConfirm:{title:`操作の確認`,confirm:`続行`,cancel:`キャンセル`},rowAction:{openMenu:`メニューを開く`,edit:`編集`,delete:`削除`},navigationSync:{addedPage:`ナビゲーション更新:ページ「{{name}}」を追加しました`,addedDashboard:`ナビゲーション更新:ダッシュボード「{{name}}」を追加しました`,removedPage:`ナビゲーション更新:ページ「{{name}}」を削除しました`,removedDashboard:`ナビゲーション更新:ダッシュボード「{{name}}」を削除しました`,renamedPage:`ナビゲーション更新:ページ「{{oldName}}」を「{{newName}}」に名前変更しました`,renamedDashboard:`ナビゲーション更新:ダッシュボード「{{oldName}}」を「{{newName}}」に名前変更しました`,undoLabel:`元に戻す`,undone:`ナビゲーションの変更を元に戻しました`,undoFailed:`ナビゲーションの変更を元に戻せませんでした`,updateFailed:`ナビゲーションの更新に失敗しました`},objectActions:{deleteSuccess:`{{label}} を削除しました`,deleteFailed:`{{label}} の削除に失敗しました`,noRecordId:`レコードIDが指定されていません`,deleteConfirm:`このレコードを削除してもよろしいですか?`,bulkDeleteSuccess:`{{count}} 件の {{label}} レコードを削除しました`,bulkDeletePartial:`{{succeeded}} 件削除、{{failed}} 件失敗`},objectViewActions:{renameFailed:`ビューの名前変更に失敗しました`,deleteFailed:`ビューの削除に失敗しました`},dashboardActions:{pdfPreparing:`PDFエクスポートを準備中…`,exportFailed:`エクスポートに失敗しました:{{message}}`,forecastSoon:`予測ビューは近日公開予定`},recordDetail:{viewersTooltip:`このレコードを閲覧中のユーザー`},cellRender:{empty:`空`,yes:`はい`,no:`いいえ`,systemFields:`システム`},user:{profile:`プロフィール`,settings:`設定`,logout:`ログアウト`,preferences:`設定`,theme:`テーマ`,language:`言語`},report:{total:`合計`,rowTotal:`行合計`,columnTotal:`列合計`,grandTotal:`総合計`,totals:`合計`,rowsLabel:`行`,columnsLabel:`列`,allLabel:`(すべて)`,emptyLabel:`(空)`,loading:`読み込み中…`,failedToLoad:`マトリックスの読み込みに失敗しました:{{message}}`,needsAcross:"マトリックスレポートには少なくとも1つの `groupingsAcross` フィールドが必要です。",aggregate:{count:`件数`,countDistinct:`ユニーク件数`,sum:`合計`,avg:`平均`,min:`最小`,max:`最大`,first:`最初`},editor:{breadcrumb:`設定`,basic:`基本`,title:`タイトル`,titlePlaceholder:`例:四半期別パイプライン`,description:`説明`,descriptionPlaceholder:`このレポートは何を示しますか?`,type:`レポートタイプ`,typeTabular:`テーブル — フラットなリスト`,typeSummary:`サマリー — 合計付きグループ化`,typeMatrix:`マトリックス — 行 × 列のピボット`,typeJoined:`結合 — 複数ブロック`,typeHelp:`表示したい内容に合うレイアウトを選択してください。`,data:`データ`,objectName:`データソース`,objectNamePlaceholder:`例:opportunity`,objectNameHelp:`このレポートはどのオブジェクトを照会しますか?`,limit:`行数の上限`,limitPlaceholder:`例:100`,columns:`列`,columnsHint:`列として表示するフィールドを選択します。サマリーやマトリックスでは集計(合計、件数…)を追加できます。`,filters:`フィルタ`,filtersHint:`このレポートに含める行を絞り込みます。`,filtersComplex:`このレポートには高度なフィルタが含まれており、ここでは編集できません。保存時は変更されません。`,groupBy:`グループ化`,groupByHint:`データをグループ化して小計を計算します。`,rows:`行`,rowsHint:`これらのフィールドで行をグループ化します。`,columnsAxis:`列`,columnsAxisHint:`これらのフィールドを上部でピボット表示します。`,values:`値`,valuesHint:`各セルに表示される数値です。1 つ以上のフィールドを選び、集計(合計、件数…)を指定してください。`,grouping:`グループ化項目`,addGrouping:`グループ化を追加`,dateGranularity:`日付の粒度`,dateGranularityNone:`(元の値を使用)`,day:`日`,week:`週`,month:`月`,quarter:`四半期`,year:`年`,sortAsc:`昇順`,sortDesc:`降順`,chart:`チャート`,chartHint:`テーブルの横に表示できる任意の可視化です。`,chartType:`チャートの種類`,chartTitle:`チャートのタイトル`,chartTitlePlaceholder:`未指定の場合はレポートのタイトル`,chartXAxis:`X 軸(カテゴリ)`,chartYAxis:`Y 軸(値)`,chartShowLegend:`凡例を表示`,chartShowDataLabels:`データラベルを表示`,chartNone:`(チャートなし)`,chartBar:`棒`,chartLine:`折れ線`,chartArea:`エリア`,chartPie:`円`,chartDonut:`ドーナツ`,chartFunnel:`ファネル`,validationNeedsObject:`列を追加する前にデータソースを選択してください。`,validationMatrixNeedsRowsCols:`マトリックスレポートには少なくとも 1 つの行と 1 つの列が必要です。`,validationSummaryNeedsRows:`サマリーレポートには少なくとも 1 つのグループ化フィールドが必要です。`,blocks:`ブロック`,blocksHint:`各ブロックは独立したテーブルまたはチャートです。ブロックのフィルタはレポートのフィルタと AND で結合されます。`,addBlock:`ブロックを追加`,removeBlock:`ブロックを削除`,blockName:`ブロック名`,blockNamePlaceholder:`一意のブロック名`,blockLabel:`表示ラベル`,blockLabelPlaceholder:`ブロックの上に表示されます`,blockDescription:`説明`,blockDescriptionPlaceholder:`このブロックの任意の補足説明`,validationJoinedNeedsBlocks:`結合レポートには少なくとも 1 つのブロックが必要です。`,validationBlockNameRequired:`各ブロックには空でない名前が必要です。`,validationBlockNameDuplicate:`ブロック名はレポート内で一意である必要があります。`,validationBlockNeedsColumns:`各ブロックには少なくとも 1 つの列が必要です。`,noneOption:`(なし)`,addCondition:`条件を追加`,combineLogic:`結合方法`,opContains:`含む`,opIsEmpty:`空である`,opIsNotEmpty:`空でない`,formatAuto:`自動`,formatCurrency:`通貨`,formatPercent:`パーセント`,formatInteger:`整数`,formatDate:`日付`,formatDatetime:`日付と時刻`,columnLabelPlaceholder:`ラベルを上書き`,aggregateColumn:`集計`,formatColumn:`フォーマット`,addColumns:`列を追加`,searchFields:`フィールドを検索…`,noMatchingFields:`検索条件に一致するフィールドはありません。`,noFieldsAvailable:`利用可能なフィールドがありません。`,columnsCount:`{n} 列選択中`,columnsEmpty:`列がまだ選択されていません。`,fieldPickerTitle:`フィールドを選択`,fieldPickerDescription:`追加するフィールドを1つ以上選択してください。検索ボックスでリストを絞り込めます。`,fieldPickerChangeTitle:`フィールドを変更`,fieldPickerAddGroupingTitle:`グループ化を追加`,fieldPickerEmpty:`(フィールドを選択)`,fieldPickerSelected:`{n} 件選択中`,fieldPickerClear:`選択を解除`,fieldPickerAdd:`追加`,fieldPickerAddN:`{n} 件追加`}},organizations:{mine:`マイ組織`,title:`組織`,heading:`あなたの組織`,subtitle:`続行する組織を選択するか、新しい組織を作成してください。`,searchPlaceholder:`組織を検索`,new:`新しい組織`,current:`現在の組織`,manage:`管理`,emptyTitle:`まだ組織がありません`,emptyDescription:`最初の組織を作成して開始してください。`,noMatches:`検索条件に一致する組織がありません。`},notifications:{empty:`通知はありません`,markAllRead:`すべて既読にする`,viewAll:`すべての通知を表示`,approvalsPending:`{{count}} 件の承認待ち`,viewApprovals:`承認を表示`,noPendingApprovals:`承認待ちはありません`,openApprovalsInbox:`承認ボックスを開く`,emptyUnread:`既読にしました`,filterUnread:`未読`,filterAll:`すべて`},publicForm:{submit:`送信`,submitting:`送信中…`,submitAnother:`別の回答を送信`,poweredBy:`Powered by ObjectStack`,secureNotice:`お客様の情報は安全に転送され、リクエストへの対応にのみ使用されます。`,thankYouTitle:`ありがとうございます!`,thankYouMessage:`送信が正常に受信されました。`,redirecting:`{{seconds}} 秒後にリダイレクトします…`,unavailableTitle:`フォームが利用できません`,unavailableDescription:`このURLで利用できる公開フォームはありません。基になるビューが匿名共有を有効にし、このスラグに一致することを確認してください。`,tryDemo:`デモを試す`,retry:`再試行`,loading:`フォームを読み込み中…`,requiredHint:`* 必須項目`,consentLabelDefault:`プライバシーポリシーに同意し、このリクエストのためにデータを処理することに同意します。`,consentLink:`プライバシーポリシー`,consentRequired:`続行するにはプライバシーポリシーに同意してください。`,rateLimited:`送信前に回答を確認してください。`,redirectBlocked:`送信は受理されましたが、リダイレクトURLはセキュリティのためブロックされました。`,demo:{contactTitle:`お問い合わせ`,contactDescription:`プロジェクトについてお聞かせください。1営業日以内に営業担当者がご連絡します。`,supportTitle:`サポートリクエストを送信`,supportDescription:`問題をお知らせください。チームが1営業日以内に対応します。`,thankYouSalesTitle:`メッセージを受信しました!ありがとうございます。`,thankYouSalesMessage:`1営業日以内に営業担当者がご連絡します。`,thankYouSupportTitle:`リクエストを受け付けました。`,thankYouSupportMessage:`サポートエンジニアがまもなくフォローアップします。追加のスクリーンショットがある場合は、このページを保存してください。`,field:{firstName:`名`,lastName:`姓`,email:`仕事用メール`,phone:`電話番号`,jobTitle:`役職`,company:`会社`,website:`ウェブサイト`,industry:`業界`,companySize:`会社規模`,howCanWeHelp:`どのようなお手伝いができますか?`,subject:`件名`,description:`説明`,issueType:`問題の種類`,priority:`優先度`},industry:{technology:`テクノロジー`,software:`ソフトウェア / SaaS`,finance:`金融`,healthcare:`ヘルスケア`,retail:`小売`,other:`その他`},issueType:{question:`質問`,problem:`問題`,bug:`バグ`,feature_request:`機能リクエスト`},priority:{low:`低`,medium:`中`,high:`高`,critical:`緊急`}}},marketplace:{title:`アプリマーケットプレイス`,subtitle:`ObjectStackカタログに公開された承認済みアプリを参照します。アプリをクリックして詳細を表示し、環境にインストールしてください。`,searchPlaceholder:`名前またはマニフェストIDでアプリを検索…`,searchAria:`マーケットプレイスアプリを検索`,installed:`インストール済み`,installedCount:`インストール済み({{count}})`,refresh:`更新`,all:`すべて`,noApprovedYet:`マーケットプレイスにはまだ承認されたアプリがありません。`,noMatchFilters:`フィルターに一致するアプリがありません。`,noDescription:`説明がありません。`,back:`マーケットプレイスに戻る`,installedTitle:`インストール済みアプリ`,installedSubtitle:`このランタイムのカーネルにインストールされているマーケットプレイスパッケージ。`,installedEmpty:`このランタイムにはまだマーケットプレイスアプリがインストールされていません。`,browseLink:`マーケットプレイスを参照 →`,installedAdditiveNote:`<strong>注意:</strong>カーネルAPIは追加のみです。アンインストールするとディスク上のマニフェストが削除され、次回起動時にパッケージは読み込まれませんが、実行中のカーネルはランタイムを再起動するまでアプリを登録したままにします。`,installedAt:`{{when}} にインストール`,installedBy:`{{user}} による`,installedPackageId:`パッケージ`,cachedAs:`<code>{{path}}</code> としてキャッシュ`,versionBadge:`v{{version}}`,installedBadge:`インストール済み v{{version}}`,load:{failed:`マーケットプレイスの読み込みに失敗しました`,failedHint:`このランタイムはデフォルトでパブリックObjectStackクラウドを指しています。ランタイムがオンラインであることを確認するか、<code>OS_CLOUD_URL</code> で自己ホスト型コントロールプレーンを指定してください。`,packageFailed:`パッケージの読み込みに失敗しました`,notFound:`見つかりません。`},detail:{homepage:`ホームページ`,installedV:`インストール済み · v{{version}}`,about:`概要`,noReadme:`READMEがありません。`,versions:`バージョン`,noApprovedVersions:`承認済みバージョンがありません。`,prerelease:`プレ`,moreOptions:`その他のインストールオプション`,uninstallFromRuntime:`このランタイムからアンインストール`,addSampleData:`サンプルデータを追加`,reseedAgain:`サンプルデータを再投入`,purgeSampleData:`サンプルデータを削除`,purgeConfirm:`このパッケージが投入したサンプルレコードをすべて削除しますか?ユーザーが追加したレコードは削除されません。`,purgeSuccess:`{{count}} 件のサンプルレコードを削除しました。`,purgeNoData:`削除するサンプルレコードがありません。`,reseedQueued:`サンプルデータは次回の環境アクセス時に再投入されます。`,reseedLocalSuccess:`サンプルデータを再投入しました:{{inserted}} 件追加、{{updated}} 件更新。`,reseedPartialErrors:`({{count}} 件のレコードの書き込みに失敗しました)`,updateAvailable:`アップデートあり`},action:{install:`インストール`,reinstall:`再インストール`,working:`処理中…`,installToCloud:`クラウドにインストール…`,installing:`インストール中…`,uninstall:`アンインストール`,uninstalling:`アンインストール中…`,details:`詳細`,close:`閉じる`,dismiss:`閉じる`,openOnCloud:`クラウドで開く`,backHome:`ホームに戻る`},install:{dialogTitle:`{{name}} をインストール`,dialogDescCurrent:`この環境({{host}})にインストールします。`,dialogDescPicker:`このアプリをインストールする環境を選択します。ObjectStack Cloudにサインインする必要があります。`,environment:`環境`,environmentPlaceholder:`環境を選択`,includeSampleData:`サンプルデータを含む`,noEnvs:`アクティブな組織に環境が見つかりません。`,noPermission:`どの環境にもアプリをインストールする権限がありません。組織のオーナーと管理者のみインストールできます。`,signInFirst:`最初にObjectStack Cloudにサインインしてください。`,success:`インストールが完了しました。環境を開いて新しいアプリを確認してください。`,localSuccess:`このランタイムに v{{version}} をインストールしました。「{{name}}」がアプリスイッチャーに表示されます。`,localManifestConflict:`{{message}}
|
|
10
|
+
磁盘上的清单缓存将被移除。运行中的内核仍会保留该应用,直到下次重启运行时才会真正卸载。`,successInList:`已移除 {{manifestId}}。重启运行时即可从内核中彻底卸载。`,successInDetail:`已移除 {{manifestId}} 的清单缓存。重启运行时即可从内核中彻底卸载该应用。`},accessDenied:{title:`应用市场仅限管理员使用`,description:`你没有权限在本环境中安装应用。请联系组织的所有者或管理员申请权限。`},category:{crm:`客户关系`,erp:`企业资源`,hr:`人力资源`,finance:`财务`,project:`项目管理`,collaboration:`协作`,analytics:`分析`,integration:`集成`,automation:`自动化`,ai:`人工智能`,security:`安全`,"developer-tools":`开发者工具`,"ui-theme":`界面主题`,storage:`存储`,other:`其他`},pricing:{free:`免费`,freemium:`免费增值`,paid:`付费`,subscription:`订阅`,"usage-based":`按用量计费`,"contact-sales":`联系销售`},relativeTime:{today:`今天`,daysAgo:`{{count}} 天前`,monthsAgo:`{{count}} 个月前`,yearsAgo:`{{count}} 年前`}},approvalsInbox:{loadMore:`加载更多`,loadingMore:`加载中…`,loadedOf:`已加载 {{loaded}} / 共 {{total}} 条`,actEscalate:`SLA 升级`,systemSlaActor:`系统(SLA)`,reassignBtn:`转签`,reassignTitle:`将该审批转签给其他人?`,reassignBody:`你的审批席位将转移给所选人员,对方会收到通知并可立即处理。`,reassignTo:`新审批人`,reassignToPlaceholder:`选择用户,或输入邮箱 / role:<角色名>`,reassignSuccess:`已转签给 {{to}}`,requestInfoBtn:`退回补充`,requestInfoTitle:`请申请人补充材料?`,requestInfoBody:`请求保持待审批状态;申请人会收到通知并可在动态中回复。`,requestInfoPlaceholder:`需要申请人补充什么?`,requestInfoSent:`已退回给申请人补充材料`,remindBtn:`催办`,remindSuccess:`已提醒 {{count}} 位审批人`,remindThrottled:`刚刚已发送过催办,请稍后再试。`,replyPlaceholder:`在此回复…`,slaRemaining:`SLA 剩余 {{dur}}`,slaOverdue:`SLA 已超期 {{dur}}`,actReassign:`转签`,actRemind:`催办`,actRequestInfo:`要求补充材料`,actComment:`评论`,stepProgress:`审批步骤`,prevRequest:`上一条`,nextRequest:`下一条`,positionOf:`第 {{index}} / {{total}} 条`,quickPhrase1:`同意,符合要求。`,quickPhrase2:`有条件同意,请关注执行情况。`,quickPhrase3:`请补充相关材料后重新提交。`,title:`审批中心`,subtitle:`查看并处理审批请求。`,refresh:`刷新`,tabMyPending:`待我审批`,tabSubmitted:`我发起的`,tabAll:`全部`,searchPlaceholder:`搜索记录、流程、申请人…`,clearSearch:`清除搜索`,statusFilter:`状态`,allStatuses:`全部状态`,processFilter:`流程`,allProcesses:`全部流程`,objectFilter:`对象`,allObjects:`全部对象`,filterCount:`{{shown}} / {{total}} 条`,selected:`已选择`,actionableCount:`({{count}} 条可操作)`,selectAll:`全选`,selectRow:`选择该请求`,colRequest:`审批事项`,colRecord:`记录`,colRequester:`申请人`,colStatus:`状态`,colWaiting:`提交时间`,colActions:`操作`,statusPending:`待审批`,statusApproved:`已通过`,statusRejected:`已拒绝`,statusRecalled:`已撤回`,statusReturned:`已退回修改`,sendBackBtn:`退回修改`,sendBackTitle:`将该申请退回修改?`,sendBackBody:`本轮审批结束,记录解锁,申请人可修改数据。重新提交后将为所有审批人开启新一轮审批。`,sendBackPlaceholder:`需要修改什么才能通过审批?`,sendBackSuccess:`已退回修改——申请人现在可以编辑并重新提交`,sendBackAutoRejected:`已达退回次数上限——申请已被自动拒绝`,actRevise:`退回修改`,actResubmit:`重新提交`,roundChip:`第 {{n}} 轮`,returnedHint:`审批人将申请退回给你。记录已解锁——修改数据后重新提交,将开启新一轮审批。`,resubmitBtn:`重新提交`,resubmitting:`正在重新提交…`,resubmitSuccess:`已重新提交——新一轮审批已开启`,resubmitPlaceholder:`你修改了什么?`,editRecordBtn:`编辑记录`,abandonTitle:`放弃本次修改?`,abandonBody:`撤回申请而不重新提交,审批到此结束。`,emptyTitle:`暂无请求`,emptyPending:`全部处理完毕,没有等待你审批的请求。`,emptyOther:`这里还没有内容。`,emptyViewAll:`查看全部请求`,noMatches:`没有符合当前筛选条件的请求。`,keyboardHint:`快捷键:j/k 移动 · Enter 打开 · x 选择 · a 通过 · r 拒绝`,drawerTitle:`审批请求`,submittedAgo:`提交于{{when}}`,completedAt:`完成于{{when}}`,waitingOn:`等待以下审批人`,history:`审批动态`,noActions:`暂无操作记录。`,actSubmit:`提交`,actApprove:`通过`,actReject:`拒绝`,actRecall:`撤回`,rawData:`原始数据(JSON)`,copy:`复制`,copied:`已复制`,copyFailed:`复制失败`,overrideActor:`以其他身份操作(管理员)`,actor:`操作身份`,auto:`自动`,overrideHint:`例如 role:sales_manager。留空则使用自动识别的身份。`,comment:`审批意见(可选)`,approve:`通过`,approving:`正在通过…`,reject:`拒绝`,rejecting:`正在拒绝…`,recall:`撤回`,recalling:`正在撤回…`,cancel:`取消`,clear:`清除`,approveN:`通过 {{count}} 条`,rejectN:`拒绝 {{count}} 条`,bulkApproveTitle:`通过这 {{count}} 条请求?`,bulkApproveBody:`每条请求都将以你的身份通过,对应流程沿“通过”分支继续。`,bulkRejectTitle:`拒绝这 {{count}} 条请求?`,bulkRejectBody:`将拒绝所选请求并通知各申请人。`,bulkApproved:`已通过 {{count}} 条请求`,bulkRejected:`已拒绝 {{count}} 条请求`,bulkPartial:`{{ok}} 条成功,{{fail}} 条失败:{{which}}`,rejectOneTitle:`拒绝“{{title}}”?`,rejectOneBody:`将拒绝该请求并通知申请人。`,rejectTitle:`拒绝该请求?`,rejectBody:`将把该请求标记为已拒绝,并通知申请人。`,recallTitle:`撤回该请求?`,recallBody:`撤回后审批人将无法继续处理,记录随即解锁。`,inlineApproved:`已通过“{{title}}”`,inlineRejected:`已拒绝“{{title}}”`,approvedFinal:`已通过`,approvedWaiting:`已通过——等待其余审批人`,rejectedToast:`已拒绝`,recalledToast:`请求已撤回`,whyDisabled:`只有指定的审批人才能处理该请求。当前等待:{{who}}。`,whyDisabledSubmitter:`这是你发起的请求,你可以撤回;但只有指定审批人才能通过或拒绝。`,noActor:`无法确定操作身份`,actionFailed:`操作失败`,loadFailed:`加载请求失败`,recallUnavailable:`当前部署暂不支持撤回。`,requestGone:`该请求已不存在,请刷新列表。`,notAllowed:`你没有权限执行此操作。`,alreadyDecided:`该请求已被处理,请刷新列表。`,justNow:`刚刚`,minutesAgo:`{{count}} 分钟前`,hoursAgo:`{{count}} 小时前`,daysAgo:`{{count}} 天前`},filterBuilder:{where:`其中`,and:`且`,or:`或`,clearAll:`清除全部`,selectField:`选择字段`,operator:`运算符`,selectValue:`选择值`,value:`值`,addFilter:`添加筛选`,removeCondition:`移除条件`,trueLabel:`是`,falseLabel:`否`,noResults:`无结果`,searchField:`搜索 {{label}}…`,enterId:`输入 {{label}} ID`,operators:{equals:`等于`,notEquals:`不等于`,contains:`包含`,notContains:`不包含`,isEmpty:`为空`,isNotEmpty:`不为空`,greaterThan:`大于`,lessThan:`小于`,greaterOrEqual:`大于或等于`,lessOrEqual:`小于或等于`,before:`早于`,after:`晚于`,between:`介于`,in:`属于`,notIn:`不属于`}},sortBuilder:{sortBy:`排序依据`,thenBy:`然后按`,selectField:`选择字段`,ascending:`A → Z`,descending:`Z → A`,addSort:`添加排序`,removeSort:`删除排序`}},Zr={en:Yr,zh:Xr,ja:{lookup:{recentlyUsed:`最近使用したもの`,allResults:`すべての結果`,createNew:`新規作成`,createNamed:`「{{name}}」を新規作成`,showingResults:`{{total}} 件中 {{shown}} 件を表示`,showAllResults:`すべての結果を表示 ({{count}})`,selectedBadge:`選択済み`,browseAll:`すべてのレコードを参照`,remove:`{{label}} を削除`,selectFirst:`まず {{fields}} を選択してください`,selectRecord:`レコードを選択`,recordCount:`{{count}} 件のレコード`,recordCountOne:`1 件のレコード`,pageOf:`{{total}} ページ中 {{current}} ページ`,filters:`フィルター`,clear:`クリア`,yes:`はい`,filterPlaceholder:`{{label}} で絞り込み`,prevPage:`前のページ`,nextPage:`次のページ`,jumpToPage:`ページへ移動`,retry:`再試行`,loading:`読み込み中…`,noOptions:`オプションが見つかりません`,noRecords:`レコードが見つかりません`},common:{addToFavorites:`お気に入りに追加`,removeFromFavorites:`お気に入りから削除`,loading:`読み込み中...`,save:`保存`,cancel:`キャンセル`,delete:`削除`,edit:`編集`,create:`作成`,search:`検索`,filter:`フィルター`,reset:`リセット`,confirm:`確認`,close:`閉じる`,back:`戻る`,next:`次へ`,previous:`前へ`,submit:`送信`,refresh:`更新`,export:`エクスポート`,import:`インポート`,yes:`はい`,no:`いいえ`,ok:`OK`,actions:`操作`,more:`もっと見る`,selectAll:`すべて選択`,clearAll:`すべてクリア`,noData:`データがありません`,noResults:`結果が見つかりません`,required:`必須`,optional:`任意`,selectOption:`選択してください`,select:`選択...`,openChat:`チャットを開く`,closeChat:`チャットを閉じる`,toggleSidebar:`サイドバーを切り替え`,package:`パッケージ`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}}は必須です`,minLength:`{{field}}は{{min}}文字以上で入力してください`,maxLength:`{{field}}は{{max}}文字以下で入力してください`,min:`{{field}}は{{min}}以上にしてください`,max:`{{field}}は{{max}}以下にしてください`,email:`有効なメールアドレスを入力してください`,url:`有効なURLを入力してください`,pattern:`{{field}}の形式が正しくありません`,unique:`{{field}}は一意である必要があります`,type:`{{field}}は有効な{{type}}である必要があります`},form:{addItem:`項目を追加`,removeItem:`項目を削除`,fieldRequired:`この項目は必須です`,invalidFormat:`形式が正しくありません`,saveSuccess:`保存しました`,saveError:`保存に失敗しました`,unsavedChanges:`保存されていない変更があります。このページを離れますか?`,stepOf:`ステップ {{current}} / {{total}}`,createTitle:`{{object}}を作成`,editTitle:`{{object}}を編集`,createDescription:`新しい{{object}}をデータベースに追加します。`,editDescription:`{{object}}の詳細を更新`,saveRecord:`レコードを保存`,create:`作成`,update:`更新`,createSuccess:`{{object}}が作成されました`,updateSuccess:`{{object}}が更新されました`,deleteSuccess:`{{object}}が削除されました`},fields:{richText:{format:`フォーマット: {{format}}`,basicEditorHint:`リッチテキストエディター(基本)`,placeholder:`テキストを入力...`}},table:{rowsPerPage:`1ページの行数`,showing:`{{total}}件中{{from}}〜{{to}}件を表示`,noRows:`表示するデータがありません`,sortAsc:`昇順`,sortDesc:`降順`,filterColumn:`{{column}}でフィルター`,columns:`列`,exportCSV:`CSVエクスポート`,exportExcel:`Excelエクスポート`,selectRow:`行を選択`,selectAllRows:`すべての行を選択`,expandRow:`行を展開`,collapseRow:`行を折りたたむ`,hideColumn:`列を非表示`,freezeColumn:`列を固定`,unfreezeColumn:`列の固定を解除`,pageInfo:`{{total}}ページ中{{current}}ページ`,totalRecords:`合計{{count}}件`,noResults:`結果が見つかりません`,noResultsHint:`フィルターや検索クエリを調整してみてください。`,cancelAll:`すべてキャンセル`,saveAll:`すべて保存 ({{count}})`,addRecord:`レコードを追加`,open:`開く`,search:`検索...`,modified:`{{count}} 行が変更されました`,selected:`{{count}} 件選択中`,edit:`編集`,delete:`削除`},grid:{actions:`アクション`,edit:`編集`,delete:`削除`,export:`エクスポート`,exportAs:`{{format}}でエクスポート`,loading:`グリッドを読み込み中...`,errorLoading:`グリッドの読み込みエラー`,pullToRefresh:`引っ張って更新`,refreshing:`更新中…`,openRecord:`レコードを開く`,rowHeight:`行の高さ: {{mode}}`,openMenu:`メニューを開く`,empty:`空`,yes:`はい`,no:`いいえ`,systemFields:`システム`,toolbar:{densityMode:`密度`,densityCompact:`コンパクト`,densityComfortable:`標準`,densitySpacious:`広め`,densityCycleHint:`{{label}}(クリックで切り替え)`,densityCycleShortHint:`クリックで切り替え`},import:{title:`{{object}}をインポート`,stepUpload:`アップロード`,stepMapping:`マッピング`,stepPreview:`プレビュー`,uploadDescription:`CSVファイルをアップロードして開始してください。`,mappingDescription:`CSV列をオブジェクトフィールドにマッピングします。`,previewDescription:`インポート前にデータを確認してください。`,dragDrop:`CSVファイルをここにドラッグ&ドロップするか、クリックして参照`,browseFiles:`ファイルを参照`,onlyCsv:`CSVファイルのみサポートされています。`,fileNeedsHeader:`ファイルにはヘッダー行と少なくとも1行のデータが必要です。`,mappingTemplate:`マッピングテンプレート:`,chooseTemplate:`テンプレートを選択…`,noSavedTemplates:`保存されたテンプレートはありません`,noneOption:`— なし —`,saveCurrent:`現在を保存`,templateName:`テンプレート名`,save:`保存`,deleteTemplate:`テンプレートを削除`,csvColumn:`CSV列`,mapsTo:`マッピング先`,status:`ステータス`,skipColumn:`列をスキップ`,skip:`— スキップ —`,mapped:`マッピング済み`,skipped:`スキップ済み`,rowsWithErrors:`{{count}} 行にエラー`,rowsCorrected:`{{count}} 行が修正されました`,clickToFix:`— ハイライトされたセルをクリックしてインラインで修正。`,showingRows:`{{total}} 行中 {{shown}} 行を表示`,importing:`インポート中… {{progress}}%`,importComplete:`インポート完了`,imported:`{{count}} 件インポートされました`,skippedCount:`{{count}} 件スキップされました`,moreErrors:`…他 {{count}} 件のエラー`,cancel:`キャンセル`,back:`戻る`,next:`次へ`,close:`閉じる`,importNRows:`{{count}} 行をインポート`,importingProgress:`インポート中…`,requiredMark:`*`,required:`必須`,invalidType:`無効な{{type}}`}},calendar:{today:`今日`,month:`月`,week:`週`,day:`日`,agenda:`予定表`,allDay:`終日`,noEvents:`予定はありません`,newEvent:`新しい予定`,moreEvents:`+{{count}} 件`},list:{loading:`Loading records...`,recordCount:`{{count}} 件のレコード`,recordCountOne:`{{count}} 件のレコード`,addRecord:`レコードを追加`,tabs:`タブ`,allRecords:`すべてのレコード`,search:`検索`,filter:`フィルター`,filterRecords:`レコードをフィルター`,sort:`並べ替え`,sortRecords:`レコードを並べ替え`,group:`グループ`,groupBy:`グループ化`,export:`エクスポート`,exportAs:`{{format}}としてエクスポート`,color:`色`,rowColor:`行の色`,colorByField:`フィールドで色分け`,clear:`クリア`,none:`なし`,hideFields:`フィールドを非表示`,noItems:`項目が見つかりません`,noItemsMessage:`表示するレコードがありません。フィルターを調整するか、新しいデータを追加してください。`,showAll:`すべて表示`,pullToRefresh:`引っ張って更新`,refreshing:`更新中…`,share:`共有`,print:`印刷`,hideFieldsTitle:`フィールドを非表示`,dataLimitReached:`最初の {{limit}} 件のレコードを表示しています。さらにデータがある場合があります。`,viewSettings:`ビュー設定`,viewSettingsHint:`グループ化、色、密度、表示フィールド。`,addGroup:`グループフィールドを追加`,collapsedByDefault:`デフォルトで折りたたむ`,removeGroup:`削除`},kanban:{addCard:`カードを追加`,addColumn:`カラムを追加`,moveCard:`カードを移動`,deleteCard:`カードを削除`,deleteColumn:`カラムを削除`,noCards:`カードがありません`,cardTitlePlaceholder:`カードのタイトルを入力...`},timeline:{bucket:{overdue:`期限超過`,today:`今日`,tomorrow:`明日`,thisWeek:`今週`,nextWeek:`来週`,later:`後ほど`,noDate:`日付なし`,unassigned:`未割当`}},gantt:{column:{taskName:`タスク名`,start:`開始`,end:`終了`},toolbar:{prevPeriod:`前の期間`,nextPeriod:`次の期間`,zoomIn:`拡大`,zoomOut:`縮小`,jumpToToday:`今日に移動`,today:`今日`,showTaskList:`タスクリストを表示`,hideTaskList:`タスクリストを非表示`}},view:{editViewConfig:`ビュー設定を編集`,rename:`名前を変更`,duplicateView:`ビューを複製`,shareView:`ビューを共有`,setAsDefault:`デフォルトに設定`,pinView:`ビューをピン留め`,unpinView:`ピン解除`,changeViewType:`ビュータイプを変更`,deleteView:`ビューを削除`,addView:`ビューを追加`,unsavedChanges:`未保存の変更`,saveAsView:`ビューとして保存`,moreViews:`あと {{count}} 件`,activeFilters:`フィルター適用中`,activeSort:`ソート適用中`,manageViews:`ビューを管理`,manageAllViews:`すべてのビューを管理…`,manageViewsDescription:`このオブジェクトのすべてのビューを並べ替え、名前変更、固定、削除できます。`,searchViews:`ビューを検索`,addNewView:`新しいビューを追加`,done:`完了`,noViewsFound:`検索に一致するビューはありません。`,dragToReorder:`ドラッグして並べ替え`,defaultView:`デフォルトビュー`,defaultBadge:`デフォルト`,tabActionsFor:`{{name}} のビュー操作`,readonlyAriaLabel:`読み取り専用ビュー`,readonlyTooltip:`システムビュー — 複製してカスタマイズしてください。`},designer:{undo:`Undo`,redo:`Redo`},detail:{back:`戻る`,edit:`編集`,editInline:`編集`,save:`保存`,saveChanges:`変更を保存`,editFieldsInline:`フィールドを編集`,share:`共有`,duplicate:`複製`,export:`エクスポート`,viewHistory:`履歴を表示`,delete:`削除`,moreActions:`その他の操作`,addToFavorites:`お気に入りに追加`,removeFromFavorites:`お気に入りから削除`,previousRecord:`前のレコード`,nextRecord:`次のレコード`,recordOf:`{{current}} / {{total}}`,recordNotFound:`レコードが見つかりません`,recordNotFoundDescription:`お探しのレコードは存在しないか、削除された可能性があります。`,goBack:`戻る`,details:`詳細`,related:`関連`,relatedRecords:`{{count}} 件のレコード`,relatedRecordOne:`{{count}} 件のレコード`,noRelatedRecords:`関連レコードが見つかりません`,loading:`読み込み中...`,copyToClipboard:`クリップボードにコピー`,copied:`コピーしました!`,deleteConfirmation:`このレコードを削除してもよろしいですか?`,editRecord:`レコードを編集`,viewAll:`すべて表示`,new:`新規`,emptyValue:`—`,activity:`アクティビティ`,editRow:`編集`,deleteRow:`削除`,deleteRowConfirmation:`このレコードを削除してもよろしいですか?`,actions:`操作`,previousPage:`前へ`,nextPage:`次へ`,pageOf:`ページ {{current}} / {{total}}`,sortBy:`並べ替え`,filterPlaceholder:`フィルター...`,highlightFields:`主要フィールド`,comments:`コメント`,searchComments:`コメントを検索…`,addCommentPlaceholder:`コメントを追加… (Ctrl+Enterで送信)`,noMatchingComments:`一致するコメントがありません`,noCommentsYet:`コメントはまだありません`,pinned:`ピン留め`,pin:`ピン留め`,unpin:`ピン解除`,justNow:`たった今`,minutesAgo:`{{count}}分前`,hoursAgo:`{{count}}時間前`,daysAgo:`{{count}}日前`,dropFilesToUpload:`ファイルをここにドロップまたはクリックしてアップロード`,attachmentCount:`{{count}} 件の添付ファイル`,attachmentCountPlural:`{{count}} 件の添付ファイル`,removeAttachment:`添付ファイルを削除`,unifiedDiff:`統合差分`,sideBySideDiff:`横並び差分`,noChanges:`変更なし`,previousVersion:`前のバージョン`,currentVersion:`現在のバージョン`,discussion:`ディスカッション`,showDiscussion:`ディスカッションを表示 ({{count}})`,hideDiscussion:`ディスカッションを非表示`,bold:`太字 (Ctrl+B)`,italic:`斜体 (Ctrl+I)`,listFormat:`リスト`,inlineCode:`インラインコード`,mentionSomeone:`メンションする`,preview:`プレビュー`,submitComment:`送信 (Ctrl+Enter)`,sendComment:`送信`,writeComment:`コメントを入力…`,subscribedTooltip:`購読中 — クリックで解除`,unsubscribedTooltip:`通知を購読`,firstRecord:`最初のレコード (Home)`,previousRecordKey:`前のレコード (←)`,nextRecordKey:`次のレコード (→)`,lastRecord:`最後のレコード (End)`,noRecords:`レコードなし`,searchWhileNavigating:`ナビゲーション中に検索`,searchRecords:`レコードを検索…`,allActivity:`すべてのアクティビティ`,commentsOnly:`コメントのみ`,fieldChangesFilter:`フィールド変更`,tasksOnly:`タスクのみ`,leaveCommentPlaceholder:`コメントを入力… (Ctrl+Enterで送信)`,noActivity:`アクティビティの記録なし`,loadMore:`さらに読み込む`,edited:`(編集済み)`,via:`{{source}} 経由`,replyCount:`{{count}} 件の返信`,replyCountPlural:`{{count}} 件の返信`,replyPlaceholder:`返信…`,filterActivity:`アクティビティをフィルター`,openDiscussion:`ディスカッションパネルを開く`,closeDiscussion:`ディスカッションパネルを閉じる`,subscribeAriaLabel:`通知を購読`,unsubscribeAriaLabel:`通知の購読を解除`,clearSearch:`検索をクリア`,saving:`保存中…`,lockedByApproval:`承認のためロック中`,lockedTooltip:`このレコードには承認待ちのリクエストがあります。編集はロックされています`,cancelApproval:`承認を取り消す`,cancelApprovalInFlight:`取り消し中…`,cancelApprovalTooltip:`承認待ちリクエストを取り消してレコードのロックを解除する`,cancelApprovalFailed:`承認の取り消しに失敗しました`,cancelApprovalUnavailable:`このデータソースでは承認の取り消しはサポートされていません`,linkCopied:`リンクをクリップボードにコピーしました`,linkCopyFailed:`リンクのコピーに失敗しました`,cancel:`キャンセル`,cancelEdit:`変更を破棄`,sectionMoreDetails:`詳細情報`,concurrentUpdateTitle:`このレコードは他のユーザーによって変更されました`,concurrentUpdateDescription:`編集中に他のユーザーが {{field}} の新しいバージョンを保存しました。変更を上書きしないよう、競合の解決方法を選択してください。`,concurrentUpdateYourEdit:`自分の編集`,concurrentUpdateCurrentValue:`現在の値`,concurrentUpdateUpdatedBy:`{{name}} が更新`,concurrentUpdateUpdatedAt:`{{when}} に更新`,concurrentUpdateReload:`最新を読み込む`,concurrentUpdateOverwrite:`上書きする`,concurrentUpdateCancel:`キャンセル`,openInNewTab:`新しいタブで開く`,history:`履歴`,deleteRowTitle:`レコードを削除`,createdBy:`作成者`,updatedBy:`更新者`,showEmptyRelated_one:`+ {{count}} 件(空)`,showEmptyRelated_other:`+ {{count}} 件(空)`,copyEmail:`メールをコピー`,copyPhone:`電話番号をコピー`,copyRecordId:`レコードIDをコピー`,showEmptyFields:`{{count}} 件の空フィールドを表示`,hideEmptyFields:`空フィールドを非表示`,noValue:`値なし`},chart:{noData:`チャートデータがありません`,loading:`チャート読み込み中...`},map:{searchLocations:`場所を検索…`,locationDetails:`場所の詳細`,markersCount:`{{count}} 個のマーカー`,invalidCoordinates:`座標が欠落または無効なため、{{count}} 件のレコードが地図から除外されました。`,invalidCoordinatesPlural:`座標が欠落または無効なため、{{count}} 件のレコードが地図から除外されました。`},workflow:{draft:`下書き`,active:`アクティブ`,paused:`一時停止`,completed:`完了`,cancelled:`キャンセル`,save:`保存`,publish:`公開`,addNode:`ノードを追加`,workflowFlow:`ワークフロー`,properties:`プロパティ`,connections:`接続`,quickConnect:`クイック接続`,fromPlaceholder:`開始...`,toPlaceholder:`終了...`,connect:`接続`,label:`ラベル`,type:`タイプ`,description:`説明`,assignee:`担当者`,assigneeType:`担当者タイプ`,user:`ユーザー`,role:`ロール`,group:`グループ`,expression:`式`,timeoutMinutes:`タイムアウト(分)`,selectNodeToEdit:`ノードを選択してプロパティを編集`,workflowTitle:`ワークフロータイトル`,newWorkflow:`新規ワークフロー`,outConnections:`{{count}} 個の出力`,start:`開始`,end:`終了`,task:`タスク`,userTask:`ユーザータスク`,serviceTask:`サービスタスク`,scriptTask:`スクリプトタスク`,approval:`承認`,condition:`条件`,parallelGateway:`並列ゲートウェイ`,joinGateway:`結合ゲートウェイ`,boundaryEvent:`境界イベント`,delay:`遅延`,notification:`通知`,webhook:`Webhook`,allowConcurrency:`許可(並行実行)`,forbidConcurrency:`禁止(新規スキップ)`,replaceConcurrency:`置換(既存キャンセル)`,queueConcurrency:`キュー(完了後に実行)`,conditionEvent:`条件`,manualEvent:`手動`,webhookEvent:`Webhook`,timerEvent:`タイマー`,signalEvent:`シグナル`,versionHistory:`バージョン履歴`,importBpmn:`BPMNをインポート`,exportBpmn:`BPMNをエクスポート`,undo:`元に戻す`,redo:`やり直す`,resetZoom:`ズームをリセット`},dashboard:{addWidget:`ウィジェットを追加`,removeWidget:`ウィジェットを削除`,editLayout:`レイアウトを編集`,saveLayout:`レイアウトを保存`,resetLayout:`レイアウトをリセット`,total:`合計`,noDataAvailable:`データがありません`,noDataSourceFor:`データソースが利用できません:`,trend:{vsLastQuarter:`前四半期比`,vsLastMonth:`先月比`,vsLastWeek:`先週比`,vsLastYear:`前年比`,vsYesterday:`昨日比`,vsPreviousPeriod:`前期比`}},configPanel:{save:`保存`,discard:`破棄`,close:`閉じる`,layout:`レイアウト`,columns:`列数`,gap:`間隔`,rowHeight:`行の高さ`,data:`データ`,refreshInterval:`更新間隔`,appearance:`外観`,title:`タイトル`,showDescription:`説明を表示`,theme:`テーマ`,configuration:`設定`,general:`基本`,advanced:`詳細`},appDesigner:{createApp:`アプリケーション作成`,editApp:`アプリケーション編集`,basicInfo:`基本情報`,objects:`オブジェクト`,navigation:`ナビゲーション`,branding:`ブランディング`,appName:`アプリ名`,appTitle:`タイトル`,appDescription:`説明`,appIcon:`アイコン`,template:`テンプレート`,layout:`レイアウト`,layoutSidebar:`サイドバー`,layoutHeader:`ヘッダー`,layoutEmpty:`空`,selectObjects:`オブジェクトを選択`,searchObjects:`オブジェクトを検索…`,selectAll:`すべて選択`,deselectAll:`すべて解除`,navBuilder:`ナビゲーションビルダー`,addGroup:`グループを追加`,addUrl:`URLを追加`,addSeparator:`区切りを追加`,noNavItems:`ナビゲーション項目がありません。`,logoUrl:`ロゴURL`,primaryColor:`プライマリカラー`,faviconUrl:`ファビコンURL`,preview:`プレビュー`,complete:`完了`,snakeCaseHint:`snake_case形式が必要です(例: my_app)`,modeEdit:`編集`,modePreview:`プレビュー`,modeCode:`コード`,addWidget:`ウィジェットを追加`,widgetProperties:`ウィジェットプロパティ`,dataSource:`データソース`,valueField:`値フィールド`,aggregate:`集計`,colorVariant:`カラーバリアント`,addComponent:`コンポーネントを追加`,componentProperties:`コンポーネントプロパティ`,viewType:`ビュータイプ`,fields:`フィールド`,toolbar:`ツールバー`,showSearch:`検索を表示`,showFilters:`フィルターを表示`,showSort:`ソートを表示`,appearance:`外観`,rowHeight:`行高さ`,stripedRows:`ストライプ行`,bordered:`枠線`,livePreview:`リアルタイムプレビュー`,stepBasicDesc:`名前、タイトル、レイアウト`,stepObjectsDesc:`ビジネスオブジェクトを選択`,stepNavigationDesc:`ナビゲーションツリーを構築`,stepBrandingDesc:`ロゴ、色、ファビコン`,noObjectsFound:`オブジェクトが見つかりません。`,noNavItemsHint:`ナビゲーション項目がありません。前のステップでオブジェクトを選択するか、手動で追加してください。`,separator:`セパレーター`,separatorLabel:`— セパレーター —`,newGroup:`新しいグループ`,newLink:`新しいリンク`,saveDraft:`下書き保存`,cancelConfirmTitle:`変更を破棄しますか?`,cancelConfirmMessage:`保存されていない変更があります。キャンセルしてもよろしいですか?`,confirmDiscard:`破棄`,keepEditing:`編集を続ける`,navNoItems:`ナビゲーション項目がありません。上のボタンをクリックして追加してください。`,navNoPreviewItems:`項目なし`,navLivePreview:`ライブプレビュー`,navCollapseGroup:`グループを折りたたむ`,navExpandGroup:`グループを展開`,navAddChild:`子項目を追加`,navMoveUp:`上に移動`,navMoveDown:`下に移動`,navRemove:`削除`,navObjectPage:`オブジェクトページ`,navDashboard:`ダッシュボード`,navPage:`ページ`,navReport:`レポート`,navGroup:`グループ`,navUrl:`URL`,navSeparator:`区切り`,navTypeObject:`オブジェクト`,navTypeDashboard:`ダッシュボード`,navTypePage:`ページ`,navTypeReport:`レポート`,navTypeUrl:`URL`,navTypeGroup:`グループ`,navTypeSeparator:`区切り`,navTypeAction:`アクション`,navEditIcon:`アイコンを編集`,navToggleVisible:`表示を切り替え`,navHidden:`非表示`,navExportSchema:`JSON エクスポート`,navImportSchema:`JSON インポート`,navExportSuccess:`ナビゲーションスキーマをエクスポートしました`,navImportSuccess:`ナビゲーションスキーマをインポートしました`,navImportError:`無効なナビゲーションJSON`,navIconPlaceholder:`アイコン名(例:Users)`,dashboardEditor:`ダッシュボードエディター`,noWidgets:`ウィジェットがありません。上のボタンをクリックして追加してください。`,widgetLayoutSize:`レイアウトサイズ`,widgetWidth:`幅`,widgetHeight:`高さ`,dashboardPreview:`ダッシュボードプレビュー`,noWidgetsPreview:`プレビューするウィジェットがありません`,pageCanvasEditor:`ページキャンバスエディター`,emptyPage:`空のページ。上のボタンをクリックしてコンポーネントを追加してください。`,pagePreview:`ページプレビュー`,noComponentsPreview:`プレビューするコンポーネントがありません`,modePage:`ページ`,modeDashboard:`ダッシュボード`,undo:`元に戻す`,redo:`やり直す`,brandingEditor:`ブランディングエディター`,brandingExport:`JSON エクスポート`,brandingImport:`JSON インポート`,brandingPreview:`プレビュー`,brandingSampleButton:`サンプルボタン`,brandingSampleText:`ブランドテーマの外観です。`,colorPalette:`カラーパレット`,fontFamily:`フォントファミリー`,fontDefault:`デフォルト(システム)`,modeLight:`ライト`,modeDark:`ダーク`,mobilePreview:`モバイルプレビュー`,objectManager:{title:`オブジェクトマネージャー`,addObject:`新しいオブジェクト`,searchPlaceholder:`オブジェクトを検索…`,noObjects:`オブジェクトが見つかりません。`,objectName:`API名`,objectLabel:`ラベル`,pluralLabel:`複数ラベル`,icon:`アイコン`,selectIcon:`アイコンを選択…`,group:`グループ`,noGroup:`グループなし`,sortOrder:`並べ替え順`,enabled:`有効`,relationships:`リレーション`,systemBadge:`システム`,fieldCount:`{{count}} フィールド`,ungrouped:`グループなし`,deleteConfirmTitle:`オブジェクトを削除しますか?`,deleteConfirmMessage:`このオブジェクトとそのすべてのフィールドが永久に削除されます。この操作は元に戻せません。`},fieldDesigner:{title:`フィールドデザイナー`,addField:`新しいフィールド`,searchPlaceholder:`フィールドを検索…`,allTypes:`すべてのタイプ`,noFields:`フィールドが見つかりません。`,fieldName:`API名`,fieldLabel:`ラベル`,fieldType:`タイプ`,fieldGroup:`グループ`,description:`説明`,required:`必須`,unique:`ユニーク`,readOnly:`読み取り専用`,hidden:`非表示`,indexed:`インデックス`,externalId:`外部ID`,trackHistory:`履歴追跡`,defaultValue:`デフォルト値`,placeholder:`プレースホルダー`,referenceTo:`参照先`,formula:`数式`,options:`オプション`,addOption:`オプションを追加`,validationRules:`検証ルール`,addRule:`ルールを追加`,systemBadge:`システム`,ungrouped:`一般`,deleteConfirmTitle:`フィールドを削除しますか?`,deleteConfirmMessage:`このフィールドは永久に削除されます。このフィールドの既存データは失われます。`,basicSection:`基本`,typeSpecificSection:`タイプ設定`,advancedSection:`詳細設定`,typeCategory:{text:`テキスト`,number:`数値`,date:`日付と時刻`,choice:`選択`,relation:`リレーション`,advanced:`詳細`}}},console:{title:`ObjectStack コンソール`,initializing:`アプリケーションを初期化中...`,breadcrumb:{dashboards:`ダッシュボード`,pages:`ページ`,reports:`レポート`,system:`システム`},loadingSteps:{connecting:`データソースに接続中`,loadingConfig:`設定を読み込み中`,preparingWorkspace:`ワークスペースを準備中`},error:{connectionFailed:`サーバーに接続できません`,serverUnreachable:`サーバー {{url}} に接続できません。`,checkServer:`ネットワーク接続、またはバックエンドが稼働していることを確認してください。`,timeout:`接続がタイムアウトしました(10秒)。`},actions:{retry:`再試行`,retrying:`再試行中…`},shortcuts:{title:`キーボードショートカット`,description:`利用可能なすべてのキーボードショートカットのクイックリファレンス。`,groups:{general:`一般`,navigation:`ナビゲーション`,dataViews:`データビュー`,preferences:`設定`},openCommandPalette:`コマンドパレットを開く`,showShortcuts:`キーボードショートカットを表示`,closeDialog:`ダイアログ / パネルを閉じる`,toggleSidebar:`サイドバーを切り替え`,focusSearch:`検索にフォーカス`,createRecord:`新しいレコードを作成`,refreshData:`データを更新`,editRecord:`選択したレコードを編集`,toggleDarkMode:`ダークモードを切り替え`},commandPalette:{placeholder:`コマンドを入力または検索...`,noResults:`結果が見つかりません。`,objects:`オブジェクト`,dashboards:`ダッシュボード`,pages:`ページ`,reports:`レポート`,switchApp:`アプリを切り替え`,current:`現在`,preferences:`設定`,lightTheme:`ライトテーマ`,darkTheme:`ダークテーマ`,systemTheme:`システムテーマ`,actions:`アクション`,openFullSearch:`完全な検索ページを開く`,createApp:`新しいアプリを作成`,searching:`検索中…`,records:`レコード`,recentRecords:`最近閲覧`},errors:{somethingWentWrong:`問題が発生しました`,unexpectedError:`このビューのレンダリング中に予期しないエラーが発生しました。`,tryAgain:`再試行`,goHome:`ホームに戻る`,errorDetails:`エラー詳細(開発モードのみ)`},theme:{toggle:`テーマを切り替え`,light:`ライト`,dark:`ダーク`,system:`システム`},objectView:{systemViewReadonly:`System view defined in code - duplicate to customize.`,expandToPage:`Open as full page`,objectNotFound:`オブジェクトが見つかりません`,objectNotFoundDescription:`オブジェクト「{{objectName}}」は現在の設定に存在しません。`,objectNotFoundHint:`アプリのナビゲーション設定を確認するか、サイドバーから別のオブジェクトを選択してください。`,allRecords:`すべてのレコード`,exitDesignMode:`デザインモードを終了`,enterDesignMode:`デザインモードに入る`,metadataInspector:`メタデータインスペクター`,editView:`ビューを編集`,addView:`ビューを追加`,designTools:`デザインツール`,new:`新規`,configureView:`ビューを設定`,closePanel:`パネルを閉じる`,page:`ページ`,pageConfigHint:`ツールバー、ナビゲーション、ビューシェル設定`,listConfigHint:`このリストタイプのデータレンダリング、列、外観`,general:`一般`,generalHint:`ビューのタイトル、説明、タイプ`,toolbar:`ツールバー`,toolbarHint:`検索、フィルター、ソート、グループ、密度の切り替え`,toolbarEnabledCount:`{{total}} 件中 {{count}} 件有効`,navigationSection:`ナビゲーション`,navigationHint:`行クリック時の動作と詳細ビューの設定`,records:`レコード`,recordsHint:`選択モード、レコード追加、インライン編集`,exportPrint:`エクスポートと印刷`,exportPrintHint:`エクスポート形式、印刷、レコード数の表示`,showAllFields:`すべて表示`,hideAllFields:`すべて非表示`,searchFields:`フィールドを検索...`,title:`タイトル`,description:`説明`,data:`データ`,source:`ソース`,columns:`列`,filterBy:`フィルター条件`,sortBy:`並べ替え条件`,appearance:`外観`,showDescription:`説明を表示`,viewType:`ビュータイプ`,userFilters:`ユーザーフィルター`,enableSearch:`検索を有効化`,enableFilter:`フィルターを有効化`,enableSort:`並べ替えを有効化`,enableHideFields:`フィールド非表示を有効化`,enableGroup:`グループを有効化`,enableColor:`カラーを有効化`,enableDensity:`密度を有効化`,userActions:`ユーザーアクション`,addRecordViaForm:`フォームからレコードを追加`,advanced:`詳細設定`,allowExport:`エクスポートを許可`,recordCount:`{{count}} 件のレコード`,noDescription:`説明なし`,none:`なし`,columnsConfigured:`{{count}} 列`,save:`保存`,discard:`破棄`,createView:`ビューを作成`,newView:`新しいビュー`,typeOptions:`タイプオプション`,groupByField:`グループ化フィールド`,startDateField:`開始日フィールド`,titleField:`タイトルフィールド`,latitudeField:`緯度フィールド`,longitudeField:`経度フィールド`,imageField:`画像フィールド`,dateField:`日付フィールド`,selectField:`フィールドを選択...`,gridOptionsHint:`グリッドビューは上記で設定された列を使用します。`,groupBy:`グループ化`,prefixField:`プレフィックスフィールド`,fields:`フィールド`,fieldsVisible:`{{count}} 件表示`,sortsCount:`{{count}} 件の並べ替え`,filtersCount:`{{count}} 件のフィルター`,endDateField:`終了日フィールド`,color:`カラー`,fieldTextColor:`フィールドテキストカラー`,rowHeight:`行の高さ`,wrapHeaders:`ヘッダーの折り返し`,showFieldDescriptions:`フィールド説明を表示`,collapseAllByDefault:`デフォルトですべて折りたたむ`,striped:`ストライプ行`,bordered:`ボーダーセル`,inlineEdit:`インラインでレコードを編集`,addDeleteRecordsInline:`インラインでレコードを追加/削除`,clickIntoRecordDetails:`レコード詳細をクリックで表示`,navigationMode:`ナビゲーションモード`,navigationWidth:`ナビゲーション幅`,navigationWidthHint:`ドロワー、モーダル、スプリットナビゲーションモードで使用可能`,openNewTab:`新しいタブで開く`,openNewTabHint:`ページおよび新しいウィンドウナビゲーションモードで使用可能`,import:`インポート`,importTitle:`CSVからインポート`,importedToast:`{{count}} 行をインポートしました。`,importedWithSkipped:`{{ok}} 行をインポートしました。{{skipped}} 行をスキップしました。`,showAdvancedSettings:`詳細設定を表示`,showFewerSettings:`設定を減らす`,createViewDesc:`ビュータイプを選択して名前を付けてください。設定は後で変更できます。`,cancel:`キャンセル`,create:`作成`,delete:`削除`,deleteViewTitle:`ビューを削除`,deleteViewConfirm:`ビュー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。`,bulkDeleteConfirm:`選択した {{count}} 件のレコードを削除しますか?この操作は元に戻せません。`,duplicateViewName:`この名前のビューはすでに存在します。`,viewTypeGrid:`グリッド`,viewTypeGridDesc:`スプレッドシート形式のレコード一覧。`,viewTypeKanban:`かんばん`,viewTypeKanbanDesc:`単一選択フィールドでカードをカラムにグループ化。`,viewTypeCalendar:`カレンダー`,viewTypeCalendarDesc:`日付でレコードを月次カレンダーに配置。`,viewTypeGallery:`ギャラリー`,viewTypeGalleryDesc:`添付フィールドで大きな画像カードを表示。`,viewTypeTimeline:`タイムライン`,viewTypeTimelineDesc:`水平時間軸にレコードを配置。`,viewTypeGantt:`ガントチャート`,viewTypeGanttDesc:`開始/終了と依存関係のあるプロジェクトバー。`,viewTypeMap:`マップ`,viewTypeMapDesc:`緯度/経度フィールドから地理マーカーを表示。`,viewTypeChart:`チャート`,viewTypeChartDesc:`集計された棒グラフ/折れ線グラフ/円グラフ。`,groupByFieldHelp:`かんばんはこのフィールドの値でレコードをカラムにグループ化します。`,startDateFieldHelp:`カレンダーはこの日付に一致するセルにレコードを配置します。`,ganttStartDateFieldHelp:`各ガントバーの左端はこの日付を使用します。`,ganttEndDateFieldHelp:`各ガントバーの右端はこの日付を使用します。`,timelineDateFieldHelp:`レコードはこの日付でタイムラインに配置されます。`,latitudeFieldHelp:`緯度座標を提供するフィールド(地理フィールドのみ)。`,longitudeFieldHelp:`経度座標を提供するフィールド(地理フィールドのみ)。`,imageFieldHelp:`ギャラリーのカバーはこの画像または添付フィールドから取得されます。`,selectOption:`選択...`,noEligibleFieldForType:`このタイプに適したフィールドがありません。最初にオブジェクトに追加してください。`,viewTypeUnavailable:`このオブジェクトには「{{field}}」として機能するフィールドがありません。`,viewTypeUnavailableShort:`このオブジェクトではサポートされていません。`,chartType:`チャートタイプ`,chartTypeHelp:`データのレンダリング方法を決定します。`,chartTypeBar:`棒グラフ`,chartTypeLine:`折れ線グラフ`,chartTypePie:`円グラフ`,chartTypeArea:`面積グラフ`,chartTypeScatter:`散布図`,xAxisField:`X軸フィールド`,xAxisFieldHelp:`カテゴリまたは時間の次元。`,yAxisField:`Y軸フィールド`,yAxisFieldHelp:`集計する数値フィールド。`,selectionMode:`選択モード`,selectionNone:`なし`,selectionSingle:`単一`,selectionMultiple:`複数`,pageSize:`ページサイズ`,pageSizeOptions:`ページサイズのオプション`,exportFormats:`エクスポート形式`,exportMaxRecords:`最大レコード数`,exportIncludeHeaders:`ヘッダーを含む`,exportFileNamePrefix:`ファイル名プレフィックス`,searchableFields:`検索可能フィールド`,filterableFields:`フィルター可能フィールド`,resizableColumns:`サイズ変更可能な列`,densityCompact:`コンパクト`,densityComfortable:`標準`,densitySpacious:`広め`,densityMode:`密度モード`,hiddenFields:`非表示フィールド`,rowActions:`行アクション`,bulkActions:`一括アクション`,sharing:`共有`,sharingEnabled:`共有を有効にする`,sharingVisibility:`表示設定`,addRecordEnabled:`レコード追加を有効にする`,addRecordPosition:`位置`,addRecordMode:`モード`,addRecordFormView:`フォームビュー`,conditionalFormatting:`条件付き書式`,addRule:`ルールを追加`,quickFilters:`クイックフィルター`,addQuickFilter:`クイックフィルターを追加`,ufElements:`要素`,ufDropdown:`ドロップダウン`,ufTabs:`タブ`,ufToggle:`トグル`,ufAddField:`+ フィルターフィールドを追加...`,ufNoFields:`利用可能なフィールドがありません`,ufAddTab:`+ タブを追加`,ufTabLabel:`ラベル`,ufShowAllRecords:`「すべてのレコード」タブを表示`,ufAllowAddTab:`タブの追加を許可`,showRecordCount:`レコード数を表示`,allowPrinting:`印刷を許可`,virtualScroll:`仮想スクロール`,emptyStateTitle:`空の状態のタイトル`,emptyStateMessage:`空の状態のメッセージ`,emptyStateIcon:`空の状態のアイコン`,ariaLabel:`ARIAラベル`,ariaDescribedBy:`ARIA説明`,ariaLive:`ARIAライブ`,accessibility:`アクセシビリティ`,viewTabs:`ビュータブ`},localeSwitcher:{label:`言語`},search:`検索…`,nav:{pinItem:`{{name}} をピン留め`,unpinItem:`{{name}} のピンを外す`,dragToReorder:`ドラッグして並べ替え`,favorites:`お気に入り`}},auth:{login:{title:`アカウントにサインイン`,description:`メールアドレスとパスワードを入力してください`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,passwordLabel:`パスワード`,passwordPlaceholder:`パスワードを入力`,forgotPasswordText:`パスワードをお忘れですか?`,submitButton:`サインイン`,submittingButton:`サインイン中...`,noAccountText:`アカウントをお持ちでないですか?`,signUpText:`新規登録`,errors:{invalidCredentials:`メールアドレスまたはパスワードが正しくありません。再試行してください。`,emailNotVerified:`サインインする前にメールアドレスを確認してください。`}},register:{title:`アカウントを作成`,description:`情報を入力して始めましょう`,nameLabel:`名前`,namePlaceholder:`田中太郎`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,passwordLabel:`パスワード`,passwordPlaceholder:`パスワードを作成(8文字以上)`,confirmPasswordLabel:`パスワード確認`,confirmPasswordPlaceholder:`パスワードを再入力`,passwordMismatchError:`パスワードが一致しません`,passwordTooShortError:`パスワードは8文字以上必要です`,submitButton:`アカウント作成`,submittingButton:`アカウント作成中...`,hasAccountText:`すでにアカウントをお持ちですか?`,signInText:`サインイン`,errors:{userExists:`このメールアドレスのアカウントはすでに存在します。代わりにサインインしてください。`},verifyInbox:{title:`受信箱を確認してください`,description:`{{email}} に確認リンクを送信しました。リンクをクリックしてアカウントを有効にしてください。`,resend:`確認メールを再送信`,resending:`送信中…`,resent:`確認メールが送信されました。`,backToSignIn:`サインインに戻る`}},forgotPassword:{title:`パスワードをリセット`,description:`メールアドレスを入力してください。パスワードリセットリンクをお送りします`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,submitButton:`リセットリンクを送信`,submittingButton:`送信中...`,successTitle:`メールをご確認ください`,successDescription:`{{email}} にパスワードリセットリンクを送信しました。受信箱をご確認ください。`,backToSignInText:`サインインに戻る`,rememberPasswordText:`パスワードを覚えていますか?`,signInText:`サインイン`},resetPassword:{title:`新しいパスワードを設定`,description:`以前に使用していないパスワードを選択してください。`,newPassword:`新しいパスワード`,confirmPassword:`パスワードの確認`,submit:`パスワードを更新`,submitting:`更新中…`,success:`パスワードが更新されました`,failed:`リセットに失敗しました`,invalidToken:`このリセットリンクは無効か期限切れです。`,missingToken:`リセットリンクが見つからないか期限切れです`,passwordsMismatch:`パスワードが一致しません`,requestNewLink:`新しいリンクをリクエスト`},verifyEmail:{title:`メールアドレスを確認してください`,description:`メールアドレスに確認リンクを送信しました。リンクをクリックしてアカウントを確認してください。`,sentTo:`送信先:`,verifyingTitle:`確認中…`,verifyingDescription:`メールを確認中です。少々お待ちください。`,successTitle:`メールが確認されました`,successDescription:`メールが確認されました。サインインできます。`,errorTitle:`確認に失敗しました`,errorDescription:`確認に失敗しました。新しいリンクをリクエストしてください。`,missingToken:`確認リンクにトークンがありません。`,emailMissing:`メールアドレスがありません`,resendButton:`確認メールを再送信`,resending:`送信中…`,resent:`メールが送信されました!受信箱を確認してください`,resentSuccess:`確認メールが送信されました!`,resentDescription:`受信箱を確認して確認リンクをクリックしてください。`,resendFailed:`確認メールを再送信できません`,signInLink:`サインインへ`,backToSignIn:`サインインに戻る`,backToLogin:`ログインに戻る`,checkSpam:`メールが届きませんか?スパムフォルダーを確認するか、サポートに連絡してください。`,or:`または`},setup:{welcomeTitle:`ObjectStackへようこそ`,description:`このデプロイメントの設定を完了するために、最初のオーナーアカウントを作成してください。`,yourName:`お名前`,orgName:`組織名`,orgNamePlaceholder:`Acme Inc.`,emailLabel:`メールアドレス`,emailPlaceholder:`name@example.com`,passwordLabel:`パスワード`,passwordHint:`最低8文字`,submit:`オーナーアカウントを作成`,submitting:`設定中…`,failed:`設定に失敗しました`},device:{title:`新しいデバイスを認証`,subtitle:`{{email}} としてサインインするためにこのデバイスを承認します。`,userCodeLabel:`デバイスコード`,requesterLabel:`接続リクエスト元`,approveWarning:`この接続を直前にご自身で開始した場合にのみ承認してください。承認すると、このランタイムは組織のプライベートパッケージにアクセスできます。`,loggedInAs:`{{email}} としてサインイン中`,approve:`デバイスを承認`,approving:`承認中…`,approvedTitle:`デバイスが認証されました`,approvedDescription:`デバイスに戻ることができます。まもなくサインインするはずです。`,approveSuccess:`デバイスが認証されました`,approveSuccessDescription:`このウィンドウを閉じることができます。`,approveFailed:`承認に失敗しました`,deny:`リクエストを拒否`,denying:`拒否中…`,deniedTitle:`アクセスが拒否されました`,deniedDescription:`このデバイスはアクセスを許可されません。`,denyFailed:`リクエストの拒否に失敗しました`,invalidTitle:`無効なデバイスリンク`,invalidDescription:`URLにデバイスコードが指定されていません。`,loading:`読み込み中…`,cancel:`キャンセル`},shell:{tenantHostHint:`このワークスペースにサインインしています`}},errors:{networkError:`ネットワークエラーです。接続を確認してください。`,serverError:`サーバーエラーです。後でもう一度お試しください。`,notFound:`リソースが見つかりません。`,unauthorized:`この操作を実行する権限がありません。`,forbidden:`アクセスが拒否されました。`,timeout:`リクエストがタイムアウトしました。もう一度お試しください。`,unknown:`予期しないエラーが発生しました。`},workspace:{label:`ワークスペース`,default:`マイワークスペース`,switch:`ワークスペースを切り替え`,create:`ワークスペースを作成`,createTitle:`ワークスペースの作成`,createDescription:`ワークスペースはチームで協力するための共有スペースです。`,createButton:`ワークスペースを作成`,nameLabel:`ワークスペース名`,namePlaceholder:`例: Acme Inc`,slugLabel:`URL スラッグ`,slugHint:`URL に使用されます。小文字、数字、ハイフンのみ。`,invite:`メンバーを招待`,members:`メンバー`,settings:`ワークスペース設定`},help:{appDocs:`このアプリのドキュメント`,allDocs:`すべてのドキュメント`,onlineDocs:`オンラインドキュメント`},sidebar:{settings:`設定`,help:`ヘルプ`,helpTooltip:`ヘルプとドキュメント`,activityFeed:`アクティビティフィード`,notifications:`通知`,approvals:`承認`,inbox:`受信箱`,inboxAriaLabel:`受信箱を開く`,area:`エリア`,scope:`スコープ`,recent:`最近`,favorites:`お気に入り`,starred:`スター付き`,removeFromFavorites:`お気に入りから {{name}} を削除`},topbar:{aiAssistant:`AI アシスタント`},home:{title:`ホーム`,subtitle:`ワークスペースのダッシュボード`,nav:`ホーム`,allApps:`すべてのアプリケーション`,loading:`ワークスペースを読み込み中...`,recent:`最近`,starred:`スター付き`,welcome:`ObjectUI へようこそ`,welcomeDescription:`最初のアプリケーションを作成するか、システム設定を行ってください。`,createFirstApp:`最初のアプリを作成`,systemSettings:`システム設定`,browseMarketplace:`アプリマーケットプレイスを参照`,quickActions:{title:`クイックアクション`,createApp:`アプリを作成`,createAppDesc:`新しいアプリケーションを開始`,manageObjects:`オブジェクトを管理`,manageObjectsDesc:`データモデルを設定`,systemSettings:`システム設定`,systemSettingsDesc:`ワークスペースを設定`},appCard:{noDescription:`説明なし`,default:`デフォルト`},greetingMorning:`おはようございます`,greetingAfternoon:`こんにちは`,greetingEvening:`こんばんは`,greetingNight:`夜遅くまで作業中`,heroTagline:`前回の続きを始めるか、新しいものを探索してください。`,open:`開く`,stats:{apps:`アプリケーション`,starred:`スター付き`,recent:`最近のアイテム`},recentApps:{title:`最近アクセスしたもの`,itemType:{object:`オブジェクト`,dashboard:`ダッシュボード`,page:`ページ`,record:`レコード`}},starredApps:{title:`スター付き`},gettingStarted:{title:`ホームをカスタマイズ`,description:`アプリにスターを付けてここにピン留めし、ワンクリックでアクセスできます。開いたものはすべて「最近アクセスしたもの」に自動的に表示されます。`,cta:`すべてのアプリを参照`}},layout:{appSwitcher:{home:`ホーム`,addApp:`アプリを追加`,editApp:`アプリを編集`,manageAllApps:`すべてのアプリを管理`,systemConsole:`システムコンソール`,noAppsConfigured:`アプリが設定されていません`},activityFeed:{title:`最近の活動`,filter:`フィルター`,empty:`最近の活動はありません`,ariaLabel:`アクティビティフィード`,typeCreate:`作成`,typeUpdate:`更新`,typeDelete:`削除`,typeComment:`コメント`,relativeJustNow:`たった今`,relativeSecondsAgo:`{{count}}秒前`,relativeMinutesAgo:`{{count}}分前`,relativeHoursAgo:`{{count}}時間前`,relativeDaysAgo:`{{count}}日前`,viewAll:`すべての活動を表示`},metadata:{label:`メタデータ`,toggleTitle:`メタデータインスペクターを切り替え`,panelTitle:`メタデータインスペクター`,jsonBadge:`JSON`,copyJson:`JSONをコピー`}},search:{title:`検索`,back:`戻る`,placeholder:`オブジェクト、ダッシュボード、ページ、レポートを検索...`,inputAriaLabel:`オブジェクト、ダッシュボード、ページ、レポートを検索`,resultsCount:`"{{query}}" の結果 {{count}} 件`,resultsCountPlural:`"{{query}}" の結果 {{count}} 件`,itemsAvailable:`{{count}} 件利用可能`,noResults:`結果が見つかりません`,noResultsHint:`検索語句を調整してみてください`,typeObjects:`オブジェクト`,typeDashboards:`ダッシュボード`,typePages:`ページ`,typeReports:`レポート`,badgeObject:`オブジェクト`,badgeDashboard:`ダッシュボード`,badgePage:`ページ`,badgeReport:`レポート`},empty:{objectNotFound:`オブジェクトが見つかりません`,objectNotFoundDescription:`オブジェクト「{{name}}」の定義が見つかりません。設定を確認するか、有効なオブジェクトを選択してください。`,pageNotFound:`ページが見つかりません`,pageNotFoundDescription:`ページ「{{name}}」が見つかりません。削除または名前変更された可能性があります。`,dashboardNotFound:`ダッシュボードが見つかりません`,dashboardNotFoundDescription:`ダッシュボード「{{name}}」が見つかりません。削除または名前変更された可能性があります。`,reportNotFound:`レポートが見つかりません`,reportNotFoundDescription:`レポート「{{name}}」が見つかりません。削除または名前変更された可能性があります。`,noAppsConfigured:`アプリが設定されていません`,noAppsConfiguredDescription:`登録されているアプリケーションがありません。最初のアプリを作成するか、システム設定を参照してください。`,createFirstApp:`最初のアプリを作成`,systemSettings:`システム設定`,back:`戻る`,recordNotFound:`レコードが見つかりません`,recordNotFoundDescription:`お探しのレコードは存在しないか、削除された可能性があります。`},renderer:{noPageSchema:`ページスキーマが指定されていません`,noFormSchema:`フォームスキーマが指定されていません`,noDashboardSchema:`ダッシュボードスキーマが指定されていません`,pageRendering:`ページレンダリング中:{{name}}`,dashboardRendering:`ダッシュボードレンダリング中:{{name}}`,formRenderingMode:`{{mode}} モードでフォームをレンダリング中`,formRenderingFor:`レコード {{id}} 用`,createRecord:`レコードを作成`,editRecord:`レコードを編集`,page:`ページ`,dashboard:`ダッシュボード`,save:`保存`,cancel:`キャンセル`},actionDialog:{title:`アクションパラメーター`,description:`続行するために必要な情報を入力してください。`,selectPlaceholder:`{{label}} を選択`,requiredError:`{{label}} は必須です`,cancel:`キャンセル`,confirm:`確認`,defaultActionTitle:`アクション`,ok:`OK`,lookupPlaceholder:`{{label}} のレコードID(UUID)を貼り付け`,lookupHelpText:`参照オブジェクトのレコードIDを入力してください。ピッカーは近日公開予定です。`},actionConfirm:{title:`操作の確認`,confirm:`続行`,cancel:`キャンセル`},rowAction:{openMenu:`メニューを開く`,edit:`編集`,delete:`削除`},navigationSync:{addedPage:`ナビゲーション更新:ページ「{{name}}」を追加しました`,addedDashboard:`ナビゲーション更新:ダッシュボード「{{name}}」を追加しました`,removedPage:`ナビゲーション更新:ページ「{{name}}」を削除しました`,removedDashboard:`ナビゲーション更新:ダッシュボード「{{name}}」を削除しました`,renamedPage:`ナビゲーション更新:ページ「{{oldName}}」を「{{newName}}」に名前変更しました`,renamedDashboard:`ナビゲーション更新:ダッシュボード「{{oldName}}」を「{{newName}}」に名前変更しました`,undoLabel:`元に戻す`,undone:`ナビゲーションの変更を元に戻しました`,undoFailed:`ナビゲーションの変更を元に戻せませんでした`,updateFailed:`ナビゲーションの更新に失敗しました`},objectActions:{deleteSuccess:`{{label}} を削除しました`,deleteFailed:`{{label}} の削除に失敗しました`,noRecordId:`レコードIDが指定されていません`,deleteConfirm:`このレコードを削除してもよろしいですか?`,bulkDeleteSuccess:`{{count}} 件の {{label}} レコードを削除しました`,bulkDeletePartial:`{{succeeded}} 件削除、{{failed}} 件失敗`},objectViewActions:{renameFailed:`ビューの名前変更に失敗しました`,deleteFailed:`ビューの削除に失敗しました`},dashboardActions:{pdfPreparing:`PDFエクスポートを準備中…`,exportFailed:`エクスポートに失敗しました:{{message}}`,forecastSoon:`予測ビューは近日公開予定`},recordDetail:{viewersTooltip:`このレコードを閲覧中のユーザー`},cellRender:{empty:`空`,yes:`はい`,no:`いいえ`,systemFields:`システム`},user:{profile:`プロフィール`,settings:`設定`,logout:`ログアウト`,preferences:`設定`,theme:`テーマ`,language:`言語`},report:{total:`合計`,rowTotal:`行合計`,columnTotal:`列合計`,grandTotal:`総合計`,totals:`合計`,rowsLabel:`行`,columnsLabel:`列`,allLabel:`(すべて)`,emptyLabel:`(空)`,loading:`読み込み中…`,failedToLoad:`マトリックスの読み込みに失敗しました:{{message}}`,needsAcross:"マトリックスレポートには少なくとも1つの `groupingsAcross` フィールドが必要です。",aggregate:{count:`件数`,countDistinct:`ユニーク件数`,sum:`合計`,avg:`平均`,min:`最小`,max:`最大`,first:`最初`},editor:{breadcrumb:`設定`,basic:`基本`,title:`タイトル`,titlePlaceholder:`例:四半期別パイプライン`,description:`説明`,descriptionPlaceholder:`このレポートは何を示しますか?`,type:`レポートタイプ`,typeTabular:`テーブル — フラットなリスト`,typeSummary:`サマリー — 合計付きグループ化`,typeMatrix:`マトリックス — 行 × 列のピボット`,typeJoined:`結合 — 複数ブロック`,typeHelp:`表示したい内容に合うレイアウトを選択してください。`,data:`データ`,objectName:`データソース`,objectNamePlaceholder:`例:opportunity`,objectNameHelp:`このレポートはどのオブジェクトを照会しますか?`,limit:`行数の上限`,limitPlaceholder:`例:100`,columns:`列`,columnsHint:`列として表示するフィールドを選択します。サマリーやマトリックスでは集計(合計、件数…)を追加できます。`,filters:`フィルタ`,filtersHint:`このレポートに含める行を絞り込みます。`,filtersComplex:`このレポートには高度なフィルタが含まれており、ここでは編集できません。保存時は変更されません。`,groupBy:`グループ化`,groupByHint:`データをグループ化して小計を計算します。`,rows:`行`,rowsHint:`これらのフィールドで行をグループ化します。`,columnsAxis:`列`,columnsAxisHint:`これらのフィールドを上部でピボット表示します。`,values:`値`,valuesHint:`各セルに表示される数値です。1 つ以上のフィールドを選び、集計(合計、件数…)を指定してください。`,grouping:`グループ化項目`,addGrouping:`グループ化を追加`,dateGranularity:`日付の粒度`,dateGranularityNone:`(元の値を使用)`,day:`日`,week:`週`,month:`月`,quarter:`四半期`,year:`年`,sortAsc:`昇順`,sortDesc:`降順`,chart:`チャート`,chartHint:`テーブルの横に表示できる任意の可視化です。`,chartType:`チャートの種類`,chartTitle:`チャートのタイトル`,chartTitlePlaceholder:`未指定の場合はレポートのタイトル`,chartXAxis:`X 軸(カテゴリ)`,chartYAxis:`Y 軸(値)`,chartShowLegend:`凡例を表示`,chartShowDataLabels:`データラベルを表示`,chartNone:`(チャートなし)`,chartBar:`棒`,chartLine:`折れ線`,chartArea:`エリア`,chartPie:`円`,chartDonut:`ドーナツ`,chartFunnel:`ファネル`,validationNeedsObject:`列を追加する前にデータソースを選択してください。`,validationMatrixNeedsRowsCols:`マトリックスレポートには少なくとも 1 つの行と 1 つの列が必要です。`,validationSummaryNeedsRows:`サマリーレポートには少なくとも 1 つのグループ化フィールドが必要です。`,blocks:`ブロック`,blocksHint:`各ブロックは独立したテーブルまたはチャートです。ブロックのフィルタはレポートのフィルタと AND で結合されます。`,addBlock:`ブロックを追加`,removeBlock:`ブロックを削除`,blockName:`ブロック名`,blockNamePlaceholder:`一意のブロック名`,blockLabel:`表示ラベル`,blockLabelPlaceholder:`ブロックの上に表示されます`,blockDescription:`説明`,blockDescriptionPlaceholder:`このブロックの任意の補足説明`,validationJoinedNeedsBlocks:`結合レポートには少なくとも 1 つのブロックが必要です。`,validationBlockNameRequired:`各ブロックには空でない名前が必要です。`,validationBlockNameDuplicate:`ブロック名はレポート内で一意である必要があります。`,validationBlockNeedsColumns:`各ブロックには少なくとも 1 つの列が必要です。`,noneOption:`(なし)`,addCondition:`条件を追加`,combineLogic:`結合方法`,opContains:`含む`,opIsEmpty:`空である`,opIsNotEmpty:`空でない`,formatAuto:`自動`,formatCurrency:`通貨`,formatPercent:`パーセント`,formatInteger:`整数`,formatDate:`日付`,formatDatetime:`日付と時刻`,columnLabelPlaceholder:`ラベルを上書き`,aggregateColumn:`集計`,formatColumn:`フォーマット`,addColumns:`列を追加`,searchFields:`フィールドを検索…`,noMatchingFields:`検索条件に一致するフィールドはありません。`,noFieldsAvailable:`利用可能なフィールドがありません。`,columnsCount:`{n} 列選択中`,columnsEmpty:`列がまだ選択されていません。`,fieldPickerTitle:`フィールドを選択`,fieldPickerDescription:`追加するフィールドを1つ以上選択してください。検索ボックスでリストを絞り込めます。`,fieldPickerChangeTitle:`フィールドを変更`,fieldPickerAddGroupingTitle:`グループ化を追加`,fieldPickerEmpty:`(フィールドを選択)`,fieldPickerSelected:`{n} 件選択中`,fieldPickerClear:`選択を解除`,fieldPickerAdd:`追加`,fieldPickerAddN:`{n} 件追加`}},organizations:{mine:`マイ組織`,title:`組織`,heading:`あなたの組織`,subtitle:`続行する組織を選択するか、新しい組織を作成してください。`,searchPlaceholder:`組織を検索`,new:`新しい組織`,current:`現在の組織`,manage:`管理`,emptyTitle:`まだ組織がありません`,emptyDescription:`最初の組織を作成して開始してください。`,noMatches:`検索条件に一致する組織がありません。`},notifications:{empty:`通知はありません`,markAllRead:`すべて既読にする`,viewAll:`すべての通知を表示`,approvalsPending:`{{count}} 件の承認待ち`,viewApprovals:`承認を表示`,noPendingApprovals:`承認待ちはありません`,openApprovalsInbox:`承認ボックスを開く`,emptyUnread:`既読にしました`,filterUnread:`未読`,filterAll:`すべて`},publicForm:{submit:`送信`,submitting:`送信中…`,submitAnother:`別の回答を送信`,poweredBy:`Powered by ObjectStack`,secureNotice:`お客様の情報は安全に転送され、リクエストへの対応にのみ使用されます。`,thankYouTitle:`ありがとうございます!`,thankYouMessage:`送信が正常に受信されました。`,redirecting:`{{seconds}} 秒後にリダイレクトします…`,unavailableTitle:`フォームが利用できません`,unavailableDescription:`このURLで利用できる公開フォームはありません。基になるビューが匿名共有を有効にし、このスラグに一致することを確認してください。`,tryDemo:`デモを試す`,retry:`再試行`,loading:`フォームを読み込み中…`,requiredHint:`* 必須項目`,consentLabelDefault:`プライバシーポリシーに同意し、このリクエストのためにデータを処理することに同意します。`,consentLink:`プライバシーポリシー`,consentRequired:`続行するにはプライバシーポリシーに同意してください。`,rateLimited:`送信前に回答を確認してください。`,redirectBlocked:`送信は受理されましたが、リダイレクトURLはセキュリティのためブロックされました。`,demo:{contactTitle:`お問い合わせ`,contactDescription:`プロジェクトについてお聞かせください。1営業日以内に営業担当者がご連絡します。`,supportTitle:`サポートリクエストを送信`,supportDescription:`問題をお知らせください。チームが1営業日以内に対応します。`,thankYouSalesTitle:`メッセージを受信しました!ありがとうございます。`,thankYouSalesMessage:`1営業日以内に営業担当者がご連絡します。`,thankYouSupportTitle:`リクエストを受け付けました。`,thankYouSupportMessage:`サポートエンジニアがまもなくフォローアップします。追加のスクリーンショットがある場合は、このページを保存してください。`,field:{firstName:`名`,lastName:`姓`,email:`仕事用メール`,phone:`電話番号`,jobTitle:`役職`,company:`会社`,website:`ウェブサイト`,industry:`業界`,companySize:`会社規模`,howCanWeHelp:`どのようなお手伝いができますか?`,subject:`件名`,description:`説明`,issueType:`問題の種類`,priority:`優先度`},industry:{technology:`テクノロジー`,software:`ソフトウェア / SaaS`,finance:`金融`,healthcare:`ヘルスケア`,retail:`小売`,other:`その他`},issueType:{question:`質問`,problem:`問題`,bug:`バグ`,feature_request:`機能リクエスト`},priority:{low:`低`,medium:`中`,high:`高`,critical:`緊急`}}},marketplace:{title:`アプリマーケットプレイス`,subtitle:`ObjectStackカタログに公開された承認済みアプリを参照します。アプリをクリックして詳細を表示し、環境にインストールしてください。`,searchPlaceholder:`名前またはマニフェストIDでアプリを検索…`,searchAria:`マーケットプレイスアプリを検索`,installed:`インストール済み`,installedCount:`インストール済み({{count}})`,refresh:`更新`,all:`すべて`,noApprovedYet:`マーケットプレイスにはまだ承認されたアプリがありません。`,noMatchFilters:`フィルターに一致するアプリがありません。`,noDescription:`説明がありません。`,back:`マーケットプレイスに戻る`,installedTitle:`インストール済みアプリ`,installedSubtitle:`このランタイムのカーネルにインストールされているマーケットプレイスパッケージ。`,installedEmpty:`このランタイムにはまだマーケットプレイスアプリがインストールされていません。`,browseLink:`マーケットプレイスを参照 →`,installedAdditiveNote:`<strong>注意:</strong>カーネルAPIは追加のみです。アンインストールするとディスク上のマニフェストが削除され、次回起動時にパッケージは読み込まれませんが、実行中のカーネルはランタイムを再起動するまでアプリを登録したままにします。`,installedAt:`{{when}} にインストール`,installedBy:`{{user}} による`,installedPackageId:`パッケージ`,cachedAs:`<code>{{path}}</code> としてキャッシュ`,versionBadge:`v{{version}}`,installedBadge:`インストール済み v{{version}}`,load:{failed:`マーケットプレイスの読み込みに失敗しました`,failedHint:`このランタイムはデフォルトでパブリックObjectStackクラウドを指しています。ランタイムがオンラインであることを確認するか、<code>OS_CLOUD_URL</code> で自己ホスト型コントロールプレーンを指定してください。`,packageFailed:`パッケージの読み込みに失敗しました`,notFound:`見つかりません。`},detail:{homepage:`ホームページ`,installedV:`インストール済み · v{{version}}`,about:`概要`,noReadme:`READMEがありません。`,versions:`バージョン`,noApprovedVersions:`承認済みバージョンがありません。`,prerelease:`プレ`,moreOptions:`その他のインストールオプション`,uninstallFromRuntime:`このランタイムからアンインストール`,addSampleData:`サンプルデータを追加`,reseedAgain:`サンプルデータを再投入`,purgeSampleData:`サンプルデータを削除`,purgeConfirm:`このパッケージが投入したサンプルレコードをすべて削除しますか?ユーザーが追加したレコードは削除されません。`,purgeSuccess:`{{count}} 件のサンプルレコードを削除しました。`,purgeNoData:`削除するサンプルレコードがありません。`,reseedQueued:`サンプルデータは次回の環境アクセス時に再投入されます。`,reseedLocalSuccess:`サンプルデータを再投入しました:{{inserted}} 件追加、{{updated}} 件更新。`,reseedPartialErrors:`({{count}} 件のレコードの書き込みに失敗しました)`,updateAvailable:`アップデートあり`},action:{install:`インストール`,reinstall:`再インストール`,working:`処理中…`,installToCloud:`クラウドにインストール…`,installing:`インストール中…`,uninstall:`アンインストール`,uninstalling:`アンインストール中…`,details:`詳細`,close:`閉じる`,dismiss:`閉じる`,openOnCloud:`クラウドで開く`,backHome:`ホームに戻る`},install:{dialogTitle:`{{name}} をインストール`,dialogDescCurrent:`この環境({{host}})にインストールします。`,dialogDescPicker:`このアプリをインストールする環境を選択します。ObjectStack Cloudにサインインする必要があります。`,environment:`環境`,environmentPlaceholder:`環境を選択`,includeSampleData:`サンプルデータを含む`,noEnvs:`アクティブな組織に環境が見つかりません。`,noPermission:`どの環境にもアプリをインストールする権限がありません。組織のオーナーと管理者のみインストールできます。`,signInFirst:`最初にObjectStack Cloudにサインインしてください。`,success:`インストールが完了しました。環境を開いて新しいアプリを確認してください。`,localSuccess:`このランタイムに v{{version}} をインストールしました。「{{name}}」がアプリスイッチャーに表示されます。`,localManifestConflict:`{{message}}
|
|
11
11
|
ヒント:ローカルアプリがすでにこのmanifest_idを使用しています。最初にobjectstack.config.tsから削除してください。`,localUnauthorized:`最初にこのランタイムにサインインしてから再試行してください。`,localMarketplaceUnavailable:`このランタイムにはOS_CLOUD_URLが設定されていないため、マーケットプレイスカタログにアクセスできません。`},uninstall:{confirm:`このランタイムから {{manifestId}} v{{version}} をアンインストールしますか?
|
|
12
12
|
|
|
13
13
|
キャッシュされたマニフェストが削除されます。アプリは次の再起動まで実行中のカーネルに読み込まれたままになります。`,successInList:`{{manifestId}} を削除しました。ランタイムを再起動して実行中のカーネルから完全にアンロードしてください。`,successInDetail:`{{manifestId}} のキャッシュされたマニフェストを削除しました。ランタイムを再起動してアプリを完全にアンロードしてください。`},accessDenied:{title:`アプリマーケットプレイスは管理者専用です`,description:`この環境にアプリをインストールする権限がありません。アクセスのために組織のオーナーまたは管理者に連絡してください。`},category:{crm:`CRM`,erp:`ERP`,hr:`人事`,finance:`財務`,project:`プロジェクト管理`,collaboration:`コラボレーション`,analytics:`分析`,integration:`統合`,automation:`自動化`,ai:`AI`,security:`セキュリティ`,"developer-tools":`開発者ツール`,"ui-theme":`UIテーマ`,storage:`ストレージ`,other:`その他`},pricing:{free:`無料`,freemium:`フリーミアム`,paid:`有料`,subscription:`サブスクリプション`,"usage-based":`使用量ベース`,"contact-sales":`営業に問い合わせ`},relativeTime:{today:`今日`,daysAgo:`{{count}}日前`,monthsAgo:`{{count}}ヶ月前`,yearsAgo:`{{count}}年前`}},approvalsInbox:{loadMore:`さらに読み込む`,loadingMore:`読み込み中…`,loadedOf:`{{total}} 件中 {{loaded}} 件を表示`,actEscalate:`SLAエスカレーション`,systemSlaActor:`システム(SLA)`,reassignBtn:`引き継ぎ`,reassignTitle:`この承認を他の人に引き継ぎますか?`,reassignBody:`あなたの承認枠は選択した相手に移ります。相手に通知され、すぐに対応できます。`,reassignTo:`新しい承認者`,reassignToPlaceholder:`ユーザーを選択、またはメール / role:<名前> を入力`,reassignSuccess:`{{to}} に引き継ぎました`,requestInfoBtn:`差し戻し`,requestInfoTitle:`申請者に追加情報を求めますか?`,requestInfoBody:`リクエストは承認待ちのまま。申請者に通知され、スレッドで返信できます。`,requestInfoPlaceholder:`申請者に何を求めますか?`,requestInfoSent:`追加情報を求めて差し戻しました`,remindBtn:`リマインド`,remindSuccess:`{{count}} 名の承認者に通知しました`,remindThrottled:`リマインドは送信済みです。しばらくしてからお試しください。`,replyPlaceholder:`このリクエストに返信…`,slaRemaining:`SLA 残り {{dur}}`,slaOverdue:`SLA 超過 {{dur}}`,actReassign:`引き継ぎ`,actRemind:`リマインド`,actRequestInfo:`追加情報を要求`,actComment:`コメント`,stepProgress:`承認ステップ`,prevRequest:`前へ`,nextRequest:`次へ`,positionOf:`{{index}} / {{total}} 件`,quickPhrase1:`承認します。要件を満たしています。`,quickPhrase2:`条件付きで承認します。実行状況にご注意ください。`,quickPhrase3:`資料を追加のうえ再提出してください。`,title:`承認センター`,subtitle:`承認リクエストを確認して処理します。`,refresh:`更新`,tabMyPending:`自分の承認待ち`,tabSubmitted:`自分が申請`,tabAll:`すべて`,searchPlaceholder:`レコード、プロセス、申請者を検索…`,clearSearch:`検索をクリア`,statusFilter:`ステータス`,allStatuses:`すべてのステータス`,processFilter:`プロセス`,allProcesses:`すべてのプロセス`,objectFilter:`オブジェクト`,allObjects:`すべてのオブジェクト`,filterCount:`{{shown}} / {{total}} 件`,selected:`選択中`,actionableCount:`({{count}} 件操作可能)`,selectAll:`すべて選択`,selectRow:`このリクエストを選択`,colRequest:`承認事項`,colRecord:`レコード`,colRequester:`申請者`,colStatus:`ステータス`,colWaiting:`申請日時`,colActions:`操作`,statusPending:`承認待ち`,statusApproved:`承認済み`,statusRejected:`却下`,statusRecalled:`取り下げ`,statusReturned:`差し戻し`,sendBackBtn:`差し戻す`,sendBackTitle:`このリクエストを差し戻しますか?`,sendBackBody:`このラウンドは終了し、レコードのロックが解除され、申請者がデータを修正できます。再提出されると、全承認者に新しい承認ラウンドが開始されます。`,sendBackPlaceholder:`承認するには何を修正する必要がありますか?`,sendBackSuccess:`差し戻しました——申請者は編集して再提出できます`,sendBackAutoRejected:`差し戻し回数の上限に達したため、リクエストは自動的に却下されました`,actRevise:`差し戻し`,actResubmit:`再提出`,roundChip:`第{{n}}ラウンド`,returnedHint:`承認者がこのリクエストを差し戻しました。レコードのロックは解除されています。データを修正して再提出すると、新しい承認ラウンドが開始されます。`,resubmitBtn:`再提出`,resubmitting:`再提出中…`,resubmitSuccess:`再提出しました——新しい承認ラウンドが開始されました`,resubmitPlaceholder:`何を変更しましたか?`,editRecordBtn:`レコードを編集`,abandonTitle:`この修正を中止しますか?`,abandonBody:`再提出せずにリクエストを取り下げます。承認はここで終了します。`,emptyTitle:`リクエストはありません`,emptyPending:`すべて処理済みです。あなたの承認待ちはありません。`,emptyOther:`まだ何もありません。`,emptyViewAll:`すべてのリクエストを見る`,noMatches:`現在のフィルターに一致するものはありません。`,keyboardHint:`ショートカット:j/k 移動 · Enter 開く · x 選択 · a 承認 · r 却下`,drawerTitle:`承認リクエスト`,submittedAgo:`{{when}}に申請`,completedAt:`{{when}}に完了`,waitingOn:`承認待ちの担当者`,history:`承認履歴`,noActions:`まだ操作はありません。`,actSubmit:`申請`,actApprove:`承認`,actReject:`却下`,actRecall:`取り下げ`,rawData:`生データ(JSON)`,copy:`コピー`,copied:`コピーしました`,copyFailed:`コピーに失敗しました`,overrideActor:`別のIDで操作(管理者)`,actor:`操作ID`,auto:`自動`,overrideHint:`例:role:sales_manager。空欄の場合は自動検出されたIDを使用します。`,comment:`コメント(任意)`,approve:`承認`,approving:`承認中…`,reject:`却下`,rejecting:`却下中…`,recall:`取り下げ`,recalling:`取り下げ中…`,cancel:`キャンセル`,clear:`クリア`,approveN:`{{count}} 件を承認`,rejectN:`{{count}} 件を却下`,bulkApproveTitle:`この {{count}} 件を承認しますか?`,bulkApproveBody:`各リクエストはあなたのIDで承認され、フローは承認ブランチに進みます。`,bulkRejectTitle:`この {{count}} 件を却下しますか?`,bulkRejectBody:`選択したリクエストを却下し、各申請者に通知します。`,bulkApproved:`{{count}} 件を承認しました`,bulkRejected:`{{count}} 件を却下しました`,bulkPartial:`{{ok}} 件成功、{{fail}} 件失敗:{{which}}`,rejectOneTitle:`「{{title}}」を却下しますか?`,rejectOneBody:`リクエストを却下し、申請者に通知します。`,rejectTitle:`このリクエストを却下しますか?`,rejectBody:`リクエストを却下済みにして、申請者に通知します。`,recallTitle:`このリクエストを取り下げますか?`,recallBody:`取り下げ後、承認者は処理できなくなり、レコードはロック解除されます。`,inlineApproved:`「{{title}}」を承認しました`,inlineRejected:`「{{title}}」を却下しました`,approvedFinal:`承認しました`,approvedWaiting:`承認しました——残りの承認者を待っています`,rejectedToast:`却下しました`,recalledToast:`リクエストを取り下げました`,whyDisabled:`指定された承認者のみが処理できます。現在の承認待ち:{{who}}。`,whyDisabledSubmitter:`あなたが申請したリクエストのため取り下げは可能ですが、承認・却下は指定された承認者のみ行えます。`,noActor:`操作IDを特定できません`,actionFailed:`操作に失敗しました`,loadFailed:`リクエストの読み込みに失敗しました`,recallUnavailable:`この環境では取り下げはサポートされていません。`,requestGone:`このリクエストは存在しません。一覧を更新してください。`,notAllowed:`この操作を行う権限がありません。`,alreadyDecided:`このリクエストは処理済みです。一覧を更新してください。`,justNow:`たった今`,minutesAgo:`{{count}} 分前`,hoursAgo:`{{count}} 時間前`,daysAgo:`{{count}} 日前`},preview:{empty:{loadFailedTitle:`ドラフトプレビューを読み込めませんでした`,loadFailedDescription:`ドラフトオーバーレイを読み取れませんでした。再試行するか、接続を確認してください。`,notReadyTitle:`「{{app}}」はまだドラフトにありません`,notReadyDescription:`ビルドが実行中か、このアプリがステージされる前に失敗した可能性があります。会話でビルド状況を確認してください — ドラフトが届くとこのペインは更新されます。`,nothingTitle:`プレビューするものはまだありません`,retry:`再試行`},draftBar:{message:`ドラフトプレビュー — 未公開の変更を表示しています。公開するまで本番には反映されません。`,publish:`公開`,publishing:`公開中…`,exit:`プレビューを終了`,changes:`変更`},changes:{title:`保留中の変更`,description:`公開で何が変わるか。新規項目は追加され、更新は公開中のバージョンを上書きします。`,loading:`保留中の変更を読み込み中…`,loadFailed:`保留中の変更を読み込めませんでした:`,empty:`保留中の変更はありません — すべてのドラフトが公開済みです。`,kindNew:`新規`,kindUpdate:`更新`}},filterBuilder:{where:`条件`,and:`かつ`,or:`または`,clearAll:`すべてクリア`,selectField:`フィールドを選択`,operator:`演算子`,selectValue:`値を選択`,value:`値`,addFilter:`フィルターを追加`,removeCondition:`条件を削除`,trueLabel:`はい`,falseLabel:`いいえ`,noResults:`結果なし`,searchField:`{{label}}を検索…`,enterId:`{{label}} IDを入力`,operators:{equals:`等しい`,notEquals:`等しくない`,contains:`含む`,notContains:`含まない`,isEmpty:`空である`,isNotEmpty:`空でない`,greaterThan:`より大きい`,lessThan:`より小さい`,greaterOrEqual:`以上`,lessOrEqual:`以下`,before:`より前`,after:`より後`,between:`範囲内`,in:`いずれか`,notIn:`いずれでもない`}},sortBuilder:{sortBy:`並べ替え`,thenBy:`次に`,selectField:`フィールドを選択`,ascending:`A → Z`,descending:`Z → A`,addSort:`並べ替えを追加`,removeSort:`並べ替えを削除`}},ko:{lookup:{recentlyUsed:`최근 사용`,allResults:`모든 결과`,createNew:`새로 만들기`,createNamed:`“{{name}}” 새로 만들기`,showingResults:`{{total}}개 중 {{shown}}개 표시`,showAllResults:`모든 결과 보기 ({{count}})`,selectedBadge:`선택됨`,browseAll:`모든 레코드 찾아보기`,remove:`{{label}} 제거`,selectFirst:`먼저 {{fields}}을(를) 선택하세요`,selectRecord:`레코드 선택`,recordCount:`레코드 {{count}}개`,recordCountOne:`레코드 1개`,pageOf:`{{total}}페이지 중 {{current}}페이지`,filters:`필터`,clear:`지우기`,yes:`예`,filterPlaceholder:`{{label}} 필터`,prevPage:`이전 페이지`,nextPage:`다음 페이지`,jumpToPage:`페이지 이동`,retry:`다시 시도`,loading:`로딩 중…`,noOptions:`옵션을 찾을 수 없습니다`,noRecords:`레코드를 찾을 수 없습니다`},common:{addToFavorites:`즐겨찾기에 추가`,removeFromFavorites:`즐겨찾기에서 제거`,loading:`로딩 중...`,save:`저장`,cancel:`취소`,delete:`삭제`,edit:`편집`,create:`생성`,search:`검색`,filter:`필터`,reset:`초기화`,confirm:`확인`,close:`닫기`,back:`뒤로`,next:`다음`,previous:`이전`,submit:`제출`,refresh:`새로고침`,export:`내보내기`,import:`가져오기`,yes:`예`,no:`아니오`,ok:`확인`,actions:`작업`,more:`더보기`,selectAll:`모두 선택`,clearAll:`모두 지우기`,noData:`데이터 없음`,noResults:`결과를 찾을 수 없습니다`,required:`필수`,optional:`선택`,selectOption:`옵션을 선택하세요`,select:`선택...`,openChat:`채팅 열기`,closeChat:`채팅 닫기`,toggleSidebar:`사이드바 전환`,package:`패키지`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}}은(는) 필수입니다`,minLength:`{{field}}은(는) 최소 {{min}}자 이상이어야 합니다`,maxLength:`{{field}}은(는) 최대 {{max}}자까지 가능합니다`,min:`{{field}}은(는) {{min}} 이상이어야 합니다`,max:`{{field}}은(는) {{max}} 이하여야 합니다`,email:`유효한 이메일 주소를 입력해주세요`,url:`유효한 URL을 입력해주세요`,pattern:`{{field}} 형식이 올바르지 않습니다`,unique:`{{field}}은(는) 고유해야 합니다`,type:`{{field}}은(는) 유효한 {{type}}이어야 합니다`},form:{addItem:`항목 추가`,removeItem:`항목 제거`,fieldRequired:`이 필드는 필수입니다`,invalidFormat:`형식이 올바르지 않습니다`,saveSuccess:`저장되었습니다`,saveError:`저장에 실패했습니다`,unsavedChanges:`저장하지 않은 변경사항이 있습니다. 페이지를 떠나시겠습니까?`,stepOf:`{{total}}단계 중 {{current}}단계`,createTitle:`{{object}} 생성`,editTitle:`{{object}} 편집`,createDescription:`새 {{object}}을(를) 데이터베이스에 추가합니다.`,editDescription:`{{object}} 세부 정보 업데이트`,saveRecord:`레코드 저장`,create:`생성`,update:`업데이트`,createSuccess:`{{object}} 생성됨`,updateSuccess:`{{object}} 업데이트됨`,deleteSuccess:`{{object}} 삭제됨`},fields:{richText:{format:`형식: {{format}}`,basicEditorHint:`서식 있는 텍스트 편집기 (기본)`,placeholder:`내용을 입력하세요...`}},table:{rowsPerPage:`페이지당 행 수`,showing:`{{total}}개 중 {{from}}~{{to}} 표시`,noRows:`표시할 데이터가 없습니다`,sortAsc:`오름차순 정렬`,sortDesc:`내림차순 정렬`,filterColumn:`{{column}} 필터`,columns:`열`,exportCSV:`CSV 내보내기`,exportExcel:`Excel 내보내기`,selectRow:`행 선택`,selectAllRows:`모든 행 선택`,expandRow:`행 펼치기`,collapseRow:`행 접기`,hideColumn:`열 숨기기`,freezeColumn:`열 고정`,unfreezeColumn:`열 고정 해제`,pageInfo:`{{total}} 페이지 중 {{current}} 페이지`,totalRecords:`총 {{count}}개`,noResults:`결과 없음`,noResultsHint:`필터 또는 검색어를 조정해 보세요.`,cancelAll:`모두 취소`,saveAll:`모두 저장 ({{count}})`,addRecord:`레코드 추가`,open:`열기`,search:`검색...`,modified:`{{count}}개 행 수정됨`,selected:`{{count}}개 선택됨`,edit:`편집`,delete:`삭제`},grid:{actions:`작업`,edit:`편집`,delete:`삭제`,export:`내보내기`,exportAs:`{{format}}으로 내보내기`,loading:`그리드 로딩 중...`,errorLoading:`그리드 로딩 오류`,pullToRefresh:`당겨서 새로고침`,refreshing:`새로고침 중…`,openRecord:`레코드 열기`,rowHeight:`행 높이: {{mode}}`,openMenu:`메뉴 열기`,empty:`비어 있음`,yes:`예`,no:`아니요`,systemFields:`시스템`,toolbar:{densityMode:`밀도`,densityCompact:`컴팩트`,densityComfortable:`보통`,densitySpacious:`넓음`,densityCycleHint:`{{label}} (클릭하여 변경)`,densityCycleShortHint:`클릭하여 변경`},import:{title:`{{object}} 가져오기`,stepUpload:`업로드`,stepMapping:`매핑`,stepPreview:`미리보기`,uploadDescription:`CSV 파일을 업로드하여 시작하세요.`,mappingDescription:`CSV 열을 개체 필드에 매핑합니다.`,previewDescription:`가져오기 전에 데이터를 검토하세요.`,dragDrop:`CSV 파일을 여기로 드래그하거나 클릭하여 찾아보기`,browseFiles:`파일 찾아보기`,onlyCsv:`CSV 파일만 지원됩니다.`,fileNeedsHeader:`파일에 헤더 행과 데이터 행이 하나 이상 있어야 합니다.`,mappingTemplate:`매핑 템플릿:`,chooseTemplate:`템플릿 선택…`,noSavedTemplates:`저장된 템플릿 없음`,noneOption:`— 없음 —`,saveCurrent:`현재 저장`,templateName:`템플릿 이름`,save:`저장`,deleteTemplate:`템플릿 삭제`,csvColumn:`CSV 열`,mapsTo:`매핑 대상`,status:`상태`,skipColumn:`열 건너뛰기`,skip:`— 건너뛰기 —`,mapped:`매핑됨`,skipped:`건너뜀`,rowsWithErrors:`오류가 있는 {{count}}개 행`,rowsCorrected:`{{count}}개 행 수정됨`,clickToFix:`— 강조 표시된 셀을 클릭하여 인라인 편집.`,showingRows:`{{total}}개 중 {{shown}}개 행 표시`,importing:`가져오는 중… {{progress}}%`,importComplete:`가져오기 완료`,imported:`{{count}}개 가져옴`,skippedCount:`{{count}}개 건너뜀`,moreErrors:`…{{count}}개 오류 더`,cancel:`취소`,back:`뒤로`,next:`다음`,close:`닫기`,importNRows:`{{count}}개 행 가져오기`,importingProgress:`가져오는 중…`,requiredMark:`*`,required:`필수`,invalidType:`잘못된 {{type}}`}},calendar:{today:`오늘`,month:`월`,week:`주`,day:`일`,agenda:`일정`,allDay:`종일`,noEvents:`일정이 없습니다`,newEvent:`새 일정`,moreEvents:`+{{count}} 더보기`},list:{loading:`Loading records...`,recordCount:`{{count}}개 레코드`,recordCountOne:`{{count}}개 레코드`,addRecord:`레코드 추가`,tabs:`탭`,allRecords:`전체 레코드`,search:`검색`,filter:`필터`,filterRecords:`레코드 필터`,sort:`정렬`,sortRecords:`레코드 정렬`,group:`그룹`,groupBy:`그룹 기준`,export:`내보내기`,exportAs:`{{format}}으로 내보내기`,color:`색상`,rowColor:`행 색상`,colorByField:`필드별 색상`,clear:`지우기`,none:`없음`,hideFields:`필드 숨기기`,noItems:`항목을 찾을 수 없습니다`,noItemsMessage:`표시할 레코드가 없습니다. 필터를 조정하거나 새 데이터를 추가해 보세요.`,showAll:`모두 표시`,pullToRefresh:`당겨서 새로고침`,refreshing:`새로고침 중…`,share:`공유`,print:`인쇄`,hideFieldsTitle:`필드 숨기기`,dataLimitReached:`처음 {{limit}}개 레코드를 표시합니다. 더 많은 데이터가 있을 수 있습니다.`,viewSettings:`보기 설정`,viewSettingsHint:`그룹화, 색상, 밀도 및 표시 필드.`,addGroup:`그룹 필드 추가`,collapsedByDefault:`기본적으로 접힘`,removeGroup:`제거`},kanban:{addCard:`카드 추가`,addColumn:`열 추가`,moveCard:`카드 이동`,deleteCard:`카드 삭제`,deleteColumn:`열 삭제`,noCards:`카드 없음`,cardTitlePlaceholder:`카드 제목 입력...`},timeline:{bucket:{overdue:`기한 초과`,today:`오늘`,tomorrow:`내일`,thisWeek:`이번 주`,nextWeek:`다음 주`,later:`나중`,noDate:`날짜 없음`,unassigned:`미할당`}},gantt:{column:{taskName:`작업 이름`,start:`시작`,end:`종료`},toolbar:{prevPeriod:`이전 기간`,nextPeriod:`다음 기간`,zoomIn:`확대`,zoomOut:`축소`,jumpToToday:`오늘로 이동`,today:`오늘`,showTaskList:`작업 목록 표시`,hideTaskList:`작업 목록 숨기기`}},view:{editViewConfig:`보기 구성 편집`,rename:`이름 변경`,duplicateView:`뷰 복제`,shareView:`뷰 공유`,setAsDefault:`기본값으로 설정`,pinView:`뷰 고정`,unpinView:`고정 해제`,changeViewType:`뷰 유형 변경`,deleteView:`뷰 삭제`,addView:`뷰 추가`,unsavedChanges:`저장되지 않은 변경`,saveAsView:`뷰로 저장`,moreViews:`{{count}}개 더`,activeFilters:`필터 적용 중`,activeSort:`정렬 적용 중`,manageViews:`보기 관리`,manageAllViews:`모든 보기 관리…`,manageViewsDescription:`이 객체의 모든 보기를 재정렬, 이름 변경, 고정 또는 삭제합니다.`,searchViews:`보기 검색`,addNewView:`새 보기 추가`,done:`완료`,noViewsFound:`검색과 일치하는 보기가 없습니다.`,dragToReorder:`드래그하여 순서 변경`,defaultView:`기본 보기`,defaultBadge:`기본`,tabActionsFor:`{{name}}의 보기 작업`,readonlyAriaLabel:`읽기 전용 보기`,readonlyTooltip:`시스템 보기 — 사용자 지정하려면 복제하세요.`},designer:{undo:`Undo`,redo:`Redo`},detail:{back:`뒤로`,edit:`편집`,editInline:`편집`,save:`저장`,saveChanges:`변경사항 저장`,editFieldsInline:`필드 편집`,share:`공유`,duplicate:`복제`,export:`내보내기`,viewHistory:`기록 보기`,delete:`삭제`,moreActions:`더 많은 작업`,addToFavorites:`즐겨찾기에 추가`,removeFromFavorites:`즐겨찾기에서 제거`,previousRecord:`이전 레코드`,nextRecord:`다음 레코드`,recordOf:`{{current}} / {{total}}`,recordNotFound:`레코드를 찾을 수 없음`,recordNotFoundDescription:`찾으시는 레코드가 존재하지 않거나 삭제되었을 수 있습니다.`,goBack:`뒤로`,details:`상세정보`,related:`관련`,relatedRecords:`{{count}}개 레코드`,relatedRecordOne:`{{count}}개 레코드`,noRelatedRecords:`관련 레코드를 찾을 수 없습니다`,loading:`로딩 중...`,copyToClipboard:`클립보드에 복사`,copied:`복사됨!`,deleteConfirmation:`이 레코드를 삭제하시겠습니까?`,editRecord:`레코드 편집`,viewAll:`모두 보기`,new:`새로 만들기`,emptyValue:`—`,comments:`댓글`,searchComments:`댓글 검색…`,addCommentPlaceholder:`댓글 추가… (Ctrl+Enter로 제출)`,noMatchingComments:`일치하는 댓글이 없습니다`,noCommentsYet:`아직 댓글이 없습니다`,pinned:`고정됨`,pin:`고정`,unpin:`고정 해제`,justNow:`방금`,minutesAgo:`{{count}}분 전`,hoursAgo:`{{count}}시간 전`,daysAgo:`{{count}}일 전`,dropFilesToUpload:`파일을 여기에 끌어놓거나 클릭하여 업로드`,attachmentCount:`첨부파일 {{count}}개`,attachmentCountPlural:`첨부파일 {{count}}개`,removeAttachment:`첨부파일 제거`,unifiedDiff:`통합 보기`,sideBySideDiff:`나란히 보기`,noChanges:`변경 없음`,previousVersion:`이전 버전`,currentVersion:`현재 버전`,discussion:`토론`,showDiscussion:`토론 보기 ({{count}})`,hideDiscussion:`토론 숨기기`,bold:`굵게 (Ctrl+B)`,italic:`기울임 (Ctrl+I)`,listFormat:`목록`,inlineCode:`인라인 코드`,mentionSomeone:`멘션하기`,preview:`미리보기`,submitComment:`제출 (Ctrl+Enter)`,sendComment:`보내기`,writeComment:`댓글 작성…`,subscribedTooltip:`구독 중 — 클릭하여 구독 취소`,unsubscribedTooltip:`알림 구독`,firstRecord:`첫 번째 레코드 (Home)`,previousRecordKey:`이전 레코드 (←)`,nextRecordKey:`다음 레코드 (→)`,lastRecord:`마지막 레코드 (End)`,noRecords:`레코드 없음`,searchWhileNavigating:`탐색 중 검색`,searchRecords:`레코드 검색…`,allActivity:`모든 활동`,commentsOnly:`댓글만`,fieldChangesFilter:`필드 변경`,tasksOnly:`작업만`,leaveCommentPlaceholder:`댓글 남기기… (Ctrl+Enter로 제출)`,noActivity:`기록된 활동 없음`,loadMore:`더 보기`,edited:`(수정됨)`,via:`{{source}} 통해`,replyCount:`답글 {{count}}개`,replyCountPlural:`답글 {{count}}개`,replyPlaceholder:`답글…`,filterActivity:`활동 필터`,openDiscussion:`토론 패널 열기`,closeDiscussion:`토론 패널 닫기`,subscribeAriaLabel:`알림 구독`,unsubscribeAriaLabel:`알림 구독 취소`,clearSearch:`검색 지우기`,saving:`저장 중…`,lockedByApproval:`승인을 위해 잠김`,lockedTooltip:`이 레코드에 대기 중인 승인 요청이 있습니다. 편집이 잠겨 있습니다`,cancelApproval:`승인 취소`,cancelApprovalInFlight:`취소 중…`,cancelApprovalTooltip:`대기 중인 승인 요청을 취소하여 레코드 잠금 해제`,cancelApprovalFailed:`승인 취소 실패`,cancelApprovalUnavailable:`이 데이터 소스에서는 승인 취소가 지원되지 않습니다`,linkCopied:`링크가 클립보드에 복사됨`,linkCopyFailed:`링크 복사 실패`,cancel:`취소`,cancelEdit:`변경 사항 취소`,sectionMoreDetails:`추가 세부 정보`,concurrentUpdateTitle:`이 레코드가 다른 사람에 의해 수정되었습니다`,concurrentUpdateDescription:`다른 사용자가 편집하는 동안 {{field}}의 최신 버전을 저장했습니다. 충돌 해결 방법을 선택하세요.`,concurrentUpdateYourEdit:`내 편집`,concurrentUpdateCurrentValue:`현재 값`,concurrentUpdateUpdatedBy:`{{name}}이(가) 업데이트`,concurrentUpdateUpdatedAt:`{{when}}에 업데이트`,concurrentUpdateReload:`현재 버전 로드`,concurrentUpdateOverwrite:`그래도 덮어쓰기`,concurrentUpdateCancel:`취소`,openInNewTab:`새 탭에서 열기`,activity:`활동`,history:`기록`,editRow:`편집`,deleteRow:`삭제`,deleteRowConfirmation:`이 레코드를 삭제하시겠습니까?`,deleteRowTitle:`레코드 삭제`,actions:`작업`,previousPage:`이전`,nextPage:`다음`,pageOf:`{{total}}페이지 중 {{current}}페이지`,sortBy:`정렬 기준`,filterPlaceholder:`필터...`,highlightFields:`주요 필드`,createdBy:`작성자`,updatedBy:`업데이트한 사람`,showEmptyRelated_one:`+ {{count}}개 비어 있음`,showEmptyRelated_other:`+ {{count}}개 비어 있음`,copyEmail:`이메일 복사`,copyPhone:`전화번호 복사`,copyRecordId:`레코드 ID 복사`,showEmptyFields:`{{count}}개의 빈 필드 표시`,hideEmptyFields:`빈 필드 숨기기`,noValue:`값 없음`},chart:{noData:`차트 데이터가 없습니다`,loading:`차트 로딩 중...`},map:{searchLocations:`위치 검색…`,locationDetails:`위치 상세`,markersCount:`마커 {{count}}개`,invalidCoordinates:`좌표가 누락되었거나 유효하지 않아 {{count}}개 레코드가 지도에서 제외되었습니다.`,invalidCoordinatesPlural:`좌표가 누락되었거나 유효하지 않아 {{count}}개 레코드가 지도에서 제외되었습니다.`},workflow:{draft:`초안`,active:`활성`,paused:`일시 중지`,completed:`완료`,cancelled:`취소됨`,save:`저장`,publish:`게시`,addNode:`노드 추가`,workflowFlow:`워크플로우`,properties:`속성`,connections:`연결`,quickConnect:`빠른 연결`,fromPlaceholder:`시작...`,toPlaceholder:`종료...`,connect:`연결`,label:`라벨`,type:`유형`,description:`설명`,assignee:`담당자`,assigneeType:`담당자 유형`,user:`사용자`,role:`역할`,group:`그룹`,expression:`수식`,timeoutMinutes:`제한 시간(분)`,selectNodeToEdit:`속성을 편집할 노드를 선택하세요`,workflowTitle:`워크플로우 제목`,newWorkflow:`새 워크플로우`,outConnections:`{{count}}개 출력`,start:`시작`,end:`종료`,task:`작업`,userTask:`사용자 작업`,serviceTask:`서비스 작업`,scriptTask:`스크립트 작업`,approval:`승인`,condition:`조건`,parallelGateway:`병렬 게이트웨이`,joinGateway:`합류 게이트웨이`,boundaryEvent:`경계 이벤트`,delay:`지연`,notification:`알림`,webhook:`Webhook`,allowConcurrency:`허용 (동시 실행)`,forbidConcurrency:`금지 (새 작업 건너뛰기)`,replaceConcurrency:`대체 (기존 취소)`,queueConcurrency:`대기열 (현재 완료 후 실행)`,conditionEvent:`조건`,manualEvent:`수동`,webhookEvent:`Webhook`,timerEvent:`타이머`,signalEvent:`시그널`,versionHistory:`버전 기록`,importBpmn:`BPMN 가져오기`,exportBpmn:`BPMN 내보내기`,undo:`실행 취소`,redo:`다시 실행`,resetZoom:`확대/축소 초기화`},dashboard:{addWidget:`위젯 추가`,removeWidget:`위젯 제거`,editLayout:`레이아웃 편집`,saveLayout:`레이아웃 저장`,resetLayout:`레이아웃 초기화`,total:`합계`,noDataAvailable:`사용 가능한 데이터 없음`,noDataSourceFor:`데이터 소스 없음:`,trend:{vsLastQuarter:`전분기 대비`,vsLastMonth:`전월 대비`,vsLastWeek:`전주 대비`,vsLastYear:`전년 대비`,vsYesterday:`어제 대비`,vsPreviousPeriod:`이전 기간 대비`}},configPanel:{save:`저장`,discard:`취소`,close:`닫기`,layout:`레이아웃`,columns:`열`,gap:`간격`,rowHeight:`행 높이`,data:`데이터`,refreshInterval:`새로고침 간격`,appearance:`모양`,title:`제목`,showDescription:`설명 표시`,theme:`테마`,configuration:`구성`,general:`일반`,advanced:`고급`},appDesigner:{createApp:`앱 만들기`,editApp:`앱 편집`,basicInfo:`기본 정보`,objects:`오브젝트`,navigation:`탐색`,branding:`브랜딩`,appName:`앱 이름`,appTitle:`제목`,appDescription:`설명`,appIcon:`아이콘`,template:`템플릿`,layout:`레이아웃`,layoutSidebar:`사이드바`,layoutHeader:`헤더`,layoutEmpty:`비어 있음`,selectObjects:`오브젝트 선택`,searchObjects:`오브젝트 검색…`,selectAll:`모두 선택`,deselectAll:`모두 해제`,navBuilder:`탐색 빌더`,addGroup:`그룹 추가`,addUrl:`URL 추가`,addSeparator:`구분선 추가`,noNavItems:`탐색 항목이 아직 없습니다.`,logoUrl:`Logo URL`,primaryColor:`기본 색상`,faviconUrl:`Favicon URL`,preview:`미리보기`,complete:`완료`,snakeCaseHint:`Must be snake_case (e.g. my_app)`,modeEdit:`편집`,modePreview:`미리보기`,modeCode:`코드`,addWidget:`위젯 추가`,widgetProperties:`위젯 속성`,dataSource:`데이터 소스`,valueField:`값 필드`,aggregate:`집계`,colorVariant:`색상 변형`,addComponent:`컴포넌트 추가`,componentProperties:`컴포넌트 속성`,viewType:`보기 유형`,fields:`필드`,toolbar:`도구 모음`,showSearch:`검색 표시`,showFilters:`필터 표시`,showSort:`정렬 표시`,appearance:`외관`,rowHeight:`행 높이`,stripedRows:`줄무늬 행`,bordered:`테두리`,livePreview:`실시간 미리보기`,stepBasicDesc:`이름, 제목 및 레이아웃`,stepObjectsDesc:`비즈니스 객체 선택`,stepNavigationDesc:`네비게이션 트리 구성`,stepBrandingDesc:`로고, 색상 및 파비콘`,noObjectsFound:`객체를 찾을 수 없습니다.`,noNavItemsHint:`네비게이션 항목이 없습니다. 이전 단계에서 객체를 선택하거나 수동으로 추가하세요.`,separator:`구분선`,separatorLabel:`— 구분선 —`,newGroup:`새 그룹`,newLink:`새 링크`,saveDraft:`임시 저장`,cancelConfirmTitle:`변경 사항을 폐기하시겠습니까?`,cancelConfirmMessage:`저장되지 않은 변경 사항이 있습니다. 취소하시겠습니까?`,confirmDiscard:`폐기`,keepEditing:`편집 계속`,navNoItems:`네비게이션 항목이 없습니다. 위 버튼을 클릭하여 항목을 추가하세요.`,navNoPreviewItems:`항목 없음`,navLivePreview:`실시간 미리보기`,navCollapseGroup:`그룹 접기`,navExpandGroup:`그룹 펼치기`,navAddChild:`하위 항목 추가`,navMoveUp:`위로 이동`,navMoveDown:`아래로 이동`,navRemove:`제거`,navObjectPage:`객체 페이지`,navDashboard:`대시보드`,navPage:`페이지`,navReport:`보고서`,navGroup:`그룹`,navUrl:`URL`,navSeparator:`구분선`,navTypeObject:`오브젝트`,navTypeDashboard:`대시보드`,navTypePage:`페이지`,navTypeReport:`보고서`,navTypeUrl:`URL`,navTypeGroup:`그룹`,navTypeSeparator:`구분선`,navTypeAction:`작업`,navEditIcon:`아이콘 편집`,navToggleVisible:`가시성 토글`,navHidden:`숨김`,navExportSchema:`JSON 내보내기`,navImportSchema:`JSON 가져오기`,navExportSuccess:`탐색 스키마 내보냄`,navImportSuccess:`탐색 스키마 가져옴`,navImportError:`잘못된 탐색 JSON`,navIconPlaceholder:`아이콘 이름 (예: Users)`,dashboardEditor:`대시보드 편집기`,noWidgets:`위젯 없음. 위의 버튼을 클릭하여 추가하세요.`,widgetLayoutSize:`레이아웃 크기`,widgetWidth:`너비`,widgetHeight:`높이`,dashboardPreview:`대시보드 미리보기`,noWidgetsPreview:`미리 볼 위젯이 없습니다`,pageCanvasEditor:`페이지 캔버스 편집기`,emptyPage:`빈 페이지. 위의 버튼을 클릭하여 컴포넌트를 추가하세요.`,pagePreview:`페이지 미리보기`,noComponentsPreview:`미리 볼 컴포넌트가 없습니다`,modePage:`페이지`,modeDashboard:`대시보드`,undo:`실행 취소`,redo:`다시 실행`,brandingEditor:`브랜딩 편집기`,brandingExport:`JSON 내보내기`,brandingImport:`JSON 가져오기`,brandingPreview:`미리보기`,brandingSampleButton:`샘플 버튼`,brandingSampleText:`브랜드 테마의 외관입니다.`,colorPalette:`색상 팔레트`,fontFamily:`글꼴 패밀리`,fontDefault:`기본값 (시스템)`,modeLight:`밝음`,modeDark:`어두움`,mobilePreview:`모바일 미리보기`,objectManager:{title:`오브젝트 관리자`,addObject:`새 오브젝트`,searchPlaceholder:`오브젝트 검색…`,noObjects:`오브젝트를 찾을 수 없습니다.`,objectName:`API 이름`,objectLabel:`레이블`,pluralLabel:`복수 레이블`,icon:`아이콘`,selectIcon:`아이콘 선택…`,group:`그룹`,noGroup:`그룹 없음`,sortOrder:`정렬 순서`,enabled:`활성화됨`,relationships:`관계`,systemBadge:`시스템`,fieldCount:`{{count}}개 필드`,ungrouped:`그룹 없음`,deleteConfirmTitle:`오브젝트를 삭제하시겠습니까?`,deleteConfirmMessage:`이 오브젝트와 모든 필드가 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.`},fieldDesigner:{title:`필드 디자이너`,addField:`새 필드`,searchPlaceholder:`필드 검색…`,allTypes:`모든 유형`,noFields:`필드를 찾을 수 없습니다.`,fieldName:`API 이름`,fieldLabel:`레이블`,fieldType:`유형`,fieldGroup:`그룹`,description:`설명`,required:`필수`,unique:`고유`,readOnly:`읽기 전용`,hidden:`숨김`,indexed:`인덱스됨`,externalId:`외부 ID`,trackHistory:`기록 추적`,defaultValue:`기본값`,placeholder:`자리 표시자`,referenceTo:`참조 대상`,formula:`수식`,options:`옵션`,addOption:`옵션 추가`,validationRules:`유효성 검사 규칙`,addRule:`규칙 추가`,systemBadge:`시스템`,ungrouped:`일반`,deleteConfirmTitle:`필드를 삭제하시겠습니까?`,deleteConfirmMessage:`필드가 영구적으로 삭제됩니다. 이 필드의 기존 데이터는 손실됩니다.`,basicSection:`기본`,typeSpecificSection:`유형 설정`,advancedSection:`고급`,typeCategory:{text:`텍스트`,number:`숫자`,date:`날짜 및 시간`,choice:`선택`,relation:`관계`,advanced:`고급`}}},console:{title:`ObjectStack 콘솔`,initializing:`애플리케이션 초기화 중...`,breadcrumb:{dashboards:`대시보드`,pages:`페이지`,reports:`보고서`,system:`시스템`},loadingSteps:{connecting:`데이터 소스에 연결 중`,loadingConfig:`설정 로드 중`,preparingWorkspace:`워크스페이스 준비 중`},error:{connectionFailed:`서버에 연결할 수 없습니다`,serverUnreachable:`서버 {{url}}에 연결할 수 없습니다.`,checkServer:`네트워크 연결을 확인하거나 백엔드가 실행 중인지 확인하세요.`,timeout:`연결 시간이 초과되었습니다 (10초).`},actions:{retry:`재시도`,retrying:`재시도 중…`},shortcuts:{title:`키보드 단축키`,description:`사용 가능한 모든 키보드 단축키 빠른 참조.`,groups:{general:`일반`,navigation:`탐색`,dataViews:`데이터 뷰`,preferences:`환경설정`},openCommandPalette:`명령 팔레트 열기`,showShortcuts:`키보드 단축키 표시`,closeDialog:`대화상자 / 패널 닫기`,toggleSidebar:`사이드바 전환`,focusSearch:`검색에 포커스`,createRecord:`새 레코드 생성`,refreshData:`데이터 새로고침`,editRecord:`선택한 레코드 편집`,toggleDarkMode:`다크 모드 전환`},commandPalette:{placeholder:`명령어를 입력하거나 검색...`,noResults:`결과를 찾을 수 없습니다.`,objects:`객체`,dashboards:`대시보드`,pages:`페이지`,reports:`보고서`,switchApp:`앱 전환`,current:`현재`,preferences:`환경설정`,lightTheme:`라이트 테마`,darkTheme:`다크 테마`,systemTheme:`시스템 테마`,actions:`작업`,openFullSearch:`전체 검색 페이지 열기`,createApp:`새 앱 만들기`,searching:`검색 중…`,records:`레코드`,recentRecords:`최근 본 항목`},errors:{somethingWentWrong:`문제가 발생했습니다`,unexpectedError:`이 뷰를 렌더링하는 중 예기치 않은 오류가 발생했습니다.`,tryAgain:`다시 시도`,goHome:`홈으로 이동`,errorDetails:`오류 상세정보 (개발 모드 전용)`},theme:{toggle:`테마 전환`,light:`라이트`,dark:`다크`,system:`시스템`},objectView:{systemViewReadonly:`System view defined in code - duplicate to customize.`,expandToPage:`Open as full page`,objectNotFound:`객체를 찾을 수 없음`,objectNotFoundDescription:`객체 "{{objectName}}"이(가) 현재 구성에 존재하지 않습니다.`,objectNotFoundHint:`앱 탐색 설정을 확인하거나 사이드바에서 다른 객체를 선택하세요.`,allRecords:`모든 레코드`,exitDesignMode:`디자인 모드 종료`,enterDesignMode:`디자인 모드 시작`,metadataInspector:`메타데이터 인스펙터`,editView:`뷰 편집`,addView:`뷰 추가`,designTools:`디자인 도구`,new:`새로 만들기`,configureView:`뷰 구성`,closePanel:`패널 닫기`,page:`페이지`,pageConfigHint:`도구 모음, 탐색 및 뷰 셸 설정`,listConfigHint:`이 목록 유형의 데이터 렌더링, 열 및 모양`,general:`일반`,generalHint:`보기 제목, 설명 및 유형`,toolbar:`도구 모음`,toolbarHint:`검색, 필터, 정렬, 그룹화 및 밀도 전환`,toolbarEnabledCount:`{{total}}개 중 {{count}}개 활성화`,navigationSection:`탐색`,navigationHint:`행 클릭 동작 및 상세 보기 설정`,records:`레코드`,recordsHint:`선택 모드, 레코드 추가 및 인라인 편집`,exportPrint:`내보내기 및 인쇄`,exportPrintHint:`내보내기 형식, 인쇄 및 레코드 수 표시`,showAllFields:`모두 표시`,hideAllFields:`모두 숨기기`,searchFields:`필드 검색...`,title:`제목`,description:`설명`,data:`데이터`,source:`소스`,columns:`열`,filterBy:`필터 기준`,sortBy:`정렬 기준`,appearance:`외관`,showDescription:`설명 표시`,viewType:`뷰 유형`,userFilters:`사용자 필터`,enableSearch:`검색 활성화`,enableFilter:`필터 활성화`,enableSort:`정렬 활성화`,enableHideFields:`필드 숨기기 활성화`,enableGroup:`그룹 활성화`,enableColor:`색상 활성화`,enableDensity:`밀도 활성화`,userActions:`사용자 작업`,addRecordViaForm:`양식으로 레코드 추가`,advanced:`고급`,allowExport:`내보내기 허용`,recordCount:`{{count}}개 레코드`,noDescription:`설명 없음`,none:`없음`,columnsConfigured:`{{count}}개 열`,save:`저장`,discard:`취소`,createView:`뷰 생성`,newView:`새 뷰`,typeOptions:`유형 옵션`,groupByField:`그룹화 필드`,startDateField:`시작 날짜 필드`,titleField:`제목 필드`,latitudeField:`위도 필드`,longitudeField:`경도 필드`,imageField:`이미지 필드`,dateField:`날짜 필드`,selectField:`필드 선택...`,gridOptionsHint:`그리드 뷰는 위에서 구성된 열을 사용합니다.`,groupBy:`그룹화 기준`,prefixField:`접두사 필드`,fields:`필드`,fieldsVisible:`{{count}}개 표시`,sortsCount:`{{count}}개 정렬`,filtersCount:`{{count}}개 필터`,endDateField:`종료 날짜 필드`,color:`색상`,fieldTextColor:`필드 텍스트 색상`,rowHeight:`행 높이`,wrapHeaders:`헤더 줄바꿈`,showFieldDescriptions:`필드 설명 표시`,collapseAllByDefault:`기본적으로 모두 접기`,striped:`줄무늬 행`,bordered:`테두리 셀`,inlineEdit:`인라인으로 레코드 편집`,addDeleteRecordsInline:`인라인으로 레코드 추가/삭제`,clickIntoRecordDetails:`레코드 상세 보기 클릭`,navigationMode:`탐색 모드`,navigationWidth:`탐색 너비`,navigationWidthHint:`서랍, 모달, 분할 탐색 모드에서 사용 가능`,openNewTab:`새 탭에서 열기`,openNewTabHint:`페이지 및 새 창 탐색 모드에서 사용 가능`,import:`가져오기`,importTitle:`CSV에서 가져오기`,importedToast:`{{count}}개 행 가져옴.`,importedWithSkipped:`{{ok}}개 행 가져옴; {{skipped}}개 건너뜀.`,showAdvancedSettings:`고급 설정 표시`,showFewerSettings:`설정 줄이기`,createViewDesc:`보기 유형을 선택하고 이름을 지정하세요. 모든 설정은 나중에 변경할 수 있습니다.`,cancel:`취소`,create:`생성`,delete:`삭제`,deleteViewTitle:`보기 삭제`,deleteViewConfirm:`"{{name}}" 보기를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.`,bulkDeleteConfirm:`선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.`,duplicateViewName:`해당 이름의 보기가 이미 존재합니다.`,viewTypeGrid:`그리드`,viewTypeGridDesc:`레코드의 스프레드시트 형식 테이블.`,viewTypeKanban:`칸반`,viewTypeKanbanDesc:`단일 선택 필드로 열에 그룹화된 카드.`,viewTypeCalendar:`캘린더`,viewTypeCalendarDesc:`월별 캘린더에 날짜로 배치된 레코드.`,viewTypeGallery:`갤러리`,viewTypeGalleryDesc:`첨부 파일 필드의 대형 이미지 카드.`,viewTypeTimeline:`타임라인`,viewTypeTimelineDesc:`수평 시간 축을 따른 레코드.`,viewTypeGantt:`간트`,viewTypeGanttDesc:`시작/종료 및 종속성이 있는 프로젝트 막대.`,viewTypeMap:`지도`,viewTypeMapDesc:`위도/경도 필드의 지리적 마커.`,viewTypeChart:`차트`,viewTypeChartDesc:`집계된 막대형/꺾은선형/원형 차트.`,groupByFieldHelp:`칸반 보드는 필드 값에 따라 레코드를 열로 그룹화합니다.`,startDateFieldHelp:`캘린더는 이 날짜에 해당하는 셀에 레코드를 배치합니다.`,ganttStartDateFieldHelp:`각 간트 막대의 왼쪽 가장자리는 이 날짜를 사용합니다.`,ganttEndDateFieldHelp:`각 간트 막대의 오른쪽 가장자리는 이 날짜를 사용합니다.`,timelineDateFieldHelp:`레코드는 이 날짜를 기반으로 타임라인에 배치됩니다.`,latitudeFieldHelp:`위도를 포함하는 필드 (지리 필드만 해당).`,longitudeFieldHelp:`경도를 포함하는 필드 (지리 필드만 해당).`,imageFieldHelp:`갤러리 표지는 이 이미지 또는 첨부 파일 필드에서 가져옵니다.`,selectOption:`선택...`,noEligibleFieldForType:`해당 유형의 적합한 필드가 없습니다. 먼저 개체에 추가하세요.`,viewTypeUnavailable:`이 개체에는 "{{field}}"로 사용할 수 있는 필드가 없습니다.`,viewTypeUnavailableShort:`이 개체에서 지원되지 않습니다.`,chartType:`차트 유형`,chartTypeHelp:`데이터 렌더링 방식을 결정합니다.`,chartTypeBar:`막대 차트`,chartTypeLine:`꺾은선형 차트`,chartTypePie:`원형 차트`,chartTypeArea:`영역 차트`,chartTypeScatter:`분산형 차트`,xAxisField:`X축 필드`,xAxisFieldHelp:`범주형 또는 시간 차원.`,yAxisField:`Y축 필드`,yAxisFieldHelp:`집계할 숫자 필드.`,selectionMode:`선택 모드`,selectionNone:`없음`,selectionSingle:`단일`,selectionMultiple:`다중`,pageSize:`페이지 크기`,pageSizeOptions:`페이지 크기 옵션`,exportFormats:`내보내기 형식`,exportMaxRecords:`최대 레코드 수`,exportIncludeHeaders:`헤더 포함`,exportFileNamePrefix:`파일 이름 접두사`,searchableFields:`검색 가능한 필드`,filterableFields:`필터링 가능한 필드`,resizableColumns:`크기 조절 가능한 열`,densityCompact:`컴팩트`,densityComfortable:`보통`,densitySpacious:`넓음`,densityMode:`밀도 모드`,hiddenFields:`숨겨진 필드`,rowActions:`행 작업`,bulkActions:`일괄 작업`,sharing:`공유`,sharingEnabled:`공유 활성화`,sharingVisibility:`가시성`,addRecordEnabled:`레코드 추가 활성화`,addRecordPosition:`위치`,addRecordMode:`모드`,addRecordFormView:`양식 보기`,conditionalFormatting:`조건부 서식`,addRule:`규칙 추가`,quickFilters:`빠른 필터`,addQuickFilter:`빠른 필터 추가`,ufElements:`요소`,ufDropdown:`드롭다운`,ufTabs:`탭`,ufToggle:`토글`,ufAddField:`+ 필터 필드 추가...`,ufNoFields:`사용 가능한 필드 없음`,ufAddTab:`+ 탭 추가`,ufTabLabel:`레이블`,ufShowAllRecords:`"모든 레코드" 탭 표시`,ufAllowAddTab:`탭 추가 허용`,showRecordCount:`레코드 수 표시`,allowPrinting:`인쇄 허용`,virtualScroll:`가상 스크롤`,emptyStateTitle:`빈 상태 제목`,emptyStateMessage:`빈 상태 메시지`,emptyStateIcon:`빈 상태 아이콘`,ariaLabel:`ARIA 레이블`,ariaDescribedBy:`ARIA 설명`,ariaLive:`ARIA 라이브`,accessibility:`접근성`,viewTabs:`보기 탭`},localeSwitcher:{label:`언어`},search:`검색…`,nav:{pinItem:`{{name}} 고정`,unpinItem:`{{name}} 고정 해제`,dragToReorder:`드래그하여 순서 변경`,favorites:`즐겨찾기`}},auth:{login:{title:`계정에 로그인`,description:`이메일과 비밀번호를 입력하세요`,emailLabel:`이메일`,emailPlaceholder:`name@example.com`,passwordLabel:`비밀번호`,passwordPlaceholder:`비밀번호를 입력하세요`,forgotPasswordText:`비밀번호를 잊으셨나요?`,submitButton:`로그인`,submittingButton:`로그인 중...`,noAccountText:`계정이 없으신가요?`,signUpText:`회원가입`,errors:{invalidCredentials:`잘못된 이메일 또는 비밀번호입니다. 다시 시도하세요.`,emailNotVerified:`로그인하기 전에 이메일을 확인하세요.`}},register:{title:`계정 만들기`,description:`정보를 입력하여 시작하세요`,nameLabel:`이름`,namePlaceholder:`홍길동`,emailLabel:`이메일`,emailPlaceholder:`name@example.com`,passwordLabel:`비밀번호`,passwordPlaceholder:`비밀번호 생성 (최소 8자)`,confirmPasswordLabel:`비밀번호 확인`,confirmPasswordPlaceholder:`비밀번호를 다시 입력하세요`,passwordMismatchError:`비밀번호가 일치하지 않습니다`,passwordTooShortError:`비밀번호는 최소 8자 이상이어야 합니다`,submitButton:`계정 만들기`,submittingButton:`계정 생성 중...`,hasAccountText:`이미 계정이 있으신가요?`,signInText:`로그인`,errors:{userExists:`해당 이메일로 이미 계정이 존재합니다. 로그인해 보세요.`},verifyInbox:{title:`받은 편지함을 확인하세요`,description:`{{email}}에 확인 링크를 보냈습니다. 링크를 클릭하여 계정을 활성화하세요.`,resend:`확인 이메일 다시 보내기`,resending:`전송 중…`,resent:`확인 이메일이 전송되었습니다.`,backToSignIn:`로그인으로 돌아가기`}},forgotPassword:{title:`비밀번호 재설정`,description:`이메일 주소를 입력하시면 비밀번호 재설정 링크를 보내드립니다`,emailLabel:`이메일`,emailPlaceholder:`name@example.com`,submitButton:`재설정 링크 보내기`,submittingButton:`전송 중...`,successTitle:`이메일을 확인하세요`,successDescription:`{{email}}(으)로 비밀번호 재설정 링크를 전송했습니다. 수신함을 확인해주세요.`,backToSignInText:`로그인으로 돌아가기`,rememberPasswordText:`비밀번호가 기억나시나요?`,signInText:`로그인`},resetPassword:{title:`새 비밀번호 설정`,description:`이전에 사용하지 않은 비밀번호를 선택하세요.`,newPassword:`새 비밀번호`,confirmPassword:`비밀번호 확인`,submit:`비밀번호 업데이트`,submitting:`업데이트 중…`,success:`비밀번호가 업데이트되었습니다`,failed:`재설정 실패`,invalidToken:`이 재설정 링크는 유효하지 않거나 만료되었습니다.`,missingToken:`재설정 링크가 없거나 만료되었습니다`,passwordsMismatch:`비밀번호가 일치하지 않습니다`,requestNewLink:`새 링크 요청`},verifyEmail:{title:`이메일 주소 확인`,description:`이메일 주소로 확인 링크를 보냈습니다. 링크를 클릭하여 계정을 확인하세요.`,sentTo:`전송 대상:`,verifyingTitle:`확인 중…`,verifyingDescription:`이메일을 확인하고 있습니다. 잠시 기다리세요.`,successTitle:`이메일 확인됨`,successDescription:`이메일이 확인되었습니다. 이제 로그인할 수 있습니다.`,errorTitle:`확인 실패`,errorDescription:`확인에 실패했습니다. 새 링크를 요청하세요.`,missingToken:`확인 링크에 토큰이 없습니다.`,emailMissing:`이메일 주소 누락`,resendButton:`확인 이메일 다시 보내기`,resending:`전송 중…`,resent:`이메일이 전송되었습니다! 받은 편지함을 확인하세요`,resentSuccess:`확인 이메일이 전송되었습니다!`,resentDescription:`받은 편지함을 확인하고 확인 링크를 클릭하세요.`,resendFailed:`확인 이메일을 다시 보낼 수 없습니다`,signInLink:`로그인으로 이동`,backToSignIn:`로그인으로 돌아가기`,backToLogin:`로그인으로 돌아가기`,checkSpam:`이메일을 받지 못하셨나요? 스팸 폴더를 확인하거나 지원팀에 문의하세요.`,or:`또는`},setup:{welcomeTitle:`ObjectStack에 오신 것을 환영합니다`,description:`설정을 완료하려면 첫 번째 소유자 계정을 만드세요.`,yourName:`이름`,orgName:`조직 이름`,orgNamePlaceholder:`예시 회사`,emailLabel:`이메일`,emailPlaceholder:`name@example.com`,passwordLabel:`비밀번호`,passwordHint:`최소 8자`,submit:`소유자 계정 만들기`,submitting:`설정 중…`,failed:`설정 실패`},device:{title:`새 장치 승인`,subtitle:`{{email}}으로 로그인하기 위해 이 장치를 승인하세요.`,userCodeLabel:`장치 코드`,requesterLabel:`연결 요청 출처`,approveWarning:`방금 직접 시작한 연결인 경우에만 승인하세요. 승인하면 이 런타임이 조직의 비공개 패키지에 액세스할 수 있습니다.`,loggedInAs:`{{email}}으로 로그인됨`,approve:`장치 승인`,approving:`승인 중…`,approvedTitle:`장치가 승인되었습니다`,approvedDescription:`장치로 돌아갈 수 있습니다 — 곧 로그인될 것입니다.`,approveSuccess:`장치가 승인되었습니다`,approveSuccessDescription:`이 창을 닫을 수 있습니다.`,approveFailed:`승인 실패`,deny:`요청 거부`,denying:`거부 중…`,deniedTitle:`액세스 거부됨`,deniedDescription:`장치에 액세스 권한이 부여되지 않습니다.`,denyFailed:`요청을 거부할 수 없습니다`,invalidTitle:`잘못된 장치 링크`,invalidDescription:`URL에 장치 코드가 제공되지 않았습니다.`,loading:`로딩 중…`,cancel:`취소`},shell:{tenantHostHint:`이 작업 공간에 로그인하는 중입니다`}},errors:{networkError:`네트워크 오류입니다. 연결을 확인해주세요.`,serverError:`서버 오류입니다. 나중에 다시 시도해주세요.`,notFound:`리소스를 찾을 수 없습니다.`,unauthorized:`이 작업을 수행할 권한이 없습니다.`,forbidden:`접근이 거부되었습니다.`,timeout:`요청 시간이 초과되었습니다. 다시 시도해주세요.`,unknown:`예기치 않은 오류가 발생했습니다.`},workspace:{label:`워크스페이스`,default:`내 워크스페이스`,switch:`워크스페이스 전환`,create:`워크스페이스 생성`,createTitle:`워크스페이스 만들기`,createDescription:`워크스페이스는 팀이 협업할 수 있는 공유 공간입니다.`,createButton:`워크스페이스 생성`,nameLabel:`워크스페이스 이름`,namePlaceholder:`예: Acme Inc`,slugLabel:`URL 슬러그`,slugHint:`URL에 사용됩니다. 소문자, 숫자, 하이픈만 사용 가능합니다.`,invite:`구성원 초대`,members:`구성원`,settings:`워크스페이스 설정`},help:{appDocs:`이 앱의 문서`,allDocs:`전체 문서`,onlineDocs:`온라인 문서`},sidebar:{settings:`설정`,help:`도움말`,helpTooltip:`도움말 및 문서`,activityFeed:`활동 피드`,notifications:`알림`,approvals:`승인`,inbox:`받은 편지함`,inboxAriaLabel:`받은 편지함 열기`,area:`영역`,scope:`범위`,recent:`최근`,favorites:`즐겨찾기`,starred:`즐겨찾기`,removeFromFavorites:`즐겨찾기에서 {{name}} 제거`},topbar:{aiAssistant:`AI 어시스턴트`},home:{title:`홈`,subtitle:`워크스페이스 대시보드`,nav:`홈`,allApps:`모든 애플리케이션`,loading:`워크스페이스 로드 중...`,recent:`최근`,starred:`즐겨찾기`,welcome:`ObjectUI에 오신 것을 환영합니다`,welcomeDescription:`첫 애플리케이션을 만들거나 시스템 설정을 구성하여 시작하세요.`,createFirstApp:`첫 앱 만들기`,systemSettings:`시스템 설정`,browseMarketplace:`앱 마켓플레이스 탐색`,quickActions:{title:`빠른 작업`,createApp:`앱 생성`,createAppDesc:`새 애플리케이션으로 시작`,manageObjects:`객체 관리`,manageObjectsDesc:`데이터 모델 구성`,systemSettings:`시스템 설정`,systemSettingsDesc:`워크스페이스 구성`},appCard:{noDescription:`설명 없음`,default:`기본값`},greetingMorning:`좋은 아침이에요`,greetingAfternoon:`좋은 오후에요`,greetingEvening:`좋은 저녁이에요`,greetingNight:`야간 작업 중`,heroTagline:`마지막으로 중단한 곳에서 이어서 하거나 새로운 것을 발견해 보세요.`,open:`열기`,stats:{apps:`앱`,starred:`즐겨찾기`,recent:`최근`},recentApps:{title:`최근 열린 항목`,itemType:{object:`오브젝트`,dashboard:`대시보드`,page:`페이지`,record:`레코드`}},starredApps:{title:`즐겨찾기`},gettingStarted:{title:`홈 화면 맞춤설정`,description:`앱을 즐겨찾기에 추가하면 여기에 고정되어 한 번의 클릭으로 접근할 수 있습니다. 열리는 모든 항목은 "최근 열린 항목"에 자동으로 표시됩니다.`,cta:`모든 앱 탐색`}},layout:{appSwitcher:{home:`홈`,addApp:`앱 추가`,editApp:`앱 편집`,manageAllApps:`모든 앱 관리`,systemConsole:`시스템 콘솔`,noAppsConfigured:`구성된 앱 없음`},activityFeed:{title:`최근 활동`,filter:`필터`,empty:`최근 활동 없음`,ariaLabel:`활동 피드`,typeCreate:`생성`,typeUpdate:`업데이트`,typeDelete:`삭제`,typeComment:`댓글`,relativeJustNow:`방금 전`,relativeSecondsAgo:`{{count}}초 전`,relativeMinutesAgo:`{{count}}분 전`,relativeHoursAgo:`{{count}}시간 전`,relativeDaysAgo:`{{count}}일 전`,viewAll:`모든 활동 보기`},metadata:{label:`메타데이터`,toggleTitle:`메타데이터 검사기 토글`,panelTitle:`메타데이터 검사기`,jsonBadge:`JSON`,copyJson:`JSON 복사`}},search:{title:`검색`,back:`뒤로`,placeholder:`오브젝트, 대시보드, 페이지, 보고서 검색...`,inputAriaLabel:`오브젝트, 대시보드, 페이지, 보고서 검색`,resultsCount:`"{{query}}"에 대한 {{count}}개 결과`,resultsCountPlural:`"{{query}}"에 대한 {{count}}개 결과`,itemsAvailable:`{{count}}개 항목 사용 가능`,noResults:`결과를 찾을 수 없습니다`,noResultsHint:`검색어를 조정해 보세요`,typeObjects:`오브젝트`,typeDashboards:`대시보드`,typePages:`페이지`,typeReports:`보고서`,badgeObject:`오브젝트`,badgeDashboard:`대시보드`,badgePage:`페이지`,badgeReport:`보고서`},empty:{objectNotFound:`오브젝트를 찾을 수 없습니다`,objectNotFoundDescription:`"{{name}}" 오브젝트 정의가 없습니다. 구성을 확인하거나 뒤로 이동하세요.`,pageNotFound:`페이지를 찾을 수 없습니다`,pageNotFoundDescription:`"{{name}}" 페이지를 찾을 수 없습니다. 삭제되거나 이름이 변경되었을 수 있습니다.`,dashboardNotFound:`대시보드를 찾을 수 없습니다`,dashboardNotFoundDescription:`"{{name}}" 대시보드를 찾을 수 없습니다. 삭제되거나 이름이 변경되었을 수 있습니다.`,reportNotFound:`보고서를 찾을 수 없습니다`,reportNotFoundDescription:`"{{name}}" 보고서를 찾을 수 없습니다. 삭제되거나 이름이 변경되었을 수 있습니다.`,noAppsConfigured:`구성된 앱 없음`,noAppsConfiguredDescription:`등록된 앱이 없습니다. 첫 번째 앱을 만들거나 시스템 설정을 방문하세요.`,createFirstApp:`첫 번째 앱 만들기`,systemSettings:`시스템 설정`,back:`뒤로`,recordNotFound:`레코드를 찾을 수 없습니다`,recordNotFoundDescription:`찾고 있는 레코드가 존재하지 않거나 삭제되었을 수 있습니다.`},renderer:{noPageSchema:`페이지 스키마가 없습니다`,noFormSchema:`양식 스키마가 없습니다`,noDashboardSchema:`대시보드 스키마가 없습니다`,pageRendering:`페이지 렌더링: {{name}}`,dashboardRendering:`대시보드 렌더링: {{name}}`,formRenderingMode:`{{mode}} 모드로 양식 렌더링`,formRenderingFor:`레코드 {{id}}에 대해`,createRecord:`레코드 만들기`,editRecord:`레코드 편집`,page:`페이지`,dashboard:`대시보드`,save:`저장`,cancel:`취소`},actionDialog:{title:`작업 매개변수`,description:`계속하려면 필요한 정보를 입력하세요.`,selectPlaceholder:`{{label}} 선택`,requiredError:`{{label}}은(는) 필수입니다`,cancel:`취소`,confirm:`확인`,defaultActionTitle:`작업`,ok:`확인`,lookupPlaceholder:`{{label}}의 레코드 ID(UUID) 붙여넣기`,lookupHelpText:`참조된 개체의 레코드 ID를 입력하세요. 선택기가 곧 추가됩니다.`},actionConfirm:{title:`작업 확인`,confirm:`계속`,cancel:`취소`},rowAction:{openMenu:`메뉴 열기`,edit:`편집`,delete:`삭제`},navigationSync:{addedPage:`탐색 업데이트: 페이지 "{{name}}" 추가됨`,addedDashboard:`탐색 업데이트: 대시보드 "{{name}}" 추가됨`,removedPage:`탐색 업데이트: 페이지 "{{name}}" 제거됨`,removedDashboard:`탐색 업데이트: 대시보드 "{{name}}" 제거됨`,renamedPage:`탐색 업데이트: 페이지 "{{oldName}}"이(가) "{{newName}}"으로 이름 변경됨`,renamedDashboard:`탐색 업데이트: 대시보드 "{{oldName}}"이(가) "{{newName}}"으로 이름 변경됨`,undoLabel:`실행 취소`,undone:`탐색 변경 실행 취소됨`,undoFailed:`탐색 변경을 실행 취소할 수 없습니다`,updateFailed:`탐색을 업데이트할 수 없습니다`},objectActions:{deleteSuccess:`{{label}} 삭제 성공`,deleteFailed:`{{label}} 삭제 실패`,noRecordId:`레코드 ID가 없습니다`,deleteConfirm:`이 레코드를 삭제하시겠습니까?`,bulkDeleteSuccess:`{{count}}개의 {{label}} 레코드 삭제됨`,bulkDeletePartial:`{{succeeded}}개 삭제됨, {{failed}}개 실패`},objectViewActions:{renameFailed:`보기 이름 변경 실패`,deleteFailed:`보기 삭제 실패`},dashboardActions:{pdfPreparing:`PDF 내보내기 준비 중…`,exportFailed:`내보내기 실패: {{message}}`,forecastSoon:`예측 보기가 곧 출시됩니다`},recordDetail:{viewersTooltip:`현재 이 레코드를 보고 있는 사용자`},cellRender:{empty:`비어 있음`,yes:`예`,no:`아니요`,systemFields:`시스템`},user:{profile:`프로필`,settings:`설정`,logout:`로그아웃`,preferences:`환경설정`,theme:`테마`,language:`언어`},report:{total:`합계`,rowTotal:`행 합계`,columnTotal:`열 합계`,grandTotal:`총합계`,totals:`합계`,rowsLabel:`행`,columnsLabel:`열`,allLabel:`(전체)`,emptyLabel:`(비어 있음)`,loading:`로딩 중…`,failedToLoad:`매트릭스 로드 실패: {{message}}`,needsAcross:"매트릭스 보고서에는 하나 이상의 `groupingsAcross` 필드가 필요합니다.",aggregate:{count:`개수`,countDistinct:`고유 개수`,sum:`합계`,avg:`평균`,min:`최소`,max:`최대`,first:`첫 번째`},editor:{breadcrumb:`구성`,basic:`기본`,title:`제목`,titlePlaceholder:`예: 분기별 파이프라인`,description:`설명`,descriptionPlaceholder:`이 보고서가 무엇을 보여주나요?`,type:`보고서 유형`,typeTabular:`표 — 평면 목록`,typeSummary:`요약 — 합계 포함 그룹화`,typeMatrix:`매트릭스 — 행 × 열 피벗`,typeJoined:`결합 — 여러 블록`,typeHelp:`보고 싶은 형태에 맞는 레이아웃을 선택하세요.`,data:`데이터`,objectName:`데이터 소스`,objectNamePlaceholder:`예: opportunity`,objectNameHelp:`이 보고서가 조회할 객체는 무엇인가요?`,limit:`행 수 제한`,limitPlaceholder:`예: 100`,columns:`열`,columnsHint:`열로 표시할 필드를 선택하세요. 요약 또는 매트릭스 보고서에서는 집계(합계, 개수…)를 추가할 수 있습니다.`,filters:`필터`,filtersHint:`이 보고서에 포함되는 행을 제한합니다.`,filtersComplex:`이 보고서는 여기서 편집할 수 없는 고급 필터를 사용합니다. 저장 시 그대로 유지됩니다.`,groupBy:`그룹화 기준`,groupByHint:`데이터를 그룹화하고 소계를 계산합니다.`,rows:`행`,rowsHint:`이 필드들로 행을 그룹화합니다.`,columnsAxis:`열`,columnsAxisHint:`이 필드들을 상단에 피벗합니다.`,values:`값`,valuesHint:`각 셀에 표시되는 숫자입니다. 하나 이상의 필드를 선택하고 집계(합계, 개수…)를 지정하세요.`,grouping:`그룹화`,addGrouping:`그룹화 추가`,dateGranularity:`날짜 단위`,dateGranularityNone:`(원래 값 사용)`,day:`일`,week:`주`,month:`월`,quarter:`분기`,year:`연도`,sortAsc:`오름차순`,sortDesc:`내림차순`,chart:`차트`,chartHint:`표 옆에 표시되는 선택 시각화입니다.`,chartType:`차트 유형`,chartTitle:`차트 제목`,chartTitlePlaceholder:`기본값은 보고서 제목`,chartXAxis:`X축 (범주)`,chartYAxis:`Y축 (값)`,chartShowLegend:`범례 표시`,chartShowDataLabels:`데이터 레이블 표시`,chartNone:`(차트 없음)`,chartBar:`막대`,chartLine:`선`,chartArea:`영역`,chartPie:`원형`,chartDonut:`도넛`,chartFunnel:`퍼널`,validationNeedsObject:`열을 추가하기 전에 데이터 소스를 선택하세요.`,validationMatrixNeedsRowsCols:`매트릭스 보고서에는 최소 한 개의 행과 한 개의 열이 필요합니다.`,validationSummaryNeedsRows:`요약 보고서에는 최소 한 개의 그룹화 필드가 필요합니다.`,blocks:`블록`,blocksHint:`각 블록은 독립적인 표 또는 차트입니다. 블록 필터는 보고서 필터와 AND로 결합됩니다.`,addBlock:`블록 추가`,removeBlock:`블록 삭제`,blockName:`블록 이름`,blockNamePlaceholder:`고유한_블록_이름`,blockLabel:`표시 레이블`,blockLabelPlaceholder:`블록 위에 표시됩니다`,blockDescription:`설명`,blockDescriptionPlaceholder:`이 블록의 선택적 설명`,validationJoinedNeedsBlocks:`결합 보고서에는 최소 한 개의 블록이 필요합니다.`,validationBlockNameRequired:`각 블록에는 비어 있지 않은 이름이 필요합니다.`,validationBlockNameDuplicate:`블록 이름은 보고서 내에서 고유해야 합니다.`,validationBlockNeedsColumns:`각 블록에는 최소 한 개의 열이 필요합니다.`,noneOption:`(없음)`,addCondition:`조건 추가`,combineLogic:`결합 방식`,opContains:`포함`,opIsEmpty:`비어 있음`,opIsNotEmpty:`비어 있지 않음`,formatAuto:`자동`,formatCurrency:`통화`,formatPercent:`백분율`,formatInteger:`정수`,formatDate:`날짜`,formatDatetime:`날짜 및 시간`,columnLabelPlaceholder:`레이블 재정의`,aggregateColumn:`집계`,formatColumn:`형식`,addColumns:`열 추가`,searchFields:`필드 검색…`,noMatchingFields:`검색과 일치하는 필드가 없습니다.`,noFieldsAvailable:`사용 가능한 필드가 없습니다.`,columnsCount:`{n}개 열 선택됨`,columnsEmpty:`아직 선택된 열이 없습니다.`,fieldPickerTitle:`필드 선택`,fieldPickerDescription:`추가할 필드를 하나 이상 선택하세요. 검색 필드를 사용하여 목록을 필터링하세요.`,fieldPickerChangeTitle:`필드 변경`,fieldPickerAddGroupingTitle:`그룹화 추가`,fieldPickerEmpty:`(필드 선택)`,fieldPickerSelected:`{n}개 선택됨`,fieldPickerClear:`선택 지우기`,fieldPickerAdd:`추가`,fieldPickerAddN:`{n}개 추가`}},organizations:{mine:`내 조직`,title:`조직`,heading:`내 조직`,subtitle:`계속할 조직을 선택하거나 새 조직을 만드세요.`,searchPlaceholder:`조직 검색`,new:`새 조직`,current:`현재 조직`,manage:`관리`,emptyTitle:`아직 조직이 없습니다`,emptyDescription:`시작하려면 첫 번째 조직을 만드세요.`,noMatches:`검색과 일치하는 조직이 없습니다.`},notifications:{empty:`알림 없음`,markAllRead:`모두 읽음으로 표시`,viewAll:`모든 알림 보기`,approvalsPending:`{{count}}건의 승인 대기 중`,viewApprovals:`승인 보기`,noPendingApprovals:`대기 중인 승인 없음`,openApprovalsInbox:`승인 보관함 열기`,emptyUnread:`모두 읽음`,filterUnread:`읽지 않음`,filterAll:`전체`},publicForm:{submit:`제출`,submitting:`제출 중…`,submitAnother:`다른 답변 제출`,poweredBy:`ObjectStack 제공`,secureNotice:`귀하의 정보는 안전하게 전송되며 요청 처리에만 사용됩니다.`,thankYouTitle:`감사합니다!`,thankYouMessage:`제출이 성공적으로 수신되었습니다.`,redirecting:`{{seconds}}초 후 리디렉션됩니다…`,unavailableTitle:`양식을 사용할 수 없습니다`,unavailableDescription:`이 URL에서 사용 가능한 공개 양식이 없습니다. 기본 보기에서 익명 공유가 활성화되어 있는지 확인하세요.`,tryDemo:`데모 시도`,retry:`다시 시도`,loading:`양식 로딩 중…`,requiredHint:`* 필수 필드`,consentLabelDefault:`개인정보 처리방침에 동의하며 이 요청을 위해 내 데이터 처리에 동의합니다.`,consentLink:`개인정보 처리방침`,consentRequired:`계속하려면 개인정보 처리방침에 동의하세요.`,rateLimited:`제출하기 전에 잠시 답변을 검토하세요.`,redirectBlocked:`제출이 수락되었지만 보안상의 이유로 리디렉션 URL이 차단되었습니다.`,demo:{contactTitle:`문의하기`,contactDescription:`프로젝트에 대해 알려주시면 영업 담당자가 1 영업일 이내에 연락드립니다.`,supportTitle:`지원 요청 제출`,supportDescription:`문제를 설명해 주세요 — 팀이 1 영업일 이내에 답변 드립니다.`,thankYouSalesTitle:`감사합니다 — 메시지를 받았습니다!`,thankYouSalesMessage:`영업 담당자가 1 영업일 이내에 연락드립니다.`,thankYouSupportTitle:`접수되었습니다 — 요청이 대기 중입니다.`,thankYouSupportMessage:`지원 엔지니어가 곧 후속 조치를 취할 것입니다. 추가 스크린샷이 있으면 이 페이지를 저장하세요.`,field:{firstName:`이름`,lastName:`성`,email:`업무용 이메일`,phone:`전화번호`,jobTitle:`직함`,company:`회사`,website:`웹사이트`,industry:`업종`,companySize:`회사 규모`,howCanWeHelp:`어떻게 도와드릴까요?`,subject:`제목`,description:`설명`,issueType:`문제 유형`,priority:`우선순위`},industry:{technology:`기술`,software:`소프트웨어 / SaaS`,finance:`금융`,healthcare:`의료`,retail:`리테일`,other:`기타`},issueType:{question:`질문`,problem:`문제`,bug:`버그`,feature_request:`기능 요청`},priority:{low:`낮음`,medium:`보통`,high:`높음`,critical:`긴급`}}},marketplace:{title:`앱 마켓플레이스`,subtitle:`ObjectStack 카탈로그에 게시된 승인된 앱을 탐색하세요. 앱을 클릭하여 세부 정보를 보고 환경 중 하나에 설치하세요.`,searchPlaceholder:`이름 또는 매니페스트 ID로 앱 검색…`,searchAria:`마켓플레이스 앱 검색`,installed:`설치됨`,installedCount:`설치됨 ({{count}})`,refresh:`새로고침`,all:`전체`,noApprovedYet:`아직 마켓플레이스에 승인된 앱이 없습니다.`,noMatchFilters:`필터와 일치하는 앱이 없습니다.`,noDescription:`사용 가능한 설명이 없습니다.`,back:`마켓플레이스로 돌아가기`,installedTitle:`설치된 앱`,installedSubtitle:`이 런타임의 커널에 현재 설치된 마켓플레이스 패키지.`,installedEmpty:`아직 이 런타임에 마켓플레이스 앱이 설치되지 않았습니다.`,browseLink:`마켓플레이스 탐색 →`,installedAdditiveNote:`<strong>참고:</strong> 커널 API는 추가 전용입니다 — 제거하면 디스크에서 매니페스트가 삭제되어 다음 시작 시 패키지가 로드되지 않지만, 실행 중인 커널은 재시작될 때까지 앱을 등록된 상태로 유지합니다.`,installedAt:`{{when}} 설치됨`,installedBy:`{{user}}에 의해`,installedPackageId:`패키지`,cachedAs:`<code>{{path}}</code>로 캐시됨`,versionBadge:`v{{version}}`,installedBadge:`v{{version}} 설치됨`,load:{failed:`마켓플레이스를 로드할 수 없습니다`,failedHint:`기본적으로 이 런타임은 ObjectStack 퍼블릭 클라우드를 가리킵니다. 런타임이 온라인인지 확인하세요.`,packageFailed:`패키지를 로드할 수 없습니다`,notFound:`찾을 수 없습니다.`},detail:{homepage:`홈페이지`,installedV:`설치됨 · v{{version}}`,about:`정보`,noReadme:`사용 가능한 README 없음.`,versions:`버전`,noApprovedVersions:`승인된 버전 없음.`,prerelease:`프리릴리즈`,moreOptions:`추가 설치 옵션`,uninstallFromRuntime:`이 런타임에서 제거`,addSampleData:`샘플 데이터 추가`,reseedAgain:`샘플 데이터 다시 적재`,purgeSampleData:`샘플 데이터 삭제`,purgeConfirm:`이 패키지가 생성한 모든 샘플 레코드를 삭제하시겠습니까? 사용자가 추가한 레코드는 삭제되지 않습니다.`,purgeSuccess:`샘플 레코드 {{count}}개를 삭제했습니다.`,purgeNoData:`삭제할 샘플 레코드가 없습니다.`,reseedQueued:`샘플 데이터는 다음 환경 접속 시 다시 적재됩니다.`,reseedLocalSuccess:`샘플 데이터를 다시 적재했습니다: {{inserted}}개 추가, {{updated}}개 업데이트.`,reseedPartialErrors:`({{count}}개 레코드 쓰기 실패)`,updateAvailable:`업데이트 가능`},action:{install:`설치`,reinstall:`재설치`,working:`처리 중…`,installToCloud:`클라우드에 설치…`,installing:`설치 중…`,uninstall:`제거`,uninstalling:`제거 중…`,details:`세부 정보`,close:`닫기`,dismiss:`닫기`,openOnCloud:`클라우드에서 열기`,backHome:`홈으로 돌아가기`},install:{dialogTitle:`{{name}} 설치`,dialogDescCurrent:`이 환경에 설치 ({{host}}).`,dialogDescPicker:`이 앱을 설치할 환경을 선택하세요. ObjectStack Cloud에 로그인되어 있어야 합니다.`,environment:`환경`,environmentPlaceholder:`환경 선택`,includeSampleData:`샘플 데이터 포함`,noEnvs:`활성 조직에서 환경을 찾을 수 없습니다.`,noPermission:`환경에 앱을 설치할 권한이 없습니다. 조직 소유자 및 관리자만 설치할 수 있습니다.`,signInFirst:`먼저 ObjectStack Cloud에 로그인해야 합니다.`,success:`설치 성공. 환경을 열어 새 앱을 확인하세요.`,localSuccess:`이 런타임에 v{{version}} 설치됨. "{{name}}"이(가) 이제 앱 전환기에 표시됩니다.`,localManifestConflict:`{{message}}
|
|
@@ -31,4 +31,4 @@ O manifesto em cache será removido.`,successInList:`{{manifestId}} removido. Re
|
|
|
31
31
|
Кэшированный манифест будет удалён.`,successInList:`{{manifestId}} удалён. Перезапустите рантайм для полной выгрузки.`,successInDetail:`Кэшированный манифест {{manifestId}} удалён.`},accessDenied:{title:`Только для администраторов`,description:`Нет прав на установку приложений.`},category:{crm:`CRM`,erp:`ERP`,hr:`HR`,finance:`Финансы`,project:`Управление проектами`,collaboration:`Совместная работа`,analytics:`Аналитика`,integration:`Интеграция`,automation:`Автоматизация`,ai:`ИИ`,security:`Безопасность`,"developer-tools":`Инструменты разработчика`,"ui-theme":`Тема UI`,storage:`Хранилище`,other:`Другое`},pricing:{free:`Бесплатно`,freemium:`Freemium`,paid:`Платно`,subscription:`Подписка`,"usage-based":`По использованию`,"contact-sales":`Связаться с продажами`},relativeTime:{today:`сегодня`,daysAgo:`{{count}} д назад`,monthsAgo:`{{count}} мес назад`,yearsAgo:`{{count}} лет назад`}},approvalsInbox:{loadMore:`Загрузить ещё`,loadingMore:`Загрузка…`,loadedOf:`Загружено {{loaded}} из {{total}}`,actEscalate:`Эскалация SLA`,systemSlaActor:`Система (SLA)`,reassignBtn:`Передать`,reassignTitle:`Передать согласование другому?`,reassignBody:`Ваше место согласующего перейдёт выбранному человеку — он получит уведомление и сможет действовать сразу.`,reassignTo:`Новый согласующий`,reassignToPlaceholder:`Выберите пользователя или введите email / role:<имя>`,reassignSuccess:`Передано: {{to}}`,requestInfoBtn:`Запросить данные`,requestInfoTitle:`Запросить у заявителя дополнительную информацию?`,requestInfoBody:`Запрос остаётся в ожидании; заявитель получит уведомление и сможет ответить в обсуждении.`,requestInfoPlaceholder:`Что нужно от заявителя?`,requestInfoSent:`Возвращено заявителю за дополнениями`,remindBtn:`Напомнить`,remindSuccess:`Напоминание отправлено: {{count}}`,remindThrottled:`Напоминание уже отправлялось недавно — попробуйте позже.`,replyPlaceholder:`Ответить по этому запросу…`,slaRemaining:`SLA: осталось {{dur}}`,slaOverdue:`SLA просрочен на {{dur}}`,actReassign:`Передано`,actRemind:`Напоминание`,actRequestInfo:`Запрошены данные`,actComment:`Комментарий`,stepProgress:`Шаги согласования`,prevRequest:`Назад`,nextRequest:`Далее`,positionOf:`{{index}} из {{total}}`,quickPhrase1:`Согласовано — соответствует требованиям.`,quickPhrase2:`Согласовано с условиями — следите за исполнением.`,quickPhrase3:`Дополните материалы и отправьте повторно.`,title:`Центр согласований`,subtitle:`Просматривайте и обрабатывайте запросы на согласование.`,refresh:`Обновить`,tabMyPending:`Ожидают меня`,tabSubmitted:`Отправленные мной`,tabAll:`Все`,searchPlaceholder:`Поиск по записи, процессу, заявителю…`,clearSearch:`Очистить поиск`,statusFilter:`Статус`,allStatuses:`Все статусы`,processFilter:`Процесс`,allProcesses:`Все процессы`,objectFilter:`Объект`,allObjects:`Все объекты`,filterCount:`{{shown}} из {{total}}`,selected:`выбрано`,actionableCount:`({{count}} доступно)`,selectAll:`Выбрать все`,selectRow:`Выбрать запрос`,colRequest:`Запрос`,colRecord:`Запись`,colRequester:`Заявитель`,colStatus:`Статус`,colWaiting:`Отправлен`,colActions:`Действия`,statusPending:`Ожидает`,statusApproved:`Согласован`,statusRejected:`Отклонён`,statusRecalled:`Отозван`,statusReturned:`Возвращено на доработку`,sendBackBtn:`Вернуть`,sendBackTitle:`Вернуть этот запрос на доработку?`,sendBackBody:`Этот раунд завершается, запись разблокируется, и заявитель может исправить данные. После повторной отправки откроется новый раунд согласования для всех согласующих.`,sendBackPlaceholder:`Что нужно исправить, чтобы запрос можно было согласовать?`,sendBackSuccess:`Возвращено на доработку — заявитель может изменить данные и отправить повторно`,sendBackAutoRejected:`Достигнут лимит доработок — запрос был автоматически отклонён`,actRevise:`Возвращено на доработку`,actResubmit:`Отправлено повторно`,roundChip:`Раунд {{n}}`,returnedHint:`Согласующий вернул вам этот запрос. Запись разблокирована — исправьте данные и отправьте повторно, чтобы начать новый раунд согласования.`,resubmitBtn:`Отправить повторно`,resubmitting:`Повторная отправка…`,resubmitSuccess:`Отправлено повторно — открыт новый раунд согласования`,resubmitPlaceholder:`Что вы изменили?`,editRecordBtn:`Изменить запись`,abandonTitle:`Отказаться от доработки?`,abandonBody:`Запрос будет отозван вместо повторной отправки. Согласование на этом завершается.`,emptyTitle:`Запросов нет`,emptyPending:`Всё обработано — ничего не ожидает вашего решения.`,emptyOther:`Здесь пока пусто.`,emptyViewAll:`Все запросы`,noMatches:`Нет совпадений с текущими фильтрами.`,keyboardHint:`Клавиши: j/k перемещение · Enter открыть · x выбрать · a согласовать · r отклонить`,drawerTitle:`Запрос на согласование`,submittedAgo:`Отправлен {{when}}`,completedAt:`Завершён {{when}}`,waitingOn:`Ожидает решения`,history:`История`,noActions:`Действий пока нет.`,actSubmit:`Отправлен`,actApprove:`Согласован`,actReject:`Отклонён`,actRecall:`Отозван`,rawData:`Исходные данные (JSON)`,copy:`Копировать`,copied:`Скопировано`,copyFailed:`Не удалось скопировать`,overrideActor:`Действовать от другого имени (админ)`,actor:`Идентичность`,auto:`Авто`,overrideHint:`например, role:sales_manager. Оставьте пустым для автоматического определения.`,comment:`Комментарий (необязательно)`,approve:`Согласовать`,approving:`Согласование…`,reject:`Отклонить`,rejecting:`Отклонение…`,recall:`Отозвать`,recalling:`Отзыв…`,cancel:`Отмена`,clear:`Очистить`,approveN:`Согласовать {{count}}`,rejectN:`Отклонить {{count}}`,bulkApproveTitle:`Согласовать {{count}} запросов?`,bulkApproveBody:`Каждый запрос согласуется от вашего имени, и поток продолжится по ветке согласования.`,bulkRejectTitle:`Отклонить {{count}} запросов?`,bulkRejectBody:`Выбранные запросы будут отклонены, заявители получат уведомления.`,bulkApproved:`Согласовано запросов: {{count}}`,bulkRejected:`Отклонено запросов: {{count}}`,bulkPartial:`Успешно: {{ok}}, с ошибкой: {{fail}}: {{which}}`,rejectOneTitle:`Отклонить «{{title}}»?`,rejectOneBody:`Запрос будет отклонён, заявитель получит уведомление.`,rejectTitle:`Отклонить этот запрос?`,rejectBody:`Запрос будет помечен как отклонённый, заявитель получит уведомление.`,recallTitle:`Отозвать этот запрос?`,recallBody:`После отзыва согласующие не смогут действовать, запись будет разблокирована.`,inlineApproved:`«{{title}}» согласован`,inlineRejected:`«{{title}}» отклонён`,approvedFinal:`Согласовано`,approvedWaiting:`Согласовано — ожидаются остальные согласующие`,rejectedToast:`Отклонено`,recalledToast:`Запрос отозван`,whyDisabled:`Действовать могут только назначенные согласующие. Ожидает: {{who}}.`,whyDisabledSubmitter:`Вы отправили этот запрос и можете его отозвать, но согласовать или отклонить могут только назначенные согласующие.`,noActor:`Не удалось определить идентичность`,actionFailed:`Действие не выполнено`,loadFailed:`Не удалось загрузить запрос`,recallUnavailable:`Отзыв недоступен в этой среде.`,requestGone:`Этот запрос больше не существует. Обновите список.`,notAllowed:`У вас нет прав на это действие.`,alreadyDecided:`Этот запрос уже обработан. Обновите список.`,justNow:`только что`,minutesAgo:`{{count}} мин назад`,hoursAgo:`{{count}} ч назад`,daysAgo:`{{count}} дн назад`},preview:{empty:{loadFailedTitle:`Не удалось загрузить предпросмотр черновика`,loadFailedDescription:`Не удалось прочитать слой черновика. Повторите попытку или проверьте соединение.`,notReadyTitle:`«{{app}}» ещё нет в черновике`,notReadyDescription:`Сборка может ещё выполняться или завершилась с ошибкой до подготовки этого приложения. Проверьте статус сборки в диалоге — панель обновится, когда появятся черновики.`,nothingTitle:`Пока нечего предпросматривать`,retry:`Повторить`},draftBar:{message:`Предпросмотр черновика — вы видите неопубликованные изменения. Ничего не вступит в силу до публикации.`,publish:`Опубликовать`,publishing:`Публикация…`,exit:`Выйти из предпросмотра`,changes:`Изменения`},changes:{title:`Ожидающие изменения`,description:`Что изменит публикация. Новые элементы добавляются; обновления перезаписывают опубликованную версию.`,loading:`Загрузка ожидающих изменений…`,loadFailed:`Не удалось загрузить ожидающие изменения:`,empty:`Ничего не ожидает — все черновики опубликованы.`,kindNew:`Новое`,kindUpdate:`Обновление`}},filterBuilder:{where:`Где`,and:`И`,or:`ИЛИ`,clearAll:`Очистить всё`,selectField:`Выберите поле`,operator:`Оператор`,selectValue:`Выберите значение`,value:`Значение`,addFilter:`Добавить фильтр`,removeCondition:`Удалить условие`,trueLabel:`Да`,falseLabel:`Нет`,noResults:`Нет результатов`,searchField:`Поиск {{label}}…`,enterId:`Введите ID {{label}}`,operators:{equals:`Равно`,notEquals:`Не равно`,contains:`Содержит`,notContains:`Не содержит`,isEmpty:`Пусто`,isNotEmpty:`Не пусто`,greaterThan:`Больше`,lessThan:`Меньше`,greaterOrEqual:`Больше или равно`,lessOrEqual:`Меньше или равно`,before:`До`,after:`После`,between:`Между`,in:`В списке`,notIn:`Не в списке`}},sortBuilder:{sortBy:`Сортировать по`,thenBy:`Затем по`,selectField:`Выберите поле`,ascending:`A → Z`,descending:`Z → A`,addSort:`Добавить сортировку`,removeSort:`Удалить сортировку`}},ar:{lookup:{recentlyUsed:`المستخدمة مؤخرًا`,allResults:`كل النتائج`,createNew:`إنشاء جديد`,createNamed:`إنشاء «{{name}}»`,showingResults:`عرض {{shown}} من {{total}} نتيجة`,showAllResults:`عرض كل النتائج ({{count}})`,selectedBadge:`محدد`,browseAll:`استعراض كل السجلات`,remove:`إزالة {{label}}`,selectFirst:`اختر {{fields}} أولاً`,selectRecord:`اختيار سجل`,recordCount:`{{count}} سجل`,recordCountOne:`سجل واحد`,pageOf:`صفحة {{current}} من {{total}}`,filters:`عوامل التصفية`,clear:`مسح`,yes:`نعم`,filterPlaceholder:`تصفية {{label}}`,prevPage:`الصفحة السابقة`,nextPage:`الصفحة التالية`,jumpToPage:`الانتقال إلى الصفحة`,retry:`إعادة المحاولة`,loading:`جارٍ التحميل…`,noOptions:`لا توجد خيارات`,noRecords:`لا توجد سجلات`},common:{addToFavorites:`إضافة إلى المفضلة`,removeFromFavorites:`إزالة من المفضلة`,loading:`جاري التحميل...`,save:`حفظ`,cancel:`إلغاء`,delete:`حذف`,edit:`تعديل`,create:`إنشاء`,search:`بحث`,filter:`تصفية`,reset:`إعادة تعيين`,confirm:`تأكيد`,close:`إغلاق`,back:`رجوع`,next:`التالي`,previous:`السابق`,submit:`إرسال`,refresh:`تحديث`,export:`تصدير`,import:`استيراد`,yes:`نعم`,no:`لا`,ok:`موافق`,actions:`إجراءات`,more:`المزيد`,selectAll:`تحديد الكل`,clearAll:`مسح الكل`,noData:`لا توجد بيانات`,noResults:`لم يتم العثور على نتائج`,required:`مطلوب`,optional:`اختياري`,selectOption:`اختر خياراً`,select:`اختر...`,openChat:`فتح المحادثة`,closeChat:`إغلاق المحادثة`,toggleSidebar:`تبديل الشريط الجانبي`,package:`الحزمة`},actions:{resultDialog:{defaultTitle:`Save this value now`,acknowledge:`I have saved this`}},validation:{required:`{{field}} مطلوب`,minLength:`{{field}} يجب أن يكون {{min}} حرفاً على الأقل`,maxLength:`{{field}} يجب ألا يتجاوز {{max}} حرفاً`,min:`{{field}} يجب أن يكون {{min}} على الأقل`,max:`{{field}} يجب ألا يتجاوز {{max}}`,email:`يرجى إدخال بريد إلكتروني صالح`,url:`يرجى إدخال رابط صالح`,pattern:`صيغة {{field}} غير صالحة`,unique:`{{field}} يجب أن يكون فريداً`,type:`{{field}} يجب أن يكون {{type}} صالحاً`},form:{addItem:`إضافة عنصر`,removeItem:`إزالة عنصر`,fieldRequired:`هذا الحقل مطلوب`,invalidFormat:`صيغة غير صالحة`,saveSuccess:`تم الحفظ بنجاح`,saveError:`فشل في الحفظ`,unsavedChanges:`لديك تغييرات غير محفوظة. هل أنت متأكد أنك تريد المغادرة؟`,stepOf:`الخطوة {{current}} من {{total}}`,createTitle:`إنشاء {{object}}`,editTitle:`تعديل {{object}}`,createDescription:`إضافة {{object}} جديد إلى قاعدة البيانات.`,editDescription:`تحديث تفاصيل {{object}}`,saveRecord:`حفظ السجل`,create:`إنشاء`,update:`تحديث`,createSuccess:`تم إنشاء {{object}}`,updateSuccess:`تم تحديث {{object}}`,deleteSuccess:`تم حذف {{object}}`},fields:{richText:{format:`التنسيق: {{format}}`,basicEditorHint:`محرر النص الغني (أساسي)`,placeholder:`اكتب شيئاً...`}},table:{rowsPerPage:`صفوف في الصفحة`,showing:`عرض {{from}} إلى {{to}} من {{total}}`,noRows:`لا توجد صفوف للعرض`,sortAsc:`ترتيب تصاعدي`,sortDesc:`ترتيب تنازلي`,filterColumn:`تصفية {{column}}`,columns:`الأعمدة`,exportCSV:`تصدير CSV`,exportExcel:`تصدير Excel`,selectRow:`تحديد صف`,selectAllRows:`تحديد جميع الصفوف`,expandRow:`توسيع الصف`,collapseRow:`طي الصف`,hideColumn:`إخفاء العمود`,freezeColumn:`تجميد العمود`,unfreezeColumn:`إلغاء تجميد العمود`,pageInfo:`صفحة {{current}} من {{total}}`,totalRecords:`{{count}} إجمالي`,noResults:`لا نتائج`,noResultsHint:`حاول تعديل الفلاتر أو مصطلحات البحث.`,cancelAll:`إلغاء الكل`,saveAll:`حفظ الكل ({{count}})`,addRecord:`إضافة سجل`,open:`فتح`,search:`بحث...`,modified:`{{count}} صف(صفوف) معدّل(ة)`,selected:`{{count}} محدد(ة)`,edit:`تعديل`,delete:`حذف`},grid:{actions:`إجراءات`,edit:`تعديل`,delete:`حذف`,export:`تصدير`,exportAs:`تصدير كـ {{format}}`,loading:`جاري تحميل الشبكة...`,errorLoading:`خطأ في تحميل الشبكة`,pullToRefresh:`اسحب للتحديث`,refreshing:`جاري التحديث…`,openRecord:`فتح السجل`,rowHeight:`ارتفاع الصف: {{mode}}`,openMenu:`فتح القائمة`,empty:`فارغ`,yes:`نعم`,no:`لا`,systemFields:`النظام`,toolbar:{densityMode:`الكثافة`,densityCompact:`مضغوط`,densityComfortable:`عادي`,densitySpacious:`فسيح`,densityCycleHint:`{{label}} (انقر للتغيير)`,densityCycleShortHint:`انقر للتغيير`},import:{title:`استيراد {{object}}`,stepUpload:`رفع`,stepMapping:`تعيين`,stepPreview:`معاينة`,uploadDescription:`ارفع ملف CSV للبدء.`,mappingDescription:`عيّن أعمدة CSV إلى حقول الكائن.`,previewDescription:`راجع البيانات قبل الاستيراد.`,dragDrop:`اسحب ملف CSV هنا أو انقر للتصفح`,browseFiles:`تصفح الملفات`,onlyCsv:`ملفات CSV فقط مدعومة.`,fileNeedsHeader:`يجب أن يحتوي الملف على صف رأسي وصف بيانات واحد على الأقل.`,mappingTemplate:`قالب التعيين:`,chooseTemplate:`اختر قالباً…`,noSavedTemplates:`لا قوالب محفوظة`,noneOption:`— لا شيء —`,saveCurrent:`حفظ الحالي`,templateName:`اسم القالب`,save:`حفظ`,deleteTemplate:`حذف القالب`,csvColumn:`عمود CSV`,mapsTo:`يُعيَّن إلى`,status:`الحالة`,skipColumn:`تخطي العمود`,skip:`— تخطي —`,mapped:`مُعيَّن`,skipped:`مُتخطَّى`,rowsWithErrors:`{{count}} صف(صفوف) بها أخطاء`,rowsCorrected:`{{count}} صف(صفوف) تم تصحيحها`,clickToFix:`— انقر على خلية مميزة للتعديل.`,showingRows:`عرض {{shown}} من {{total}} صف`,importing:`جارٍ الاستيراد… {{progress}}%`,importComplete:`اكتمل الاستيراد`,imported:`{{count}} مُستورَد(ة)`,skippedCount:`{{count}} مُتخطَّى(ة)`,moreErrors:`…و{{count}} خطأ(أخطاء) أخرى`,cancel:`إلغاء`,back:`رجوع`,next:`التالي`,close:`إغلاق`,importNRows:`استيراد {{count}} صف`,importingProgress:`جارٍ الاستيراد…`,requiredMark:`*`,required:`مطلوب`,invalidType:`{{type}} غير صالح`}},calendar:{today:`اليوم`,month:`شهر`,week:`أسبوع`,day:`يوم`,agenda:`جدول أعمال`,allDay:`طوال اليوم`,noEvents:`لا توجد أحداث`,newEvent:`حدث جديد`,moreEvents:`+{{count}} المزيد`},list:{loading:`Loading records...`,recordCount:`{{count}} سجلات`,recordCountOne:`{{count}} سجل`,addRecord:`إضافة سجل`,tabs:`علامات التبويب`,allRecords:`جميع السجلات`,search:`بحث`,filter:`تصفية`,filterRecords:`تصفية السجلات`,sort:`ترتيب`,sortRecords:`ترتيب السجلات`,group:`تجميع`,groupBy:`تجميع حسب`,export:`تصدير`,exportAs:`تصدير كـ {{format}}`,color:`لون`,rowColor:`لون الصف`,colorByField:`تلوين حسب الحقل`,clear:`مسح`,none:`لا شيء`,hideFields:`إخفاء الحقول`,noItems:`لم يتم العثور على عناصر`,noItemsMessage:`لا توجد سجلات للعرض. حاول تعديل الفلاتر أو إضافة بيانات جديدة.`,showAll:`عرض الكل`,pullToRefresh:`اسحب للتحديث`,refreshing:`جارٍ التحديث…`,share:`مشاركة`,print:`طباعة`,hideFieldsTitle:`إخفاء الحقول`,dataLimitReached:`يتم عرض أول {{limit}} سجل. قد تتوفر بيانات إضافية.`,viewSettings:`إعدادات العرض`,viewSettingsHint:`التجميع واللون والكثافة والحقول المرئية.`,addGroup:`إضافة حقل مجموعة`,collapsedByDefault:`مطوي افتراضياً`,removeGroup:`إزالة`},kanban:{addCard:`إضافة بطاقة`,addColumn:`إضافة عمود`,moveCard:`نقل بطاقة`,deleteCard:`حذف بطاقة`,deleteColumn:`حذف عمود`,noCards:`لا بطاقات`,cardTitlePlaceholder:`أدخل عنوان البطاقة...`},timeline:{bucket:{overdue:`متأخر`,today:`اليوم`,tomorrow:`غداً`,thisWeek:`هذا الأسبوع`,nextWeek:`الأسبوع القادم`,later:`لاحقاً`,noDate:`بدون تاريخ`,unassigned:`غير معين`}},gantt:{column:{taskName:`اسم المهمة`,start:`البداية`,end:`النهاية`},toolbar:{prevPeriod:`الفترة السابقة`,nextPeriod:`الفترة التالية`,zoomIn:`تكبير`,zoomOut:`تصغير`,jumpToToday:`الانتقال إلى اليوم`,today:`اليوم`,showTaskList:`إظهار قائمة المهام`,hideTaskList:`إخفاء قائمة المهام`}},view:{editViewConfig:`تعديل إعدادات العرض`,rename:`إعادة تسمية`,duplicateView:`تكرار العرض`,shareView:`مشاركة العرض`,setAsDefault:`تعيين كافتراضي`,pinView:`تثبيت العرض`,unpinView:`إلغاء تثبيت العرض`,changeViewType:`تغيير نوع العرض`,deleteView:`حذف العرض`,addView:`إضافة عرض`,unsavedChanges:`تغييرات غير محفوظة`,saveAsView:`حفظ كعرض`,moreViews:`{{count}} المزيد`,activeFilters:`الفلاتر نشطة`,activeSort:`الترتيب نشط`,manageViews:`إدارة العروض`,manageAllViews:`إدارة جميع العروض…`,manageViewsDescription:`إعادة ترتيب جميع طرق عرض هذا الكائن أو إعادة تسميتها أو تثبيتها أو حذفها.`,searchViews:`البحث في العروض`,addNewView:`إضافة عرض جديد`,done:`تم`,noViewsFound:`لا توجد عروض تطابق بحثك.`,dragToReorder:`اسحب لإعادة الترتيب`,defaultView:`العرض الافتراضي`,defaultBadge:`افتراضي`,tabActionsFor:`إجراءات العرض لـ {{name}}`,readonlyAriaLabel:`عرض للقراءة فقط`,readonlyTooltip:`عرض النظام — انسخ للتخصيص.`},designer:{undo:`Undo`,redo:`Redo`},detail:{back:`رجوع`,edit:`تحرير`,editInline:`تحرير`,save:`حفظ`,saveChanges:`حفظ التغييرات`,editFieldsInline:`تحرير الحقول`,share:`مشاركة`,duplicate:`نسخ`,export:`تصدير`,viewHistory:`عرض السجل`,delete:`حذف`,moreActions:`المزيد من الإجراءات`,addToFavorites:`إضافة إلى المفضلة`,removeFromFavorites:`إزالة من المفضلة`,previousRecord:`السجل السابق`,nextRecord:`السجل التالي`,recordOf:`{{current}} من {{total}}`,recordNotFound:`لم يتم العثور على السجل`,recordNotFoundDescription:`السجل الذي تبحث عنه غير موجود أو ربما تم حذفه.`,goBack:`رجوع`,details:`التفاصيل`,related:`ذات صلة`,relatedRecords:`{{count}} سجلات`,relatedRecordOne:`{{count}} سجل`,noRelatedRecords:`لا توجد سجلات ذات صلة`,loading:`جاري التحميل...`,copyToClipboard:`نسخ إلى الحافظة`,copied:`تم النسخ!`,deleteConfirmation:`هل أنت متأكد أنك تريد حذف هذا السجل؟`,editRecord:`تحرير السجل`,viewAll:`عرض الكل`,new:`جديد`,emptyValue:`—`,comments:`التعليقات`,searchComments:`البحث في التعليقات…`,addCommentPlaceholder:`أضف تعليقاً… (Ctrl+Enter للإرسال)`,noMatchingComments:`لا توجد تعليقات مطابقة`,noCommentsYet:`لا توجد تعليقات بعد`,pinned:`مثبت`,pin:`تثبيت`,unpin:`إلغاء التثبيت`,justNow:`الآن`,minutesAgo:`منذ {{count}} دقيقة`,hoursAgo:`منذ {{count}} ساعة`,daysAgo:`منذ {{count}} يوم`,dropFilesToUpload:`اسحب الملفات هنا أو انقر للرفع`,attachmentCount:`{{count}} مرفق`,attachmentCountPlural:`{{count}} مرفقات`,removeAttachment:`إزالة المرفق`,unifiedDiff:`عرض موحد`,sideBySideDiff:`عرض جنباً إلى جنب`,noChanges:`لا توجد تغييرات`,previousVersion:`السابق`,currentVersion:`الحالي`,discussion:`المناقشة`,showDiscussion:`إظهار المناقشة ({{count}})`,hideDiscussion:`إخفاء المناقشة`,bold:`غامق (Ctrl+B)`,italic:`مائل (Ctrl+I)`,listFormat:`قائمة`,inlineCode:`كود مضمن`,mentionSomeone:`إشارة إلى شخص`,preview:`معاينة`,submitComment:`إرسال (Ctrl+Enter)`,sendComment:`إرسال`,writeComment:`اكتب تعليقاً…`,subscribedTooltip:`مشترك — انقر لإلغاء الاشتراك`,unsubscribedTooltip:`الاشتراك في الإشعارات`,firstRecord:`السجل الأول (Home)`,previousRecordKey:`السجل السابق (←)`,nextRecordKey:`السجل التالي (→)`,lastRecord:`السجل الأخير (End)`,noRecords:`لا توجد سجلات`,searchWhileNavigating:`البحث أثناء التصفح`,searchRecords:`البحث في السجلات…`,allActivity:`كل النشاط`,commentsOnly:`التعليقات فقط`,fieldChangesFilter:`تغييرات الحقول`,tasksOnly:`المهام فقط`,leaveCommentPlaceholder:`اترك تعليقاً… (Ctrl+Enter للإرسال)`,noActivity:`لا يوجد نشاط مسجل`,loadMore:`تحميل المزيد`,edited:`(معدل)`,via:`عبر {{source}}`,replyCount:`{{count}} رد`,replyCountPlural:`{{count}} ردود`,replyPlaceholder:`رد…`,filterActivity:`تصفية النشاط`,openDiscussion:`فتح لوحة المناقشة`,closeDiscussion:`إغلاق لوحة المناقشة`,subscribeAriaLabel:`الاشتراك في الإشعارات`,unsubscribeAriaLabel:`إلغاء الاشتراك من الإشعارات`,clearSearch:`مسح البحث`,saving:`جارٍ الحفظ…`,lockedByApproval:`مقفل للموافقة`,lockedTooltip:`يحتوي هذا السجل على طلب موافقة معلق؛ التعديل مقفل`,cancelApproval:`إلغاء الموافقة`,cancelApprovalInFlight:`جارٍ الإلغاء…`,cancelApprovalTooltip:`إلغاء طلب الموافقة المعلق لفتح قفل السجل`,cancelApprovalFailed:`فشل إلغاء الموافقة`,cancelApprovalUnavailable:`إلغاء الموافقات غير مدعوم من مصدر البيانات هذا`,linkCopied:`تم نسخ الرابط إلى الحافظة`,linkCopyFailed:`فشل نسخ الرابط`,cancel:`إلغاء`,cancelEdit:`تجاهل التغييرات`,sectionMoreDetails:`مزيد من التفاصيل`,concurrentUpdateTitle:`تم تعديل هذا السجل من قِبل شخص آخر`,concurrentUpdateDescription:`قام مستخدم آخر بحفظ نسخة أحدث من {{field}} أثناء تعديلك. اختر كيفية حل التعارض.`,concurrentUpdateYourEdit:`تعديلك`,concurrentUpdateCurrentValue:`القيمة الحالية`,concurrentUpdateUpdatedBy:`حدّثه {{name}}`,concurrentUpdateUpdatedAt:`حُدِّث في {{when}}`,concurrentUpdateReload:`تحميل النسخة الحالية`,concurrentUpdateOverwrite:`الكتابة فوقه على أي حال`,concurrentUpdateCancel:`إلغاء`,openInNewTab:`فتح في علامة تبويب جديدة`,activity:`النشاط`,history:`السجل`,editRow:`تعديل`,deleteRow:`حذف`,deleteRowConfirmation:`حذف هذا السجل؟`,deleteRowTitle:`حذف السجل`,actions:`الإجراءات`,previousPage:`السابق`,nextPage:`التالي`,pageOf:`صفحة {{current}} من {{total}}`,sortBy:`ترتيب حسب`,filterPlaceholder:`تصفية...`,highlightFields:`الحقول الرئيسية`,createdBy:`أنشأه`,updatedBy:`حدّثه`,showEmptyRelated_one:`+ {{count}} فارغ`,showEmptyRelated_other:`+ {{count}} فارغة`,copyEmail:`نسخ البريد الإلكتروني`,copyPhone:`نسخ الهاتف`,copyRecordId:`نسخ معرف السجل`,showEmptyFields:`إظهار {{count}} حقل(حقول) فارغة`,hideEmptyFields:`إخفاء الحقول الفارغة`,noValue:`لا قيمة`},chart:{noData:`لا تتوفر بيانات للرسم البياني`,loading:`جاري تحميل الرسم البياني...`},map:{searchLocations:`البحث عن المواقع…`,locationDetails:`تفاصيل الموقع`,markersCount:`{{count}} علامة`,invalidCoordinates:`{{count}} سجل بإحداثيات مفقودة أو غير صالحة مستبعد من الخريطة.`,invalidCoordinatesPlural:`{{count}} سجلات بإحداثيات مفقودة أو غير صالحة مستبعدة من الخريطة.`},workflow:{draft:`مسودة`,active:`نشط`,paused:`متوقف مؤقتاً`,completed:`مكتمل`,cancelled:`ملغي`,save:`حفظ`,publish:`نشر`,addNode:`إضافة عقدة`,workflowFlow:`سير العمل`,properties:`الخصائص`,connections:`الاتصالات`,quickConnect:`اتصال سريع`,fromPlaceholder:`من...`,toPlaceholder:`إلى...`,connect:`ربط`,label:`التسمية`,type:`النوع`,description:`الوصف`,assignee:`المسؤول`,assigneeType:`نوع المسؤول`,user:`مستخدم`,role:`دور`,group:`مجموعة`,expression:`تعبير`,timeoutMinutes:`المهلة (دقائق)`,selectNodeToEdit:`حدد عقدة لتعديل خصائصها`,workflowTitle:`عنوان سير العمل`,newWorkflow:`سير عمل جديد`,outConnections:`{{count}} مخرج`,start:`بداية`,end:`نهاية`,task:`مهمة`,userTask:`مهمة مستخدم`,serviceTask:`مهمة خدمة`,scriptTask:`مهمة نصية`,approval:`موافقة`,condition:`شرط`,parallelGateway:`بوابة متوازية`,joinGateway:`بوابة دمج`,boundaryEvent:`حدث حدودي`,delay:`تأخير`,notification:`إشعار`,webhook:`Webhook`,allowConcurrency:`السماح (تنفيذ متزامن)`,forbidConcurrency:`منع (تخطي الجديد)`,replaceConcurrency:`استبدال (إلغاء الحالي)`,queueConcurrency:`طابور (تنفيذ بعد الحالي)`,conditionEvent:`شرط`,manualEvent:`يدوي`,webhookEvent:`Webhook`,timerEvent:`مؤقت`,signalEvent:`إشارة`,versionHistory:`تاريخ الإصدارات`,importBpmn:`استيراد BPMN`,exportBpmn:`تصدير BPMN`,undo:`تراجع`,redo:`إعادة`,resetZoom:`إعادة تعيين التكبير`},dashboard:{addWidget:`إضافة أداة`,removeWidget:`إزالة أداة`,editLayout:`تعديل التخطيط`,saveLayout:`حفظ التخطيط`,resetLayout:`إعادة تعيين التخطيط`,total:`الإجمالي`,noDataAvailable:`لا بيانات متاحة`,noDataSourceFor:`لا مصدر بيانات لـ`,trend:{vsLastQuarter:`مقابل الربع الماضي`,vsLastMonth:`مقابل الشهر الماضي`,vsLastWeek:`مقابل الأسبوع الماضي`,vsLastYear:`مقابل العام الماضي`,vsYesterday:`مقابل أمس`,vsPreviousPeriod:`مقابل الفترة السابقة`}},configPanel:{save:`حفظ`,discard:`تجاهل`,close:`إغلاق`,layout:`التخطيط`,columns:`الأعمدة`,gap:`المسافة`,rowHeight:`ارتفاع الصف`,data:`البيانات`,refreshInterval:`فترة التحديث`,appearance:`المظهر`,title:`العنوان`,showDescription:`إظهار الوصف`,theme:`السمة`,configuration:`الإعداد`,general:`عام`,advanced:`متقدم`},appDesigner:{createApp:`إنشاء تطبيق`,editApp:`تعديل التطبيق`,basicInfo:`المعلومات الأساسية`,objects:`الكائنات`,navigation:`التنقل`,branding:`العلامة التجارية`,appName:`اسم التطبيق`,appTitle:`العنوان`,appDescription:`الوصف`,appIcon:`الأيقونة`,template:`القالب`,layout:`التخطيط`,layoutSidebar:`الشريط الجانبي`,layoutHeader:`الرأس`,layoutEmpty:`فارغ`,selectObjects:`تحديد الكائنات`,searchObjects:`البحث في الكائنات…`,selectAll:`تحديد الكل`,deselectAll:`إلغاء تحديد الكل`,navBuilder:`منشئ التنقل`,addGroup:`إضافة مجموعة`,addUrl:`إضافة URL`,addSeparator:`إضافة فاصل`,noNavItems:`لا توجد عناصر تنقل بعد.`,logoUrl:`Logo URL`,primaryColor:`اللون الأساسي`,faviconUrl:`Favicon URL`,preview:`معاينة`,complete:`إكمال`,snakeCaseHint:`Must be snake_case (e.g. my_app)`,modeEdit:`تعديل`,modePreview:`معاينة`,modeCode:`كود`,addWidget:`إضافة عنصر واجهة`,widgetProperties:`خصائص العنصر`,dataSource:`مصدر البيانات`,valueField:`حقل القيمة`,aggregate:`تجميع`,colorVariant:`متغير اللون`,addComponent:`إضافة مكون`,componentProperties:`خصائص المكون`,viewType:`نوع العرض`,fields:`الحقول`,toolbar:`شريط الأدوات`,showSearch:`إظهار البحث`,showFilters:`إظهار الفلاتر`,showSort:`إظهار الترتيب`,appearance:`المظهر`,rowHeight:`ارتفاع الصف`,stripedRows:`صفوف متناوبة`,bordered:`محاط بإطار`,livePreview:`معاينة مباشرة`,stepBasicDesc:`الاسم والعنوان والتخطيط`,stepObjectsDesc:`اختيار كائنات الأعمال`,stepNavigationDesc:`بناء شجرة التنقل`,stepBrandingDesc:`الشعار والألوان والأيقونة`,noObjectsFound:`لم يتم العثور على كائنات.`,noNavItemsHint:`لا توجد عناصر تنقل بعد. حدد كائنات في الخطوة السابقة أو أضف عناصر يدويًا.`,separator:`فاصل`,separatorLabel:`— فاصل —`,newGroup:`مجموعة جديدة`,newLink:`رابط جديد`,saveDraft:`حفظ المسودة`,cancelConfirmTitle:`تجاهل التغييرات؟`,cancelConfirmMessage:`لديك تغييرات غير محفوظة. هل أنت متأكد من الإلغاء؟`,confirmDiscard:`تجاهل`,keepEditing:`متابعة التحرير`,navNoItems:`لا توجد عناصر تنقل. انقر على الأزرار أعلاه لإضافة عناصر.`,navNoPreviewItems:`لا توجد عناصر`,navLivePreview:`معاينة مباشرة`,navCollapseGroup:`طي المجموعة`,navExpandGroup:`توسيع المجموعة`,navAddChild:`إضافة عنصر فرعي`,navMoveUp:`نقل لأعلى`,navMoveDown:`نقل لأسفل`,navRemove:`إزالة`,navObjectPage:`صفحة الكائن`,navDashboard:`لوحة القيادة`,navPage:`صفحة`,navReport:`تقرير`,navGroup:`مجموعة`,navUrl:`رابط`,navSeparator:`فاصل`,navTypeObject:`كائن`,navTypeDashboard:`لوحة تحكم`,navTypePage:`صفحة`,navTypeReport:`تقرير`,navTypeUrl:`رابط`,navTypeGroup:`مجموعة`,navTypeSeparator:`فاصل`,navTypeAction:`إجراء`,navEditIcon:`تعديل الأيقونة`,navToggleVisible:`تبديل الرؤية`,navHidden:`مخفي`,navExportSchema:`تصدير JSON`,navImportSchema:`استيراد JSON`,navExportSuccess:`تم تصدير مخطط التنقل`,navImportSuccess:`تم استيراد مخطط التنقل`,navImportError:`JSON تنقل غير صالح`,navIconPlaceholder:`اسم الأيقونة (مثل Users)`,dashboardEditor:`محرر لوحة التحكم`,noWidgets:`لا عناصر واجهة. انقر فوق زر أعلاه لإضافة واحد.`,widgetLayoutSize:`حجم التخطيط`,widgetWidth:`العرض`,widgetHeight:`الارتفاع`,dashboardPreview:`معاينة لوحة التحكم`,noWidgetsPreview:`لا عناصر واجهة للمعاينة`,pageCanvasEditor:`محرر قماش الصفحة`,emptyPage:`صفحة فارغة. انقر فوق زر أعلاه لإضافة مكون.`,pagePreview:`معاينة الصفحة`,noComponentsPreview:`لا مكونات للمعاينة`,modePage:`صفحة`,modeDashboard:`لوحة تحكم`,undo:`تراجع`,redo:`إعادة`,brandingEditor:`محرر العلامة التجارية`,brandingExport:`تصدير JSON`,brandingImport:`استيراد JSON`,brandingPreview:`معاينة`,brandingSampleButton:`زر نموذجي`,brandingSampleText:`هكذا سيبدو سمة علامتك التجارية.`,colorPalette:`لوحة الألوان`,fontFamily:`عائلة الخطوط`,fontDefault:`افتراضي (النظام)`,modeLight:`فاتح`,modeDark:`داكن`,mobilePreview:`معاينة الجوال`,objectManager:{title:`مدير الكائنات`,addObject:`كائن جديد`,searchPlaceholder:`البحث في الكائنات…`,noObjects:`لم يتم العثور على كائنات.`,objectName:`اسم API`,objectLabel:`التسمية`,pluralLabel:`التسمية الجمعية`,icon:`أيقونة`,selectIcon:`اختر أيقونة…`,group:`مجموعة`,noGroup:`بلا مجموعة`,sortOrder:`ترتيب الفرز`,enabled:`مفعل`,relationships:`العلاقات`,systemBadge:`النظام`,fieldCount:`{{count}} حقل(حقول)`,ungrouped:`غير مجمع`,deleteConfirmTitle:`حذف الكائن؟`,deleteConfirmMessage:`سيؤدي هذا إلى حذف الكائن وجميع حقوله بشكل دائم. لا يمكن التراجع عن هذا الإجراء.`},fieldDesigner:{title:`مصمم الحقول`,addField:`حقل جديد`,searchPlaceholder:`البحث في الحقول…`,allTypes:`جميع الأنواع`,noFields:`لم يتم العثور على حقول.`,fieldName:`اسم API`,fieldLabel:`التسمية`,fieldType:`النوع`,fieldGroup:`المجموعة`,description:`الوصف`,required:`مطلوب`,unique:`فريد`,readOnly:`للقراءة فقط`,hidden:`مخفي`,indexed:`مفهرس`,externalId:`معرف خارجي`,trackHistory:`تتبع السجل`,defaultValue:`القيمة الافتراضية`,placeholder:`نص تلميحي`,referenceTo:`مرجع إلى`,formula:`صيغة`,options:`خيارات`,addOption:`إضافة خيار`,validationRules:`قواعد التحقق`,addRule:`إضافة قاعدة`,systemBadge:`النظام`,ungrouped:`عام`,deleteConfirmTitle:`حذف الحقل؟`,deleteConfirmMessage:`سيتم حذف الحقل بشكل دائم. ستُفقد البيانات الموجودة في هذا الحقل.`,basicSection:`أساسي`,typeSpecificSection:`إعدادات النوع`,advancedSection:`متقدم`,typeCategory:{text:`نص`,number:`رقم`,date:`التاريخ والوقت`,choice:`اختيار`,relation:`علاقة`,advanced:`متقدم`}}},console:{title:`وحدة تحكم ObjectStack`,initializing:`جاري تهيئة التطبيق...`,breadcrumb:{dashboards:`لوحات المعلومات`,pages:`الصفحات`,reports:`التقارير`,system:`النظام`},loadingSteps:{connecting:`جاري الاتصال بمصدر البيانات`,loadingConfig:`جاري تحميل الإعدادات`,preparingWorkspace:`جاري تجهيز مساحة العمل`},error:{connectionFailed:`تعذّر الاتصال بالخادم`,serverUnreachable:`الخادم {{url}} غير قابل للوصول.`,checkServer:`يرجى التحقق من اتصال الشبكة أو من تشغيل الواجهة الخلفية.`,timeout:`انتهت مهلة الاتصال بعد 10 ثوانٍ.`},actions:{retry:`إعادة المحاولة`,retrying:`جاري إعادة المحاولة…`},shortcuts:{title:`اختصارات لوحة المفاتيح`,description:`مرجع سريع لجميع اختصارات لوحة المفاتيح المتاحة.`,groups:{general:`عام`,navigation:`التنقل`,dataViews:`عروض البيانات`,preferences:`التفضيلات`},openCommandPalette:`فتح لوحة الأوامر`,showShortcuts:`عرض اختصارات لوحة المفاتيح`,closeDialog:`إغلاق النافذة / اللوحة`,toggleSidebar:`تبديل الشريط الجانبي`,focusSearch:`التركيز على البحث`,createRecord:`إنشاء سجل جديد`,refreshData:`تحديث البيانات`,editRecord:`تعديل السجل المحدد`,toggleDarkMode:`تبديل الوضع الداكن`},commandPalette:{placeholder:`اكتب أمراً أو ابحث...`,noResults:`لم يتم العثور على نتائج.`,objects:`الكائنات`,dashboards:`لوحات المعلومات`,pages:`الصفحات`,reports:`التقارير`,switchApp:`تبديل التطبيق`,current:`الحالي`,preferences:`التفضيلات`,lightTheme:`المظهر الفاتح`,darkTheme:`المظهر الداكن`,systemTheme:`مظهر النظام`,actions:`الإجراءات`,openFullSearch:`فتح صفحة البحث الكاملة`,createApp:`إنشاء تطبيق جديد`,searching:`جارٍ البحث…`,records:`السجلات`,recentRecords:`شوهد مؤخراً`},errors:{somethingWentWrong:`حدث خطأ ما`,unexpectedError:`حدث خطأ غير متوقع أثناء عرض هذا المحتوى.`,tryAgain:`إعادة المحاولة`,goHome:`العودة للرئيسية`,errorDetails:`تفاصيل الخطأ (وضع التطوير فقط)`},theme:{toggle:`تبديل المظهر`,light:`فاتح`,dark:`داكن`,system:`النظام`},objectView:{systemViewReadonly:`System view defined in code - duplicate to customize.`,expandToPage:`Open as full page`,objectNotFound:`الكائن غير موجود`,objectNotFoundDescription:`الكائن "{{objectName}}" غير موجود في الإعدادات الحالية.`,objectNotFoundHint:`تحقق من إعدادات التنقل في تطبيقك أو اختر كائنًا آخر من الشريط الجانبي.`,allRecords:`جميع السجلات`,exitDesignMode:`الخروج من وضع التصميم`,enterDesignMode:`الدخول إلى وضع التصميم`,metadataInspector:`مفتش البيانات الوصفية`,editView:`تعديل العرض`,addView:`إضافة عرض`,designTools:`أدوات التصميم`,new:`جديد`,configureView:`تكوين العرض`,closePanel:`إغلاق اللوحة`,page:`الصفحة`,pageConfigHint:`شريط الأدوات والتنقل وإعدادات غلاف العرض`,listConfigHint:`عرض البيانات والأعمدة والمظهر لهذا النوع من القائمة`,general:`عام`,generalHint:`عنوان العرض والوصف والنوع`,toolbar:`شريط الأدوات`,toolbarHint:`البحث والتصفية والفرز والتجميع ومفاتيح الكثافة`,toolbarEnabledCount:`{{count}} من {{total}} مفعّل`,navigationSection:`التنقل`,navigationHint:`سلوك النقر على الصف وإعدادات العرض التفصيلي`,records:`السجلات`,recordsHint:`وضع التحديد وإضافة سجل والتحرير المباشر`,exportPrint:`التصدير والطباعة`,exportPrintHint:`صيغ التصدير والطباعة وعرض عدد السجلات`,showAllFields:`إظهار الكل`,hideAllFields:`إخفاء الكل`,searchFields:`البحث في الحقول...`,title:`العنوان`,description:`الوصف`,data:`البيانات`,source:`المصدر`,columns:`الأعمدة`,filterBy:`تصفية حسب`,sortBy:`ترتيب حسب`,appearance:`المظهر`,showDescription:`عرض الوصف`,viewType:`نوع العرض`,userFilters:`مرشحات المستخدم`,enableSearch:`تفعيل البحث`,enableFilter:`تفعيل التصفية`,enableSort:`تفعيل الترتيب`,enableHideFields:`تفعيل إخفاء الحقول`,enableGroup:`تفعيل التجميع`,enableColor:`تفعيل اللون`,enableDensity:`تفعيل الكثافة`,userActions:`إجراءات المستخدم`,addRecordViaForm:`إضافة سجلات عبر النموذج`,advanced:`متقدم`,allowExport:`السماح بالتصدير`,recordCount:`{{count}} سجل`,noDescription:`لا يوجد وصف`,none:`لا شيء`,columnsConfigured:`{{count}} أعمدة`,save:`حفظ`,discard:`تجاهل`,createView:`إنشاء عرض`,newView:`عرض جديد`,typeOptions:`خيارات النوع`,groupByField:`حقل التجميع`,startDateField:`حقل تاريخ البدء`,titleField:`حقل العنوان`,latitudeField:`حقل خط العرض`,longitudeField:`حقل خط الطول`,imageField:`حقل الصورة`,dateField:`حقل التاريخ`,selectField:`اختر حقلاً...`,gridOptionsHint:`يستخدم عرض الشبكة الأعمدة المكونة أعلاه.`,groupBy:`تجميع حسب`,prefixField:`حقل البادئة`,fields:`الحقول`,fieldsVisible:`{{count}} مرئي`,sortsCount:`{{count}} ترتيبات`,filtersCount:`{{count}} مرشحات`,endDateField:`حقل تاريخ الانتهاء`,color:`اللون`,fieldTextColor:`لون نص الحقل`,rowHeight:`ارتفاع الصف`,wrapHeaders:`التفاف العناوين`,showFieldDescriptions:`إظهار أوصاف الحقول`,collapseAllByDefault:`طي الكل افتراضياً`,striped:`صفوف مخططة`,bordered:`خلايا محاطة بحدود`,inlineEdit:`تحرير السجلات مباشرة`,addDeleteRecordsInline:`إضافة/حذف السجلات مباشرة`,clickIntoRecordDetails:`انقر لعرض تفاصيل السجل`,navigationMode:`وضع التنقل`,navigationWidth:`عرض التنقل`,navigationWidthHint:`متاح لأوضاع التنقل: الدرج والنافذة المنبثقة والعرض المقسم`,openNewTab:`فتح في علامة تبويب جديدة`,openNewTabHint:`متاح لأوضاع التنقل: الصفحة والنافذة الجديدة`,import:`استيراد`,importTitle:`استيراد من CSV`,importedToast:`تم استيراد {{count}} صف(صفوف).`,importedWithSkipped:`تم استيراد {{ok}} صف(صفوف)؛ تم تخطي {{skipped}}.`,showAdvancedSettings:`إظهار الإعدادات المتقدمة`,showFewerSettings:`إظهار إعدادات أقل`,createViewDesc:`اختر نوع العرض وأعطه اسماً. يمكن تغيير جميع الإعدادات لاحقاً.`,cancel:`إلغاء`,create:`إنشاء`,delete:`حذف`,deleteViewTitle:`حذف العرض`,deleteViewConfirm:`حذف العرض "{{name}}"؟ لا يمكن التراجع عن ذلك.`,bulkDeleteConfirm:`حذف {{count}} سجل(ات) محدد(ة)؟ لا يمكن التراجع عن ذلك.`,duplicateViewName:`يوجد عرض بهذا الاسم بالفعل.`,viewTypeGrid:`شبكة`,viewTypeGridDesc:`جدول سجلات بأسلوب جدول البيانات.`,viewTypeKanban:`كانبان`,viewTypeKanbanDesc:`بطاقات مجمعة في أعمدة بحقل تحديد واحد.`,viewTypeCalendar:`تقويم`,viewTypeCalendarDesc:`سجلات موضوعة حسب التاريخ في تقويم شهري.`,viewTypeGallery:`معرض`,viewTypeGalleryDesc:`بطاقات صور كبيرة من حقل المرفقات.`,viewTypeTimeline:`الجدول الزمني`,viewTypeTimelineDesc:`سجلات على محور زمني أفقي.`,viewTypeGantt:`غانت`,viewTypeGanttDesc:`أشرطة مشروع مع البداية/النهاية والتبعيات.`,viewTypeMap:`خريطة`,viewTypeMapDesc:`علامات جغرافية من حقول خط العرض/الطول.`,viewTypeChart:`مخطط`,viewTypeChartDesc:`مخططات شريطية/خطية/دائرية مجمعة.`,groupByFieldHelp:`تُجمّع لوحة كانبان السجلات في أعمدة حسب قيم الحقل.`,startDateFieldHelp:`يضع التقويم السجلات في الخلية المقابلة لهذا التاريخ.`,ganttStartDateFieldHelp:`يستخدم الحد الأيسر لكل شريط غانت هذا التاريخ.`,ganttEndDateFieldHelp:`يستخدم الحد الأيمن لكل شريط غانت هذا التاريخ.`,timelineDateFieldHelp:`تُوضع السجلات على الجدول الزمني بناءً على هذا التاريخ.`,latitudeFieldHelp:`حقل يحتوي على خط العرض (حقول جغرافية فقط).`,longitudeFieldHelp:`حقل يحتوي على خط الطول (حقول جغرافية فقط).`,imageFieldHelp:`تأتي غلاف المعرض من هذا الحقل للصورة أو المرفق.`,selectOption:`تحديد...`,noEligibleFieldForType:`لا يوجد حقل مؤهل من هذا النوع. أضف حقلاً إلى الكائن أولاً.`,viewTypeUnavailable:`لا يحتوي هذا الكائن على حقل يمكن أن يعمل كـ "{{field}}".`,viewTypeUnavailableShort:`غير مدعوم من هذا الكائن.`,chartType:`نوع المخطط`,chartTypeHelp:`يحدد كيفية عرض البيانات.`,chartTypeBar:`مخطط شريطي`,chartTypeLine:`مخطط خطي`,chartTypePie:`مخطط دائري`,chartTypeArea:`مخطط مساحة`,chartTypeScatter:`مخطط نقطي`,xAxisField:`حقل المحور X`,xAxisFieldHelp:`البُعد الفئوي أو الزمني.`,yAxisField:`حقل المحور Y`,yAxisFieldHelp:`الحقل الرقمي للتجميع.`,selectionMode:`وضع التحديد`,selectionNone:`لا شيء`,selectionSingle:`فردي`,selectionMultiple:`متعدد`,pageSize:`حجم الصفحة`,pageSizeOptions:`خيارات حجم الصفحة`,exportFormats:`تنسيقات التصدير`,exportMaxRecords:`الحد الأقصى للسجلات`,exportIncludeHeaders:`تضمين الرؤوس`,exportFileNamePrefix:`بادئة اسم الملف`,searchableFields:`الحقول القابلة للبحث`,filterableFields:`الحقول القابلة للتصفية`,resizableColumns:`أعمدة قابلة لتغيير الحجم`,densityCompact:`مضغوط`,densityComfortable:`عادي`,densitySpacious:`فسيح`,densityMode:`وضع الكثافة`,hiddenFields:`الحقول المخفية`,rowActions:`إجراءات الصف`,bulkActions:`إجراءات جماعية`,sharing:`مشاركة`,sharingEnabled:`المشاركة مفعلة`,sharingVisibility:`الرؤية`,addRecordEnabled:`إضافة سجل مفعلة`,addRecordPosition:`الموضع`,addRecordMode:`الوضع`,addRecordFormView:`عرض النموذج`,conditionalFormatting:`التنسيق الشرطي`,addRule:`إضافة قاعدة`,quickFilters:`فلاتر سريعة`,addQuickFilter:`إضافة فلتر سريع`,ufElements:`العناصر`,ufDropdown:`قائمة منسدلة`,ufTabs:`علامات تبويب`,ufToggle:`تبديل`,ufAddField:`+ إضافة حقل فلتر...`,ufNoFields:`لا حقول متاحة`,ufAddTab:`+ إضافة علامة تبويب`,ufTabLabel:`التسمية`,ufShowAllRecords:`إظهار علامة "جميع السجلات"`,ufAllowAddTab:`السماح بإضافة علامات تبويب`,showRecordCount:`إظهار عدد السجلات`,allowPrinting:`السماح بالطباعة`,virtualScroll:`التمرير الافتراضي`,emptyStateTitle:`عنوان الحالة الفارغة`,emptyStateMessage:`رسالة الحالة الفارغة`,emptyStateIcon:`رمز الحالة الفارغة`,ariaLabel:`تسمية ARIA`,ariaDescribedBy:`موصوف بـ ARIA`,ariaLive:`ARIA Live`,accessibility:`إمكانية الوصول`,viewTabs:`علامات تبويب العرض`},localeSwitcher:{label:`اللغة`},search:`بحث…`,nav:{pinItem:`تثبيت {{name}}`,unpinItem:`إلغاء تثبيت {{name}}`,dragToReorder:`اسحب لإعادة الترتيب`,favorites:`المفضلة`}},auth:{login:{title:`تسجيل الدخول إلى حسابك`,description:`أدخل بريدك الإلكتروني وكلمة المرور للمتابعة`,emailLabel:`البريد الإلكتروني`,emailPlaceholder:`name@example.com`,passwordLabel:`كلمة المرور`,passwordPlaceholder:`أدخل كلمة المرور`,forgotPasswordText:`نسيت كلمة المرور؟`,submitButton:`تسجيل الدخول`,submittingButton:`جارٍ تسجيل الدخول...`,noAccountText:`ليس لديك حساب؟`,signUpText:`إنشاء حساب`,errors:{invalidCredentials:`بريد إلكتروني أو كلمة مرور غير صحيحة. يرجى المحاولة مرة أخرى.`,emailNotVerified:`يرجى التحقق من بريدك الإلكتروني قبل تسجيل الدخول.`}},register:{title:`إنشاء حساب`,description:`أدخل معلوماتك للبدء`,nameLabel:`الاسم`,namePlaceholder:`محمد أحمد`,emailLabel:`البريد الإلكتروني`,emailPlaceholder:`name@example.com`,passwordLabel:`كلمة المرور`,passwordPlaceholder:`إنشاء كلمة مرور (8 أحرف على الأقل)`,confirmPasswordLabel:`تأكيد كلمة المرور`,confirmPasswordPlaceholder:`أكّد كلمة المرور`,passwordMismatchError:`كلمتا المرور غير متطابقتين`,passwordTooShortError:`يجب أن تتكون كلمة المرور من 8 أحرف على الأقل`,submitButton:`إنشاء حساب`,submittingButton:`جارٍ إنشاء الحساب...`,hasAccountText:`لديك حساب بالفعل؟`,signInText:`تسجيل الدخول`,errors:{userExists:`يوجد حساب بهذا البريد الإلكتروني بالفعل. حاول تسجيل الدخول.`},verifyInbox:{title:`تحقق من صندوق الوارد`,description:`أرسلنا رابط التحقق إلى {{email}}. انقر على الرابط لتفعيل حسابك.`,resend:`إعادة إرسال بريد التحقق`,resending:`جارٍ الإرسال…`,resent:`تم إرسال بريد التحقق.`,backToSignIn:`العودة إلى تسجيل الدخول`}},forgotPassword:{title:`إعادة تعيين كلمة المرور`,description:`أدخل عنوان بريدك الإلكتروني وسنرسل لك رابطًا لإعادة تعيين كلمة المرور`,emailLabel:`البريد الإلكتروني`,emailPlaceholder:`name@example.com`,submitButton:`إرسال رابط إعادة التعيين`,submittingButton:`جارٍ الإرسال...`,successTitle:`تحقق من بريدك الإلكتروني`,successDescription:`لقد أرسلنا رابط إعادة تعيين كلمة المرور إلى {{email}}. يرجى التحقق من بريدك الوارد.`,backToSignInText:`العودة إلى تسجيل الدخول`,rememberPasswordText:`تتذكر كلمة المرور؟`,signInText:`تسجيل الدخول`},resetPassword:{title:`تعيين كلمة مرور جديدة`,description:`اختر كلمة مرور لم تستخدمها من قبل.`,newPassword:`كلمة المرور الجديدة`,confirmPassword:`تأكيد كلمة المرور`,submit:`تحديث كلمة المرور`,submitting:`جارٍ التحديث…`,success:`تم تحديث كلمة المرور`,failed:`فشل إعادة التعيين`,invalidToken:`رابط إعادة التعيين هذا غير صالح أو منتهي الصلاحية.`,missingToken:`رابط إعادة التعيين مفقود أو منتهي الصلاحية`,passwordsMismatch:`كلمتا المرور غير متطابقتين`,requestNewLink:`طلب رابط جديد`},verifyEmail:{title:`التحقق من عنوان البريد الإلكتروني`,description:`أرسلنا رابط التحقق إلى بريدك الإلكتروني. انقر على الرابط للتحقق من حسابك.`,sentTo:`أُرسل إلى:`,verifyingTitle:`جارٍ التحقق…`,verifyingDescription:`نقوم بالتحقق من بريدك الإلكتروني. يرجى الانتظار.`,successTitle:`تم التحقق من البريد الإلكتروني`,successDescription:`تم التحقق من بريدك الإلكتروني. يمكنك الآن تسجيل الدخول.`,errorTitle:`فشل التحقق`,errorDescription:`فشل التحقق. يرجى طلب رابط جديد.`,missingToken:`رابط التحقق لا يحتوي على رمز.`,emailMissing:`عنوان البريد الإلكتروني مفقود`,resendButton:`إعادة إرسال بريد التحقق`,resending:`جارٍ الإرسال…`,resent:`تم إرسال البريد! تحقق من صندوق الوارد`,resentSuccess:`تم إرسال بريد التحقق!`,resentDescription:`يرجى التحقق من صندوق الوارد والنقر على رابط التحقق.`,resendFailed:`تعذر إعادة إرسال بريد التحقق`,signInLink:`الانتقال إلى تسجيل الدخول`,backToSignIn:`العودة إلى تسجيل الدخول`,backToLogin:`العودة إلى تسجيل الدخول`,checkSpam:`لم تستلم البريد؟ تحقق من مجلد البريد غير المرغوب أو تواصل مع الدعم.`,or:`أو`},setup:{welcomeTitle:`مرحباً بك في ObjectStack`,description:`أنشئ أول حساب مالك لإتمام الإعداد.`,yourName:`اسمك`,orgName:`اسم المنظمة`,orgNamePlaceholder:`شركة مثال`,emailLabel:`البريد الإلكتروني`,emailPlaceholder:`name@example.com`,passwordLabel:`كلمة المرور`,passwordHint:`8 أحرف على الأقل`,submit:`إنشاء حساب المالك`,submitting:`جارٍ الإعداد…`,failed:`فشل الإعداد`},device:{title:`تفويض جهاز جديد`,subtitle:`وافق على هذا الجهاز لتسجيل الدخول بوصفك {{email}}.`,userCodeLabel:`رمز الجهاز`,requesterLabel:`طلب اتصال من`,approveWarning:`وافق فقط إذا كنت قد بدأت هذا الاتصال بنفسك قبل لحظات. بعد الموافقة، سيتمكن وقت التشغيل هذا من الوصول إلى الحزم الخاصة بمؤسستك.`,loggedInAs:`مسجل الدخول بوصفك {{email}}`,approve:`الموافقة على الجهاز`,approving:`جارٍ الموافقة…`,approvedTitle:`تم تفويض الجهاز`,approvedDescription:`يمكنك العودة إلى الجهاز — يجب أن يسجل الدخول قريباً.`,approveSuccess:`تم تفويض الجهاز`,approveSuccessDescription:`يمكنك إغلاق هذه النافذة.`,approveFailed:`فشلت الموافقة`,deny:`رفض الطلب`,denying:`جارٍ الرفض…`,deniedTitle:`تم رفض الوصول`,deniedDescription:`لن يُمنح الجهاز وصولاً.`,denyFailed:`تعذر رفض الطلب`,invalidTitle:`رابط جهاز غير صالح`,invalidDescription:`لم يتم تقديم رمز جهاز في URL.`,loading:`جارٍ التحميل…`,cancel:`إلغاء`},shell:{tenantHostHint:`تسجل الدخول إلى مساحة العمل هذه`}},errors:{networkError:`خطأ في الشبكة. يرجى التحقق من اتصالك.`,serverError:`خطأ في الخادم. يرجى المحاولة مرة أخرى لاحقاً.`,notFound:`المورد غير موجود.`,unauthorized:`ليس لديك صلاحية لتنفيذ هذا الإجراء.`,forbidden:`تم رفض الوصول.`,timeout:`انتهت مهلة الطلب. يرجى المحاولة مرة أخرى.`,unknown:`حدث خطأ غير متوقع.`},workspace:{label:`مساحات العمل`,default:`مساحة العمل الخاصة بي`,switch:`تبديل مساحة العمل`,create:`إنشاء مساحة عمل`,createTitle:`إنشاء مساحة عمل`,createDescription:`مساحة العمل هي مساحة مشتركة لفريقك للتعاون.`,createButton:`إنشاء مساحة عمل`,nameLabel:`اسم مساحة العمل`,namePlaceholder:`مثلاً، Acme Inc`,slugLabel:`معرف URL`,slugHint:`يستخدم في عناوين URL. أحرف صغيرة وأرقام وشرطات فقط.`,invite:`دعوة عضو`,members:`الأعضاء`,settings:`إعدادات مساحة العمل`},help:{appDocs:`وثائق هذا التطبيق`,allDocs:`كل الوثائق`,onlineDocs:`الوثائق عبر الإنترنت`},sidebar:{settings:`الإعدادات`,help:`المساعدة`,helpTooltip:`المساعدة والوثائق`,activityFeed:`موجز النشاط`,notifications:`الإشعارات`,approvals:`الموافقات`,inbox:`صندوق الوارد`,inboxAriaLabel:`فتح صندوق الوارد`,area:`المنطقة`,scope:`النطاق`,recent:`الأخيرة`,favorites:`المفضلة`,starred:`المميزة`,removeFromFavorites:`إزالة {{name}} من المفضلة`},topbar:{aiAssistant:`مساعد الذكاء الاصطناعي`},home:{title:`الرئيسية`,subtitle:`لوحة تحكم مساحة العمل`,nav:`الرئيسية`,allApps:`جميع التطبيقات`,loading:`جارٍ تحميل مساحة العمل...`,recent:`الأخيرة`,starred:`المميزة بنجمة`,welcome:`مرحباً بك في ObjectUI`,welcomeDescription:`ابدأ بإنشاء تطبيقك الأول أو تكوين إعدادات النظام.`,createFirstApp:`أنشئ أول تطبيق لك`,systemSettings:`إعدادات النظام`,browseMarketplace:`تصفح متجر التطبيقات`,quickActions:{title:`إجراءات سريعة`,createApp:`إنشاء تطبيق`,createAppDesc:`ابدأ بتطبيق جديد`,manageObjects:`إدارة الكائنات`,manageObjectsDesc:`تكوين نماذج البيانات`,systemSettings:`إعدادات النظام`,systemSettingsDesc:`تكوين مساحة العمل الخاصة بك`},appCard:{noDescription:`لا يوجد وصف`,default:`افتراضي`},greetingMorning:`صباح الخير`,greetingAfternoon:`مساء الخير`,greetingEvening:`مساء النور`,greetingNight:`وردية الليل`,heroTagline:`استمر من حيث توقفت أو اكتشف شيئاً جديداً.`,open:`فتح`,stats:{apps:`التطبيقات`,starred:`المميزة`,recent:`الأخيرة`},recentApps:{title:`فُتح مؤخراً`,itemType:{object:`كائن`,dashboard:`لوحة تحكم`,page:`صفحة`,record:`سجل`}},starredApps:{title:`المميزة`},gettingStarted:{title:`تخصيص الصفحة الرئيسية`,description:`ضع علامة مميزة على تطبيق لتثبيته هنا والوصول إليه بنقرة واحدة. سيظهر كل ما تفتحه تلقائياً في "فُتح مؤخراً".`,cta:`استعراض جميع التطبيقات`}},layout:{appSwitcher:{home:`الرئيسية`,addApp:`إضافة تطبيق`,editApp:`تعديل التطبيق`,manageAllApps:`إدارة جميع التطبيقات`,systemConsole:`وحدة تحكم النظام`,noAppsConfigured:`لا تطبيقات مُهيأة`},activityFeed:{title:`النشاط الأخير`,filter:`تصفية`,empty:`لا نشاط أخير`,ariaLabel:`تغذية النشاط`,typeCreate:`إنشاء`,typeUpdate:`تحديث`,typeDelete:`حذف`,typeComment:`تعليق`,relativeJustNow:`الآن`,relativeSecondsAgo:`منذ {{count}} ث`,relativeMinutesAgo:`منذ {{count}} د`,relativeHoursAgo:`منذ {{count}} س`,relativeDaysAgo:`منذ {{count}} ي`,viewAll:`عرض كل النشاط`},metadata:{label:`البيانات الوصفية`,toggleTitle:`تبديل مفتش البيانات الوصفية`,panelTitle:`مفتش البيانات الوصفية`,jsonBadge:`JSON`,copyJson:`نسخ JSON`}},search:{title:`بحث`,back:`رجوع`,placeholder:`ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير...`,inputAriaLabel:`ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير`,resultsCount:`{{count}} نتيجة لـ "{{query}}"`,resultsCountPlural:`{{count}} نتيجة لـ "{{query}}"`,itemsAvailable:`{{count}} عنصر(عناصر) متاح(ة)`,noResults:`لم يتم العثور على نتائج`,noResultsHint:`جرب تعديل مصطلحات البحث`,typeObjects:`الكائنات`,typeDashboards:`لوحات التحكم`,typePages:`الصفحات`,typeReports:`التقارير`,badgeObject:`كائن`,badgeDashboard:`لوحة تحكم`,badgePage:`صفحة`,badgeReport:`تقرير`},empty:{objectNotFound:`الكائن غير موجود`,objectNotFoundDescription:`تعريف الكائن "{{name}}" مفقود. تحقق من الإعداد أو ارجع للخلف.`,pageNotFound:`الصفحة غير موجودة`,pageNotFoundDescription:`الصفحة "{{name}}" غير موجودة. ربما تم إزالتها أو إعادة تسميتها.`,dashboardNotFound:`لوحة التحكم غير موجودة`,dashboardNotFoundDescription:`لوحة التحكم "{{name}}" غير موجودة. ربما تم إزالتها أو إعادة تسميتها.`,reportNotFound:`التقرير غير موجود`,reportNotFoundDescription:`التقرير "{{name}}" غير موجود. ربما تم إزالته أو إعادة تسميته.`,noAppsConfigured:`لا تطبيقات مُهيأة`,noAppsConfiguredDescription:`لا تطبيقات مسجلة. أنشئ تطبيقك الأول أو زر إعدادات النظام.`,createFirstApp:`إنشاء أول تطبيق`,systemSettings:`إعدادات النظام`,back:`رجوع`,recordNotFound:`السجل غير موجود`,recordNotFoundDescription:`السجل الذي تبحث عنه غير موجود أو ربما تم حذفه.`},renderer:{noPageSchema:`لم يتم توفير مخطط الصفحة`,noFormSchema:`لم يتم توفير مخطط النموذج`,noDashboardSchema:`لم يتم توفير مخطط لوحة التحكم`,pageRendering:`تصيير الصفحة: {{name}}`,dashboardRendering:`تصيير لوحة التحكم: {{name}}`,formRenderingMode:`تصيير النموذج في وضع {{mode}}`,formRenderingFor:`للسجل {{id}}`,createRecord:`إنشاء سجل`,editRecord:`تعديل السجل`,page:`صفحة`,dashboard:`لوحة تحكم`,save:`حفظ`,cancel:`إلغاء`},actionDialog:{title:`معامِلات الإجراء`,description:`يرجى إدخال المعلومات المطلوبة للمتابعة.`,selectPlaceholder:`تحديد {{label}}`,requiredError:`{{label}} مطلوب`,cancel:`إلغاء`,confirm:`تأكيد`,defaultActionTitle:`إجراء`,ok:`موافق`,lookupPlaceholder:`لصق معرف السجل (UUID) لـ {{label}}`,lookupHelpText:`أدخل معرف سجل الكائن المرجع. سيتم إضافة أداة اختيار قريباً.`},actionConfirm:{title:`تأكيد الإجراء`,confirm:`متابعة`,cancel:`إلغاء`},rowAction:{openMenu:`فتح القائمة`,edit:`تعديل`,delete:`حذف`},navigationSync:{addedPage:`تم تحديث التنقل: تمت إضافة الصفحة "{{name}}"`,addedDashboard:`تم تحديث التنقل: تمت إضافة لوحة التحكم "{{name}}"`,removedPage:`تم تحديث التنقل: تمت إزالة الصفحة "{{name}}"`,removedDashboard:`تم تحديث التنقل: تمت إزالة لوحة التحكم "{{name}}"`,renamedPage:`تم تحديث التنقل: تمت إعادة تسمية الصفحة "{{oldName}}" إلى "{{newName}}"`,renamedDashboard:`تم تحديث التنقل: تمت إعادة تسمية لوحة التحكم "{{oldName}}" إلى "{{newName}}"`,undoLabel:`تراجع`,undone:`تم التراجع عن تغيير التنقل`,undoFailed:`تعذر التراجع عن تغيير التنقل`,updateFailed:`تعذر تحديث التنقل`},objectActions:{deleteSuccess:`تم حذف {{label}} بنجاح`,deleteFailed:`تعذر حذف {{label}}`,noRecordId:`لم يتم توفير معرف سجل`,deleteConfirm:`حذف هذا السجل؟`,bulkDeleteSuccess:`تم حذف {{count}} سجل(ات) {{label}}`,bulkDeletePartial:`تم حذف {{succeeded}}، فشل {{failed}}`},objectViewActions:{renameFailed:`تعذر إعادة تسمية العرض`,deleteFailed:`تعذر حذف العرض`},dashboardActions:{pdfPreparing:`جارٍ تحضير تصدير PDF…`,exportFailed:`فشل التصدير: {{message}}`,forecastSoon:`عرض التوقعات قادم قريباً`},recordDetail:{viewersTooltip:`المستخدمون يشاهدون هذا السجل الآن`},cellRender:{empty:`فارغ`,yes:`نعم`,no:`لا`,systemFields:`النظام`},user:{profile:`الملف الشخصي`,settings:`الإعدادات`,logout:`تسجيل الخروج`,preferences:`التفضيلات`,theme:`السمة`,language:`اللغة`},report:{total:`الإجمالي`,rowTotal:`إجمالي الصف`,columnTotal:`إجمالي العمود`,grandTotal:`الإجمالي الكلي`,totals:`الإجماليات`,rowsLabel:`صف`,columnsLabel:`عمود`,allLabel:`(الكل)`,emptyLabel:`(فارغ)`,loading:`جارٍ التحميل…`,failedToLoad:`فشل تحميل المصفوفة: {{message}}`,needsAcross:"يتطلب تقرير المصفوفة حقل `groupingsAcross` واحداً على الأقل.",aggregate:{count:`عدد`,countDistinct:`عدد الفريد`,sum:`مجموع`,avg:`متوسط`,min:`الحد الأدنى`,max:`الحد الأقصى`,first:`الأول`},editor:{breadcrumb:`الإعدادات`,basic:`أساسي`,title:`العنوان`,titlePlaceholder:`مثال: المسار حسب الربع`,description:`الوصف`,descriptionPlaceholder:`ماذا يعرض هذا التقرير؟`,type:`نوع التقرير`,typeTabular:`جدولي — قائمة مسطّحة`,typeSummary:`ملخص — مجمّع مع المجاميع`,typeMatrix:`مصفوفة — محور صفوف × أعمدة`,typeJoined:`مدمج — كتل متعددة`,typeHelp:`اختر التخطيط الذي يطابق ما تريد رؤيته.`,data:`البيانات`,objectName:`مصدر البيانات`,objectNamePlaceholder:`مثال: opportunity`,objectNameHelp:`أي كائن يجب أن يستعلم عنه هذا التقرير؟`,limit:`حد عدد الصفوف`,limitPlaceholder:`مثال: 100`,columns:`الأعمدة`,columnsHint:`اختر الحقول التي ستظهر كأعمدة. أضف تجميعًا (مجموع، عدد…) في تقارير الملخص أو المصفوفة.`,filters:`عوامل التصفية`,filtersHint:`قيّد الصفوف التي تدخل في هذا التقرير.`,filtersComplex:`يستخدم هذا التقرير عامل تصفية متقدّمًا لا يمكن تحريره هنا. سيُحتفظ به كما هو عند الحفظ.`,groupBy:`التجميع حسب`,groupByHint:`جمّع البيانات واحسب المجاميع الفرعية.`,rows:`الصفوف`,rowsHint:`جمّع الصفوف حسب هذه الحقول.`,columnsAxis:`الأعمدة`,columnsAxisHint:`اعرض هذه الحقول كمحور في الأعلى.`,values:`القيم`,valuesHint:`الأرقام التي تظهر في كل خلية. اختر حقلاً واحدًا أو أكثر وأضف تجميعًا (مجموع، عدد…).`,grouping:`تجميع`,addGrouping:`إضافة تجميع`,dateGranularity:`دقة التاريخ`,dateGranularityNone:`(استخدام القيمة الأصلية)`,day:`يوم`,week:`أسبوع`,month:`شهر`,quarter:`ربع`,year:`سنة`,sortAsc:`تصاعدي`,sortDesc:`تنازلي`,chart:`الرسم البياني`,chartHint:`عرض مرئي اختياري بجانب الجدول.`,chartType:`نوع الرسم`,chartTitle:`عنوان الرسم`,chartTitlePlaceholder:`افتراضيًا يستخدم عنوان التقرير`,chartXAxis:`المحور السيني (الفئة)`,chartYAxis:`المحور الصادي (القيمة)`,chartShowLegend:`إظهار وسيلة الإيضاح`,chartShowDataLabels:`إظهار تسميات البيانات`,chartNone:`(بدون رسم)`,chartBar:`أعمدة`,chartLine:`خطي`,chartArea:`منطقة`,chartPie:`دائري`,chartDonut:`حلقي`,chartFunnel:`قمعي`,validationNeedsObject:`اختر مصدر بيانات قبل إضافة الأعمدة.`,validationMatrixNeedsRowsCols:`تتطلب تقارير المصفوفة صفًا وعمودًا واحدًا على الأقل.`,validationSummaryNeedsRows:`تتطلب تقارير الملخص حقل تجميع واحدًا على الأقل.`,blocks:`الكتل`,blocksHint:`كل كتلة هي جدولها أو رسمها البياني الخاص. عوامل تصفية الكتلة تُدمج مع عامل تصفية التقرير بمنطق AND.`,addBlock:`إضافة كتلة`,removeBlock:`إزالة الكتلة`,blockName:`اسم الكتلة`,blockNamePlaceholder:`اسم_فريد_للكتلة`,blockLabel:`التسمية المعروضة`,blockLabelPlaceholder:`تُعرض فوق الكتلة`,blockDescription:`الوصف`,blockDescriptionPlaceholder:`سياق اختياري لهذه الكتلة`,validationJoinedNeedsBlocks:`تتطلب التقارير المدمجة كتلة واحدة على الأقل.`,validationBlockNameRequired:`يجب أن يكون لكل كتلة اسم غير فارغ.`,validationBlockNameDuplicate:`يجب أن تكون أسماء الكتل فريدة داخل التقرير.`,validationBlockNeedsColumns:`تحتاج كل كتلة إلى عمود واحد على الأقل.`,noneOption:`(بلا)`,addCondition:`إضافة شرط`,combineLogic:`الدمج مع`,opContains:`يحتوي على`,opIsEmpty:`فارغ`,opIsNotEmpty:`ليس فارغًا`,formatAuto:`تلقائي`,formatCurrency:`عملة`,formatPercent:`نسبة مئوية`,formatInteger:`عدد صحيح`,formatDate:`تاريخ`,formatDatetime:`تاريخ ووقت`,columnLabelPlaceholder:`تجاوز التسمية`,aggregateColumn:`تجميع`,formatColumn:`تنسيق`,addColumns:`إضافة أعمدة`,searchFields:`البحث في الحقول…`,noMatchingFields:`لا توجد حقول تطابق بحثك.`,noFieldsAvailable:`لا توجد حقول متاحة.`,columnsCount:`{n} عمود(أعمدة) محدد(ة)`,columnsEmpty:`لم يتم تحديد أعمدة بعد.`,fieldPickerTitle:`تحديد الحقول`,fieldPickerDescription:`اختر حقلاً أو أكثر للإضافة. استخدم مربع البحث لتصفية القائمة.`,fieldPickerChangeTitle:`تغيير الحقل`,fieldPickerAddGroupingTitle:`إضافة تجميع`,fieldPickerEmpty:`(تحديد حقل)`,fieldPickerSelected:`{n} محدد(ة)`,fieldPickerClear:`مسح التحديد`,fieldPickerAdd:`إضافة`,fieldPickerAddN:`إضافة {n}`}},organizations:{mine:`مؤسساتي`,title:`المؤسسات`,heading:`مؤسساتك`,subtitle:`اختر مؤسسة للمتابعة، أو أنشئ مؤسسة جديدة.`,searchPlaceholder:`ابحث عن مؤسسة`,new:`مؤسسة جديدة`,current:`المؤسسة الحالية`,manage:`إدارة`,emptyTitle:`لا توجد مؤسسات بعد`,emptyDescription:`أنشئ مؤسستك الأولى للبدء.`,noMatches:`لا توجد مؤسسات تطابق بحثك.`},notifications:{empty:`لا توجد إشعارات`,markAllRead:`تعليم الكل كمقروء`,viewAll:`عرض جميع الإشعارات`,approvalsPending:`{{count}} موافقات معلقة`,viewApprovals:`عرض الموافقات`,noPendingApprovals:`لا توجد موافقات معلقة`,openApprovalsInbox:`فتح صندوق الموافقات`,emptyUnread:`كل شيء مقروء`,filterUnread:`غير مقروء`,filterAll:`الكل`},publicForm:{submit:`إرسال`,submitting:`جارٍ الإرسال…`,submitAnother:`إرسال رد آخر`,poweredBy:`مدعوم بـ ObjectStack`,secureNotice:`يتم نقل معلوماتك بأمان وتستخدم فقط لمعالجة طلبك.`,thankYouTitle:`شكراً!`,thankYouMessage:`تم استلام إرسالك بنجاح.`,redirecting:`إعادة توجيه خلال {{seconds}} ثانية(ثوانٍ)…`,unavailableTitle:`النموذج غير متاح`,unavailableDescription:`لا يوجد نموذج عام متاح على هذا الرابط. تأكد من تمكين المشاركة المجهولة للعرض الأساسي.`,tryDemo:`تجربة العرض التوضيحي`,retry:`إعادة المحاولة`,loading:`جارٍ تحميل النموذج…`,requiredHint:`* حقل مطلوب`,consentLabelDefault:`أوافق على سياسة الخصوصية وأعطي موافقتي على معالجة بياناتي لهذا الطلب.`,consentLink:`سياسة الخصوصية`,consentRequired:`يرجى قبول سياسة الخصوصية للمتابعة.`,rateLimited:`خذ لحظة لمراجعة إجاباتك قبل الإرسال.`,redirectBlocked:`تم قبول الإرسال، لكن رابط إعادة التوجيه تم حظره لأسباب أمنية.`,demo:{contactTitle:`تواصل معنا`,contactDescription:`أخبرنا عن مشروعك وسيتواصل معك أحد ممثلي المبيعات خلال يوم عمل.`,supportTitle:`إرسال طلب دعم`,supportDescription:`صف لنا المشكلة وسيرد فريقنا خلال يوم عمل.`,thankYouSalesTitle:`شكراً — لقد استلمنا رسالتك!`,thankYouSalesMessage:`سيتواصل معك أحد ممثلي المبيعات خلال يوم عمل.`,thankYouSupportTitle:`تم — طلبك في قائمة الانتظار.`,thankYouSupportMessage:`سيتابع معك مهندس الدعم قريباً. احفظ هذه الصفحة إذا كان لديك لقطات شاشة إضافية.`,field:{firstName:`الاسم الأول`,lastName:`اسم العائلة`,email:`البريد الإلكتروني للعمل`,phone:`الهاتف`,jobTitle:`المسمى الوظيفي`,company:`الشركة`,website:`الموقع الإلكتروني`,industry:`القطاع`,companySize:`حجم الشركة`,howCanWeHelp:`كيف يمكننا مساعدتك؟`,subject:`الموضوع`,description:`الوصف`,issueType:`نوع المشكلة`,priority:`الأولوية`},industry:{technology:`التكنولوجيا`,software:`البرمجيات / SaaS`,finance:`المالية`,healthcare:`الرعاية الصحية`,retail:`التجزئة`,other:`أخرى`},issueType:{question:`سؤال`,problem:`مشكلة`,bug:`خطأ برمجي`,feature_request:`طلب ميزة`},priority:{low:`منخفضة`,medium:`متوسطة`,high:`عالية`,critical:`حرجة`}}},marketplace:{title:`سوق التطبيقات`,subtitle:`استعرض التطبيقات المعتمدة المنشورة في كتالوج ObjectStack. انقر على تطبيق لرؤية التفاصيل وتثبيته في أحد بيئاتك.`,searchPlaceholder:`ابحث عن التطبيقات بالاسم أو معرف المانيفست…`,searchAria:`البحث في تطبيقات السوق`,installed:`مثبت`,installedCount:`مثبت ({{count}})`,refresh:`تحديث`,all:`الكل`,noApprovedYet:`لا توجد تطبيقات معتمدة للسوق بعد.`,noMatchFilters:`لا توجد تطبيقات تطابق الفلاتر.`,noDescription:`لا وصف متاح.`,back:`العودة إلى السوق`,installedTitle:`التطبيقات المثبتة`,installedSubtitle:`حزم السوق المثبتة حالياً في نواة هذا الوقت التشغيل.`,installedEmpty:`لا توجد تطبيقات سوق مثبتة في هذا الوقت التشغيل بعد.`,browseLink:`استعراض السوق →`,installedAdditiveNote:`<strong>ملاحظة:</strong> واجهة برمجة النواة إضافية فقط — إلغاء التثبيت يزيل المانيفست من القرص لكي لا يتم تحميل الحزمة عند التشغيل التالي، لكن النواة الجارية تبقي التطبيق مسجلاً حتى إعادة التشغيل.`,installedAt:`تم التثبيت {{when}}`,installedBy:`بواسطة {{user}}`,installedPackageId:`الحزمة`,cachedAs:`مخزن مؤقتاً كـ <code>{{path}}</code>`,versionBadge:`v{{version}}`,installedBadge:`مثبت v{{version}}`,load:{failed:`تعذر تحميل السوق`,failedHint:`بشكل افتراضي، يشير هذا الوقت التشغيل إلى سحابة ObjectStack العامة. تأكد من أن الوقت التشغيل متصل بالإنترنت.`,packageFailed:`تعذر تحميل الحزمة`,notFound:`غير موجود.`},detail:{homepage:`الصفحة الرئيسية`,installedV:`مثبت · v{{version}}`,about:`حول`,noReadme:`لا يوجد readme متاح.`,versions:`الإصدارات`,noApprovedVersions:`لا توجد إصدارات معتمدة.`,prerelease:`ما قبل الإصدار`,moreOptions:`مزيد من خيارات التثبيت`,uninstallFromRuntime:`إلغاء التثبيت من هذا الوقت التشغيل`,addSampleData:`إضافة بيانات تجريبية`,reseedAgain:`إعادة تحميل البيانات التجريبية`,purgeSampleData:`حذف البيانات التجريبية`,purgeConfirm:`حذف جميع السجلات التجريبية التي أنشأتها هذه الحزمة؟ لن تتأثر السجلات التي أضافها المستخدم.`,purgeSuccess:`تم حذف {{count}} سجل تجريبي.`,purgeNoData:`لا توجد سجلات تجريبية للحذف.`,reseedQueued:`ستتم إعادة تحميل البيانات التجريبية عند الوصول التالي إلى البيئة.`,reseedLocalSuccess:`تمت إعادة تحميل البيانات التجريبية: {{inserted}} مضافة، {{updated}} محدثة.`,reseedPartialErrors:`(فشل في كتابة {{count}} سجل)`,updateAvailable:`يتوفر تحديث`},action:{install:`تثبيت`,reinstall:`إعادة التثبيت`,working:`جارٍ المعالجة…`,installToCloud:`تثبيت في السحابة…`,installing:`جارٍ التثبيت…`,uninstall:`إلغاء التثبيت`,uninstalling:`جارٍ إلغاء التثبيت…`,details:`التفاصيل`,close:`إغلاق`,dismiss:`رفض`,openOnCloud:`فتح في السحابة`,backHome:`العودة إلى الرئيسية`},install:{dialogTitle:`تثبيت {{name}}`,dialogDescCurrent:`تثبيت في هذه البيئة ({{host}}).`,dialogDescPicker:`اختر بيئة لتثبيت هذا التطبيق. يجب أن تكون مسجلاً في ObjectStack Cloud.`,environment:`البيئة`,environmentPlaceholder:`تحديد بيئة`,includeSampleData:`تضمين بيانات نموذجية`,noEnvs:`لم يتم العثور على بيئات في مؤسستك النشطة.`,noPermission:`ليس لديك إذن لتثبيت التطبيقات. فقط مالكو المؤسسة والمشرفون يمكنهم التثبيت.`,signInFirst:`يجب عليك أولاً تسجيل الدخول إلى ObjectStack Cloud.`,success:`تم التثبيت بنجاح. افتح البيئة لرؤية التطبيق الجديد.`,localSuccess:`تم تثبيت v{{version}} في هذا الوقت التشغيل. يجب أن يظهر "{{name}}" الآن في مبدّل التطبيقات.`,localManifestConflict:`{{message}}
|
|
32
32
|
ملاحظة: تطبيق محلي يمتلك بالفعل هذا المعرف. أزله أولاً من objectstack.config.ts.`,localUnauthorized:`سجل الدخول إلى هذا الوقت التشغيل أولاً.`,localMarketplaceUnavailable:`هذا الوقت التشغيل لا يحتوي على OS_CLOUD_URL مُهيأ.`},uninstall:{confirm:`إلغاء تثبيت {{manifestId}} v{{version}} من هذا الوقت التشغيل؟
|
|
33
33
|
|
|
34
|
-
سيتم إزالة المانيفست المخزن مؤقتاً.`,successInList:`تم إزالة {{manifestId}}. أعد تشغيل الوقت التشغيل لتفريغه بالكامل.`,successInDetail:`تم إزالة المانيفست المخزن مؤقتاً لـ {{manifestId}}.`},accessDenied:{title:`سوق التطبيقات للمشرفين فقط`,description:`ليس لديك إذن لتثبيت التطبيقات في هذه البيئة.`},category:{crm:`CRM`,erp:`ERP`,hr:`الموارد البشرية`,finance:`المالية`,project:`إدارة المشاريع`,collaboration:`التعاون`,analytics:`التحليلات`,integration:`التكامل`,automation:`الأتمتة`,ai:`الذكاء الاصطناعي`,security:`الأمان`,"developer-tools":`أدوات المطور`,"ui-theme":`سمة واجهة المستخدم`,storage:`التخزين`,other:`أخرى`},pricing:{free:`مجاني`,freemium:`مجاني جزئياً`,paid:`مدفوع`,subscription:`اشتراك`,"usage-based":`حسب الاستخدام`,"contact-sales":`تواصل مع المبيعات`},relativeTime:{today:`اليوم`,daysAgo:`منذ {{count}} ي`,monthsAgo:`منذ {{count}} شهر(أشهر)`,yearsAgo:`منذ {{count}} سنة(سنوات)`}},approvalsInbox:{loadMore:`تحميل المزيد`,loadingMore:`جارٍ التحميل…`,loadedOf:`تم تحميل {{loaded}} من {{total}}`,actEscalate:`تصعيد SLA`,systemSlaActor:`النظام (SLA)`,reassignBtn:`إعادة إسناد`,reassignTitle:`تسليم هذه الموافقة لشخص آخر؟`,reassignBody:`ينتقل مقعدك كموافق إلى الشخص المختار — يتم إخطاره ويمكنه التصرف فورًا.`,reassignTo:`الموافق الجديد`,reassignToPlaceholder:`اختر مستخدمًا أو اكتب بريدًا / role:<الاسم>`,reassignSuccess:`تم التسليم إلى {{to}}`,requestInfoBtn:`طلب معلومات`,requestInfoTitle:`طلب مزيد من المعلومات من مقدم الطلب؟`,requestInfoBody:`يبقى الطلب قيد الانتظار؛ يُخطر مقدم الطلب ويمكنه الرد في السلسلة.`,requestInfoPlaceholder:`ماذا تحتاج من مقدم الطلب؟`,requestInfoSent:`أُعيد إلى مقدم الطلب لاستكمال المعلومات`,remindBtn:`تذكير`,remindSuccess:`أُرسل تذكير إلى {{count}} موافق`,remindThrottled:`أُرسل تذكير مؤخرًا — حاول لاحقًا.`,replyPlaceholder:`الرد على هذا الطلب…`,slaRemaining:`SLA المتبقي {{dur}}`,slaOverdue:`SLA متأخر {{dur}}`,actReassign:`إعادة إسناد`,actRemind:`تذكير`,actRequestInfo:`طلب معلومات`,actComment:`تعليق`,stepProgress:`خطوات الموافقة`,prevRequest:`السابق`,nextRequest:`التالي`,positionOf:`{{index}} من {{total}}`,quickPhrase1:`موافق — مستوفٍ للمتطلبات.`,quickPhrase2:`موافقة مشروطة — يرجى متابعة التنفيذ.`,quickPhrase3:`يرجى إضافة مستندات داعمة وإعادة التقديم.`,title:`مركز الموافقات`,subtitle:`راجع طلبات الموافقة وتعامل معها.`,refresh:`تحديث`,tabMyPending:`بانتظار موافقتي`,tabSubmitted:`المقدمة مني`,tabAll:`الكل`,searchPlaceholder:`ابحث عن سجل أو عملية أو مقدم طلب…`,clearSearch:`مسح البحث`,statusFilter:`الحالة`,allStatuses:`كل الحالات`,processFilter:`العملية`,allProcesses:`كل العمليات`,objectFilter:`الكائن`,allObjects:`كل الكائنات`,filterCount:`{{shown}} من {{total}}`,selected:`محدد`,actionableCount:`({{count}} قابلة للتنفيذ)`,selectAll:`تحديد الكل`,selectRow:`تحديد الطلب`,colRequest:`الطلب`,colRecord:`السجل`,colRequester:`مقدم الطلب`,colStatus:`الحالة`,colWaiting:`تاريخ التقديم`,colActions:`إجراءات`,statusPending:`قيد الانتظار`,statusApproved:`تمت الموافقة`,statusRejected:`مرفوض`,statusRecalled:`مسحوب`,statusReturned:`أُعيد للمراجعة`,sendBackBtn:`إعادة للمراجعة`,sendBackTitle:`إعادة هذا الطلب للمراجعة؟`,sendBackBody:`تنتهي هذه الجولة ويُفتح قفل السجل ليتمكن مقدم الطلب من تصحيح البيانات. عند إعادة الإرسال تبدأ جولة موافقة جديدة لجميع الموافقين.`,sendBackPlaceholder:`ما الذي يجب تصحيحه قبل الموافقة؟`,sendBackSuccess:`أُعيد للمراجعة — يمكن لمقدم الطلب الآن التعديل وإعادة الإرسال`,sendBackAutoRejected:`تم بلوغ حد المراجعات — رُفض الطلب تلقائيًا`,actRevise:`أُعيد للمراجعة`,actResubmit:`أُعيد الإرسال`,roundChip:`الجولة {{n}}`,returnedHint:`أعاد أحد الموافقين هذا الطلب إليك. السجل غير مقفل — صحّح البيانات ثم أعد الإرسال لبدء جولة موافقة جديدة.`,resubmitBtn:`إعادة الإرسال`,resubmitting:`جارٍ إعادة الإرسال…`,resubmitSuccess:`أُعيد الإرسال — بدأت جولة موافقة جديدة`,resubmitPlaceholder:`ما الذي غيّرته؟`,editRecordBtn:`تحرير السجل`,abandonTitle:`التخلي عن هذه المراجعة؟`,abandonBody:`يُسحب الطلب بدلاً من إعادة إرساله. تنتهي الموافقة هنا.`,emptyTitle:`لا توجد طلبات`,emptyPending:`كل شيء منجز — لا يوجد ما ينتظر موافقتك.`,emptyOther:`لا يوجد شيء هنا بعد.`,emptyViewAll:`عرض كل الطلبات`,noMatches:`لا نتائج مطابقة للمرشحات الحالية.`,keyboardHint:`لوحة المفاتيح: j/k تنقل · Enter فتح · x تحديد · a موافقة · r رفض`,drawerTitle:`طلب موافقة`,submittedAgo:`قُدِّم {{when}}`,completedAt:`اكتمل {{when}}`,waitingOn:`بانتظار`,history:`النشاط`,noActions:`لا إجراءات بعد.`,actSubmit:`تقديم`,actApprove:`موافقة`,actReject:`رفض`,actRecall:`سحب`,rawData:`البيانات الخام (JSON)`,copy:`نسخ`,copied:`تم النسخ`,copyFailed:`فشل النسخ`,overrideActor:`التصرف بهوية أخرى (مسؤول)`,actor:`الهوية`,auto:`تلقائي`,overrideHint:`مثال: role:sales_manager. اتركه فارغًا لاستخدام الهوية المكتشفة تلقائيًا.`,comment:`تعليق (اختياري)`,approve:`موافقة`,approving:`جارٍ الموافقة…`,reject:`رفض`,rejecting:`جارٍ الرفض…`,recall:`سحب`,recalling:`جارٍ السحب…`,cancel:`إلغاء`,clear:`مسح`,approveN:`الموافقة على {{count}}`,rejectN:`رفض {{count}}`,bulkApproveTitle:`الموافقة على {{count}} طلبات؟`,bulkApproveBody:`ستتم الموافقة على كل طلب بهويتك ويتابع التدفق عبر فرع الموافقة.`,bulkRejectTitle:`رفض {{count}} طلبات؟`,bulkRejectBody:`سيتم رفض الطلبات المحددة وإخطار مقدميها.`,bulkApproved:`تمت الموافقة على {{count}} طلبات`,bulkRejected:`تم رفض {{count}} طلبات`,bulkPartial:`نجح {{ok}}، فشل {{fail}}: {{which}}`,rejectOneTitle:`رفض "{{title}}"؟`,rejectOneBody:`سيتم رفض الطلب وإخطار مقدمه.`,rejectTitle:`رفض هذا الطلب؟`,rejectBody:`سيتم وضع علامة مرفوض على الطلب وإخطار مقدمه.`,recallTitle:`سحب هذا الطلب؟`,recallBody:`بعد السحب لن يتمكن الموافقون من التصرف، وسيتم فك قفل السجل.`,inlineApproved:`تمت الموافقة على "{{title}}"`,inlineRejected:`تم رفض "{{title}}"`,approvedFinal:`تمت الموافقة`,approvedWaiting:`تمت الموافقة — بانتظار بقية الموافقين`,rejectedToast:`تم الرفض`,recalledToast:`تم سحب الطلب`,whyDisabled:`لا يمكن التصرف إلا للموافقين المعينين. بانتظار: {{who}}.`,whyDisabledSubmitter:`أنت قدمت هذا الطلب لذا يمكنك سحبه — لكن الموافقة أو الرفض للموافقين المعينين فقط.`,noActor:`تعذر تحديد هوية التنفيذ`,actionFailed:`فشل الإجراء`,loadFailed:`فشل تحميل الطلب`,recallUnavailable:`السحب غير متاح في هذا النشر.`,requestGone:`لم يعد هذا الطلب موجودًا. حدّث القائمة.`,notAllowed:`ليست لديك صلاحية لهذا الإجراء.`,alreadyDecided:`تم البت في هذا الطلب بالفعل. حدّث القائمة.`,justNow:`الآن`,minutesAgo:`قبل {{count}} دقيقة`,hoursAgo:`قبل {{count}} ساعة`,daysAgo:`قبل {{count}} يوم`},preview:{empty:{loadFailedTitle:`تعذّر تحميل معاينة المسودة`,loadFailedDescription:`تعذّرت قراءة طبقة المسودة. أعد المحاولة أو تحقق من الاتصال.`,notReadyTitle:`"{{app}}" ليس في المسودة بعد`,notReadyDescription:`قد يكون البناء قيد التشغيل، أو فشل قبل تجهيز هذا التطبيق. تحقق من حالة البناء في المحادثة — تتحدث هذه اللوحة عند وصول المسودات.`,nothingTitle:`لا شيء للمعاينة بعد`,retry:`إعادة المحاولة`},draftBar:{message:`معاينة المسودة — أنت ترى تغييرات غير منشورة. لن يصبح أي شيء فعليًا حتى تنشر.`,publish:`نشر`,publishing:`جارٍ النشر…`,exit:`إنهاء المعاينة`,changes:`التغييرات`},changes:{title:`التغييرات المعلّقة`,description:`ما الذي سيغيّره النشر. تُضاف العناصر الجديدة؛ وتستبدل التحديثات النسخة المنشورة.`,loading:`جارٍ تحميل التغييرات المعلّقة…`,loadFailed:`تعذّر تحميل التغييرات المعلّقة:`,empty:`لا شيء معلّق — نُشرت كل المسودات.`,kindNew:`جديد`,kindUpdate:`تحديث`}},filterBuilder:{where:`حيث`,and:`و`,or:`أو`,clearAll:`مسح الكل`,selectField:`اختر الحقل`,operator:`العامل`,selectValue:`اختر القيمة`,value:`القيمة`,addFilter:`إضافة عامل تصفية`,removeCondition:`إزالة الشرط`,trueLabel:`نعم`,falseLabel:`لا`,noResults:`لا توجد نتائج`,searchField:`بحث {{label}}…`,enterId:`أدخل معرّف {{label}}`,operators:{equals:`يساوي`,notEquals:`لا يساوي`,contains:`يحتوي`,notContains:`لا يحتوي`,isEmpty:`فارغ`,isNotEmpty:`غير فارغ`,greaterThan:`أكبر من`,lessThan:`أصغر من`,greaterOrEqual:`أكبر من أو يساوي`,lessOrEqual:`أصغر من أو يساوي`,before:`قبل`,after:`بعد`,between:`بين`,in:`ضمن`,notIn:`ليس ضمن`}},sortBuilder:{sortBy:`ترتيب حسب`,thenBy:`ثم حسب`,selectField:`اختر الحقل`,ascending:`A → Z`,descending:`Z → A`,addSort:`إضافة ترتيب`,removeSort:`إزالة الترتيب`}}},Zr=[`ar`,`he`,`fa`,`ur`];function Qr(e){return Zr.includes(e)}var $r=`__ouiLabelProbe`;function ei(){return typeof process>`u`||!1}function ti(){let e=new Set;return(t,n,r,i,a,o)=>{if(o&&o.__ouiLabelProbe)return;let s=Array.isArray(t)?t[0]:String(t??``),c=`${s}:${r}`;if(e.has(c))return;e.add(c);let l=i?`"${i}"`:`the key itself`;console.warn(`[object-ui i18n] Missing translation for "${r}" (language "${s}") — falling back to ${l}.`)}}function ni(e={}){let{defaultLanguage:t=`en`,fallbackLanguage:n=`en`,resources:r={},detectBrowserLanguage:i=!0,interpolation:o,warnMissingKeys:c=ei()}=e,l={};for(let[e,t]of Object.entries(Xr))l[e]={translation:{...t,...r[e]||{}}};for(let[e,t]of Object.entries(r))l[e]||(l[e]={translation:t});let u=t;if(i&&typeof navigator<`u`){let e=navigator.language?.split(`-`)[0];e&&l[e]&&(u=e)}let d=a.createInstance();return d.use(s).init({lng:u,fallbackLng:n,resources:l,interpolation:{escapeValue:!1,...o},returnNull:!1,saveMissing:c,missingKeyHandler:c?ti():void 0,react:{useSuspense:!1}}),d}function ri(e){return Qr(e)?`rtl`:`ltr`}var ii=(0,I.createContext)(null);function ai({config:e,instance:t,loadLanguage:n,children:r}){let i=(0,I.useMemo)(()=>t||ni(e),[t,e]),[a,o]=(0,I.useState)(i.language||`en`),s=ri(a),l=(0,I.useRef)(new Set);(0,I.useEffect)(()=>{let e=e=>{o(e),typeof document<`u`&&(document.documentElement.dir=ri(e),document.documentElement.lang=e)},t=i.language||a;return typeof document<`u`&&t&&(document.documentElement.dir=ri(t),document.documentElement.lang=t),i.on(`languageChanged`,e),()=>{i.off(`languageChanged`,e)}},[i]),(0,I.useEffect)(()=>{if(!n)return;let e=i.language||`en`;l.current.has(e)||(l.current.add(e),n(e).then(t=>{t&&Object.keys(t).length>0&&(i.addResourceBundle(e,`translation`,t,!0,!0),o(e))}).catch(t=>{l.current.delete(e),console.warn(`[i18n] Failed to load app translations for '${e}':`,t)}))},[i,n]);let u=(0,I.useMemo)(()=>({language:a,changeLanguage:async e=>{if(n&&!l.current.has(e)){l.current.add(e);try{let t=await n(e);i.addResourceBundle(e,`translation`,t,!0,!0)}catch(t){l.current.delete(e),console.warn(`[i18n] Failed to load app translations for '${e}':`,t)}}await i.changeLanguage(e)},direction:s,i18n:i}),[a,s,i,n]);return I.createElement(ii.Provider,{value:u},I.createElement(c,{i18n:i},r))}function oi(e){let t=(0,I.useContext)(ii),{t:n,i18n:r}=o(e);return{t:n,language:t?.language||r.language||`en`,changeLanguage:t?.changeLanguage||(async e=>{await r.changeLanguage(e)}),direction:t?.direction||`ltr`,i18n:r}}function si(e,t){return function(){try{let n=oi();return n.t(t)===t?{t:(t,n)=>{let r=e[t]||t;if(n)for(let[e,t]of Object.entries(n))r=r.replace(`{{${e}}}`,String(t));return r}}:{t:n.t}}catch{return{t:(t,n)=>{let r=e[t]||t;if(n)for(let[e,t]of Object.entries(n))r=r.replace(`{{${e}}}`,String(t));return r}}}}}function ci(){let e;try{e=oi().t}catch{e=void 0}return(t,n)=>{if(!e)return n;let r=Array.isArray(t)?t:[t];for(let t of r){let n=e(t);if(n&&n!==t)return n}return n}}var li=si({"common.selectOption":`Select an option`},`common.selectOption`),ui=({field:e,methods:t,disabled:n=!1})=>{let{register:r,formState:{errors:i}}=t,{t:a}=li(),o=e,s=e.widget||`text`,c=e.field,l=i[c],u=ot(e.label),d=ot(e.placeholder),f=ot(e.helpText),p=e=>o.multiple&&e instanceof HTMLCollection?Array.from(e).map(e=>e.value):e;if(e.hidden)return null;let m=t=>(0,L.jsxs)(`div`,{className:`space-y-2`,children:[u&&(0,L.jsxs)(`label`,{htmlFor:c,className:`block text-sm font-medium text-gray-700`,children:[u,e.required&&(0,L.jsx)(`span`,{className:`text-red-500 ml-1`,children:`*`})]}),t,f&&(0,L.jsx)(`p`,{className:`text-sm text-gray-500`,children:f}),l&&(0,L.jsx)(`p`,{className:`text-sm text-red-600`,children:l.message})]});switch(s.toLowerCase()){case`text`:case`string`:case`email`:case`password`:case`url`:case`tel`:return m((0,L.jsx)(`input`,{id:c,type:s===`string`?`text`:s,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`number`:case`integer`:case`float`:return m((0,L.jsx)(`input`,{id:c,type:`number`,placeholder:d,disabled:n,step:s===`integer`?`1`:`any`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,valueAsNumber:!0})}));case`checkbox`:case`boolean`:return(0,L.jsxs)(`div`,{className:`flex items-start space-x-2`,children:[(0,L.jsx)(`input`,{id:c,type:`checkbox`,disabled:n,className:`mt-1 h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-2 focus:ring-blue-500 disabled:opacity-50`,...r(c)}),(0,L.jsxs)(`div`,{className:`flex-1`,children:[u&&(0,L.jsxs)(`label`,{htmlFor:c,className:`text-sm font-medium text-gray-700`,children:[u,e.required&&(0,L.jsx)(`span`,{className:`text-red-500 ml-1`,children:`*`})]}),f&&(0,L.jsx)(`p`,{className:`text-sm text-gray-500 mt-1`,children:f}),l&&(0,L.jsx)(`p`,{className:`text-sm text-red-600 mt-1`,children:l.message})]})]});case`textarea`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d,disabled:n,rows:4,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`select`:case`dropdown`:return m((0,L.jsxs)(`select`,{id:c,disabled:n,multiple:o.multiple,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,setValueAs:p}),children:[!o.multiple&&(0,L.jsx)(`option`,{value:``,children:d||a(`common.selectOption`)}),o.options?.map(e=>(0,L.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]}));case`date`:return m((0,L.jsx)(`input`,{id:c,type:`date`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`datetime`:case`datetime-local`:return m((0,L.jsx)(`input`,{id:c,type:`datetime-local`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`time`:return m((0,L.jsx)(`input`,{id:c,type:`time`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`currency`:return m((0,L.jsxs)(`div`,{className:`relative`,children:[(0,L.jsx)(`span`,{className:`absolute left-3 top-2 text-gray-500`,children:`$`}),(0,L.jsx)(`input`,{id:c,type:`number`,placeholder:d,disabled:n,step:`0.01`,className:`w-full pl-8 pr-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,valueAsNumber:!0})})]}));case`percent`:return m((0,L.jsxs)(`div`,{className:`relative`,children:[(0,L.jsx)(`input`,{id:c,type:`number`,placeholder:d,disabled:n,step:`0.01`,min:`0`,max:`100`,className:`w-full pr-8 pl-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,valueAsNumber:!0})}),(0,L.jsx)(`span`,{className:`absolute right-3 top-2 text-gray-500`,children:`%`})]}));case`phone`:return m((0,L.jsx)(`input`,{id:c,type:`tel`,placeholder:d||`+1 (555) 000-0000`,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`markdown`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d||`Enter markdown text...`,disabled:n,rows:8,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed font-mono`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`html`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d||`Enter HTML...`,disabled:n,rows:8,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed font-mono`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`file`:return m((0,L.jsx)(`input`,{id:c,type:`file`,disabled:n,multiple:o.multiple,accept:o.accept?.join(`,`),className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`image`:return m((0,L.jsx)(`input`,{id:c,type:`file`,disabled:n,multiple:o.multiple,accept:o.accept?.join(`,`)||`image/*`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`location`:return m((0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(`input`,{id:`${c}-lat`,type:`number`,placeholder:`Latitude`,disabled:n,step:`any`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(`${c}.lat`,{required:e.required?`Latitude is required`:!1,valueAsNumber:!0})}),(0,L.jsx)(`input`,{id:`${c}-lng`,type:`number`,placeholder:`Longitude`,disabled:n,step:`any`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(`${c}.lng`,{required:e.required?`Longitude is required`:!1,valueAsNumber:!0})})]}));case`lookup`:case`master_detail`:return m((0,L.jsxs)(`select`,{id:c,disabled:n,multiple:o.multiple,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,setValueAs:p}),children:[!o.multiple&&(0,L.jsx)(`option`,{value:``,children:d||a(`common.selectOption`)}),o.options?.map(e=>(0,L.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]}));case`user`:case`owner`:return m((0,L.jsxs)(`select`,{id:c,disabled:n,multiple:o.multiple,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,setValueAs:p}),children:[!o.multiple&&(0,L.jsx)(`option`,{value:``,children:d||`Select user`}),o.options?.map(e=>(0,L.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]}));case`formula`:case`summary`:case`auto_number`:return m((0,L.jsx)(`input`,{id:c,type:`text`,disabled:!0,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-gray-50 cursor-not-allowed text-gray-600`,...r(c)}));case`object`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d||`Enter JSON object...`,disabled:n,rows:6,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed font-mono text-sm`,...r(c,{required:e.required?`${u||c} is required`:!1,validate:e=>{if(!e)return!0;try{return JSON.parse(e),!0}catch{return`Invalid JSON format`}}})}));case`vector`:return m((0,L.jsx)(`input`,{id:c,type:`text`,placeholder:d||`Vector data (read-only)`,disabled:!0,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-gray-50 cursor-not-allowed text-gray-600`,...r(c)}));case`grid`:return m((0,L.jsx)(`div`,{className:`w-full px-3 py-2 border border-gray-300 rounded-md bg-gray-50 text-gray-600`,children:(0,L.jsx)(`p`,{className:`text-sm`,children:`Grid editor not yet implemented`})}));default:return m((0,L.jsx)(`input`,{id:c,type:`text`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}))}};ui.displayName=`FieldFactory`;var di=({schema:e,data:t={},onSubmit:n,onChange:r,className:i=``,disabled:a=!1})=>{let o=qr({defaultValues:t,mode:`onChange`}),{handleSubmit:s,watch:c}=o;I.useEffect(()=>{if(r){let e=c(e=>{r(e)});return()=>e.unsubscribe()}},[c,r]);let l=s(async e=>{n&&await n(e)}),u=()=>!e.sections||e.sections.length===0?null:(0,L.jsx)(`div`,{className:`space-y-6`,children:e.sections.map((e,t)=>(0,L.jsx)(hi,{section:e,methods:o,disabled:a},t))});return(0,L.jsx)($n,{...o,children:(0,L.jsxs)(`form`,{onSubmit:l,className:`space-y-6 ${i}`,children:[u(),(0,L.jsx)(`div`,{className:`flex justify-end gap-2`,children:(0,L.jsx)(`button`,{type:`submit`,disabled:a,className:`px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed`,children:`Submit`})})]})})},fi={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-3`,4:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`},pi={1:`col-span-1`,2:`col-span-2`,3:`col-span-3`,4:`col-span-4`};function mi(e,t){if(e.hidden)return!1;if(e.visibleOn)try{return new D({data:t,form:t}).evaluateCondition(e.visibleOn)}catch{return!0}if(e.dependsOn){let n=t[e.dependsOn];return n!=null&&n!==``}return!0}var hi=({section:e,methods:t,disabled:n=!1})=>{let[r,i]=I.useState(e.collapsed||!1),a=fi[e.columns||1],o=I.useMemo(()=>e.fields.some(e=>typeof e==`string`?!1:!!e.dependsOn||!!e.visibleOn),[e.fields]),s=t.watch(),c=o?s:void 0;return(0,L.jsxs)(`div`,{className:`border rounded-lg p-4`,children:[e.label&&(0,L.jsxs)(`div`,{className:`flex items-center justify-between mb-4 ${e.collapsible?`cursor-pointer`:``}`,onClick:()=>{e.collapsible&&i(!r)},children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold`,children:ot(e.label)}),e.collapsible&&(0,L.jsx)(`span`,{className:`text-sm text-gray-500`,children:r?`▶`:`▼`})]}),!r&&(0,L.jsx)(`div`,{className:`grid ${a} gap-4`,children:e.fields.map((r,i)=>{let a=typeof r==`string`?r:r.field,o=typeof r==`string`?{field:a}:r;if(!mi(o,c||{}))return null;let s=o.colSpan||1,l=pi[Math.min(s,e.columns||1)];return(0,L.jsx)(`div`,{className:l,children:(0,L.jsx)(ui,{field:o,methods:t,disabled:n||o.readonly})},`${a}-${i}`)})})]})};di.displayName=`FormRenderer`;export{Je as $,Zt as A,ht as B,on as C,l as Ct,Jt as D,en as E,Ut as F,it as G,pt as H,Lt as I,Qe as J,at as K,wt as L,qt as M,Gt as N,Xt as O,Kt as P,Ye as Q,yt as R,dn as S,_ as St,rn as T,ot as U,mt as V,nt as W,$e as X,et as Y,Xe as Z,bn as _,A as _t,$r as a,ze as at,hn as b,y as bt,Xn as c,Le as ct,Qn as d,ge as dt,qe as et,En as f,de as ft,pn as g,se as gt,wn as h,oe as ht,oi as i,Ue as it,Qt as j,Yt as k,$n as l,Te as lt,Cn as m,le as mt,ci as n,Ke as nt,Yr as o,Ie as ot,Dn as p,ue as pt,Ze as q,ai as r,We as rt,Jr as s,Re as st,si as t,Ge as tt,qr as u,xe as ut,mn as v,D as vt,sn as w,un as x,v as xt,xn as y,ne as yt,vt as z};
|
|
34
|
+
سيتم إزالة المانيفست المخزن مؤقتاً.`,successInList:`تم إزالة {{manifestId}}. أعد تشغيل الوقت التشغيل لتفريغه بالكامل.`,successInDetail:`تم إزالة المانيفست المخزن مؤقتاً لـ {{manifestId}}.`},accessDenied:{title:`سوق التطبيقات للمشرفين فقط`,description:`ليس لديك إذن لتثبيت التطبيقات في هذه البيئة.`},category:{crm:`CRM`,erp:`ERP`,hr:`الموارد البشرية`,finance:`المالية`,project:`إدارة المشاريع`,collaboration:`التعاون`,analytics:`التحليلات`,integration:`التكامل`,automation:`الأتمتة`,ai:`الذكاء الاصطناعي`,security:`الأمان`,"developer-tools":`أدوات المطور`,"ui-theme":`سمة واجهة المستخدم`,storage:`التخزين`,other:`أخرى`},pricing:{free:`مجاني`,freemium:`مجاني جزئياً`,paid:`مدفوع`,subscription:`اشتراك`,"usage-based":`حسب الاستخدام`,"contact-sales":`تواصل مع المبيعات`},relativeTime:{today:`اليوم`,daysAgo:`منذ {{count}} ي`,monthsAgo:`منذ {{count}} شهر(أشهر)`,yearsAgo:`منذ {{count}} سنة(سنوات)`}},approvalsInbox:{loadMore:`تحميل المزيد`,loadingMore:`جارٍ التحميل…`,loadedOf:`تم تحميل {{loaded}} من {{total}}`,actEscalate:`تصعيد SLA`,systemSlaActor:`النظام (SLA)`,reassignBtn:`إعادة إسناد`,reassignTitle:`تسليم هذه الموافقة لشخص آخر؟`,reassignBody:`ينتقل مقعدك كموافق إلى الشخص المختار — يتم إخطاره ويمكنه التصرف فورًا.`,reassignTo:`الموافق الجديد`,reassignToPlaceholder:`اختر مستخدمًا أو اكتب بريدًا / role:<الاسم>`,reassignSuccess:`تم التسليم إلى {{to}}`,requestInfoBtn:`طلب معلومات`,requestInfoTitle:`طلب مزيد من المعلومات من مقدم الطلب؟`,requestInfoBody:`يبقى الطلب قيد الانتظار؛ يُخطر مقدم الطلب ويمكنه الرد في السلسلة.`,requestInfoPlaceholder:`ماذا تحتاج من مقدم الطلب؟`,requestInfoSent:`أُعيد إلى مقدم الطلب لاستكمال المعلومات`,remindBtn:`تذكير`,remindSuccess:`أُرسل تذكير إلى {{count}} موافق`,remindThrottled:`أُرسل تذكير مؤخرًا — حاول لاحقًا.`,replyPlaceholder:`الرد على هذا الطلب…`,slaRemaining:`SLA المتبقي {{dur}}`,slaOverdue:`SLA متأخر {{dur}}`,actReassign:`إعادة إسناد`,actRemind:`تذكير`,actRequestInfo:`طلب معلومات`,actComment:`تعليق`,stepProgress:`خطوات الموافقة`,prevRequest:`السابق`,nextRequest:`التالي`,positionOf:`{{index}} من {{total}}`,quickPhrase1:`موافق — مستوفٍ للمتطلبات.`,quickPhrase2:`موافقة مشروطة — يرجى متابعة التنفيذ.`,quickPhrase3:`يرجى إضافة مستندات داعمة وإعادة التقديم.`,title:`مركز الموافقات`,subtitle:`راجع طلبات الموافقة وتعامل معها.`,refresh:`تحديث`,tabMyPending:`بانتظار موافقتي`,tabSubmitted:`المقدمة مني`,tabAll:`الكل`,searchPlaceholder:`ابحث عن سجل أو عملية أو مقدم طلب…`,clearSearch:`مسح البحث`,statusFilter:`الحالة`,allStatuses:`كل الحالات`,processFilter:`العملية`,allProcesses:`كل العمليات`,objectFilter:`الكائن`,allObjects:`كل الكائنات`,filterCount:`{{shown}} من {{total}}`,selected:`محدد`,actionableCount:`({{count}} قابلة للتنفيذ)`,selectAll:`تحديد الكل`,selectRow:`تحديد الطلب`,colRequest:`الطلب`,colRecord:`السجل`,colRequester:`مقدم الطلب`,colStatus:`الحالة`,colWaiting:`تاريخ التقديم`,colActions:`إجراءات`,statusPending:`قيد الانتظار`,statusApproved:`تمت الموافقة`,statusRejected:`مرفوض`,statusRecalled:`مسحوب`,statusReturned:`أُعيد للمراجعة`,sendBackBtn:`إعادة للمراجعة`,sendBackTitle:`إعادة هذا الطلب للمراجعة؟`,sendBackBody:`تنتهي هذه الجولة ويُفتح قفل السجل ليتمكن مقدم الطلب من تصحيح البيانات. عند إعادة الإرسال تبدأ جولة موافقة جديدة لجميع الموافقين.`,sendBackPlaceholder:`ما الذي يجب تصحيحه قبل الموافقة؟`,sendBackSuccess:`أُعيد للمراجعة — يمكن لمقدم الطلب الآن التعديل وإعادة الإرسال`,sendBackAutoRejected:`تم بلوغ حد المراجعات — رُفض الطلب تلقائيًا`,actRevise:`أُعيد للمراجعة`,actResubmit:`أُعيد الإرسال`,roundChip:`الجولة {{n}}`,returnedHint:`أعاد أحد الموافقين هذا الطلب إليك. السجل غير مقفل — صحّح البيانات ثم أعد الإرسال لبدء جولة موافقة جديدة.`,resubmitBtn:`إعادة الإرسال`,resubmitting:`جارٍ إعادة الإرسال…`,resubmitSuccess:`أُعيد الإرسال — بدأت جولة موافقة جديدة`,resubmitPlaceholder:`ما الذي غيّرته؟`,editRecordBtn:`تحرير السجل`,abandonTitle:`التخلي عن هذه المراجعة؟`,abandonBody:`يُسحب الطلب بدلاً من إعادة إرساله. تنتهي الموافقة هنا.`,emptyTitle:`لا توجد طلبات`,emptyPending:`كل شيء منجز — لا يوجد ما ينتظر موافقتك.`,emptyOther:`لا يوجد شيء هنا بعد.`,emptyViewAll:`عرض كل الطلبات`,noMatches:`لا نتائج مطابقة للمرشحات الحالية.`,keyboardHint:`لوحة المفاتيح: j/k تنقل · Enter فتح · x تحديد · a موافقة · r رفض`,drawerTitle:`طلب موافقة`,submittedAgo:`قُدِّم {{when}}`,completedAt:`اكتمل {{when}}`,waitingOn:`بانتظار`,history:`النشاط`,noActions:`لا إجراءات بعد.`,actSubmit:`تقديم`,actApprove:`موافقة`,actReject:`رفض`,actRecall:`سحب`,rawData:`البيانات الخام (JSON)`,copy:`نسخ`,copied:`تم النسخ`,copyFailed:`فشل النسخ`,overrideActor:`التصرف بهوية أخرى (مسؤول)`,actor:`الهوية`,auto:`تلقائي`,overrideHint:`مثال: role:sales_manager. اتركه فارغًا لاستخدام الهوية المكتشفة تلقائيًا.`,comment:`تعليق (اختياري)`,approve:`موافقة`,approving:`جارٍ الموافقة…`,reject:`رفض`,rejecting:`جارٍ الرفض…`,recall:`سحب`,recalling:`جارٍ السحب…`,cancel:`إلغاء`,clear:`مسح`,approveN:`الموافقة على {{count}}`,rejectN:`رفض {{count}}`,bulkApproveTitle:`الموافقة على {{count}} طلبات؟`,bulkApproveBody:`ستتم الموافقة على كل طلب بهويتك ويتابع التدفق عبر فرع الموافقة.`,bulkRejectTitle:`رفض {{count}} طلبات؟`,bulkRejectBody:`سيتم رفض الطلبات المحددة وإخطار مقدميها.`,bulkApproved:`تمت الموافقة على {{count}} طلبات`,bulkRejected:`تم رفض {{count}} طلبات`,bulkPartial:`نجح {{ok}}، فشل {{fail}}: {{which}}`,rejectOneTitle:`رفض "{{title}}"؟`,rejectOneBody:`سيتم رفض الطلب وإخطار مقدمه.`,rejectTitle:`رفض هذا الطلب؟`,rejectBody:`سيتم وضع علامة مرفوض على الطلب وإخطار مقدمه.`,recallTitle:`سحب هذا الطلب؟`,recallBody:`بعد السحب لن يتمكن الموافقون من التصرف، وسيتم فك قفل السجل.`,inlineApproved:`تمت الموافقة على "{{title}}"`,inlineRejected:`تم رفض "{{title}}"`,approvedFinal:`تمت الموافقة`,approvedWaiting:`تمت الموافقة — بانتظار بقية الموافقين`,rejectedToast:`تم الرفض`,recalledToast:`تم سحب الطلب`,whyDisabled:`لا يمكن التصرف إلا للموافقين المعينين. بانتظار: {{who}}.`,whyDisabledSubmitter:`أنت قدمت هذا الطلب لذا يمكنك سحبه — لكن الموافقة أو الرفض للموافقين المعينين فقط.`,noActor:`تعذر تحديد هوية التنفيذ`,actionFailed:`فشل الإجراء`,loadFailed:`فشل تحميل الطلب`,recallUnavailable:`السحب غير متاح في هذا النشر.`,requestGone:`لم يعد هذا الطلب موجودًا. حدّث القائمة.`,notAllowed:`ليست لديك صلاحية لهذا الإجراء.`,alreadyDecided:`تم البت في هذا الطلب بالفعل. حدّث القائمة.`,justNow:`الآن`,minutesAgo:`قبل {{count}} دقيقة`,hoursAgo:`قبل {{count}} ساعة`,daysAgo:`قبل {{count}} يوم`},preview:{empty:{loadFailedTitle:`تعذّر تحميل معاينة المسودة`,loadFailedDescription:`تعذّرت قراءة طبقة المسودة. أعد المحاولة أو تحقق من الاتصال.`,notReadyTitle:`"{{app}}" ليس في المسودة بعد`,notReadyDescription:`قد يكون البناء قيد التشغيل، أو فشل قبل تجهيز هذا التطبيق. تحقق من حالة البناء في المحادثة — تتحدث هذه اللوحة عند وصول المسودات.`,nothingTitle:`لا شيء للمعاينة بعد`,retry:`إعادة المحاولة`},draftBar:{message:`معاينة المسودة — أنت ترى تغييرات غير منشورة. لن يصبح أي شيء فعليًا حتى تنشر.`,publish:`نشر`,publishing:`جارٍ النشر…`,exit:`إنهاء المعاينة`,changes:`التغييرات`},changes:{title:`التغييرات المعلّقة`,description:`ما الذي سيغيّره النشر. تُضاف العناصر الجديدة؛ وتستبدل التحديثات النسخة المنشورة.`,loading:`جارٍ تحميل التغييرات المعلّقة…`,loadFailed:`تعذّر تحميل التغييرات المعلّقة:`,empty:`لا شيء معلّق — نُشرت كل المسودات.`,kindNew:`جديد`,kindUpdate:`تحديث`}},filterBuilder:{where:`حيث`,and:`و`,or:`أو`,clearAll:`مسح الكل`,selectField:`اختر الحقل`,operator:`العامل`,selectValue:`اختر القيمة`,value:`القيمة`,addFilter:`إضافة عامل تصفية`,removeCondition:`إزالة الشرط`,trueLabel:`نعم`,falseLabel:`لا`,noResults:`لا توجد نتائج`,searchField:`بحث {{label}}…`,enterId:`أدخل معرّف {{label}}`,operators:{equals:`يساوي`,notEquals:`لا يساوي`,contains:`يحتوي`,notContains:`لا يحتوي`,isEmpty:`فارغ`,isNotEmpty:`غير فارغ`,greaterThan:`أكبر من`,lessThan:`أصغر من`,greaterOrEqual:`أكبر من أو يساوي`,lessOrEqual:`أصغر من أو يساوي`,before:`قبل`,after:`بعد`,between:`بين`,in:`ضمن`,notIn:`ليس ضمن`}},sortBuilder:{sortBy:`ترتيب حسب`,thenBy:`ثم حسب`,selectField:`اختر الحقل`,ascending:`A → Z`,descending:`Z → A`,addSort:`إضافة ترتيب`,removeSort:`إزالة الترتيب`}}},Qr=[`ar`,`he`,`fa`,`ur`];function $r(e){return Qr.includes(e)}var ei=`__ouiLabelProbe`;function ti(){return typeof process>`u`||!1}function ni(){let e=new Set;return(t,n,r,i,a,o)=>{if(o&&o.__ouiLabelProbe)return;let s=Array.isArray(t)?t[0]:String(t??``),c=`${s}:${r}`;if(e.has(c))return;e.add(c);let l=i?`"${i}"`:`the key itself`;console.warn(`[object-ui i18n] Missing translation for "${r}" (language "${s}") — falling back to ${l}.`)}}function ri(e={}){let{defaultLanguage:t=`en`,fallbackLanguage:n=`en`,resources:r={},detectBrowserLanguage:i=!0,interpolation:o,warnMissingKeys:c=ti()}=e,l={};for(let[e,t]of Object.entries(Zr))l[e]={translation:{...t,...r[e]||{}}};for(let[e,t]of Object.entries(r))l[e]||(l[e]={translation:t});let u=t;if(i&&typeof navigator<`u`){let e=navigator.language?.split(`-`)[0];e&&l[e]&&(u=e)}let d=a.createInstance();return d.use(s).init({lng:u,fallbackLng:n,resources:l,interpolation:{escapeValue:!1,...o},returnNull:!1,saveMissing:c,missingKeyHandler:c?ni():void 0,react:{useSuspense:!1}}),d}function ii(e){return $r(e)?`rtl`:`ltr`}var ai=(0,I.createContext)(null);function oi({config:e,instance:t,loadLanguage:n,children:r}){let i=(0,I.useMemo)(()=>t||ri(e),[t,e]),[a,o]=(0,I.useState)(i.language||`en`),s=ii(a),l=(0,I.useRef)(new Set);(0,I.useEffect)(()=>{let e=e=>{o(e),typeof document<`u`&&(document.documentElement.dir=ii(e),document.documentElement.lang=e)},t=i.language||a;return typeof document<`u`&&t&&(document.documentElement.dir=ii(t),document.documentElement.lang=t),i.on(`languageChanged`,e),()=>{i.off(`languageChanged`,e)}},[i]),(0,I.useEffect)(()=>{if(!n)return;let e=i.language||`en`;l.current.has(e)||(l.current.add(e),n(e).then(t=>{t&&Object.keys(t).length>0&&(i.addResourceBundle(e,`translation`,t,!0,!0),o(e))}).catch(t=>{l.current.delete(e),console.warn(`[i18n] Failed to load app translations for '${e}':`,t)}))},[i,n]);let u=(0,I.useMemo)(()=>({language:a,changeLanguage:async e=>{if(n&&!l.current.has(e)){l.current.add(e);try{let t=await n(e);i.addResourceBundle(e,`translation`,t,!0,!0)}catch(t){l.current.delete(e),console.warn(`[i18n] Failed to load app translations for '${e}':`,t)}}await i.changeLanguage(e)},direction:s,i18n:i}),[a,s,i,n]);return I.createElement(ai.Provider,{value:u},I.createElement(c,{i18n:i},r))}function si(e){let t=(0,I.useContext)(ai),{t:n,i18n:r}=o(e);return{t:n,language:t?.language||r.language||`en`,changeLanguage:t?.changeLanguage||(async e=>{await r.changeLanguage(e)}),direction:t?.direction||`ltr`,i18n:r}}function ci(e,t){return function(){try{let n=si();return n.t(t)===t?{t:(t,n)=>{let r=e[t]||t;if(n)for(let[e,t]of Object.entries(n))r=r.replace(`{{${e}}}`,String(t));return r}}:{t:n.t}}catch{return{t:(t,n)=>{let r=e[t]||t;if(n)for(let[e,t]of Object.entries(n))r=r.replace(`{{${e}}}`,String(t));return r}}}}}function li(){let e;try{e=si().t}catch{e=void 0}return(t,n)=>{if(!e)return n;let r=Array.isArray(t)?t:[t];for(let t of r){let n=e(t);if(n&&n!==t)return n}return n}}var ui=ci({"common.selectOption":`Select an option`},`common.selectOption`),di=({field:e,methods:t,disabled:n=!1})=>{let{register:r,formState:{errors:i}}=t,{t:a}=ui(),o=e,s=e.widget||`text`,c=e.field,l=i[c],u=st(e.label),d=st(e.placeholder),f=st(e.helpText),p=e=>o.multiple&&e instanceof HTMLCollection?Array.from(e).map(e=>e.value):e;if(e.hidden)return null;let m=t=>(0,L.jsxs)(`div`,{className:`space-y-2`,children:[u&&(0,L.jsxs)(`label`,{htmlFor:c,className:`block text-sm font-medium text-gray-700`,children:[u,e.required&&(0,L.jsx)(`span`,{className:`text-red-500 ml-1`,children:`*`})]}),t,f&&(0,L.jsx)(`p`,{className:`text-sm text-gray-500`,children:f}),l&&(0,L.jsx)(`p`,{className:`text-sm text-red-600`,children:l.message})]});switch(s.toLowerCase()){case`text`:case`string`:case`email`:case`password`:case`url`:case`tel`:return m((0,L.jsx)(`input`,{id:c,type:s===`string`?`text`:s,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`number`:case`integer`:case`float`:return m((0,L.jsx)(`input`,{id:c,type:`number`,placeholder:d,disabled:n,step:s===`integer`?`1`:`any`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,valueAsNumber:!0})}));case`checkbox`:case`boolean`:return(0,L.jsxs)(`div`,{className:`flex items-start space-x-2`,children:[(0,L.jsx)(`input`,{id:c,type:`checkbox`,disabled:n,className:`mt-1 h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-2 focus:ring-blue-500 disabled:opacity-50`,...r(c)}),(0,L.jsxs)(`div`,{className:`flex-1`,children:[u&&(0,L.jsxs)(`label`,{htmlFor:c,className:`text-sm font-medium text-gray-700`,children:[u,e.required&&(0,L.jsx)(`span`,{className:`text-red-500 ml-1`,children:`*`})]}),f&&(0,L.jsx)(`p`,{className:`text-sm text-gray-500 mt-1`,children:f}),l&&(0,L.jsx)(`p`,{className:`text-sm text-red-600 mt-1`,children:l.message})]})]});case`textarea`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d,disabled:n,rows:4,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`select`:case`dropdown`:return m((0,L.jsxs)(`select`,{id:c,disabled:n,multiple:o.multiple,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,setValueAs:p}),children:[!o.multiple&&(0,L.jsx)(`option`,{value:``,children:d||a(`common.selectOption`)}),o.options?.map(e=>(0,L.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]}));case`date`:return m((0,L.jsx)(`input`,{id:c,type:`date`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`datetime`:case`datetime-local`:return m((0,L.jsx)(`input`,{id:c,type:`datetime-local`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`time`:return m((0,L.jsx)(`input`,{id:c,type:`time`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`currency`:return m((0,L.jsxs)(`div`,{className:`relative`,children:[(0,L.jsx)(`span`,{className:`absolute left-3 top-2 text-gray-500`,children:`$`}),(0,L.jsx)(`input`,{id:c,type:`number`,placeholder:d,disabled:n,step:`0.01`,className:`w-full pl-8 pr-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,valueAsNumber:!0})})]}));case`percent`:return m((0,L.jsxs)(`div`,{className:`relative`,children:[(0,L.jsx)(`input`,{id:c,type:`number`,placeholder:d,disabled:n,step:`0.01`,min:`0`,max:`100`,className:`w-full pr-8 pl-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,valueAsNumber:!0})}),(0,L.jsx)(`span`,{className:`absolute right-3 top-2 text-gray-500`,children:`%`})]}));case`phone`:return m((0,L.jsx)(`input`,{id:c,type:`tel`,placeholder:d||`+1 (555) 000-0000`,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`markdown`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d||`Enter markdown text...`,disabled:n,rows:8,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed font-mono`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`html`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d||`Enter HTML...`,disabled:n,rows:8,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed font-mono`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`file`:return m((0,L.jsx)(`input`,{id:c,type:`file`,disabled:n,multiple:o.multiple,accept:o.accept?.join(`,`),className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`image`:return m((0,L.jsx)(`input`,{id:c,type:`file`,disabled:n,multiple:o.multiple,accept:o.accept?.join(`,`)||`image/*`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100`,...r(c,{required:e.required?`${u||c} is required`:!1})}));case`location`:return m((0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(`input`,{id:`${c}-lat`,type:`number`,placeholder:`Latitude`,disabled:n,step:`any`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(`${c}.lat`,{required:e.required?`Latitude is required`:!1,valueAsNumber:!0})}),(0,L.jsx)(`input`,{id:`${c}-lng`,type:`number`,placeholder:`Longitude`,disabled:n,step:`any`,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(`${c}.lng`,{required:e.required?`Longitude is required`:!1,valueAsNumber:!0})})]}));case`lookup`:case`master_detail`:return m((0,L.jsxs)(`select`,{id:c,disabled:n,multiple:o.multiple,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,setValueAs:p}),children:[!o.multiple&&(0,L.jsx)(`option`,{value:``,children:d||a(`common.selectOption`)}),o.options?.map(e=>(0,L.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]}));case`user`:case`owner`:return m((0,L.jsxs)(`select`,{id:c,disabled:n,multiple:o.multiple,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1,setValueAs:p}),children:[!o.multiple&&(0,L.jsx)(`option`,{value:``,children:d||`Select user`}),o.options?.map(e=>(0,L.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]}));case`formula`:case`summary`:case`auto_number`:return m((0,L.jsx)(`input`,{id:c,type:`text`,disabled:!0,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-gray-50 cursor-not-allowed text-gray-600`,...r(c)}));case`object`:return m((0,L.jsx)(`textarea`,{id:c,placeholder:d||`Enter JSON object...`,disabled:n,rows:6,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed font-mono text-sm`,...r(c,{required:e.required?`${u||c} is required`:!1,validate:e=>{if(!e)return!0;try{return JSON.parse(e),!0}catch{return`Invalid JSON format`}}})}));case`vector`:return m((0,L.jsx)(`input`,{id:c,type:`text`,placeholder:d||`Vector data (read-only)`,disabled:!0,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-gray-50 cursor-not-allowed text-gray-600`,...r(c)}));case`grid`:return m((0,L.jsx)(`div`,{className:`w-full px-3 py-2 border border-gray-300 rounded-md bg-gray-50 text-gray-600`,children:(0,L.jsx)(`p`,{className:`text-sm`,children:`Grid editor not yet implemented`})}));default:return m((0,L.jsx)(`input`,{id:c,type:`text`,placeholder:d,disabled:n,className:`w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,...r(c,{required:e.required?`${u||c} is required`:!1})}))}};di.displayName=`FieldFactory`;var fi=({schema:e,data:t={},onSubmit:n,onChange:r,className:i=``,disabled:a=!1})=>{let o=Jr({defaultValues:t,mode:`onChange`}),{handleSubmit:s,watch:c}=o;I.useEffect(()=>{if(r){let e=c(e=>{r(e)});return()=>e.unsubscribe()}},[c,r]);let l=s(async e=>{n&&await n(e)}),u=()=>!e.sections||e.sections.length===0?null:(0,L.jsx)(`div`,{className:`space-y-6`,children:e.sections.map((e,t)=>(0,L.jsx)(gi,{section:e,methods:o,disabled:a},t))});return(0,L.jsx)(er,{...o,children:(0,L.jsxs)(`form`,{onSubmit:l,className:`space-y-6 ${i}`,children:[u(),(0,L.jsx)(`div`,{className:`flex justify-end gap-2`,children:(0,L.jsx)(`button`,{type:`submit`,disabled:a,className:`px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed`,children:`Submit`})})]})})},pi={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-3`,4:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`},mi={1:`col-span-1`,2:`col-span-2`,3:`col-span-3`,4:`col-span-4`};function hi(e,t){if(e.hidden)return!1;if(e.visibleOn)try{return new D({data:t,form:t}).evaluateCondition(e.visibleOn)}catch{return!0}if(e.dependsOn){let n=t[e.dependsOn];return n!=null&&n!==``}return!0}var gi=({section:e,methods:t,disabled:n=!1})=>{let[r,i]=I.useState(e.collapsed||!1),a=pi[e.columns||1],o=I.useMemo(()=>e.fields.some(e=>typeof e==`string`?!1:!!e.dependsOn||!!e.visibleOn),[e.fields]),s=t.watch(),c=o?s:void 0;return(0,L.jsxs)(`div`,{className:`border rounded-lg p-4`,children:[e.label&&(0,L.jsxs)(`div`,{className:`flex items-center justify-between mb-4 ${e.collapsible?`cursor-pointer`:``}`,onClick:()=>{e.collapsible&&i(!r)},children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold`,children:st(e.label)}),e.collapsible&&(0,L.jsx)(`span`,{className:`text-sm text-gray-500`,children:r?`▶`:`▼`})]}),!r&&(0,L.jsx)(`div`,{className:`grid ${a} gap-4`,children:e.fields.map((r,i)=>{let a=typeof r==`string`?r:r.field,o=typeof r==`string`?{field:a}:r;if(!hi(o,c||{}))return null;let s=o.colSpan||1,l=mi[Math.min(s,e.columns||1)];return(0,L.jsx)(`div`,{className:l,children:(0,L.jsx)(di,{field:o,methods:t,disabled:n||o.readonly})},`${a}-${i}`)})})]})};fi.displayName=`FormRenderer`;export{Ye as $,Qt as A,gt as B,sn as C,_ as Ct,Yt as D,tn as E,Wt as F,at as G,mt as H,Rt as I,$e as J,ot as K,Tt as L,Jt as M,Kt as N,Zt as O,qt as P,Xe as Q,bt as R,fn as S,v as St,an as T,st as U,ht as V,rt as W,et as X,tt as Y,Ze as Z,xn as _,se as _t,ei as a,Ue as at,gn as b,ne as bt,Zn as c,Re as ct,$n as d,xe as dt,Je as et,Dn as f,ge as ft,mn as g,oe as gt,Tn as h,le as ht,si as i,We as it,$t as j,Xt as k,er as l,Le as lt,wn as m,ue as mt,li as n,Ge as nt,Xr as o,ze as ot,On as p,de as pt,Qe as q,oi as r,Ke as rt,Yr as s,Ie as st,ci as t,qe as tt,Jr as u,Te as ut,hn as v,A as vt,cn as w,l as wt,dn as x,y as xt,Sn as y,D as yt,yt as z};
|