--- /dev/null
+# #####################################################################
+## RELAX NG Schema for HTML 5: Accessible Rich Internet Applications #
+# #####################################################################
+#
+# history: http://hsivonen.iki.fi/aria-html5-bis/
+
+# #####################################################################
+## ARIA
+
+## Global states and properties
+
+aria.global =
+ ( aria.prop.atomic?
+ & aria.state.busy?
+ & aria.prop.controls?
+ & aria.prop.describedby?
+ & aria.state.disabled?
+ & aria.state.dropeffect?
+ & aria.prop.flowto?
+ & aria.state.grabbed?
+ & aria.prop.haspopup?
+ & aria.state.hidden?
+ & aria.state.invalid?
+ & aria.prop.label?
+ & aria.prop.labelledby?
+ & aria.prop.live?
+ & aria.prop.owns?
+ & aria.prop.relevant?
+ )
+
+common.attrs.other &= aria.global?
+
+## States and Properties for Native Roles
+
+common.attrs.aria.implicit.button |=
+ ( aria.state.expanded?
+ & aria.state.pressed?
+ )
+
+common.attrs.aria.implicit.checkbox |=
+ ( aria.state.checked? )
+
+common.attrs.aria.implicit.combobox |=
+ ( aria.state.expanded?
+ & aria.prop.autocomplete?
+ & aria.prop.required?
+ & aria.prop.activedescendant?
+ )
+
+common.attrs.aria.implicit.dialog |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.document |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.form |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.group |=
+ ( aria.state.expanded?
+ & aria.prop.activedescendant?
+ )
+
+common.attrs.aria.implicit.heading |=
+ ( aria.state.expanded?
+ & aria.prop.level?
+ )
+
+common.attrs.aria.implicit.img |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.link |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.listbox |=
+ ( aria.prop.multiselectable?
+ & aria.prop.required?
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+
+common.attrs.aria.implicit.listitem |=
+ ( aria.prop.level?
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ & aria.state.expanded?
+ )
+
+common.attrs.aria.implicit.option |=
+ ( aria.prop.posinset?
+ & aria.prop.setsize?
+ & aria.state.checked?
+ & aria.state.selected?
+ )
+
+common.attrs.aria.implicit.progressbar |=
+ ( aria.prop.valuemax?
+ & aria.prop.valuemin?
+ & aria.prop.valuenow?
+ & aria.prop.valuetext?
+ )
+
+common.attrs.aria.implicit.radio |=
+ ( aria.prop.posinset?
+ & aria.prop.setsize?
+ & aria.state.checked?
+ & aria.state.selected?
+ )
+
+common.attrs.aria.implicit.slider |=
+ ( aria.prop.valuemax?
+ & aria.prop.valuemin?
+ & aria.prop.valuenow?
+ & aria.prop.valuetext?
+ & aria.prop.orientation?
+ )
+
+common.attrs.aria.implicit.spinbutton |=
+ ( aria.prop.valuemax?
+ & aria.prop.valuemin?
+ & aria.prop.valuenow?
+ & aria.prop.valuetext?
+ & aria.prop.required?
+ )
+
+common.attrs.aria.implicit.textbox |=
+ ( aria.prop.activedescendant?
+ & aria.prop.autocomplete?
+ & aria.prop.multiline?
+ & aria.prop.readonly?
+ & aria.prop.required?
+ )
+
+common.attrs.aria.implicit.toolbar |=
+ ( aria.state.expanded?
+ & aria.prop.activedescendant?
+ )
+
+common.attrs.aria.implicit.column-or-row-header |=
+ ( aria.prop.sort?
+ & aria.prop.readonly?
+ & aria.prop.required?
+ & aria.state.selected?
+ & aria.state.expanded?
+ )
+
+#common.attrs.aria.implicit.select |=
+# ( aria.state.invalid?
+# & aria.prop.required?
+# & aria.prop.atomic?
+# & aria.state.busy?
+# & aria.prop.channel?
+# & aria.prop.controls?
+# & aria.prop.live?
+# & aria.prop.relevant?
+# )
+
+# section
+# |
+# |_ region
+# |
+# |_ article
+# |
+# |_ landmark
+# | |_ banner
+# | |_ complementary
+# | |_ contentinfo
+# | |_ main
+# | |_ navigation
+# |
+# |_ list
+# |
+# |_ status
+
+common.attrs.aria.implicit.section |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.region |= common.attrs.aria.implicit.section
+
+common.attrs.aria.implicit.article |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.landmark |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.list |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.status |= common.attrs.aria.implicit.region
+
+common.attrs.aria.implicit.banner |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.complementary |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.contentinfo |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.main |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.navigation |= common.attrs.aria.implicit.landmark
+
+# #####################################################################
+## States
+
+## busy
+ aria.state.busy =
+ attribute aria-busy
+ { string "true"
+ | string "false" #default
+ }
+
+## checked
+ aria.state.checked =
+ attribute aria-checked
+ { string "true"
+ | string "false"
+ | string "mixed"
+ | string "undefined" #default
+ }
+
+## disabled
+ aria.state.disabled =
+ attribute aria-disabled
+ { string "true"
+ | string "false" #default
+ }
+
+## dropeffect
+ aria.state.dropeffect =
+ attribute aria-dropeffect
+ { token "none" #default
+ | token "popup"
+ | token "execute"
+ | list
+ { ( string "copy" )
+ , ( string "execute" )?
+ }
+ | list
+ { ( string "move" )
+ , ( string "execute" )?
+ }
+ | list
+ { ( string "link" )
+ , ( string "execute" )?
+ }
+ | list
+ { ( string "execute" )
+ , ( string "copy" )
+ }
+ | list
+ { ( string "execute" )
+ , ( string "move" )
+ }
+ | list
+ { ( string "execute" )
+ , ( string "link" )
+ }
+ }
+
+## expanded
+ aria.state.expanded =
+ attribute aria-expanded
+ { string "true"
+ | string "false"
+ | string "undefined" #default
+ }
+
+## grabbed
+ aria.state.grabbed =
+ attribute aria-grabbed
+ { string "true"
+ | string "false"
+ | string "undefined" #default
+ }
+
+## hidden
+ aria.state.hidden =
+ attribute aria-hidden
+ { string "true"
+ | string "false" #default
+ }
+
+## invalid
+ aria.state.invalid =
+ attribute aria-invalid
+ { string "true"
+ | string "false" #default
+ | string "grammar"
+ | string "spelling"
+ }
+
+## pressed
+ aria.state.pressed =
+ attribute aria-pressed
+ { string "true"
+ | string "false"
+ | string "mixed"
+ | string "undefined" #default
+ }
+
+## selected
+ aria.state.selected =
+ attribute aria-selected
+ { string "true"
+ | string "false"
+ | string "undefined" #default
+ }
+
+
+
+# #####################################################################
+## Properties
+
+## activedescendant
+ aria.prop.activedescendant =
+ attribute aria-activedescendant {
+ common.data.idref #REVISIT add Schematron check
+ }
+
+## atomic
+ aria.prop.atomic =
+ attribute aria-atomic
+ { string "true"
+ | string "false" #default
+ }
+
+## autocomplete
+ aria.prop.autocomplete =
+ attribute aria-autocomplete
+ { string "inline"
+ | string "list"
+ | string "both"
+ | string "none" #default
+ }
+
+## controls
+ aria.prop.controls =
+ attribute aria-controls {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## describedby
+ aria.prop.describedby =
+ attribute aria-describedby {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## flowto
+ aria.prop.flowto =
+ attribute aria-flowto {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## haspopup
+ aria.prop.haspopup =
+ attribute aria-haspopup
+ { string "true" #REVISIT check owns or descendant
+ | string "false" #default
+ }
+
+## label
+ aria.prop.label =
+ attribute aria-label {
+ string
+ }
+
+## labelledby
+ aria.prop.labelledby =
+ attribute aria-labelledby {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## level
+ aria.prop.level =
+ attribute aria-level {
+ common.data.integer.positive
+ }
+
+## live
+ aria.prop.live =
+ attribute aria-live
+ { string "off" #default
+ | string "polite"
+ | string "assertive"
+ }
+
+## multiline
+ aria.prop.multiline =
+ attribute aria-multiline
+ { string "true"
+ | string "false" #default
+ }
+
+## multiselectable
+ aria.prop.multiselectable =
+ attribute aria-multiselectable
+ { string "true"
+ | string "false" #default
+ }
+
+## orientation
+ aria.prop.orientation =
+ attribute aria-orientation
+ { string "vertical"
+ | string "horizontal" #default
+ }
+
+## owns
+ aria.prop.owns =
+ attribute aria-owns {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## posinset
+ aria.prop.posinset =
+ attribute aria-posinset {
+ common.data.integer.positive
+ }
+
+## readonly
+ aria.prop.readonly =
+ attribute aria-readonly
+ { string "true"
+ | string "false" #default
+ }
+ common.attrs.aria.prop.readonly |= aria.prop.readonly
+
+## relevant
+ aria.prop.relevant =
+ attribute aria-relevant
+ { token "all"
+ | list
+ { ( string "additions" )
+ , ( string "removals" )?
+ , ( string "text" )?
+ }
+ | list
+ { ( string "additions" )
+ , ( string "text" )?
+ , ( string "removals" )?
+ }
+ | list
+ { ( string "removals" )
+ , ( string "additions" )?
+ , ( string "text" )?
+ }
+ | list
+ { ( string "removals" )
+ , ( string "text" )?
+ , ( string "additions" )?
+ }
+ | list
+ { ( string "text" )
+ , ( string "additions" )?
+ , ( string "removals" )?
+ }
+ | list
+ { ( string "text" )
+ , ( string "removals" )?
+ , ( string "additions" )?
+ }
+ }
+
+## required
+ aria.prop.required =
+ attribute aria-required
+ { string "true"
+ | string "false" #default
+ }
+
+## setsize
+ aria.prop.setsize =
+ attribute aria-setsize {
+ common.data.integer.non-negative
+ }
+
+## sort
+ aria.prop.sort =
+ attribute aria-sort
+ { string "ascending"
+ | string "descending"
+ | string "none" #default
+ | string "other"
+ }
+
+## valuemax
+ aria.prop.valuemax =
+ attribute aria-valuemax {
+ common.data.float #REVISIT
+ }
+
+## valuemin
+ aria.prop.valuemin =
+ attribute aria-valuemin {
+ common.data.float #REVISIT
+ }
+
+## valuenow
+ aria.prop.valuenow =
+ attribute aria-valuenow {
+ common.data.float #REVISIT
+ }
+
+## valuetext
+ aria.prop.valuetext =
+ attribute aria-valuetext {
+ string
+ }
+
+# #####################################################################
+## Roles
+
+## alert
+ aria.alert =
+ ( aria.role.alert
+ & aria.state.expanded?
+ )
+ aria.role.alert =
+ attribute role { string "alert" }
+
+ common.attrs.aria |= aria.alert
+ common.attrs.aria.role.alert |= aria.alert
+
+## alertdialog
+ aria.alertdialog =
+ ( aria.role.alertdialog
+ & aria.state.expanded?
+ )
+ aria.role.alertdialog =
+ attribute role { string "alertdialog" }
+
+ common.attrs.aria |= aria.alertdialog
+ common.attrs.aria.role.alertdialog |= aria.alertdialog
+
+## application
+ aria.application =
+ ( aria.role.application
+ & aria.state.expanded?
+ )
+ aria.role.application =
+ attribute role { string "application" }
+
+ common.attrs.aria |= aria.application
+ common.attrs.aria.landmark.application |= aria.application
+
+## article
+ aria.article =
+ ( aria.role.article
+ & aria.state.expanded?
+ )
+ aria.role.article =
+ attribute role { string "article" }
+
+ common.attrs.aria |= aria.article
+ common.attrs.aria.landmark.article |= aria.article
+
+## banner
+ aria.banner =
+ ( aria.role.banner
+ & aria.state.expanded?
+ )
+ aria.role.banner =
+ attribute role { string "banner" }
+
+ common.attrs.aria |= aria.banner
+ common.attrs.aria.landmark.banner |= aria.banner
+
+## button
+ aria.button =
+ ( aria.role.button
+ & aria.state.expanded?
+ & aria.state.pressed? # not inherited
+ )
+ aria.role.button =
+ attribute role { string "button" }
+
+ common.attrs.aria |= aria.button
+ common.attrs.aria.role.button |= aria.button
+
+## checkbox
+ aria.checkbox =
+ ( aria.role.checkbox
+ & aria.state.checked #required!
+ )
+ aria.role.checkbox =
+ attribute role { string "checkbox" }
+
+ common.attrs.aria |= aria.checkbox
+ common.attrs.aria.role.checkbox |= aria.checkbox
+
+# columnheader
+ aria.columnheader =
+ ( aria.role.columnheader
+ & aria.prop.sort? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.columnheader =
+ attribute role { string "columnheader" }
+
+ common.attrs.aria |= aria.columnheader
+
+## combobox
+ aria.combobox =
+ ( aria.role.combobox
+ & aria.prop.activedescendant?
+ & aria.state.expanded #required!
+ & aria.prop.autocomplete?
+ & aria.prop.required?
+ )
+ aria.role.combobox =
+ attribute role { string "combobox" }
+
+ common.attrs.aria |= aria.combobox
+ common.attrs.aria.role.combobox |= aria.combobox
+
+## complementary
+ aria.complementary =
+ ( aria.role.complementary
+ & aria.state.expanded?
+ )
+ aria.role.complementary =
+ attribute role { string "complementary" }
+
+ common.attrs.aria |= aria.complementary
+ common.attrs.aria.landmark.complementary |= aria.complementary
+
+## contentinfo
+ aria.contentinfo =
+ ( aria.role.contentinfo
+ & aria.state.expanded?
+ )
+ aria.role.contentinfo =
+ attribute role { string "contentinfo" }
+
+ common.attrs.aria |= aria.contentinfo
+ common.attrs.aria.landmark.contentinfo |= aria.contentinfo
+
+## definition
+ aria.definition =
+ ( aria.role.definition
+ & aria.state.expanded?
+ )
+ aria.role.definition =
+ attribute role { string "definition" }
+
+ common.attrs.aria |= aria.definition
+
+## dialog
+ aria.dialog =
+ ( aria.role.dialog
+ & aria.state.expanded?
+ )
+ aria.role.dialog =
+ attribute role { string "dialog" }
+
+ common.attrs.aria |= aria.dialog
+ common.attrs.aria.role.dialog |= aria.dialog
+
+## directory
+ aria.directory =
+ ( aria.role.directory
+ & aria.state.expanded?
+ )
+ aria.role.directory =
+ attribute role { string "directory" }
+
+ common.attrs.aria |= aria.directory
+ common.attrs.aria.role.directory |= aria.directory
+
+## document
+ aria.document =
+ ( aria.role.document
+ & aria.state.expanded?
+ )
+ aria.role.document =
+ attribute role { string "document" }
+
+ common.attrs.aria |= aria.document
+ common.attrs.aria.landmark.document |= aria.document
+
+## form
+ aria.form =
+ ( aria.role.form
+ & aria.state.expanded?
+ )
+ aria.role.form =
+ attribute role { string "form" }
+
+ common.attrs.aria |= aria.form
+ common.attrs.aria.landmark.form |= aria.form
+
+## grid
+ aria.grid =
+ ( aria.role.grid
+ & aria.prop.level? # not inherited
+ & aria.prop.multiselectable? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.grid =
+ attribute role { string "grid" }
+
+ common.attrs.aria |= aria.grid
+
+## gridcell
+ aria.gridcell =
+ ( aria.role.gridcell
+ & aria.prop.level? # net inherited
+ & aria.prop.readonly? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.gridcell =
+ attribute role { string "gridcell" }
+
+ common.attrs.aria |= aria.gridcell
+
+## group
+ aria.group =
+ ( aria.role.group
+ & aria.prop.activedescendant? # not inherited
+ & aria.state.expanded? # not inherited
+ )
+ aria.role.group =
+ attribute role { string "group" }
+
+ common.attrs.aria |= aria.group
+ common.attrs.aria.role.group |= aria.group
+
+## heading
+ aria.heading =
+ ( aria.role.heading
+ & aria.prop.level ? # not inherited
+ & aria.state.expanded?
+ )
+ aria.role.heading =
+ attribute role { string "heading" }
+
+ common.attrs.aria |= aria.heading
+ common.attrs.aria.role.heading |= aria.heading
+
+## img
+ aria.img =
+ ( aria.role.img
+ & aria.state.expanded?
+ )
+ aria.role.img =
+ attribute role { string "img" }
+
+ common.attrs.aria |= aria.img
+ common.attrs.aria.role.img |= aria.img
+
+## link
+ aria.link =
+ ( aria.role.link
+ & aria.state.expanded?
+ )
+ aria.role.link =
+ attribute role { string "link" }
+
+ common.attrs.aria |= aria.link
+ common.attrs.aria.role.link |= aria.link
+
+## list
+ aria.list =
+ ( aria.role.list
+ & aria.state.expanded?
+ )
+ aria.role.list =
+ attribute role { string "list" }
+
+ common.attrs.aria |= aria.list
+ common.attrs.aria.role.list |= aria.list
+
+## listbox
+ aria.listbox =
+ ( aria.role.listbox
+ & aria.prop.multiselectable? # not inherited
+ & aria.prop.required?
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.listbox =
+ attribute role { string "listbox" }
+
+ common.attrs.aria |= aria.listbox
+ common.attrs.aria.role.listbox |= aria.listbox
+
+## listitem
+ aria.listitem =
+ ( aria.role.listitem
+ & aria.prop.posinset? # not inherited
+ & aria.prop.setsize? # not inherited
+ & aria.prop.level? # not inherited
+ & aria.state.expanded?
+ )
+ aria.role.listitem =
+ attribute role { string "listitem" }
+
+ common.attrs.aria |= aria.listitem
+ common.attrs.aria.role.listitem |= aria.listitem
+
+## log
+ aria.log =
+ ( aria.role.log
+ & aria.state.expanded?
+ )
+ aria.role.log =
+ attribute role { string "log" }
+
+ common.attrs.aria |= aria.log
+ common.attrs.aria.role.log |= aria.log
+
+## main
+ aria.main =
+ ( aria.role.main
+ & aria.state.expanded?
+ )
+ aria.role.main =
+ attribute role { string "main" }
+
+ common.attrs.aria |= aria.main
+ common.attrs.aria.landmark.main |= aria.main
+
+## marquee
+ aria.marquee =
+ ( aria.role.marquee
+ & aria.state.expanded?
+ )
+ aria.role.marquee =
+ attribute role { string "marquee" }
+
+ common.attrs.aria |= aria.marquee
+ common.attrs.aria.role.marquee |= aria.marquee
+
+## math
+ aria.math =
+ ( aria.role.math
+ & aria.state.expanded?
+ )
+ aria.role.math =
+ attribute role { string "math" }
+
+ common.attrs.aria |= aria.math
+
+## menu
+ aria.menu =
+ ( aria.role.menu
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.menu =
+ attribute role { string "menu" }
+
+ common.attrs.aria |= aria.menu
+ common.attrs.aria.role.menu |= aria.menu
+
+## menubar
+ aria.menubar =
+ ( aria.role.menubar
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.menubar =
+ attribute role { string "menubar" }
+
+ common.attrs.aria |= aria.menubar
+ common.attrs.aria.role.menubar |= aria.menubar
+
+
+## menuitem
+ aria.menuitem =
+ ( aria.role.menuitem )
+ aria.role.menuitem =
+ attribute role { string "menuitem" }
+
+ common.attrs.aria |= aria.menuitem
+ common.attrs.aria.role.menuitem |= aria.menuitem
+
+## menuitemcheckbox
+ aria.menuitemcheckbox =
+ ( aria.role.menuitemcheckbox
+ & aria.state.checked #required
+ )
+ aria.role.menuitemcheckbox =
+ attribute role { string "menuitemcheckbox" }
+
+ common.attrs.aria |= aria.menuitemcheckbox
+ common.attrs.aria.role.menuitemcheckbox |= aria.menuitemcheckbox
+
+## menuitemradio
+ aria.menuitemradio =
+ ( aria.role.menuitemradio
+ & aria.state.checked #required
+ & aria.state.selected?
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ )
+ aria.role.menuitemradio =
+ attribute role { string "menuitemradio" }
+
+ common.attrs.aria |= aria.menuitemradio
+ common.attrs.aria.role.menuitemradio |= aria.menuitemradio
+
+## navigation
+ aria.navigation =
+ ( aria.role.navigation
+ & aria.state.expanded?
+ )
+ aria.role.navigation =
+ attribute role { string "navigation" }
+
+ common.attrs.aria |= aria.navigation
+ common.attrs.aria.landmark.navigation |= aria.navigation
+
+## note
+ aria.note =
+ ( aria.role.note
+ & aria.state.expanded?
+ )
+ aria.role.note =
+ attribute role { string "note" }
+
+ common.attrs.aria |= aria.note
+ common.attrs.aria.landmark.note |= aria.note
+
+## option
+ aria.option =
+ ( aria.role.option
+ & aria.state.checked? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ )
+ aria.role.option =
+ attribute role { string "option" }
+
+ common.attrs.aria |= aria.option
+ common.attrs.aria.role.option |= aria.option
+
+
+## presentation
+ aria.presentation =
+ ( aria.role.presentation
+ & aria.state.expanded?
+ )
+ aria.role.presentation =
+ attribute role { string "presentation" }
+
+ common.attrs.aria |= aria.presentation
+ common.attrs.aria.role.presentation |= aria.presentation
+
+## progressbar
+ aria.progressbar =
+ ( aria.role.progressbar
+ & aria.prop.valuemax? # not inherited
+ & aria.prop.valuemin? # not inherited
+ & aria.prop.valuenow? # not inherited
+ & aria.prop.valuetext? # not inherited
+ )
+ aria.role.progressbar =
+ attribute role { string "progressbar" }
+
+ common.attrs.aria |= aria.progressbar
+ common.attrs.aria.role.progressbar |= aria.progressbar
+
+## radio
+ aria.radio =
+ ( aria.role.radio
+ & aria.state.checked #required!
+ & aria.state.selected?
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ )
+ aria.role.radio =
+ attribute role { string "radio" }
+
+ common.attrs.aria |= aria.radio
+ common.attrs.aria.role.radio |= aria.radio
+
+## radiogroup
+ aria.radiogroup =
+ ( aria.role.radiogroup
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.radiogroup =
+ attribute role { string "radiogroup" }
+
+ common.attrs.aria |= aria.radiogroup
+
+## region
+ aria.region =
+ ( aria.role.region
+ & aria.state.expanded?
+ )
+ aria.role.region =
+ attribute role { string "region" }
+
+ common.attrs.aria |= aria.region
+ common.attrs.aria.role.region |= aria.region
+
+## row
+ aria.row =
+ ( aria.role.row
+ & aria.prop.level? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.row =
+ attribute role { string "row" }
+
+ common.attrs.aria |= aria.row
+
+## rowgroup
+ aria.rowgroup =
+ ( aria.role.rowgroup
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.rowgroup =
+ attribute role { string "rowgroup" }
+
+ common.attrs.aria |= aria.rowgroup
+
+# rowheader
+ aria.rowheader =
+ ( aria.role.rowheader
+ & aria.prop.sort? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.rowheader =
+ attribute role { string "rowheader" }
+
+ common.attrs.aria |= aria.rowheader
+
+## scrollbar
+ aria.scrollbar =
+ ( aria.role.scrollbar
+ & aria.prop.orientation
+ & aria.prop.valuemax
+ & aria.prop.valuemin
+ & aria.prop.valuenow
+ & aria.prop.valuetext?
+ )
+ aria.role.scrollbar =
+ attribute role { string "scrollbar" }
+
+ common.attrs.aria |= aria.scrollbar
+
+## search
+ aria.search =
+ ( aria.role.search
+ & aria.state.expanded?
+ )
+ aria.role.search =
+ attribute role { string "search" }
+
+ common.attrs.aria |= aria.search
+ common.attrs.aria.landmark.search |= aria.search
+
+## separator
+ aria.separator =
+ ( aria.role.separator
+ & aria.state.expanded?
+ & aria.prop.orientation?
+ )
+ aria.role.separator =
+ attribute role { string "separator" }
+
+ common.attrs.aria |= aria.separator
+ common.attrs.aria.role.separator |= aria.separator
+
+## slider
+ aria.slider =
+ ( aria.role.slider
+ & aria.prop.valuemax
+ & aria.prop.valuemin
+ & aria.prop.valuenow
+ & aria.prop.valuetext?
+ & aria.prop.orientation?
+ )
+ aria.role.slider =
+ attribute role { string "slider" }
+
+ common.attrs.aria |= aria.slider
+ common.attrs.aria.role.slider |= aria.slider
+
+## spinbutton
+ aria.spinbutton =
+ ( aria.role.spinbutton
+ & aria.prop.valuemax
+ & aria.prop.valuemin
+ & aria.prop.valuenow
+ & aria.prop.valuetext?
+ & aria.prop.required?
+ )
+ aria.role.spinbutton =
+ attribute role { string "spinbutton" }
+
+ common.attrs.aria |= aria.spinbutton
+ common.attrs.aria.role.spinbutton |= aria.spinbutton
+
+## status
+ aria.status =
+ ( aria.role.status
+ & aria.state.expanded?
+ )
+ aria.role.status =
+ attribute role { string "status" }
+
+ common.attrs.aria |= aria.status
+ common.attrs.aria.role.status |= aria.status
+
+## switch
+ aria.switch =
+ ( aria.role.switch
+ & aria.state.checked #required!
+ )
+ aria.role.switch =
+ attribute role { string "switch" }
+
+ common.attrs.aria |= aria.switch
+ common.attrs.aria.role.switch |= aria.switch
+
+## tab
+ aria.tab =
+ ( aria.role.tab
+ & aria.state.selected?
+ & aria.state.expanded?
+ )
+ aria.role.tab =
+ attribute role { string "tab" }
+
+ common.attrs.aria |= aria.tab
+ common.attrs.aria.role.tab |= aria.tab
+
+## tablist
+ aria.tablist =
+ ( aria.role.tablist
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.level?
+ & aria.prop.multiselectable?
+ )
+ aria.role.tablist =
+ attribute role { string "tablist" }
+ common.attrs.aria |= aria.tablist
+ common.attrs.aria.role.tablist |= aria.tablist
+
+## tabpanel
+ aria.tabpanel =
+ ( aria.role.tabpanel
+ & aria.state.expanded?
+ )
+ aria.role.tabpanel =
+ attribute role { string "tabpanel" }
+
+ common.attrs.aria |= aria.tabpanel
+ common.attrs.aria.role.tabpanel |= aria.tabpanel
+
+## textbox
+ aria.textbox =
+ ( aria.role.textbox
+ & aria.prop.activedescendant?
+ & aria.prop.autocomplete? # not inherited
+ & aria.prop.multiline? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.prop.required?
+ )
+ aria.role.textbox =
+ attribute role { string "textbox" }
+
+ common.attrs.aria |= aria.textbox
+ common.attrs.aria.role.textbox |= aria.textbox
+
+## timer
+ aria.timer =
+ ( aria.role.timer
+ & aria.state.expanded?
+ )
+ aria.role.timer =
+ attribute role { string "timer" }
+
+ common.attrs.aria |= aria.timer
+
+## toolbar
+ aria.toolbar =
+ ( aria.role.toolbar
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.toolbar =
+ attribute role { string "toolbar" }
+
+ common.attrs.aria |= aria.toolbar
+ common.attrs.aria.role.toolbar |= aria.toolbar
+
+## tooltip
+ aria.tooltip =
+ ( aria.role.tooltip
+ & aria.state.expanded?
+ )
+ aria.role.tooltip =
+ attribute role { string "tooltip" }
+
+ common.attrs.aria |= aria.tooltip
+
+## tree
+ aria.tree =
+ ( aria.role.tree
+ & aria.prop.multiselectable? # not inherited
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.tree =
+ attribute role { string "tree" }
+
+ common.attrs.aria |= aria.tree
+ common.attrs.aria.role.tree |= aria.tree
+
+## treegrid
+ aria.treegrid =
+ ( aria.role.treegrid
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.level?
+ & aria.prop.multiselectable?
+ & aria.prop.readonly?
+ & aria.prop.required?
+ )
+ aria.role.treegrid =
+ attribute role { string "treegrid" }
+
+ common.attrs.aria |= aria.treegrid
+
+## treeitem
+ aria.treeitem =
+ ( aria.role.treeitem
+ & aria.state.checked?
+ & aria.state.expanded?
+ & aria.prop.level?
+ & aria.prop.posinset?
+ & aria.state.selected?
+ & aria.prop.setsize?
+ )
+ aria.role.treeitem =
+ attribute role { string "treeitem" }
+
+ common.attrs.aria |= aria.treeitem
+ common.attrs.aria.role.treeitem |= aria.treeitem