feat: 업데이트 내역 게시판 · 쓰기 화면 [보내기] 숨음과 목록 고르기 칸 고침 #26

Merged
ttipo merged 12 commits from feat/release-notes into main 2026-11-11 06:24:46 +09:00
Owner

무엇을 · 왜

직원이 웹메일과 휴대폰 앱에서 ARA SYSTEM 에 무엇이 새로 생기거나 바뀌었는지 읽는 업데이트 내역 게시판입니다(목록 → 글). 다음 운영 배포(14 · 15 · 16단계 · 휴대폰 앱) 전에 넣습니다. 화면은 캔버스 보드로 먼저 확정했습니다(v80 — ReleaseNotes).

  • 글 쓰기: 운영자가 저장소 backend/release-notes/ 에 글마다 파일 하나로 씁니다. 파일 이름이 날짜(2026-11-18.md)이고, 첫 줄 # 제목 · ## 묶음 · - 한 줄 꼴입니다. 쓰는 법은 그 폴더의 README.md 에 있습니다.
    • 올리는 화면 · API · DB 표는 없습니다. 파일을 더해 커밋하고 배포하면 웹 · 앱에 함께 나옵니다.
  • 서버: GET /api/release-notes(커서 목록 — 최근 글부터)와 GET /api/release-notes/{id}(글 + 바로 옛 글 · 새 글)를 둡니다. 로그인한 직원만 보고, 제한된 세션은 403 AUTH_010 입니다. 모양이 틀린 id 도 없는 글과 같은 404 RES_001 입니다.
    • 틀린 글은 실행 때 그 글만 건너뛰고 error 로그(파일 이름 · 줄 · 까닭)를 남깁니다. 기동 때 한 번 읽어 배포 직후 로그에 보입니다.
    • 실제 폴더를 엄격하게 읽는 시험이 CI 에서 운영자의 오타를 잡습니다.
    • 글 폴더는 src 밖이라 개발 컨테이너는 다시 띄우지 않아도 새 글이 보입니다. 운영 이미지는 Dockerfile 이 폴더를 함께 복사합니다.
  • 웹: 설정 › 정보 › 업데이트 내역입니다. 게시판 표(줄 전체 링크 · [더 보기])에서 글로 들어가고, 글에는 [← 목록으로] · 다음 글 · 이전 글 · [목록]이 있습니다.
  • 앱: 설정 › 앱 정보 › 업데이트 내역입니다. 목록에서 글로 들어가고, 위 막대의 뒤로와 다음 글 · 이전 글 줄이 있습니다.
    • 메일 화면의 불러오기 상태 위젯을 shared 로 옮겨 함께 씁니다. 모양 · 동작은 그대로이고 커밋을 따로 두었습니다.
  • 첫 글: 1차 배포(11월 5일 전환) 뒤 만든 기능을 직원이 어디서 무엇을 누르면 되는지 중심으로 모았습니다(개발 이야기는 뺐습니다).
    • 묶음은 휴대폰 앱 / 웹메일과 휴대폰 앱 / 웹메일 · 메일 읽기와 정리 / 웹메일 · 주소록 / 웹메일 · 설정 / 그 밖에 입니다. 앱에서도 보이는 글이라 어느 쪽 기능인지 묶음 머리에 적었습니다.
    • 날짜는 배포 날입니다(11월 12일(목) 오전 1시 배포 — 파일 2026-11-12.md).

함께 고친 것 — 운영 화면에서 사용자가 찾은 버그 둘(11월 12일 배포에 함께)

  • 쓰기 화면의 [보내기]가 화면 밖으로 숨음: 받는 사람 · 숨은참조가 여러 줄이 되면 편집 영역(최소 300)이 줄지 않아 바깥 스크롤과 본문 스크롤이 겹치고 [보내기] 줄이 밀려났습니다.
    • [보내기] 줄은 스크롤하는 칸의 아래에 붙고, 칩 · 입력 칸은 96px 을 넘으면 그 칸 안에서 스크롤합니다. 넓은 화면은 편집 영역이 200 까지 먼저 줄어 보통 높이에서 바깥 스크롤이 없습니다.
  • 목록 보기의 고르기 상자를 누르면 메일까지 열림: 줄 전체 click 이 event.target.closest('button') 로 단추를 가렸는데, 상자 그림을 누르면 고르기 처리 뒤 Vue 가 다시 그려 그 그림이 문서에서 떨어져 단추를 찾지 못했습니다.
    • 사건이 지나간 길(composedPath)로 가르고 상자 · 별 그림은 pointer-events: none 입니다. 고르기 칸의 빈자리도 고릅니다.

리뷰는 높음 0 · 중간 1 · 낮음 1 · 참고 13 이었고, 필요한 것은 모두 고쳤습니다.

  • 중간: 첫 글이 웹에서만 되는 일을 앱에도 밝히지 않았습니다 → 묶음 머리로 나눔
  • 낮음: 글 파일을 경로로 두 번 열었습니다 → O_NOFOLLOW 로 한 번 열고 256KB 까지만 읽음

확인 방법

  • backend(컨테이너): lint 0 · type-check · 단위 4,025 · e2e 396(업데이트 내역 10 — 401 · 목록 · 글 · previous/next · 404 · 틀린 id · 틀린 커서)
  • frontend: lint 0 · type-check · test:unit 3,303(KST — 바꾼 시험은 UTC 로도 203)
    • 두 고침은 브라우저로 따로 확인했습니다: 숨은참조 30명 + 본문 40줄로 1440×900 · 1366×768 · 1000×600 · 360×800 에서 [보내기]가 보임(46/46), 목록 보기 · 메일함 셋 · 대화로 묶기 켬 · 끔에서 상자 · 빈자리를 눌러도 열리지 않음(54/54 · 다른 동작 7/7)
  • flutter: analyze 경고 0 · test 1,114
  • 브라우저 실사용 시험(Edge · 개발 스택): 시험용 글 23개를 잠깐 더했다 지우며 봤습니다.
    • 메뉴 · 목록 · 글 · [더 보기] · 없는 글 · 받지 못함 · 폭 1440~360 · 시간대 UTC−8 / UTC+14 모두 통과했습니다.
    • 나온 넷은 고친 뒤 같은 스크립트로 다시 확인했습니다: 좁은 폭에서 목록의 스크롤 자리를 이어받아 글 제목이 숨음, 다른 글로 옮기면 제목이 위에 붙은 줄 밑에 가림, 돌아오면 목록 맨 아래가 보임, 주소 끝 .. 의 일반 404.
  • 앱은 위젯 시험으로 확인했습니다. 실기기 확인은 서버 배포 뒤 첫 APK 와 함께 합니다.

영향 범위

  • backend
  • frontend
  • flutter
  • docker / 인프라 — backend/Dockerfile production stage 에 글 폴더 COPY 한 줄
  • 규칙 문서(.claude/)

공유 계약

  • 새 경로: GET /api/release-notes · GET /api/release-notes/{id}(계약 7절). 새 에러 코드 · 마이그레이션 · env 는 없습니다.
  • 계약 머리말에 예외 한 줄을 더했습니다: 7절의 date 는 달력 날짜 글(YYYY-MM-DD)입니다.
  • 앱 판(1.0.0+1)과 서버의 앱 최소 판은 그대로입니다. 첫 배포 판에 함께 들어갑니다.

체크리스트

  • 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과
  • 주석 한국어, 매직 넘버·하드코딩 문자열 없음
  • 사용자 노출 실패는 모두 에러 코드와 함께 처리 (BusinessException / error.code 분기)
  • 에러 코드를 바꿨다면 npm run sync:error-codes 실행 후 생성 파일까지 커밋 — 바꾸지 않음
  • 민감정보 미커밋 (*.example 값은 placeholder)
  • 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 — 글 내용도 남기지 않음(파일 이름 · 줄 · 까닭만)

🤖 Generated with Claude Code

## 무엇을 · 왜 직원이 웹메일과 휴대폰 앱에서 ARA SYSTEM 에 무엇이 새로 생기거나 바뀌었는지 읽는 **업데이트 내역** 게시판입니다(목록 → 글). 다음 운영 배포(14 · 15 · 16단계 · 휴대폰 앱) 전에 넣습니다. 화면은 캔버스 보드로 먼저 확정했습니다(v80 — `ReleaseNotes`). - **글 쓰기**: 운영자가 저장소 `backend/release-notes/` 에 글마다 파일 하나로 씁니다. 파일 이름이 날짜(`2026-11-18.md`)이고, 첫 줄 `# 제목` · `## 묶음` · `- 한 줄` 꼴입니다. 쓰는 법은 그 폴더의 `README.md` 에 있습니다. - 올리는 화면 · API · DB 표는 없습니다. 파일을 더해 커밋하고 배포하면 웹 · 앱에 함께 나옵니다. - **서버**: `GET /api/release-notes`(커서 목록 — 최근 글부터)와 `GET /api/release-notes/{id}`(글 + 바로 옛 글 · 새 글)를 둡니다. 로그인한 직원만 보고, 제한된 세션은 403 `AUTH_010` 입니다. 모양이 틀린 id 도 없는 글과 같은 404 `RES_001` 입니다. - 틀린 글은 실행 때 그 글만 건너뛰고 error 로그(파일 이름 · 줄 · 까닭)를 남깁니다. 기동 때 한 번 읽어 배포 직후 로그에 보입니다. - 실제 폴더를 엄격하게 읽는 시험이 CI 에서 운영자의 오타를 잡습니다. - 글 폴더는 src 밖이라 개발 컨테이너는 다시 띄우지 않아도 새 글이 보입니다. 운영 이미지는 Dockerfile 이 폴더를 함께 복사합니다. - **웹**: 설정 › 정보 › 업데이트 내역입니다. 게시판 표(줄 전체 링크 · [더 보기])에서 글로 들어가고, 글에는 [← 목록으로] · 다음 글 · 이전 글 · [목록]이 있습니다. - **앱**: 설정 › 앱 정보 › 업데이트 내역입니다. 목록에서 글로 들어가고, 위 막대의 뒤로와 다음 글 · 이전 글 줄이 있습니다. - 메일 화면의 불러오기 상태 위젯을 shared 로 옮겨 함께 씁니다. 모양 · 동작은 그대로이고 커밋을 따로 두었습니다. - **첫 글**: 1차 배포(11월 5일 전환) 뒤 만든 기능을 직원이 어디서 무엇을 누르면 되는지 중심으로 모았습니다(개발 이야기는 뺐습니다). - 묶음은 휴대폰 앱 / 웹메일과 휴대폰 앱 / 웹메일 · 메일 읽기와 정리 / 웹메일 · 주소록 / 웹메일 · 설정 / 그 밖에 입니다. 앱에서도 보이는 글이라 어느 쪽 기능인지 묶음 머리에 적었습니다. - 날짜는 배포 날입니다(11월 12일(목) 오전 1시 배포 — 파일 `2026-11-12.md`). ### 함께 고친 것 — 운영 화면에서 사용자가 찾은 버그 둘(11월 12일 배포에 함께) - **쓰기 화면의 [보내기]가 화면 밖으로 숨음**: 받는 사람 · 숨은참조가 여러 줄이 되면 편집 영역(최소 300)이 줄지 않아 바깥 스크롤과 본문 스크롤이 겹치고 [보내기] 줄이 밀려났습니다. - [보내기] 줄은 스크롤하는 칸의 아래에 붙고, 칩 · 입력 칸은 96px 을 넘으면 그 칸 안에서 스크롤합니다. 넓은 화면은 편집 영역이 200 까지 먼저 줄어 보통 높이에서 바깥 스크롤이 없습니다. - **목록 보기의 고르기 상자를 누르면 메일까지 열림**: 줄 전체 click 이 `event.target.closest('button')` 로 단추를 가렸는데, 상자 그림을 누르면 고르기 처리 뒤 Vue 가 다시 그려 그 그림이 문서에서 떨어져 단추를 찾지 못했습니다. - 사건이 지나간 길(`composedPath`)로 가르고 상자 · 별 그림은 `pointer-events: none` 입니다. 고르기 칸의 빈자리도 고릅니다. 리뷰는 높음 0 · 중간 1 · 낮음 1 · 참고 13 이었고, 필요한 것은 모두 고쳤습니다. - 중간: 첫 글이 웹에서만 되는 일을 앱에도 밝히지 않았습니다 → 묶음 머리로 나눔 - 낮음: 글 파일을 경로로 두 번 열었습니다 → O_NOFOLLOW 로 한 번 열고 256KB 까지만 읽음 ## 확인 방법 - backend(컨테이너): lint 0 · type-check · 단위 4,025 · e2e 396(업데이트 내역 10 — 401 · 목록 · 글 · previous/next · 404 · 틀린 id · 틀린 커서) - frontend: lint 0 · type-check · test:unit 3,303(KST — 바꾼 시험은 UTC 로도 203) - 두 고침은 브라우저로 따로 확인했습니다: 숨은참조 30명 + 본문 40줄로 1440×900 · 1366×768 · 1000×600 · 360×800 에서 [보내기]가 보임(46/46), 목록 보기 · 메일함 셋 · 대화로 묶기 켬 · 끔에서 상자 · 빈자리를 눌러도 열리지 않음(54/54 · 다른 동작 7/7) - flutter: analyze 경고 0 · test 1,114 - 브라우저 실사용 시험(Edge · 개발 스택): 시험용 글 23개를 잠깐 더했다 지우며 봤습니다. - 메뉴 · 목록 · 글 · [더 보기] · 없는 글 · 받지 못함 · 폭 1440~360 · 시간대 UTC−8 / UTC+14 모두 통과했습니다. - 나온 넷은 고친 뒤 같은 스크립트로 다시 확인했습니다: 좁은 폭에서 목록의 스크롤 자리를 이어받아 글 제목이 숨음, 다른 글로 옮기면 제목이 위에 붙은 줄 밑에 가림, 돌아오면 목록 맨 아래가 보임, 주소 끝 `..` 의 일반 404. - 앱은 위젯 시험으로 확인했습니다. 실기기 확인은 서버 배포 뒤 첫 APK 와 함께 합니다. ## 영향 범위 - [x] backend - [x] frontend - [x] flutter - [x] docker / 인프라 — `backend/Dockerfile` production stage 에 글 폴더 COPY 한 줄 - [x] 규칙 문서(.claude/) > **공유 계약** > - 새 경로: `GET /api/release-notes` · `GET /api/release-notes/{id}`(계약 7절). 새 에러 코드 · 마이그레이션 · env 는 없습니다. > - 계약 머리말에 예외 한 줄을 더했습니다: 7절의 `date` 는 달력 날짜 글(`YYYY-MM-DD`)입니다. > - 앱 판(1.0.0+1)과 서버의 앱 최소 판은 그대로입니다. 첫 배포 판에 함께 들어갑니다. ## 체크리스트 - [x] 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과 - [x] 주석 한국어, 매직 넘버·하드코딩 문자열 없음 - [x] 사용자 노출 실패는 모두 에러 코드와 함께 처리 (`BusinessException` / `error.code` 분기) - [x] 에러 코드를 바꿨다면 `npm run sync:error-codes` 실행 후 생성 파일까지 커밋 — 바꾸지 않음 - [x] 민감정보 미커밋 (`*.example` 값은 placeholder) - [x] 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 — 글 내용도 남기지 않음(파일 이름 · 줄 · 까닭만) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ttipo added 8 commits 2026-11-10 20:22:16 +09:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
웹 설정 › 정보 › 업데이트 내역과 앱 설정 › 앱 정보 › 업데이트 내역(게시판 — 목록에서 글로), 글 파일 쓰는 법을 한 보드에 그렸다(캔버스 v80 확정).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
직원이 웹메일 · 휴대폰 앱에서 무엇이 새로 생겼는지 읽는 게시판의 서버 몫이다. 글은 운영자가 backend/release-notes/ 에 글마다 파일 하나로 쓰고
(올리는 API · DB 표 · 새 에러 코드 없음), GET /api/release-notes(커서 목록)와 GET /api/release-notes/{id}(글 + 바로 옛 글 · 새 글)로 웹 · 앱에 똑같이 준다.

- 글 폴더는 src 밖이라 개발 컨테이너(바인드 마운트)는 다시 띄우지 않아도 새 글이 보이고, 운영 이미지는 Dockerfile 이 폴더를 함께 복사한다
- 틀린 글은 실행 때 그 글만 건너뛰고 error 로그(파일 이름 · 줄 · 까닭만 — 기동 때 한 번 읽어 배포 직후 보인다), 실제 폴더를 엄격하게 읽는 시험이 CI 에서 운영자의 오타를 잡는다
- 파일은 O_NOFOLLOW 로 한 번 열어 일반 파일 · 256KB 까지만 읽고, 모양이 틀린 id 도 없는 글과 같은 404 RES_001 이다
- 첫 글(2026-11-18.md)은 다음 배포 소식이다 — 파일 이름(날짜)은 배포 날로 고친다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
업데이트 내역(설정 모듈)도 같은 상태 틀을 쓰는데 모듈끼리 import 하지 않으므로 shared/widgets/load_states.dart 로 옮겼다.
모양 · 동작은 그대로다(MailStateLayout → StateLayout · MailListError → LoadErrorView · 막대 SkeletonBar · LoadingSkeleton). 메일 줄 꼴의 막대와 빈 메일함 등은 메일에 남는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
앱 버전 다음 줄에서 목록(제목 · 날짜, [더 보기])으로 들어가 줄을 누르면 글(날짜 · 제목 · 묶음, 다음 글 · 이전 글 줄)이 열린다.
없는 글 · 받지 못함 · 글 없음 상태를 두고, 날짜는 달력 날짜 글이라 시각으로 바꾸지 않는다(CalendarDate). 다른 글 줄은 지금 글을 바꿔 끼워 뒤로는 늘 목록이다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 설정 메뉴 셋째 묶음 "정보", 목록은 게시판 표(줄 전체 링크 · [더 보기]), 글은 [← 목록으로] · 다음 글 · 이전 글 줄 · [목록]
- 글을 보는 동안에도 메뉴 항목이 고른 상태다(aria-current 는 목록 page · 글 true)
- 문서가 스크롤하는 좁은 폭에서도 글 · 목록이 맨 위부터 보이고(라우터 전역 scrollBehavior 없이), 위에 붙은 줄에 초점이 가리지 않는다
- 날짜는 달력 날짜 글이라 시간대를 거치지 않는다, /settings/info 는 목록으로 바꿔 끼운다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
계약 7절(API 둘 · 글 파일 규칙)과 머리말의 달력 날짜 예외, 웹 · 앱 디자인 README 의 업데이트 내역 절, 세 스택 스킬 행을 더했다.
보드의 목록 최대 개수를 구현(100)에 맞추고, 편집 도구가 보이지 않는 글자의 이스케이프를 실제 글자로 푼 일을 공통 규칙에 적는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs(backend): 업데이트 내역 첫 글을 11월 5일 이후 바뀐 것으로 쓴다
CI (Flutter) / Flutter (analyze · test) (pull_request) Successful in 24m43s
CI / Backend (lint · type-check · test · e2e · build) (pull_request) Successful in 14m6s
CI / Frontend (lint · type-check · test · build) (pull_request) Successful in 13m45s
CI / Infra (compose · Dockerfile · nginx · 운영 스크립트) (pull_request) Successful in 2m4s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m43s
f0e9a50b01
1차 배포(11월 5일 전환) 뒤 만든 기능을 직원이 어디서 무엇을 누르면 되는지 중심으로 모았다(휴대폰 앱 · 웹메일과 휴대폰 앱 · 웹메일의 메일 읽기와 정리 · 주소록 · 설정 · 그 밖에).
앱에서도 보이는 글이라 묶음 머리에 어느 쪽 기능인지 적었다. 파일 이름(날짜)은 임시 — 배포 날로 고치고 메모 줄을 지운다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo added 4 commits 2026-11-10 22:15:57 +09:00
배포 일정이 11월 12일(목) 오전 1시로 정해져 파일 이름을 2026-11-12.md 로 바꾸고 날짜 메모 줄을 지웠다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
받는 사람 · 참조 · 숨은참조가 여러 줄이 되면 편집 영역(최소 300)이 줄지 않아 쓰기 칸 전체가 화면을 넘쳤다. 바깥 스크롤과 본문 스크롤이 겹치고,
흐름 끝의 [보내기] 줄이 화면 밖으로 밀렸다(사용자 보고 — 전 직원을 숨은참조에 넣었을 때).

- [보내기] 줄은 스크롤하는 칸의 아래에 붙는다(sticky). 겹침 차례는 편집기 툴바 2 < [보내기] 줄 3 < 받는 사람 추천 목록 · 메뉴를 연 툴바 4
- 칩 · 입력 칸은 96px 을 넘으면 그 칸 안에서 스크롤한다(초점 · 칩 추가 · 입력 때 맨 아래로). 넓은 화면은 편집 영역이 200 까지 먼저 줄어 보통 높이에서 바깥 스크롤이 생기지 않는다
- 넓은 화면에서 숨긴 낭독 글이 앱 틀 밖에 놓여 문서까지 스크롤하던 것을 고치고(.compose position: relative), [보내기] 줄에 가린 칸으로 옮긴 초점은 가린 만큼 올린다(useFocusAboveFooter)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
목록 보기의 줄은 줄 전체의 click 에서 event.target.closest('button') 로 단추를 가렸다. 상자 가운데(그림 rect)를 누르면 단추 처리기가 고르기를 바꾼 뒤
처리기 사이에 Vue 가 다시 그려 그 그림이 문서에서 떨어지고, 줄 처리기의 closest 가 비어 메일까지 열렸다(사용자 보고).

- 무엇을 눌렀는지는 사건이 지나간 길(composedPath — eventPathHas)로 가르고, 상자 · 별 그림은 pointer-events: none 이다
- 고르기 칸의 빈자리를 눌러도 고른다(Shift 는 범위 · Ctrl 은 하나씩), 별 칸의 빈자리는 아무 일도 없다. 대화로 묶은 목록의 줄도 같다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: 쓰기 화면 스크롤과 목록 고르기 칸 고침을 디자인 README · 스킬에 적는다
CI (Flutter) / Flutter (analyze · test) (pull_request) Successful in 23m1s
CI / Backend (lint · type-check · test · e2e · build) (pull_request) Successful in 14m22s
CI / Frontend (lint · type-check · test · build) (pull_request) Successful in 15m10s
CI / Infra (compose · Dockerfile · nginx · 운영 스크립트) (pull_request) Successful in 3m50s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m41s
CI (Flutter) / Flutter (analyze · test) (push) Successful in 22m57s
CI / Backend (lint · type-check · test · e2e · build) (push) Successful in 13m47s
CI / Frontend (lint · type-check · test · build) (push) Successful in 13m15s
CI / Infra (compose · Dockerfile · nginx · 운영 스크립트) (push) Successful in 1m51s
CI / 에러 코드 SSOT 동기화 검사 (push) Successful in 11m19s
f4a85fda27
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo changed title from feat: 업데이트 내역 — 웹 · 앱 설정에서 읽는 게시판(글은 저장소의 글 파일) to feat: 업데이트 내역 게시판 · 쓰기 화면 [보내기] 숨음과 목록 고르기 칸 고침 2026-11-10 22:16:19 +09:00
ttipo merged commit f4a85fda27 into main 2026-11-11 06:24:46 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ttipo/arasystem#26