@designbasekorea/wordpress-ui 0.1.4 → 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 +161 -121
- package/dist/browser.cjs +1 -1
- package/dist/browser.d.ts +44 -2
- 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 +44 -2
- package/dist/components.esm.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +45 -3
- package/dist/index.esm.js +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.ts +61 -2
- package/dist/react/index.esm.js +1 -1
- package/dist/styles/controls.css +2 -2
- package/dist/styles/overlays.css +1 -1
- package/dist/styles/shell.css +2 -2
- package/dist/styles.css +2 -2
- package/docs/WORDPRESS-ADMIN-GUIDE.md +112 -125
- package/examples/vanilla.html +42 -59
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,25 +1,123 @@
|
|
|
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
|
-
|
|
19
|
-
|
|
20
|
+
## 화면 구조
|
|
21
|
+
|
|
22
|
+
모든 화면은 `.wrap.designbase-wp-admin` 안에서만 렌더링합니다. 스타일은 이 root 아래로 scope됩니다.
|
|
23
|
+
|
|
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 …
|
|
20
33
|
```
|
|
21
34
|
|
|
22
|
-
|
|
35
|
+
플러그인명은 사이드바 **헤더 로고**입니다. `title`/`brand`(vanilla) 또는 `sidebarTitle`(React)로 넣습니다. 메뉴 위 작은 섹션 라벨로 쓰지 않습니다.
|
|
36
|
+
|
|
37
|
+
## Vanilla / PHP (권장)
|
|
38
|
+
|
|
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
|
+
?>
|
|
77
|
+
<div class="wrap designbase-wp-admin">
|
|
78
|
+
<db-admin-shell
|
|
79
|
+
title="My Plugin"
|
|
80
|
+
items="<?php echo esc_attr(wp_json_encode($items)); ?>"
|
|
81
|
+
>
|
|
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>
|
|
90
|
+
</db-page-header>
|
|
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>
|
|
101
|
+
</db-section>
|
|
102
|
+
</db-admin-shell>
|
|
103
|
+
</div>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`db-admin-shell` 계약:
|
|
107
|
+
|
|
108
|
+
| 속성 | 역할 |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| `title` 또는 `brand` | 사이드바 헤더의 플러그인명 |
|
|
111
|
+
| `items` | 메뉴 배열 JSON. 권한·active·href는 소비자가 계산 |
|
|
112
|
+
| `sections` | 메뉴를 **실제 그룹**으로 나눌 때만 사용. 그룹 제목에 플러그인명을 넣지 않음 |
|
|
113
|
+
| 자식 `db-page-header` | 화면 헤더로 유지 |
|
|
114
|
+
| 나머지 자식 | `db-container`로 감쌈 |
|
|
115
|
+
|
|
116
|
+
메뉴를 그룹으로 나눌 필요가 없으면 `items`만 넘기세요.
|
|
117
|
+
|
|
118
|
+
## React (선택)
|
|
119
|
+
|
|
120
|
+
Gutenberg나 기존 React 앱에서만 사용합니다. 일반 PHP 관리자 화면에는 vanilla를 권장합니다.
|
|
23
121
|
|
|
24
122
|
```tsx
|
|
25
123
|
import '@designbasekorea/wordpress-ui/styles.css';
|
|
@@ -29,136 +127,78 @@ import {
|
|
|
29
127
|
AdminPageHeader,
|
|
30
128
|
AdminShell,
|
|
31
129
|
Button,
|
|
32
|
-
SearchBar,
|
|
33
130
|
Section,
|
|
34
131
|
Table,
|
|
35
132
|
} from '@designbasekorea/wordpress-ui/react';
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
`AdminShell`은 레이아웃(shell·사이드바 토글)만 담당합니다. Vanilla/PHP 화면에서
|
|
39
|
-
`admin-shell.js` adapter를 사용하면 `config.title`이 사이드바 상단의 플러그인명으로
|
|
40
|
-
표시되고, `db-page-header`를 제외한 페이지 내용은 `db-container`로 자동 감쌉니다.
|
|
41
|
-
`AdminPageHeader`는 ui-wc
|
|
42
|
-
`PageHeader`를 감싸 shell 메뉴 버튼과 actions 슬롯을 연결합니다. 탭, 검색, 테이블,
|
|
43
|
-
empty state, 모달 등 나머지 UI는 primitives(`Section`, `SearchBar`, `Table`,
|
|
44
|
-
`EmptyState`, `Modal` 등)를 직접 조합합니다.
|
|
45
|
-
데이터 조회·저장·권한 처리는 소비 플러그인이 소유합니다.
|
|
46
133
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
+
}
|
|
58
165
|
```
|
|
59
166
|
|
|
60
|
-
|
|
167
|
+
React 관리자 패턴:
|
|
61
168
|
|
|
62
|
-
- `
|
|
63
|
-
- `
|
|
64
|
-
- `
|
|
65
|
-
-
|
|
66
|
-
- `styles.css`: `@designbasekorea/theme`의 전체 토큰/시맨틱 변수, ui-wc controls,
|
|
67
|
-
shell, overlays, `icons-webfont`를 scoped로 포함한 기본 스타일입니다. 소비자는 별도의
|
|
68
|
-
`theme.css`나 아이콘 폰트를 추가로 enqueue할 필요가 없습니다.
|
|
69
|
-
- `styles/controls.css`, `styles/shell.css`, `styles/overlays.css`: 선택 로딩용 스타일입니다.
|
|
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` 같은 별도 래퍼는 없습니다.
|
|
70
173
|
|
|
71
|
-
|
|
72
|
-
기본 스타일에 포함되므로 React 없이 PHP/HTML에서 사용할 수 있습니다.
|
|
73
|
-
|
|
74
|
-
```html
|
|
75
|
-
<i class="icon-dashboard" aria-hidden="true"></i>
|
|
76
|
-
<i class="icon-search" aria-hidden="true"></i>
|
|
77
|
-
<i class="icon-settings" aria-hidden="true"></i>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### ui-wc primitives
|
|
174
|
+
## 엔트리포인트
|
|
81
175
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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 |
|
|
85
182
|
|
|
86
183
|
```ts
|
|
87
184
|
import '@designbasekorea/wordpress-ui/browser';
|
|
88
185
|
import '@designbasekorea/wordpress-ui/styles.css';
|
|
89
|
-
import {
|
|
90
|
-
DbButton,
|
|
91
|
-
DbInput,
|
|
92
|
-
DbSelect,
|
|
93
|
-
DbModal,
|
|
94
|
-
DbContainer,
|
|
95
|
-
} from '@designbasekorea/wordpress-ui/components';
|
|
96
|
-
|
|
97
|
-
// PHP/HTML에서는 <db-button>, <db-input>, <db-select>, <db-modal>로 사용합니다.
|
|
98
|
-
void DbButton;
|
|
99
|
-
void DbInput;
|
|
100
|
-
void DbSelect;
|
|
101
|
-
void DbModal;
|
|
102
|
-
void DbContainer;
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
동일한 named export는 패키지 루트에서도 사용할 수 있습니다. 기존 `figma-ui`처럼
|
|
106
|
-
짧은 import를 선호하는 TypeScript 소비자는 다음 형태를 사용해도 됩니다.
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
import { DbButton, DbInput, DbSelect, DbModal } from '@designbasekorea/wordpress-ui';
|
|
186
|
+
import { DbButton, DbAdminShell } from '@designbasekorea/wordpress-ui';
|
|
110
187
|
```
|
|
111
188
|
|
|
112
|
-
|
|
113
|
-
`browser`를 enqueue한 뒤 `<db-button>`, `<db-input>`, `<db-select>`, `<db-modal>`처럼
|
|
114
|
-
태그를 사용합니다.
|
|
115
|
-
|
|
116
|
-
React 화면은 같은 ui-wc element를 React façade로 사용합니다.
|
|
189
|
+
아이콘은 Designbase 이름을 씁니다.
|
|
117
190
|
|
|
118
|
-
```
|
|
119
|
-
|
|
191
|
+
```html
|
|
192
|
+
<i class="icon-dashboard" aria-hidden="true"></i>
|
|
120
193
|
```
|
|
121
194
|
|
|
122
|
-
로컬
|
|
123
|
-
`audit:axe`는 Chromium이 설치된 환경에서 vanilla 예제의 실제 DOM을 검사합니다.
|
|
124
|
-
|
|
125
|
-
컴포넌트 미리보기는 Storybook으로 확인할 수 있습니다.
|
|
195
|
+
## 로컬 확인
|
|
126
196
|
|
|
127
197
|
```bash
|
|
128
198
|
cd packages/wordpress-ui
|
|
129
|
-
npm run
|
|
199
|
+
npm run build
|
|
200
|
+
npm run verify
|
|
201
|
+
npm run storybook # http://localhost:6008
|
|
130
202
|
```
|
|
131
203
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
모든 관리자 패턴과 runtime surface는 `.designbase-wp-admin` 아래에서 동작합니다. 신규
|
|
135
|
-
플러그인과 테마는 이 패키지의 public API만 사용하세요. 기존 UI
|
|
136
|
-
라이브러리의 전역 객체나 호환 계층은 제공하지 않습니다.
|
|
137
|
-
|
|
138
|
-
## WordPress 플러그인·테마 enqueue
|
|
139
|
-
|
|
140
|
-
관리자 화면에서 `admin_enqueue_scripts`와 화면 allowlist는 소비자가 소유합니다.
|
|
141
|
-
패키지의 `wordpress-ui.php`를 include한 뒤 플러그인이나 테마의 vendor 경로를
|
|
142
|
-
전달하면 React 없이 같은 runtime을 사용할 수 있습니다.
|
|
143
|
-
|
|
144
|
-
```php
|
|
145
|
-
require_once get_template_directory() . '/vendor/wordpress-ui/wordpress-ui.php';
|
|
146
|
-
|
|
147
|
-
add_action('admin_enqueue_scripts', function ($hook_suffix) {
|
|
148
|
-
if ($hook_suffix !== 'toplevel_page_my-theme-settings') {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
designbase_wordpress_ui_enqueue([
|
|
153
|
-
'handle' => 'my-theme-wordpress-ui',
|
|
154
|
-
'base_url' => get_template_directory_uri() . '/vendor/wordpress-ui',
|
|
155
|
-
'base_path' => get_template_directory() . '/vendor/wordpress-ui',
|
|
156
|
-
]);
|
|
157
|
-
});
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## 상세 적용 가이드
|
|
161
|
-
|
|
162
|
-
플러그인과 테마 관리자 화면에 적용하는 전체 규칙은 다음 문서를 참고하세요.
|
|
163
|
-
|
|
164
|
-
- [WordPress 관리자 적용 가이드](./docs/WORDPRESS-ADMIN-GUIDE.md)
|
|
204
|
+
적용 규칙·enqueue·REST/nonce는 [WordPress 관리자 적용 가이드](./docs/WORDPRESS-ADMIN-GUIDE.md)를 참고하세요.
|