>>
<$linkcatcher to="!!type">
<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>
-
+
<$text text={{!!group}}/>
+
<$set name="userInput" value={{{ [get[text]] }}}>
-<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] :and[sort[description]] :and[removeprefix[$:/language/Docs/Types/]] :and[search]">addsuffix[-primaryList]] :except[get[text]] :and[then[]else[tc-list-item-selected]] }}}><$link to={{{ [addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [addprefix[$:/language/Docs/Types/]] }}} field="description"/><$text text=" "/>(<$view tiddler={{{ [addprefix[$:/language/Docs/Types/]] }}} field="name"/>)$link>
+<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] :and[sort[description]] :and[removeprefix[$:/language/Docs/Types/]] :and[search]">addsuffix[-primaryList]] :except[get[text]] :and[then[]else[tc-list-item-selected]] }}}><$link role="option" to={{{ [addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [addprefix[$:/language/Docs/Types/]] }}} field="description"/><$text text=" "/>(<$view tiddler={{{ [addprefix[$:/language/Docs/Types/]] }}} field="name"/>)$link>
$list>
$set>
+
$list>
$linkcatcher>
diff --git a/core/wiki/macros/keyboard-driven-input.tid b/core/wiki/macros/keyboard-driven-input.tid
index a514f4c13..9893a60c3 100644
--- a/core/wiki/macros/keyboard-driven-input.tid
+++ b/core/wiki/macros/keyboard-driven-input.tid
@@ -145,3 +145,32 @@ tags: $:/tags/Macro
/>
$keyboard>
\end keyboard-driven-input
+
+\procedure keyboard-driven-input-aria(tiddler,storeTitle,field:"text",index:"",tag:"input",type,focus:"",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:"",default:"",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:"0",refreshTitle,selectionStateTitle,cancelPopups:"",configTiddlerFilter,firstSearchFilterField:"first-search-filter",secondSearchFilterField:"second-search-filter",role:"combobox",ariaAutocomplete,ariaControls)
+\whitespace trim
+\procedure keyboard-driven-input-actions()
+<%if [
match[((input-accept))]] %>
+<>
+<%elseif [match[((input-accept-variant))]] %>
+<>
+<%elseif [match[((input-up))]] %>
+<>
+<%elseif [match[((input-down))]] %>
+<>
+<%elseif [match[((input-cancel))]] %>
+<>
+<%endif%>
+\end keyboard-driven-input-actions
+
+<$keyboard key="((input-accept)) ((input-accept-variant)) ((input-up)) ((input-down)) ((input-cancel))" actions=<>>
+ <$edit-text
+ tiddler=<> field=<> index=<>
+ inputActions=<> tag=<> class=<>
+ placeholder=<> default=<> focusPopup=<>
+ focus=<> type=<> rows=<> minHeight=<>
+ tabindex=<> size=<> autoHeight=<>
+ refreshTitle=<> cancelPopups=<>
+ role=<> aria-autocomplete=<> aria-controls=<>
+ />
+$keyboard>
+\end keyboard-driven-input-aria
\ No newline at end of file
diff --git a/editions/tw5.com/tiddlers/releasenotes/5.4.0/leilei332-combobox-a11y.tid b/editions/tw5.com/tiddlers/releasenotes/5.4.0/leilei332-combobox-a11y.tid
new file mode 100644
index 000000000..5be44b44e
--- /dev/null
+++ b/editions/tw5.com/tiddlers/releasenotes/5.4.0/leilei332-combobox-a11y.tid
@@ -0,0 +1,9 @@
+title: $:/changenotes/5.4.0/#9468
+description: Improve combobox accessibility
+release: 5.4.0
+tags: $:/tags/ChangeNote
+change-type: enhancement
+change-category: usability
+github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9468
+github-contributors: Leilei332
+