mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-07-30 04:23:11 +03:00
Made a mass of accessibility improvements
- Changed default focus styles - Updated dropdowns with keyboard navigation - Updated modals with esc exiting - Added accessibility attirbutes where needed - Made many more elements focusable - Updated hover effects of many items to also apply when focused within Related to #1320 and #1198
This commit is contained in:
@ -121,17 +121,7 @@
|
||||
|
||||
<hr class="primary-background">
|
||||
|
||||
<div dropdown class="dropdown-container">
|
||||
<div dropdown-toggle class="icon-list-item">
|
||||
<span>@icon('export')</span>
|
||||
<span>{{ trans('entities.export') }}</span>
|
||||
</div>
|
||||
<ul class="wide dropdown-menu">
|
||||
<li><a href="{{ $book->getUrl('/export/html') }}" target="_blank">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
|
||||
<li><a href="{{ $book->getUrl('/export/pdf') }}" target="_blank">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
|
||||
<li><a href="{{ $book->getUrl('/export/plaintext') }}" target="_blank">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
@include('partials.entity-export-menu', ['entity' => $book])
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
<div class="chapter-child-menu">
|
||||
<p chapter-toggle class="text-muted @if($bookChild->matchesOrContains($current)) open @endif">
|
||||
<button chapter-toggle type="button" aria-expanded="{{ $isOpen ? 'true' : 'false' }}" aria-label="{{ trans('common.profile_menu') }}"
|
||||
class="text-muted @if($isOpen) open @endif">
|
||||
@icon('caret-right') @icon('page') <span>{{ trans_choice('entities.x_pages', $bookChild->pages->count()) }}</span>
|
||||
</p>
|
||||
<ul class="sub-menu inset-list @if($bookChild->matchesOrContains($current)) open @endif">
|
||||
</button>
|
||||
<ul class="sub-menu inset-list @if($isOpen) open @endif" @if($isOpen) style="display: block;" @endif role="menu">
|
||||
@foreach($bookChild->pages as $childPage)
|
||||
<li class="list-item-page {{ $childPage->isA('page') && $childPage->draft ? 'draft' : '' }}">
|
||||
<li class="list-item-page {{ $childPage->isA('page') && $childPage->draft ? 'draft' : '' }}" role="presentation">
|
||||
@include('partials.entity-list-item-basic', ['entity' => $childPage, 'classes' => $current->matches($childPage)? 'selected' : '' ])
|
||||
</li>
|
||||
@endforeach
|
||||
|
@ -123,17 +123,7 @@
|
||||
|
||||
<hr class="primary-background"/>
|
||||
|
||||
<div dropdown class="dropdown-container">
|
||||
<div dropdown-toggle class="icon-list-item">
|
||||
<span>@icon('export')</span>
|
||||
<span>{{ trans('entities.export') }}</span>
|
||||
</div>
|
||||
<ul class="wide dropdown-menu">
|
||||
<li><a href="{{ $chapter->getUrl('/export/html') }}" target="_blank">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
|
||||
<li><a href="{{ $chapter->getUrl('/export/pdf') }}" target="_blank">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
|
||||
<li><a href="{{ $chapter->getUrl('/export/plaintext') }}" target="_blank">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
@include('partials.entity-export-menu', ['entity' => $chapter])
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
||||
|
@ -1,8 +1,8 @@
|
||||
<div class="comment-box mb-m" comment="{{ $comment->id }}" local-id="{{$comment->local_id}}" parent-id="{{$comment->parent_id}}" id="comment{{$comment->local_id}}">
|
||||
<div class="header p-s">
|
||||
<div class="grid half no-gap v-center">
|
||||
<div class="meta">
|
||||
<a href="#comment{{$comment->local_id}}" class="text-muted">#{{$comment->local_id}}</a>
|
||||
<div class="grid half left-focus no-gap v-center">
|
||||
<div class="meta text-muted text-small">
|
||||
<a href="#comment{{$comment->local_id}}">#{{$comment->local_id}}</a>
|
||||
|
||||
@if ($comment->createdBy)
|
||||
<img width="50" src="{{ $comment->createdBy->getAvatar(50) }}" class="avatar" alt="{{ $comment->createdBy->name }}">
|
||||
@ -21,17 +21,17 @@
|
||||
</div>
|
||||
<div class="actions text-right">
|
||||
@if(userCan('comment-update', $comment))
|
||||
<button type="button" class="text-button" action="edit" title="{{ trans('common.edit') }}">@icon('edit')</button>
|
||||
<button type="button" class="text-button" action="edit" aria-label="{{ trans('common.edit') }}" title="{{ trans('common.edit') }}">@icon('edit')</button>
|
||||
@endif
|
||||
@if(userCan('comment-create-all'))
|
||||
<button type="button" class="text-button" action="reply" title="{{ trans('common.reply') }}">@icon('reply')</button>
|
||||
<button type="button" class="text-button" action="reply" aria-label="{{ trans('common.reply') }}" title="{{ trans('common.reply') }}">@icon('reply')</button>
|
||||
@endif
|
||||
@if(userCan('comment-delete', $comment))
|
||||
<div dropdown class="dropdown-container">
|
||||
<button type="button" dropdown-toggle class="text-button" title="{{ trans('common.delete') }}">@icon('delete')</button>
|
||||
<ul class="dropdown-menu">
|
||||
<button type="button" dropdown-toggle aria-haspopup="true" aria-expanded="false" class="text-button" title="{{ trans('common.delete') }}">@icon('delete')</button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li class="px-m text-small text-muted pb-s">{{trans('entities.comment_delete_confirm')}}</li>
|
||||
<li><a action="delete" class="text-button text-neg" >@icon('delete'){{ trans('common.delete') }}</a></li>
|
||||
<li><a action="delete" href="#" class="text-button text-neg" >@icon('delete'){{ trans('common.delete') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
@ -16,8 +16,8 @@
|
||||
<div class="header-search hide-under-l">
|
||||
@if (hasAppAccess())
|
||||
<form action="{{ url('/search') }}" method="GET" class="search-box">
|
||||
<button id="header-search-box-button" type="submit" aria-label="{{ trans('common.search') }}">@icon('search') </button>
|
||||
<input id="header-search-box-input" type="text" name="term" tabindex="2"
|
||||
<button id="header-search-box-button" type="submit" aria-label="{{ trans('common.search') }}" tabindex="-1">@icon('search') </button>
|
||||
<input id="header-search-box-input" type="text" name="term"
|
||||
aria-label="{{ trans('common.search') }}" placeholder="{{ trans('common.search') }}"
|
||||
value="{{ isset($searchTerm) ? $searchTerm : '' }}">
|
||||
</form>
|
||||
@ -51,11 +51,12 @@
|
||||
@if(signedInUser())
|
||||
<?php $currentUser = user(); ?>
|
||||
<div class="dropdown-container" dropdown>
|
||||
<span class="user-name hide-under-l" dropdown-toggle>
|
||||
<span class="user-name py-s hide-under-l" dropdown-toggle
|
||||
aria-haspopup="true" aria-expanded="false" aria-label="{{ trans('common.profile_menu') }}" tabindex="0">
|
||||
<img class="avatar" src="{{$currentUser->getAvatar(30)}}" alt="{{ $currentUser->name }}">
|
||||
<span class="name">{{ $currentUser->getShortName(9) }}</span> @icon('caret-down')
|
||||
</span>
|
||||
<ul class="dropdown-menu">
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li>
|
||||
<a href="{{ url("/user/{$currentUser->id}") }}">@icon('user'){{ trans('common.view_profile') }}</a>
|
||||
</li>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<div id="code-editor">
|
||||
<div overlay ref="overlay" v-cloak @click="hide()">
|
||||
<div class="popup-body" @click.stop>
|
||||
<div class="popup-body" tabindex="-1" @click.stop>
|
||||
|
||||
<div class="popup-header primary-background">
|
||||
<div class="popup-title">{{ trans('components.code_editor') }}</div>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<div id="entity-selector-wrap">
|
||||
<div overlay entity-selector-popup>
|
||||
<div class="popup-body small">
|
||||
<div class="popup-body small" tabindex="-1">
|
||||
<div class="popup-header primary-background">
|
||||
<div class="popup-title">{{ trans('entities.entity_select') }}</div>
|
||||
<button type="button" class="popup-header-close">x</button>
|
||||
|
@ -3,13 +3,13 @@ $target - CSS selector of items to expand
|
||||
$key - Unique key for checking existing stored state.
|
||||
--}}
|
||||
<?php $isOpen = setting()->getForCurrentUser('section_expansion#'. $key); ?>
|
||||
<a expand-toggle="{{ $target }}"
|
||||
<button type="button" expand-toggle="{{ $target }}"
|
||||
expand-toggle-update-endpoint="{{ url('/settings/users/'. $currentUser->id .'/update-expansion-preference/' . $key) }}"
|
||||
expand-toggle-is-open="{{ $isOpen ? 'yes' : 'no' }}"
|
||||
class="text-muted icon-list-item text-primary">
|
||||
<span>@icon('expand-text')</span>
|
||||
<span>{{ trans('common.toggle_details') }}</span>
|
||||
</a>
|
||||
</button>
|
||||
@if($isOpen)
|
||||
@push('head')
|
||||
<style>
|
||||
|
@ -9,7 +9,7 @@
|
||||
])
|
||||
|
||||
<div overlay v-cloak @click="hide">
|
||||
<div class="popup-body" @click.stop="">
|
||||
<div class="popup-body" tabindex="-1" @click.stop>
|
||||
|
||||
<div class="popup-header primary-background">
|
||||
<div class="popup-title">{{ trans('components.image_select') }}</div>
|
||||
|
@ -26,9 +26,9 @@
|
||||
|
||||
<div class="text-center px-m py-xs">
|
||||
<div v-show="draftsEnabled" dropdown dropdown-move-menu class="dropdown-container draft-display text">
|
||||
<a dropdown-toggle class="text-primary text-button"><span class="faded-text" v-text="draftText"></span> @icon('more')</a>
|
||||
<a dropdown-toggle aria-haspopup="true" aria-expanded="false" title="{{ trans('entities.pages_edit_draft_options') }}" class="text-primary text-button"><span class="faded-text" v-text="draftText"></span> @icon('more')</a>
|
||||
@icon('check-circle', ['class' => 'text-pos draft-notification svg-icon', ':class' => '{visible: draftUpdated}'])
|
||||
<ul class="dropdown-menu">
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li>
|
||||
<a @click="saveDraft()" class="text-pos">@icon('save'){{ trans('entities.pages_edit_save_draft') }}</a>
|
||||
</li>
|
||||
|
@ -50,10 +50,9 @@
|
||||
@else
|
||||
<a href="{{ $revision->getUrl() }}" target="_blank">{{ trans('entities.pages_revisions_preview') }}</a>
|
||||
<span class="text-muted"> | </span>
|
||||
<a href="{{ $revision->getUrl('restore') }}"></a>
|
||||
<div dropdown class="dropdown-container">
|
||||
<a dropdown-toggle>{{ trans('entities.pages_revisions_restore') }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<a dropdown-toggle href="#" aria-haspopup="true" aria-expanded="false">{{ trans('entities.pages_revisions_restore') }}</a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li class="px-m py-s"><small class="text-muted">{{trans('entities.revision_restore_confirm')}}</small></li>
|
||||
<li>
|
||||
<form action="{{ $revision->getUrl('/restore') }}" method="POST">
|
||||
@ -66,8 +65,8 @@
|
||||
</div>
|
||||
<span class="text-muted"> | </span>
|
||||
<div dropdown class="dropdown-container">
|
||||
<a dropdown-toggle>{{ trans('common.delete') }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<a dropdown-toggle href="#" aria-haspopup="true" aria-expanded="false">{{ trans('common.delete') }}</a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li class="px-m py-s"><small class="text-muted">{{trans('entities.revision_delete_confirm')}}</small></li>
|
||||
<li>
|
||||
<form action="{{ $revision->getUrl('/delete/') }}" method="POST">
|
||||
|
@ -158,17 +158,7 @@
|
||||
<hr class="primary-background"/>
|
||||
|
||||
{{--Export--}}
|
||||
<div dropdown class="dropdown-container block">
|
||||
<div dropdown-toggle class="icon-list-item">
|
||||
<span>@icon('export')</span>
|
||||
<span>{{ trans('entities.export') }}</span>
|
||||
</div>
|
||||
<ul class="dropdown-menu wide">
|
||||
<li><a href="{{ $page->getUrl('/export/html') }}" target="_blank">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
|
||||
<li><a href="{{ $page->getUrl('/export/pdf') }}" target="_blank">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
|
||||
<li><a href="{{ $page->getUrl('/export/plaintext') }}" target="_blank">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
@include('partials.entity-export-menu', ['entity' => $page])
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -14,11 +14,13 @@
|
||||
|
||||
@if($bookChild->isA('chapter') && count($bookChild->pages) > 0)
|
||||
<div class="entity-list-item no-hover">
|
||||
<span class="icon text-chapter">
|
||||
|
||||
</span>
|
||||
<span role="presentation" class="icon text-chapter"></span>
|
||||
<div class="content">
|
||||
@include('chapters.child-menu', ['chapter' => $bookChild, 'current' => $current])
|
||||
@include('chapters.child-menu', [
|
||||
'chapter' => $bookChild,
|
||||
'current' => $current,
|
||||
'isOpen' => $bookChild->matchesOrContains($current)
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -1,11 +1,12 @@
|
||||
<div class="breadcrumb-listing" dropdown breadcrumb-listing="{{ $entity->getType() }}:{{ $entity->id }}">
|
||||
<div class="breadcrumb-listing-toggle" dropdown-toggle>
|
||||
<div class="breadcrumb-listing-toggle" dropdown-toggle
|
||||
aria-haspopup="true" aria-expanded="false" tabindex="0">
|
||||
<div class="separator">@icon('chevron-right')</div>
|
||||
</div>
|
||||
<div dropdown-menu class="breadcrumb-listing-dropdown card">
|
||||
<div dropdown-menu class="breadcrumb-listing-dropdown card" role="menu">
|
||||
<div class="breadcrumb-listing-search">
|
||||
@icon('search')
|
||||
<input autocomplete="off" type="text" name="entity-search">
|
||||
<input autocomplete="off" type="text" name="entity-search" placeholder="{{ trans('common.search') }}" aria-label="{{ trans('common.search') }}">
|
||||
</div>
|
||||
@include('partials.loading-icon')
|
||||
<div class="breadcrumb-listing-entity-list px-m"></div>
|
||||
|
@ -1,7 +1,8 @@
|
||||
<div class="mb-xl">
|
||||
<form v-on:submit.prevent="searchBook" class="search-box flexible">
|
||||
<input v-model="searchTerm" v-on:change="checkSearchForm" type="text" name="term" placeholder="{{ trans('entities.books_search_this') }}">
|
||||
<button type="submit">@icon('search')</button>
|
||||
<button v-if="searching" v-cloak class="search-box-cancel text-neg" v-on:click="clearSearch" type="button">@icon('close')</button>
|
||||
<input v-model="searchTerm" v-on:change="checkSearchForm" type="text" aria-label="{{ trans('entities.books_search_this') }}" name="term" placeholder="{{ trans('entities.books_search_this') }}">
|
||||
<button type="submit" aria-label="{{ trans('common.search') }}">@icon('search')</button>
|
||||
<button v-if="searching" v-cloak class="search-box-cancel text-neg" v-on:click="clearSearch"
|
||||
type="button" aria-label="{{ trans('common.search_clear') }}">@icon('close')</button>
|
||||
</form>
|
||||
</div>
|
12
resources/views/partials/entity-export-menu.blade.php
Normal file
12
resources/views/partials/entity-export-menu.blade.php
Normal file
@ -0,0 +1,12 @@
|
||||
<div dropdown class="dropdown-container" >
|
||||
<div dropdown-toggle class="icon-list-item"
|
||||
aria-haspopup="true" aria-expanded="false" aria-label="{{ trans('entities.export') }}" tabindex="0">
|
||||
<span>@icon('export')</span>
|
||||
<span>{{ trans('entities.export') }}</span>
|
||||
</div>
|
||||
<ul class="wide dropdown-menu" role="menu">
|
||||
<li><a href="{{ $entity->getUrl('/export/html') }}" target="_blank">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
|
||||
<li><a href="{{ $entity->getUrl('/export/pdf') }}" target="_blank">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
|
||||
<li><a href="{{ $entity->getUrl('/export/plaintext') }}" target="_blank">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
|
||||
</ul>
|
||||
</div>
|
@ -1,6 +1,6 @@
|
||||
<?php $type = $entity->getType(); ?>
|
||||
<a href="{{ $entity->getUrl() }}" class="{{$type}} {{$type === 'page' && $entity->draft ? 'draft' : ''}} {{$classes ?? ''}} entity-list-item" data-entity-type="{{$type}}" data-entity-id="{{$entity->id}}">
|
||||
<span class="icon text-{{$type}}">@icon($type)</span>
|
||||
<span role="presentation" class="icon text-{{$type}}">@icon($type)</span>
|
||||
<div class="content">
|
||||
<h4 class="entity-list-item-name break-text">{{ $entity->name }}</h4>
|
||||
{{ $slot ?? '' }}
|
||||
|
@ -13,16 +13,17 @@
|
||||
|
||||
<div class="list-sort">
|
||||
<div class="list-sort-type dropdown-container" dropdown>
|
||||
<div dropdown-toggle>{{ $options[$selectedSort] }}</div>
|
||||
<div dropdown-toggle aria-haspopup="true" aria-expanded="false" aria-label="{{ trans('common.sort_options') }}" tabindex="0">{{ $options[$selectedSort] }}</div>
|
||||
<ul class="dropdown-menu">
|
||||
@foreach($options as $key => $label)
|
||||
<li @if($key === $selectedSort) class="active" @endif><a href="#" data-sort-value="{{$key}}">{{ $label }}</a></li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
<div class="list-sort-dir" data-sort-dir>
|
||||
<button href="#" class="list-sort-dir" type="button" data-sort-dir
|
||||
aria-label="{{ trans('common.sort_direction_toggle') }} - {{ $order === 'asc' ? trans('common.sort_ascending') : trans('common.sort_descending') }}" tabindex="0">
|
||||
@icon($order === 'desc' ? 'sort-up' : 'sort-down')
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
Reference in New Issue
Block a user