gw-admin 0.1.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.
Files changed (166) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +569 -0
  4. package/dist/account/admin-logout-button.d.ts +21 -0
  5. package/dist/account/admin-logout-button.d.ts.map +1 -0
  6. package/dist/account/admin-logout-button.js +57 -0
  7. package/dist/account/admin-logout-button.js.map +1 -0
  8. package/dist/account/index.d.ts +2 -0
  9. package/dist/account/index.d.ts.map +1 -0
  10. package/dist/account/index.js +3 -0
  11. package/dist/account/index.js.map +1 -0
  12. package/dist/attachments/admin-attachment-list.d.ts +12 -0
  13. package/dist/attachments/admin-attachment-list.d.ts.map +1 -0
  14. package/dist/attachments/admin-attachment-list.js +11 -0
  15. package/dist/attachments/admin-attachment-list.js.map +1 -0
  16. package/dist/attachments/admin-file-attachments.d.ts +33 -0
  17. package/dist/attachments/admin-file-attachments.d.ts.map +1 -0
  18. package/dist/attachments/admin-file-attachments.js +94 -0
  19. package/dist/attachments/admin-file-attachments.js.map +1 -0
  20. package/dist/attachments/index.d.ts +4 -0
  21. package/dist/attachments/index.d.ts.map +1 -0
  22. package/dist/attachments/index.js +3 -0
  23. package/dist/attachments/index.js.map +1 -0
  24. package/dist/attachments/types.d.ts +12 -0
  25. package/dist/attachments/types.d.ts.map +1 -0
  26. package/dist/attachments/types.js +2 -0
  27. package/dist/attachments/types.js.map +1 -0
  28. package/dist/crud/form/admin-crud-form.d.ts +41 -0
  29. package/dist/crud/form/admin-crud-form.d.ts.map +1 -0
  30. package/dist/crud/form/admin-crud-form.js +56 -0
  31. package/dist/crud/form/admin-crud-form.js.map +1 -0
  32. package/dist/crud/form/form-state.d.ts +12 -0
  33. package/dist/crud/form/form-state.d.ts.map +1 -0
  34. package/dist/crud/form/form-state.js +48 -0
  35. package/dist/crud/form/form-state.js.map +1 -0
  36. package/dist/crud/form/index.d.ts +3 -0
  37. package/dist/crud/form/index.d.ts.map +1 -0
  38. package/dist/crud/form/index.js +3 -0
  39. package/dist/crud/form/index.js.map +1 -0
  40. package/dist/crud/index.d.ts +3 -0
  41. package/dist/crud/index.d.ts.map +1 -0
  42. package/dist/crud/index.js +3 -0
  43. package/dist/crud/index.js.map +1 -0
  44. package/dist/crud/pages/admin-crud-detail-page.d.ts +33 -0
  45. package/dist/crud/pages/admin-crud-detail-page.d.ts.map +1 -0
  46. package/dist/crud/pages/admin-crud-detail-page.js +39 -0
  47. package/dist/crud/pages/admin-crud-detail-page.js.map +1 -0
  48. package/dist/crud/pages/admin-crud-form-pages.d.ts +27 -0
  49. package/dist/crud/pages/admin-crud-form-pages.d.ts.map +1 -0
  50. package/dist/crud/pages/admin-crud-form-pages.js +44 -0
  51. package/dist/crud/pages/admin-crud-form-pages.js.map +1 -0
  52. package/dist/crud/pages/admin-crud-list-page.d.ts +27 -0
  53. package/dist/crud/pages/admin-crud-list-page.d.ts.map +1 -0
  54. package/dist/crud/pages/admin-crud-list-page.js +33 -0
  55. package/dist/crud/pages/admin-crud-list-page.js.map +1 -0
  56. package/dist/crud/pages/admin-delete-form.d.ts +12 -0
  57. package/dist/crud/pages/admin-delete-form.d.ts.map +1 -0
  58. package/dist/crud/pages/admin-delete-form.js +15 -0
  59. package/dist/crud/pages/admin-delete-form.js.map +1 -0
  60. package/dist/crud/pages/format-admin-value.d.ts +5 -0
  61. package/dist/crud/pages/format-admin-value.d.ts.map +1 -0
  62. package/dist/crud/pages/format-admin-value.js +38 -0
  63. package/dist/crud/pages/format-admin-value.js.map +1 -0
  64. package/dist/crud/pages/index.d.ts +6 -0
  65. package/dist/crud/pages/index.d.ts.map +1 -0
  66. package/dist/crud/pages/index.js +6 -0
  67. package/dist/crud/pages/index.js.map +1 -0
  68. package/dist/crud/preset/client.d.ts +2 -0
  69. package/dist/crud/preset/client.d.ts.map +1 -0
  70. package/dist/crud/preset/client.js +3 -0
  71. package/dist/crud/preset/client.js.map +1 -0
  72. package/dist/crud/preset/create-admin-crud-form.d.ts +41 -0
  73. package/dist/crud/preset/create-admin-crud-form.d.ts.map +1 -0
  74. package/dist/crud/preset/create-admin-crud-form.js +68 -0
  75. package/dist/crud/preset/create-admin-crud-form.js.map +1 -0
  76. package/dist/crud/preset/create-admin-crud-pages.d.ts +29 -0
  77. package/dist/crud/preset/create-admin-crud-pages.d.ts.map +1 -0
  78. package/dist/crud/preset/create-admin-crud-pages.js +46 -0
  79. package/dist/crud/preset/create-admin-crud-pages.js.map +1 -0
  80. package/dist/crud/preset/create-admin-crud-route-page.d.ts +18 -0
  81. package/dist/crud/preset/create-admin-crud-route-page.d.ts.map +1 -0
  82. package/dist/crud/preset/create-admin-crud-route-page.js +26 -0
  83. package/dist/crud/preset/create-admin-crud-route-page.js.map +1 -0
  84. package/dist/crud/preset/index.d.ts +3 -0
  85. package/dist/crud/preset/index.d.ts.map +1 -0
  86. package/dist/crud/preset/index.js +3 -0
  87. package/dist/crud/preset/index.js.map +1 -0
  88. package/dist/header/admin-page-header.d.ts +15 -0
  89. package/dist/header/admin-page-header.d.ts.map +1 -0
  90. package/dist/header/admin-page-header.js +10 -0
  91. package/dist/header/admin-page-header.js.map +1 -0
  92. package/dist/header/index.d.ts +2 -0
  93. package/dist/header/index.d.ts.map +1 -0
  94. package/dist/header/index.js +2 -0
  95. package/dist/header/index.js.map +1 -0
  96. package/dist/index.d.ts +7 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +7 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/internal/class-names.d.ts +5 -0
  101. package/dist/internal/class-names.d.ts.map +1 -0
  102. package/dist/internal/class-names.js +7 -0
  103. package/dist/internal/class-names.js.map +1 -0
  104. package/dist/layout/admin-layout.d.ts +16 -0
  105. package/dist/layout/admin-layout.d.ts.map +1 -0
  106. package/dist/layout/admin-layout.js +17 -0
  107. package/dist/layout/admin-layout.js.map +1 -0
  108. package/dist/layout/admin-shell.d.ts +12 -0
  109. package/dist/layout/admin-shell.d.ts.map +1 -0
  110. package/dist/layout/admin-shell.js +10 -0
  111. package/dist/layout/admin-shell.js.map +1 -0
  112. package/dist/layout/admin-sidebar.d.ts +11 -0
  113. package/dist/layout/admin-sidebar.d.ts.map +1 -0
  114. package/dist/layout/admin-sidebar.js +10 -0
  115. package/dist/layout/admin-sidebar.js.map +1 -0
  116. package/dist/layout/index.d.ts +4 -0
  117. package/dist/layout/index.d.ts.map +1 -0
  118. package/dist/layout/index.js +4 -0
  119. package/dist/layout/index.js.map +1 -0
  120. package/dist/layout/mobile.d.ts +15 -0
  121. package/dist/layout/mobile.d.ts.map +1 -0
  122. package/dist/layout/mobile.js +32 -0
  123. package/dist/layout/mobile.js.map +1 -0
  124. package/dist/navigation/admin-navigation.d.ts +21 -0
  125. package/dist/navigation/admin-navigation.d.ts.map +1 -0
  126. package/dist/navigation/admin-navigation.js +22 -0
  127. package/dist/navigation/admin-navigation.js.map +1 -0
  128. package/dist/navigation/index.d.ts +2 -0
  129. package/dist/navigation/index.d.ts.map +1 -0
  130. package/dist/navigation/index.js +2 -0
  131. package/dist/navigation/index.js.map +1 -0
  132. package/dist/pages/admin-account-page.d.ts +13 -0
  133. package/dist/pages/admin-account-page.d.ts.map +1 -0
  134. package/dist/pages/admin-account-page.js +11 -0
  135. package/dist/pages/admin-account-page.js.map +1 -0
  136. package/dist/pages/admin-dashboard-page.d.ts +15 -0
  137. package/dist/pages/admin-dashboard-page.d.ts.map +1 -0
  138. package/dist/pages/admin-dashboard-page.js +8 -0
  139. package/dist/pages/admin-dashboard-page.js.map +1 -0
  140. package/dist/pages/index.d.ts +3 -0
  141. package/dist/pages/index.d.ts.map +1 -0
  142. package/dist/pages/index.js +3 -0
  143. package/dist/pages/index.js.map +1 -0
  144. package/dist/rich-text/admin-rich-text-editor.d.ts +27 -0
  145. package/dist/rich-text/admin-rich-text-editor.d.ts.map +1 -0
  146. package/dist/rich-text/admin-rich-text-editor.js +102 -0
  147. package/dist/rich-text/admin-rich-text-editor.js.map +1 -0
  148. package/dist/rich-text/admin-rich-text-file.d.ts +24 -0
  149. package/dist/rich-text/admin-rich-text-file.d.ts.map +1 -0
  150. package/dist/rich-text/admin-rich-text-file.js +80 -0
  151. package/dist/rich-text/admin-rich-text-file.js.map +1 -0
  152. package/dist/rich-text/admin-rich-text-view.d.ts +9 -0
  153. package/dist/rich-text/admin-rich-text-view.d.ts.map +1 -0
  154. package/dist/rich-text/admin-rich-text-view.js +9 -0
  155. package/dist/rich-text/admin-rich-text-view.js.map +1 -0
  156. package/dist/rich-text/index.d.ts +5 -0
  157. package/dist/rich-text/index.d.ts.map +1 -0
  158. package/dist/rich-text/index.js +5 -0
  159. package/dist/rich-text/index.js.map +1 -0
  160. package/dist/rich-text/plain-text.d.ts +9 -0
  161. package/dist/rich-text/plain-text.d.ts.map +1 -0
  162. package/dist/rich-text/plain-text.js +24 -0
  163. package/dist/rich-text/plain-text.js.map +1 -0
  164. package/package.json +163 -0
  165. package/rich-text.css +1 -0
  166. package/styles.css +901 -0
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { notFound } from "next/navigation";
3
+ import { AdminCrudForm, } from "../form/admin-crud-form.js";
4
+ async function renderCrudForm(props, renderForm) {
5
+ return renderForm ? renderForm(props) : _jsx(AdminCrudForm, { ...props });
6
+ }
7
+ /**
8
+ * Loads a create model and delegates the actual form to an optional
9
+ * resource-specific renderer.
10
+ */
11
+ export async function AdminCrudCreatePage({ resource, action, title = "새 글 등록", initialValues = {}, renderForm, }) {
12
+ const model = await resource.getCreateForm();
13
+ return (_jsx("main", { className: "gw-admin-page gw-admin-page--form", children: await renderCrudForm({
14
+ title,
15
+ breadcrumbs: [{ label: resource.label, href: model.basePath }],
16
+ model,
17
+ action,
18
+ initialValues,
19
+ }, renderForm) }));
20
+ }
21
+ /**
22
+ * Loads an update model and delegates the actual form to an optional
23
+ * resource-specific renderer.
24
+ */
25
+ export async function AdminCrudUpdatePage({ resource, id, action, title = "내용 수정", initialValues = {}, renderForm, }) {
26
+ const model = await resource.getUpdateForm(id);
27
+ if (!model) {
28
+ notFound();
29
+ }
30
+ return (_jsx("main", { className: "gw-admin-page gw-admin-page--form", children: await renderCrudForm({
31
+ title,
32
+ breadcrumbs: [
33
+ { label: resource.label, href: model.basePath },
34
+ {
35
+ label: "상세 보기",
36
+ href: `${model.basePath}/${encodeURIComponent(String(id))}`,
37
+ },
38
+ ],
39
+ model: model,
40
+ action,
41
+ initialValues,
42
+ }, renderForm) }));
43
+ }
44
+ //# sourceMappingURL=admin-crud-form-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-crud-form-pages.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-form-pages.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAO3C,OAAO,EACL,aAAa,GAEd,MAAM,4BAA4B,CAAC;AAwBpC,KAAK,UAAU,cAAc,CAC3B,KAAmC,EACnC,UAA6C;IAE7C,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAC,aAAa,OAAK,KAAK,GAAI,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,QAAQ,EACR,MAAM,EACN,KAAK,GAAG,QAAQ,EAChB,aAAa,GAAG,EAAE,EAClB,UAAU,GACiB;IAC3B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAE7C,OAAO,CACL,eAAM,SAAS,EAAC,mCAAmC,YAChD,MAAM,cAAc,CACnB;YACE,KAAK;YACL,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9D,KAAK;YACL,MAAM;YACN,aAAa;SACd,EACD,UAAU,CACX,GACI,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,QAAQ,EACR,EAAE,EACF,MAAM,EACN,KAAK,GAAG,OAAO,EACf,aAAa,GAAG,EAAE,EAClB,UAAU,GACiB;IAC3B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,OAAO,CACL,eAAM,SAAS,EAAC,mCAAmC,YAChD,MAAM,cAAc,CACnB;YACE,KAAK;YACL,WAAW,EAAE;gBACX,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAC/C;oBACE,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;iBAC5D;aACF;YACD,KAAK,EAAE,KAAsB;YAC7B,MAAM;YACN,aAAa;SACd,EACD,UAAU,CACX,GACI,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ReactNode } from "react";
2
+ import type { CrudResource } from "next-headless-crud/core";
3
+ import type { CrudRouteListPageProps } from "next-headless-crud/next";
4
+ export type AdminCrudListLabels = {
5
+ create: string;
6
+ search: string;
7
+ searchPlaceholder: string;
8
+ all: string;
9
+ submit: string;
10
+ reset: string;
11
+ actions: string;
12
+ view: string;
13
+ edit: string;
14
+ empty: string;
15
+ total: (totalCount: number, page: number, pageCount: number) => string;
16
+ previous: string;
17
+ next: string;
18
+ };
19
+ export type AdminCrudListPageProps<TResource extends CrudResource = CrudResource> = CrudRouteListPageProps<TResource> & {
20
+ labels?: Partial<AdminCrudListLabels>;
21
+ renderValue?: (value: unknown, field: string) => ReactNode;
22
+ };
23
+ /**
24
+ * Renders a complete list page from a next-headless-crud list model.
25
+ */
26
+ export declare function AdminCrudListPage<TResource extends CrudResource = CrudResource>({ resource, searchParams, labels: labelOverrides, renderValue, }: AdminCrudListPageProps<TResource>): Promise<import("react").JSX.Element>;
27
+ //# sourceMappingURL=admin-crud-list-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-crud-list-page.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAKtE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,IAC9E,sBAAsB,CAAC,SAAS,CAAC,GAAG;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;CAC5D,CAAC;AAmBJ;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,EAAE,EACrF,QAAQ,EACR,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,WAAgD,GACjD,EAAE,sBAAsB,CAAC,SAAS,CAAC,wCAmJnC"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ import { tableHref } from "next-headless-crud/query";
4
+ import { AdminPageHeader } from "../../header/admin-page-header.js";
5
+ import { formatAdminValue } from "./format-admin-value.js";
6
+ const defaultLabels = {
7
+ create: "새 글 등록",
8
+ search: "검색",
9
+ searchPlaceholder: "제목 또는 내용 검색",
10
+ all: "전체",
11
+ submit: "조회",
12
+ reset: "초기화",
13
+ actions: "관리",
14
+ view: "보기",
15
+ edit: "수정",
16
+ empty: "등록된 데이터가 없습니다.",
17
+ total: (totalCount, page, pageCount) => `총 ${totalCount.toLocaleString("ko-KR")}건 · ${page}/${Math.max(pageCount, 1)}페이지`,
18
+ previous: "이전",
19
+ next: "다음",
20
+ };
21
+ /**
22
+ * Renders a complete list page from a next-headless-crud list model.
23
+ */
24
+ export async function AdminCrudListPage({ resource, searchParams, labels: labelOverrides, renderValue = (value) => formatAdminValue(value), }) {
25
+ const labels = { ...defaultLabels, ...labelOverrides };
26
+ const model = await resource.list(await searchParams);
27
+ return (_jsxs("main", { className: "gw-admin-page", children: [_jsx(AdminPageHeader, { title: model.resource.label, actions: _jsx(Link, { href: `${model.basePath}/new`, className: "gw-admin-button gw-admin-button--primary", children: labels.create }) }), _jsxs("form", { action: model.basePath, method: "get", className: "gw-admin-search", children: [_jsxs("label", { className: "gw-admin-search__query", children: [_jsx("span", { className: "gw-admin-field__label", children: labels.search }), _jsx("input", { type: "search", name: "q", defaultValue: model.query.search, placeholder: labels.searchPlaceholder, className: "gw-admin-input" })] }), Object.values(model.filters).map((filter) => (_jsxs("label", { className: "gw-admin-search__filter", children: [_jsx("span", { className: "gw-admin-field__label", children: filter.label }), _jsxs("select", { name: filter.name, defaultValue: String(model.query.filters[filter.field] ?? ""), className: "gw-admin-input", children: [_jsx("option", { value: "", children: labels.all }), filter.values.map((option) => (_jsx("option", { value: String(option.value), children: option.label }, String(option.value))))] })] }, filter.field))), _jsx("input", { type: "hidden", name: "pageSize", value: model.query.pageSize }), _jsx("button", { type: "submit", className: "gw-admin-button gw-admin-button--muted", children: labels.submit }), _jsx(Link, { href: model.basePath, className: "gw-admin-button gw-admin-button--secondary", children: labels.reset })] }), _jsx("div", { className: "gw-admin-table-wrap", children: _jsxs("table", { className: "gw-admin-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [model.columns.map((column) => (_jsx("th", { children: column.sort ? (_jsxs(Link, { href: column.sort.href, className: "gw-admin-table__sort", children: [column.label, _jsx("span", { "aria-hidden": "true", children: column.sort.direction === "asc"
28
+ ? "↑"
29
+ : column.sort.direction === "desc"
30
+ ? "↓"
31
+ : "↕" })] })) : (column.label) }, column.name))), _jsx("th", { children: labels.actions })] }) }), _jsxs("tbody", { children: [model.rows.map((row) => (_jsxs("tr", { children: [model.columns.map((column, columnIndex) => (_jsx("td", { children: columnIndex === 0 ? (_jsx(Link, { href: row.href, className: "gw-admin-table__primary-link", children: renderValue(row.data[column.name], column.name) })) : (_jsx("span", { className: "gw-admin-table__value", children: renderValue(row.data[column.name], column.name) })) }, column.name))), _jsx("td", { children: _jsxs("div", { className: "gw-admin-table__actions", children: [_jsx(Link, { href: row.href, children: labels.view }), _jsx(Link, { href: row.editHref, children: labels.edit })] }) })] }, row.id))), model.rows.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: model.columns.length + 1, className: "gw-admin-table__empty", children: labels.empty }) }))] })] }) }), _jsxs("footer", { className: "gw-admin-pagination", children: [_jsx("p", { children: labels.total(model.pagination.totalCount, model.pagination.page, model.pagination.pageCount) }), _jsxs("nav", { className: "gw-admin-pagination__navigation", "aria-label": "\uAC8C\uC2DC\uD310 \uD398\uC774\uC9C0 \uC774\uB3D9", children: [model.pagination.hasPreviousPage ? (_jsx(Link, { href: tableHref(model, { page: model.query.page - 1 }), className: "gw-admin-button gw-admin-button--secondary", children: labels.previous })) : (_jsx("span", { className: "gw-admin-button gw-admin-button--disabled", children: labels.previous })), model.pagination.hasNextPage ? (_jsx(Link, { href: tableHref(model, { page: model.query.page + 1 }), className: "gw-admin-button gw-admin-button--secondary", children: labels.next })) : (_jsx("span", { className: "gw-admin-button gw-admin-button--disabled", children: labels.next }))] })] })] }));
32
+ }
33
+ //# sourceMappingURL=admin-crud-list-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-crud-list-page.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-crud-list-page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CrudAction } from "next-headless-crud/core";
2
+ export type AdminDeleteFormProps = {
3
+ action: CrudAction;
4
+ label?: string;
5
+ pendingLabel?: string;
6
+ confirmMessage?: string;
7
+ };
8
+ /**
9
+ * Runs a headless CRUD delete action after explicit confirmation.
10
+ */
11
+ export declare function AdminDeleteForm({ action, label, pendingLabel, confirmMessage, }: AdminDeleteFormProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=admin-delete-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-delete-form.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/admin-delete-form.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAY,EACZ,YAAwB,EACxB,cAAmD,GACpD,EAAE,oBAAoB,+BA0BtB"}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useActionState } from "react";
4
+ /**
5
+ * Runs a headless CRUD delete action after explicit confirmation.
6
+ */
7
+ export function AdminDeleteForm({ action, label = "삭제", pendingLabel = "삭제 중...", confirmMessage = "이 데이터를 삭제할까요? 삭제 후에는 복구할 수 없습니다.", }) {
8
+ const [state, formAction, pending] = useActionState(action, undefined);
9
+ return (_jsxs("form", { action: formAction, onSubmit: (event) => {
10
+ if (!window.confirm(confirmMessage)) {
11
+ event.preventDefault();
12
+ }
13
+ }, children: [state && !state.success && (_jsx("p", { role: "alert", className: "gw-admin-field-error", children: state.error.message })), _jsx("button", { type: "submit", disabled: pending, className: "gw-admin-button gw-admin-button--danger", children: pending ? pendingLabel : label })] }));
14
+ }
15
+ //# sourceMappingURL=admin-delete-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-delete-form.js","sourceRoot":"","sources":["../../../src/crud/pages/admin-delete-form.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAUvC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,GAAG,IAAI,EACZ,YAAY,GAAG,SAAS,EACxB,cAAc,GAAG,kCAAkC,GAC9B;IACrB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEvE,OAAO,CACL,gBACE,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;QACH,CAAC,aAEA,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAC1B,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,sBAAsB,YAC7C,KAAK,CAAC,KAAK,CAAC,OAAO,GAClB,CACL,EACD,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,yCAAyC,YAElD,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,GACxB,IACJ,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Formats common CRUD values for Korean administration screens.
3
+ */
4
+ export declare function formatAdminValue(value: unknown, labels?: Readonly<Record<string, string>>): string;
5
+ //# sourceMappingURL=format-admin-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-admin-value.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/format-admin-value.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAiB,UAiCzD"}
@@ -0,0 +1,38 @@
1
+ const defaultLabels = {
2
+ draft: "비공개",
3
+ published: "공개",
4
+ pending: "답변 대기",
5
+ answered: "답변 완료",
6
+ closed: "종결",
7
+ };
8
+ /**
9
+ * Formats common CRUD values for Korean administration screens.
10
+ */
11
+ export function formatAdminValue(value, labels = defaultLabels) {
12
+ if (value === null || value === undefined || value === "") {
13
+ return "—";
14
+ }
15
+ if (typeof value === "boolean") {
16
+ return value ? "예" : "아니오";
17
+ }
18
+ if (value instanceof Date) {
19
+ return new Intl.DateTimeFormat("ko-KR", {
20
+ dateStyle: "medium",
21
+ timeStyle: "short",
22
+ }).format(value);
23
+ }
24
+ if (typeof value === "string") {
25
+ if (labels[value]) {
26
+ return labels[value];
27
+ }
28
+ const date = new Date(value);
29
+ if (/^\d{4}-\d{2}-\d{2}T/.test(value) && !Number.isNaN(date.valueOf())) {
30
+ return new Intl.DateTimeFormat("ko-KR", {
31
+ dateStyle: "medium",
32
+ timeStyle: "short",
33
+ }).format(date);
34
+ }
35
+ }
36
+ return String(value);
37
+ }
38
+ //# sourceMappingURL=format-admin-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-admin-value.js","sourceRoot":"","sources":["../../../src/crud/pages/format-admin-value.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,SAA2C,aAAa;IAExD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;gBACtC,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { AdminCrudListPage, type AdminCrudListLabels, type AdminCrudListPageProps, } from "./admin-crud-list-page.js";
2
+ export { AdminCrudDetailPage, type AdminCrudDetailActionContext, type AdminCrudDetailFieldContext, type AdminCrudDetailPageProps, } from "./admin-crud-detail-page.js";
3
+ export { AdminCrudCreatePage, AdminCrudUpdatePage, type AdminCrudCreatePageOptions, type AdminCrudFormPageRenderProps, type AdminCrudFormRenderer, type AdminCrudUpdatePageOptions, } from "./admin-crud-form-pages.js";
4
+ export { AdminDeleteForm, type AdminDeleteFormProps } from "./admin-delete-form.js";
5
+ export { formatAdminValue } from "./format-admin-value.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crud/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,GAChC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { AdminCrudListPage, } from "./admin-crud-list-page.js";
2
+ export { AdminCrudDetailPage, } from "./admin-crud-detail-page.js";
3
+ export { AdminCrudCreatePage, AdminCrudUpdatePage, } from "./admin-crud-form-pages.js";
4
+ export { AdminDeleteForm } from "./admin-delete-form.js";
5
+ export { formatAdminValue } from "./format-admin-value.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crud/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,GAIpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAKpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAA6B,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createAdminCrudForm, type AdminCrudAttachmentPreset, type AdminCrudPresetFormProps, type AdminCrudRichTextPreset, type CreateAdminCrudFormOptions, } from "./create-admin-crud-form.js";
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ export { createAdminCrudForm, } from "./create-admin-crud-form.js";
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/crud/preset/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EACL,mBAAmB,GAKpB,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import { type AdminFileAttachmentLabels, type AdminFileUploader, type AdminUploadedFile } from "../../attachments/index.js";
3
+ import { type AdminRichTextEditorProps } from "../../rich-text/index.js";
4
+ import { type AdminCrudFieldRenderContext, type AdminCrudFormLabels } from "../form/index.js";
5
+ import type { AdminCrudFormPageRenderProps } from "../pages/admin-crud-form-pages.js";
6
+ export type AdminCrudPresetFormProps = AdminCrudFormPageRenderProps & {
7
+ attachments?: readonly AdminUploadedFile[];
8
+ };
9
+ export type AdminCrudAttachmentPreset = {
10
+ field?: string;
11
+ maxFiles?: number;
12
+ maxFileSize?: number;
13
+ accept?: string;
14
+ concurrency?: number;
15
+ labels?: Partial<AdminFileAttachmentLabels>;
16
+ };
17
+ export type AdminCrudRichTextPreset = {
18
+ fields?: readonly string[];
19
+ placeholders?: Readonly<Record<string, string>>;
20
+ nodes?: AdminRichTextEditorProps<Record<string, unknown>>["nodes"];
21
+ marks?: AdminRichTextEditorProps<Record<string, unknown>>["marks"];
22
+ toolbar?: AdminRichTextEditorProps<Record<string, unknown>>["toolbar"];
23
+ };
24
+ export type CreateAdminCrudFormOptions = {
25
+ upload?: AdminFileUploader;
26
+ attachments?: AdminCrudAttachmentPreset | false;
27
+ richText?: AdminCrudRichTextPreset | false;
28
+ hiddenFields?: readonly string[];
29
+ hiddenFieldsByPath?: Readonly<Record<string, readonly string[]>>;
30
+ textareaFields?: readonly string[];
31
+ textareaFieldsByPath?: Readonly<Record<string, readonly string[]>>;
32
+ createDefaults?: Readonly<Record<string, unknown>>;
33
+ labels?: Partial<AdminCrudFormLabels>;
34
+ renderField?: (context: AdminCrudFieldRenderContext) => ReactNode | undefined;
35
+ };
36
+ /**
37
+ * Creates one reusable Client Component that applies the same field, upload,
38
+ * and editor conventions to every CRUD resource in an application.
39
+ */
40
+ export declare function createAdminCrudForm(options?: CreateAdminCrudFormOptions): ComponentType<AdminCrudPresetFormProps>;
41
+ //# sourceMappingURL=create-admin-crud-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-admin-crud-form.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEtF,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG;IACpE,WAAW,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnE,KAAK,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,WAAW,CAAC,EAAE,yBAAyB,GAAG,KAAK,CAAC;IAChD,QAAQ,CAAC,EAAE,uBAAuB,GAAG,KAAK,CAAC;IAC3C,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,SAAS,GAAG,SAAS,CAAC;CAC/E,CAAC;AAcF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,aAAa,CAAC,wBAAwB,CAAC,CA2GzC"}
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { AdminFileAttachments, } from "../../attachments/index.js";
4
+ import { AdminRichTextEditor, adminRichTextNodes, createAdminRichTextUploadAdapter, } from "../../rich-text/index.js";
5
+ import { AdminCrudForm, } from "../form/index.js";
6
+ const defaultRichTextFields = ["content", "replyContent"];
7
+ function addFieldModes(target, fields, mode) {
8
+ for (const field of fields ?? []) {
9
+ target[field] = mode;
10
+ }
11
+ }
12
+ /**
13
+ * Creates one reusable Client Component that applies the same field, upload,
14
+ * and editor conventions to every CRUD resource in an application.
15
+ */
16
+ export function createAdminCrudForm(options = {}) {
17
+ const attachmentOptions = options.attachments === false ? undefined : options.attachments;
18
+ const attachmentField = attachmentOptions?.field ?? "attachmentFileIds";
19
+ const richTextOptions = options.richText === false ? undefined : options.richText ?? {};
20
+ const richTextFields = new Set(richTextOptions?.fields ?? defaultRichTextFields);
21
+ const editorUpload = options.upload
22
+ ? createAdminRichTextUploadAdapter(async (file, context) => options.upload(file, context))
23
+ : undefined;
24
+ return function ConfiguredAdminCrudForm({ title, breadcrumbs, model, action, initialValues = {}, attachments = [], }) {
25
+ const fieldModes = {};
26
+ addFieldModes(fieldModes, options.hiddenFields, "hidden");
27
+ addFieldModes(fieldModes, options.hiddenFieldsByPath?.[model.basePath], "hidden");
28
+ addFieldModes(fieldModes, options.textareaFields, "textarea");
29
+ addFieldModes(fieldModes, options.textareaFieldsByPath?.[model.basePath], "textarea");
30
+ const resolvedInitialValues = { ...initialValues };
31
+ if (!model.row) {
32
+ for (const [name, value] of Object.entries(options.createDefaults ?? {})) {
33
+ if (model.fields.some((field) => field.name === name)) {
34
+ resolvedInitialValues[name] = value;
35
+ }
36
+ }
37
+ }
38
+ if (model.fields.some(({ name }) => name === attachmentField)) {
39
+ resolvedInitialValues[attachmentField] = attachments.map((file) => file.id);
40
+ }
41
+ const formKey = `${model.basePath}:${model.mode}:${String(model.row?.id ?? "new")}`;
42
+ return (_jsx(AdminCrudForm, { title: title, ...(breadcrumbs ? { breadcrumbs } : {}), model: model, action: action, initialValues: resolvedInitialValues, fieldModes: fieldModes, ...(options.labels ? { labels: options.labels } : {}), renderField: (context) => {
43
+ const customField = options.renderField?.(context);
44
+ if (customField !== undefined) {
45
+ return customField;
46
+ }
47
+ if (context.field.name === attachmentField && options.upload) {
48
+ return (_jsx(AdminFileAttachments, { store: context.store, name: context.field.name, uploader: options.upload, initialFiles: attachments, onUploadingChange: context.setUploading, ...(typeof attachmentOptions?.maxFiles === "number"
49
+ ? { maxFiles: attachmentOptions.maxFiles }
50
+ : {}), ...(typeof attachmentOptions?.maxFileSize === "number"
51
+ ? { maxFileSize: attachmentOptions.maxFileSize }
52
+ : {}), ...(attachmentOptions?.accept ? { accept: attachmentOptions.accept } : {}), ...(typeof attachmentOptions?.concurrency === "number"
53
+ ? { concurrency: attachmentOptions.concurrency }
54
+ : {}), ...(attachmentOptions?.labels ? { labels: attachmentOptions.labels } : {}) }));
55
+ }
56
+ if (richTextOptions && richTextFields.has(context.field.name)) {
57
+ return (_jsx(AdminRichTextEditor, { store: context.store, name: context.field.name, placeholder: richTextOptions.placeholders?.[context.field.name] ??
58
+ (context.field.name === "replyContent"
59
+ ? "답변 내용을 입력해 주세요."
60
+ : "내용을 입력해 주세요."), invalid: Boolean(context.error), ...(context.error ? { describedBy: context.errorId } : {}), nodes: richTextOptions.nodes ?? adminRichTextNodes, ...(richTextOptions.marks ? { marks: richTextOptions.marks } : {}), ...(richTextOptions.toolbar !== undefined
61
+ ? { toolbar: richTextOptions.toolbar }
62
+ : {}), ...(editorUpload ? { upload: editorUpload } : {}) }));
63
+ }
64
+ return undefined;
65
+ } }, formKey));
66
+ };
67
+ }
68
+ //# sourceMappingURL=create-admin-crud-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-admin-crud-form.js","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-form.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import "server-only";
2
+ import type { ComponentType, ReactNode } from "react";
3
+ import type { CrudRouteDefinition } from "next-headless-crud/next";
4
+ import { type AdminUploadedFile } from "../../attachments/index.js";
5
+ import type { AdminCrudPresetFormProps } from "./create-admin-crud-form.js";
6
+ type AdminCrudPages = CrudRouteDefinition["pages"];
7
+ export type AdminFileResolver = (value: unknown) => Promise<readonly AdminUploadedFile[]>;
8
+ export type CreateAdminCrudPagesOptions = {
9
+ form: ComponentType<AdminCrudPresetFormProps>;
10
+ resolveFiles?: AdminFileResolver;
11
+ attachmentField?: string;
12
+ richTextFields?: readonly string[];
13
+ longTextFields?: readonly string[];
14
+ hiddenDetailFields?: readonly string[];
15
+ renderDetailField?: (context: {
16
+ field: {
17
+ name: string;
18
+ };
19
+ value: unknown;
20
+ row: Record<string, unknown>;
21
+ }) => ReactNode | Promise<ReactNode | undefined> | undefined;
22
+ };
23
+ /**
24
+ * Creates the conventional list, create, detail, and update page set once.
25
+ * Spread the returned object and replace any page to opt out per resource.
26
+ */
27
+ export declare function createAdminCrudPages({ form: Form, resolveFiles, attachmentField, richTextFields, longTextFields, hiddenDetailFields, renderDetailField, }: CreateAdminCrudPagesOptions): AdminCrudPages;
28
+ export {};
29
+ //# sourceMappingURL=create-admin-crud-pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-admin-crud-pages.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-pages.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAEV,mBAAmB,EAGpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAQ5E,KAAK,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;AAE1F,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACxB,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9B,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CAC9D,CAAC;AAKF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EAAE,IAAI,EACV,YAAY,EACZ,eAAqC,EACrC,cAAsC,EACtC,cAAsC,EACtC,kBAAuB,EACvB,iBAAiB,GAClB,EAAE,2BAA2B,GAAG,cAAc,CA+D9C"}
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import "server-only";
3
+ import { AdminAttachmentList } from "../../attachments/index.js";
4
+ import { AdminRichTextView } from "../../rich-text/index.js";
5
+ import { AdminCrudDetailPage } from "../pages/admin-crud-detail-page.js";
6
+ import { AdminCrudCreatePage, AdminCrudUpdatePage, } from "../pages/admin-crud-form-pages.js";
7
+ import { AdminCrudListPage } from "../pages/admin-crud-list-page.js";
8
+ const defaultRichTextFields = ["content", "replyContent"];
9
+ const defaultLongTextFields = ["content", "replyContent", "summary", "description"];
10
+ /**
11
+ * Creates the conventional list, create, detail, and update page set once.
12
+ * Spread the returned object and replace any page to opt out per resource.
13
+ */
14
+ export function createAdminCrudPages({ form: Form, resolveFiles, attachmentField = "attachmentFileIds", richTextFields = defaultRichTextFields, longTextFields = defaultLongTextFields, hiddenDetailFields = [], renderDetailField, }) {
15
+ const richText = new Set(richTextFields);
16
+ function CreatePage(props) {
17
+ return (_jsx(AdminCrudCreatePage, { ...props, renderForm: (formProps) => _jsx(Form, { ...formProps, attachments: [] }) }));
18
+ }
19
+ function UpdatePage(props) {
20
+ return (_jsx(AdminCrudUpdatePage, { ...props, renderForm: async (formProps) => (_jsx(Form, { ...formProps, attachments: resolveFiles
21
+ ? await resolveFiles(formProps.model.row?.[attachmentField])
22
+ : [] })) }));
23
+ }
24
+ function DetailPage(props) {
25
+ return (_jsx(AdminCrudDetailPage, { ...props, hiddenFields: hiddenDetailFields, longTextFields: longTextFields, renderField: async (context) => {
26
+ const customValue = await renderDetailField?.(context);
27
+ if (customValue !== undefined) {
28
+ return customValue;
29
+ }
30
+ if (context.field.name === attachmentField && resolveFiles) {
31
+ return _jsx(AdminAttachmentList, { files: await resolveFiles(context.value) });
32
+ }
33
+ if (richText.has(context.field.name) && typeof context.value === "string") {
34
+ return _jsx(AdminRichTextView, { value: context.value });
35
+ }
36
+ return undefined;
37
+ } }));
38
+ }
39
+ return {
40
+ list: AdminCrudListPage,
41
+ create: CreatePage,
42
+ detail: DetailPage,
43
+ update: UpdatePage,
44
+ };
45
+ }
46
+ //# sourceMappingURL=create-admin-crud-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-admin-crud-pages.js","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-pages.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AASrB,OAAO,EAAE,mBAAmB,EAA0B,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAoBrE,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,cAAc,CAAU,CAAC;AACnE,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,CAAU,CAAC;AAE7F;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,IAAI,EAAE,IAAI,EACV,YAAY,EACZ,eAAe,GAAG,mBAAmB,EACrC,cAAc,GAAG,qBAAqB,EACtC,cAAc,GAAG,qBAAqB,EACtC,kBAAkB,GAAG,EAAE,EACvB,iBAAiB,GACW;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzC,SAAS,UAAU,CAAC,KAA+B;QACjD,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAC,IAAI,OAAK,SAAS,EAAE,WAAW,EAAE,EAAE,GAAI,GACnE,CACH,CAAC;IACJ,CAAC;IAED,SAAS,UAAU,CAAC,KAA+B;QACjD,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAC/B,KAAC,IAAI,OACC,SAAS,EACb,WAAW,EACT,YAAY;oBACV,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;oBAC5D,CAAC,CAAC,EAAE,GAER,CACH,GACD,CACH,CAAC;IACJ,CAAC;IAED,SAAS,UAAU,CAAC,KAA+B;QACjD,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC7B,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC;gBAEvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,YAAY,EAAE,CAAC;oBAC3D,OAAO,KAAC,mBAAmB,IAAC,KAAK,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAI,CAAC;gBAC3E,CAAC;gBAED,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC1E,OAAO,KAAC,iBAAiB,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAI,CAAC;gBACrD,CAAC;gBAED,OAAO,SAAS,CAAC;YACnB,CAAC,GACD,CACH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import "server-only";
2
+ import { type AnyCrudRouteDefinition, type CrudCatchAllPageProps } from "next-headless-crud/next";
3
+ type AdminCrudPages = AnyCrudRouteDefinition["pages"];
4
+ export type AdminCrudRouteInput = Omit<AnyCrudRouteDefinition, "pages"> & {
5
+ pages?: Partial<AdminCrudPages>;
6
+ };
7
+ export type CreateAdminCrudRoutePageOptions = {
8
+ routes: readonly AdminCrudRouteInput[];
9
+ pages: AdminCrudPages;
10
+ pathPrefix?: string | readonly string[];
11
+ };
12
+ /**
13
+ * Creates a Next.js catch-all page from resource/action pairs and one shared
14
+ * page preset. A route can replace any individual page through `pages`.
15
+ */
16
+ export declare function createAdminCrudRoutePage({ routes, pages, pathPrefix, }: CreateAdminCrudRoutePageOptions): ({ params, searchParams, }: CrudCatchAllPageProps) => Promise<import("react").FunctionComponentElement<import("next-headless-crud/next").CrudRouteListPageProps<any>> | import("react").FunctionComponentElement<import("next-headless-crud/next").CrudRouteCreatePageProps<any>> | import("react").FunctionComponentElement<import("next-headless-crud/next").CrudRouteDetailPageProps<any>>>;
17
+ export {};
18
+ //# sourceMappingURL=create-admin-crud-route-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-admin-crud-route-page.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-route-page.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAEjC,KAAK,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAAG;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACzC,CAAC;AAOF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,KAAK,EACL,UAAU,GACX,EAAE,+BAA+B,IAUY,2BAGzC,qBAAqB,8UAQzB"}
@@ -0,0 +1,26 @@
1
+ import "server-only";
2
+ import { createCrudRoutePage, defineCrudRoute, } from "next-headless-crud/next";
3
+ function normalizePathPrefix(pathPrefix) {
4
+ const values = typeof pathPrefix === "string" ? pathPrefix.split("/") : pathPrefix ?? [];
5
+ return values.filter(Boolean);
6
+ }
7
+ /**
8
+ * Creates a Next.js catch-all page from resource/action pairs and one shared
9
+ * page preset. A route can replace any individual page through `pages`.
10
+ */
11
+ export function createAdminCrudRoutePage({ routes, pages, pathPrefix, }) {
12
+ const definitions = routes.map((route) => defineCrudRoute({
13
+ ...route,
14
+ pages: { ...pages, ...route.pages },
15
+ }));
16
+ const render = createCrudRoutePage(definitions);
17
+ const prefix = normalizePathPrefix(pathPrefix);
18
+ return async function AdminCrudCatchAllPage({ params, searchParams, }) {
19
+ const { path } = await params;
20
+ return render({
21
+ params: Promise.resolve({ path: [...prefix, ...path] }),
22
+ searchParams,
23
+ });
24
+ };
25
+ }
26
+ //# sourceMappingURL=create-admin-crud-route-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-admin-crud-route-page.js","sourceRoot":"","sources":["../../../src/crud/preset/create-admin-crud-route-page.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,eAAe,GAGhB,MAAM,yBAAyB,CAAC;AAcjC,SAAS,mBAAmB,CAAC,UAAkD;IAC7E,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;IACzF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,MAAM,EACN,KAAK,EACL,UAAU,GACsB;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACvC,eAAe,CAAC;QACd,GAAG,KAAK;QACR,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE;KACpC,CAAC,CACH,CAAC;IACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE/C,OAAO,KAAK,UAAU,qBAAqB,CAAC,EAC1C,MAAM,EACN,YAAY,GACU;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;QAE9B,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACvD,YAAY;SACb,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createAdminCrudPages, type AdminFileResolver, type CreateAdminCrudPagesOptions, } from "./create-admin-crud-pages.js";
2
+ export { createAdminCrudRoutePage, type AdminCrudRouteInput, type CreateAdminCrudRoutePageOptions, } from "./create-admin-crud-route-page.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crud/preset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,GACjC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,GACrC,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createAdminCrudPages, } from "./create-admin-crud-pages.js";
2
+ export { createAdminCrudRoutePage, } from "./create-admin-crud-route-page.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crud/preset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAGrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,GAGzB,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from "react";
2
+ export type AdminBreadcrumb = {
3
+ label: ReactNode;
4
+ href?: string;
5
+ };
6
+ export type AdminPageHeaderProps = {
7
+ title: ReactNode;
8
+ breadcrumbs?: readonly AdminBreadcrumb[];
9
+ actions?: ReactNode;
10
+ };
11
+ /**
12
+ * Renders a page heading, optional breadcrumbs, and page-level actions.
13
+ */
14
+ export declare function AdminPageHeader({ title, breadcrumbs, actions, }: AdminPageHeaderProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=admin-page-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-page-header.d.ts","sourceRoot":"","sources":["../../src/header/admin-page-header.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,OAAO,GACR,EAAE,oBAAoB,+BAoCtB"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ /**
4
+ * Renders a page heading, optional breadcrumbs, and page-level actions.
5
+ */
6
+ export function AdminPageHeader({ title, breadcrumbs, actions, }) {
7
+ const hasBreadcrumbs = Boolean(breadcrumbs?.length);
8
+ return (_jsxs("header", { className: "gw-admin-page-header", children: [_jsxs("div", { className: "gw-admin-page-header__heading", children: [hasBreadcrumbs && (_jsx("nav", { "aria-label": "\uD604\uC7AC \uC704\uCE58", className: "gw-admin-breadcrumbs", children: _jsx("ol", { className: "gw-admin-breadcrumbs__list", children: breadcrumbs?.map((breadcrumb, index) => (_jsxs("li", { className: "gw-admin-breadcrumbs__item", children: [index > 0 && (_jsx("span", { className: "gw-admin-breadcrumbs__separator", "aria-hidden": "true", children: ">" })), breadcrumb.href ? (_jsx(Link, { href: breadcrumb.href, className: "gw-admin-breadcrumbs__link", children: breadcrumb.label })) : (_jsx("span", { "aria-current": "page", children: breadcrumb.label }))] }, `${breadcrumb.href ?? "current"}-${index}`))) }) })), _jsx("h1", { className: "gw-admin-page-header__title", children: title })] }), actions && _jsx("div", { className: "gw-admin-page-header__actions", children: actions })] }));
9
+ }
10
+ //# sourceMappingURL=admin-page-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-page-header.js","sourceRoot":"","sources":["../../src/header/admin-page-header.tsx"],"names":[],"mappings":";AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,OAAO,GACc;IACrB,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEpD,OAAO,CACL,kBAAQ,SAAS,EAAC,sBAAsB,aACtC,eAAK,SAAS,EAAC,+BAA+B,aAC3C,cAAc,IAAI,CACjB,4BAAgB,2BAAO,EAAC,SAAS,EAAC,sBAAsB,YACtD,aAAI,SAAS,EAAC,4BAA4B,YACvC,WAAW,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CACvC,cAEE,SAAS,EAAC,4BAA4B,aAErC,KAAK,GAAG,CAAC,IAAI,CACZ,eAAM,SAAS,EAAC,iCAAiC,iBAAa,MAAM,kBAE7D,CACR,EACA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,KAAC,IAAI,IAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,EAAC,4BAA4B,YAChE,UAAU,CAAC,KAAK,GACZ,CACR,CAAC,CAAC,CAAC,CACF,+BAAmB,MAAM,YAAE,UAAU,CAAC,KAAK,GAAQ,CACpD,KAdI,GAAG,UAAU,CAAC,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAe5C,CACN,CAAC,GACC,GACD,CACP,EACD,aAAI,SAAS,EAAC,6BAA6B,YAAE,KAAK,GAAM,IACpD,EACL,OAAO,IAAI,cAAK,SAAS,EAAC,+BAA+B,YAAE,OAAO,GAAO,IACnE,CACV,CAAC;AACJ,CAAC"}