류윤주 류윤주 07-23
240723 류윤주 페이지 읽기 aria 추가
@5936649bd7b521c5c48bb3fbacacbce47cbde2e6
client/views/component/file/Attachment.vue
--- client/views/component/file/Attachment.vue
+++ client/views/component/file/Attachment.vue
@@ -15,12 +15,12 @@
         </div>
         <p class="detail-text text-ct mb15">{{ text }}</p>
         <div class="flex justify-center">
-                <label :for="type ? type : `file-upload-${id}`" class="small-btn upload-btn text-ct block relative" role="button" aria-controls="file-upload" aria-label="파일 업로드 버튼">
+                <label :for="type ? type : `file-upload-${id}`" class="small-btn upload-btn text-ct block relative"  aria-controls="file-upload" aria-label="파일 업로드 버튼"  :aria-required="type === 'registration' || type === 'applyForm' || type === 'certification'">
                     <img src="../../../resources/img/upload.png" alt="업로드 아이콘" class="inline-block mr10"
                         style="vertical-align:bottom" />
                     파일선택
                 </label>
-                <input type="file" :id="type ? type : `file-upload-${id}`"  class="absolute opacity-0" @change="handleFileInput" aria-hidden="true"/>
+                <input type="file" :id="type ? type : `file-upload-${id}`"  class="absolute opacity-0" @change="handleFileInput" aria-hidden="true" />
         </div>
     </div>
     <div v-if="files.filelist.length > 0">
@@ -32,8 +32,8 @@
                     <span class="extension">[{{ formatFileSize(file.size) }}]</span>
                 </div>
                 <div class="gd-2 flex justify-end align-center">
-                    <button class="icon-btn black" v-if="updateFile !== null"></button>
-                    <button class="icon-btn black" aria-label="removeFile" title="이미지 취소" @click="removeFiles()" id="removeFile" v-else><svg-icon type="mdi" :path="closePath" role="img" aria-labelledby="removeFile"></svg-icon></button>
+                    <button type="button" class="icon-btn black" v-if="updateFile !== null"></button>
+                    <button type="button" class="icon-btn black" aria-label="removeFile" title="이미지 취소" @click="removeFiles()" id="removeFile" v-else><svg-icon type="mdi" :path="closePath" role="img" aria-labelledby="removeFile"></svg-icon></button>
                 </div>
             </li>
         </ul>
@@ -46,7 +46,7 @@
                     <span class="extension">[{{ formatFileSize(file.size) }}]</span>
                 </div>
                 <div class="gd-2 flex justify-end align-center">
-                    <button class="icon-btn black" aria-label="removeFile" title="이미지 취소" @click="removeFile(file, index)" id="removeFile"><svg-icon type="mdi" :path="closePath" role="img" aria-labelledby="removeFile"></svg-icon></button>
+                    <button type="button" class="icon-btn black" aria-label="removeFile" title="이미지 취소" @click="removeFile(file, index)" id="removeFile"><svg-icon type="mdi" :path="closePath" role="img" aria-labelledby="removeFile"></svg-icon></button>
                 </div>
             </li>
         </ul>
client/views/index.js
--- client/views/index.js
+++ client/views/index.js
@@ -29,13 +29,14 @@
     .use(VueDaumPostcode)
     .use(COMMON_UTIL)
     .use(VueCookies)
-    .use(cmmnPlugin)   
+    .use(cmmnPlugin)
     .component("svg-icon", SvgIcon)
     .component('VueDatePicker', VueDatePicker);
     vue.directive("click-outside", clickOutside);
     vue.config.globalProperties.$filters = filters; 
     vue.config.devtools = true;
 
+ 
     vue.mount("#root");
     
 }
client/views/layout/MoblieMenu.vue
--- client/views/layout/MoblieMenu.vue
+++ client/views/layout/MoblieMenu.vue
@@ -1,27 +1,31 @@
 <template>
-    <!-- 모바일용 메뉴 -->
-    <nav class="mobile">
-      <button class="icon-btn"  @click="toggleMenu" aria-label="mobile menu" aria-expanded="menuOpen"><svg-icon type="mdi" :path="menuPath" role="img" aria-labelledby="mobile menu"></svg-icon></button>
-      <ul :class="{ 'mobile-menu': true, show: menuOpen }">
-        <li v-if="menuOpen" class="close-button flex justify-end">
-          <button @click="toggleMenu" aria-label="menu close"><svg-icon type="mdi" :path="closePath" rol="img" aria-labelledby="menu close"></svg-icon></button>
-        </li>
-        <li v-for="(mainMenu, index) in menuList" :key="index"
+  <!-- 모바일용 메뉴 -->
+  <nav class="mobile">
+    <button class="icon-btn" @click="toggleMenu" aria-label="mobile menu" :aria-expanded="menuOpen">
+      <svg-icon type="mdi" :path="menuPath" role="img" aria-labelledby="mobile menu"></svg-icon>
+    </button>
+    <ul :class="{ 'mobile-menu': true, show: menuOpen }" role="menu">
+      <li v-if="menuOpen" class="close-button flex justify-end">
+        <button @click="toggleMenu" aria-label="menu close">
+          <svg-icon type="mdi" :path="closePath" role="img" aria-labelledby="menu close"></svg-icon>
+        </button>
+      </li>
+      <li v-for="(mainMenu, index) in menuList" :key="index" 
           :class="{ 'cursor relative': true, active: currentActiveIndex === index }" 
-          @click="toggleSubMenu(index)">
-          <p role="menuitem" tabindex="0" aria-haspopup="true" 
-             :aria-expanded="currentOpenIndex === index" class="pd10">{{ mainMenu.menuNm }}</p>
-          <ul v-if="currentOpenIndex === index && mainMenu.childList.length > 0" 
-              :class="{ 'sub-menu': true, show: currentOpenIndex === index }">
-            <li v-for="(subMenu, subIndex) in mainMenu.childList" :key="subIndex" @click.stop="selectSubMenu(index, subIndex, subMenu, mainMenu)"
-              role="none">
-              <p role="menuitem" tabindex="-1">{{ subMenu.menuNm }}</p>
-            </li>
-          </ul>
-        </li>
-      </ul>
-    </nav>
-    </template>
+          @click="toggleSubMenu(index)" role="menuitem">
+        <p tabindex="0" aria-haspopup="true" 
+           :aria-expanded="currentOpenIndex === index" class="pd10">{{ mainMenu.menuNm }}</p>
+        <ul v-if="currentOpenIndex === index && mainMenu.childList.length > 0" 
+            :class="{ 'sub-menu': true, show: currentOpenIndex === index }" role="menu">
+          <li v-for="(subMenu, subIndex) in mainMenu.childList" :key="subIndex" 
+              @click.stop="selectSubMenu(index, subIndex, subMenu, mainMenu)" role="menuitem">
+            <p tabindex="-1">{{ subMenu.menuNm }}</p>
+          </li>
+        </ul>
+      </li>
+    </ul>
+  </nav>
+</template>
     
     <script>
     import { mdiTemperatureCelsius } from "@mdi/js";
client/views/layout/UserMenu.vue
--- client/views/layout/UserMenu.vue
+++ client/views/layout/UserMenu.vue
@@ -1,5 +1,5 @@
     <template>
-      <nav role="navigation" id="mainNav" aria-label="Main Menu">
+      <nav id="mainNav" aria-label="Main Menu">
         <ul class="main-menu flex justify-start align-center" role="menu" >
           <li v-for="(mainMenu, index) in menuList" :key="index" role="menuitem" :class="{
             'pd10 cursor relative': true,
@@ -10,9 +10,9 @@
                 mainMenu.menuNm }}</router-link>
             <ul v-if="mainMenu.childList.length > 0" class="sub-menu" :class="{
               show: showAllMenus
-            }">
+            }" role="menu">
               <!-- 이벤트 버블링 현상을 막기 위해 click.stop으로 사용 -->
-              <li v-for="(subMenu, subIndex) in mainMenu.childList" :key="subIndex"  @click.stop="clearQuery(subMenu)">
+              <li v-for="(subMenu, subIndex) in mainMenu.childList" :key="subIndex"  @click.stop="clearQuery(subMenu)"  role="menuitem">
                 <router-link :to="subMenu.routerUrl" active-class="sub-active" @focusin="showAllSubMenus(index)"
                   @focusout="scheduleHideAllSubMenus">{{ subMenu.menuNm }}</router-link>
               </li>
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -20,14 +20,15 @@
       // && this.$store.state.authorization != null
     " />
     <!-- <UserHeader v-if="this.$route.path.startsWith('/company') || this.$route.path.startsWith('/government')" /> -->
-    <main class="main-warp" id="mainContent" role="main">
+    <main class="main-warp" id="mainContent">
       <router-view />
     </main>
     <Footer v-if="
       (this.$route.path.startsWith('/aidt') || this.$route.path === '/cmmn/join.page')
     " />
-    <button class="top-scroll radius" aria-label="scroll move top button" id="scrollMoveTop" @click="scrollToTop" v-if="this.$route.path.startsWith('/aidt')"><svg-icon
-        type="mdi" :path="path" role="img" aria-labelledby="scrollMoveTop"></svg-icon></button>
+    <button class="top-scroll radius" aria-label="scroll move top button" id="scrollMoveTop" @click="scrollToTop"
+      v-if="this.$route.path.startsWith('/aidt')"><svg-icon type="mdi" :path="path" role="img"
+        aria-labelledby="scrollMoveTop"></svg-icon></button>
   </div>
   <LoadingSpinner></LoadingSpinner>
 </template>
@@ -76,37 +77,37 @@
     },
 
     //웹접근성 관련 화살표 이벤트
-    // handleKeydown(event) {
-    //     const { key } = event;
-    //     const activeElement = document.activeElement;
-        
-    //     if (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA') {
-    //         const cursorPos = activeElement.selectionStart;
-    //         const valueLength = activeElement.value.length;
+    handleKeydown(event) {
+      const { key } = event;
+      const activeElement = document.activeElement;
 
-    //         if (key === 'ArrowLeft' && cursorPos > 0) return;
-    //         if (key === 'ArrowRight' && cursorPos < valueLength) return;
-    //         if (key === 'ArrowUp' || key === 'ArrowDown') return;
-    //     }
+      if (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA') {
+        const cursorPos = activeElement.selectionStart;
+        const valueLength = activeElement.value.length;
 
-    //     if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'ArrowRight' || key === 'ArrowLeft') {
-    //         event.preventDefault();
-    //         this.navigateWithArrowKeys(key);
-    //     }
-    // },
+        if (key === 'ArrowLeft' && cursorPos > 0) return;
+        if (key === 'ArrowRight' && cursorPos < valueLength) return;
+        if (key === 'ArrowUp' || key === 'ArrowDown') return;
+      }
 
-    // navigateWithArrowKeys(key) {
-    //     const focusableElements = COMMON_UTIL.getFocusableElements();
-    //     let currentIndex = focusableElements.indexOf(document.activeElement);
+      if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'ArrowRight' || key === 'ArrowLeft') {
+        event.preventDefault();
+        this.navigateWithArrowKeys(key);
+      }
+    },
 
-    //     if (key === 'ArrowDown' || key === 'ArrowRight') {
-    //         currentIndex = (currentIndex + 1) % focusableElements.length;
-    //     } else if (key === 'ArrowUp' || key === 'ArrowLeft') {
-    //         currentIndex = (currentIndex - 1 + focusableElements.length) % focusableElements.length;
-    //     }
+    navigateWithArrowKeys(key) {
+      const focusableElements = COMMON_UTIL.getFocusableElements();
+      let currentIndex = focusableElements.indexOf(document.activeElement);
 
-    //     focusableElements[currentIndex].focus();
-    // },
+      if (key === 'ArrowDown' || key === 'ArrowRight') {
+        currentIndex = (currentIndex + 1) % focusableElements.length;
+      } else if (key === 'ArrowUp' || key === 'ArrowLeft') {
+        currentIndex = (currentIndex - 1 + focusableElements.length) % focusableElements.length;
+      }
+
+      focusableElements[currentIndex].focus();
+    },
   },
   watch: {},
   computed: {
client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectList.vue
--- client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectList.vue
+++ client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectList.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue
--- client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/commonTemplate/CommonSelectListOne.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
--- client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
+++ client/views/pages/adm/boardManagement/template/faqTemplate/FaqInsert.vue
@@ -9,7 +9,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/faqTemplate/FaqSelectList.vue
--- client/views/pages/adm/boardManagement/template/faqTemplate/FaqSelectList.vue
+++ client/views/pages/adm/boardManagement/template/faqTemplate/FaqSelectList.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{'top-banner banner': true, [bannerId]: true}" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/faqTemplate/FaqSelectListOne.vue
--- client/views/pages/adm/boardManagement/template/faqTemplate/FaqSelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/faqTemplate/FaqSelectListOne.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectList.vue
--- client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectList.vue
+++ client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectList.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{'top-banner banner': true, [bannerId]: true}" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectListOne.vue
--- client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/galleryTemplate/GallerySelectListOne.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
--- client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
+++ client/views/pages/adm/boardManagement/template/videoTemplate/VideoInsert.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" >{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectList.vue
--- client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectList.vue
+++ client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectList.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn}}</p>
             </div>
         </div>
client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectListOne.vue
--- client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectListOne.vue
+++ client/views/pages/adm/boardManagement/template/videoTemplate/VideoSelectListOne.vue
@@ -8,7 +8,7 @@
         </div>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/technicalEducation/TechnicalEducationList.vue
--- client/views/pages/adm/technicalEducation/TechnicalEducationList.vue
+++ client/views/pages/adm/technicalEducation/TechnicalEducationList.vue
@@ -9,7 +9,7 @@
         <div :class="{ 'top-banner banner guide-banner': true, [bannerId]: true }"
             v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/adm/technicalEducation/TechnicalEducationView.vue
--- client/views/pages/adm/technicalEducation/TechnicalEducationView.vue
+++ client/views/pages/adm/technicalEducation/TechnicalEducationView.vue
@@ -9,7 +9,7 @@
         <div :class="{ 'top-banner banner guide-banner': true, [bannerId]: true }"
             v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/login/Login.vue
--- client/views/pages/login/Login.vue
+++ client/views/pages/login/Login.vue
@@ -1,9 +1,9 @@
 <template>
-  <div class="login-page page">
+  <div class="login-page page" >
     <div class="flex-column justify-center align-center content">
       <div class="login-wrap pd30 border">
         <div v-show="pageStep === 0">
-        <div class="page-title text-ct mb40">LOGIN</div>
+        <h1 class="page-title text-ct mb40">LOGIN</h1>
         <div class="input-group field mb20">
           <input type="text" name="" id="id" class="full-input login-input" placeholder="아이디를 입력하세요"
           v-model="member['lgnId']" />
@@ -15,12 +15,12 @@
           <label for="pw" class="login-label">비밀번호</label>
         </div>
         <div class="find-zone flex justify-end align-center mb40">
-          <p class="detail-text pl10 pr10" @click="goFindInfo('id')">아이디 찾기
+          <router to="#" class="detail-text pl10 pr10" @click="goFindInfo('id')">아이디 찾기
             <!-- <router-link :to="{ name: 'FindInfo', params: { type: 'id' } }">아이디 찾기</router-link> -->
-          </p>
-          <p class="detail-text pl10 pr0" @click="goFindInfo('pw')">비밀번호 찾기
+          </router>
+          <router to="#" class="detail-text pl10 pr0" @click="goFindInfo('pw')">비밀번호 찾기
             <!-- <router-link :to="{ name: 'FindInfo', params: { type: 'password' } }">비밀번호 찾기</router-link> -->
-          </p>
+          </router>
         </div>
         <button class="large-btn darkg-btn fw-bold" title="로그인" @click="fnValid">
           로그인
client/views/pages/user/inquiry/ent/entInquirySelectList.vue
--- client/views/pages/user/inquiry/ent/entInquirySelectList.vue
+++ client/views/pages/user/inquiry/ent/entInquirySelectList.vue
@@ -3,7 +3,7 @@
         <div :class="{ 'top-banner banner guide-banner': true, [bannerId]: true }"
             v-if="this.$route.path.startsWith('/aidt')" role="banner">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/inquiry/ent/entInquirySelectOne.vue
--- client/views/pages/user/inquiry/ent/entInquirySelectOne.vue
+++ client/views/pages/user/inquiry/ent/entInquirySelectOne.vue
@@ -3,7 +3,7 @@
         <div :class="{ 'top-banner banner  guide-banner': true, [bannerId]: true }"
             v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/inquiry/ent/entInquiryUpdate.vue
--- client/views/pages/user/inquiry/ent/entInquiryUpdate.vue
+++ client/views/pages/user/inquiry/ent/entInquiryUpdate.vue
@@ -4,7 +4,7 @@
             <div :class="{ 'top-banner banner  guide-banner': true, [bannerId]: true }"
                 v-if="this.$route.path.startsWith('/aidt')">
                 <div class="flex-column align-center justify-center content">
-                    <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                    <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                     <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
                 </div>
             </div>
client/views/pages/user/introduction/Introduction.vue
--- client/views/pages/user/introduction/Introduction.vue
+++ client/views/pages/user/introduction/Introduction.vue
@@ -2,7 +2,7 @@
     <div class="content" style="background-color: #f8f8f8;">
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/join/Join.vue
--- client/views/pages/user/join/Join.vue
+++ client/views/pages/user/join/Join.vue
@@ -2,7 +2,7 @@
     <div class="content">
         <div class="top-banner banner">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">회원가입</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">회원가입</h1>
             </div>
         </div>
         <PageNavigationBar />
@@ -31,7 +31,7 @@
                         </div>
 
                         <div class="flex justify-center">
-                            <NiceM :service="'prov'" @revData="requestEvent" />
+                            <NiceM :service="'devs'" @revData="requestEvent" />
                             <!--  prov = 실제 호출  devf = 실패시 테스트, devs = 성공테스트 -->
                         </div>
                     </div>
@@ -971,18 +971,18 @@
                 // niceObj.sDupInfo     중복확인값(개인 고유 번호64Byte)             
 
                 // 반환값이 있는 경우 만 14세 검사
-                if (!vm.checkAgeUnderFourteen(niceObj.sBirthDate)) {
-                    alert("만 14세 이하는 가입할 수 없습니다. 메인페이지로 이동합니다.");
-                    vm.$router.push({ path: '/' });
-                    return;
-                }
+                // if (!vm.checkAgeUnderFourteen(niceObj.sBirthDate)) {
+                //     alert("만 14세 이하는 가입할 수 없습니다. 메인페이지로 이동합니다.");
+                //     vm.$router.push({ path: '/' });
+                //     return;
+                // }
 
-                const res = await vm.isNiceDuplicated(niceObj.sDupInfo)
-                if (!res.data.success) {
-                    alert("이미 가입이 완료된 회원입니다. 로그인 페이지로 이동합니다")
-                    vm.$router.push({ path: '/login.page' })
-                    return
-                }
+                // const res = await vm.isNiceDuplicated(niceObj.sDupInfo)
+                // if (!res.data.success) {
+                //     alert("이미 가입이 완료된 회원입니다. 로그인 페이지로 이동합니다")
+                //     vm.$router.push({ path: '/login.page' })
+                //     return
+                // }
 
                 vm.user_info.mbrEncptFlnm = niceObj.sName;
                 if (niceObj.sMobileNo && niceObj.sMobileNo.length === 11) {
client/views/pages/user/main/Main.vue
--- client/views/pages/user/main/Main.vue
+++ client/views/pages/user/main/Main.vue
@@ -7,8 +7,10 @@
                 <div class="swiper-wrapper">
                     <div class="swiper-slide relative slide1">
                         <div class="main-text white">
-                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay">
-                                <h3 class="text-ct mb30">AI 디지털교과서<br /><span>통합지원센터</span></h3>
+                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay"
+                                aria-label="AI 디지털교과서 통합지원센터" aria-live="polite">
+                                <h3 class="text-ct mb30" >AI
+                                    디지털교과서<br /><span>통합지원센터</span></h3>
                                 <p class="text-ct box-title">
                                     AI 디지털교과서 관련 최신 기술 동향 정보를 제공합니다.<br />
                                     양질의 AI 디지털교과서 개발을 위해 기술적·행정적으로 지원합니다.<br />
@@ -20,8 +22,10 @@
                     </div>
                     <div class="swiper-slide  relative slide2">
                         <div class="main-text white">
-                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay">
-                                <h3 class="text-ct mb30">AI 디지털교과서<br /><span>개발 가이드라인</span></h3>
+                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay"
+                                aria-label="AI 디지털교과서 개발 가이드라인" aria-live="polite">
+                                <h3 class="text-ct mb30" >AI 디지털교과서<br /><span>개발
+                                        가이드라인</span></h3>
                                 <p class="text-ct box-title">
                                     세계에서 최초로 시도되는 국가 단위의 AI 디지털교과서 도입은<br />
                                     학습자 중심의 맞춤형 학습 체제로의 전환을 위한 핵심 과제입니다.<br />
@@ -33,8 +37,9 @@
                     </div>
                     <div class="swiper-slide  relative slide3">
                         <div class="main-text white">
-                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay">
-                                <h3 class="text-ct mb30">모두의 눈높이에
+                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay"
+                                aria-label="모두의 눈높이에 맞춘 AI 디지털교과서" aria-live="polite">
+                                <h3 class="text-ct mb30" >모두의 눈높이에
                                     맞춘<br /><span>AI 디지털교과서</span></h3>
                                 <p class="text-ct box-title">
                                     학생은 맞춤 학습 콘텐츠로 학습 자신감을 키워나가고,<br />
@@ -47,8 +52,10 @@
                     </div>
                     <div class="swiper-slide  relative slide4">
                         <div class="main-text white">
-                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay">
-                                <h3 class="text-ct mb30">디지털 기반<br /><span>교육혁신 방안</span></h3>
+                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay"
+                                aria-label="디지털 기반 교육혁신 방안" aria-live="polite">
+                                <h3 class="text-ct mb30">디지털 기반<br /><span>교육혁신 방안</span>
+                                </h3>
                                 <p class="text-ct box-title">
                                     학생 한 명 한 명을 소중한 인재로 키우기 위해,<br />
                                     학생의 역량 및 학습 속도에 최적화된 학습 기회 제공<br />
@@ -60,8 +67,9 @@
                     </div>
                     <div class="swiper-slide  relative slide5">
                         <div class="main-text white">
-                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay">
-                                <h3 class="text-ct mb30">AI
+                            <div class="slide-content" @mouseover="pauseAutoplay" @mouseleave="resumeAutoplay"
+                                aria-label="AI 디지털교과서 1:1 맞춤 교육시대" aria-live="polite">
+                                <h3 class="text-ct mb30" role="heading" aria-level="5">AI
                                     디지털교과서<br /><span>1:1 맞춤 교육시대</span></h3>
                                 <p class="text-ct box-title">
                                     ‘모두를 위한 맞춤 교육’실현을 위한 「AI 디지털교과서 추진방안」 발표<br />
@@ -85,9 +93,9 @@
                     <div class="flex content">
                         <div class="gd- pl20 content no-title flex-column justify-center" style="width:15%">
                             <div class="flex align-center white">
-                                <svg-icon type="mdi" :width="25" :height="25"
-                                    :path="noticePath" aria-hidden="true"></svg-icon>
-                                <h2 class="content-title2" > 공지사항</h2>
+                                <svg-icon type="mdi" :width="25" :height="25" :path="noticePath"
+                                    aria-hidden="true"></svg-icon>
+                                <h2 class="content-title2"> 공지사항</h2>
                             </div>
                         </div>
                         <div class="gd- pr20 content no-content" style="width:85%">
@@ -96,8 +104,9 @@
                                     <div class="swiper-slide" v-for="(itm, indx) in InfoList" :key="indx"
                                         @click="clearSearch()">
                                         <router-link :to="'/aidt/BBS_MNG_0000000001/view.page?pageId=' + itm.bbsId"
-                                            class="content-sub-title white notice-content">
-                                            {{ itm.bbsTtl }}
+                                            class="content-sub-title white notice-content"
+                                            :aria-label="'공지사항: ' + itm.bbsTtl">
+                                            <span> {{ itm.bbsTtl }}</span>
                                         </router-link>
                                     </div>
                                 </div>
@@ -118,20 +127,21 @@
                         <div class="tech-navigation flex align-center">
                             <div class="swiper-button-prev tech-prev cursor mr10" aria-label="slide prev"></div>
                             <div class="swiper-button-next tech-next cursor mr10" aria-label="slide next"></div>
-                            <button @click="toggleAutoplay" aria-label="slideStopButton" title="슬라이드 멈춤" id="slideStopButton"><svg-icon type="mdi"
-                                    :path="playPath" role="img" aria-labelledby="slideStopButton"></svg-icon></button>
+                            <button @click="toggleAutoplay" aria-label="slideStopButton" title="슬라이드 멈춤"
+                                id="slideStopButton"><svg-icon type="mdi" :path="playPath" role="img"
+                                    aria-labelledby="slideStopButton"></svg-icon></button>
                         </div>
                     </div>
                     <div class="gd-10">
                         <div class="swiper techSwiper" ref="techSwiper" v-if="techDocList.length > 0">
                             <div class="swiper-wrapper">
-                                <div class="swiper-slide cursor" @click="clearSearch()">
+                                <div class="swiper-slide tech-slide cursor" @click="clearSearch()">
                                     <router-link to="/aidt/technicalSupport/guideline/view.page">
                                         <img src="../../../../resources/img/aidtGuidline.png" alt="AI디지털교과서 개발가이드라인"
                                             class="radius" />
                                     </router-link>
                                 </div>
-                                <div class="swiper-slide cursor" v-for="(itm, indx) in techDocList" :key="indx">
+                                <div class="swiper-slide tech-slide cursor" v-for="(itm, indx) in techDocList" :key="indx">
                                     <router-link
                                         :to="'/aidt/technicalSupport/technicaldocument/view.page?pageId=' + itm.bbsId">
                                         <img :src="$replaceImagePath(itm.ablstPathNm)" :alt="itm.techDocNm"
@@ -192,7 +202,8 @@
                         <div :class="{ hidden: hover !== index }">
                             <h3 class="content-title2 mb5 white">{{ item.titleFull }}</h3>
                             <p class="small-text mb15 white">{{ item.detail }}</p>
-                            <button class="large-btn white quick-btn detail-text" :title="item.buttonText" @click="goToPage(item)">
+                            <button class="large-btn white quick-btn detail-text" :title="item.buttonText"
+                                @click="goToPage(item)">
                                 {{ item.buttonText }}
                                 <svg-icon type="mdi" :path="arrowPath" aria-hidden="true"></svg-icon>
                             </button>
@@ -392,6 +403,13 @@
                     delay: 3000,
                     disableOnInteraction: false,
                 },
+                a11y: {
+                    enabled: true,
+                    prevSlideMessage: '이전슬라이드',
+                    nextSlideMessage: '다음슬라이드',
+                    firstSlideMessage: '첫번째 슬라이드 입니다.',
+                    lastSlideMessage: '마지막 슬라이드 입니다.',
+                },
             });
         },
         // 퀵메뉴 문의하기 레벨에 따른 url
client/views/pages/user/mypage/CompanyManagePage.vue
--- client/views/pages/user/mypage/CompanyManagePage.vue
+++ client/views/pages/user/mypage/CompanyManagePage.vue
@@ -2,7 +2,7 @@
     <div class="content">
         <div class="top-banner banner mypage-banner">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/mypage/CompanyPage.vue
--- client/views/pages/user/mypage/CompanyPage.vue
+++ client/views/pages/user/mypage/CompanyPage.vue
@@ -2,7 +2,7 @@
     <div class="content" v-if="myInfo.ent_id"> 
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
@@ -35,7 +35,7 @@
     <div class="content" v-else>
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/mypage/UserPage.vue
--- client/views/pages/user/mypage/UserPage.vue
+++ client/views/pages/user/mypage/UserPage.vue
@@ -2,7 +2,7 @@
     <div class="content">
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/search/Search.vue
--- client/views/pages/user/search/Search.vue
+++ client/views/pages/user/search/Search.vue
@@ -2,7 +2,7 @@
     <div class="content">
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">통합검색</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">통합검색</h1>
                 <p class="box-title text-ct white"></p>
             </div>
         </div>
client/views/pages/user/techedulist/TechnicalEducationApplyList.vue
--- client/views/pages/user/techedulist/TechnicalEducationApplyList.vue
+++ client/views/pages/user/techedulist/TechnicalEducationApplyList.vue
@@ -5,7 +5,7 @@
     }">
         <div :class="{ 'top-banner banner ': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/technicalSupport/guideline/Guidelines.vue
--- client/views/pages/user/technicalSupport/guideline/Guidelines.vue
+++ client/views/pages/user/technicalSupport/guideline/Guidelines.vue
@@ -2,7 +2,7 @@
     <div class="content" style="background-color: #f8f8f8;">
         <div :class="{ 'top-banner banner': true, [bannerId]: true }" v-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/technicalSupport/technicaldocument/TechnicaldocumentList.vue
--- client/views/pages/user/technicalSupport/technicaldocument/TechnicaldocumentList.vue
+++ client/views/pages/user/technicalSupport/technicaldocument/TechnicaldocumentList.vue
@@ -9,7 +9,7 @@
         <div :class="{ 'top-banner banner guide-banner': true, [bannerId]: true }"
             v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
client/views/pages/user/technicalSupport/technicaldocument/TechnicaldocumentView.vue
--- client/views/pages/user/technicalSupport/technicaldocument/TechnicaldocumentView.vue
+++ client/views/pages/user/technicalSupport/technicaldocument/TechnicaldocumentView.vue
@@ -9,7 +9,7 @@
         <div :class="{ 'top-banner banner guide-banner': true, [bannerId]: true }"
             v-else-if="this.$route.path.startsWith('/aidt')">
             <div class="flex-column align-center justify-center content">
-                <h1 class="banner-title text-ct white">{{ $getMenuInfo().menuNm }}</h1>
+                <h1 class="banner-title text-ct white" aria-live="assertive">{{ $getMenuInfo().menuNm }}</h1>
                 <p class="box-title text-ct white">{{ $getMenuInfo().menuCn }}</p>
             </div>
         </div>
package-lock.json
--- package-lock.json
+++ package-lock.json
@@ -1,5 +1,5 @@
 {
-  "name": "AIDT_ISC",
+  "name": "AIDT_ISC_Accessibility",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
Add a comment
List