@designbasekorea/wordpress-ui 0.1.2 → 0.1.4

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.
@@ -2,6 +2,10 @@
2
2
 
3
3
  이 문서는 `@designbasekorea/wordpress-ui`를 WordPress 플러그인과 테마의 관리자 화면에 적용하는 표준 가이드입니다.
4
4
 
5
+ 이 가이드의 기준 배포 버전은 `0.1.4`입니다. 플러그인 또는 테마의 lockfile과
6
+ vendor 산출물도 같은 버전으로 맞추고, 버전을 올릴 때마다 아래 검증 명령을 다시
7
+ 실행합니다.
8
+
5
9
  이 패키지는 `@designbasekorea/ui-wc`를 내부 구현으로 사용하지만, 소비자는 `ui-wc`를 직접 import하지 않습니다. 소비자 코드는 항상 `wordpress-ui`의 공개 진입점과 배포된 자산만 사용합니다.
6
10
 
7
11
  현재 패키지는 다음 원칙을 따릅니다.
@@ -58,7 +62,7 @@ WordPress plugin/theme
58
62
  ### 2.1 Node 프로젝트에 설치
59
63
 
60
64
  ```bash
61
- npm install @designbasekorea/wordpress-ui
65
+ npm install @designbasekorea/wordpress-ui@0.1.4
62
66
  ```
63
67
 
64
68
  WordPress 서버가 npm을 실행하는 것이 아닙니다. 라이브러리를 설치한 뒤 플러그인 또는 테마 빌드 과정에서 배포에 필요한 파일을 포함해야 합니다.
@@ -139,7 +143,7 @@ require_once __DIR__ . '/vendor/wordpress-ui/wordpress-ui.php';
139
143
 
140
144
  final class MyPlugin_Admin_Assets
141
145
  {
142
- private const UI_VERSION = '0.1.0';
146
+ private const UI_VERSION = '0.1.4';
143
147
 
144
148
  public static function init(): void
145
149
  {
@@ -262,58 +266,99 @@ WordPress 플러그인과 테마의 기본 선택지는 vanilla/PHP입니다. Re
262
266
 
263
267
  ### 4.1 페이지 기본 구조
264
268
 
269
+ PHP 템플릿은 `.designbase-wp-admin` root와 `db-page-header`만 선언하고, 화면별
270
+ AssetsManager가 `wordpress-ui` runtime과 shell adapter를 enqueue하는 방식을 권장합니다.
271
+ adapter는 `ui-wc`의 실제 `db-sidebar`를 생성하고, 설정의 `title`을 사이드바 상단
272
+ 플러그인명으로 표시합니다. `db-page-header`를 제외한 root children은 자동으로
273
+ `<db-container size="full" padding="l" full-width>` 안에 배치됩니다.
274
+
275
+ `sections`/`items`는 PHP에서 `wp_json_encode()`로 전달하고, 링크·권한·활성 상태는
276
+ 소비 플러그인이나 테마가 관리합니다. adapter를 사용하지 않는 수동 구성에서는 아래처럼
277
+ `db-sidebar`와 `db-container`를 직접 선언할 수 있습니다.
278
+
265
279
  ```php
280
+ <?php
281
+ $sidebar_items = [
282
+ [
283
+ 'id' => 'dashboard',
284
+ 'label' => __('대시보드', 'myplugin'),
285
+ 'href' => admin_url('admin.php?page=myplugin'),
286
+ 'icon' => 'doughnut-chart',
287
+ 'active' => (($_GET['page'] ?? '') === 'myplugin'),
288
+ ],
289
+ [
290
+ 'id' => 'settings',
291
+ 'label' => __('설정', 'myplugin'),
292
+ 'href' => admin_url('admin.php?page=myplugin-settings'),
293
+ 'icon' => 'settings',
294
+ 'active' => (($_GET['page'] ?? '') === 'myplugin-settings'),
295
+ ],
296
+ ];
297
+ ?>
266
298
  <div class="wrap designbase-wp-admin myplugin-admin">
267
- <div class="dbwp-admin-shell dbwp-admin-shell--has-sidebar">
268
- <aside class="dbwp-admin-shell__sidebar" aria-label="My Plugin 메뉴">
269
- <div class="dbwp-admin-sidebar">
270
- <div class="dbwp-admin-sidebar__title">My Plugin</div>
271
- <nav class="dbwp-admin-sidebar__nav">
272
- <a class="dbwp-admin-sidebar__link is-active"
273
- href="<?php echo esc_url(admin_url('admin.php?page=myplugin')); ?>"
274
- aria-current="page">
275
- <i class="dbwp-admin-icon icon-dashboard" aria-hidden="true"></i>
276
- <span class="dbwp-admin-sidebar__label">대시보드</span>
277
- </a>
278
- <a class="dbwp-admin-sidebar__link"
279
- href="<?php echo esc_url(admin_url('admin.php?page=myplugin-settings')); ?>">
280
- <i class="dbwp-admin-icon icon-settings" aria-hidden="true"></i>
281
- <span class="dbwp-admin-sidebar__label">설정</span>
282
- </a>
283
- </nav>
299
+ <div class="designbase-wp-admin__shell designbase-wp-admin__shell--has-sidebar">
300
+ <aside class="designbase-wp-admin__shell-sidebar" aria-label="<?php esc_attr_e('My Plugin 메뉴', 'myplugin'); ?>">
301
+ <div class="designbase-wp-admin__shell-brand">
302
+ <db-logo type="custom" text="My Plugin" size="s"></db-logo>
284
303
  </div>
304
+ <db-sidebar
305
+ size="m"
306
+ show-logo="false"
307
+ collapsible="false"
308
+ full-height
309
+ sections='<?php echo esc_attr(wp_json_encode([[
310
+ 'id' => 'main',
311
+ 'title' => 'My Plugin',
312
+ 'items' => $sidebar_items,
313
+ ]])); ?>'>
314
+ </db-sidebar>
285
315
  </aside>
286
316
 
287
- <main class="dbwp-admin-shell__main" id="main-content">
288
- <header class="dbwp-admin-page-header">
289
- <div class="dbwp-admin-page-header__heading">
290
- <i class="dbwp-admin-icon icon-dashboard" aria-hidden="true"></i>
291
- <div>
292
- <h1 class="dbwp-admin-page-header__title">대시보드</h1>
293
- <p class="dbwp-admin-page-header__description">플러그인 상태와 최근 작업을 확인합니다.</p>
294
- </div>
295
- </div>
296
- <div class="dbwp-admin-page-header__actions">
317
+ <main class="designbase-wp-admin__shell-main" id="main-content">
318
+ <db-page-header
319
+ title="<?php esc_attr_e('대시보드', 'myplugin'); ?>"
320
+ description="<?php esc_attr_e('플러그인 상태와 최근 작업을 확인합니다.', 'myplugin'); ?>"
321
+ variant="minimal"
322
+ align="left">
323
+ <div slot="actions">
297
324
  <a class="button button-secondary" href="<?php echo esc_url(admin_url('admin.php?page=myplugin-settings')); ?>">
298
- 설정
325
+ <?php esc_html_e('설정', 'myplugin'); ?>
299
326
  </a>
300
327
  </div>
301
- </header>
328
+ </db-page-header>
302
329
 
303
- <div class="dbwp-admin-page-content">
304
- <!-- tabs, filter, section, table 등을 배치한다. -->
305
- </div>
330
+ <db-container size="full" padding="l" full-width>
331
+ <!-- db-tabs, db-section, db-table 등을 배치한다. -->
332
+ </db-container>
306
333
  </main>
307
334
  </div>
308
335
  </div>
309
336
  ```
310
337
 
338
+ 기존 화면을 일괄 재작성하기 어려운 경우에는 동일한 `.designbase-wp-admin` root와
339
+ `db-page-header`를 유지하고, 소비 플러그인의 작은 vanilla adapter에서 root children을
340
+ `designbase-wp-admin__shell`로 감싼 뒤 `db-sidebar`를 생성해도 됩니다. 이 adapter는
341
+ 패키지의 Web Component runtime을 대체하지 않으며, 화면별 메뉴 설정만 담당합니다.
342
+
311
343
  컴포넌트 스타일을 사용하는 자체 markup은 `.designbase-wp-admin` 내부에 둡니다. 단순한 링크와 form submit은 WordPress의 native `<a>`와 `<button>`을 우선 사용하고, 복합 동작이 필요한 경우에만 Web Component를 사용합니다.
312
344
 
313
345
  ### 4.2 ui-wc 기본 컴포넌트 사용
314
346
 
315
347
  `browser` entry를 로드하면 `wordpress-ui`가 관리자 화면에 필요한 ui-wc element를 등록합니다.
316
348
 
349
+ TypeScript 번들에서 Web Component 클래스를 직접 참조해야 할 때는 `ui-wc`가 아니라
350
+ `@designbasekorea/wordpress-ui/components`를 import합니다. 이 entry가 `wordpress-ui`의
351
+ 등록 allowlist와 같은 컴포넌트 집합을 사용하므로, 소비 플러그인과 테마가 ui-wc의 내부
352
+ 경로·등록 정책·아이콘 경로에 결합되지 않습니다.
353
+
354
+ 짧은 import를 선호하면 동일한 named export를 패키지 루트에서 가져올 수도 있습니다.
355
+ `components`와 루트는 같은 Web Component 클래스를 가리키며, HTML/PHP 화면은 여전히
356
+ `browser` entry로 등록 runtime을 enqueue해야 합니다.
357
+
358
+ ```ts
359
+ import { DbButton, DbInput, DbSelect, DbModal } from '@designbasekorea/wordpress-ui';
360
+ ```
361
+
317
362
  ```html
318
363
  <form class="myplugin-filter-form" data-myplugin-filter-form>
319
364
  <db-search-bar
@@ -394,7 +439,7 @@ select?.addEventListener('db-change', (event) => {
394
439
  React는 선택 사항입니다. Gutenberg나 기존 React 앱과 연결해야 하는 화면에서만 사용하고, 일반적인 PHP admin page에는 vanilla entry를 권장합니다.
395
440
 
396
441
  ```bash
397
- npm install @designbasekorea/wordpress-ui react react-dom
442
+ npm install @designbasekorea/wordpress-ui@0.1.4 react react-dom
398
443
  ```
399
444
 
400
445
  ```tsx
@@ -866,13 +911,15 @@ import '@designbasekorea/wordpress-ui/styles.css';
866
911
 
867
912
  // React 화면에서만 허용
868
913
  import { AdminShell, AdminDataTable } from '@designbasekorea/wordpress-ui/react';
914
+ import { DbButton, DbInput, DbSelect, DbModal } from '@designbasekorea/wordpress-ui/components';
915
+ // 또는: import { DbButton, DbInput, DbSelect, DbModal } from '@designbasekorea/wordpress-ui';
869
916
 
870
- // 금지: 소비 플러그인/테마에서 직접 import하지 않는다.
871
- import '@designbasekorea/ui-wc';
872
- import { DbButton } from '@designbasekorea/ui-wc/components/db-button';
917
+ // 금지: 소비 플러그인/테마에서 @designbasekorea/ui-wc 내부 경로를 직접 import하지 않는다.
873
918
  ```
874
919
 
875
- 직접 `ui-wc`를 사용하면 관리자용 token scope, 아이콘 경로, 등록 allowlist, CSS 격리 정책이 패키지 밖으로 새어 나갑니다. 공통 요구사항이 생기면 소비자에서 임시로 우회하지 말고 `wordpress-ui`의 공개 API로 승격할지 먼저 검토합니다.
920
+ `wordpress-ui/components`는 내부적으로 `ui-wc`를 사용하지만, 관리자용 token scope, 아이콘
921
+ 경로, 등록 allowlist, CSS 격리 정책은 `wordpress-ui`가 소유합니다. 공통 요구사항이 생기면
922
+ 소비자에서 임시로 우회하지 말고 `wordpress-ui`의 공개 API로 승격할지 먼저 검토합니다.
876
923
 
877
924
  ## 16. 공식 참고 문서
878
925
 
@@ -21,7 +21,7 @@
21
21
  </div>
22
22
  </aside>
23
23
  <main class="designbase-wp-admin__shell-main">
24
- <button
24
+ <button
25
25
  class="designbase-wp-admin__shell-menu-toggle"
26
26
  type="button"
27
27
  data-sidebar-toggle="example-sidebar"
@@ -34,21 +34,16 @@
34
34
  description="REST와 권한 상태는 소비자가 소유하고 UI는 상태만 표현합니다."
35
35
  variant="minimal"
36
36
  >
37
- <button slot="actions" class="button button-primary" type="button">새 페이지</button>
37
+ <db-button slot="actions" variant="primary" size="s" start-icon="plus" type="button">새 페이지</db-button>
38
38
  </db-page-header>
39
39
 
40
40
  <db-alert variant="info" title="wordpress-ui 예제" message="ui-wc primitives와 관리자 패턴은 이 root 안에서만 동작합니다." closable="false"></db-alert>
41
41
 
42
42
  <form class="designbase-wp-admin__filter-bar" role="search">
43
43
  <div class="designbase-wp-admin__filter-bar__fields">
44
- <label>검색 <input class="" type="search" placeholder="페이지 검색"></label>
45
- <label>상태
46
- <select class="">
47
- <option>전체 상태</option>
48
- <option>공개</option>
49
- <option>초안</option>
50
- </select>
51
- </label>
44
+ <db-input type="search" size="s" name="search" placeholder="페이지 검색" aria-label="검색"></db-input>
45
+ <db-select size="s" name="status" aria-label="상태" value="all"
46
+ options='[{"value":"all","label":"전체 상태"},{"value":"published","label":"공개"},{"value":"draft","label":"초안"}]'></db-select>
52
47
  </div>
53
48
  <div class="designbase-wp-admin__filter-bar__actions">
54
49
  <button class="button button-secondary" type="reset">초기화</button>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@designbasekorea/wordpress-ui",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "WordPress 관리자용 Designbase UI primitives와 plugin shell patterns",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -19,6 +19,18 @@
19
19
  "require": "./dist/browser.cjs",
20
20
  "default": "./dist/browser.esm.js"
21
21
  },
22
+ "./components": {
23
+ "types": "./dist/components.d.ts",
24
+ "import": "./dist/components.esm.js",
25
+ "require": "./dist/components.cjs",
26
+ "default": "./dist/components.esm.js"
27
+ },
28
+ "./primitives": {
29
+ "types": "./dist/components.d.ts",
30
+ "import": "./dist/components.esm.js",
31
+ "require": "./dist/components.cjs",
32
+ "default": "./dist/components.esm.js"
33
+ },
22
34
  "./react": {
23
35
  "types": "./dist/react/index.d.ts",
24
36
  "import": "./dist/react/index.esm.js",
@@ -33,7 +45,10 @@
33
45
  },
34
46
  "sideEffects": [
35
47
  "*.css",
48
+ "./dist/components.esm.js",
49
+ "./dist/components.cjs",
36
50
  "./dist/browser.esm.js",
51
+ "./dist/browser.cjs",
37
52
  "./dist/react/index.esm.js"
38
53
  ],
39
54
  "files": [