This commit is contained in:
ken 2026-09-03 17:57:32 +08:00
parent b2a2c1fcf3
commit c1ddde3e9b
57 changed files with 422 additions and 174 deletions

View File

@ -515,20 +515,28 @@
});
//播放驗證碼語音
$(function () {
$('.ask-question')
.find('.controls button.fas.fa-volume-up')
.each(function () {
const $btn = $(this);
var pageLang = ($('html').attr('lang') || 'zh-Hant').toLowerCase();
var isEn = pageLang.startsWith('en');
var label = isEn ? 'Play Captcha Voice' : '播放驗證碼語音';
// 已經補過就不重複處理
if ($btn.attr('aria-label')) return;
$('.ask-question')
.find('.controls button.fas.fa-volume-up')
.each(function () {
var $btn = $(this);
$btn.attr({
'aria-label': '播放驗證碼語音',
'aria-controls': 'captcha_audio',
'role': 'button'
});
});
$btn.attr({
'aria-label': label,
'title': label,
'aria-controls': 'captcha_audio',
'role': 'button'
});
// ✅ 同步更新 sr-only 文字(若有)
var $sr = $btn.find('.sr-only');
if ($sr.length > 0) {
$sr.text(label);
}
});
});
//刪除td的id
@ -899,7 +907,7 @@
var isLinkImage = $parentA.length > 0 && $parentA.text().replace(/\u00a0/g, '').trim() === "";
// --- 1. 處理「裝飾性圖片」標註 ---
if (currentAlt === "announcement image" || currentAlt === "裝飾圖片" || currentTitle === "裝飾圖片" || currentAlt === "這是一張圖片" || currentTitle === "這是一張圖片") {
if (currentAlt === "announcement image" || currentAlt === "裝飾圖片" || currentTitle === "裝飾圖片" || currentAlt === "這是一張圖片" || currentTitle === "這是一張圖片"||currentAlt === "This is a image" ||currentTitle === "This is a image"){
$img.attr('alt', '');
$img.removeAttr('title');
return;
@ -1101,56 +1109,59 @@ $(function() {
}
}
// E. 重新計算標題 (關鍵邏輯:若 hasOriginalTitle 為真,則不進入此區塊)
if (!hasOriginalTitle) {
if (linkText === "" && $img.length > 0) {
var rawAlt = ($img.attr('alt') || '').trim();
var forbidden = ['這是一張圖片', '圖片', 'image', 'photo', '圖', ''];
var imgAlt = forbidden.some(function(txt) { return rawAlt.toLowerCase() === txt; })
? ($a.attr('aria-label') || i18n.link) : rawAlt;
var fileInfo = fileExt ? '[' + fileExt.toUpperCase() + '] ' : '';
$a.attr('title', (fileInfo + imgAlt + " " + windowTask).trim());
$img.attr('alt', imgAlt);
}
else if (linkText !== "") {
if (fileExt !== "" || hasBadSymbol || currentTitle === "" || currentTitle.includes('/uploads/')) {
if (fileExt !== "") {
$a.attr('title', linkText + " ." + fileExt + " " + windowTask);
} else {
$a.attr('title', windowTask);
}
// E. 重新計算標題 (關鍵邏輯:若 hasOriginalTitle 為真,則不進入此區塊)
if (!hasOriginalTitle) {
if (linkText === "" && $img.length > 0) {
var rawAlt = ($img.attr('alt') || '').trim();
var forbidden = ['這是一張圖片', '圖片', 'image', 'photo', '圖', ''];
var imgAlt = forbidden.some(function(txt) { return rawAlt.toLowerCase() === txt; })
? ($a.attr('aria-label') || i18n.link) : rawAlt;
var fileInfo = fileExt ? '[' + fileExt.toUpperCase() + '] ' : '';
$a.attr('title', (fileInfo + imgAlt + " " + windowTask).trim());
$img.attr('alt', imgAlt);
}
else if (linkText !== "") {
if (fileExt !== "" || hasBadSymbol || currentTitle === "" || currentTitle.includes('/uploads/')) {
if (fileExt !== "") {
$a.attr('title', linkText + " ." + fileExt + " " + windowTask);
} else {
$a.attr('title', windowTask);
}
}
}
}
// ✅ 符合 HM1240404Etitle 不應與連結文字或圖片 alt 重複
if (hasOriginalTitle && currentTitle !== "") {
var titleWithoutWindow = currentTitle
.replace('(在本視窗開啟)', '')
.replace('(在新視窗開啟)', '')
.replace('Open in this window', '')
.replace('Open in new window', '')
.replace('另開新視窗前往', '')
.replace('另開新視窗', '')
.trim();
// ✅ 符合 HM1240404Etitle 不應與連結文字或圖片 alt 重複
if (hasOriginalTitle && currentTitle !== "") {
var titleWithoutWindow = currentTitle
.replace('(在本視窗開啟)', '')
.replace('(在新視窗開啟)', '')
.replace('Open in this window', '')
.replace('Open in new window', '')
.replace('另開新視窗前往', '')
.replace('另開新視窗', '')
.trim();
// ✅ title 去掉開窗字串後,若與連結文字或圖片原始 alt 相同,則只保留開窗提示
if (
(titleWithoutWindow === linkText && linkText !== i18n.link) ||
(imgAltOriginal !== '' && titleWithoutWindow === imgAltOriginal)
) {
$a.attr('title', windowTask);
}
// ✅ 最終清理:若 title 出現空括號 () 則移除並補上正確開窗提示
var finalTitle = ($a.attr('title') || '').trim();
if (finalTitle.includes('()')) {
finalTitle = finalTitle.replace(/\(\)/g, '').trim();
$a.attr('title', finalTitle + ' ' + windowTask);
}
// ✅ title 去掉開窗字串後,若與連結文字或圖片原始 alt 相同,則只保留開窗提示
// ✅ 新增:若 linkText 包含副檔名且 title 也是同樣檔名,也只保留開窗提示
if (
(titleWithoutWindow === linkText && linkText !== i18n.link) ||
(imgAltOriginal !== '' && titleWithoutWindow === imgAltOriginal) ||
(fileExt !== '' && linkText.toLowerCase().endsWith('.' + fileExt) && titleWithoutWindow === linkText)
) {
$a.attr('title', windowTask);
return; // ✅ 加上 return避免繼續執行後面的清理邏輯造成二次污染
}
// ✅ 最終清理:若 title 出現空括號 () 則移除並補上正確開窗提示
var finalTitle = ($a.attr('title') || '').trim();
if (finalTitle.includes('()')) {
finalTitle = finalTitle.replace(/\(\)/g, '').trim();
$a.attr('title', finalTitle + ' ' + windowTask);
}
}
// F. 最終清理:移除冗餘 label避免螢幕閱讀器唸兩次
$a.removeAttr('aria-label');
});
@ -1184,6 +1195,47 @@ $(function() {
fixAccessibilityAll();
}, 800);
});
// 修正漢堡選單按鈕無障礙
$(function() {
function fixNavbarToggleA11y() {
var isEn = $('html').attr('lang') === 'en';
var label = isEn ? '開啟或關閉導覽選單' : '開啟或關閉導覽選單';
$('.navbar-toggle').each(function() {
var $btn = $(this);
// 修正 title
$btn.attr('title', label);
// 修正 sr-only 文字(原本是 "Toggle navigation"
var $sr = $btn.find('.sr-only');
if ($sr.length) {
$sr.text(label);
} else {
$btn.prepend('<span class="sr-only">' + label + '</span>');
}
// 補上 aria-label
$btn.attr('aria-label', label);
// 補上 aria-expanded依據目前是否展開
if (!$btn.attr('aria-expanded')) {
var isExpanded = !$btn.hasClass('collapsed');
$btn.attr('aria-expanded', isExpanded ? 'true' : 'false');
}
// 點擊時同步更新 aria-expanded
$btn.off('click.navA11y').on('click.navA11y', function() {
setTimeout(function() {
var isExpanded = !$('.navbar-toggle').hasClass('collapsed');
$('.navbar-toggle').attr('aria-expanded', isExpanded ? 'true' : 'false');
}, 50);
});
});
}
setTimeout(fixNavbarToggleA11y, 500);
});
$(function() {
@ -2969,11 +3021,15 @@ $(document).ready(function () {
});
//post
$(document).ready(function () {
setTimeout(function () {
$('iframe.twitter-share-button, iframe.twitter-tweet-button').each(function () {
$(this).attr('title', '分享至 X 在新視窗開啟');
});
}, 1500);
setTimeout(function () {
var pageLang = ($('html').attr('lang') || 'zh-Hant').toLowerCase();
var isEn = pageLang.startsWith('en');
var title = isEn ? 'Share to X Open in new window' : '分享至 X 在新視窗開啟';
$('iframe.twitter-share-button, iframe.twitter-tweet-button').each(function () {
$(this).attr('title', title);
});
}, 1500);
});
$(function() {
function bindIframeFocus() {
@ -3214,4 +3270,82 @@ $(document).ready(function () {
// }
// });
//banner英文
$(function() {
function fixBannerA11yByLang() {
setTimeout(function() {
var pageLang = ($('html').attr('lang') || 'zh-Hant').toLowerCase();
var isEn = pageLang.startsWith('en');
var i18n = {
playControls: isEn ? 'Playback Controls' : '播放控制選項',
resume: isEn ? 'Play' : '繼續播放',
pause: isEn ? 'Pause' : '暫停播放',
prev: isEn ? 'Previous' : '上一張',
next: isEn ? 'Next' : '下一張',
slide: isEn ? 'Slide' : '第',
slideUnit: isEn ? '' : ' 張投影片'
};
$('.w-ba-banner').each(function() {
var $banner = $(this);
// ✅ 播放控制選項 radiogroup label
$banner.find('.controlplay').attr('aria-label', i18n.playControls);
// ✅ 繼續播放按鈕
$banner.find('.resume-slide').attr({
'aria-label': i18n.resume,
'title': i18n.resume
});
$banner.find('.resume-slide p').text(i18n.resume);
// ✅ 暫停播放按鈕
$banner.find('.pause-slide').attr({
'aria-label': i18n.pause,
'title': i18n.pause
});
$banner.find('.pause-slide p').text(i18n.pause);
// ✅ 上一張按鈕
$banner.find('.prev-button').attr('aria-label', i18n.prev);
// ✅ 下一張按鈕
$banner.find('.next-button').attr('aria-label', i18n.next);
// ✅ Pager 按鈕
var $slides = $banner.find('.w-ba-banner__slide');
$banner.find('.banner-pager button').each(function(index) {
var slideTitle = $slides.eq(index).data('cycle-title') || '';
var ariaLabel = isEn
? i18n.slide + ' ' + (index + 1) + (slideTitle ? ' ' + slideTitle : '')
: i18n.slide + (index + 1) + i18n.slideUnit + (slideTitle ? ' ' + slideTitle : '');
$(this).attr({
'aria-label': ariaLabel,
'title': ariaLabel
});
});
});
// ✅ Cycle2 初始化後也重新處理 Pager因為 pager 是動態產生的)
$('.w-ba-banner .cycle-slideshow').on('cycle-post-initialize cycle-after', function() {
var $banner = $(this).closest('.w-ba-banner');
var $slides = $banner.find('.w-ba-banner__slide');
$banner.find('.banner-pager button').each(function(index) {
var slideTitle = $slides.eq(index).data('cycle-title') || '';
var ariaLabel = isEn
? i18n.slide + ' ' + (index + 1) + (slideTitle ? ' ' + slideTitle : '')
: i18n.slide + (index + 1) + i18n.slideUnit + (slideTitle ? ' ' + slideTitle : '');
$(this).attr({
'aria-label': ariaLabel,
'title': ariaLabel
});
});
});
}, 800);
}
fixBannerA11yByLang();
});
}(jQuery, window));

View File

@ -4,7 +4,12 @@
@import "variables";
.fa-classic, .fa-regular, .fa-solid, .far, .fas ,.fa{
font-family: var(--fa-style-family, "FontAwesome");
font-family: "FontAwesome";
}
li#language-li {
@media(max-width:767px){
display: none !important;
}
}
#orbit-bar .orbit-bar-inner > label:focus, #orbit-bar .orbit-bar-inner > label.focus{
.orbit-bar-search-sign-language{
@ -26,16 +31,16 @@
}
}
}
label[for="open-orbit-login"] {
@media(max-width:768px){
display: none!important;
}
}
[accesskey="U"],[accesskey="W"]{
@media(max-width:768px){
color: #666!important;
}
}
// label[for="open-orbit-login"] {
// @media(max-width:768px){
// display: none!important;
// }
// }
// [accesskey="U"],[accesskey="W"]{
// @media(max-width:768px){
// color: #666!important;
// }
// }
.orbit-bar-inner{
[accesskey="U"]{
height: 40px;
@ -209,6 +214,6 @@ img{
// overflow-x: auto;
// }
// }
*[data-pp]>.editmode-ps>a, .admin-subpart-area .content>.editmode-ps>a{
position: !important;
}
input[type=checkbox]:focus {
outline: 0.3125em auto -webkit-focus-ring-color;
}

View File

@ -30,9 +30,11 @@ ul.button-mid{
}
}
}
ul.button-mid{
margin:0;
z-index: 201;
.button-mid {
position: absolute;
width: 100%;
height: 0;
top: 50%;
}
.banner-pager .active-slide button{
background: $theme-color-second!important;
@ -262,12 +264,12 @@ ul.button-mid{
width: 100%;
height: 100%;
}
.banner-pager {
right: 1em;
top: -2em;
z-index: 100;
display: none;
}
// .banner-pager {
// right: 1em;
// top: -2em;
// z-index: 100;
// display: none;
// }
.button-mid{
z-index: 101;
}
@ -385,12 +387,12 @@ ul.button-mid{
}
.banner-pager {
right: 1em;
top: -2em;
z-index: 100;
display: none;
}
// .banner-pager {
// right: 1em;
// top: -2em;
// z-index: 100;
// display: none;
// }
}
// Widget 3

View File

@ -2600,12 +2600,6 @@
.i-annc__entry-title {
margin-bottom: 0;
margin-top: 0;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
// clear: both;
}
.i-annc__title {
@ -2613,6 +2607,11 @@
color: $theme-color-main;
text-decoration: none;
@extend .i-title;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
&:hover {
color: $theme-color-second;
}

View File

@ -155,7 +155,7 @@
@extend .unity-title;
}
.link { background-color: #1368d4 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.txt { background-color: #3a8a40 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.txt { background-color: #2a7e31 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.xlsx { background-color: #9e3050 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.pdf { background-color: #2a7d36 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.docx { background-color: #5e46a0 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
@ -164,7 +164,7 @@
.jpg { background-color: #8f3333 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.zip { background-color: #8a6400 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.rar { background-color: #9e5000 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.xls { background-color: #3a8a40 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.xls { background-color: #2a7e31 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.odt { background-color: #767676 !important; margin-left: 0.5em; } /* 對比 4.6:1 */
.table>caption+thead>tr:first-child>td, .table>caption+thead>tr:first-child>th, .table>colgroup+thead>tr:first-child>td, .table>colgroup+thead>tr:first-child>th, .table>thead:first-child>tr:first-child>td, .table>thead:first-child>tr:first-child>th{
// border-top: 0.0625em solid #ddd;

View File

@ -47,20 +47,23 @@
</ul>
</div>
<script>
var flag = 1;
$('.pause-slide').click(function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle('pause');
});
$('.resume-slide').click(function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle('resume');
});
$('.next-button').off('click').on('click',function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle("next");
$('[data-subpart-id="{{subpart-id}}"] .pause-slide').click(function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle('pause');
$(this).addClass('active')
$(this).parents('.controlplay').eq(0).find('.resume-slide').removeClass('active')
});
$('[data-subpart-id="{{subpart-id}}"] .resume-slide').click(function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle('resume');
$(this).addClass('active')
$(this).parents('.controlplay').eq(0).find('.pause-slide').removeClass('active')
});
$('[data-subpart-id="{{subpart-id}}"] .next-button').click(function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle("next");
})
$('.prev-button').off('click').on('click',function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle("prev");
});
})
$('[data-subpart-id="{{subpart-id}}"] .prev-button').click(function(){
$(this).parent("ul").parent('.w-ba-banner').find(".cycle-slideshow").cycle("prev");
});
/* 修正點:處理 Pager 無障礙朗讀文字 */
$('.cycle-slideshow').on('cycle-post-initialize', function(event, optionHash) {
var $container = $(this).closest('.w-ba-banner');
@ -77,3 +80,23 @@
});
});
</script>
<style type="text/css">
.w-ba-banner .controlplay .resume-slide.active i{
color: #32D9C3;
}
.w-ba-banner .controlplay .pause-slide.active i{
color: #ff4500;
}
.w-ba-banner .controlplay{
width: auto;
}
.w-ba-banner .button-mid{
position: absolute;
width: 100%;
height: 0;
top: 50%;
}
.next-button,.prev-button{
cursor: pointer;
}
</style>

View File

@ -7,7 +7,7 @@
<div class="w-annc__img-wrap ">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__meta">

View File

@ -27,7 +27,7 @@
<li class="w-annc__item " >
<div class="w-annc__img-wrap bullseye" style="position:relative">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -22,7 +22,7 @@
<div class="w-annc__item">
<div class="w-annc__img-wrap">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="w-annc__content-wrap">
<div class="w-annc__meta">

View File

@ -9,7 +9,7 @@
<li class="w-annc__item col-sm-4">
<div class="w-annc__img-wrap">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__content-wrap">

View File

@ -6,7 +6,7 @@
<li class="w-annc__item row">
<div class="w-annc__img-wrap col-sm-4 bullseye">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__content-wrap col-sm-8">

View File

@ -9,7 +9,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye" >
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -27,7 +27,7 @@
<li class="w-annc__item">
<div class="w-annc__img-wrap bullseye" >
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -7,7 +7,7 @@
<div class="w-annc__img-wrap ">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__meta">

View File

@ -9,7 +9,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye" >
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -29,7 +29,7 @@
<li class="w-annc__item">
<div class="w-annc__img-wrap bullseye" >
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -7,7 +7,7 @@
<div class="w-annc__img-wrap ">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__content-wrap card">

View File

@ -24,7 +24,7 @@
<p class="w-annc__subtitle">{{subtitle}}</p>
</div>
<div class="w-annc__img-wrap col-sm-4 bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
</li>
</ul>

View File

@ -9,7 +9,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye" style="position:relative">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -3,7 +3,7 @@
<ul class="i-annc__list row" data-level="0" data-list="announcements">
<li class="i-annc__item rotate0">
<div class="i-annc__img-wrap bullseye">
<a href="{{link_to_show}}" alt="{{img_description}}" title="{{img_description}}">
<a href="{{link_to_show}}" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
</a>
</div>

View File

@ -2,9 +2,9 @@
<h3 class="i-annc__page-title"><span>{{page-title}}</span></h3>
<ul class="i-annc__list row" data-level="0" data-list="announcements">
<li class="i-annc__item col-md-3 col-sm-3">
<a href="{{link_to_show}}" alt="{{img_description}}" title="{{img_description}}">
<a href="{{link_to_show}}" title="{{img_description}}">
<div class="i-annc__img-wrap bullseye">
<img class="i-annc__img" src="{{img_src}}" alt="" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="i-annc__content-wrap">
<div class="i-annc__meta">

View File

@ -2,10 +2,10 @@
<h3 class="i-annc__page-title"><span>{{page-title}}</span></h3>
<ul class="i-annc__list" data-level="0" data-list="announcements">
<li class="i-annc__item row">
<a href="{{link_to_show}}" alt="{{img_description}}" title="{{img_description}}">
<a href="{{link_to_show}}" title="{{img_description}}">
<div class="i-annc__img-wrap col-sm-4">
<img class="i-annc__img" src="{{img_src}}" alt="" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="i-annc__content-wrap col-sm-8">

View File

@ -2,7 +2,7 @@
<h3 class="i-annc__page-title"><span>{{page-title}}</span></h3>
<ul class="i-annc__list" data-level="0" data-list="announcements">
<li class="i-annc__item row">
<a href="{{link_to_show}}" alt="{{img_description}}" title="{{img_description}}">
<a href="{{link_to_show}}" title="{{img_description}}">
<div class="i-annc__content-wrap col-sm-8">
<div class="i-annc__meta">
<span class="i-annc__status-wrap" data-list="statuses" data-level="1">
@ -23,7 +23,7 @@
<p class="i-annc__subtitle">{{subtitle}}</p>
</div>
<div class="i-annc__img-wrap col-sm-4">
<img class="i-annc__img" src="{{img_src}}" alt="" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
</a>
</li>

View File

@ -16,13 +16,12 @@
<span class="label status {{status-class}}">{{status}}</span>
</span>
<a href="{{archive-file-url}}" target="{{target}}" title="{{archive-title}}">
{{archive-title}}
</a>
<span class="i-archive-files-list" data-list="files" data-level="2">
<a href="{{file-url}}" class="i-archive-files-item" target="{{target}}" title="{{file-name}}" data-toggle="tooltip" data-placement="bottom">
{{archive-title}} <span class="i-archive-files-list" data-list="files" data-level="2">
<span class="i-archive-files-item">
<span class="label label-primary {{file-type}}">{{file-type}}</span>
</a>
</span>
</span>
</a>
</p>
<div class="archive-description">{{description}}</div>
</li>
@ -31,6 +30,93 @@
</div>
</div>
</div>
<script>
$(function() {
function fixArchive13TabA11y() {
setTimeout(function() {
var $tabList = $('.index-archive-13 .archive-categories[role="tablist"]');
if ($tabList.length === 0) return;
var $tabs = $tabList.find('a[role="tab"]');
// ✅ 補上每個 tab 的必要 ARIA 屬性
$tabs.each(function(i) {
var $tab = $(this);
var $li = $tab.closest('.nav-item');
var panelId = ($tab.attr('href') || '').replace('#', '');
var tabId = panelId + '-tab';
// 補上 id 供 tabpanel 的 aria-labelledby 對應
$tab.attr('id', tabId);
// 補上 tabindexactive 為 0其餘為 -1roving tabindex 模式)
var isActive = $li.hasClass('active');
$tab.attr({
'tabindex': isActive ? '0' : '-1',
'aria-selected': isActive ? 'true' : 'false',
'aria-controls': panelId
});
// ✅ 補上 tabpanel 的 aria-labelledby
$('#' + panelId).attr('aria-labelledby', tabId);
});
// ✅ 方向鍵在 tab 間移動roving tabindex 模式)
$tabList.on('keydown', 'a[role="tab"]', function(e) {
var $currentTab = $(this);
var $allTabs = $tabList.find('a[role="tab"]');
var currentIndex = $allTabs.index($currentTab);
var $targetTab = null;
// 左方向鍵 / 上方向鍵
if (e.which === 37 || e.which === 38) {
e.preventDefault();
var prevIndex = currentIndex > 0 ? currentIndex - 1 : $allTabs.length - 1;
$targetTab = $allTabs.eq(prevIndex);
}
// 右方向鍵 / 下方向鍵
if (e.which === 39 || e.which === 40) {
e.preventDefault();
var nextIndex = currentIndex < $allTabs.length - 1 ? currentIndex + 1 : 0;
$targetTab = $allTabs.eq(nextIndex);
}
// Home跳到第一個
if (e.which === 36) {
e.preventDefault();
$targetTab = $allTabs.first();
}
// End跳到最後一個
if (e.which === 35) {
e.preventDefault();
$targetTab = $allTabs.last();
}
if ($targetTab && $targetTab.length > 0) {
// ✅ roving tabindex只有目標 tab 可聚焦
$allTabs.attr('tabindex', '-1').attr('aria-selected', 'false');
$targetTab.attr('tabindex', '0').attr('aria-selected', 'true');
$targetTab.focus();
// ✅ 觸發 Bootstrap tab 切換
$targetTab.tab('show');
}
});
// ✅ 點擊時同步 aria-selected 和 tabindex
$tabList.on('shown.bs.tab', 'a[role="tab"]', function() {
var $allTabs = $tabList.find('a[role="tab"]');
$allTabs.attr('tabindex', '-1').attr('aria-selected', 'false');
$(this).attr('tabindex', '0').attr('aria-selected', 'true');
});
}, 500);
}
fixArchive13TabA11y();
});
</script>
<style>
.i-archive.index-archive-13 .i-archive-files-item{
white-space: inherit;

View File

@ -18,8 +18,7 @@
<div class="panel-body">
<ul class="i-archive-files-list" data-list="files" data-level="2">
<li>
<a href="{{file-url}}" class="i-archive-files-item" target="{{target}}" title="{{file-name}}">{{file-name}}</a>
<span class="label label-primary {{file-type}}">{{file-type}}</span>
<a href="{{file-url}}" class="i-archive-files-item" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary {{file-type}}">{{file-type}}</span></a>
</li>
</ul>
</div>

View File

@ -5,7 +5,7 @@
<ul class="w-annc__list" data-level="0" data-list="custom_announcements">
<li class="w-annc__item">
<div class="w-annc__img-wrap bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="w-annc__meta">
<span class="w-annc__status-wrap" data-list="statuses" data-level="1">

View File

@ -12,7 +12,7 @@
<ul class="w-annc__list row" data-level="0" data-list="custom_announcements">
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="w-annc__content-wrap">
<div class="w-annc__meta">

View File

@ -27,7 +27,7 @@
<div class="w-annc__item">
<div class="w-annc__img-wrap">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="w-annc__content-wrap">
<div class="w-annc__meta">

View File

@ -9,7 +9,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap">
<a href="{{link_to_show}}" title="{{title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__content-wrap">

View File

@ -5,7 +5,7 @@
<ul class="w-annc__list" data-level="0" data-list="custom_announcements">
<li class="w-annc__item row">
<div class="w-annc__img-wrap col-sm-4 bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="w-annc__content-wrap col-sm-8">
<div class="w-annc__meta">

View File

@ -24,7 +24,7 @@
<p class="w-annc__subtitle">{{subtitle}}</p>
</div>
<div class="w-annc__img-wrap col-sm-4 bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
</li>
</ul>

View File

@ -8,7 +8,7 @@
<ul class="w-annc__list row" data-level="0" data-list="custom_announcements">
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="w-annc__content-wrap">
<div class="w-annc__meta">

View File

@ -6,7 +6,7 @@
<li class="w-annc__item">
<div class="w-annc__img-wrap bullseye">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__meta">

View File

@ -24,7 +24,7 @@
<li class="w-annc__item">
<div class="w-annc__img-wrap bullseye" style="position:relative">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -6,7 +6,7 @@
<li class="w-annc__item row">
<div class="w-annc__img-wrap col-sm-4 bullseye">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__content-wrap col-sm-8">

View File

@ -6,7 +6,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye" >
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -24,7 +24,7 @@
<li class="w-annc__item">
<div class="w-annc__img-wrap bullseye" >
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -21,7 +21,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<div class="w-annc__content-wrap">

View File

@ -24,7 +24,7 @@
<p class="w-annc__subtitle">{{subtitle}}</p>
</div>
<div class="w-annc__img-wrap col-sm-4 bullseye">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
</li>
</ul>

View File

@ -9,7 +9,7 @@
<li class="w-annc__item col-md-4">
<div class="w-annc__img-wrap bullseye" style="position:relative">
<a href="{{link_to_show}}" aria-label="前往{{widget-title}}" title="{{widget-title}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img class="w-annc__img" src="{{img_src}}" alt="{{img_description}}">
<div class="transitionfade"></div>
</a>
</div>

View File

@ -4,7 +4,7 @@
<li class="i-annc__item row">
<a href="{{link_to_show}}" title="{{img_description}}">
<div class="i-annc__img-wrap col-sm-4">
<img class="i-annc__img" src="{{img_src}}" alt="" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="i-annc__content-wrap col-sm-8">
<div class="i-annc__meta">

View File

@ -23,7 +23,7 @@
<p class="i-annc__subtitle">{{subtitle}}</p>
</div>
<div class="i-annc__img-wrap col-sm-4">
<img class="i-annc__img" src="{{img_src}}" alt="" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
</a>
</li>

View File

@ -4,7 +4,7 @@
<li class="i-annc__item col-md-4">
<a href="{{link_to_show}}" title="{{img_description}}">
<div class="i-annc__img-wrap bullseye" style="position:relative">
<img class="i-annc__img" src="{{img_src}}" alt="" title="{{img_description}}">
<img class="i-annc__img" src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="i-annc__content-wrap">
<div class="i-annc__meta">

View File

@ -8,7 +8,7 @@
<div class="i-member-item-inner clearfix">
<div class="i-member-pic-wrap col-sm-3">
<a href="{{link_to_show}}" title="{{name}}">
<img class="i-member-pic img-thumbnail" src="{{image}}" title="{{name}}">
<img class="i-member-pic img-thumbnail" src="{{image}}" alt="{{name}}">
</a>
</div>
<div class="i-member-profile-data-wrap col-sm-9">

View File

@ -8,7 +8,7 @@
<div class="i-member-item-inner clearfix">
<div class="i-member-pic-wrap col-sm-4 col-xs-4">
<a href="{{link_to_show}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" alt="{{name}}">
</a>
</div>
<div class="i-member-profile-data-wrap col-sm-8 col-xs-8">

View File

@ -8,7 +8,7 @@
<div class="i-member-item-inner clearfix">
<div class="i-member-pic-wrap">
<a href="{{link_to_show}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" alt="{{name}}">
</a>
</div>
<div class="i-member-profile-data-wrap">

View File

@ -8,7 +8,7 @@
<div class="i-member-item-inner clearfix">
<div class="i-member-pic-wrap">
<a href="{{link_to_show}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" alt="{{name}}">
</a>
</div>
<div class="i-member-profile-data-wrap">

View File

@ -10,7 +10,7 @@
<div class="i-member-item-inner clearfix">
<div class="i-member-pic-wrap">
<a href="{{link_to_show}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" title="{{name}}">
<img class="i-member-pic" src="{{image}}" alt="{{name}}">
</a>
</div>

View File

@ -13,12 +13,11 @@
white-space: nowrap;
}
.universal-th-text{
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
white-space: normal;
}
white-space: pre !important;
}
.universal-dropdown-menu {
padding: 15px 18px;
white-space: nowrap;

View File

@ -6,7 +6,7 @@
<li class="widget-content">
<div class="link-img-wrap{{display_image}}">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</a>

View File

@ -6,7 +6,7 @@
<li class="widget-content">
<div class="link-img-wrap{{display_image}}">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</a>
</div>
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</a>

View File

@ -6,7 +6,7 @@
<li class="widget-content widget-content-horizontal col-sm-3">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="widget-content-title">
<span class="" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</span>

View File

@ -6,7 +6,7 @@
<li class="widget-content widget-content-horizontal ">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</div>
</a>
<div class="widget-content-title">

View File

@ -6,14 +6,15 @@
<li class="widget-content widget-content-horizontal col-sm-6">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</div>
<div class="widget-content-title">
<a class="" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</a>
<span>{{title}}</span>
<span data-list="statuses" data-level="1">
<span class="label status {{status-class}}">{{status}}</span>
</span>
</div>
</a>
</li>
</ul>
</div>

View File

@ -7,9 +7,9 @@
<div class="hex-border">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</div>
<a class="widget-content-title" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</a>
<a class="widget-content-title" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}" onclick="{{onclick}}">{{title}}</a>
<span data-list="statuses" data-level="1">
<span class="label status {{status-class}}">{{status}}</span>
</span>

View File

@ -6,7 +6,7 @@
<li class="index-content">
<a class="index-content-title" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</div>
<h4>
{{title}}

View File

@ -6,7 +6,7 @@
<li class="index-content col-md-4 col-sm-4">
<a class="index-content-title" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
<img src="{{img_src}}" alt="{{img_description}}">
</div>
<h4>
<span class="link-title">