Saeroon Developer Center
1Step 1 Start2Step 2 Connect· My statusDocs

이 문서의 큐

  1. 개요
  2. 부트 / 로더
  3. 회원 인증
  4. 인증 · 조건부 렌더 · 바인딩
  5. 게시판 / 글
  6. 목록 · 상세 · 작성 · 소유자 액션 · 필드
  7. 댓글
  8. 댓글 목록 · 작성 · 소유자 액션
  9. 쇼핑
  10. 진열 · 담기 · 배송비 · 주문조회 · 반품 · 위시리스트 · 동의
  11. 예약
  12. data-saeroon-booking (슬롯 예약 · Toss 결제)
  13. 폼 자동 연결
  14. data-saeroon-form (opt-in)
  15. 카탈로그 / 보유
  16. 카탈로그 목록 · 보유 목록 · 보유 토글
  17. 그룹
  18. 그룹 목록 · 개설 · 가입 · 명부 · 표식
  19. 컴패니언 속성
  20. 내부 / 자동 관리 마커
  21. 이벤트 (window)

개요

시작하기

Quickstart

기능 붙이기

FormsMembersBoardsShopCatalogsGroupsHoldings블로그 가져오기

앱 붙이기

앱 백엔드 붙이기앱 콜백 브리지

레퍼런스

속성 계약 (data-saeroon-*)CLI 레퍼런스 (@saeroon/cli)APIMCP예약 경로

마켓플레이스

Marketplace

문서 / 레퍼런스

이 문서의 큐
  1. 개요
  2. 부트 / 로더
  3. 회원 인증
  4. 인증 · 조건부 렌더 · 바인딩
  5. 게시판 / 글
  6. 목록 · 상세 · 작성 · 소유자 액션 · 필드
  7. 댓글
  8. 댓글 목록 · 작성 · 소유자 액션
  9. 쇼핑
  10. 진열 · 담기 · 배송비 · 주문조회 · 반품 · 위시리스트 · 동의
  11. 예약
  12. data-saeroon-booking (슬롯 예약 · Toss 결제)
  13. 폼 자동 연결
  14. data-saeroon-form (opt-in)
  15. 카탈로그 / 보유
  16. 카탈로그 목록 · 보유 목록 · 보유 토글
  17. 그룹
  18. 그룹 목록 · 개설 · 가입 · 명부 · 표식
  19. 컴패니언 속성
  20. 내부 / 자동 관리 마커
  21. 이벤트 (window)

속성 계약 (attributes)

이 파일은 코드에서 자동 생성됩니다. 직접 편집하지 마세요. 재생성: cd hosting-web && npx tsx scripts/gen-docs.ts 이름 진실 = @saeroon/web-sdk · @saeroon/shop-sdk · form-auto-attach · sdk-auto-inject 소스.

새로온에 배포한 정적 사이트는 HTML 요소에 data-* 속성을 선언하는 것만으로 회원·게시판·댓글·쇼핑·폼이 붙습니다. cli deploy 가 관련 속성을 감지해 SDK 로더를 자동 주입합니다.

개요

구분수비고
data-saeroon-* 속성(저자용)65아래 기능별 표
data-saeroon-* 내부 마커17SDK/CLI 가 자동 관리
미공개(보류)1content-editing P2-a 공개 범위 미결
data-saeroon-* 소스 총계83소스 추출 = 문서화(대조 PASS)
컴패니언 data-*55data-saeroon-* 와 함께 쓰는 일반 속성
부트/로더 data-*6script 태그(대개 cli 가 자동 inject)

부트 / 로더

SDK 로더 <script> 태그의 속성입니다. 대개 cli deploy 가 자동으로 심습니다.

속성적용 요소값·모드필수동작
data-site-id회원 SDK 로더 &lt;script&gt;사이트 UUID필수 — 없거나 빈 값이면 SDK 초기화 중단(console.error)테넌트/사이트 식별. auth-hint localStorage 키(saeroon:auth-hint:&lt;siteId&gt;)의 기반. cli deploy 가 자동 inject.
data-api-base회원/쇼핑 SDK 로더 &lt;script&gt;절대 URL · 빈 문자열=동일 출처 · 부재=https://api.saeroon.com선택ApiClient 의 API base. 속성 부재(null)면 운영 기본값, 빈 문자열이면 same-origin relative.
data-pk회원 SDK 로더 &lt;script&gt;publishable key (pk_live_…)조건부 — 없으면 회원 인증/쓰기 미동작(공개 read 일부만), console.warn테넌트 해석용 publishable key(비밀 아님, HTML 노출 허용). 매 요청 X-Saeroon-Pk 헤더로 전송. (구) data-api-key(sk_live_) 폐기.
data-site-slug쇼핑 SDK 로더 &lt;script&gt;사이트 slug필수 — 없으면 shop SDK 초기화 중단(console.error)공개 쇼핑 API 스코프(회원 SDK 의 siteId 아닌 siteSlug). cli deploy 가 자동 inject.
data-provider쇼핑 SDK 로더 &lt;script&gt;결제 provider (기본 toss)선택 — 부재 시 toss결제 provider 힌트. site-aware /client-config 로 승격 가능.
data-session-header쇼핑 SDK 로더 &lt;script&gt;"1" \"true" \"on" (옵트인)선택 — 기본 꺼짐X-Shop-Session 헤더(localStorage 세션 id)를 모든 쇼핑 요청에 싣는다. 🔴 백엔드 프리플라이트 허용 헤더 목록에 아직 없어(S8 배선 전) 교차 출처 정적 사이트에서 켜면 카트 요청 전체가 브라우저에서 막힌다 — 켜지 마라.

회원 인증

인증 · 조건부 렌더 · 바인딩

속성적용 요소값·모드필수동작
data-saeroon-authform(register/login/profile/password) · button·link(logout/withdraw/social)register · login · profile · password · logout · withdraw · kakao · naver · google · apple조건부 — 인증 UI 요소에 필수form 은 submit 에서 값(mode) 분기: register→회원가입, login→로그인, profile→프로필 수정(name/phone/displayName/avatarUrl/bio), password→비밀번호 변경(currentPassword/newPassword). logout·withdraw 는 버튼 클릭. 값이 kakao/naver/google/apple 이면 클릭 시 소셜 로그인으로 이동. 폼 값은 name 속성 필드에서 읽는다.
data-saeroon-if아무 컨테이너 요소logged-in · logged-out · tier:&lt;A,B,…&gt;선택로그인 상태/등급으로 el.style.display 토글. tier: 는 쉼표 분리 등급 중 하나라도 충족 시 표시. 등급 순서 Free&lt;Bronze&lt;Silver&lt;Gold&lt;Platinum(exact-case), 미상/오타 등급은 fail-closed(숨김).
data-saeroon-bind아무 요소 (input/textarea 는 value, 그 외 textContent)user.&lt;field&gt; — field ∈ id·siteId·email·name·displayName·avatarUrl·role·tier선택'user.' 로 시작하는 path 만 처리. 세션 회원의 해당 필드 값을 채운다. member 없으면 빈 문자열.
data-saeroon-errorform 내부 오류/상태 표시 요소 (없으면 SDK 가 생성)유무 (내용은 SDK 가 씀)선택 — 없으면 showError 가 &lt;div&gt; 를 만들어 append인증/글/댓글 폼의 오류·성공 메시지 대상. 성공 시 글자색을 초록(#080)으로 바꾼다. ?auth-error=&lt;code&gt; 로 복귀하면(소셜 실패) 사람말 메시지를 표기한다.
<form data-saeroon-auth="login"><input name="email"><input name="password" type="password"></form>
<div data-saeroon-if="tier:Gold,Platinum">등급 전용</div>
<span data-saeroon-bind="user.displayName"></span>
<div data-saeroon-error></div>

게시판 / 글

목록 · 상세 · 작성 · 소유자 액션 · 필드

속성적용 요소값·모드필수동작
data-saeroon-post-list컨테이너유무 (data-board-id 동반 의무)조건부 — 목록 컨테이너에 필수게시판 글 목록. 내부에 &lt;template data-saeroon-post-item&gt; 가 있으면 그 마크업을 글마다 복제(디자인 보존), 없으면 generic 카드 렌더. data-page-size(기본 10)·data-detail-base·data-saeroon-item-class-cycle 를 읽는다.
data-saeroon-post-item&lt;template&gt; (post-list 내부)유무선택 — 디자인 보존 모드용글 1건마다 복제되는 슬롯. 복제본 내부 [data-saeroon-field] 요소만 데이터로 채운다 → 디자인 손실 0.
data-saeroon-post-detail컨테이너유무선택글 상세. post id 는 URL ?post=&lt;id&gt; 또는 data-post-id 로 해석. 내부 [data-saeroon-field] 채움, 조회 시 서버가 viewCount 증가. 못 찾으면 [data-saeroon-empty] 토글.
data-saeroon-post-bodypost-detail 내부 본문 래퍼유무선택상세 로드 성공 시 display 를 노출한다(기본 숨김 마크업 지원). 초기 빈 상태에서 본문 깜빡임 방지.
data-saeroon-post-linkpost-item 템플릿 내부 링크유무선택href 에 "?post=&lt;id&gt;" 를 자동 부착. base = list[data-detail-base] 우선, 없으면 링크 기존 href. 요소가 없으면 출력 byte-동일(무영향).
data-saeroon-post-createform유무 (data-board-id 동반 의무)조건부 — 글쓰기 폼에 필수글 작성 폼. name="title"·name="content" 필드를 읽어 createPost 호출. data-visibility 로 공개범위 지정. 내부에 input[type=file][data-saeroon-post-image] 가 있으면 첨부 이미지를 R2 업로드 후 markdown 으로 본문에 삽입.
data-saeroon-post-imageinput[type=file] (post-create 내부)유무 ([multiple] 허용)선택 — 운영자 이미지 첨부용제출 전 선택 파일을 R2 업로드(uploadAsset) 후 markdown 을 content 앞에 삽입, contentType 을 markdown 으로 승격.
data-saeroon-post-actions컨테이너 (상세 내부)유무 (기본 hidden 권장)선택 — 소유자 액션 UI상세 응답의 isMine === true 일 때만 hidden 을 제거해 노출한다(작성자/운영자만). isMine 부재(구 백엔드) = 유지(하위호환).
data-saeroon-post-updateform유무선택 — 글 수정 폼submit 시 updatePost(title/content). 소유자(isMine)면 title/content 원문이 자동 프리필된다. 성공 후 상세 재조회 + saeroon:post-updated 이벤트.
data-saeroon-post-deletebutton유무선택 — 글 삭제 버튼confirm(data-confirm 기본 "이 글을 삭제할까요?") 후 deletePost. 성공 시 data-redirect 또는 현재 경로로 이동.
data-saeroon-fieldpost-list/detail/comment 스코프 내부 요소title · authorName · date · createdAt · content · viewCount · likeCount · commentCount · tag · thumbnail · image · thumbnailUrl · embed · depth · meta:&lt;key&gt;선택스코프의 글/댓글 값을 안전 렌더한다(텍스트/이미지 src/배경). content 는 contentType=markdown 만 안전 마크다운(escape-first) 렌더, 그 외 textContent. embed 는 https src 만. meta:&lt;key&gt; 는 게시판별 자유 메타.
data-saeroon-emptypost-list/detail/comment-list · product-list/detail · wishlist-list 내부 빈상태 요소유무선택목록이 비었거나 로드 실패 시 노출. data-keep-text 가 있으면 기본 문구를 덮어쓰지 않는다.
data-saeroon-date-localepost-list/comment-list (날짜 필드 스코프)BCP-47 locale (기본 ko-KR)선택date/createdAt 필드 표기 locale. 없으면 ko-KR(기존 출력과 동일).
data-saeroon-date-formatpost-list/comment-list (날짜 필드 스코프)long · (기본)선택long 이면 "YYYY년 M월 D일" 형식, 없으면 짧은 기본 형식.
data-saeroon-item-class-cyclepost-list공백 구분 클래스 목록선택복제본마다 클래스를 순환 적용(예: bento grid-span). 가변 글 수에서도 항목별 크기/위치 디자인을 보존한다.
data-saeroon-likebutton유무선택좋아요 토글. 익명은 localStorage UUID 로 중복 방지. aria-pressed·is-liked 클래스 갱신, [data-saeroon-field="likeCount"] 숫자 갱신.
<div data-saeroon-post-list data-board-id="00000000-0000-0000-0000-000000000000" data-page-size="10"></div>
<template data-saeroon-post-item><article><h3 data-saeroon-field="title"></h3></article></template>
<article data-saeroon-post-detail><h1 data-saeroon-field="title"></h1></article>
<div data-saeroon-post-body style="display:none"><div data-saeroon-field="content"></div></div>
<a data-saeroon-post-link href="/board/post/"><h3 data-saeroon-field="title"></h3></a>
<form data-saeroon-post-create data-board-id="00000000-0000-0000-0000-000000000000" data-visibility="OwnerOnly"><input name="title"><textarea name="content"></textarea></form>
<input type="file" data-saeroon-post-image multiple accept="image/*">
<div data-saeroon-post-actions hidden><button data-saeroon-post-delete>삭제</button></div>
<form data-saeroon-post-update><input name="title"><textarea name="content"></textarea></form>
<button data-saeroon-post-delete data-confirm="이 글을 삭제할까요?">삭제</button>
<h3 data-saeroon-field="title"></h3>
<p data-saeroon-empty>아직 글이 없습니다.</p>
<time data-saeroon-field="date" data-saeroon-date-locale="ko-KR"></time>
<time data-saeroon-field="date" data-saeroon-date-format="long"></time>
<div data-saeroon-post-list data-saeroon-item-class-cycle="b1 b2 b3"></div>
<button data-saeroon-like>좋아요 <b data-saeroon-field="likeCount">0</b></button>

댓글

댓글 목록 · 작성 · 소유자 액션

속성적용 요소값·모드필수동작
data-saeroon-comment-list컨테이너유무선택댓글 목록(디자인 보존 template 모드). post id = ?post= 또는 data-post-id. 삭제/수정 버튼의 이벤트 위임 루트이기도 하다. data-page-size 기본 50.
data-saeroon-comment-item&lt;template&gt; (comment-list 내부)유무선택댓글 1건마다 복제되는 슬롯. 대댓글(depth&gt;0)은 복제본에 data-comment-depth 가 붙어 스타일 훅을 준다.
data-saeroon-comment-createform유무선택댓글 작성 폼. name="content"(필수)·name="authorName"(익명 허용 보드)·name="parentId"(대댓글). 성공 시 목록 + 댓글 수 갱신.
data-saeroon-comment-actions컨테이너 (comment-item 내부)유무 (기본 hidden 권장)선택 — 소유자 액션댓글 isMine === true 인 복제본만 hidden 제거. 어휘 요소 없는 복제본은 출력 무변화.
data-saeroon-comment-editbutton (comment-list 내부)유무선택클릭 시 같은 댓글의 [data-saeroon-comment-edit-form] hidden 을 토글(수정 폼 열기/닫기). 이벤트 위임.
data-saeroon-comment-edit-formform 또는 래퍼 (comment-item 내부)유무선택댓글 수정 폼. 소유자면 textarea[name="content"] 에 원문이 프리필된다. submit 시 updateComment.
data-saeroon-comment-deletebutton (comment-list 내부)유무선택confirm(data-confirm 기본 "이 댓글을 삭제할까요?") 후 deleteComment. 성공 시 목록 갱신. 이벤트 위임.
<div data-saeroon-comment-list><template data-saeroon-comment-item>…</template></div>
<template data-saeroon-comment-item><b data-saeroon-field="authorName"></b><p data-saeroon-field="content"></p></template>
<form data-saeroon-comment-create><textarea name="content"></textarea></form>
<span data-saeroon-comment-actions hidden><button data-saeroon-comment-edit>수정</button></span>
<button data-saeroon-comment-edit>수정</button>
<form data-saeroon-comment-edit-form hidden><textarea name="content"></textarea></form>
<button data-saeroon-comment-delete data-confirm="이 댓글을 삭제할까요?">삭제</button>

쇼핑

진열 · 담기 · 배송비 · 주문조회 · 반품 · 위시리스트 · 동의

속성적용 요소값·모드필수동작
data-saeroon-shop아무 요소유무선택 — 쇼핑 SDK inject 트리거cli deploy 가 이 마커(또는 아래 쇼핑 기능 속성 중 하나)를 보면 @saeroon/shop-sdk 로더를 &lt;head&gt;에 자동 inject 한다. 런타임 바인더가 읽는 마커는 아니다(주입 트리거 전용). MCP 배포는 아직 shop·add-to-cart·cart-count 3종만 보므로 &lt;body data-saeroon-shop&gt; 을 권장.
data-saeroon-add-to-cartbutton유무 (data-product-id 또는 data-product-slug 동반 의무)조건부 — 담기 버튼에 필수클릭 시 서버 카트에 담는다(수량 = data-quantity 또는 data-quantity-from, 기본 1 · 변형 = data-variant-id 또는 data-variant-from). 문서 위임이라 진열 복제본 안 버튼도 동작. 진행 중 disabled+aria-busy. 성공 시 data-toast 메시지·data-redirect 이동.
data-saeroon-cart-count요소(배지)유무선택장바구니 총 수량 배지. 초기값 + saeroon:cart-change 이벤트마다 textContent 갱신.
data-saeroon-shop-error요소유무 (내용은 SDK 가 씀)선택담기·진열·찜·주소검색 실패 시 오류 메시지 대상. 요소가 없으면 saeroon:toast 이벤트로 대체 표면화.
data-saeroon-product-list컨테이너유무 (data-page-size · data-category-id · data-detail-base 선택)선택 — 상품 진열공개 상품 목록을 불러와 안의 &lt;template data-product&gt; 를 상품마다 복제한다(없으면 generic 카드). 복제본의 [data-product-field] 를 채우고, [data-product-link] 에 상세 링크(?product=&lt;slug&gt;)를 붙이며, 상품이 지정되지 않은 [data-saeroon-add-to-cart] 에 data-product-id 를 넣는다. 비었거나 실패하면 [data-saeroon-empty] 노출. 60초 캐시.
data-saeroon-product-detail컨테이너유무 (data-product-slug 또는 URL ?product=)선택 — 상품 상세상품 하나를 불러와 안의 [data-product-field] 를 채운다. [data-product-images] 갤러리, &lt;select data-product-variants&gt; 변형 옵션을 렌더하고, 담기 버튼에 data-product-id · data-variant-from 을 자동 배선한다. 품절이면 담기 버튼 disabled.
data-saeroon-address-searchbutton유무 (data-zip-target · data-address-target · data-detail-target · data-embed 선택)선택 — 우편번호 검색클릭 시 Kakao 우편번호 검색(키 불필요)을 팝업(또는 data-embed 요소에 임베드)으로 열고, 완료 시 우편번호·도로명주소를 지정 input 에 채운 뒤 input/change 이벤트와 saeroon:address-selected 를 발행한다(배송비 재계산 트리거). 우편번호가 비면 권역 추가배송비가 0 이 된다.
data-saeroon-shipping-cost요소유무 (data-zip-from · data-shipping-field 선택)선택 — 배송비 미리보기카트 소계 + 우편번호(data-zip-from 선택자, 기본 input[name=shippingPostalCode])로 calculate-shipping 을 불러 배송비를 표시한다. 무료면 "무료". data-shipping-field 로 baseCost · zoneSurcharge · matchedZoneName · isFreeShipping 세부 항목 선택. 권역이 맞으면 data-zone 부착. 카트 변경·우편번호 입력·주소 선택마다 재계산.
data-saeroon-order-total요소유무선택소계 + 배송비 합계를 표시한다(안내용 — 결제 금액은 서버가 다시 계산). 배송비 슬롯과 같은 트리거로 갱신.
data-saeroon-cart-subtotal요소유무선택카트 소계(상품 금액 합)를 표시한다. saeroon:cart-change 마다 갱신.
data-saeroon-order-lookupform유무 (name=orderNumber · name=phone 필드 의무)선택 — 비회원 주문조회제출 시 주문번호 + 주문 시 전화번호로 orders/lookup 을 불러 [data-saeroon-order-result] 를 채우고, 페이지에 [data-saeroon-order-tracking]·[data-saeroon-order-returns] 가 있으면 추적(X-Order-Phone)·반품 목록도 이어서 조회한다. 실패·400 은 [data-saeroon-order-error] 에 사용자 문구.
data-saeroon-order-result컨테이너 (기본 hidden 권장)유무선택조회 성공 시 hidden 을 풀고 안의 [data-order-field=orderNumber\status\statusLabel\total\subtotal\shippingCost\discountAmount\shippingName\shippingPhone\shippingAddress\shippingMemo\createdAt\paidAt\shippedAt\deliveredAt\trackingNumber\carrier\paymentMethodType\virtualAccount*\itemCount] 를 채운다. data-order-status 부착. 결제된 주문만 [data-saeroon-return-open] 노출.
data-saeroon-order-error요소유무 (내용은 SDK 가 씀)선택주문조회·추적·반품의 오류 문구 대상(폼 안 우선, 없으면 문서). 없으면 saeroon:toast 로 대체.
data-saeroon-order-items컨테이너 (order-result 안)유무선택주문 품목을 &lt;template data-order-item&gt; 으로 복제해 [data-order-item-field=productName\quantity\unitPrice\totalPrice\optionSnapshot\variantSku\refundedQuantity] 를 채운다. 복제본에 data-order-item-id 부착.
data-saeroon-order-tracking컨테이너 (기본 hidden 권장)유무선택 — 배송 추적조회 뒤 X-Order-Phone 자격으로 tracking 을 불러 [data-tracking-field=carrier\trackingNumber\currentStatus\trackingUrl] 을 채우고 [data-tracking-link] 에 택배사 딥링크 href, [data-tracking-events] 에 &lt;template data-tracking-event&gt; 복제(time\status\location\description). 전화번호 누락 400 등 오류는 currentStatus 와 order-error 에 표시.
data-saeroon-order-returns컨테이너유무선택이 주문의 반품·교환 신청 목록을 &lt;template data-return-row&gt; 로 복제해 [data-return-field=returnNumber\type\typeLabel\status\statusLabel\reason\requestedAt\refundAmount\rejectionReason] 를 채운다. 0건이면 hidden.
data-saeroon-return-openbutton유무 (data-target 선택)선택클릭 시 [data-saeroon-return-form](또는 data-target) 의 hidden 을 풀고 조회한 주문 품목을 반품 폼에 렌더한다. 결제 전·취소·환불 주문에서는 SDK 가 숨긴다.
data-saeroon-return-formform (기본 hidden 권장)유무 (name=type[Return\Exchange] · name=reason 필드)선택 — 반품·교환 신청제출 시 선택 품목(orderItemId · quantity)과 사유·유형을 조회 세션의 전화번호와 함께 POST orders/{n}/returns 로 보낸다. 품목 미선택·사유 없음은 네트워크 없이 order-error. 성공 시 [data-saeroon-return-result] 에 접수번호 + saeroon:return-created.
data-saeroon-return-items컨테이너 (return-form 안)유무선택조회한 주문의 반품 가능 품목(주문 수량 − 환불 수량 &gt; 0)을 체크박스(name=orderItemId) + 수량(name=quantity, 상한 자동)으로 렌더한다. &lt;template data-return-item&gt; 이 있으면 그 마크업을 복제([data-return-field=productName\quantity\unitPrice]).
data-saeroon-return-result요소유무 (내용은 SDK 가 씀)선택반품·교환 신청 성공 문구(접수번호) 대상. 없으면 saeroon:toast.
data-saeroon-wishlist-togglebutton유무 (data-product-id 동반 의무 — 진열 복제본 안에서는 자동)선택 — 찜클릭 시 찜 추가/해제를 토글하고 aria-pressed · data-saeroon-wishlisted="true\false" 를 갱신한다. 부트 시 목록 1회 조회로 상태를 칠하고(토글마다 check 호출 0) 변경 뒤 재조회. 세션 기반(로그인 병합 없음).
data-saeroon-wishlist-count요소(배지)유무선택찜 개수 배지. saeroon:wishlist-change 마다 갱신.
data-saeroon-wishlist-list컨테이너유무 (data-detail-base 선택)선택찜 목록을 &lt;template data-wishlist-item&gt; 으로 복제해 [data-wishlist-field=productName\price\thumbnail\productId\inStock\addedAt] 를 채운다. 복제본 안 토글·담기 버튼에 data-product-id 자동. 비었으면 [data-saeroon-empty].
data-saeroon-checkout-consents컨테이너유무 (data-consent-types 선택 — 기본 terms,privacy,marketing)선택 — 체크아웃 동의비어 있으면 동의 체크박스(input[data-consent-type], terms·privacy 는 required)를 렌더한다. saeroonShop.checkout() 이 request.consents 없이 불리면 문서의 [data-consent-type] 을 자동 수집해 CheckoutRequest.consents 로 보내고, required 미체크가 있으면 주문을 만들지 않는다.
<body data-saeroon-shop>
<button data-saeroon-add-to-cart data-product-id="{id}" data-quantity="1">담기</button>
<span data-saeroon-cart-count>0</span>
<div data-saeroon-shop-error></div>
<section data-saeroon-product-list data-page-size="12"><template data-product><article><h3 data-product-field="name"></h3><p data-product-field="price"></p><button data-saeroon-add-to-cart>담기</button></article></template></section>
<article data-saeroon-product-detail data-product-slug="rose"><h1 data-product-field="name"></h1><select data-product-variants></select><button data-saeroon-add-to-cart>담기</button></article>
<button type="button" data-saeroon-address-search data-zip-target="#zip" data-address-target="#addr" data-detail-target="#addr2">우편번호 찾기</button>
<span data-saeroon-shipping-cost data-zip-from="#zip"></span>
<span data-saeroon-order-total></span>
<span data-saeroon-cart-subtotal></span>
<form data-saeroon-order-lookup><input name="orderNumber"><input name="phone"><button>조회</button><p data-saeroon-order-error hidden></p></form>
<section data-saeroon-order-result hidden><span data-order-field="statusLabel"></span></section>
<p data-saeroon-order-error hidden></p>
<ul data-saeroon-order-items><template data-order-item><li><span data-order-item-field="productName"></span></li></template></ul>
<div data-saeroon-order-tracking hidden><a data-tracking-link target="_blank">배송조회</a><ol data-tracking-events><template data-tracking-event><li><span data-tracking-field="status"></span></li></template></ol></div>
<ul data-saeroon-order-returns hidden><template data-return-row><li><span data-return-field="statusLabel"></span></li></template></ul>
<button type="button" data-saeroon-return-open>반품·교환 신청</button>
<form data-saeroon-return-form hidden><select name="type"><option value="Return">반품</option><option value="Exchange">교환</option></select><textarea name="reason"></textarea><div data-saeroon-return-items></div><button>신청</button></form>
<div data-saeroon-return-items></div>
<p data-saeroon-return-result hidden></p>
<button data-saeroon-wishlist-toggle data-product-id="{id}">♡</button>
<span data-saeroon-wishlist-count>0</span>
<ul data-saeroon-wishlist-list><template data-wishlist-item><li><span data-wishlist-field="productName"></span><button data-saeroon-wishlist-toggle>삭제</button></li></template></ul>
<div data-saeroon-checkout-consents></div>

예약

data-saeroon-booking (슬롯 예약 · Toss 결제)

속성적용 요소값·모드필수동작
data-saeroon-booking예약 위젯 루트 컨테이너data-mode="appointment"(기본·회차 슬롯) \"stay"(숙박 날짜범위) \"stay-manage"(숙박 조회/취소) · data-service="&lt;id&gt;"(appointment 단일서비스 락) · data-room-type="&lt;id\slug&gt;"(stay 단일룸 락) · data-toss-client-key="&lt;pk&gt;"(생략 시 플랫폼 client-config 런타임 조달)선택 — booking SDK inject 트리거 + 위젯 루트cli deploy 가 이 마커를 보면 web-sdk 로더 + data-site-slug(공개 booking/stay API=slug 스코프)를 주입한다. [appointment] 바인더가 루트 안에서 명명 영역을 채운다: [data-booking-services]+&lt;template data-booking-service&gt;([data-booking-field=name\price\description\duration]) → [data-booking-cal-grid]/[data-booking-cal-prev\next]/[data-booking-cal-title] 월달력 → [data-booking-slots]+&lt;template data-booking-slot&gt; → formdata-booking-form → Toss v2 → [data-booking-result]+[data-booking-result-status\number\message]. 오류=[data-booking-error]. 익명(guest-token)·서버 결제 확정 포함. [stay] 반열림 [체크인,체크아웃) 날짜범위·룸타입 재고·박별 합산·전액/보증금: [data-stay-rooms]+&lt;template data-stay-room&gt;([data-stay-field=name\description\rate\capacity\min-stay]) → [data-stay-cal-grid]/[data-stay-cal-prev\next]/[data-stay-cal-title] 범위달력(셀 is-open/is-off/is-ci/is-co/is-in-range) → &lt;select data-stay-guests&gt; → [data-stay-quote]([data-stay-quote-rows]+&lt;template data-stay-night&gt;([data-stay-field=date\rate\label])·[data-stay-quote-room-total\extra-total\addons-total\total\paynow\remain])·[data-stay-mode-toggle](보증금 허용 시 바인더 렌더) → formdata-stay-form → hold(TTL 재고 점유) → Toss v2 → [data-stay-result]+[data-stay-result-status\number\message]. 선택 표시=[data-stay-selected-room\range]·오류=[data-stay-error]. [stay-manage] 예약 조회/취소(?bn=&amp;gid= 또는 예약 브라우저 localStorage 복원): [data-stay-manage-status\number\range\guests\total\paid\refund\message] → [data-stay-cancel] 클릭 시 취소정책 스냅샷 환불 미리보기 [data-stay-cancel-preview]([data-stay-cancel-refund\fee\rate\reason]) → [data-stay-cancel-confirm]. 조회/취소 토큰(gid)은 URL 미노출(localStorage) — 예약한 브라우저에서만 자동 복원.
<div data-saeroon-booking data-mode="stay">…</div> / <div data-saeroon-booking data-mode="stay-manage">…</div>

폼 자동 연결

data-saeroon-form (opt-in)

속성적용 요소값·모드필수동작
data-saeroon-form&lt;form&gt;form slug조건부 — 자동 연결할 폼에 필수(opt-in)cli deploy 가 이 폼을 감지 → 필드 자동 추출 → saeroon-api 폼 upsert → HTML 변환(속성 제거·id/action/method 설정·Turnstile 위젯·submit JS 삽입). 값이 곧 saeroon-api 폼 slug.
data-saeroon-name&lt;form&gt;폼 이름선택form 의 name 속성이 없을 때 폼 이름(관리자 UI 표기)으로 쓰인다.
data-saeroon-includehidden input (data-saeroon-form 내부)"true"선택hidden 입력은 기본 필드 추출에서 제외된다. "true" 를 박으면 명시적으로 포함한다.
<form data-saeroon-form="contact"><input name="email"></form>
<form data-saeroon-form="contact" data-saeroon-name="문의하기"></form>
<input type="hidden" name="source" value="landing" data-saeroon-include="true">

카탈로그 / 보유

도감·배지처럼 이름 붙은 목록과, 회원이 그중 무엇을 가졌는지의 기록입니다. 목록을 보여 주는 것은 공개 읽기라 로그인이 필요 없고, 보유는 회원 세션으로만 돕니다.

정의(스키마·쓰기 정책)는 저자가 아니라 운영자가 CLI catalog apply 로 정합니다. 자세한 것은 Catalogs · Holdings 에 있습니다.

카탈로그 목록 · 보유 목록 · 보유 토글

속성적용 요소값·모드필수동작
data-saeroon-catalog-list컨테이너유무 (data-catalog 동반 의무)조건부 — 카탈로그 항목을 보여줄 컨테이너에 필수카탈로그 항목 목록(은퇴분 제외·공개 읽기). 내부 &lt;template&gt; 를 항목마다 복제하고 그 안의 [data-saeroon-field] 를 채운다 — name·sortOrder 등 항목 필드, attr:&lt;키&gt; 는 항목 속성. template 이 없으면 아무것도 그리지 않는다(임의 DOM 을 만들어 디자인을 흐트러뜨리지 않는다). 비었으면 [data-saeroon-empty] 를 토글.
data-saeroon-holding-list컨테이너유무 (data-catalog 동반 의무)조건부 — 회원 보유 목록 컨테이너에 필수로그인한 회원이 그 카탈로그에서 보유한 항목. 렌더 방식은 catalog-list 와 같고 필드는 itemName·quantity·isRetired 등이다. 비로그인이면 요청을 보내지 않고 안내 문구만 남긴다(401 왕복·콘솔 노이즈 회피). 은퇴한 항목의 보유도 그대로 나오며 isRetired 로 구분한다.
data-saeroon-holding-toggle버튼유무 (data-catalog · data-item-id 동반 의무)조건부 — 보유를 켜고 끄는 버튼에 필수클릭하면 그 항목의 보유를 켜거나 끈다. 🔴 저장 API(PUT /holdings/me)가 replace-all 이라 바인더는 현재 보유 전체를 먼저 읽어 한 항목만 더하거나 뺀 목록을 저장한다 — 직접 구현할 때 이 단계를 건너뛰면 클릭 한 번에 나머지 보유가 전부 지워진다. 처리 후 data-saeroon-held="true\false" 를 남기고 saeroon:holding-changed 이벤트를 올린다.
<div data-saeroon-catalog-list data-catalog="flowers"><template><li data-saeroon-field="name"></li></template></div>
<div data-saeroon-holding-list data-catalog="flowers"><template><li data-saeroon-field="itemName"></li></template></div>
<button data-saeroon-holding-toggle data-catalog="flowers" data-item-id="<itemId>">보유</button>

그룹

회원이 모임을 만들고 가입하는 구조입니다. 전부 회원 세션으로 돌며, 규칙(정책·직위)은 운영자가 CLI group apply 로 미리 정해 둡니다 — 저자는 그 위에 화면만 얹습니다. 자세한 것은 Groups 에 있습니다.

그룹 목록 · 개설 · 가입 · 명부 · 표식

속성적용 요소값·모드필수동작
data-saeroon-group-list컨테이너유무 (data-policy 동반 의무)조건부 — 그룹 목록 컨테이너에 필수그 정책 아래 개설된 그룹 목록(공개 읽기). 내부 &lt;template&gt; 복제 + [data-saeroon-field] 채움 — name·description·memberCount 등.
data-saeroon-group-create&lt;form&gt;유무 (data-policy 동반 의무)조건부 — 그룹 개설 폼에 필수그룹을 개설한다. 폼 필드 name(필수)·description·roleKey 를 읽는다. 정책의 allowMemberCreatedGroups 가 꺼져 있으면 서버가 403 으로 막는다. 성공 시 폼을 비우고 saeroon:group-created 이벤트를 올린다.
data-saeroon-group-apply버튼유무 (data-group-id 동반 의무)조건부 — 가입 신청 버튼에 필수그 그룹에 가입을 신청한다. 승인제 정책이면 신청으로 남고, 아니면 서버가 즉시 가입 처리한다. data-invite-code·data-role-key 를 함께 읽는다. 처리 후 saeroon:group-applied 이벤트를 올린다.
data-saeroon-group-members컨테이너유무 (data-group-id 동반 의무)조건부 — 그룹원 명부 컨테이너에 필수그룹원 명부를 서열 내림차순으로 그린다. 필드는 displayName·roleKey·roleLabel·rankLevel·isLeadership 등.
data-saeroon-group-mark버튼유무 (data-group-id · data-member-id 동반 의무)조건부 — 조율 표식 버튼에 필수그룹 안에서 다른 회원의 항목에 표식을 남긴다(담당 배정·확인 완료 등). data-item-id·data-mark-key 를 함께 읽는다. 그 회원의 직위에 marks.manage 권한이 없으면 서버가 403 으로 막는다 — 버튼을 숨기는 것은 편의일 뿐 판정은 서버가 한다. 처리 후 saeroon:group-marked 이벤트를 올린다.
<div data-saeroon-group-list data-policy="guilds"><template><li data-saeroon-field="name"></li></template></div>
<form data-saeroon-group-create data-policy="guilds"><input name="name" required></form>
<button data-saeroon-group-apply data-group-id="<groupId>">가입 신청</button>
<div data-saeroon-group-members data-group-id="<groupId>"><template><li data-saeroon-field="displayName"></li></template></div>
<button data-saeroon-group-mark data-group-id="<groupId>" data-member-id="<memberId>" data-item-id="<itemId>">표식</button>

컴패니언 속성

data-saeroon-* 는 아니지만 위 기능과 함께 쓰는 일반 data-* 속성입니다.

속성적용 요소값·모드필수동작
data-saeroon-ctdata-saeroon-editable 요소ContentType 이름필수 — 편집 영역 네 짝의 하나그 편집 값이 저장될 ContentType. 정적 사이트 인라인 편집은 예약 CT(page/site)를 쓴다.
data-saeroon-entrydata-saeroon-editable 요소엔트리 키필수 — 편집 영역 네 짝의 하나그 편집 값이 저장될 엔트리. 보통 페이지 키(home·about 등)를 쓴다.
data-catalogcatalog-list · holding-list · holding-toggle카탈로그 key필수 — 없으면 해당 요소는 no-op어느 카탈로그인지 지정. 운영자가 CLI catalog apply 로 만든 key 를 그대로 쓴다.
data-policygroup-list · group-create그룹 정책 key필수 — 없으면 해당 요소는 no-op어느 그룹 정책인지 지정. 운영자가 CLI group apply 로 만든 key 를 그대로 쓴다.
data-group-idgroup-apply · group-members · group-mark그룹 id (GUID)필수 — 없으면 해당 요소는 no-op대상 그룹. group-list 가 그린 복제본에서 읽거나 URL 쿼리로 넘긴 값을 쓴다.
data-item-idholding-toggle · group-mark카탈로그 항목 id (GUID)조건부 — holding-toggle 은 필수, group-mark 는 선택대상 항목. catalog-list 가 그린 복제본에 이 속성이 자동으로 붙는다.
data-member-idgroup-mark대상 회원 id (GUID)필수 — 없으면 해당 요소는 no-op표식을 받을 회원. group-members 명부에서 읽는다(자기 자신이 아니라 남에게 찍는 표식이다).
data-mark-keygroup-mark표식 종류 문자열선택표식의 종류를 사이트가 정하는 어휘로 남긴다(담당 배정·확인 완료 등). 서버는 값을 해석하지 않고 저장한다.
data-invite-codegroup-apply초대 코드조건부 — 정책의 requireInviteWhileForming 이 켜져 있으면 결성 중 가입에 필요초대 코드를 실어 가입을 신청한다.
data-role-keygroup-apply직위 key선택희망 직위를 지정해 신청한다. 미지정 시 정책의 isDefault 직위를 받는다.
data-board-idpost-list · post-create게시판 GUID필수 — slug 가 아니라 GUID 다어느 게시판인지 지정. 없으면 해당 요소는 console.warn 후 no-op. slug 를 넣으면 공개 API 경로 제약(boards/{boardId:guid})에 걸려 404 — 화면이 조용히 빈다. GUID = saeroon board create --site &lt;siteId&gt; --slug &lt;slug&gt; 출력의 boardId.
data-page-sizepost-list(기본 10) · comment-list(기본 50) · product-list(기본 20)정수선택한 번에 불러올 글/댓글 수.
data-visibilitypost-createPublic · MembersOnly · OwnerOnly선택글 공개 범위. OwnerOnly = 작성자/운영자만 조회(비공개 문의 등).
data-detail-basepost-list · product-list · wishlist-listURL 경로 base선택목록→상세 링크 base. data-saeroon-post-link 의 href 접두로 쓰인다.
data-post-idpost-detail · post-actions · post-update · post-delete글 id선택 — 없으면 URL ?post= 사용post id 를 명시. 우선순위: data-post-id &gt; ?post= 쿼리.
data-confirmauth=withdraw · post-delete · comment-delete확인 메시지선택 — 부재 시 기본 문구삭제/탈퇴 전 confirm() 대화상자 문구.
data-redirectauth form/logout/withdraw · post-delete · add-to-cartURL 경로선택동작 성공 후 이동할 경로(logout/withdraw 는 기본 "/").
data-returnauth=kakao/naver/google/apple (소셜)상대 또는 절대 URL선택소셜 로그인 후 돌아올 경로. 현재 위치 기준 절대 https URL 로 만들어 전달한다.
data-keep-text[data-saeroon-empty]유무선택빈 상태 요소의 기본 문구를 SDK 가 덮어쓰지 않게 보존한다.
data-product-idadd-to-cart상품 GUID필수(둘 중 하나)담을 상품(실 id).
data-product-slugadd-to-cart상품 slug선택(대안) — slug→id 조회slug 만 아는 상세 페이지용. 서버에서 상품을 조회해 실 id 로 담는다.
data-quantityadd-to-cart정수(&gt;0)선택 — 기본 1담을 수량(직접 지정).
data-quantity-fromadd-to-cartCSS 선택자선택수량을 읽을 input 선택자. data-quantity 없을 때 사용.
data-toastadd-to-cart성공 문구선택담기 성공 시 saeroon:toast 이벤트로 표면화할 메시지.
data-variant-idadd-to-cart변형(옵션 조합) GUID선택옵션 상품의 변형을 직접 지정해 담는다.
data-variant-fromadd-to-cartCSS 선택자(&lt;select&gt;)선택 — 상세 바인더가 자동 부착변형 id 를 읽을 select 선택자. 값이 비고 select 가 보이면 "옵션을 선택해 주세요" 로 막는다(담기 요청 0).
data-product&lt;template&gt; (product-list 안)유무선택 — 디자인 보존 모드상품 1건마다 복제되는 슬롯. 없으면 generic 카드.
data-product-fieldproduct-list 복제본 · product-detail 안 요소name · price · compareAtPrice · discountPercentage · description · thumbnail · image · slug · stock · isAvailable · category선택상품 값을 안전 렌더한다(텍스트/이미지 src·배경). price 는 "22,800원" 형식, compareAtPrice·discountPercentage 는 해당 없으면 숨김, isAvailable 은 "구매 가능"/"품절" + data-available.
data-product-linkproduct-list 복제본 안 &lt;a&gt;유무선택href 를 상세 링크로 바꾼다 — data-detail-base 가 있으면 "{base}?product=&lt;slug&gt;", 없으면 기존 href 에 ?product= 부착.
data-product-slugproduct-detail · add-to-cart상품 slug조건부 — 상세는 URL ?product= 로 대체 가능상세 바인더가 불러올 상품. 담기 버튼에서는 slug→id 조회 후 담는다.
data-product-imagesproduct-detail 안 컨테이너유무 (&lt;template data-product-image&gt; 선택)선택상품 이미지(썸네일 + imageUrls)마다 템플릿을 복제해 [data-product-field=image] 에 src 를 채운다. 템플릿 없으면 &lt;img&gt;.
data-product-image&lt;template&gt; (product-images 안)유무선택이미지 1장마다 복제되는 슬롯.
data-product-variantsproduct-detail 안 &lt;select&gt;유무선택 — 옵션 상품이면 필수변형 옵션을 &lt;option value=variantId&gt;(옵션 조합 + 가격차 · 품절 disabled)로 채운다. 변형이 없으면 hidden. 담기 버튼의 data-variant-from 을 여기로 자동 연결.
data-category-idproduct-list카테고리 GUID선택목록을 카테고리로 거른다.
data-zip-targetaddress-searchCSS 선택자(input)선택우편번호(zonecode)를 채울 input.
data-address-targetaddress-searchCSS 선택자(input)선택도로명주소(건물명 괄호)를 채울 input.
data-detail-targetaddress-searchCSS 선택자(input)선택주소 선택 뒤 포커스를 옮길 상세주소 input.
data-embedaddress-searchCSS 선택자(컨테이너)선택 — 부재 시 팝업검색창을 팝업 대신 이 요소에 임베드한다(완료 시 자동 닫힘).
data-zip-fromshipping-costCSS 선택자(input)선택 — 부재 시 input[name=shippingPostalCode]배송비 계산에 쓸 우편번호 input.
data-shipping-fieldshipping-costtotalShippingCost(기본) · baseCost · zoneSurcharge · matchedZoneName · isFreeShipping선택배송비 슬롯이 보여줄 세부 항목.
data-order-fieldorder-result 안 요소orderNumber · status · statusLabel · total · subtotal · shippingCost · discountAmount · shippingName · shippingPhone · shippingAddress · shippingPostalCode · shippingMemo · createdAt · paidAt · shippedAt · deliveredAt · trackingNumber · carrier · paymentMethodType · virtualAccountNumber · virtualAccountBank · virtualAccountHolder · virtualAccountDueDate · itemCount선택조회한 주문 값을 렌더한다. virtualAccount* 는 가상계좌 주문이 아니면 숨김.
data-order-item&lt;template&gt; (order-items 안)유무선택주문 품목 1건마다 복제되는 슬롯.
data-order-item-fieldorder-item 복제본 안 요소productName · quantity · unitPrice · totalPrice · optionSnapshot · variantSku · refundedQuantity선택품목 값 렌더.
data-tracking-fieldorder-tracking 안 요소carrier · trackingNumber · currentStatus · trackingUrl (이벤트 복제본: time · status · location · description)선택추적 값 렌더. currentStatus 는 오류 시 오류 문구가 들어간다.
data-tracking-linkorder-tracking 안 &lt;a&gt;유무선택택배사 조회 딥링크 href. 추적 정보가 없으면 hidden.
data-tracking-eventsorder-tracking 안 컨테이너유무 (&lt;template data-tracking-event&gt; 선택)선택배송 이벤트마다 템플릿을 복제한다.
data-tracking-event&lt;template&gt; (tracking-events 안)유무선택배송 이벤트 1건 슬롯.
data-return-row&lt;template&gt; (order-returns 안)유무선택기존 반품·교환 신청 1건 슬롯.
data-return-fieldreturn-row · return-item 복제본 안 요소returnNumber · type · typeLabel · status · statusLabel · reason · requestedAt · refundAmount · rejectionReason (반품 품목: productName · quantity · unitPrice)선택반품 값 렌더.
data-return-item&lt;template&gt; (return-items 안)유무 (input[name=orderItemId] 체크박스 · input[name=quantity] 포함 권장)선택반품 가능 품목 1건 슬롯. 없으면 generic 라벨+체크박스.
data-consent-typecheckout 동의 체크박스 inputterms · privacy · marketing · 임의 문자열 (required 로 필수 표시)선택체크 상태가 CheckoutRequest.consents 로 서버에 기록된다. required 미체크면 checkout 이 주문을 만들지 않는다.
data-consent-typescheckout-consents쉼표 구분 유형 목록선택 — 기본 terms,privacy,marketing자동 렌더할 동의 유형을 고른다.
data-wishlist-item&lt;template&gt; (wishlist-list 안)유무선택찜 1건 슬롯.
data-wishlist-fieldwishlist-item 복제본 안 요소productName · price · thumbnail · productId · inStock · addedAt선택찜 값 렌더.
data-wishlist-linkwishlist-item 복제본 안 &lt;a&gt;유무선택wishlist-list 의 data-detail-base 가 있으면 "{base}?productId=&lt;id&gt;" 링크.

내부 / 자동 관리 마커

아래 속성은 저자가 직접 쓰지 않습니다. SDK 런타임 또는 cli deploy 가 자동으로 부착·관리합니다. 참고용으로만 기재합니다.

속성적용 요소값·모드필수동작
data-saeroon-auth-hint&lt;html&gt; (cli 가 &lt;head&gt; 인라인 리더로 삽입)유무내부 — 저자 미작성코어 로드 전 첫 페인트 동안 잘못된 data-saeroon-if 브랜치를 숨겨 로그인 카드 플래시를 막는 pre-paint cloak 짝. 인증 정합 후 &lt;html&gt;.saeroon-auth-ready 로 비활성화.
data-saeroon-post-renderedpost-item 복제본유무내부 — 런타임 마커렌더된 글 복제본을 표시. 재렌더 시 이전 복제본만 교체(정적 마크업/템플릿 보존)하는 데 쓰인다.
data-saeroon-comment-renderedcomment-item 복제본유무내부 — 런타임 마커렌더된 댓글 복제본 표시. 재렌더 시 이전 복제본만 교체.
data-saeroon-sdk-injected회원 SDK &lt;script&gt; (cli 삽입)유무내부 — 멱등 마커cli deploy 가 회원 SDK 로더를 &lt;head&gt;에 1회만 넣도록 하는 멱등 표시.
data-saeroon-shop-injected쇼핑 SDK &lt;script&gt; (cli 삽입)유무내부 — 멱등 마커cli deploy 가 쇼핑 SDK 로더를 &lt;head&gt;에 1회만 넣도록 하는 멱등 표시.
data-saeroon-turnstileTurnstile 프록시 &lt;iframe&gt; (cli 삽입)유무내부 — 저자 미작성form auto-attach 가 삽입하는 Cloudflare Turnstile 프록시 iframe 마커. 토큰을 hidden input 에 채운다.
data-saeroon-catalog-rendered카탈로그 항목 복제본유무내부 — 런타임 마커렌더된 카탈로그 항목 복제본 표시. 재렌더 시 이전 복제본만 교체(정적 마크업/템플릿 보존).
data-saeroon-holding-rendered보유 항목 복제본유무내부 — 런타임 마커렌더된 보유 복제본 표시. 토글 후 같은 카탈로그를 보는 목록만 다시 그릴 때 교체 대상이 된다.
data-saeroon-group-rendered그룹 목록 복제본유무내부 — 런타임 마커렌더된 그룹 복제본 표시. 재렌더 시 이전 복제본만 교체.
data-saeroon-group-member-rendered그룹원 명부 복제본유무내부 — 런타임 마커렌더된 그룹원 복제본 표시. 재렌더 시 이전 복제본만 교체.
data-saeroon-heldholding-toggle 버튼"true" \"false"내부 — 런타임 상태토글 직후 그 항목의 보유 여부를 버튼에 남긴다. 사이트 CSS 가 이 값으로 눌린 모양을 표현할 수 있다.
data-saeroon-busy요청 중인 버튼유무내부 — 런타임 상태요청이 도는 동안 부착되고 끝나면 제거된다(버튼이면 disabled 도 함께). 중복 클릭 방지 + CSS 로딩 표시 훅.
data-saeroon-editing&lt;html&gt; (편집 모드 진입 시)유무내부 — 런타임 플래그소유자가 ?saeroon-edit 로 편집 모드에 들어갔음을 표시. 오버레이 CSS 가 이 플래그로만 편집 UI 를 켠다.
data-saeroon-product-rendered상품 목록·갤러리 복제본 · 변형 option유무내부 — 런타임 마커렌더된 상품 복제본 표시. 재렌더 시 이전 복제본만 교체(템플릿 보존).
data-saeroon-order-rendered주문 품목·추적 이벤트·반품 행·반품 품목 복제본유무내부 — 런타임 마커렌더된 주문 관련 복제본 표시. 재렌더 시 이전 복제본만 교체.
data-saeroon-wishlist-rendered찜 목록 복제본유무내부 — 런타임 마커렌더된 찜 복제본 표시. 재렌더 시 이전 복제본만 교체.
data-saeroon-wishlistedwishlist-toggle 버튼"true" \"false"내부 — 런타임 상태토글 버튼의 현재 찜 여부. 사이트 CSS 가 이 값으로 눌린 모양을 표현한다(aria-pressed 와 함께).

이벤트 (window)

이벤트발생소스
saeroon:cart-change카트 변경 시(담기/수정/삭제) — detail.cartpackages/shop-sdk/src/events.ts:7
saeroon:shop-ready쇼핑 SDK 준비 완료 — detail.shop (window.saeroonShop). provider 미지원이면 발행되지 않는다packages/shop-sdk/src/events.ts:8
saeroon:toast담기·찜·주소 성공/실패 토스트(document) — detail.message · detail.errorpackages/shop-sdk/src/events.ts:9
saeroon:products-rendered상품 목록 렌더 완료 — detail.root · products · page · totalpackages/shop-sdk/src/events.ts:10
saeroon:product-loaded상품 상세 로드 완료 — detail.root · productpackages/shop-sdk/src/events.ts:11
saeroon:shipping-change배송비 재계산 — detail = {subtotal, zipCode, shipping, total, error}packages/shop-sdk/src/events.ts:12
saeroon:address-selected우편번호 검색 완료(document) — detail.addresspackages/shop-sdk/src/events.ts:13
saeroon:order-loaded주문조회 성공 — detail.orderpackages/shop-sdk/src/events.ts:14
saeroon:return-created반품·교환 신청 접수 — detail.returnpackages/shop-sdk/src/events.ts:15
saeroon:wishlist-change찜 목록 변경 — detail.itemspackages/shop-sdk/src/events.ts:16
saeroon:post-updated글 수정 성공(폼 닫기용)packages/web-sdk/src/binders.ts:238

요약

새로온에 배포한 정적 사이트는 HTML 요소에 data-* 속성을 선언하는 것만으로 회원·게시판·댓글·쇼핑·폼이 붙습니다. cli deploy 가 관련 속성을 감지해 SDK 로더를 자동 주입합니다.

마크다운 원문/docs/attributes.md