<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	targetNamespace="https://tnventures.fi/modelgenerator/xmlschemas/viewmodel/v1"
    xmlns="https://tnventures.fi/modelgenerator/xmlschemas/viewmodel/v1"
	elementFormDefault="qualified">

	<!-- ============================================================================
	     File structure:
	       1. Root <ViewModel> element (directly below) — the outline of the whole
	          tree, wired together with `type="XxxType"` references. Read this first
	          to understand the shape of a ViewModel XML.
	       2. Named complexTypes follow below. Each describes one element's shape
	          and carries its own <xs:documentation> block. To add or rename an
	          attribute, edit the named complexType — not the root outline.

	     Key types:
	       ViewModelPropertyType       — a VM property (analog of Model's Property).
	       ViewModelPropertyViewType   — per-view layout/label/help for a VM property.
	       ViewModelPropertyGroupType  — groups VM properties with shared defaults.
	       ViewModelCommandType        — a VM command (button/action).
	       CommandParameterType        — a typed parameter of a VM command.
	       ViewModelViewType           — a generated view bound to this VM.
	       EnumerationType             — shared enum type.
	       VmEnumerationItemType       — item inside a VM-local Enumeration.
	       ReferencedModelType         — file-path pointer to another Model XML.
	       ReferencedEnumerationType   — file-path pointer to an external enumeration.

	     ==========================================================================
	     colSpan inheritance chain
	     ==========================================================================
	     colSpan can be set on four tiers. Resolution is MOST-SPECIFIC WINS:

	         ViewModelPropertyView.colSpan     (1) highest — wins if set
	         (ViewModel Property)              (2) — no colSpan attribute at this tier
	         ViewModelPropertyGroup.colSpan    (3) — group-level default for contained Properties
	         ViewModelView.colSpan             (4) lowest — view-wide fallback when none of above set

	     If none of the tiers sets colSpan, the property spans 1 column.
	     Same chain applies to Model XMLs (PropertyView > Property > PropertyGroup > ModelView).

	     ==========================================================================
	     Wizard step navigation flags (on ViewModelPropertyGroup when mode=Wizard)
	     ==========================================================================
	     For a group that defines a wizard step (`step` + `stepOrder` attributes):

	         stepNext           — ALWAYS enabled by default; no attribute to disable it.
	         stepBackEnabled    — Back button (navigate to previous step).
	         wizardCancelEnabled  — Cancel button (abort the wizard).
	         wizardFinishEnabled  — Finish button: COMPLETES the wizard FROM this step,
	                              SKIPPING any remaining steps. Typically set on the
	                              final optional step(s) at the end of a wizard.
	         wizardExecute  — Execute the wizard's main action after this step
	                              completes (typically the second-to-last step when
	                              the last step is a summary).
	     ============================================================================ -->

	<!-- Root Element -->
	<xs:element name="ViewModel">
		<xs:complexType>
			<xs:all>
				<xs:element name="Comment" type="xs:string" minOccurs="0"/>
				<xs:element name="Properties" minOccurs="0">
					<xs:complexType>
						<xs:choice maxOccurs="unbounded">
							<xs:element name="Property" type="ViewModelPropertyType" maxOccurs="unbounded"></xs:element>
							<xs:element name="PropertyGroup" type="ViewModelPropertyGroupType" maxOccurs="unbounded"></xs:element>
						</xs:choice>
					</xs:complexType>
				</xs:element>
				<xs:element name="Commands" minOccurs="0">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Command" type="ViewModelCommandType" maxOccurs="unbounded"/>

						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="ReferencedModels" minOccurs="0">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="ReferencedModel" type="ReferencedModelType" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="ReferencedEnumerations" minOccurs="0">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="ReferencedEnumeration" type="ReferencedEnumerationType" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="Enumerations" minOccurs="0">
					<xs:complexType>
						<xs:sequence>

							<xs:element name="Enumeration" maxOccurs="unbounded" type="EnumerationType"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>


				<xs:element name="Views" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="View" type="ViewModelViewType" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>

			</xs:all>

			<xs:attribute name="name" type="xs:string" use="required">
				<xs:annotation>
					<xs:documentation>Required. The name of the ViewModel. This will be used as the ViewModel class name in generated code.</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="mode" use="required">
				<xs:annotation>
					<xs:documentation>Required. The mode of the ViewModel. Determines the base class and behavior: Page (inherits BasePageViewModel), Wizard (inherits BaseWizardViewModel with multi-step navigation), Dialog (inherits BaseDialogViewModel for modal interactions).</xs:documentation>
				</xs:annotation>
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:enumeration value="Page"/>
						<xs:enumeration value="Wizard"/>
						<xs:enumeration value="Dialog"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:attribute>
			<xs:attribute name="namespace" type="xs:string">
				<xs:annotation>
					<xs:documentation>Optional. The namespace for the ViewModel — defines the namespace for the generated VM code. Only the C# / WPF generator consumes this; React/TypeScript generation ignores it (TS modules use file paths). Leave empty for React-only ViewModels.</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="inherits" type="xs:string">
				<xs:annotation>
					<xs:documentation>Optional. The base class that the ViewModel inherits from. If not specified, defaults based on mode (BasePageViewModel, BaseWizardViewModel, or BaseDialogViewModel).</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="implements" type="xs:string">
				<xs:annotation>
					<xs:documentation>Optional. Comma-separated list of interfaces that the ViewModel implements.</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="partial" type="xs:boolean" default="false">
				<xs:annotation>
					<xs:documentation>Optional. Indicates whether the ViewModel class should be generated as a partial class, allowing for additional manual implementation. Default is false.</xs:documentation>
				</xs:annotation>
			</xs:attribute>

			<xs:attribute name="documentation" type="xs:string">
				<xs:annotation>
					<xs:documentation>Optional. Summary documentation for the ViewModel. This will be included in generated code documentation.</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="documentationRemarks" type="xs:string">
				<xs:annotation>
					<xs:documentation>Optional. Additional remarks for the ViewModel documentation. This will be included in generated code documentation as remarks section.</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="customUserRight" type="xs:string">
				<xs:annotation>
					<xs:documentation>Optional override for the user-right bucket every command on this ViewModel resolves against. Three meanings: (1) unset → bucket = the ViewModel name with leading "Base" + trailing "ViewModel" stripped (the default). (2) "None" → the `&amp;&amp; UserContext.hasUserRight(...)` clause is OMITTED from every canExecute getter on this VM; use for anonymous / sign-up flows where every step runs before the user has earned any rights (the auth-method step IS the rights-grant point). (3) any other value → bucket = that value (e.g. `customUserRight="ProductEditing"` shares a bucket across multiple VMs). A per-`&lt;Command&gt;` `customUserRight` still wins over this VM-level setting.</xs:documentation>
				</xs:annotation>
			</xs:attribute>
			<xs:attribute name="finalizeProcess" type="xs:string">
				<xs:annotation>
					<xs:documentation>Wizard-only. Fully-qualified Process class name (e.g. `TestApp.Processes.InsertCustomerProcess`) that the backend runs on the Active→Completed transition fired by POST /wizards/{sessionId}/finalize. Resolved at runtime through `WizardFinalizeRegistry` — the app's startup binds the wizard name (this ViewModel's name without the trailing "ViewModel") to a callable that invokes the named Process, and the generated controller substitutes the Process result for the bare consolidated step payload as the /finalize response body. Optional: when absent, /finalize returns the bare consolidated `{step: data}` dict and the SPA can call follow-up service methods itself. Ignored (with a build-time warning) when `mode` is not `Wizard`. The Process MUST be idempotent — the connector's finalize is idempotent across retry-after-network-glitch and Phase 4a invokes the Process on every call (use the wizard's `sessionId` as the Process run_key when crash-resilience matters).</xs:documentation>
				</xs:annotation>
			</xs:attribute>
		</xs:complexType>
	</xs:element>

	<xs:complexType name="ViewModelPropertyType">
		<xs:annotation>
			<xs:documentation>A property (field) on a standalone ViewModel. Describes the data (type / enum / mandatory) and nests ViewModelPropertyView children for per-view presentation.</xs:documentation>
		</xs:annotation>


		<xs:sequence>
			<!-- PropertyView mirrors ModelSchema.PropertyType — direct child of Property,
			     0..N entries, one per <View> the VM declares. The previous wrapper
			     <ViewTypes><ViewType .../></ViewTypes> never matched the XML reader
			     (which always looked for `PropertyView` to stay consistent with the
			     model side), so any view-specific overrides nested under that wrapper
			     were silently dropped at parse time. -->
			<xs:element name="PropertyView" type="ViewModelPropertyViewType" minOccurs="0" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>Per-view presentation overrides for this property (label / layout / input type / instruction / tooltip / colSpan / etc.). Use one PropertyView per View the VM declares.</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" use="required">
			<xs:annotation>
				<xs:documentation>Required. The name of the ViewModel property. This will be used as the property name in generated code. For ModelReference properties, the name will automatically have "Key" suffix appended if not present.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="type">
			<xs:annotation>
				<xs:documentation>Required. The data type of the ViewModel property. Supported types include primitive types (String, Int, Decimal, Bool, Id, DateTime, Date), Enum (requires `enum`), Model (requires `model`; set `collection="List"` for a collection of models), and File.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="String"/>
					<xs:enumeration value="Int"/>
					<xs:enumeration value="Decimal"/>
					<xs:enumeration value="Bool"/>
					<xs:enumeration value="Id"/>
					<xs:enumeration value="DateTime"/>
					<xs:enumeration value="Date"/>
					<xs:enumeration value="Enum"/>
					<xs:enumeration value="File"/>
					<xs:enumeration value="Model"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="enum" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Required if type is Enum. Specifies the name of the enumeration type. The enumeration can be defined in the ViewModel's Enumerations section or referenced from a model.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="model" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Required if type is Model. Specifies the name of the referenced model type. For a collection, keep type="Model" and add `collection="List"`.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="phase" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Optional. Deprecated attribute. Use step attribute instead. Describes the phase where data is collected from the user.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="label" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Optional. Display name of the field. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="controlled" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. REACT ONLY. When true, the generated React ViewModel emits an `on[Property]ChangedBase(oldValue)` wrapper that calls the derived-class `on[Property]Changed(oldValue)` hook. The hook fires AFTER updateField writes the new value, with the previous value passed in. Use for side-effects tied to property changes. NOTE: WPF emits plain `On[Property]Changed()` (no oldValue parameter) for EVERY property regardless of this flag; the attribute is a no-op on WPF. Default false.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="section" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Optional. Defines the section heading under which this property is grouped in the view. Properties with the same section are displayed together.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="validation">
			<xs:annotation>
				<xs:documentation>Optional. Specifies the validation rule for the property. Built-in rules (`Email`, `Phone`, `Zip`, `BankAccount`, `Ssn`, `Bic`, `SsnOrBic`, `CreditCard`, `Range`, `ValueList`, `IsTrue`, `Regex`) emit the corresponding check inline. `Custom` emits a CALL to a `validate[PropertyName]Custom()` hook that YOU must provide on the derived ViewModel; it should return `null` on success or an error message string. The generator does NOT emit the hook method itself.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Range"/>
					<xs:enumeration value="ValueList"/>
					<xs:enumeration value="IsTrue"/>
					<xs:enumeration value="Regex"/>
					<xs:enumeration value="Email"/>
					<xs:enumeration value="Zip"/>
					<xs:enumeration value="BankAccount"/>
					<xs:enumeration value="Phone"/>
					<xs:enumeration value="Ssn"/>
					<xs:enumeration value="Bic"/>
					<xs:enumeration value="SsnOrBic"/>
					<xs:enumeration value="CreditCard"/>
					<xs:enumeration value="Custom"/>
				</xs:restriction>
			</xs:simpleType>

		</xs:attribute>
		<xs:attribute name="validationContext" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specifies validation context for the property. Typically country code like FI that defines detailed validation logic. Give model property where context is read with syntax: {propertyName}. Typically f.ex {CountryCode}.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="validationMessage" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specifies validation message when validation fails. Use {FieldName}, {MinValue}, {MaxValue}, {ValueList}, {Context} tags if needed. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="validationMinValue" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specifies min value for validation rule. Decimal format. Required if validation is Range.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="validationMaxValue" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specifies max value for validation rule. Decimal format. Required if validation is Range.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="validationValueList" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Allowed options for validation. Comma separated list. Required if validation is ValueList.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="validationCondition" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specify condition when validation check is valid. Use native language syntax.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="required" type="xs:boolean">
			<xs:annotation>
				<xs:documentation>Optional. Specifies if field is required.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="requiredMessage" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specifies error message when required check fails. Use {FieldName} tag if needed. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="requiredCondition" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Specify condition when required check is valid. Use native language syntax.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="readOnly" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates whether the property is read-only and cannot be edited in the view. Default is false.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="default" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Default value to initialize for the property when creating a new instance.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="collection">
			<xs:annotation>
				<xs:documentation>Optional. Specifies the type of collection when the property represents a collection. Currently only `List` is supported.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="List"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="textType">
			<xs:annotation>
				<xs:documentation>Optional. Specifies the type of text field. Valid only for type String.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Text"/>
					<xs:enumeration value="Email"/>
					<xs:enumeration value="Password"/>
					<xs:enumeration value="Numeric"/>
					<xs:enumeration value="DateTime"/>
					<xs:enumeration value="Other"/>
					<xs:enumeration value="None"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="mandatory" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates whether the property is mandatory (not nullable). Default is false. If required attribute is not specified, its value defaults to mandatory.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="internal" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates whether the property is only used internally within the ViewModel and should not be displayed or edited by the user. Default is false.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="style" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. CSS class name or style identifier for the property. Used as className (React), style (Xaml), or style (React Native) in generated views.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="instruction" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text appearing below component. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="popover" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text appearing in help box next to label. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="tooltip" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text appearing in tooltip. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="placeholder" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Placheholder text for text inputs. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="documentation" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Documentation comments for the property. This will be included in generated code documentation.</xs:documentation>
			</xs:annotation>
		</xs:attribute>

		<xs:attribute name="accessLevel">
			<xs:annotation>
				<xs:documentation>Optional. Specifies the access level for the generated property. Options: public (default), protected. This attribute is deprecated and not actively used in current generation.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="public"/>
					<xs:enumeration value="protected"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>



	</xs:complexType>

	<xs:complexType name="ViewModelPropertyViewType" >
		<xs:annotation>
			<xs:documentation>Per-view presentation settings for a ViewModel property. Overrides ViewModelProperty-level defaults for one specific view (by viewName or mode).</xs:documentation>
		</xs:annotation>

		<xs:attribute name="viewName" type="xs:string" use="required">
			<xs:annotation>
				<xs:documentation>The name of the view.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="displayName" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Name of property visible in this view. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="readOnly" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Is property read only in this view. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="hidden" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Is property hidden in this view. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="labelStyle" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Style definition given for label part of control. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="controlStyle" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Style definition given for actual control (input) part of control. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="feedbackStyle" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Style definition given for feedback (error message) part of control. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="groupStyle" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Style definition given for governing group element around control. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="instruction" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text appearing below component. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="popover" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text appearing in help box next to label. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="tooltip" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text appearing in tooltip. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="placeholder" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Placheholder text for text inputs. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="lookupMode">
			<xs:annotation>
				<xs:documentation>Optional. Mode of lookup component to select values for ModelReference. Optional.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Memory"/>
					<xs:enumeration value="AutoSearch"/>
					<xs:enumeration value="ManualSearch"/>
					<xs:enumeration value="Dropdown"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="inputType">
			<xs:annotation>
				<xs:documentation>Optional. Specifies type of text input. Valid only if type is String.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
	
				<xs:restriction base="xs:string">
					<xs:enumeration value="None"/>
					<xs:enumeration value="Text"/>
					<xs:enumeration value="Email"/>
					<xs:enumeration value="Password"/>
					<xs:enumeration value="Numeric"/>
					<xs:enumeration value="Phone"/>
					<xs:enumeration value="Code"/>
				</xs:restriction>
			</xs:simpleType>

		</xs:attribute>
		<xs:attribute name="codeType">
			<xs:annotation>
				<xs:documentation>Optional. Specifies format of code input. Valid only if type is String and inputType is Code.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Any"/>
					<xs:enumeration value="Numeric"/>
					<xs:enumeration value="Letters"/>
					<xs:enumeration value="UpperLetters"/>
				</xs:restriction>
			</xs:simpleType>

		</xs:attribute>
		<xs:attribute name="inputMode">
			<xs:annotation>
				<xs:documentation>Optional. Specifies input mode (keyboard type) for text inputs.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Text"/>
					<xs:enumeration value="Email"/>
					<xs:enumeration value="Numeric"/>
					<xs:enumeration value="Tel"/>
					<xs:enumeration value="Url"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="autocompleteMode">
			<xs:annotation>
				<xs:documentation>Optional. Specifies autocomplete mode for text inputs.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="AddressStreet"/>
					<xs:enumeration value="AddressCity"/>
					<xs:enumeration value="AddressZip"/>
					<xs:enumeration value="AddressCountry"/>
					<xs:enumeration value="LastName"/>
					<xs:enumeration value="FirstName"/>
					<xs:enumeration value="CompanyName"/>
					<xs:enumeration value="Email"/>
					<xs:enumeration value="Phone"/>
					<xs:enumeration value="Url"/>
					<xs:enumeration value="Username"/>
					<xs:enumeration value="Password"/>
					<xs:enumeration value="NewPassword"/>
					<xs:enumeration value="OneTimeCode"/>
					<xs:enumeration value="Off"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="colSpan" type="xs:integer">
			<xs:annotation>
				<xs:documentation>Optional. Number of form columns this field spans (most-specific tier in the colSpan inheritance chain: ViewModelPropertyView &gt; ViewModelPropertyGroup &gt; ViewModelView). Default 1.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="labelOrientation">
			<xs:annotation>
				<xs:documentation>Optional. Where the label sits relative to the input. "Top" (default) stacks label above control; "Side" places the label to the left of the control on the same row.</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Top"/>
					<xs:enumeration value="Side"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="labelWidth">
			<xs:annotation>
				<xs:documentation>Optional. Side-layout label column width. Three levels: "Narrow" (~80px), "Normal" (~120px, default), "Wide" (~200px). Ignored when labelOrientation is "Top".</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Narrow"/>
					<xs:enumeration value="Normal"/>
					<xs:enumeration value="Wide"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>

	</xs:complexType>

	<xs:complexType name="ViewModelPropertyGroupType">
		<xs:annotation>
			<xs:documentation>Groups a set of ViewModel Properties for organizational + UI purposes. Group-level settings cascade to every child ViewModelProperty unless overridden at property or view level.</xs:documentation>
		</xs:annotation>




		<xs:choice maxOccurs="unbounded">
			<xs:element name="Property" type="ViewModelPropertyType" maxOccurs="unbounded"></xs:element>
			<xs:element name="PropertyGroup" type="ViewModelPropertyGroupType" maxOccurs="unbounded"></xs:element>
		</xs:choice>



		<xs:attribute name="name" type="xs:string"/>

		<xs:attribute name="section" type="xs:string"/>
		<xs:attribute name="readOnly" type="xs:boolean" default="false"/>
		<xs:attribute name="hidden" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Hides every property in the group from generated views. Default is false.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="colSpan" type="xs:integer">
			<xs:annotation>
				<xs:documentation>Optional. Group-level default for colSpan in the inheritance chain (ViewModelPropertyView &gt; ViewModelPropertyGroup &gt; ViewModelView). Applies to every child Property that does not set its own ViewModelPropertyView.colSpan.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="sectionInstruction" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text for field section. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="style" type="xs:string">
			<xs:annotation>
				<xs:documentation>Style of property group. Used as className (React), style (Xaml), or style (React Native)</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="step" type="xs:string">
			<xs:annotation>
				<xs:documentation>Name of the wizard step. Mandatory if stepOrder given. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="stepOrder" type="xs:int">
			<xs:annotation>
				<xs:documentation>Order of the wizard step. Mandatory if step given. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		
		<xs:attribute name="stepOrderInfo" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Additional information related to step order. Language text. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="stepHeading" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Heading for step. Language text. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="stepInstruction" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Instruction text for step. Language text. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="wizardCancelEnabled" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates whether cancel button is enabled for the step. Default is false. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="stepBackEnabled" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates whether back button is enabled for the step. Default is false. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="wizardFinishEnabled" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. When true, the step shows a Finish button that COMPLETES the wizard FROM this step, SKIPPING any subsequent steps. Use for optional trailing steps at the end of a wizard where the user can finish early. The Next button is always enabled by default — there is no flag for it. Default false. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="wizardExecute" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates if wizard as whole is executed after this step. Typically second last step if last is summary. Default is false. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="authMethods" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Marks this wizard step as an authentication-method picker (e.g. "Google,Apple,Email"). The step renders the named login methods as buttons (fed by the app's generated auth config — clientIds come from Application.xml's Auth/Methods, NOT redeclared here) and advances to the next step on successful authentication. The picker renders in place of the step's fields; declare a Property only as a `bindAuth` sink. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="bindAuth" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional, used with `authMethods`. Names a Property declared in THIS step that receives the authenticated user's email (the login identity) once a method completes — e.g. `bindAuth="Email"` alongside a `&lt;Property name="Email"/&gt;` in the step. The generator captures the email into the wizard VM (e.g. vm.email) before advancing, so later steps and the wizard's execute logic can use the verified identity. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="documentation" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Per-step implementation guidance written onto the step's abstract execute method — both the base class declaration AND the derived implementation stub the AI fills in. Use it to describe what this step should do (e.g. "Create the wizard session via apiCustomerServiceClient.startWizard and keep the returned SessionId"); the wrapper already handles validation, isLoading, step advancement and error surfacing, so document only the step's own logic. Only if mode is Wizard.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>


	<xs:complexType name="ViewModelCommandType">
		<xs:annotation>
			<xs:documentation>Mirrors ModelSchema's CommandType so the same set of attributes (type / label / message / customUserRight / customUserRightCommand / canExecuteCondition / selectedParameter / relatedProperty / documentation) is available regardless of which schema declares the command. The standalone-VM flavour keeps the optional CommandParameters child so dialog / wizard VMs can declare typed inputs the model-driven flavour doesn't need.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="CommandParameters" minOccurs="0">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="CommandParameter" type="CommandParameterType" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" use="required">
			<xs:annotation>
				<xs:documentation>The name of the ViewModel command.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="type">
			<xs:annotation>
				<xs:documentation>
Optional. Defaults to `Custom`. Picks between adding a brand-new command
(`Custom`) and CUSTOMISING one of the standard buttons that the generator
already produces for the enclosing ViewModel mode (Page / Dialog / Wizard).

To customise a standard button, declare a `&lt;Command type="..."/&gt;` with the
matching `type`. Whatever you set on this entry — `label`, `message`,
`customUserRight` / `customUserRightCommand`,
`canExecuteCondition`, `documentation` — is applied to that button. The
button's wiring (what it does, when it's enabled) stays the same.

  Dialog mode — three standard buttons you can customise:
    * `Execute` — primary OK / confirm action.
    * `Close`   — close the dialog without committing.
    * `Cancel`  — cancel / dismiss.

  Page mode — no standard buttons. A page declares every command it needs in
  XML, so only `Custom` is meaningful here.

  Wizard mode — each step gets up to four standard buttons (Next / Back /
  Cancel / Finish), driven by the step's PropertyGroup flags
  (`stepBackEnabled`, `wizardCancelEnabled`, `wizardFinishEnabled`). Customise
  them with these types:
    * `ExecuteWizardStep` — the Next button.
    * `BackWizardStep`    — the Back button.
    * `CancelWizard`      — the Cancel button.
    * `FinishWizard`      — the Finish button (early-completion).

  By default a wizard customisation applies to EVERY step. To target a single
  step instead, add the `wizardStepOrder` attribute. You can combine both:
  one entry without `wizardStepOrder` sets the common label / right, and a
  second entry with `wizardStepOrder` overrides it for that one step (the
  per-step entry wins).

`Custom` (default) — declares a brand-new command the framework doesn't know
about. Use this for project-specific actions (Approve, Archive, Recalc, ...).
				</xs:documentation>
			</xs:annotation>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Custom"/>
					<xs:enumeration value="Execute"/>
					<xs:enumeration value="Close"/>
					<xs:enumeration value="Cancel"/>
					<xs:enumeration value="ExecuteWizardStep"/>
					<xs:enumeration value="BackWizardStep"/>
					<xs:enumeration value="CancelWizard"/>
					<xs:enumeration value="FinishWizard"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="message" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Message shown after successful execution. Language text.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="label" type="xs:string">
			<xs:annotation>
				<xs:documentation>The display name of the command. Optional.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="customUserRight" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional override for the user-right bucket the command's `hasUserRight(...)` check resolves against. Defaults to the parent ViewModel's name. Set when the command should be governed by a different bucket than its hosting VM.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="customUserRightCommand" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional override for the command-level key spliced into `hasUserRight(bucket, command)`. Defaults to the command's `name` attribute. Set when multiple commands should share a single command-level right, to align with an existing org-defined right name, or to decouple the displayed label from the underlying right.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="canExecuteCondition" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Boolean expression spliced into the button's enable check. Use the host language's own syntax (TypeScript for React, C# for WPF, ...).

Multi-flavour syntax (same shape as `label`'s language tags) lets ONE attribute cover multiple view-model types when the expression has to differ:

    [react]this.amount &gt; 0[wpf]Amount &gt; 0[reactNative]this.amount &gt; 0

Rules:
  * Plain text without `[...]` markers is used as-is for every view-model type.
  * Text BEFORE the first `[` is the default fallback when no marker matches.
  * Each `[code]value` segment targets one view-model type. Codes:
        react        — React VM
        wpf          — WPF VM
        reactNative  — React Native VM
    Codes are case-insensitive, order doesn't matter.
  * Markers are picked at code-generation time, so each generated VM gets only its own variant.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="selectedParameter" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Optional. Indicates if this is targeted to selected row in list view. Default is false.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="relatedProperty" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Name of a viewmodel property the command operates on (e.g. a Ref property the command opens / loads / searches against). Used to bind the command to a specific RelatedViewModelProperty so the generator can wire the abstract / wrapper pair against that property.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="wizardStepOrder" type="xs:int">
			<xs:annotation>
				<xs:documentation>Optional. Targets a single wizard step when customising one of the wizard `type=` values (ExecuteWizardStep / BackWizardStep / CancelWizard / FinishWizard). The number must match the `stepOrder` of a PropertyGroup that declares a wizard step. When omitted, the customisation applies to EVERY step in the wizard. A per-step entry (with `wizardStepOrder`) wins over a wildcard entry (without it). Ignored — and meaningless — for non-wizard `type=` values.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="documentation" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Summary documentation for the command. Becomes the abstract method's doc summary in the generated derived-class stub so the AI / dev reads the intent (e.g. "open ProductReadView") while filling in the body.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="style" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Extra CSS class name(s) appended to the generated button's className (React) / Style (Xaml). Use to target the button in a per-view stylesheet without having to scope by the mode/section wrapper classes — e.g. `style="primary-cta"` makes `&lt;BsButton className="primary-cta mg-bs-..."/&gt;`. Whitespace-separated values are emitted verbatim.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="EnumerationType">
		<xs:annotation>
			<xs:documentation>A named enum with items + optional null handling.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="EnumerationItem" type="VmEnumerationItemType" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" use="required">
			<xs:annotation>
				<xs:documentation>Required. The name of the enumeration type. This will be used as the enumeration type name in generated code.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="nullIncluded" type="xs:boolean" default="true">
			<xs:annotation>
				<xs:documentation>Optional. Indicates whether a NULL value (with numeric value 0) should be automatically added to the enumeration. Default is true.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="nullDescription" type="xs:string" >
			<xs:annotation>
				<xs:documentation>Optional. The description text for the NULL value when nullIncluded is true. Default is '-'.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="ViewModelViewType">
		<xs:annotation>
			<xs:documentation>A generated view tied to a standalone ViewModel (dialog / wizard). Distinct from Model-driven views — ViewModel XMLs describe VMs that don't map 1:1 to a persisted model. Layout attrs (colCount, colSpan default) drive the form grid inside the view.</xs:documentation>
		</xs:annotation>
		<xs:attribute name="name" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. The name of the view. Defaults to the parent ViewModel's name with the trailing "Model" stripped (e.g. `InsertCustomerWizardViewModel` → `InsertCustomerWizardView`). Set explicitly when the view name should differ from the convention.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="namespace" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. The namespace of the view. Defaults to the parent ViewModel's namespace so the view co-locates with the VM (consistent with the ModelView default). Only the WPF / Xaml side consumes this; React/TS generation ignores it.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="default" type="xs:boolean" default="false">
			<xs:annotation>
				<xs:documentation>Indicates if this is the default view. Default is false.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="colCount" type="xs:int" default="2">
			<xs:annotation>
				<xs:documentation>Number of columns in view. Valid only for Read and Update views. Default is 2.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="colSpan" type="xs:integer">
			<xs:annotation>
				<xs:documentation>Optional. View-level fallback default (lowest tier in the colSpan inheritance chain: ViewModelPropertyView &gt; ViewModelPropertyGroup &gt; ViewModelView). Applies only when none of the higher tiers set colSpan.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="displayName" type="xs:string">
			<xs:annotation>
				<xs:documentation>Display name of the view. Language text. Default is name without view and mode at the end.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="CommandParameterType">
		<xs:annotation>
			<xs:documentation>A typed parameter passed to a VM command when invoked. Rendered as a named arg in the generated command method.</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="name" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>The name of the command parameter.</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:attribute name="type" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>The type of the command parameter.</xs:documentation>
					</xs:annotation>
				</xs:attribute>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>

	<xs:complexType name="ReferencedModelType">
		<xs:annotation>
			<xs:documentation>A directory + model-name pointer to another Model XML this ViewModel depends on (e.g. for lookups or referenced properties). The full file path is constructed by callers as `&lt;path&gt;/&lt;name&gt;.xml` (or generated-artifact equivalent for code-gen import paths).</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="name" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>The name of the referenced model. Doubles as the file name stem.</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:attribute name="path" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>Directory path to the referenced model file (no file name; the file name is `&lt;name&gt;.xml`).</xs:documentation>
					</xs:annotation>
				</xs:attribute>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>

	<xs:complexType name="ReferencedEnumerationType">
		<xs:annotation>
			<xs:documentation>A directory + model-name + enum-name pointer to an enumeration defined in another model file. The model file is `&lt;path&gt;/&lt;modelName&gt;.xml`; `name` is the enumeration identifier within that file.</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="name" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>The name of the referenced enumeration (the identifier inside the model file).</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:attribute name="modelName" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>Name of the model whose XML file contains the enumeration. Doubles as the file name stem.</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:attribute name="path" type="xs:string" use="required">
					<xs:annotation>
						<xs:documentation>Directory path to the referenced model file (no file name; the file name is `&lt;modelName&gt;.xml`).</xs:documentation>
					</xs:annotation>
				</xs:attribute>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>

	<xs:complexType name="VmEnumerationItemType">
		<xs:annotation>
			<xs:documentation>A single item inside a ViewModel-local Enumeration. Simpler than the Model variant: no mapping children.</xs:documentation>
		</xs:annotation>
		<xs:attribute name="name" type="xs:string" use="required">
			<xs:annotation>
				<xs:documentation>Required. The name of the enumeration item. This will be used as the enumeration value name in generated code.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="value" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. The numeric value of the enumeration item. If not specified, values are assigned sequentially starting from the configured EnumerationStartValue (default 1), or incrementing from the previous item's value.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="code" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. A code identifier for the enumeration item. This can be used for additional identification purposes.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="documentation" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. Documentation comments for the enumeration item. This will be included in generated code documentation.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="description" type="xs:string">
			<xs:annotation>
				<xs:documentation>Optional. User-facing description of the enumeration item. Supports multilingual text format where translations are given after language code in square brackets (e.g., "Default text[fi]Suomenkielinen teksti"). If empty, a display name is automatically generated from the item name using camel case conversion.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>


</xs:schema>
