@apt.today/react-seoul-icons 1.0.2 → 1.2.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
@@ -8,9 +8,9 @@
8
8
 
9
9
  ![Seoul Icons Preview](https://myriky.github.io/apt-today-react-seoul-icons/preview.png)
10
10
 
11
- 서울시 25개 행정구 아이콘을 React 컴포넌트로 제공하는 라이브러리입니다.
11
+ 대한민국 광역자치단체(시/도) 기초자치단체(시/군/구) 로고 아이콘을 React 컴포넌트로 제공하는 라이브러리입니다.
12
12
 
13
- 🌐 [데모 페이지](https://myriky.github.io/apt-today-react-seoul-icons/)
13
+ [데모 페이지](https://myriky.github.io/apt-today-react-seoul-icons/)
14
14
 
15
15
  ## 설치
16
16
 
@@ -18,296 +18,221 @@
18
18
  npm install @apt.today/react-seoul-icons
19
19
  ```
20
20
 
21
- 또는
22
-
23
21
  ```bash
24
22
  yarn add @apt.today/react-seoul-icons
25
23
  ```
26
24
 
27
25
  ## 사용법
28
26
 
29
- ### 개별 컴포넌트 Import
27
+ ### 컴포넌트 직접 사용
28
+
29
+ 아이콘을 직접 import해서 React 컴포넌트로 사용합니다.
30
30
 
31
31
  ```tsx
32
- import { GangnamGu, JongnoGu, MapoGu } from "@apt.today/react-seoul-icons";
32
+ import { GangnamGu, Seoul, MapoGu } from "@apt.today/react-seoul-icons";
33
33
 
34
34
  function App() {
35
35
  return (
36
36
  <div>
37
+ <Seoul width={64} height={64} />
37
38
  <GangnamGu className="w-12 h-12" />
38
- <JongnoGu style={{ width: 48, height: 48 }} />
39
- <MapoGu width={48} height={48} />
39
+ <MapoGu style={{ width: 48, height: 48 }} />
40
40
  </div>
41
41
  );
42
42
  }
43
43
  ```
44
44
 
45
- ### 전체 Import (네임스페이스)
46
-
47
- ```tsx
48
- import * as SeoulIcons from "@apt.today/react-seoul-icons";
45
+ ### 유틸리티로 동적 조회
49
46
 
50
- function App() {
51
- return (
52
- <div>
53
- <SeoulIcons.GangnamGu width={48} />
54
- <SeoulIcons.JongnoGu className="w-12 h-12" />
55
- </div>
56
- );
57
- }
58
- ```
59
-
60
- ### 동적 아이콘 렌더링 (컴포넌트 이름 기반)
47
+ 코드나 이름으로 아이콘을 동적으로 가져올 때는 `utils`를 사용합니다.
61
48
 
62
49
  ```tsx
63
- import * as SeoulIcons from "@apt.today/react-seoul-icons";
64
-
65
- const districts = ["GangnamGu", "MapoGu", "JongnoGu"];
66
-
67
- function App() {
68
- return (
69
- <div className="flex gap-4">
70
- {districts.map((name) => {
71
- const Icon = SeoulIcons[name as keyof typeof SeoulIcons] as React.FC<
72
- React.SVGProps<SVGSVGElement>
73
- >;
74
- return <Icon key={name} width={48} height={48} />;
75
- })}
76
- </div>
77
- );
78
- }
79
- ```
80
-
81
- ### 행정구역 코드로 아이콘 가져오기 ⭐
50
+ import { utils } from "@apt.today/react-seoul-icons";
82
51
 
83
- ```tsx
84
- import { getIconByCode } from "@apt.today/react-seoul-icons";
52
+ // 코드로 아이콘 가져오기 (시도 2자리 / 시군구 5자리 자동 판별)
53
+ const SeoulIcon = utils.getIcon(11); // 서울특별시
54
+ const GangnamIcon = utils.getIcon(11680); // 강남구
85
55
 
86
- function App() {
87
- const GangnamIcon = getIconByCode(11680); // 강남구
88
- const JungIcon = getIconByCode(11140); // 중구
56
+ // 이름으로 아이콘 검색
57
+ const Icon = utils.findByName("강남구");
58
+ const Icon2 = utils.findByName("강남");
59
+ const Icon3 = utils.findByName("서울특별시 강남구");
60
+ const Icon4 = utils.findByName("서울 강남구");
89
61
 
90
- return (
91
- <div>
92
- {GangnamIcon && <GangnamIcon width={48} height={48} />}
93
- {JungIcon && <JungIcon width={48} height={48} />}
94
- </div>
95
- );
96
- }
62
+ // 중복 이름(중구 등)은 region 옵션으로 구분
63
+ const JungGu = utils.findByName("중구", { region: "서울" });
97
64
  ```
98
65
 
99
- ### 이름으로 아이콘 가져오기
66
+ ### 지역별 목록 조회
100
67
 
101
68
  ```tsx
102
- import { getIconByName } from "@apt.today/react-seoul-icons";
103
-
104
- // 다양한 형식 지원
105
- const Icon1 = getIconByName("강남구"); // ✅
106
- const Icon2 = getIconByName("강남"); // ✅
107
- const Icon3 = getIconByName("서울특별시 강남구"); // ✅
108
- const Icon4 = getIconByName("서울 강남구"); // ✅
69
+ import { utils } from "@apt.today/react-seoul-icons";
109
70
 
110
- // 중복되는 이름(중구 등)은 region 옵션 필요
111
- const SeoulJung = getIconByName("중구", { region: "서울" }); //
112
- const BusanJung = getIconByName("중구", { region: "부산" }); // ✅ (추후 지원)
113
- ```
71
+ // 시도별 시군구 목록
72
+ const seoulIcons = utils.getByRegion(11); // 코드로
73
+ const gyeonggiIcons = utils.getByRegion("경기"); // 이름으로
114
74
 
115
- ### 모든 지역 정보 가져오기
116
-
117
- ```tsx
118
- import {
119
- getAllDistrictInfo,
120
- getDistrictsByRegion,
121
- } from "@apt.today/react-seoul-icons";
75
+ // 전체 시도 목록
76
+ const regions = utils.getAllRegions();
122
77
 
123
- // 모든 지역 정보
124
- const allDistricts = getAllDistrictInfo();
78
+ // 전체 시군구 목록
79
+ const allIcons = utils.getAll();
125
80
 
126
- // 서울시만 가져오기
127
- const seoulDistricts = getDistrictsByRegion("서울");
128
-
129
- function App() {
81
+ function DistrictList() {
130
82
  return (
131
- <div>
132
- {seoulDistricts.map((district) => {
133
- const Icon = district.component;
134
- return (
135
- <div key={district.code}>
136
- <Icon width={48} height={48} />
137
- <span>{district.name}</span>
138
- <code>{district.code}</code>
139
- </div>
140
- );
141
- })}
83
+ <div className="grid grid-cols-5 gap-4">
84
+ {seoulIcons.map((icon) => (
85
+ <div key={icon.code} className="flex flex-col items-center">
86
+ <icon.component className="w-12 h-12" />
87
+ <span>{icon.name}</span>
88
+ </div>
89
+ ))}
142
90
  </div>
143
91
  );
144
92
  }
145
93
  ```
146
94
 
147
- ## API 레퍼런스
148
-
149
- ### 아이콘 가져오기
150
-
151
- | 함수 | 설명 | 반환 타입 |
152
- | ------------------------------- | ------------------------------- | --------------------------- |
153
- | `getIconByCode(code)` | 행정구역 코드로 아이콘 가져오기 | `Component \| undefined` |
154
- | `getIconByName(name, options?)` | 이름으로 아이콘 가져오기 | `Component \| undefined` |
155
- | `getDistrictInfo(code)` | 행정구역 코드로 정보 가져오기 | `DistrictInfo \| undefined` |
156
- | `getNameByCode(code)` | 행정구역 코드로 이름 가져오기 | `string \| undefined` |
157
- | `getAllDistrictInfo()` | 모든 지역 정보 가져오기 | `readonly DistrictInfo[]` |
158
- | `getDistrictsByRegion(region)` | 특정 시/도의 지역 정보 | `DistrictInfo[]` |
159
- | `getAllCodes()` | 모든 행정구역 코드 목록 | `number[]` |
160
- | `isValidCode(code)` | 유효한 코드인지 확인 | `boolean` |
161
-
162
- ### 타입
95
+ ### API 응답에서 동적으로 사용
163
96
 
164
97
  ```tsx
165
- import type {
166
- RegionCode, // "서울" | "부산" | "대구" | ...
167
- SeoulGuCode, // 11110 | 11140 | ...
168
- DistrictInfo, // 지역 정보 객체
169
- SeoulGuIconComponent, // SVG 컴포넌트 타입
170
- GetIconByNameOptions, // { region?: RegionCode }
171
- } from "@apt.today/react-seoul-icons";
172
- ```
98
+ import { utils } from "@apt.today/react-seoul-icons";
173
99
 
174
- ### DistrictInfo 타입
175
-
176
- ```tsx
177
- interface DistrictInfo {
178
- code: number; // 행정구역 코드 (예: 11680)
179
- region: RegionCode; // 시/도 (예: "서울")
180
- regionFullName: string; // 시/도 전체 이름 (예: "서울특별시")
181
- name: string; // 구 이름 (예: "강남구")
182
- shortName: string; // 짧은 이름 (예: "강남")
183
- component: SeoulGuIconComponent; // React 컴포넌트
100
+ // 행정구역 코드를 받은 경우
101
+ function DistrictIcon({ code }: { code: number }) {
102
+ const Icon = utils.getIcon(code);
103
+ if (!Icon) return null;
104
+ return <Icon width={48} height={48} />;
184
105
  }
185
- ```
186
106
 
187
- ## 행정구역 코드표
188
-
189
- | 코드 | 행정구 | 컴포넌트명 |
190
- | ------- | -------- | ---------------- |
191
- | `11110` | 종로구 | `JongnoGu` |
192
- | `11140` | 중구 | `JungGu` |
193
- | `11170` | 용산구 | `YongsanGu` |
194
- | `11200` | 성동구 | `SeongdongGu` |
195
- | `11215` | 광진구 | `GwangjinGu` |
196
- | `11230` | 동대문구 | `DongdaemunGu` |
197
- | `11260` | 중랑구 | `JungnangGu` |
198
- | `11290` | 성북구 | `SeongbukGu` |
199
- | `11305` | 강북구 | `GangbukGu` |
200
- | `11320` | 도봉구 | `DobongGu` |
201
- | `11350` | 노원구 | `NowonGu` |
202
- | `11380` | 은평구 | `EunpyeongGu` |
203
- | `11410` | 서대문구 | `SeodaemunGu` |
204
- | `11440` | 마포구 | `MapoGu` |
205
- | `11470` | 양천구 | `YangcheonGu` |
206
- | `11500` | 강서구 | `GangseoGu` |
207
- | `11530` | 구로구 | `GuroGu` |
208
- | `11545` | 금천구 | `GeumcheonGu` |
209
- | `11560` | 영등포구 | `YeongdeungpoGu` |
210
- | `11590` | 동작구 | `DongjakGu` |
211
- | `11620` | 관악구 | `GwanakGu` |
212
- | `11650` | 서초구 | `SeochoGu` |
213
- | `11680` | 강남구 | `GangnamGu` |
214
- | `11710` | 송파구 | `SongpaGu` |
215
- | `11740` | 강동구 | `GangdongGu` |
216
-
217
- ## Props
218
-
219
- 모든 컴포넌트는 SVG 요소의 표준 props를 지원합니다:
220
-
221
- ```tsx
222
- interface IconProps extends React.SVGProps<SVGSVGElement> {}
107
+ // 지역명을 받은 경우
108
+ function DistrictIconByName({ name }: { name: string }) {
109
+ const Icon = utils.findByName(name);
110
+ if (!Icon) return null;
111
+ return <Icon width={48} height={48} />;
112
+ }
223
113
  ```
224
114
 
225
- 일반적으로 사용되는 props:
226
-
227
- - `className`: CSS 클래스명
228
- - `style`: 인라인 스타일
229
- - `width`: 너비
230
- - `height`: 높이
231
- - `fill`: 색상 (일부 아이콘은 고정 색상)
232
- - `onClick`: 클릭 이벤트 핸들러
115
+ ## API
233
116
 
234
- ## 예제
117
+ ### 아이콘 컴포넌트
235
118
 
236
- ### Tailwind CSS와 함께 사용
119
+ 모든 아이콘 컴포넌트는 `React.SVGProps<SVGSVGElement>`를 지원합니다.
237
120
 
238
121
  ```tsx
239
- import { GangnamGu } from "@apt.today/react-seoul-icons";
240
-
241
- function Example() {
242
- return <GangnamGu className="w-16 h-16 text-blue-500 hover:text-blue-700" />;
243
- }
122
+ <GangnamGu width={48} height={48} />
123
+ <GangnamGu className="w-12 h-12" />
124
+ <GangnamGu style={{ width: 48 }} />
244
125
  ```
245
126
 
246
- ### API 응답에서 동적으로 사용
127
+ ### utils
247
128
 
248
- ```tsx
249
- import { getIconByCode, getIconByName } from "@apt.today/react-seoul-icons";
129
+ | 메서드 | 설명 | 반환 타입 |
130
+ | --- | --- | --- |
131
+ | `utils.getIcon(code)` | 시도/시군구 코드로 아이콘 가져오기 | `IconComponent \| null` |
132
+ | `utils.findByName(name, options?)` | 이름으로 아이콘 검색 | `IconComponent \| null` |
133
+ | `utils.getInfo(code)` | 코드로 상세 정보 가져오기 | `IconInfo \| RegionInfo \| null` |
134
+ | `utils.getByRegion(codeOrName)` | 특정 시도의 시군구 목록 | `IconInfo[]` |
135
+ | `utils.getAllRegions()` | 모든 시도 정보 | `RegionInfo[]` |
136
+ | `utils.getAvailableRegions()` | 아이콘이 있는 시도만 | `RegionInfo[]` |
137
+ | `utils.getRegionsWithIcons()` | 시군구가 있는 시도만 | `RegionInfo[]` |
138
+ | `utils.getAll()` | 모든 시군구 아이콘 정보 | `IconInfo[]` |
139
+ | `utils.isValid(code)` | 유효한 코드인지 확인 | `boolean` |
250
140
 
251
- // API에서 행정구역 코드를 받은 경우
252
- function DistrictIcon({ code }: { code: number }) {
253
- const Icon = getIconByCode(code);
254
- if (!Icon) return null;
255
- return <Icon width={48} height={48} />;
141
+ ### 타입
142
+
143
+ ```tsx
144
+ import type { IconComponent, IconInfo, RegionInfo } from "@apt.today/react-seoul-icons";
145
+
146
+ // IconComponent
147
+ type IconComponent = React.ComponentType<React.SVGProps<SVGSVGElement>>;
148
+
149
+ // IconInfo - 시군구 아이콘 정보
150
+ interface IconInfo {
151
+ code: number; // 시군구 코드 (예: 11680)
152
+ regionCode: number; // 소속 시도 코드 (예: 11)
153
+ regionName: string; // 소속 시도명 (예: "서울특별시")
154
+ name: string; // 이름 (예: "강남구")
155
+ shortName: string; // 단축명 (예: "강남")
156
+ componentName: string; // 컴포넌트명 (예: "GangnamGu")
157
+ component: IconComponent;
256
158
  }
257
159
 
258
- // API에서 지역명을 받은 경우
259
- function DistrictIconByName({ name }: { name: string }) {
260
- // "서울특별시 강남구" 같은 형식도 OK
261
- const Icon = getIconByName(name);
262
- if (!Icon) return null;
263
- return <Icon width={48} height={48} />;
160
+ // RegionInfo - 시도 정보
161
+ interface RegionInfo {
162
+ code: number; // 시도 코드 (예: 11)
163
+ name: string; // 전체 이름 (예: "서울특별시")
164
+ shortName: string; // 단축명 (예: "서울")
165
+ englishName: string; // 영문명 (예: "Seoul")
166
+ component: IconComponent | null;
264
167
  }
265
168
  ```
266
169
 
267
- ### 지역 목록 렌더링
170
+ ## 지원 행정구역
171
+
172
+ ### 시도 (광역시/도)
173
+
174
+ | 시도 | 코드 | 컴포넌트명 |
175
+ | --- | --- | --- |
176
+ | 서울특별시 | `11` | `Seoul` |
177
+ | 부산광역시 | `26` | `Busan` |
178
+ | 대구광역시 | `27` | `Daegu` |
179
+ | 인천광역시 | `28` | `Incheon` |
180
+ | 울산광역시 | `31` | `Ulsan` |
181
+ | 경기도 | `41` | `Gyeonggi` |
182
+
183
+ ### 시군구
184
+
185
+ - **서울특별시**: 25개 자치구 (강남구, 종로구, 마포구 등)
186
+ - **경기도**: 14개 시 (수원시, 고양시, 용인시, 화성시, 성남시, 안양시, 광명시, 과천시, 구리시, 남양주시, 하남시, 의왕시, 김포시, 파주시)
187
+ - **부산광역시**: 해운대구
188
+ - **대구광역시**: 수성구
189
+ - **인천광역시**: 연수구
190
+ - **울산광역시**: 남구
191
+
192
+ ## v1에서 마이그레이션
193
+
194
+ v2에서는 API가 `utils` 네임스페이스로 통합되었습니다.
195
+
196
+ | v1 | v2 |
197
+ | --- | --- |
198
+ | `getSidoIcon(11)` | `utils.getIcon(11)` |
199
+ | `getSigunguIcon(11680)` | `utils.getIcon(11680)` |
200
+ | `getIconByCode(11680)` | `utils.getIcon(11680)` |
201
+ | `getIconByName("강남구")` | `utils.findByName("강남구")` |
202
+ | `getSigunguIconByName("강남구")` | `utils.findByName("강남구")` |
203
+ | `getAllDistrictInfo()` | `utils.getAll()` |
204
+ | `getAllSigunguInfo()` | `utils.getAll()` |
205
+ | `getDistrictsByRegion("서울")` | `utils.getByRegion("서울")` |
206
+ | `getSigunguBySido(11)` | `utils.getByRegion(11)` |
207
+ | `getAllSidoInfo()` | `utils.getAllRegions()` |
208
+ | `type SidoInfo` | `type RegionInfo` |
209
+ | `type SigunguInfo` | `type IconInfo` |
210
+ | `type DistrictInfo` | `type IconInfo` |
211
+
212
+ 아이콘 컴포넌트의 직접 import는 변경 없이 동일합니다:
268
213
 
269
214
  ```tsx
270
- import { getAllDistrictInfo } from "@apt.today/react-seoul-icons";
271
-
272
- function DistrictList() {
273
- const districts = getAllDistrictInfo();
274
-
275
- return (
276
- <div className="grid grid-cols-5 gap-4">
277
- {districts.map((district) => (
278
- <div key={district.code} className="flex flex-col items-center">
279
- <district.component className="w-12 h-12" />
280
- <span>{district.name}</span>
281
- </div>
282
- ))}
283
- </div>
284
- );
285
- }
215
+ // v1과 v2 모두 동일
216
+ import { GangnamGu, Seoul } from "@apt.today/react-seoul-icons";
286
217
  ```
287
218
 
288
219
  ## 라이선스
289
220
 
290
221
  ### 아이콘 저작권
291
222
 
292
- 본 라이브러리의 아이콘은 서울특별시 자치구청의 공식 심볼/로고로, 공공누리 제1유형(출처표시)에 따라 자유롭게 이용할 수 있습니다.
223
+ 본 라이브러리의 아이콘은 각 지방자치단체의 공식 심볼/로고로, 공공누리 제1유형(출처표시)에 따라 자유롭게 이용할 수 있습니다.
293
224
 
294
225
  ### 라이브러리 코드
295
226
 
296
227
  본 라이브러리의 소스 코드는 MIT 라이선스를 따릅니다.
297
228
 
298
- 자세한 내용은 [LICENSE](./LICENSE) 파일을 참고하세요
229
+ 자세한 내용은 [LICENSE](./LICENSE) 파일을 참고하세요.
299
230
 
300
231
  ## About apt.today
301
232
 
302
233
  이 라이브러리는 [apt.today](https://apt.today) 프로젝트의 일부입니다.
303
234
 
304
- **apt.today**는 부동산 정보를 제공하는 서비스로, 서울특별시 지자체별 고시공고문, 모집공고문, 토지거래허가내역을 비롯한 다양한 아파트 관련 정보를 확인 할 수 있는 플랫폼입니다.
305
-
306
- 본 아이콘 라이브러리는 apt.today 서비스에서 서울시 각 행정구의 데이터를 시각적으로 표현하기 위해 개발되었으며, 누구나 자유롭게 사용할 수 있도록 오픈소스로 공개되었습니다.
307
-
308
- ### 관련 프로젝트
309
-
310
- - 🏢 [apt.today](https://apt.today) - 손 쉽게 찾는 부동산 정보, 오늘의 아파트
235
+ **apt.today**는 부동산 정보를 제공하는 서비스로, 전국 지자체별 고시공고문, 모집공고문, 토지거래허가내역을 비롯한 다양한 아파트 관련 정보를 확인 할 수 있는 플랫폼입니다.
311
236
 
312
237
  ## 기여
313
238