임동욱 임동욱 08-20
feat(@fox): FoxSelect에 ariaLabel
라벨을 두지 않는 필터 셀렉트에 이름을 줄 방법이 없었다. FoxSelectText와 같은 규칙으로
label이 있으면 무시하고, 없을 때만 트리거에 aria-label을 붙인다.

Co-Authored-By: Claude Opus 5 
@3ccae7e99868952a4d20fd34574c4e3b4265a77a
@fox/core/components/fox-select/fox-select.tsx
--- @fox/core/components/fox-select/fox-select.tsx
+++ @fox/core/components/fox-select/fox-select.tsx
@@ -79,6 +79,11 @@
   readOnly?: boolean;
   /** 필드 위 라벨. 넘기지 않으면 라벨을 렌더링하지 않는다. */
   label?: ReactNode;
+  /**
+   * 라벨을 두지 않는 자리(시안의 필터 셀렉트 등)에서 트리거를 읽어 줄 이름.
+   * `label`이 있으면 그쪽이 이름이라 무시된다(`FoxSelectText`와 같은 규칙).
+   */
+  ariaLabel?: string;
   /** 라벨 뒤 필수·선택 표시. `label`이 없으면 의미 없다. */
   requirement?: FoxFormLabelRequirement;
   /** select 아래 힌트 메시지. 넘기지 않으면 힌트 영역을 렌더링하지 않는다. */
@@ -127,6 +132,7 @@
   disabled = false,
   readOnly = false,
   label,
+  ariaLabel,
   requirement,
   hint,
   hintIcon,
@@ -312,6 +318,7 @@
           id={triggerId}
           role="combobox"
           disabled={isDisabled}
+          aria-label={label ? undefined : ariaLabel}
           aria-haspopup="listbox"
           aria-expanded={open}
           // 리스트박스는 열렸을 때만 렌더되므로, 닫힌 동안 없는 id를 가리키지 않게 한다.
@fox/dev-test/component-registry.tsx
--- @fox/dev-test/component-registry.tsx
+++ @fox/dev-test/component-registry.tsx
@@ -1460,10 +1460,10 @@
         ),
       },
       {
-        label: "라벨 없음 · 힌트 없음 — 해당 영역이 렌더되지 않는다",
+        label: "라벨 없음 · 힌트 없음 — 이름은 ariaLabel로 준다",
         node: (
           <div className={styles.demoFields}>
-            <FoxSelect size="md" options={SELECT_ITEMS} />
+            <FoxSelect size="md" ariaLabel="등급" options={SELECT_ITEMS} />
             <FoxSelect size="md" label="라벨만" options={SELECT_ITEMS} />
           </div>
         ),
app/(protected)/(basic)/points/accumulated/_components/point-account-list.tsx
--- app/(protected)/(basic)/points/accumulated/_components/point-account-list.tsx
+++ app/(protected)/(basic)/points/accumulated/_components/point-account-list.tsx
@@ -186,6 +186,7 @@
             <div className={styles.select}>
               <FoxSelect
                 size="md"
+                ariaLabel="학년"
                 options={numberOptions(GRADE_OPTIONS, '학년')}
                 value={selectedNumber(query.grade)}
                 onValueChange={(value) => go({ grade: parseSelected(value) })}
@@ -194,6 +195,7 @@
             <div className={styles.select}>
               <FoxSelect
                 size="md"
+                ariaLabel="반"
                 options={numberOptions(CLASS_OPTIONS, '반')}
                 value={selectedNumber(query.classNo)}
                 onValueChange={(value) => go({ classNo: parseSelected(value) })}
@@ -202,6 +204,7 @@
             <div className={styles.select}>
               <FoxSelect
                 size="md"
+                ariaLabel="번호"
                 options={numberOptions(NUMBER_OPTIONS, '번')}
                 value={selectedNumber(query.studentNo)}
                 onValueChange={(value) => go({ studentNo: parseSelected(value) })}
Add a comment
List