@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 +158 -128
- package/dist/browser.cjs +1 -1
- package/dist/browser.d.ts +7 -1
- package/dist/browser.esm.js +1 -1
- package/dist/browser.iife.js +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.d.ts +6 -0
- package/dist/components.esm.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.esm.js +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.ts +24 -1
- package/dist/react/index.esm.js +1 -1
- package/dist/styles/controls.css +1 -1
- package/dist/styles/shell.css +1 -1
- package/dist/styles.css +1 -1
- package/docs/WORDPRESS-ADMIN-GUIDE.md +94 -95
- package/examples/vanilla.html +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,174 +1,204 @@
|
|
|
1
1
|
# @designbasekorea/wordpress-ui
|
|
2
2
|
|
|
3
|
-
WordPress
|
|
4
|
-
WordPress
|
|
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
|
-
현재 배포
|
|
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.
|
|
15
|
+
npm install @designbasekorea/wordpress-ui@0.1.6
|
|
13
16
|
```
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
WordPress 서버가 npm을 실행하는 것은 아닙니다. 설치한 뒤 `dist/`와 `wordpress-ui.php`를 플러그인/테마 vendor에 포함하고, 해당 관리자 화면에만 enqueue합니다.
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
import '@designbasekorea/wordpress-ui/browser';
|
|
19
|
-
import '@designbasekorea/wordpress-ui/styles.css';
|
|
20
|
-
```
|
|
20
|
+
## 화면 구조
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
모든 화면은 `.wrap.designbase-wp-admin` 안에서만 렌더링합니다. 스타일은 이 root 아래로 scope됩니다.
|
|
23
23
|
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
`
|
|
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
|
|
37
|
+
## Vanilla / PHP (권장)
|
|
51
38
|
|
|
52
|
-
|
|
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
|
-
|
|
80
|
+
items="<?php echo esc_attr(wp_json_encode($items)); ?>"
|
|
57
81
|
>
|
|
58
|
-
<db-page-header
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
80
|
-
기본 스타일에 포함되므로 React 없이 PHP/HTML에서 사용할 수 있습니다.
|
|
116
|
+
메뉴를 그룹으로 나눌 필요가 없으면 `items`만 넘기세요.
|
|
81
117
|
|
|
82
|
-
|
|
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
|
-
|
|
91
|
-
TypeScript로 Web Component 클래스를 직접 조합하는 경우에도 `ui-wc`를 직접 import하지
|
|
92
|
-
말고 `wordpress-ui`의 `components` entry를 사용합니다.
|
|
120
|
+
Gutenberg나 기존 React 앱에서만 사용합니다. 일반 PHP 관리자 화면에는 vanilla를 권장합니다.
|
|
93
121
|
|
|
94
|
-
```
|
|
95
|
-
import '@designbasekorea/wordpress-ui/browser';
|
|
122
|
+
```tsx
|
|
96
123
|
import '@designbasekorea/wordpress-ui/styles.css';
|
|
97
124
|
import {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
133
|
-
`audit:axe`는 Chromium이 설치된 환경에서 vanilla 예제의 실제 DOM을 검사합니다.
|
|
174
|
+
## 엔트리포인트
|
|
134
175
|
|
|
135
|
-
|
|
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
|
-
```
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
|
|
163
|
-
|
|
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
|
-
|
|
204
|
+
적용 규칙·enqueue·REST/nonce는 [WordPress 관리자 적용 가이드](./docs/WORDPRESS-ADMIN-GUIDE.md)를 참고하세요.
|