@bestow-ui/react 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -81,7 +81,7 @@ const brand = createTheme(
81
81
  <ThemeProvider theme={mode} overrides={brand}>…</ThemeProvider>;
82
82
  ```
83
83
 
84
- 입력 칸 테두리를 배경과 3:1 이상으로 진하게 하려면 `strongInputBorders` 를 더해요(2.0 에서 기본값이 될 예정).
84
+ 입력 칸·체크 컨트롤(Checkbox·Radio·Switch) 테두리를 배경과 3:1 이상으로 진하게 하려면 `strongInputBorders` 를 더해요(2.0 에서 기본값이 될 예정).
85
85
 
86
86
  ```tsx
87
87
  createTheme(createIntentColors('primary', '#7c3aed'), strongInputBorders);
@@ -1,6 +1,6 @@
1
1
  // src/theme/contract.css.ts
2
2
  var themeClass = { light: "tkagtb0", dark: "tkagtb1" };
3
- var vars = { space: { "0": "var(--bestow-space-0)", "1": "var(--bestow-space-1)", "2": "var(--bestow-space-2)", "3": "var(--bestow-space-3)", "4": "var(--bestow-space-4)", "5": "var(--bestow-space-5)", "6": "var(--bestow-space-6)", "8": "var(--bestow-space-8)", "10": "var(--bestow-space-10)", "12": "var(--bestow-space-12)", "16": "var(--bestow-space-16)" }, radius: { none: "var(--bestow-radius-none)", sm: "var(--bestow-radius-sm)", md: "var(--bestow-radius-md)", lg: "var(--bestow-radius-lg)", xl: "var(--bestow-radius-xl)", full: "var(--bestow-radius-full)" }, font: { family: { sans: "var(--bestow-font-family-sans)", mono: "var(--bestow-font-family-mono)" }, size: { xs: "var(--bestow-font-size-xs)", sm: "var(--bestow-font-size-sm)", md: "var(--bestow-font-size-md)", lg: "var(--bestow-font-size-lg)", xl: "var(--bestow-font-size-xl)", "2xl": "var(--bestow-font-size-2xl)", "3xl": "var(--bestow-font-size-3xl)", "4xl": "var(--bestow-font-size-4xl)" }, weight: { regular: "var(--bestow-font-weight-regular)", medium: "var(--bestow-font-weight-medium)", semibold: "var(--bestow-font-weight-semibold)", bold: "var(--bestow-font-weight-bold)" }, lineHeight: { tight: "var(--bestow-font-line-height-tight)", normal: "var(--bestow-font-line-height-normal)", relaxed: "var(--bestow-font-line-height-relaxed)" } }, duration: { fast: "var(--bestow-duration-fast)", normal: "var(--bestow-duration-normal)", slow: "var(--bestow-duration-slow)" }, zIndex: { overlay: "var(--bestow-z-index-overlay)", modal: "var(--bestow-z-index-modal)", dropdown: "var(--bestow-z-index-dropdown)", toast: "var(--bestow-z-index-toast)", tooltip: "var(--bestow-z-index-tooltip)" }, color: { bg: { "default": "var(--bestow-color-bg-default)", subtle: "var(--bestow-color-bg-subtle)", muted: "var(--bestow-color-bg-muted)", inverse: "var(--bestow-color-bg-inverse)", overlay: "var(--bestow-color-bg-overlay)" }, fg: { "default": "var(--bestow-color-fg-default)", muted: "var(--bestow-color-fg-muted)", subtle: "var(--bestow-color-fg-subtle)", inverse: "var(--bestow-color-fg-inverse)" }, border: { "default": "var(--bestow-color-border-default)", strong: "var(--bestow-color-border-strong)", focus: "var(--bestow-color-border-focus)", input: "var(--bestow-color-border-input)", inputHover: "var(--bestow-color-border-input-hover)" }, primary: { solid: "var(--bestow-color-primary-solid)", solidHover: "var(--bestow-color-primary-solid-hover)", contrast: "var(--bestow-color-primary-contrast)", subtle: "var(--bestow-color-primary-subtle)", subtleHover: "var(--bestow-color-primary-subtle-hover)", text: "var(--bestow-color-primary-text)" }, neutral: { solid: "var(--bestow-color-neutral-solid)", solidHover: "var(--bestow-color-neutral-solid-hover)", contrast: "var(--bestow-color-neutral-contrast)", subtle: "var(--bestow-color-neutral-subtle)", subtleHover: "var(--bestow-color-neutral-subtle-hover)", text: "var(--bestow-color-neutral-text)" }, danger: { solid: "var(--bestow-color-danger-solid)", solidHover: "var(--bestow-color-danger-solid-hover)", contrast: "var(--bestow-color-danger-contrast)", subtle: "var(--bestow-color-danger-subtle)", subtleHover: "var(--bestow-color-danger-subtle-hover)", text: "var(--bestow-color-danger-text)" }, success: { solid: "var(--bestow-color-success-solid)", solidHover: "var(--bestow-color-success-solid-hover)", contrast: "var(--bestow-color-success-contrast)", subtle: "var(--bestow-color-success-subtle)", subtleHover: "var(--bestow-color-success-subtle-hover)", text: "var(--bestow-color-success-text)" }, warning: { solid: "var(--bestow-color-warning-solid)", solidHover: "var(--bestow-color-warning-solid-hover)", contrast: "var(--bestow-color-warning-contrast)", subtle: "var(--bestow-color-warning-subtle)", subtleHover: "var(--bestow-color-warning-subtle-hover)", text: "var(--bestow-color-warning-text)" } }, shadow: { sm: "var(--bestow-shadow-sm)", md: "var(--bestow-shadow-md)", lg: "var(--bestow-shadow-lg)" } };
3
+ var vars = { space: { "0": "var(--bestow-space-0)", "1": "var(--bestow-space-1)", "2": "var(--bestow-space-2)", "3": "var(--bestow-space-3)", "4": "var(--bestow-space-4)", "5": "var(--bestow-space-5)", "6": "var(--bestow-space-6)", "8": "var(--bestow-space-8)", "10": "var(--bestow-space-10)", "12": "var(--bestow-space-12)", "16": "var(--bestow-space-16)" }, radius: { none: "var(--bestow-radius-none)", sm: "var(--bestow-radius-sm)", md: "var(--bestow-radius-md)", lg: "var(--bestow-radius-lg)", xl: "var(--bestow-radius-xl)", full: "var(--bestow-radius-full)" }, font: { family: { sans: "var(--bestow-font-family-sans)", mono: "var(--bestow-font-family-mono)" }, size: { xs: "var(--bestow-font-size-xs)", sm: "var(--bestow-font-size-sm)", md: "var(--bestow-font-size-md)", lg: "var(--bestow-font-size-lg)", xl: "var(--bestow-font-size-xl)", "2xl": "var(--bestow-font-size-2xl)", "3xl": "var(--bestow-font-size-3xl)", "4xl": "var(--bestow-font-size-4xl)" }, weight: { regular: "var(--bestow-font-weight-regular)", medium: "var(--bestow-font-weight-medium)", semibold: "var(--bestow-font-weight-semibold)", bold: "var(--bestow-font-weight-bold)" }, lineHeight: { tight: "var(--bestow-font-line-height-tight)", normal: "var(--bestow-font-line-height-normal)", relaxed: "var(--bestow-font-line-height-relaxed)" } }, duration: { fast: "var(--bestow-duration-fast)", normal: "var(--bestow-duration-normal)", slow: "var(--bestow-duration-slow)" }, zIndex: { overlay: "var(--bestow-z-index-overlay)", modal: "var(--bestow-z-index-modal)", dropdown: "var(--bestow-z-index-dropdown)", toast: "var(--bestow-z-index-toast)", tooltip: "var(--bestow-z-index-tooltip)" }, color: { bg: { "default": "var(--bestow-color-bg-default)", subtle: "var(--bestow-color-bg-subtle)", muted: "var(--bestow-color-bg-muted)", inverse: "var(--bestow-color-bg-inverse)", overlay: "var(--bestow-color-bg-overlay)" }, fg: { "default": "var(--bestow-color-fg-default)", muted: "var(--bestow-color-fg-muted)", subtle: "var(--bestow-color-fg-subtle)", inverse: "var(--bestow-color-fg-inverse)" }, border: { "default": "var(--bestow-color-border-default)", strong: "var(--bestow-color-border-strong)", focus: "var(--bestow-color-border-focus)", input: "var(--bestow-color-border-input)", inputHover: "var(--bestow-color-border-input-hover)", control: "var(--bestow-color-border-control)" }, primary: { solid: "var(--bestow-color-primary-solid)", solidHover: "var(--bestow-color-primary-solid-hover)", contrast: "var(--bestow-color-primary-contrast)", subtle: "var(--bestow-color-primary-subtle)", subtleHover: "var(--bestow-color-primary-subtle-hover)", text: "var(--bestow-color-primary-text)" }, neutral: { solid: "var(--bestow-color-neutral-solid)", solidHover: "var(--bestow-color-neutral-solid-hover)", contrast: "var(--bestow-color-neutral-contrast)", subtle: "var(--bestow-color-neutral-subtle)", subtleHover: "var(--bestow-color-neutral-subtle-hover)", text: "var(--bestow-color-neutral-text)" }, danger: { solid: "var(--bestow-color-danger-solid)", solidHover: "var(--bestow-color-danger-solid-hover)", contrast: "var(--bestow-color-danger-contrast)", subtle: "var(--bestow-color-danger-subtle)", subtleHover: "var(--bestow-color-danger-subtle-hover)", text: "var(--bestow-color-danger-text)" }, success: { solid: "var(--bestow-color-success-solid)", solidHover: "var(--bestow-color-success-solid-hover)", contrast: "var(--bestow-color-success-contrast)", subtle: "var(--bestow-color-success-subtle)", subtleHover: "var(--bestow-color-success-subtle-hover)", text: "var(--bestow-color-success-text)" }, warning: { solid: "var(--bestow-color-warning-solid)", solidHover: "var(--bestow-color-warning-solid-hover)", contrast: "var(--bestow-color-warning-contrast)", subtle: "var(--bestow-color-warning-subtle)", subtleHover: "var(--bestow-color-warning-subtle-hover)", text: "var(--bestow-color-warning-text)" } }, shadow: { sm: "var(--bestow-shadow-sm)", md: "var(--bestow-shadow-md)", lg: "var(--bestow-shadow-lg)" } };
4
4
 
5
5
  // src/theme/createTheme.ts
6
6
  import { assignInlineVars } from "@vanilla-extract/dynamic";
@@ -305,4 +305,4 @@ export {
305
305
  focusField,
306
306
  Skeleton
307
307
  };
308
- //# sourceMappingURL=chunk-TIFI6ZQU.js.map
308
+ //# sourceMappingURL=chunk-VQ45DNC3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/contract.css.ts","../src/theme/createTheme.ts","../src/components/AddressInput/addressProviders.ts","../src/utils/koreanFormat.ts","../src/utils/date.ts","../src/components/DateRangePicker/presets.ts","../src/utils/focusField.ts","../src/components/Skeleton/Skeleton.tsx","../src/utils/cx.ts","../src/components/Skeleton/Skeleton.css.ts","../src/styles/visuallyHidden.css.ts"],"sourcesContent":["import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\nexport var themeClass = {light:'tkagtb0',dark:'tkagtb1'};\nexport var vars = {space:{'0':'var(--bestow-space-0)','1':'var(--bestow-space-1)','2':'var(--bestow-space-2)','3':'var(--bestow-space-3)','4':'var(--bestow-space-4)','5':'var(--bestow-space-5)','6':'var(--bestow-space-6)','8':'var(--bestow-space-8)','10':'var(--bestow-space-10)','12':'var(--bestow-space-12)','16':'var(--bestow-space-16)'},radius:{none:'var(--bestow-radius-none)',sm:'var(--bestow-radius-sm)',md:'var(--bestow-radius-md)',lg:'var(--bestow-radius-lg)',xl:'var(--bestow-radius-xl)',full:'var(--bestow-radius-full)'},font:{family:{sans:'var(--bestow-font-family-sans)',mono:'var(--bestow-font-family-mono)'},size:{xs:'var(--bestow-font-size-xs)',sm:'var(--bestow-font-size-sm)',md:'var(--bestow-font-size-md)',lg:'var(--bestow-font-size-lg)',xl:'var(--bestow-font-size-xl)','2xl':'var(--bestow-font-size-2xl)','3xl':'var(--bestow-font-size-3xl)','4xl':'var(--bestow-font-size-4xl)'},weight:{regular:'var(--bestow-font-weight-regular)',medium:'var(--bestow-font-weight-medium)',semibold:'var(--bestow-font-weight-semibold)',bold:'var(--bestow-font-weight-bold)'},lineHeight:{tight:'var(--bestow-font-line-height-tight)',normal:'var(--bestow-font-line-height-normal)',relaxed:'var(--bestow-font-line-height-relaxed)'}},duration:{fast:'var(--bestow-duration-fast)',normal:'var(--bestow-duration-normal)',slow:'var(--bestow-duration-slow)'},zIndex:{overlay:'var(--bestow-z-index-overlay)',modal:'var(--bestow-z-index-modal)',dropdown:'var(--bestow-z-index-dropdown)',toast:'var(--bestow-z-index-toast)',tooltip:'var(--bestow-z-index-tooltip)'},color:{bg:{'default':'var(--bestow-color-bg-default)',subtle:'var(--bestow-color-bg-subtle)',muted:'var(--bestow-color-bg-muted)',inverse:'var(--bestow-color-bg-inverse)',overlay:'var(--bestow-color-bg-overlay)'},fg:{'default':'var(--bestow-color-fg-default)',muted:'var(--bestow-color-fg-muted)',subtle:'var(--bestow-color-fg-subtle)',inverse:'var(--bestow-color-fg-inverse)'},border:{'default':'var(--bestow-color-border-default)',strong:'var(--bestow-color-border-strong)',focus:'var(--bestow-color-border-focus)',input:'var(--bestow-color-border-input)',inputHover:'var(--bestow-color-border-input-hover)',control:'var(--bestow-color-border-control)'},primary:{solid:'var(--bestow-color-primary-solid)',solidHover:'var(--bestow-color-primary-solid-hover)',contrast:'var(--bestow-color-primary-contrast)',subtle:'var(--bestow-color-primary-subtle)',subtleHover:'var(--bestow-color-primary-subtle-hover)',text:'var(--bestow-color-primary-text)'},neutral:{solid:'var(--bestow-color-neutral-solid)',solidHover:'var(--bestow-color-neutral-solid-hover)',contrast:'var(--bestow-color-neutral-contrast)',subtle:'var(--bestow-color-neutral-subtle)',subtleHover:'var(--bestow-color-neutral-subtle-hover)',text:'var(--bestow-color-neutral-text)'},danger:{solid:'var(--bestow-color-danger-solid)',solidHover:'var(--bestow-color-danger-solid-hover)',contrast:'var(--bestow-color-danger-contrast)',subtle:'var(--bestow-color-danger-subtle)',subtleHover:'var(--bestow-color-danger-subtle-hover)',text:'var(--bestow-color-danger-text)'},success:{solid:'var(--bestow-color-success-solid)',solidHover:'var(--bestow-color-success-solid-hover)',contrast:'var(--bestow-color-success-contrast)',subtle:'var(--bestow-color-success-subtle)',subtleHover:'var(--bestow-color-success-subtle-hover)',text:'var(--bestow-color-success-text)'},warning:{solid:'var(--bestow-color-warning-solid)',solidHover:'var(--bestow-color-warning-solid-hover)',contrast:'var(--bestow-color-warning-contrast)',subtle:'var(--bestow-color-warning-subtle)',subtleHover:'var(--bestow-color-warning-subtle-hover)',text:'var(--bestow-color-warning-text)'}},shadow:{sm:'var(--bestow-shadow-sm)',md:'var(--bestow-shadow-md)',lg:'var(--bestow-shadow-lg)'}};","import { assignInlineVars } from '@vanilla-extract/dynamic';\nimport { vars, type ThemeName, type ThemeTokens } from './contract.css';\n\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends string ? string : DeepPartial<T[K]> };\n\nexport type ThemeOverrides = DeepPartial<ThemeTokens>;\n\n/** createTheme 에 넘기는 입력. common 은 라이트·다크 공통, light/dark 는 모드별 값 (common 보다 우선). */\nexport interface ThemeInput {\n common?: ThemeOverrides;\n light?: ThemeOverrides;\n dark?: ThemeOverrides;\n}\n\n/** createTheme 의 결과. ThemeProvider 의 overrides 로 넘긴다. */\nexport interface BestowTheme {\n readonly light: ThemeOverrides;\n readonly dark: ThemeOverrides;\n}\n\ntype Tree = { [key: string]: string | Tree };\n\nfunction deepMerge(target: Tree, source: Tree | undefined): Tree {\n if (!source) return target;\n const out: Tree = { ...target };\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue;\n const prev = out[key];\n out[key] = typeof value === 'object' && typeof prev === 'object' ? deepMerge(prev, value) : value;\n }\n return out;\n}\n\n/**\n * 브랜드 테마를 만든다. 여러 입력을 넘기면 순서대로 깊게 병합한다 (뒤가 우선).\n *\n * @example\n * const brand = createTheme(\n * createIntentColors('primary', '#7c3aed'),\n * { common: { radius: { md: '6px' }, font: { family: { sans: 'Inter, sans-serif' } } } },\n * );\n * <ThemeProvider theme=\"dark\" overrides={brand}>…</ThemeProvider>\n */\nexport function createTheme(...inputs: ThemeInput[]): BestowTheme {\n let light: Tree = {};\n let dark: Tree = {};\n for (const input of inputs) {\n light = deepMerge(deepMerge(light, input.common as Tree), input.light as Tree);\n dark = deepMerge(deepMerge(dark, input.common as Tree), input.dark as Tree);\n }\n return Object.freeze({ light, dark }) as BestowTheme;\n}\n\n/** 두 테마를 병합한다 (b 가 우선). 중첩 ThemeProvider 가 바깥 테마를 이어받을 때 쓴다. */\nexport function mergeThemes(a: BestowTheme | undefined, b: BestowTheme | undefined): BestowTheme | undefined {\n if (!a) return b;\n if (!b) return a;\n return createTheme(a, b);\n}\n\n/** 부분 토큰을 { 'var(--bestow-…)': 값 } 으로 펼친다. 알 수 없는 키는 무시한다. */\nfunction flatten(partial: Tree, contract: Tree, out: Record<string, string>) {\n for (const [key, value] of Object.entries(partial)) {\n const target = contract[key];\n if (target === undefined) continue;\n if (typeof target === 'string' && typeof value === 'string') out[target] = value;\n else if (typeof target === 'object' && typeof value === 'object') flatten(value, target, out);\n }\n return out;\n}\n\n/** 현재 모드의 오버라이드를 인라인 style 로 바꾼다. */\nexport function themeToStyle(theme: BestowTheme | undefined, mode: ThemeName): Record<string, string> | undefined {\n if (!theme) return undefined;\n const map = flatten(theme[mode] as Tree, vars as unknown as Tree, {});\n return Object.keys(map).length ? assignInlineVars(map) : undefined;\n}\n","/** 주소 검색 결과 */\nexport interface AddressSearchResult {\n /** 우편번호 (5자리 국가기초구역번호) */\n zonecode: string;\n /** 기본 주소 (도로명 또는 지번) */\n address: string;\n /** 참고 항목 (도로명 주소일 때 법정동·건물명, 예: \" (역삼동, 래미안아파트)\") */\n extraAddress?: string;\n}\n\n/**\n * 주소 검색 공급자. container 안에 검색 화면을 그리고, 사용자가 고르면 onSelect 를 부른다.\n * 정리 함수를 돌려주면 검색 창이 닫힐 때 부른다. 다른 주소 서비스(행정안전부 도로명주소 API 등)로 바꿔 끼울 수 있다.\n */\nexport type AddressProvider = (\n container: HTMLElement,\n onSelect: (result: AddressSearchResult) => void,\n) => void | (() => void) | Promise<void | (() => void)>;\n\n// 카카오 우편번호 서비스 (https://postcode.map.kakao.com/guide)\nconst KAKAO_POSTCODE_SRC = 'https://t1.kakaocdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js';\n\ninterface KakaoPostcodeData {\n zonecode: string;\n userSelectedType: 'R' | 'J';\n roadAddress: string;\n jibunAddress: string;\n autoJibunAddress?: string;\n bname: string;\n buildingName: string;\n apartment: 'Y' | 'N';\n}\n\ntype PostcodeConstructor = new (options: {\n oncomplete: (data: KakaoPostcodeData) => void;\n width?: string | number;\n height?: string | number;\n}) => { embed: (element: HTMLElement) => void };\n\ninterface PostcodeWindow {\n kakao?: { Postcode?: PostcodeConstructor };\n daum?: { Postcode?: PostcodeConstructor };\n}\n\nlet loading: Promise<PostcodeConstructor> | null = null;\n\nfunction loadKakaoPostcode(): Promise<PostcodeConstructor> {\n const w = window as unknown as PostcodeWindow;\n const existing = w.kakao?.Postcode ?? w.daum?.Postcode;\n if (existing) return Promise.resolve(existing);\n loading ??= new Promise<PostcodeConstructor>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = KAKAO_POSTCODE_SRC;\n script.async = true;\n script.onload = () => {\n const ctor = w.kakao?.Postcode ?? w.daum?.Postcode;\n if (ctor) resolve(ctor);\n else reject(new Error('우편번호 서비스를 찾지 못했어요'));\n };\n script.onerror = () => {\n loading = null; // 다음에 다시 시도할 수 있게\n reject(new Error('우편번호 서비스를 불러오지 못했어요'));\n };\n document.head.appendChild(script);\n });\n return loading;\n}\n\n/** 카카오 가이드의 방식으로 도로명 주소의 참고 항목(법정동, 공동주택 건물명)을 만든다 */\nexport function composeExtraAddress(\n data: Pick<KakaoPostcodeData, 'userSelectedType' | 'bname' | 'buildingName' | 'apartment'>,\n) {\n if (data.userSelectedType !== 'R') return '';\n const parts: string[] = [];\n // 법정동명은 \"동·로·가\" 로 끝날 때만 (법정리는 제외)\n if (data.bname && /[동로가]$/.test(data.bname)) parts.push(data.bname);\n if (data.buildingName && data.apartment === 'Y') parts.push(data.buildingName);\n return parts.length ? ` (${parts.join(', ')})` : '';\n}\n\n/**\n * 기본 공급자: 카카오(다음) 우편번호 서비스. 처음 쓸 때 스크립트를 불러오므로 코어 번들 크기에 영향이 없다.\n * 사용 조건은 서비스 가이드를 따른다.\n */\nexport const kakaoPostcodeProvider: AddressProvider = async (container, onSelect) => {\n const Postcode = await loadKakaoPostcode();\n new Postcode({\n width: '100%',\n height: '100%',\n oncomplete: (data) => {\n const address =\n data.userSelectedType === 'R' ? data.roadAddress : data.jibunAddress || data.autoJibunAddress || '';\n onSelect({ zonecode: data.zonecode, address, extraAddress: composeExtraAddress(data) });\n },\n }).embed(container);\n};\n","// 한국 서비스에서 자주 쓰는 서식·검증 함수. 컴포넌트와 함께 공개 API 로 export 한다.\n\nconst onlyDigits = (input: string) => input.replace(/\\D/g, '');\n\n/** 전화번호 최대 자릿수: 02 는 10, 15xx·16xx·18xx 대표번호는 8, 나머지(010, 031, 070 …)는 11 */\nexport function phoneNumberMaxDigits(digits: string): number {\n if (digits.startsWith('02')) return 10;\n if (/^1[568]/.test(digits)) return 8;\n return 11;\n}\n\n/**\n * 숫자만 있는 전화번호에 하이픈을 넣는다. 입력 중인 값도 자연스럽게 나눈다.\n * @example formatPhoneNumber('01012345678') // '010-1234-5678'\n * @example formatPhoneNumber('021234567') // '02-123-4567'\n * @example formatPhoneNumber('15881234') // '1588-1234'\n */\nexport function formatPhoneNumber(input: string): string {\n const d = onlyDigits(input).slice(0, phoneNumberMaxDigits(onlyDigits(input)));\n if (d.startsWith('02')) {\n if (d.length <= 2) return d;\n if (d.length <= 5) return `${d.slice(0, 2)}-${d.slice(2)}`;\n if (d.length <= 9) return `${d.slice(0, 2)}-${d.slice(2, 5)}-${d.slice(5)}`;\n return `${d.slice(0, 2)}-${d.slice(2, 6)}-${d.slice(6)}`;\n }\n if (/^1[568]/.test(d)) {\n return d.length <= 4 ? d : `${d.slice(0, 4)}-${d.slice(4)}`;\n }\n if (d.length <= 3) return d;\n if (d.length <= 6) return `${d.slice(0, 3)}-${d.slice(3)}`;\n if (d.length <= 10) return `${d.slice(0, 3)}-${d.slice(3, 6)}-${d.slice(6)}`;\n return `${d.slice(0, 3)}-${d.slice(3, 7)}-${d.slice(7)}`;\n}\n\n/**\n * 사업자등록번호(10자리)에 하이픈을 넣는다.\n * @example formatBusinessNumber('1234567890') // '123-45-67890'\n */\nexport function formatBusinessNumber(input: string): string {\n const d = onlyDigits(input).slice(0, 10);\n if (d.length <= 3) return d;\n if (d.length <= 5) return `${d.slice(0, 3)}-${d.slice(3)}`;\n return `${d.slice(0, 3)}-${d.slice(3, 5)}-${d.slice(5)}`;\n}\n\n/**\n * 사업자등록번호 검증 공식(가중치 1,3,7,1,3,7,1,3,5)으로 확인한다. 실제로 등록된 번호인지는 국세청 조회가 필요하다.\n * @example isValidBusinessNumber('124-81-00998') // true\n */\nexport function isValidBusinessNumber(input: string): boolean {\n const d = onlyDigits(input);\n if (d.length !== 10) return false;\n const weights = [1, 3, 7, 1, 3, 7, 1, 3, 5];\n const digits = [...d].map(Number);\n let sum = weights.reduce((acc, w, i) => acc + w * digits[i]!, 0);\n sum += Math.floor((digits[8]! * 5) / 10);\n return (10 - (sum % 10)) % 10 === digits[9];\n}\n\n/**\n * 금액을 만·억·조 단위로 읽기 쉽게 쓴다.\n * @example formatKoreanAmount(125000) // '12만 5,000원'\n * @example formatKoreanAmount(150000000) // '1억 5,000만원'\n * @example formatKoreanAmount(0) // '0원'\n */\nexport function formatKoreanAmount(amount: number, unit = '원'): string {\n const n = Math.floor(Math.abs(amount));\n if (n === 0) return `0${unit}`;\n const units = [\n { value: 1e12, label: '조' },\n { value: 1e8, label: '억' },\n { value: 1e4, label: '만' },\n { value: 1, label: '' },\n ];\n let rest = n;\n const parts: string[] = [];\n for (const u of units) {\n const q = Math.floor(rest / u.value);\n rest %= u.value;\n if (q > 0) parts.push(`${q.toLocaleString('ko-KR')}${u.label}`);\n }\n return `${amount < 0 ? '-' : ''}${parts.join(' ')}${unit}`;\n}\n","// 날짜 계산 유틸. 값은 시간대 문제가 없도록 'YYYY-MM-DD' 문자열로 다루고, 계산할 때만 로컬 Date 로 바꾼다.\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** Date → 'YYYY-MM-DD' (로컬 기준) */\nexport function toISODate(date: Date): string {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/** 'YYYY-MM-DD' → Date (로컬 자정). 형식이 틀리거나 없는 날짜(2월 30일 등)면 null */\nexport function parseISODate(value: string | null | undefined): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value ?? '');\n if (!m) return null;\n const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const date = new Date(y, mo - 1, d);\n return date.getFullYear() === y && date.getMonth() === mo - 1 && date.getDate() === d ? date : null;\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** 달을 옮긴다. 옮긴 달에 같은 날이 없으면 그 달의 마지막 날 (1월 31일 + 1달 → 2월 28/29일) */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), lastDay));\n}\n\nexport function isSameDay(a: Date | null, b: Date | null): boolean {\n return !!a && !!b && toISODate(a) === toISODate(b);\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\n/** 날짜만 비교 (-1, 0, 1) */\nexport function compareDays(a: Date, b: Date): number {\n const x = toISODate(a);\n const y = toISODate(b);\n return x < y ? -1 : x > y ? 1 : 0;\n}\n\n/** 일요일부터 시작하는 달력의 주 목록 (앞뒤 달 날짜 포함, 항상 6주) */\nexport function getCalendarWeeks(year: number, month: number): Date[][] {\n const first = new Date(year, month, 1);\n const start = addDays(first, -first.getDay());\n return Array.from({ length: 6 }, (_, week) => Array.from({ length: 7 }, (_, day) => addDays(start, week * 7 + day)));\n}\n\nexport const KOREAN_WEEKDAYS = ['일', '월', '화', '수', '목', '금', '토'] as const;\n\n/**\n * 한국어 날짜. 스크린리더용 날짜 이름 등에 쓴다.\n * @example formatKoreanDate(new Date(2026, 9, 15)) // '2026년 10월 15일 목요일'\n */\nexport function formatKoreanDate(date: Date, withWeekday = true): string {\n const base = `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`;\n return withWeekday ? `${base} ${KOREAN_WEEKDAYS[date.getDay()]}요일` : base;\n}\n","import { addDays, addMonths, parseISODate, toISODate } from '../../utils/date';\n\nexport interface DateRange {\n /** 시작일 'YYYY-MM-DD' (없으면 '') */\n start: string;\n /** 종료일 'YYYY-MM-DD' (없으면 '') */\n end: string;\n}\n\n/** 빠른 선택 — 오늘에서 거슬러 올라간 기간. `days: 0` 은 오늘 하루 */\nexport interface DateRangePreset {\n label: string;\n days?: number;\n months?: number;\n}\n\n/** 조회 화면에서 흔한 빠른 선택(오늘·1주일·1개월·3개월). 그대로 넘기거나 골라 쓴다 */\nexport const dateRangePresets: DateRangePreset[] = [\n { label: '오늘', days: 0 },\n { label: '1주일', days: 7 },\n { label: '1개월', months: 1 },\n { label: '3개월', months: 3 },\n];\n\n/** 빠른 선택이 가리키는 기간 (오늘 'YYYY-MM-DD' 기준) */\nexport function presetRange(preset: DateRangePreset, today: string): DateRange {\n const end = parseISODate(today);\n if (!end) return { start: '', end: '' };\n const start = preset.months !== undefined ? addMonths(end, -preset.months) : addDays(end, -(preset.days ?? 0));\n return { start: toISODate(start), end: today };\n}\n","const FOCUSABLE =\n 'input:not([type=\"hidden\"]):not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])';\n\n/** 화면에 보이고 보조기술에서 숨기지 않은, Tab 으로 갈 수 있는 요소 */\nfunction isUsable(element: Element): element is HTMLElement {\n return (\n element instanceof HTMLElement &&\n element.matches(FOCUSABLE) &&\n element.tabIndex >= 0 &&\n !element.closest('[aria-hidden=\"true\"], [inert], [hidden]')\n );\n}\n\nfunction firstUsableIn(container: Element | null): HTMLElement | null {\n if (!container) return null;\n // 라디오·세그먼트처럼 하나를 고르는 묶음은 지금 선택된 항목으로 간다\n const checked = Array.from(container.querySelectorAll(':checked, [aria-checked=\"true\"]')).find(isUsable);\n return checked ?? Array.from(container.querySelectorAll(FOCUSABLE)).find(isUsable) ?? null;\n}\n\n/**\n * 폼 칸으로 포커스를 옮긴다(오류 요약의 링크, 제출 실패 뒤 등). `target` 은 칸의 id 나 요소.\n * id 가 포커스할 수 없는 요소를 가리켜도 알맞은 곳을 찾는다 — RadioGroup·AgreementGroup 처럼 묶음이면 선택된(없으면 첫) 항목,\n * FileUpload 처럼 숨긴 input 이면 같은 묶음(role=\"group\")의 버튼. 옮겼으면 true.\n */\nexport function focusField(target: string | HTMLElement | null | undefined): boolean {\n const element = typeof target === 'string' ? document.getElementById(target) : (target ?? null);\n if (!element) return false;\n const destination =\n (isUsable(element) ? element : null) ??\n firstUsableIn(element) ??\n firstUsableIn(element.closest('[role=\"group\"], [role=\"radiogroup\"], fieldset'));\n if (!destination) return false;\n destination.focus();\n return document.activeElement === destination;\n}\n","import { assignInlineVars } from '@vanilla-extract/dynamic';\nimport { forwardRef, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Skeleton.css';\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {\n /** 모양. text 는 글자 높이(1em), circle 은 width 를 지름으로 쓴다 */\n variant?: 'text' | 'rect' | 'circle';\n /** 너비. 숫자는 px (기본: text·rect 100%, circle 40px) */\n width?: number | string;\n /** 높이. 숫자는 px (기본: text 1em, rect 100px, circle 은 width 와 같음) */\n height?: number | string;\n /** text 에서 여러 줄을 그린다. 마지막 줄은 60% 너비 */\n lines?: number;\n}\n\nconst toCss = (value: number | string) => (typeof value === 'number' ? `${value}px` : value);\n\n/**\n * 콘텐츠를 불러오는 동안 자리를 표시한다. 장식용이라 스크린리더에서 숨긴다 —\n * 로딩 중인 영역(감싸는 요소)에 `aria-busy=\"true\"` 를 붙여 상태를 알린다.\n */\nexport const Skeleton = /* @__PURE__ */ forwardRef<HTMLSpanElement, SkeletonProps>(function Skeleton(\n { variant = 'text', width, height, lines = 1, className, style, ...rest },\n ref,\n) {\n const w = toCss(width ?? (variant === 'circle' ? 40 : '100%'));\n const h = toCss(height ?? (variant === 'circle' ? w : variant === 'rect' ? 100 : '1em'));\n\n if (variant === 'text' && lines > 1) {\n return (\n <span\n ref={ref}\n aria-hidden\n className={cx(styles.lines, className)}\n style={{ ...assignInlineVars({ [styles.width]: w }), ...style }}\n {...rest}\n >\n {Array.from({ length: lines }, (_, i) => (\n <span\n key={i}\n className={styles.skeleton({ variant })}\n style={assignInlineVars({ [styles.width]: i === lines - 1 ? '60%' : '100%', [styles.height]: h })}\n />\n ))}\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n aria-hidden\n className={cx(styles.skeleton({ variant }), className)}\n style={{ ...assignInlineVars({ [styles.width]: w, [styles.height]: h }), ...style }}\n {...rest}\n />\n );\n});\n","export function cx(...classNames: Array<string | false | null | undefined>): string {\n return classNames.filter(Boolean).join(' ');\n}\n","import 'src/styles/animations.css.ts.vanilla.css?source=#H4sIAAAAAAAAA51T3WqDMBS-9ynOjaBsGYlV27qbPsbuRhqjDdVEYjZahu8-plspGjPtXeB8-f4453Dm10LTmrfwTkrdHLcYw5cHUGhV9w8A1VAmzDUD_OoBdB6AUeMRGUadd5gSkllCMk-IHYSR2yGA0VS2hdJ1NjwraniAEuw_A4p3fggtoxUP8Ms-Df_J5CZL8I2MhA7HG3cFq0VmG3sku9VxvKLjB9tc0FsydmFL9xYwWrGAYOzDE0RxcwmnPuwfsUs8dYhrZX56xTkvnVq_uE16h7SKbcdiR8rOpVYfMkeNaoURSmbQZ5yeoRWL7sFWzd1Y88RFeTK2Q_-bfFIdIKRpLi6IMqZ0LpRETEnDpUEDyhVzPye5gthiy5WSLtuhvq6lexMlN2z3DVsBqiZDBQAA';\nimport 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\nimport 'src/components/Skeleton/Skeleton.css.ts.vanilla.css?source=Ll8xczhkYXRkMiB7CiAgZGlzcGxheTogYmxvY2s7CiAgZmxleC1zaHJpbms6IDA7CiAgd2lkdGg6IHZhcigtLV8xczhkYXRkMCk7CiAgaGVpZ2h0OiB2YXIoLS1fMXM4ZGF0ZDEpOwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJlc3Rvdy1jb2xvci1uZXV0cmFsLXN1YnRsZSk7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCAyNSUsIHZhcigtLWJlc3Rvdy1jb2xvci1uZXV0cmFsLXN1YnRsZS1ob3ZlcikgNTAlLCB0cmFuc3BhcmVudCA3NSUpOwogIGJhY2tncm91bmQtc2l6ZTogMjAwJSAxMDAlOwogIGFuaW1hdGlvbjogXzFncnBiNzA3IDEuNnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KLl8xczhkYXRkMyB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1zbSk7Cn0KLl8xczhkYXRkNCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1tZCk7Cn0KLl8xczhkYXRkNSB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1mdWxsKTsKfQouXzFzOGRhdGQ2IHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgZ2FwOiB2YXIoLS1iZXN0b3ctc3BhY2UtMik7CiAgd2lkdGg6IHZhcigtLV8xczhkYXRkMCk7Cn0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAuXzFzOGRhdGQyIHsKICAgIGFuaW1hdGlvbjogbm9uZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgfQp9';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var height = 'var(--_1s8datd1)';\nexport var lines = '_1s8datd6';\nexport var skeleton = /* @__PURE__ */ _7a468({defaultClassName:'_1s8datd2',variantClassNames:{variant:{text:'_1s8datd3',rect:'_1s8datd4',circle:'_1s8datd5'}},defaultVariants:{variant:'text'},compoundVariants:[]});\nexport var width = 'var(--_1s8datd0)';","import 'src/styles/visuallyHidden.css.ts.vanilla.css?source=Ll8xa2R0YncxMCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxcHg7CiAgaGVpZ2h0OiAxcHg7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IC0xcHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBjbGlwOiByZWN0KDAsIDAsIDAsIDApOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYm9yZGVyOiAwOwp9';\nexport var visuallyHidden = '_1kdtbw10';"],"mappings":"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","names":["_","assignInlineVars","Skeleton","width","height","lines","assignInlineVars"]}
package/dist/client.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  themeToStyle,
24
24
  toISODate,
25
25
  visuallyHidden
26
- } from "./chunk-TIFI6ZQU.js";
26
+ } from "./chunk-VQ45DNC3.js";
27
27
 
28
28
  // src/theme/ThemeProvider.tsx
29
29
  import { createContext, forwardRef, useContext, useMemo } from "react";
@@ -1301,6 +1301,7 @@ var toggle2 = "c2pbq71 c2pbq70";
1301
1301
 
1302
1302
  // src/components/Combobox/Combobox.tsx
1303
1303
  import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1304
+ var NO_RESULTS_ANNOUNCE_DELAY = 800;
1304
1305
  var defaultFilter = (option2, query) => option2.label.toLowerCase().includes(query.trim().toLowerCase());
1305
1306
  var Combobox = /* @__PURE__ */ forwardRef18(function Combobox2(props, ref) {
1306
1307
  const {
@@ -1426,6 +1427,14 @@ var Combobox = /* @__PURE__ */ forwardRef18(function Combobox2(props, ref) {
1426
1427
  document.getElementById(optionId(activeIndex))?.scrollIntoView?.({ block: "nearest" });
1427
1428
  }, [open, activeIndex]);
1428
1429
  const hasOptions = filtered.length > 0;
1430
+ const noResults = open && !disabled && !hasOptions;
1431
+ const [announcedFor, setAnnouncedFor] = useState6(void 0);
1432
+ useEffect5(() => {
1433
+ if (!noResults) return;
1434
+ const timer2 = setTimeout(() => setAnnouncedFor(query), NO_RESULTS_ANNOUNCE_DELAY);
1435
+ return () => clearTimeout(timer2);
1436
+ }, [noResults, query]);
1437
+ const announceNoResults = noResults && announcedFor === query;
1429
1438
  return /* @__PURE__ */ jsxs16("div", { className: cx(field, fullWidth && fieldFullWidth), children: [
1430
1439
  label6 && /* @__PURE__ */ jsxs16("label", { id: labelId, htmlFor: inputId, className: label, children: [
1431
1440
  label6,
@@ -1555,10 +1564,14 @@ var Combobox = /* @__PURE__ */ forwardRef18(function Combobox2(props, ref) {
1555
1564
  );
1556
1565
  })
1557
1566
  }
1558
- ) : /* @__PURE__ */ jsx20("div", { className: empty, role: "status", children: emptyMessage })
1567
+ ) : (
1568
+ // 스크린리더 알림은 아래의 항상 있는 status 영역이 맡는다 (여기는 화면 표시만)
1569
+ /* @__PURE__ */ jsx20("div", { className: empty, children: emptyMessage })
1570
+ )
1559
1571
  }
1560
1572
  ) })
1561
1573
  ] }),
1574
+ /* @__PURE__ */ jsx20("span", { role: "status", className: visuallyHidden, children: announceNoResults ? emptyMessage : "" }),
1562
1575
  name && /* @__PURE__ */ jsx20("input", { type: "hidden", name, value: selectedValue ?? "" }),
1563
1576
  helperText3 && /* @__PURE__ */ jsx20("p", { id: helperId, className: helperText({ error }), children: helperText3 })
1564
1577
  ] });
@@ -2025,6 +2038,7 @@ var root8 = "r2jefr0";
2025
2038
 
2026
2039
  // src/components/FileUpload/FileUpload.tsx
2027
2040
  import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
2041
+ var REMOVED_ANNOUNCE_DELAY = 500;
2028
2042
  function formatSize(bytes) {
2029
2043
  if (bytes < 1024) return `${bytes} B`;
2030
2044
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;
@@ -2075,6 +2089,8 @@ var FileUpload = /* @__PURE__ */ forwardRef22(function FileUpload2(props, ref) {
2075
2089
  const selectButtonRef = useRef11(null);
2076
2090
  const removeButtonRefs = useRef11([]);
2077
2091
  const focusAfterRemove = useRef11(null);
2092
+ const announceTimer = useRef11(void 0);
2093
+ useEffect8(() => () => clearTimeout(announceTimer.current), []);
2078
2094
  const selectLabel = m.fileSelect ?? "\uD30C\uC77C \uC120\uD0DD";
2079
2095
  const reasonText = (rejection) => {
2080
2096
  const fileName2 = rejection.file.name;
@@ -2083,10 +2099,16 @@ var FileUpload = /* @__PURE__ */ forwardRef22(function FileUpload2(props, ref) {
2083
2099
  if (rejection.reason === "type") return m.fileTypeNotAllowed?.(fileName2) ?? `${fileName2}: \uC62C\uB9B4 \uC218 \uC5C6\uB294 \uD615\uC2DD\uC774\uC5D0\uC694.`;
2084
2100
  return m.fileTooMany?.(maxFiles ?? 0) ?? `\uD30C\uC77C\uC740 ${maxFiles}\uAC1C\uAE4C\uC9C0 \uC62C\uB9B4 \uC218 \uC788\uC5B4\uC694.`;
2085
2101
  };
2086
- const commit = (next, message) => {
2102
+ const announce = (message, delay = 0) => {
2103
+ clearTimeout(announceTimer.current);
2104
+ if (delay === 0) return setAnnouncement(message);
2105
+ setAnnouncement("");
2106
+ announceTimer.current = setTimeout(() => setAnnouncement(message), delay);
2107
+ };
2108
+ const commit = (next, message, delay = 0) => {
2087
2109
  if (!isControlled) setInnerFiles(next);
2088
2110
  onValueChange?.(next);
2089
- setAnnouncement(message);
2111
+ announce(message, delay);
2090
2112
  };
2091
2113
  const addFiles = (incoming) => {
2092
2114
  if (disabled || incoming.length === 0) return;
@@ -2107,14 +2129,14 @@ var FileUpload = /* @__PURE__ */ forwardRef22(function FileUpload2(props, ref) {
2107
2129
  const summary = m.filesSelected?.(next.length) ?? `\uD30C\uC77C ${next.length}\uAC1C \uC120\uD0DD\uB428`;
2108
2130
  const errors2 = [...new Set(rejected.map(reasonText))].join(" ");
2109
2131
  if (accepted.length > 0) commit(next, [summary, errors2].filter(Boolean).join(" "));
2110
- else setAnnouncement(errors2);
2132
+ else announce(errors2);
2111
2133
  };
2112
2134
  const removeAt = (index) => {
2113
2135
  const removed = files[index];
2114
2136
  const next = files.filter((_, i) => i !== index);
2115
2137
  focusAfterRemove.current = Math.min(index, next.length - 1);
2116
2138
  setRejections([]);
2117
- commit(next, m.fileRemoved?.(removed.name) ?? `${removed.name} \uC0AD\uC81C\uB428`);
2139
+ commit(next, m.fileRemoved?.(removed.name) ?? `${removed.name} \uC0AD\uC81C\uB428`, REMOVED_ANNOUNCE_DELAY);
2118
2140
  };
2119
2141
  useEffect8(() => {
2120
2142
  if (focusAfterRemove.current === null) return;
@@ -2203,7 +2225,7 @@ var FileUpload = /* @__PURE__ */ forwardRef22(function FileUpload2(props, ref) {
2203
2225
  files.length > 0 && /* @__PURE__ */ jsx26("ul", { "aria-label": m.fileList ?? "\uC120\uD0DD\uD55C \uD30C\uC77C", className: list4, children: files.map((file, index) => /* @__PURE__ */ jsxs21("li", { className: item5, children: [
2204
2226
  /* @__PURE__ */ jsx26("span", { className: fileIcon, "aria-hidden": true, children: /* @__PURE__ */ jsx26(FileIcon, { size: 16 }) }),
2205
2227
  /* @__PURE__ */ jsx26("span", { className: fileName, children: file.name }),
2206
- /* @__PURE__ */ jsx26("span", { className: fileSize, children: formatSize(file.size) }),
2228
+ /* @__PURE__ */ jsx26("span", { id: `${baseId}-size-${index}`, className: fileSize, children: formatSize(file.size) }),
2207
2229
  /* @__PURE__ */ jsx26(
2208
2230
  IconButton,
2209
2231
  {
@@ -2212,6 +2234,7 @@ var FileUpload = /* @__PURE__ */ forwardRef22(function FileUpload2(props, ref) {
2212
2234
  },
2213
2235
  size: "sm",
2214
2236
  "aria-label": m.fileRemove?.(file.name) ?? `${file.name} \uC0AD\uC81C`,
2237
+ "aria-describedby": `${baseId}-size-${index}`,
2215
2238
  disabled,
2216
2239
  onClick: () => removeAt(index),
2217
2240
  children: /* @__PURE__ */ jsx26(XIcon6, {})
@@ -2331,7 +2354,7 @@ var DropdownMenuSubContent = /* @__PURE__ */ forwardRef23(
2331
2354
  );
2332
2355
 
2333
2356
  // src/components/NumberInput/NumberInput.tsx
2334
- import { forwardRef as forwardRef24, useEffect as useEffect9, useId as useId10, useRef as useRef12 } from "react";
2357
+ import { forwardRef as forwardRef24, useEffect as useEffect9, useId as useId10, useRef as useRef12, useState as useState10 } from "react";
2335
2358
  import { MinusIcon as MinusIcon2, PlusIcon } from "@bestow-ui/icons";
2336
2359
 
2337
2360
  // src/components/NumberInput/NumberInput.css.ts
@@ -2418,9 +2441,12 @@ var NumberInput = /* @__PURE__ */ forwardRef24(
2418
2441
  if (parse(field4.raw) !== next) setRaw(toRaw(next));
2419
2442
  }, [value3]);
2420
2443
  const current2 = parse(field4.raw);
2421
- const setValue = (next) => {
2444
+ const valueText = (n) => `${format2(toRaw(n))}${unit2 ?? ""}`;
2445
+ const [announcement, setAnnouncement] = useState10("");
2446
+ const setValue = (next, announce = true) => {
2422
2447
  setRaw(toRaw(next));
2423
2448
  emit(next);
2449
+ if (announce) setAnnouncement(valueText(next));
2424
2450
  };
2425
2451
  const stepBy = (delta) => {
2426
2452
  if (disabled || readOnly) return;
@@ -2476,13 +2502,17 @@ var NumberInput = /* @__PURE__ */ forwardRef24(
2476
2502
  "aria-valuenow": current2 ?? void 0,
2477
2503
  "aria-valuemin": min,
2478
2504
  "aria-valuemax": max,
2479
- "aria-valuetext": current2 === null ? void 0 : `${field4.display}${unit2 ?? ""}`,
2505
+ "aria-valuetext": current2 === null ? void 0 : valueText(current2),
2480
2506
  value: field4.display,
2481
- onChange: field4.onChange,
2507
+ onChange: (event) => {
2508
+ setAnnouncement("");
2509
+ field4.onChange(event);
2510
+ },
2482
2511
  onKeyDown: handleKeyDown,
2483
2512
  onBlur: (event) => {
2484
- if (current2 !== null && clamp(current2) !== current2) setValue(clamp(current2));
2513
+ if (current2 !== null && clamp(current2) !== current2) setValue(clamp(current2), false);
2485
2514
  else if (current2 === null && field4.raw !== "") setRaw("");
2515
+ setAnnouncement("");
2486
2516
  onBlur?.(event);
2487
2517
  },
2488
2518
  size,
@@ -2497,14 +2527,15 @@ var NumberInput = /* @__PURE__ */ forwardRef24(
2497
2527
  ...rest
2498
2528
  }
2499
2529
  ),
2500
- name && /* @__PURE__ */ jsx28("input", { type: "hidden", name, value: current2 === null ? "" : String(current2) })
2530
+ name && /* @__PURE__ */ jsx28("input", { type: "hidden", name, value: current2 === null ? "" : String(current2) }),
2531
+ /* @__PURE__ */ jsx28("span", { "aria-live": "assertive", "aria-atomic": "true", className: visuallyHidden, children: announcement })
2501
2532
  ] });
2502
2533
  }
2503
2534
  );
2504
2535
 
2505
2536
  // src/components/Pagination/Pagination.tsx
2506
2537
  import { ChevronLeftIcon as ChevronLeftIcon2, ChevronRightIcon as ChevronRightIcon4 } from "@bestow-ui/icons";
2507
- import { forwardRef as forwardRef25, useState as useState10 } from "react";
2538
+ import { forwardRef as forwardRef25, useState as useState11 } from "react";
2508
2539
 
2509
2540
  // src/components/Pagination/getPaginationItems.ts
2510
2541
  var range = (start, end2) => end2 < start ? [] : Array.from({ length: end2 - start + 1 }, (_, i) => start + i);
@@ -2551,7 +2582,7 @@ var Pagination = /* @__PURE__ */ forwardRef25(function Pagination2({
2551
2582
  "aria-label": ariaLabelProp,
2552
2583
  ...rest
2553
2584
  }, ref) {
2554
- const [uncontrolledPage, setUncontrolledPage] = useState10(defaultPage);
2585
+ const [uncontrolledPage, setUncontrolledPage] = useState11(defaultPage);
2555
2586
  const m = useMessages();
2556
2587
  const ariaLabel = ariaLabelProp ?? m.pagination ?? "\uD398\uC774\uC9C0 \uD0D0\uC0C9";
2557
2588
  const getItemLabel = getItemLabelProp ?? ((type, n) => type === "previous" ? m.paginationPrevious ?? "\uC774\uC804 \uD398\uC774\uC9C0" : type === "next" ? m.paginationNext ?? "\uB2E4\uC74C \uD398\uC774\uC9C0" : m.paginationPage?.(n) ?? `${n} \uD398\uC774\uC9C0`);
@@ -2656,7 +2687,7 @@ var PhoneNumberInput = /* @__PURE__ */ forwardRef26(
2656
2687
  );
2657
2688
 
2658
2689
  // src/components/RadioGroup/RadioGroup.tsx
2659
- import { forwardRef as forwardRef27, useId as useId11, useState as useState11 } from "react";
2690
+ import { forwardRef as forwardRef27, useId as useId11, useState as useState12 } from "react";
2660
2691
 
2661
2692
  // src/components/RadioGroup/RadioGroup.css.ts
2662
2693
  import { createRuntimeFn as _7a46813 } from "@vanilla-extract/recipes/createRuntimeFn";
@@ -2689,7 +2720,7 @@ var RadioGroup2 = /* @__PURE__ */ forwardRef27(function RadioGroup3(props, ref)
2689
2720
  className
2690
2721
  } = props;
2691
2722
  const isControlled = "value" in props;
2692
- const [innerValue, setInnerValue] = useState11(defaultValue ?? "");
2723
+ const [innerValue, setInnerValue] = useState12(defaultValue ?? "");
2693
2724
  const current2 = isControlled ? value3 ?? "" : innerValue;
2694
2725
  const generatedId = useId11();
2695
2726
  const baseId = id ?? generatedId;
@@ -2756,7 +2787,7 @@ var RadioGroup2 = /* @__PURE__ */ forwardRef27(function RadioGroup3(props, ref)
2756
2787
  });
2757
2788
 
2758
2789
  // src/components/SegmentedControl/SegmentedControl.tsx
2759
- import { forwardRef as forwardRef28, useId as useId12, useRef as useRef14, useState as useState12 } from "react";
2790
+ import { forwardRef as forwardRef28, useId as useId12, useRef as useRef14, useState as useState13 } from "react";
2760
2791
 
2761
2792
  // src/components/SegmentedControl/SegmentedControl.css.ts
2762
2793
  import { createRuntimeFn as _7a46814 } from "@vanilla-extract/recipes/createRuntimeFn";
@@ -2784,7 +2815,7 @@ var SegmentedControl = /* @__PURE__ */ forwardRef28(
2784
2815
  className
2785
2816
  } = props;
2786
2817
  const isControlled = "value" in props;
2787
- const [innerValue, setInnerValue] = useState12(defaultValue ?? "");
2818
+ const [innerValue, setInnerValue] = useState13(defaultValue ?? "");
2788
2819
  const current2 = isControlled ? value3 ?? "" : innerValue;
2789
2820
  const generatedId = useId12();
2790
2821
  const labelId = label6 ? `${id ?? generatedId}-label` : void 0;
@@ -2983,7 +3014,7 @@ var SkipLink = /* @__PURE__ */ forwardRef30(function SkipLink2({ href = "#main",
2983
3014
 
2984
3015
  // src/components/Slider/Slider.tsx
2985
3016
  import * as RadixSlider from "@radix-ui/react-slider";
2986
- import { forwardRef as forwardRef31, useId as useId14, useState as useState13 } from "react";
3017
+ import { forwardRef as forwardRef31, useId as useId14, useState as useState14 } from "react";
2987
3018
 
2988
3019
  // src/components/Slider/Slider.css.ts
2989
3020
  import { createRuntimeFn as _7a46815 } from "@vanilla-extract/recipes/createRuntimeFn";
@@ -3025,7 +3056,7 @@ var Slider = /* @__PURE__ */ forwardRef31(function Slider2(props, ref) {
3025
3056
  const labelId = `${baseId}-label`;
3026
3057
  const helperId = `${baseId}-helper`;
3027
3058
  const isControlled = "value" in props;
3028
- const [innerValue, setInnerValue] = useState13(defaultValue ?? [min]);
3059
+ const [innerValue, setInnerValue] = useState14(defaultValue ?? [min]);
3029
3060
  const current2 = isControlled ? value3 ?? [min] : innerValue;
3030
3061
  const isRange = current2.length > 1;
3031
3062
  const handleChange = (next) => {
@@ -3297,9 +3328,9 @@ function TableSkeleton({ rows = 5, columns }) {
3297
3328
  }
3298
3329
 
3299
3330
  // src/components/Table/useTableSelection.ts
3300
- import { useCallback, useState as useState14 } from "react";
3331
+ import { useCallback, useState as useState15 } from "react";
3301
3332
  function useTableSelection(initial = []) {
3302
- const [selected, setSelected] = useState14(initial);
3333
+ const [selected, setSelected] = useState15(initial);
3303
3334
  const isSelected = useCallback((id) => selected.includes(id), [selected]);
3304
3335
  const toggle3 = useCallback((id, checked) => {
3305
3336
  setSelected((prev) => {
@@ -3363,7 +3394,7 @@ import {
3363
3394
  useCallback as useCallback2,
3364
3395
  useId as useId17,
3365
3396
  useRef as useRef15,
3366
- useState as useState15
3397
+ useState as useState16
3367
3398
  } from "react";
3368
3399
 
3369
3400
  // src/components/Textarea/Textarea.css.ts
@@ -3401,7 +3432,7 @@ var Textarea = /* @__PURE__ */ forwardRef36(function Textarea2({
3401
3432
  const textareaId = id ?? generatedId;
3402
3433
  const helperId = helperText3 ? `${textareaId}-helper` : void 0;
3403
3434
  const innerRef = useRef15(null);
3404
- const [uncontrolledLength, setUncontrolledLength] = useState15(() => String(defaultValue ?? "").length);
3435
+ const [uncontrolledLength, setUncontrolledLength] = useState16(() => String(defaultValue ?? "").length);
3405
3436
  const length = value3 !== void 0 ? String(value3).length : uncontrolledLength;
3406
3437
  const fitHeight = useCallback2(() => {
3407
3438
  const el = innerRef.current;
@@ -3452,7 +3483,7 @@ var Textarea = /* @__PURE__ */ forwardRef36(function Textarea2({
3452
3483
 
3453
3484
  // src/components/Toast/Toast.tsx
3454
3485
  import * as RadixToast from "@radix-ui/react-toast";
3455
- import { createContext as createContext5, useCallback as useCallback3, useContext as useContext5, useMemo as useMemo4, useRef as useRef16, useState as useState16 } from "react";
3486
+ import { createContext as createContext5, useCallback as useCallback3, useContext as useContext5, useMemo as useMemo4, useRef as useRef16, useState as useState17 } from "react";
3456
3487
  import { XIcon as XIcon7 } from "@bestow-ui/icons";
3457
3488
 
3458
3489
  // src/components/Toast/Toast.css.ts
@@ -3471,7 +3502,7 @@ var ToastContext = /* @__PURE__ */ createContext5(null);
3471
3502
  function ToastProvider({ children, duration = 5e3, label: labelProp }) {
3472
3503
  const m = useMessages();
3473
3504
  const label6 = labelProp ?? m.notifications ?? "\uC54C\uB9BC";
3474
- const [toasts, setToasts] = useState16([]);
3505
+ const [toasts, setToasts] = useState17([]);
3475
3506
  const nextId = useRef16(0);
3476
3507
  const portal2 = usePortalProps();
3477
3508
  const toast2 = useCallback3((options) => {
@@ -3558,7 +3589,7 @@ function Tooltip({
3558
3589
  }
3559
3590
 
3560
3591
  // src/components/VerificationCodeInput/VerificationCodeInput.tsx
3561
- import { forwardRef as forwardRef37, useEffect as useEffect10, useId as useId18, useRef as useRef17, useState as useState17 } from "react";
3592
+ import { forwardRef as forwardRef37, useEffect as useEffect10, useId as useId18, useRef as useRef17, useState as useState18 } from "react";
3562
3593
 
3563
3594
  // src/components/VerificationCodeInput/VerificationCodeInput.css.ts
3564
3595
  var input5 = "ea01812";
@@ -3603,11 +3634,11 @@ var VerificationCodeInput = /* @__PURE__ */ forwardRef37(
3603
3634
  const statusId = `${inputId}-status`;
3604
3635
  const inputRef = useRef17(null);
3605
3636
  const isControlled = "value" in props;
3606
- const [innerValue, setInnerValue] = useState17(defaultValue ?? "");
3637
+ const [innerValue, setInnerValue] = useState18(defaultValue ?? "");
3607
3638
  const code = (isControlled ? value3 ?? "" : innerValue).slice(0, length);
3608
- const [focused, setFocused] = useState17(false);
3609
- const [endAt, setEndAt] = useState17(() => expiresIn ? Date.now() + expiresIn * 1e3 : null);
3610
- const [remaining, setRemaining] = useState17(expiresIn ?? 0);
3639
+ const [focused, setFocused] = useState18(false);
3640
+ const [endAt, setEndAt] = useState18(() => expiresIn ? Date.now() + expiresIn * 1e3 : null);
3641
+ const [remaining, setRemaining] = useState18(expiresIn ?? 0);
3611
3642
  const expired = expiresIn !== void 0 && remaining <= 0;
3612
3643
  const onExpireRef = useRef17(onExpire);
3613
3644
  useEffect10(() => {