@designbasekorea/wordpress-ui 0.1.5 → 0.1.6

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
@@ -1,174 +1,204 @@
1
1
  # @designbasekorea/wordpress-ui
2
2
 
3
- WordPress 관리자 플러그인 화면을 위한 Designbase façade/adaptor 패키지입니다.
4
- WordPress 전체 관리자 프레임을 대체하지 않고, 플러그인 내부의 shell과 반복되는
5
- 페이지 패턴만 제공합니다.
3
+ WordPress 플러그인·테마 **관리자 화면 안**에서 Designbase UI를 쓰기 위한 패키지입니다.
4
+ WordPress 전역 프레임(`#adminmenu`, `#wpadminbar`, 다른 플러그인 화면)은 바꾸지 않습니다.
6
5
 
7
- ## 사용
6
+ - 기본 런타임은 React 없는 Web Component입니다.
7
+ - REST·AJAX·Settings API·capability·nonce·데이터는 소비 플러그인이 소유합니다.
8
+ - `@designbasekorea/ui-wc`를 직접 import하지 마세요. 공개 API는 이 패키지입니다.
8
9
 
9
- 현재 배포 기준 버전은 `0.1.5`입니다. Node 프로젝트에 다음처럼 설치합니다.
10
+ 현재 배포 버전은 `0.1.6`입니다. `@designbasekorea/ui-wc@0.8.7`에 의존합니다.
11
+
12
+ ## 설치
10
13
 
11
14
  ```bash
12
- npm install @designbasekorea/wordpress-ui@0.1.5
15
+ npm install @designbasekorea/wordpress-ui@0.1.6
13
16
  ```
14
17
 
15
- Vanilla/PHP 플러그인은 필요한 화면에서만 다음 자산을 enqueue합니다.
18
+ WordPress 서버가 npm을 실행하는 것은 아닙니다. 설치한 뒤 `dist/`와 `wordpress-ui.php`를 플러그인/테마 vendor에 포함하고, 해당 관리자 화면에만 enqueue합니다.
16
19
 
17
- ```ts
18
- import '@designbasekorea/wordpress-ui/browser';
19
- import '@designbasekorea/wordpress-ui/styles.css';
20
- ```
20
+ ## 화면 구조
21
21
 
22
- React 플러그인은 React를 peer dependency로 유지하며 다음처럼 사용합니다.
22
+ 모든 화면은 `.wrap.designbase-wp-admin` 안에서만 렌더링합니다. 스타일은 root 아래로 scope됩니다.
23
23
 
24
- ```tsx
25
- import '@designbasekorea/wordpress-ui/styles.css';
26
- import {
27
- AdminPage,
28
- AdminPageContent,
29
- AdminPageHeader,
30
- AdminShell,
31
- Button,
32
- SearchBar,
33
- Section,
34
- Table,
35
- } from '@designbasekorea/wordpress-ui/react';
24
+ ```text
25
+ .wrap.designbase-wp-admin
26
+ └─ db-admin-shell title = 플러그인명 (사이드바 로고 슬롯)
27
+ ├─ db-sidebar items = 메뉴 (섹션 제목으로 플러그인명을 넣지 않음)
28
+ └─ main
29
+ ├─ db-page-header 화면 제목·설명·primary action
30
+ └─ db-container shell이 나머지 자식을 자동으로 감쌈
31
+ ├─ db-section
32
+ ├─ db-search-bar / db-select / db-table / db-empty-state …
36
33
  ```
37
34
 
38
- `AdminShell`은 React 화면용 wrapper이고, Vanilla/PHP 화면의 정본은
39
- `<db-admin-shell>` Web Component입니다. `db-admin-shell`은 사이드바, 플러그인명
40
- 브랜드, `db-page-header`, 콘텐츠용 `db-container`, 모바일 메뉴 토글을 하나의 패턴으로
41
- 묶습니다. 직접 자식인 `db-page-header`는 header로 유지하고 나머지 내용은 자동으로
42
- `db-container`에 넣습니다. 기존 화면을 자동 mounting하는 `admin-shell.js` adapter가
43
- 필요한 경우에도 내부적으로 이 Web Component를 사용합니다.
44
- `AdminPageHeader`는 ui-wc
45
- `PageHeader`를 감싸 shell 메뉴 버튼과 actions 슬롯을 연결합니다. 탭, 검색, 테이블,
46
- empty state, 모달 등 나머지 UI는 primitives(`Section`, `SearchBar`, `Table`,
47
- `EmptyState`, `Modal` 등)를 직접 조합합니다.
48
- 데이터 조회·저장·권한 처리는 소비 플러그인이 소유합니다.
35
+ 플러그인명은 사이드바 **헤더 로고**입니다. `title`/`brand`(vanilla) 또는 `sidebarTitle`(React)로 넣습니다. 메뉴 작은 섹션 라벨로 쓰지 않습니다.
49
36
 
50
- Vanilla/PHP 화면에서는 등록된 ui-wc element를 직접 사용할 수도 있습니다.
37
+ ## Vanilla / PHP (권장)
51
38
 
52
- ```html
39
+ 필요한 화면에만 `dist/styles.css`와 `dist/browser.iife.js`를 enqueue합니다.
40
+
41
+ ```php
42
+ require_once __DIR__ . '/vendor/wordpress-ui/wordpress-ui.php';
43
+
44
+ add_action('admin_enqueue_scripts', static function (string $hook_suffix): void {
45
+ if ($hook_suffix !== 'toplevel_page_myplugin') {
46
+ return;
47
+ }
48
+
49
+ designbase_wordpress_ui_enqueue([
50
+ 'handle' => 'myplugin-wordpress-ui',
51
+ 'base_url' => plugins_url('vendor/wordpress-ui', __FILE__),
52
+ 'base_path' => __DIR__ . '/vendor/wordpress-ui',
53
+ 'version' => '0.1.6',
54
+ ]);
55
+ });
56
+ ```
57
+
58
+ ```php
59
+ <?php
60
+ $items = [
61
+ [
62
+ 'id' => 'dashboard',
63
+ 'label' => __('대시보드', 'myplugin'),
64
+ 'href' => admin_url('admin.php?page=myplugin'),
65
+ 'icon' => 'dashboard',
66
+ 'active' => (($_GET['page'] ?? '') === 'myplugin'),
67
+ ],
68
+ [
69
+ 'id' => 'settings',
70
+ 'label' => __('설정', 'myplugin'),
71
+ 'href' => admin_url('admin.php?page=myplugin-settings'),
72
+ 'icon' => 'settings',
73
+ 'active' => (($_GET['page'] ?? '') === 'myplugin-settings'),
74
+ ],
75
+ ];
76
+ ?>
53
77
  <div class="wrap designbase-wp-admin">
54
78
  <db-admin-shell
55
79
  title="My Plugin"
56
- sections='[{"id":"main","title":"My Plugin","items":[{"id":"dashboard","label":"대시보드","href":"?page=my-plugin","icon":"dashboard","active":true},{"id":"settings","label":"설정","href":"?page=my-plugin-settings","icon":"settings"}]}]'
80
+ items="<?php echo esc_attr(wp_json_encode($items)); ?>"
57
81
  >
58
- <db-page-header title="페이지 목록" description="페이지를 관리하세요." variant="minimal">
59
- <a slot="actions" class="button button-primary" href="?page=my-pages">새 페이지</a>
82
+ <db-page-header
83
+ title="<?php esc_attr_e('페이지 목록', 'myplugin'); ?>"
84
+ description="<?php esc_attr_e('페이지를 관리하세요.', 'myplugin'); ?>"
85
+ variant="minimal"
86
+ >
87
+ <a slot="actions" class="button button-primary" href="<?php echo esc_url(admin_url('admin.php?page=myplugin-new')); ?>">
88
+ <?php esc_html_e('새 페이지', 'myplugin'); ?>
89
+ </a>
60
90
  </db-page-header>
61
- <db-section title="최근 페이지">
62
- <!-- 페이지 콘텐츠 -->
91
+
92
+ <db-section title="<?php esc_attr_e('최근 페이지', 'myplugin'); ?>">
93
+ <db-table
94
+ columns='<?php echo esc_attr(wp_json_encode([
95
+ ['key' => 'title', 'header' => __('제목', 'myplugin')],
96
+ ['key' => 'status', 'header' => __('상태', 'myplugin')],
97
+ ])); ?>'
98
+ data='<?php echo esc_attr(wp_json_encode($rows ?? [])); ?>'
99
+ row-key="id"
100
+ ></db-table>
63
101
  </db-section>
64
102
  </db-admin-shell>
65
103
  </div>
66
104
  ```
67
105
 
68
- ## 엔트리포인트
106
+ `db-admin-shell` 계약:
69
107
 
70
- - `browser`: React 없이 ui-wc primitives와 `db-admin-shell`을 등록합니다.
71
- - `components`: `ui-wc` Web Component 클래스와 등록 allowlist를 `wordpress-ui`의 public API로 제공합니다.
72
- - `primitives`: `components`와 같은 vanilla API의 별칭입니다.
73
- - `react`: ui-wc primitives의 React façade와 native-first 관리자 패턴을 제공합니다.
74
- - `styles.css`: `@designbasekorea/theme`의 전체 토큰/시맨틱 변수, ui-wc controls,
75
- shell, overlays, `icons-webfont`를 scoped로 포함한 기본 스타일입니다. 소비자는 별도의
76
- `theme.css`나 아이콘 폰트를 추가로 enqueue할 필요가 없습니다.
77
- - `styles/controls.css`, `styles/shell.css`, `styles/overlays.css`: 선택 로딩용 스타일입니다.
108
+ | 속성 | 역할 |
109
+ | --- | --- |
110
+ | `title` 또는 `brand` | 사이드바 헤더의 플러그인명 |
111
+ | `items` | 메뉴 배열 JSON. 권한·active·href는 소비자가 계산 |
112
+ | `sections` | 메뉴를 **실제 그룹**으로 나눌 때만 사용. 그룹 제목에 플러그인명을 넣지 않음 |
113
+ | 자식 `db-page-header` | 화면 헤더로 유지 |
114
+ | 나머지 자식 | `db-container`로 감쌈 |
78
115
 
79
- 관리자 패턴에서 아이콘이 필요한 경우 Designbase 아이콘 이름을 사용합니다. 아이콘 폰트도
80
- 기본 스타일에 포함되므로 React 없이 PHP/HTML에서 사용할 수 있습니다.
116
+ 메뉴를 그룹으로 나눌 필요가 없으면 `items`만 넘기세요.
81
117
 
82
- ```html
83
- <i class="icon-dashboard" aria-hidden="true"></i>
84
- <i class="icon-search" aria-hidden="true"></i>
85
- <i class="icon-settings" aria-hidden="true"></i>
86
- ```
87
-
88
- ### ui-wc primitives
118
+ ## React (선택)
89
119
 
90
- PHP/vanilla 화면은 `browser` 자산을 enqueue한 `db-*` element사용합니다.
91
- TypeScript로 Web Component 클래스를 직접 조합하는 경우에도 `ui-wc`를 직접 import하지
92
- 말고 `wordpress-ui`의 `components` entry를 사용합니다.
120
+ Gutenberg나 기존 React 앱에서만 사용합니다. 일반 PHP 관리자 화면에는 vanilla권장합니다.
93
121
 
94
- ```ts
95
- import '@designbasekorea/wordpress-ui/browser';
122
+ ```tsx
96
123
  import '@designbasekorea/wordpress-ui/styles.css';
97
124
  import {
98
- DbButton,
99
- DbInput,
100
- DbSelect,
101
- DbModal,
102
- DbContainer,
103
- DbAdminShell,
104
- } from '@designbasekorea/wordpress-ui/components';
105
-
106
- // PHP/HTML에서는 <db-button>, <db-input>, <db-select>, <db-modal>로 사용합니다.
107
- void DbButton;
108
- void DbInput;
109
- void DbSelect;
110
- void DbModal;
111
- void DbContainer;
112
- void DbAdminShell;
113
- ```
114
-
115
- 동일한 named export는 패키지 루트에서도 사용할 수 있습니다. 기존 `figma-ui`처럼
116
- 짧은 import를 선호하는 TypeScript 소비자는 다음 형태를 사용해도 됩니다.
125
+ AdminPage,
126
+ AdminPageContent,
127
+ AdminPageHeader,
128
+ AdminShell,
129
+ Button,
130
+ Section,
131
+ Table,
132
+ } from '@designbasekorea/wordpress-ui/react';
117
133
 
118
- ```ts
119
- import { DbButton, DbInput, DbSelect, DbModal } from '@designbasekorea/wordpress-ui';
134
+ const sidebarItems = [
135
+ { id: 'dashboard', label: '대시보드', href: '?page=myplugin', icon: 'dashboard', active: true },
136
+ { id: 'settings', label: '설정', href: '?page=myplugin-settings', icon: 'settings' },
137
+ ];
138
+
139
+ export function MyPluginAdmin() {
140
+ return (
141
+ <AdminShell sidebarTitle="My Plugin" sidebarItems={sidebarItems}>
142
+ <AdminPageHeader
143
+ title="페이지 목록"
144
+ description="페이지를 검색하고 상태를 관리합니다."
145
+ actions={<Button variant="primary" size="s">새 페이지</Button>}
146
+ />
147
+ <AdminPage>
148
+ <AdminPageContent>
149
+ <Section title="최근 페이지" fullWidth>
150
+ <Table
151
+ columns={JSON.stringify([
152
+ { key: 'title', header: '제목' },
153
+ { key: 'status', header: '상태' },
154
+ ])}
155
+ data={JSON.stringify([])}
156
+ rowKey="id"
157
+ emptyMessage="콘텐츠가 없습니다."
158
+ />
159
+ </Section>
160
+ </AdminPageContent>
161
+ </AdminPage>
162
+ </AdminShell>
163
+ );
164
+ }
120
165
  ```
121
166
 
122
- 경로 모두 같은 `ui-wc` 클래스와 등록 계약을 가리킵니다. HTML/PHP 소비자는
123
- `browser`를 enqueue한 뒤 `<db-button>`, `<db-input>`, `<db-select>`, `<db-modal>`처럼
124
- 태그를 사용합니다.
125
-
126
- React 화면은 같은 ui-wc element를 React façade로 사용합니다.
167
+ React 관리자 패턴:
127
168
 
128
- ```tsx
129
- import { Button, Input, Select, Modal } from '@designbasekorea/wordpress-ui/react';
130
- ```
169
+ - `AdminShell` — `sidebarTitle`(로고) + `sidebarItems`(메뉴). `AdminWrapper`를 포함합니다.
170
+ - `AdminPageHeader` `db-page-header` + 모바일 메뉴 버튼
171
+ - `AdminPage` / `AdminPageContent` — 페이지 폭
172
+ - 그 외 UI는 primitives입니다. `Section`, `Table`, `SearchBar`, `Select`, `EmptyState`, `Tabs`, `Modal` 등. `AdminSection` / `AdminDataTable` 같은 별도 래퍼는 없습니다.
131
173
 
132
- 로컬 검증은 `npm run build`, `npm run verify`, `npm run audit:axe` 순서로 실행합니다.
133
- `audit:axe`는 Chromium이 설치된 환경에서 vanilla 예제의 실제 DOM을 검사합니다.
174
+ ## 엔트리포인트
134
175
 
135
- 컴포넌트 미리보기는 Storybook으로 확인할 수 있습니다.
176
+ | import | 용도 |
177
+ | --- | --- |
178
+ | `@designbasekorea/wordpress-ui/browser` | React 없이 `db-*`와 `db-admin-shell` 등록. PHP는 `dist/browser.iife.js` |
179
+ | `@designbasekorea/wordpress-ui/styles.css` | 테마 토큰 + ui-wc + shell + 아이콘 폰트. 별도 `theme.css`/CDN 아이콘 불필요 |
180
+ | `@designbasekorea/wordpress-ui/components` 또는 패키지 루트 | TypeScript에서 `DbButton`, `DbAdminShell` 등 클래스 |
181
+ | `@designbasekorea/wordpress-ui/react` | React façade |
136
182
 
137
- ```bash
138
- cd packages/wordpress-ui
139
- npm run storybook
183
+ ```ts
184
+ import '@designbasekorea/wordpress-ui/browser';
185
+ import '@designbasekorea/wordpress-ui/styles.css';
186
+ import { DbButton, DbAdminShell } from '@designbasekorea/wordpress-ui';
140
187
  ```
141
188
 
142
- 기본 포트는 `http://localhost:6008` 입니다. (`figma-ui` Storybook은 `:6007`)
143
-
144
- 모든 관리자 패턴과 runtime surface는 `.designbase-wp-admin` 아래에서 동작합니다. 신규
145
- 플러그인과 테마는 이 패키지의 public API만 사용하세요. 기존 UI
146
- 라이브러리의 전역 객체나 호환 계층은 제공하지 않습니다.
147
-
148
- ## WordPress 플러그인·테마 enqueue
149
-
150
- 관리자 화면에서 `admin_enqueue_scripts`와 화면 allowlist는 소비자가 소유합니다.
151
- 패키지의 `wordpress-ui.php`를 include한 뒤 플러그인이나 테마의 vendor 경로를
152
- 전달하면 React 없이 같은 runtime을 사용할 수 있습니다.
153
-
154
- ```php
155
- require_once get_template_directory() . '/vendor/wordpress-ui/wordpress-ui.php';
156
-
157
- add_action('admin_enqueue_scripts', function ($hook_suffix) {
158
- if ($hook_suffix !== 'toplevel_page_my-theme-settings') {
159
- return;
160
- }
189
+ 아이콘은 Designbase 이름을 씁니다.
161
190
 
162
- designbase_wordpress_ui_enqueue([
163
- 'handle' => 'my-theme-wordpress-ui',
164
- 'base_url' => get_template_directory_uri() . '/vendor/wordpress-ui',
165
- 'base_path' => get_template_directory() . '/vendor/wordpress-ui',
166
- ]);
167
- });
191
+ ```html
192
+ <i class="icon-dashboard" aria-hidden="true"></i>
168
193
  ```
169
194
 
170
- ## 상세 적용 가이드
195
+ ## 로컬 확인
171
196
 
172
- 플러그인과 테마 관리자 화면에 적용하는 전체 규칙은 다음 문서를 참고하세요.
197
+ ```bash
198
+ cd packages/wordpress-ui
199
+ npm run build
200
+ npm run verify
201
+ npm run storybook # http://localhost:6008
202
+ ```
173
203
 
174
- - [WordPress 관리자 적용 가이드](./docs/WORDPRESS-ADMIN-GUIDE.md)
204
+ 적용 규칙·enqueue·REST/nonce는 [WordPress 관리자 적용 가이드](./docs/WORDPRESS-ADMIN-GUIDE.md)를 참고하세요.