{
  "mappings": "AAAA,cAAc,oBAA6B;;AAgC3C,OAAO,cAAM;;AAoFb,OAAO,cAAM;;AA8Db,OAAO,cAAM;;;;;;;;AA6Bb,OAAO,cAAM;AA8Cb,OAAO,cAAM,YAAY,SAAS,eAAe;AA8lBjD,OAAO,cAAM;;AAGb,OAAO,cAAM",
  "names": [],
  "sources": [
    "src/tables/attributes.ts"
  ],
  "version": 3,
  "sourcesContent": [
    "import type { AttributeRow, TagName } from './types'\n\n/**\n * The attribute table: every non-event prop in the Tamagui DOM contract.\n *\n * `tags` is the authority for the unsupported-prop diagnostic, `type` is the\n * source the prop-interface generator emits, and `nativeProp` records what\n * actually carries the value on native. A row with `native: 'none'` still\n * type-checks and works on web; using it in a native build is a diagnostic.\n *\n * Props that only make sense on a text-entry control (`autoCapitalize`,\n * `enterKeyHint`, `inputMode`, `spellCheck`) are scoped to input and textarea\n * here even though React Strict DOM declares them globally. See\n * `compatibility.ts`.\n *\n * The `aria-*` rows map to the legacy accessibility props on purpose, and it is\n * worth knowing why before anyone simplifies them. React Native does accept\n * some `aria-*` props directly and translates them itself, so those mappings\n * look redundant — but the set differs per host. `View` handles thirteen of\n * them, `Text` handles seven, and neither handles `aria-modal`, `aria-posinset`\n * or `aria-setsize`. Since one row has to be right for every backing a tag can\n * lower to, the mapping that every host accepts unconditionally is the correct\n * one. Verified against react-native 0.86.2's `View.js` and `Text.js`, not\n * against its types. `id` is the exception: View, Text and TextInput all take\n * it, so that row passes it straight through.\n */\n\nconst TEXT_ENTRY: readonly TagName[] = ['input', 'textarea']\nconst ANCHOR: readonly TagName[] = ['a']\nconst IMAGE: readonly TagName[] = ['img']\n\n/** roles authors may set, excluding the abstract roles */\nexport const ARIA_ROLES: readonly string[] = [\n  'alert',\n  'alertdialog',\n  'application',\n  'article',\n  'banner',\n  'blockquote',\n  'button',\n  'caption',\n  'cell',\n  'checkbox',\n  'code',\n  'columnheader',\n  'combobox',\n  'complementary',\n  'contentinfo',\n  'definition',\n  'deletion',\n  'dialog',\n  'document',\n  'emphasis',\n  'feed',\n  'figure',\n  'form',\n  'grid',\n  'gridcell',\n  'group',\n  'heading',\n  'img',\n  'input',\n  'insertion',\n  'link',\n  'list',\n  'listbox',\n  'listitem',\n  'log',\n  'main',\n  'marquee',\n  'math',\n  'menu',\n  'menubar',\n  'menuitem',\n  'menuitemcheckbox',\n  'menuitemradio',\n  'meter',\n  'navigation',\n  'none',\n  'note',\n  'option',\n  'paragraph',\n  'progressbar',\n  'radio',\n  'radiogroup',\n  'region',\n  'row',\n  'rowgroup',\n  'rowheader',\n  'scrollbar',\n  'search',\n  'searchbox',\n  'separator',\n  'slider',\n  'spinbutton',\n  'status',\n  'strong',\n  'subscript',\n  'superscript',\n  'switch',\n  'tab',\n  'table',\n  'tablist',\n  'tabpanel',\n  'term',\n  'textbox',\n  'time',\n  'timer',\n  'toolbar',\n  'tooltip',\n  'tree',\n  'treegrid',\n  'treeitem',\n]\n\n/** autofill hints shared by web and react native */\nexport const AUTO_COMPLETE_VALUES: readonly string[] = [\n  'additional-name',\n  'address-line1',\n  'address-line2',\n  'birthdate-day',\n  'birthdate-full',\n  'birthdate-month',\n  'birthdate-year',\n  'cc-csc',\n  'cc-exp',\n  'cc-exp-day',\n  'cc-exp-month',\n  'cc-exp-year',\n  'cc-number',\n  'cc-name',\n  'cc-given-name',\n  'cc-middle-name',\n  'cc-family-name',\n  'cc-type',\n  'country',\n  'current-password',\n  'email',\n  'family-name',\n  'gender',\n  'given-name',\n  'honorific-prefix',\n  'honorific-suffix',\n  'name',\n  'name-family',\n  'name-given',\n  'name-middle',\n  'name-middle-initial',\n  'name-prefix',\n  'name-suffix',\n  'new-password',\n  'nickname',\n  'on',\n  'one-time-code',\n  'organization',\n  'organization-title',\n  'password',\n  'password-new',\n  'postal-address',\n  'postal-address-country',\n  'postal-address-extended',\n  'postal-address-extended-postal-code',\n  'postal-address-locality',\n  'postal-address-region',\n  'postal-code',\n  'street-address',\n  'sms-otp',\n  'tel',\n  'tel-country-code',\n  'tel-national',\n  'tel-device',\n  'url',\n  'username',\n  'username-new',\n  'off',\n]\n\n/** every html input type; the ones native cannot render are a native build error */\nexport const HTML_INPUT_TYPES: readonly string[] = [\n  'checkbox',\n  'color',\n  'date',\n  'datetime-local',\n  'email',\n  'file',\n  'hidden',\n  'month',\n  'number',\n  'password',\n  'radio',\n  'range',\n  'search',\n  'submit',\n  'tel',\n  'text',\n  'time',\n  'url',\n  'week',\n]\n\n/**\n * Input types react native can render with a text-entry control.\n *\n * `hidden` and `submit` were here and should not have been: hidden renders\n * nothing at all and submit is a button, so neither is a text-entry control and\n * claiming native support for them would pass a build that cannot render.\n */\nexport const NATIVE_INPUT_TYPES: readonly string[] = [\n  'email',\n  'number',\n  'password',\n  'search',\n  'tel',\n  'text',\n  'url',\n]\n\nconst ariaState = (name: string, nativeProp: string | null): AttributeRow => ({\n  group: 'aria',\n  tags: '*',\n  type: 'boolean',\n  nativeProp,\n  web: 'host',\n  native: nativeProp ? 'polyfill' : 'none',\n})\n\nconst ariaRef = (): AttributeRow => ({\n  group: 'aria',\n  tags: '*',\n  type: 'string',\n  nativeProp: null,\n  web: 'host',\n  native: 'none',\n})\n\nconst ariaNumber = (nativeProp: string | null = null): AttributeRow => ({\n  group: 'aria',\n  tags: '*',\n  type: 'number',\n  nativeProp,\n  web: 'host',\n  native: nativeProp ? 'polyfill' : 'none',\n})\n\nconst ariaText = (nativeProp: string | null = null): AttributeRow => ({\n  group: 'aria',\n  tags: '*',\n  type: 'string',\n  nativeProp,\n  web: 'host',\n  native: nativeProp ? 'polyfill' : 'none',\n})\n\nexport const ATTRIBUTES: Readonly<Record<string, AttributeRow>> = {\n  // accessibility\n  'aria-activedescendant': ariaRef(),\n  'aria-atomic': ariaState('aria-atomic', null),\n  'aria-autocomplete': {\n    group: 'aria',\n    tags: '*',\n    type: `'none' | 'inline' | 'list' | 'both'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-busy': ariaState('aria-busy', 'accessibilityState.busy'),\n  'aria-checked': {\n    group: 'aria',\n    tags: '*',\n    type: `boolean | 'mixed'`,\n    nativeProp: 'accessibilityState.checked',\n    web: 'host',\n    native: 'polyfill',\n  },\n  'aria-colcount': ariaNumber(),\n  'aria-colindex': ariaNumber(),\n  'aria-colindextext': ariaText(),\n  'aria-colspan': ariaNumber(),\n  'aria-controls': ariaRef(),\n  'aria-current': {\n    group: 'aria',\n    tags: '*',\n    type: `boolean | 'page' | 'step' | 'location' | 'date' | 'time'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-describedby': {\n    ...ariaRef(),\n    note: 'react native has no described-by relationship; put the description in aria-label instead',\n  },\n  'aria-details': ariaRef(),\n  'aria-disabled': ariaState('aria-disabled', 'accessibilityState.disabled'),\n  'aria-errormessage': ariaRef(),\n  'aria-expanded': ariaState('aria-expanded', 'accessibilityState.expanded'),\n  'aria-flowto': ariaRef(),\n  'aria-haspopup': {\n    group: 'aria',\n    tags: '*',\n    type: `'menu' | 'listbox' | 'tree' | 'grid' | 'dialog'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-hidden': {\n    group: 'aria',\n    tags: '*',\n    type: 'boolean',\n    nativeProp: 'accessibilityElementsHidden',\n    web: 'host',\n    native: 'polyfill',\n    note: 'also sets importantForAccessibility on android so descendants are hidden',\n  },\n  'aria-invalid': {\n    group: 'aria',\n    tags: '*',\n    type: `boolean | 'grammar' | 'spelling'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-keyshortcuts': ariaText(),\n  'aria-label': ariaText('accessibilityLabel'),\n  'aria-labelledby': {\n    group: 'aria',\n    tags: '*',\n    type: 'string',\n    nativeProp: 'accessibilityLabelledBy',\n    web: 'host',\n    native: 'polyfill',\n  },\n  'aria-level': ariaNumber(),\n  'aria-live': {\n    group: 'aria',\n    tags: '*',\n    type: `'off' | 'assertive' | 'polite'`,\n    nativeProp: 'accessibilityLiveRegion',\n    web: 'host',\n    native: 'polyfill',\n  },\n  'aria-modal': ariaState('aria-modal', 'accessibilityViewIsModal'),\n  'aria-multiline': ariaState('aria-multiline', null),\n  'aria-multiselectable': ariaState('aria-multiselectable', null),\n  'aria-orientation': {\n    group: 'aria',\n    tags: '*',\n    type: `'horizontal' | 'vertical'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-owns': ariaRef(),\n  'aria-placeholder': ariaText(),\n  // react-native 0.86.2 has no accessibilityPosInSet — checked View.js and\n  // ViewAccessibility.d.ts, it exists in neither. Mapping to it would have the\n  // prop silently dropped at the host, which is worse than declaring it web-only\n  'aria-posinset': ariaNumber(),\n  'aria-pressed': {\n    group: 'aria',\n    tags: '*',\n    type: `boolean | 'mixed'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-readonly': ariaState('aria-readonly', null),\n  'aria-required': ariaState('aria-required', null),\n  'aria-roledescription': ariaText(),\n  'aria-rowcount': ariaNumber(),\n  'aria-rowindex': ariaNumber(),\n  'aria-rowindextext': ariaText(),\n  'aria-rowspan': ariaNumber(),\n  'aria-selected': ariaState('aria-selected', 'accessibilityState.selected'),\n  // same: no accessibilitySetSize anywhere in react-native 0.86.2\n  'aria-setsize': ariaNumber(),\n  'aria-sort': {\n    group: 'aria',\n    tags: '*',\n    type: `'none' | 'ascending' | 'descending' | 'other'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  'aria-valuemax': ariaNumber('accessibilityValue.max'),\n  'aria-valuemin': ariaNumber('accessibilityValue.min'),\n  'aria-valuenow': ariaNumber('accessibilityValue.now'),\n  'aria-valuetext': ariaText('accessibilityValue.text'),\n\n  // global\n  autoFocus: {\n    group: 'global',\n    tags: '*',\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'focus a native element through a ref in an effect instead',\n  },\n  dir: {\n    group: 'global',\n    tags: '*',\n    type: `'auto' | 'ltr' | 'rtl'`,\n    nativeProp: 'writingDirection',\n    web: 'host',\n    native: 'polyfill',\n  },\n  elementTiming: {\n    group: 'global',\n    tags: '*',\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'element timing is a browser performance api',\n  },\n  hidden: {\n    group: 'global',\n    tags: '*',\n    type: `true | 'hidden' | 'until-found'`,\n    nativeProp: 'style.display',\n    web: 'host',\n    native: 'polyfill',\n    note: 'native applies display none and has no until-found reveal',\n  },\n  id: {\n    group: 'global',\n    tags: '*',\n    type: 'string',\n    // react native takes `id` itself on View, Text and TextInput and assigns it\n    // to nativeID, so there is nothing to rename\n    nativeProp: 'id',\n    web: 'host',\n    native: 'polyfill',\n  },\n  inert: {\n    group: 'global',\n    tags: '*',\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  lang: {\n    group: 'global',\n    tags: '*',\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  role: {\n    group: 'global',\n    tags: '*',\n    type: 'AriaRole',\n    nativeProp: 'role',\n    web: 'host',\n    native: 'polyfill',\n  },\n  tabIndex: {\n    group: 'global',\n    tags: '*',\n    type: '0 | -1',\n    nativeProp: 'focusable',\n    web: 'host',\n    native: 'polyfill',\n  },\n\n  // react\n  suppressHydrationWarning: {\n    group: 'react',\n    tags: '*',\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n\n  children: {\n    group: 'react',\n    tags: '*',\n    nativeProp: 'children',\n    web: 'host',\n    native: 'host',\n    note: 'the content model in the tag table decides the type: no children on a void tag, text only inside an option',\n  },\n\n  // supplied by the styling frontend, never generated as a prop here\n  style: {\n    group: 'frontend',\n    tags: '*',\n    nativeProp: 'style',\n    web: 'host',\n    native: 'host',\n    note: 'each frontend supplies its own style contract: tamagui style props, className, or style() handles',\n  },\n  'data-*': {\n    group: 'data',\n    tags: '*',\n    type: 'string | number | boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'data-testid is the one exception and reaches testID on native',\n  },\n  'data-testid': {\n    group: 'data',\n    tags: '*',\n    type: 'string',\n    nativeProp: 'testID',\n    web: 'host',\n    native: 'polyfill',\n  },\n\n  // text entry\n  autoCapitalize: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: `'none' | 'sentences' | 'words' | 'characters'`,\n    nativeProp: 'autoCapitalize',\n    web: 'host',\n    native: 'host',\n  },\n  autoComplete: {\n    group: 'element',\n    tags: ['input', 'select', 'textarea'],\n    type: 'AutoComplete',\n    nativeProp: 'autoComplete',\n    web: 'host',\n    native: 'host',\n  },\n  enterKeyHint: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: `'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'`,\n    nativeProp: 'enterKeyHint',\n    web: 'host',\n    native: 'host',\n  },\n  inputMode: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: `'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'`,\n    nativeProp: 'inputMode',\n    web: 'host',\n    native: 'host',\n  },\n  spellCheck: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: 'boolean',\n    nativeProp: 'spellCheck',\n    web: 'host',\n    native: 'host',\n    note: 'ios only on native',\n  },\n\n  // anchor\n  download: {\n    group: 'element',\n    tags: ANCHOR,\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  href: {\n    group: 'element',\n    tags: ANCHOR,\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'native has no navigation; handle onClick and call your router or Linking',\n  },\n  referrerPolicy: {\n    group: 'element',\n    tags: ['a', 'img'],\n    type: `'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url'`,\n    nativeProp: 'referrerPolicy',\n    web: 'host',\n    native: 'host',\n    note: 'native honours it for image requests only',\n  },\n  rel: {\n    group: 'element',\n    tags: ANCHOR,\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  target: {\n    group: 'element',\n    tags: ANCHOR,\n    type: `'_self' | '_blank' | '_parent' | '_top'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n\n  // button, input, option, optgroup, textarea\n  disabled: {\n    group: 'element',\n    tags: ['button', 'input', 'optgroup', 'option', 'textarea'],\n    type: 'boolean',\n    nativeProp: 'disabled',\n    web: 'host',\n    native: 'polyfill',\n    note: 'native also clears focusable, and editable on a text-entry control',\n  },\n  type: {\n    group: 'element',\n    tags: ['button', 'input'],\n    perTag: {\n      button: { type: `'button' | 'submit'` },\n      input: {\n        type: 'InputType',\n        note: 'on native the type selects the keyboard and secure entry rather than reaching one prop, and the types with no text-entry control are a build error',\n      },\n    },\n    nativeProp: null,\n    web: 'host',\n    native: 'polyfill',\n  },\n\n  // image\n  alt: {\n    group: 'element',\n    tags: IMAGE,\n    type: 'string',\n    nativeProp: 'alt',\n    web: 'host',\n    native: 'host',\n  },\n  crossOrigin: {\n    group: 'element',\n    tags: IMAGE,\n    type: `'anonymous' | 'use-credentials'`,\n    nativeProp: 'crossOrigin',\n    web: 'host',\n    native: 'host',\n  },\n  decoding: {\n    group: 'element',\n    tags: IMAGE,\n    type: `'async' | 'auto' | 'sync'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  draggable: {\n    group: 'element',\n    tags: IMAGE,\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  fetchPriority: {\n    group: 'element',\n    tags: IMAGE,\n    type: `'high' | 'low' | 'auto'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  height: {\n    group: 'element',\n    tags: IMAGE,\n    type: 'number',\n    nativeProp: 'height',\n    web: 'host',\n    native: 'host',\n  },\n  loading: {\n    group: 'element',\n    tags: IMAGE,\n    type: `'eager' | 'lazy'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  src: {\n    group: 'element',\n    tags: IMAGE,\n    type: 'string',\n    nativeProp: 'src',\n    web: 'host',\n    native: 'host',\n  },\n  srcSet: {\n    group: 'element',\n    tags: IMAGE,\n    type: 'string',\n    nativeProp: 'srcSet',\n    web: 'host',\n    native: 'host',\n  },\n  width: {\n    group: 'element',\n    tags: IMAGE,\n    type: 'number',\n    nativeProp: 'width',\n    web: 'host',\n    native: 'host',\n  },\n\n  // form controls\n  checked: {\n    group: 'element',\n    tags: ['input'],\n    type: `boolean | 'mixed'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'checkbox and radio inputs have no native rendering',\n  },\n  defaultChecked: {\n    group: 'element',\n    tags: ['input'],\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'checkbox and radio inputs have no native rendering',\n  },\n  defaultValue: {\n    group: 'element',\n    tags: ['input', 'select', 'textarea'],\n    type: 'string',\n    perTag: { select: { type: 'string | readonly string[]' } },\n    nativeProp: 'defaultValue',\n    web: 'host',\n    native: 'host',\n  },\n  for: {\n    group: 'element',\n    tags: ['label'],\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'native has no label association; wrap the control or drive it from your own state',\n  },\n  label: {\n    group: 'element',\n    tags: ['optgroup', 'option'],\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  max: {\n    group: 'element',\n    tags: ['input'],\n    type: 'string | number',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  maxLength: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: 'number',\n    nativeProp: 'maxLength',\n    web: 'host',\n    native: 'host',\n  },\n  min: {\n    group: 'element',\n    tags: ['input'],\n    type: 'string | number',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  minLength: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: 'number',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  multiple: {\n    group: 'element',\n    tags: ['input', 'select'],\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  name: {\n    group: 'element',\n    tags: ['input', 'select', 'textarea'],\n    type: 'string',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'form field names only matter to a form submission, which native does not have',\n  },\n  placeholder: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: 'string',\n    nativeProp: 'placeholder',\n    web: 'host',\n    native: 'host',\n  },\n  readOnly: {\n    group: 'element',\n    tags: TEXT_ENTRY,\n    type: 'boolean',\n    nativeProp: 'editable',\n    web: 'host',\n    native: 'polyfill',\n  },\n  required: {\n    group: 'element',\n    tags: ['input', 'select', 'textarea'],\n    type: 'boolean',\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n    note: 'native has no form validation',\n  },\n  rows: {\n    group: 'element',\n    tags: ['textarea'],\n    type: 'number',\n    nativeProp: 'numberOfLines',\n    web: 'host',\n    native: 'polyfill',\n  },\n  step: {\n    group: 'element',\n    tags: ['input'],\n    type: `number | 'any'`,\n    nativeProp: null,\n    web: 'host',\n    native: 'none',\n  },\n  value: {\n    group: 'element',\n    tags: ['input', 'li', 'option', 'select', 'textarea'],\n    type: 'string',\n    perTag: {\n      li: {\n        type: 'number',\n        note: 'the list counter is not rendered on either platform, matching the list-style reset',\n      },\n      select: { type: 'string | readonly string[]' },\n    },\n    nativeProp: 'value',\n    web: 'host',\n    native: 'polyfill',\n  },\n}\n\nexport const ATTRIBUTE_NAMES: readonly string[] = Object.keys(ATTRIBUTES)\n\n/** props the styling frontend supplies, so the DOM contract does not generate them */\nexport const FRONTEND_PROPS: readonly string[] = ['style']\n"
  ]
}