import type { Morfo } from '../types'; import { v } from '../types'; export const fieldMorfo = { name: 'Field', kebab: 'field', scope: ['soma'], texts: { label: '#?components.field.label|Field', 'required-indicator': '#?components.field.required-indicator|*', 'optional-indicator': '#?components.field.optional-indicator|(optional)' }, parts: [ { name: 'Provider', kebab: 'provider', archetype: 'provider', kind: 'public', defaultElement: 'div', optional: false, states: ['state'], data: [ { attr: 'data-state', values: ['idle', 'error', 'disabled', 'readonly', 'loading'], value: v.stateRef('state') }, { attr: 'data-disabled', value: v.propRef('disabled'), severity: 'optional' }, { attr: 'data-readonly', value: v.propRef('readonly'), severity: 'optional' }, { attr: 'data-required', value: v.propRef('required'), severity: 'optional' }, { attr: 'data-invalid', value: v.propRef('invalid'), severity: 'optional' }, { attr: 'data-dirty', value: v.propRef('dirty'), severity: 'optional' }, { attr: 'data-touched', value: v.propRef('touched'), severity: 'optional' }, { attr: 'data-field-name', value: v.propRef('name'), emit: 'value', severity: 'optional' } ], aria: [] }, { name: 'Label', kebab: 'label', archetype: 'label', kind: 'public', defaultElement: 'label', optional: true, data: [ { attr: 'data-disabled', value: v.propRef('disabled'), severity: 'optional' }, { attr: 'data-invalid', value: v.propRef('invalid'), severity: 'optional' }, { attr: 'data-required', value: v.propRef('required'), severity: 'optional' } ], aria: [ { attr: 'for', value: v.partRef('input'), condition: { when: 'part-present', part: 'input' }, severity: 'recommended' } ] }, { name: 'RequiredIndicator', kebab: 'required-indicator', archetype: 'indicator', kind: 'public', defaultElement: 'span', optional: true, data: [{ attr: 'data-required', value: v.propRef('required'), severity: 'optional' }], aria: [{ attr: 'aria-hidden', value: v.literal('true') }] }, { name: 'OptionalIndicator', kebab: 'optional-indicator', archetype: 'indicator', kind: 'public', defaultElement: 'span', optional: true, data: [{ attr: 'data-required', value: v.propRef('required'), severity: 'optional' }], aria: [{ attr: 'aria-hidden', value: v.literal('true') }] }, { name: 'Control', kebab: 'control', kind: 'public', defaultElement: 'div', optional: true, states: ['state'], data: [ { attr: 'data-state', values: ['idle', 'error', 'disabled', 'readonly', 'loading'], value: v.stateRef('state') }, { attr: 'data-disabled', value: v.propRef('disabled'), severity: 'optional' }, { attr: 'data-invalid', value: v.propRef('invalid'), severity: 'optional' } ], aria: [] }, { name: 'Input', kebab: 'input', archetype: 'input', kind: 'public', defaultElement: 'input', optional: true, states: ['state'], data: [ { attr: 'data-state', values: ['idle', 'error', 'disabled', 'readonly', 'loading'], value: v.stateRef('state') } ], aria: [ { attr: 'type', value: v.propRef('type') }, { attr: 'aria-labelledby', value: v.partRef('label'), condition: { when: 'part-present', part: 'label' }, severity: 'recommended' }, { attr: 'aria-invalid', value: v.propRef('invalid'), ariaBoolean: true }, { attr: 'aria-describedby', value: v.partRef('helper-text'), condition: { when: 'part-present', part: 'helper-text' }, severity: 'recommended' }, { attr: 'aria-busy', value: v.literal('true'), severity: 'optional', condition: { when: 'state-equals', state: 'state', value: 'loading' } }, { attr: 'aria-required', value: v.literal('true'), severity: 'optional', condition: { when: 'prop-truthy', prop: 'required' } } ] }, { name: 'HelperText', kebab: 'helper-text', archetype: 'description', kind: 'public', defaultElement: 'div', optional: true, data: [{ attr: 'data-disabled', value: v.propRef('disabled'), severity: 'optional' }], aria: [] }, { name: 'ErrorText', kebab: 'error-text', archetype: 'description', kind: 'public', defaultElement: 'div', role: 'alert', optional: true, data: [], aria: [{ attr: 'aria-live', value: v.literal('polite') }] }, { name: 'Prefix', kebab: 'prefix', kind: 'public', defaultElement: 'div', optional: true, data: [], aria: [{ attr: 'aria-hidden', value: v.literal('true') }] }, { name: 'Suffix', kebab: 'suffix', kind: 'public', defaultElement: 'div', optional: true, data: [], aria: [{ attr: 'aria-hidden', value: v.literal('true') }] } ] } as const satisfies Morfo;