@rytass/bpm-core-react 0.13.3 → 0.13.5

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 (148) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +1 -0
  3. package/dist/chunks/{FormBuilderView-D4xIuPYB.js → FormBuilderView-BYLN6W-P.js} +2 -2
  4. package/dist/chunks/{FormBuilderView-D4xIuPYB.js.map → FormBuilderView-BYLN6W-P.js.map} +1 -1
  5. package/dist/chunks/{FormBuilderView-CLFlfDGe.cjs → FormBuilderView-VmdPVbg7.cjs} +2 -2
  6. package/dist/chunks/{FormBuilderView-CLFlfDGe.cjs.map → FormBuilderView-VmdPVbg7.cjs.map} +1 -1
  7. package/dist/chunks/FormRendererView-Bs8lTb4k.cjs +2 -0
  8. package/dist/chunks/{FormRendererView-BxGT16z0.cjs.map → FormRendererView-Bs8lTb4k.cjs.map} +1 -1
  9. package/dist/chunks/{FormRendererView-DUceSOXe.js → FormRendererView-UPowZZgw.js} +3 -3
  10. package/dist/chunks/{FormRendererView-DUceSOXe.js.map → FormRendererView-UPowZZgw.js.map} +1 -1
  11. package/dist/chunks/{approval-instance-list-page-BjX2kaoF.js → approval-instance-list-page-CPXMP3PL.js} +2 -2
  12. package/dist/chunks/{approval-instance-list-page-BjX2kaoF.js.map → approval-instance-list-page-CPXMP3PL.js.map} +1 -1
  13. package/dist/chunks/{approval-instance-list-page-CWiQvnfE.cjs → approval-instance-list-page-ax0pm8bt.cjs} +2 -2
  14. package/dist/chunks/{approval-instance-list-page-CWiQvnfE.cjs.map → approval-instance-list-page-ax0pm8bt.cjs.map} +1 -1
  15. package/dist/chunks/{compose-Bb-REfoB.js → compose-6P64PO1i.js} +5 -5
  16. package/dist/chunks/{compose-Bb-REfoB.js.map → compose-6P64PO1i.js.map} +1 -1
  17. package/dist/chunks/{compose-DzRYZcqe.cjs → compose-BnSRL4ml.cjs} +2 -2
  18. package/dist/chunks/{compose-DzRYZcqe.cjs.map → compose-BnSRL4ml.cjs.map} +1 -1
  19. package/dist/chunks/{dashboard-page-DJ9vOPga.js → dashboard-page-CeCLV1tp.js} +2 -2
  20. package/dist/chunks/{dashboard-page-DJ9vOPga.js.map → dashboard-page-CeCLV1tp.js.map} +1 -1
  21. package/dist/chunks/{dashboard-page-CH87L5nx.cjs → dashboard-page-DooFJsxM.cjs} +2 -2
  22. package/dist/chunks/{dashboard-page-CH87L5nx.cjs.map → dashboard-page-DooFJsxM.cjs.map} +1 -1
  23. package/dist/chunks/{delegations-vpLtus9g.cjs → delegations-8LsxcQM4.cjs} +2 -2
  24. package/dist/chunks/{delegations-vpLtus9g.cjs.map → delegations-8LsxcQM4.cjs.map} +1 -1
  25. package/dist/chunks/{delegations-0MbJ7CWj.js → delegations-B8gLSt0i.js} +4 -5
  26. package/dist/chunks/{delegations-0MbJ7CWj.js.map → delegations-B8gLSt0i.js.map} +1 -1
  27. package/dist/chunks/{delegations-DyMGIDpp.js → delegations-DRupxJ4_.js} +4 -5
  28. package/dist/chunks/{delegations-DyMGIDpp.js.map → delegations-DRupxJ4_.js.map} +1 -1
  29. package/dist/chunks/{delegations-Bc9psOZ3.cjs → delegations-DlYwMiAW.cjs} +2 -2
  30. package/dist/chunks/{delegations-Bc9psOZ3.cjs.map → delegations-DlYwMiAW.cjs.map} +1 -1
  31. package/dist/chunks/{designer-C6oIO9Kq.js → designer-C3s2kSna.js} +1342 -841
  32. package/dist/chunks/designer-C3s2kSna.js.map +1 -0
  33. package/dist/chunks/designer-_g58R6rQ.cjs +65 -0
  34. package/dist/chunks/designer-_g58R6rQ.cjs.map +1 -0
  35. package/dist/chunks/detail-Db-UOELp.cjs +2 -0
  36. package/dist/chunks/detail-Db-UOELp.cjs.map +1 -0
  37. package/dist/chunks/detail-pYEIk-jW.js +2325 -0
  38. package/dist/chunks/detail-pYEIk-jW.js.map +1 -0
  39. package/dist/chunks/{login-9bCXyjbX.cjs → login-AtVxZBsC.cjs} +2 -2
  40. package/dist/chunks/{login-9bCXyjbX.cjs.map → login-AtVxZBsC.cjs.map} +1 -1
  41. package/dist/chunks/{login-BKxpLibd.js → login-C6qlTC6F.js} +2 -2
  42. package/dist/chunks/{login-BKxpLibd.js.map → login-C6qlTC6F.js.map} +1 -1
  43. package/dist/chunks/{orgs-Cr_7zsAD.js → orgs-BpqVu5ka.js} +2 -2
  44. package/dist/chunks/{orgs-Cr_7zsAD.js.map → orgs-BpqVu5ka.js.map} +1 -1
  45. package/dist/chunks/orgs-D0-5BaHT.cjs +2 -0
  46. package/dist/chunks/{orgs-Bz8hBMoQ.cjs.map → orgs-D0-5BaHT.cjs.map} +1 -1
  47. package/dist/chunks/providers-DHtDZFNA.cjs +2 -0
  48. package/dist/chunks/{providers-BsEn3ikK.cjs.map → providers-DHtDZFNA.cjs.map} +1 -1
  49. package/dist/chunks/{providers-DjLh4oLY.js → providers-J5eyByQj.js} +7 -7
  50. package/dist/chunks/{providers-DjLh4oLY.js.map → providers-J5eyByQj.js.map} +1 -1
  51. package/dist/chunks/{routes-config-fDVHmvXi.cjs → routes-config-C1j_vFKo.cjs} +2 -2
  52. package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -0
  53. package/dist/chunks/{routes-config-RBYQtUd0.js → routes-config-yZbESPlw.js} +3 -2
  54. package/dist/chunks/routes-config-yZbESPlw.js.map +1 -0
  55. package/dist/chunks/use-bpm-member-D57LKe_u.js +20 -0
  56. package/dist/chunks/use-bpm-member-D57LKe_u.js.map +1 -0
  57. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs +2 -0
  58. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.js +19 -24
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/routes-config.d.ts +2 -0
  64. package/dist/lib/use-bpm-member.d.ts +6 -0
  65. package/dist/next/index.cjs +1 -1
  66. package/dist/next/index.js +2 -2
  67. package/dist/pages/admin/delegations/index.cjs +1 -1
  68. package/dist/pages/admin/delegations/index.js +1 -1
  69. package/dist/pages/admin/orgs/index.cjs +1 -1
  70. package/dist/pages/admin/orgs/index.js +1 -1
  71. package/dist/pages/admin/webhook-endpoints/index.cjs +2 -0
  72. package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -0
  73. package/dist/pages/admin/webhook-endpoints/index.d.ts +4 -0
  74. package/dist/pages/admin/webhook-endpoints/index.js +14 -0
  75. package/dist/pages/admin/webhook-endpoints/index.js.map +1 -0
  76. package/dist/pages/delegations/index.cjs +1 -1
  77. package/dist/pages/delegations/index.js +1 -1
  78. package/dist/pages/instances/detail/index.cjs +1 -1
  79. package/dist/pages/instances/detail/index.js +1 -1
  80. package/dist/pages/login/index.cjs +1 -1
  81. package/dist/pages/login/index.js +1 -1
  82. package/dist/pages/templates/compose/index.cjs +1 -1
  83. package/dist/pages/templates/compose/index.js +1 -1
  84. package/dist/pages/templates/designer/index.cjs +1 -1
  85. package/dist/pages/templates/designer/index.js +1 -1
  86. package/dist/style.css +1 -1
  87. package/dist/views/admin/delegations/index.cjs +1 -1
  88. package/dist/views/admin/delegations/index.js +1 -1
  89. package/dist/views/admin/index.cjs +1 -1
  90. package/dist/views/admin/index.d.ts +1 -0
  91. package/dist/views/admin/index.js +4 -3
  92. package/dist/views/admin/orgs/index.cjs +1 -1
  93. package/dist/views/admin/orgs/index.js +1 -1
  94. package/dist/views/admin/webhook-endpoints/AdminWebhookEndpointsView.d.ts +8 -0
  95. package/dist/views/admin/webhook-endpoints/index.cjs +2 -0
  96. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -0
  97. package/dist/views/admin/webhook-endpoints/index.d.ts +1 -0
  98. package/dist/views/admin/webhook-endpoints/index.js +729 -0
  99. package/dist/views/admin/webhook-endpoints/index.js.map +1 -0
  100. package/dist/views/cc/index.cjs +1 -1
  101. package/dist/views/cc/index.js +1 -1
  102. package/dist/views/dashboard/index.cjs +1 -1
  103. package/dist/views/dashboard/index.js +1 -1
  104. package/dist/views/delegations/index.cjs +1 -1
  105. package/dist/views/delegations/index.js +1 -1
  106. package/dist/views/forms/builder/index.cjs +1 -1
  107. package/dist/views/forms/builder/index.js +1 -1
  108. package/dist/views/forms/renderer/index.cjs +1 -1
  109. package/dist/views/forms/renderer/index.js +1 -1
  110. package/dist/views/inbox/index.cjs +1 -1
  111. package/dist/views/inbox/index.js +1 -1
  112. package/dist/views/instances/detail/InstanceDetailView.d.ts +6 -1
  113. package/dist/views/instances/detail/index.cjs +1 -1
  114. package/dist/views/instances/detail/index.d.ts +1 -0
  115. package/dist/views/instances/detail/index.js +2 -2
  116. package/dist/views/instances/detail/sections/InstanceWebhookDeliveriesSection.d.ts +20 -0
  117. package/dist/views/instances/detail/sections/shared.d.ts +37 -4
  118. package/dist/views/instances/new/index.cjs +1 -1
  119. package/dist/views/instances/new/index.js +2 -2
  120. package/dist/views/login/index.cjs +1 -1
  121. package/dist/views/login/index.js +1 -1
  122. package/dist/views/search/index.cjs +1 -1
  123. package/dist/views/search/index.js +1 -1
  124. package/dist/views/sent/index.cjs +1 -1
  125. package/dist/views/sent/index.js +1 -1
  126. package/dist/views/templates/compose/index.cjs +1 -1
  127. package/dist/views/templates/compose/index.js +1 -1
  128. package/dist/views/templates/designer/NotifyWebhookTargetsEditor.d.ts +20 -0
  129. package/dist/views/templates/designer/index.cjs +1 -1
  130. package/dist/views/templates/designer/index.js +1 -1
  131. package/dist/views/templates/designer/notify-webhook-designer.d.ts +74 -0
  132. package/dist/views/templates/index.cjs +1 -1
  133. package/dist/views/templates/index.js +1 -1
  134. package/dist/views/templates/versions/index.cjs +1 -1
  135. package/dist/views/templates/versions/index.js +1 -1
  136. package/package.json +13 -3
  137. package/dist/chunks/FormRendererView-BxGT16z0.cjs +0 -2
  138. package/dist/chunks/designer-C6oIO9Kq.js.map +0 -1
  139. package/dist/chunks/designer-gFUdImeZ.cjs +0 -65
  140. package/dist/chunks/designer-gFUdImeZ.cjs.map +0 -1
  141. package/dist/chunks/detail-BgKgMvYx.js +0 -2044
  142. package/dist/chunks/detail-BgKgMvYx.js.map +0 -1
  143. package/dist/chunks/detail-Dnz5aaI-.cjs +0 -2
  144. package/dist/chunks/detail-Dnz5aaI-.cjs.map +0 -1
  145. package/dist/chunks/orgs-Bz8hBMoQ.cjs +0 -2
  146. package/dist/chunks/providers-BsEn3ikK.cjs +0 -2
  147. package/dist/chunks/routes-config-RBYQtUd0.js.map +0 -1
  148. package/dist/chunks/routes-config-fDVHmvXi.cjs.map +0 -1
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { n as e } from "./auth-provider-B5oPmvk2.js";
3
+ //#region src/lib/use-bpm-member.ts
4
+ function t() {
5
+ let { member: t } = e();
6
+ return t;
7
+ }
8
+ var n = /* @__PURE__ */ new Set([
9
+ "bpm:*",
10
+ "bpm:admin",
11
+ "bpm.admin",
12
+ "bpm:admin:*"
13
+ ]);
14
+ function r(e) {
15
+ return e ? (e.roles ?? []).includes("BPM_ADMIN") || (e.permissions ?? []).some((e) => n.has(e)) : !1;
16
+ }
17
+ //#endregion
18
+ export { t as n, r as t };
19
+
20
+ //# sourceMappingURL=use-bpm-member-D57LKe_u.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-bpm-member-D57LKe_u.js","names":[],"sources":["../../src/lib/use-bpm-member.ts"],"sourcesContent":["'use client';\n\nimport type { ApiMember } from '@rytass/bpm-core-client';\nimport { useAuth } from './auth-provider';\n\n/**\n * Read the currently authenticated BPM member. Returns `null` when there\n * is no active session — typically only seen on the login page or during\n * the brief loading window before `<AuthProvider>` resolves the cookie.\n *\n * Convenience alias for `useAuth().member` aimed at host navigations\n * (avatar, display name, role-based menu visibility) that should not\n * depend on the broader `useAuth()` surface.\n */\nexport function useBPMMember(): ApiMember | null {\n const { member } = useAuth();\n return member;\n}\n\nconst BPM_ADMIN_PERMISSIONS: ReadonlySet<string> = new Set([\n 'bpm:*',\n 'bpm:admin',\n 'bpm.admin',\n 'bpm:admin:*',\n]);\n\n/**\n * Whether the member passes the server's `@BPMAdminOnly()` check — the\n * `BPM_ADMIN` role or one of the administrator permissions. Use it to decide\n * whether to show administrator-only UI; the server still enforces access.\n */\nexport function isBPMAdminMember(\n member: Pick<ApiMember, 'permissions' | 'roles'> | null,\n): boolean {\n if (!member) {\n return false;\n }\n\n // The member comes from the host's `/auth/me` unvalidated; a host that\n // omits either list must not take the page that asks down with it.\n return (\n (member.roles ?? []).includes('BPM_ADMIN') ||\n (member.permissions ?? []).some((permission) =>\n BPM_ADMIN_PERMISSIONS.has(permission),\n )\n );\n}\n"],"mappings":";;;AAcA,SAAgB,IAAiC;CAC/C,IAAM,EAAE,cAAW,EAAQ;CAC3B,OAAO;AACT;AAEA,IAAM,oBAA6C,IAAI,IAAI;CACzD;CACA;CACA;CACA;AACF,CAAC;AAOD,SAAgB,EACd,GACS;CAOT,OANK,KAOF,EAAO,SAAS,CAAC,EAAA,CAAG,SAAS,WAAW,MACxC,EAAO,eAAe,CAAC,EAAA,CAAG,MAAM,MAC/B,EAAsB,IAAI,CAAU,CACtC,IATO;AAWX"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("./auth-provider-4BeCw7cI.cjs");function t(){let{member:t}=e.n();return t}var n=new Set([`bpm:*`,`bpm:admin`,`bpm.admin`,`bpm:admin:*`]);function r(e){return e?(e.roles??[]).includes(`BPM_ADMIN`)||(e.permissions??[]).some(e=>n.has(e)):!1}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
2
+ //# sourceMappingURL=use-bpm-member-DpNAQtNC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-bpm-member-DpNAQtNC.cjs","names":[],"sources":["../../src/lib/use-bpm-member.ts"],"sourcesContent":["'use client';\n\nimport type { ApiMember } from '@rytass/bpm-core-client';\nimport { useAuth } from './auth-provider';\n\n/**\n * Read the currently authenticated BPM member. Returns `null` when there\n * is no active session — typically only seen on the login page or during\n * the brief loading window before `<AuthProvider>` resolves the cookie.\n *\n * Convenience alias for `useAuth().member` aimed at host navigations\n * (avatar, display name, role-based menu visibility) that should not\n * depend on the broader `useAuth()` surface.\n */\nexport function useBPMMember(): ApiMember | null {\n const { member } = useAuth();\n return member;\n}\n\nconst BPM_ADMIN_PERMISSIONS: ReadonlySet<string> = new Set([\n 'bpm:*',\n 'bpm:admin',\n 'bpm.admin',\n 'bpm:admin:*',\n]);\n\n/**\n * Whether the member passes the server's `@BPMAdminOnly()` check — the\n * `BPM_ADMIN` role or one of the administrator permissions. Use it to decide\n * whether to show administrator-only UI; the server still enforces access.\n */\nexport function isBPMAdminMember(\n member: Pick<ApiMember, 'permissions' | 'roles'> | null,\n): boolean {\n if (!member) {\n return false;\n }\n\n // The member comes from the host's `/auth/me` unvalidated; a host that\n // omits either list must not take the page that asks down with it.\n return (\n (member.roles ?? []).includes('BPM_ADMIN') ||\n (member.permissions ?? []).some((permission) =>\n BPM_ADMIN_PERMISSIONS.has(permission),\n )\n );\n}\n"],"mappings":"6DAcA,SAAgB,GAAiC,CAC/C,GAAM,CAAE,UAAW,EAAA,EAAQ,EAC3B,OAAO,CACT,CAEA,IAAM,EAA6C,IAAI,IAAI,CACzD,QACA,YACA,YACA,aACF,CAAC,EAOD,SAAgB,EACd,EACS,CAOT,OANK,GAOF,EAAO,OAAS,CAAC,EAAA,CAAG,SAAS,WAAW,IACxC,EAAO,aAAe,CAAC,EAAA,CAAG,KAAM,GAC/B,EAAsB,IAAI,CAAU,CACtC,EATO,EAWX"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});require('./index.css');const e=require("./chunks/router-adapter--gYs13E8.cjs"),t=require("./chunks/auth-provider-4BeCw7cI.cjs"),n=require("./chunks/format-date-time-D-cx5M8z.cjs"),r=require("./chunks/providers-BsEn3ikK.cjs"),i=require("./chunks/routes-config-fDVHmvXi.cjs"),a=require("./chunks/bpm-form-field-Bc6k4ZEO.cjs"),o=require("./chunks/admin-pickers-Btvij1at.cjs"),s=require("./chunks/approval-instance-list-page-CWiQvnfE.cjs"),c=require("./chunks/dashboard-page-CH87L5nx.cjs");let l=require("@mezzanine-ui/react"),u=require("react/jsx-runtime"),d=require("@mezzanine-ui/icons");function f(){let{logout:e}=t.n();return e}function p(){let{member:e}=t.n();return e}var m={root:`bpm_root_jl5S-`,badge:`bpm_badge_SIKJk`};function h({label:e=`通知中心`}={}){let{open:t}=r.o(),{unreadCount:n}=r.i(),i=n>0?`${e},${n} 則未讀`:e;return(0,u.jsxs)(`span`,{className:m.root,children:[(0,u.jsx)(l.NavigationIconButton,{"aria-label":i,icon:d.NotificationUnreadIcon,onClick:()=>{t()},title:e,type:`button`}),n>0?(0,u.jsx)(`span`,{className:m.badge,children:n>99?`99+`:n}):null]})}exports.ApprovalInstanceListPage=s.t,exports.AuthProvider=t.t,exports.BPMFormField=a.t,exports.BPMNotificationBellButton=h,exports.BPMRoutesProvider=i.t,exports.DashboardPage=c.t,exports.MemberPicker=o.t,exports.NotificationDrawer=r.n,exports.NotificationDrawerProvider=r.a,exports.NotificationUnreadProvider=r.r,exports.OrgUnitPicker=o.n,exports.PositionPicker=o.r,exports.Providers=r.t,exports.RouterAdapterProvider=e.t,exports.createDefaultBPMRoutes=i.n,exports.defaultBrowserSearchParams=e.n,exports.formatDateTime=n.t,exports.readMemberOption=o.i,exports.readOrgUnitOption=o.a,exports.readPositionOption=o.o,exports.useAuth=t.n,exports.useBPMLogout=f,exports.useBPMMember=p,exports.useBPMRoutes=i.r,exports.useNotificationDrawer=r.o,exports.useNotificationUnread=r.i,exports.useRouterAdapter=e.r;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});require('./index.css');const e=require("./chunks/router-adapter--gYs13E8.cjs"),t=require("./chunks/auth-provider-4BeCw7cI.cjs"),n=require("./chunks/format-date-time-D-cx5M8z.cjs"),r=require("./chunks/providers-DHtDZFNA.cjs"),i=require("./chunks/routes-config-C1j_vFKo.cjs"),a=require("./chunks/bpm-form-field-Bc6k4ZEO.cjs"),o=require("./chunks/use-bpm-member-DpNAQtNC.cjs"),s=require("./chunks/admin-pickers-Btvij1at.cjs"),c=require("./chunks/approval-instance-list-page-ax0pm8bt.cjs"),l=require("./chunks/dashboard-page-DooFJsxM.cjs");let u=require("@mezzanine-ui/react"),d=require("react/jsx-runtime"),f=require("@mezzanine-ui/icons");function p(){let{logout:e}=t.n();return e}var m={root:`bpm_root_jl5S-`,badge:`bpm_badge_SIKJk`};function h({label:e=`通知中心`}={}){let{open:t}=r.o(),{unreadCount:n}=r.i(),i=n>0?`${e},${n} 則未讀`:e;return(0,d.jsxs)(`span`,{className:m.root,children:[(0,d.jsx)(u.NavigationIconButton,{"aria-label":i,icon:f.NotificationUnreadIcon,onClick:()=>{t()},title:e,type:`button`}),n>0?(0,d.jsx)(`span`,{className:m.badge,children:n>99?`99+`:n}):null]})}exports.ApprovalInstanceListPage=c.t,exports.AuthProvider=t.t,exports.BPMFormField=a.t,exports.BPMNotificationBellButton=h,exports.BPMRoutesProvider=i.t,exports.DashboardPage=l.t,exports.MemberPicker=s.t,exports.NotificationDrawer=r.n,exports.NotificationDrawerProvider=r.a,exports.NotificationUnreadProvider=r.r,exports.OrgUnitPicker=s.n,exports.PositionPicker=s.r,exports.Providers=r.t,exports.RouterAdapterProvider=e.t,exports.createDefaultBPMRoutes=i.n,exports.defaultBrowserSearchParams=e.n,exports.formatDateTime=n.t,exports.isBPMAdminMember=o.t,exports.readMemberOption=s.i,exports.readOrgUnitOption=s.a,exports.readPositionOption=s.o,exports.useAuth=t.n,exports.useBPMLogout=p,exports.useBPMMember=o.n,exports.useBPMRoutes=i.r,exports.useNotificationDrawer=r.o,exports.useNotificationUnread=r.i,exports.useRouterAdapter=e.r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/lib/use-bpm-logout.ts","../src/lib/use-bpm-member.ts","../src/components/bpm-notification-bell-button.module.scss","../src/components/bpm-notification-bell-button.tsx"],"sourcesContent":["'use client';\n\nimport { useAuth } from './auth-provider';\n\n/**\n * Drop-in logout handler for host navigation menus. Wraps the BPM auth\n * context's logout flow — calls `logoutApi()` against the BPM REST\n * session endpoint, clears the in-memory member, then redirects to the\n * configured `loginPath`.\n *\n * Hosts mount this on their own logout buttons / menu items so they do\n * not need to touch `useAuth()` directly. To customize the post-logout\n * destination, override the `loginPath` prop on `<BPMNextProviders>` or\n * `<AuthProvider>`.\n */\nexport function useBPMLogout(): () => Promise<void> {\n const { logout } = useAuth();\n return logout;\n}\n","'use client';\n\nimport type { ApiMember } from '@rytass/bpm-core-client';\nimport { useAuth } from './auth-provider';\n\n/**\n * Read the currently authenticated BPM member. Returns `null` when there\n * is no active session — typically only seen on the login page or during\n * the brief loading window before `<AuthProvider>` resolves the cookie.\n *\n * Convenience alias for `useAuth().member` aimed at host navigations\n * (avatar, display name, role-based menu visibility) that should not\n * depend on the broader `useAuth()` surface.\n */\nexport function useBPMMember(): ApiMember | null {\n const { member } = useAuth();\n return member;\n}\n",".root {\n display: inline-flex;\n position: relative;\n}\n\n.badge {\n align-items: center;\n background: #d92d20;\n border: 1px solid #fff;\n border-radius: 999px;\n color: #fff;\n display: inline-flex;\n font-size: 10px;\n font-weight: 600;\n height: 16px;\n justify-content: center;\n line-height: 1;\n min-width: 16px;\n padding: 0 4px;\n pointer-events: none;\n position: absolute;\n right: -4px;\n top: -4px;\n}\n","'use client';\n\nimport type { ReactElement } from 'react';\nimport { NavigationIconButton } from '@mezzanine-ui/react';\nimport { NotificationUnreadIcon } from '@mezzanine-ui/icons';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport styles from './bpm-notification-bell-button.module.scss';\n\nexport interface BPMNotificationBellButtonProps {\n /** Override the aria-label / tooltip. Defaults to `通知中心`. */\n readonly label?: string;\n}\n\n/**\n * Drop-in notification bell. Reads the unread count from\n * `<NotificationUnreadProvider>`, opens the BPM `<NotificationDrawer />`\n * mounted by `<Providers>` (or `<BPMNextProviders>`) on click, and\n * renders a small red badge with the unread count.\n *\n * Use this when the host navigation wants the BPM notification UX with\n * minimum wiring. Hosts that need a fully custom button can skip this\n * widget and consume `useNotificationDrawer()` + `useNotificationUnread()`\n * directly to wire their own trigger.\n *\n * Visual: uses Mezzanine `NavigationIconButton` so the bell aligns with\n * surrounding Mezzanine navigation chrome. The button is decoupled from\n * the `<Navigation>` container — it does not require a Mezzanine\n * navigation tree to render.\n */\nexport function BPMNotificationBellButton({\n label = '通知中心',\n}: BPMNotificationBellButtonProps = {}): ReactElement {\n const { open } = useNotificationDrawer();\n const { unreadCount } = useNotificationUnread();\n const ariaLabel = unreadCount > 0 ? `${label},${unreadCount} 則未讀` : label;\n return (\n <span className={styles.root}>\n <NavigationIconButton\n aria-label={ariaLabel}\n icon={NotificationUnreadIcon}\n onClick={(): void => {\n open();\n }}\n title={label}\n type=\"button\"\n />\n {unreadCount > 0 ? (\n <span className={styles.badge}>\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n ) : null}\n </span>\n );\n}\n"],"mappings":"ooBAeA,SAAgB,GAAoC,CAClD,GAAM,CAAE,UAAW,EAAA,EAAQ,EAC3B,OAAO,CACT,CCJA,SAAgB,GAAiC,CAC/C,GAAM,CAAE,UAAW,EAAA,EAAQ,EAC3B,OAAO,CACT,uDEaA,SAAgB,EAA0B,CACxC,QAAQ,QAC0B,CAAC,EAAiB,CACpD,GAAM,CAAE,QAAS,EAAA,EAAsB,EACjC,CAAE,eAAgB,EAAA,EAAsB,EACxC,EAAY,EAAc,EAAI,GAAG,EAAM,GAAG,EAAY,MAAQ,EACpE,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAA,qBAAD,CACE,aAAY,EACZ,KAAM,EAAA,uBACN,YAAqB,CACnB,EAAK,CACP,EACA,MAAO,EACP,KAAK,QACN,CAAA,EACA,EAAc,GACb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MACrB,SAAA,EAAc,GAAK,MAAQ,CACxB,CAAA,EACJ,IACA,GAEV"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/lib/use-bpm-logout.ts","../src/components/bpm-notification-bell-button.module.scss","../src/components/bpm-notification-bell-button.tsx"],"sourcesContent":["'use client';\n\nimport { useAuth } from './auth-provider';\n\n/**\n * Drop-in logout handler for host navigation menus. Wraps the BPM auth\n * context's logout flow — calls `logoutApi()` against the BPM REST\n * session endpoint, clears the in-memory member, then redirects to the\n * configured `loginPath`.\n *\n * Hosts mount this on their own logout buttons / menu items so they do\n * not need to touch `useAuth()` directly. To customize the post-logout\n * destination, override the `loginPath` prop on `<BPMNextProviders>` or\n * `<AuthProvider>`.\n */\nexport function useBPMLogout(): () => Promise<void> {\n const { logout } = useAuth();\n return logout;\n}\n",".root {\n display: inline-flex;\n position: relative;\n}\n\n.badge {\n align-items: center;\n background: #d92d20;\n border: 1px solid #fff;\n border-radius: 999px;\n color: #fff;\n display: inline-flex;\n font-size: 10px;\n font-weight: 600;\n height: 16px;\n justify-content: center;\n line-height: 1;\n min-width: 16px;\n padding: 0 4px;\n pointer-events: none;\n position: absolute;\n right: -4px;\n top: -4px;\n}\n","'use client';\n\nimport type { ReactElement } from 'react';\nimport { NavigationIconButton } from '@mezzanine-ui/react';\nimport { NotificationUnreadIcon } from '@mezzanine-ui/icons';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport styles from './bpm-notification-bell-button.module.scss';\n\nexport interface BPMNotificationBellButtonProps {\n /** Override the aria-label / tooltip. Defaults to `通知中心`. */\n readonly label?: string;\n}\n\n/**\n * Drop-in notification bell. Reads the unread count from\n * `<NotificationUnreadProvider>`, opens the BPM `<NotificationDrawer />`\n * mounted by `<Providers>` (or `<BPMNextProviders>`) on click, and\n * renders a small red badge with the unread count.\n *\n * Use this when the host navigation wants the BPM notification UX with\n * minimum wiring. Hosts that need a fully custom button can skip this\n * widget and consume `useNotificationDrawer()` + `useNotificationUnread()`\n * directly to wire their own trigger.\n *\n * Visual: uses Mezzanine `NavigationIconButton` so the bell aligns with\n * surrounding Mezzanine navigation chrome. The button is decoupled from\n * the `<Navigation>` container — it does not require a Mezzanine\n * navigation tree to render.\n */\nexport function BPMNotificationBellButton({\n label = '通知中心',\n}: BPMNotificationBellButtonProps = {}): ReactElement {\n const { open } = useNotificationDrawer();\n const { unreadCount } = useNotificationUnread();\n const ariaLabel = unreadCount > 0 ? `${label},${unreadCount} 則未讀` : label;\n return (\n <span className={styles.root}>\n <NavigationIconButton\n aria-label={ariaLabel}\n icon={NotificationUnreadIcon}\n onClick={(): void => {\n open();\n }}\n title={label}\n type=\"button\"\n />\n {unreadCount > 0 ? (\n <span className={styles.badge}>\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n ) : null}\n </span>\n );\n}\n"],"mappings":"srBAeA,SAAgB,GAAoC,CAClD,GAAM,CAAE,UAAW,EAAA,EAAQ,EAC3B,OAAO,CACT,uDEYA,SAAgB,EAA0B,CACxC,QAAQ,QAC0B,CAAC,EAAiB,CACpD,GAAM,CAAE,QAAS,EAAA,EAAsB,EACjC,CAAE,eAAgB,EAAA,EAAsB,EACxC,EAAY,EAAc,EAAI,GAAG,EAAM,GAAG,EAAY,MAAQ,EACpE,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAA,qBAAD,CACE,aAAY,EACZ,KAAM,EAAA,uBACN,YAAqB,CACnB,EAAK,CACP,EACA,MAAO,EACP,KAAK,QACN,CAAA,EACA,EAAc,GACb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MACrB,SAAA,EAAc,GAAK,MAAQ,CACxB,CAAA,EACJ,IACA,GAEV"}
package/dist/index.js CHANGED
@@ -2,51 +2,46 @@
2
2
  import { n as e, r as t, t as n } from "./chunks/router-adapter-DftlFTOd.js";
3
3
  import { n as r, t as i } from "./chunks/auth-provider-B5oPmvk2.js";
4
4
  import { t as a } from "./chunks/format-date-time-CB-LxzqT.js";
5
- import { a as o, i as s, n as c, o as l, r as u, t as d } from "./chunks/providers-DjLh4oLY.js";
6
- import { n as f, r as p, t as m } from "./chunks/routes-config-RBYQtUd0.js";
5
+ import { a as o, i as s, n as c, o as l, r as u, t as d } from "./chunks/providers-J5eyByQj.js";
6
+ import { n as f, r as p, t as m } from "./chunks/routes-config-yZbESPlw.js";
7
7
  import { t as h } from "./chunks/bpm-form-field-Cao0rMol.js";
8
- import { a as g, i as _, n as v, o as y, r as b, t as x } from "./chunks/admin-pickers-DLlG_1du.js";
9
- import { t as S } from "./chunks/approval-instance-list-page-BjX2kaoF.js";
10
- import { t as C } from "./chunks/dashboard-page-DJ9vOPga.js";
11
- import { NavigationIconButton as w } from "@mezzanine-ui/react";
12
- import { jsx as T, jsxs as E } from "react/jsx-runtime";
13
- import { NotificationUnreadIcon as D } from "@mezzanine-ui/icons";
8
+ import { n as g, t as _ } from "./chunks/use-bpm-member-D57LKe_u.js";
9
+ import { a as v, i as y, n as b, o as x, r as S, t as C } from "./chunks/admin-pickers-DLlG_1du.js";
10
+ import { t as w } from "./chunks/approval-instance-list-page-CPXMP3PL.js";
11
+ import { t as T } from "./chunks/dashboard-page-CeCLV1tp.js";
12
+ import { NavigationIconButton as E } from "@mezzanine-ui/react";
13
+ import { jsx as D, jsxs as O } from "react/jsx-runtime";
14
+ import { NotificationUnreadIcon as k } from "@mezzanine-ui/icons";
14
15
  import './index.css';//#region src/lib/use-bpm-logout.ts
15
- function O() {
16
+ function A() {
16
17
  let { logout: e } = r();
17
18
  return e;
18
19
  }
19
- //#endregion
20
- //#region src/lib/use-bpm-member.ts
21
- function k() {
22
- let { member: e } = r();
23
- return e;
24
- }
25
- var A = {
20
+ var j = {
26
21
  root: "bpm_root_jl5S-",
27
22
  badge: "bpm_badge_SIKJk"
28
23
  };
29
24
  //#endregion
30
25
  //#region src/components/bpm-notification-bell-button.tsx
31
- function j({ label: e = "通知中心" } = {}) {
26
+ function M({ label: e = "通知中心" } = {}) {
32
27
  let { open: t } = l(), { unreadCount: n } = s(), r = n > 0 ? `${e},${n} 則未讀` : e;
33
- return /* @__PURE__ */ E("span", {
34
- className: A.root,
35
- children: [/* @__PURE__ */ T(w, {
28
+ return /* @__PURE__ */ O("span", {
29
+ className: j.root,
30
+ children: [/* @__PURE__ */ D(E, {
36
31
  "aria-label": r,
37
- icon: D,
32
+ icon: k,
38
33
  onClick: () => {
39
34
  t();
40
35
  },
41
36
  title: e,
42
37
  type: "button"
43
- }), n > 0 ? /* @__PURE__ */ T("span", {
44
- className: A.badge,
38
+ }), n > 0 ? /* @__PURE__ */ D("span", {
39
+ className: j.badge,
45
40
  children: n > 99 ? "99+" : n
46
41
  }) : null]
47
42
  });
48
43
  }
49
44
  //#endregion
50
- export { S as ApprovalInstanceListPage, i as AuthProvider, h as BPMFormField, j as BPMNotificationBellButton, m as BPMRoutesProvider, C as DashboardPage, x as MemberPicker, c as NotificationDrawer, o as NotificationDrawerProvider, u as NotificationUnreadProvider, v as OrgUnitPicker, b as PositionPicker, d as Providers, n as RouterAdapterProvider, f as createDefaultBPMRoutes, e as defaultBrowserSearchParams, a as formatDateTime, _ as readMemberOption, g as readOrgUnitOption, y as readPositionOption, r as useAuth, O as useBPMLogout, k as useBPMMember, p as useBPMRoutes, l as useNotificationDrawer, s as useNotificationUnread, t as useRouterAdapter };
45
+ export { w as ApprovalInstanceListPage, i as AuthProvider, h as BPMFormField, M as BPMNotificationBellButton, m as BPMRoutesProvider, T as DashboardPage, C as MemberPicker, c as NotificationDrawer, o as NotificationDrawerProvider, u as NotificationUnreadProvider, b as OrgUnitPicker, S as PositionPicker, d as Providers, n as RouterAdapterProvider, f as createDefaultBPMRoutes, e as defaultBrowserSearchParams, a as formatDateTime, _ as isBPMAdminMember, y as readMemberOption, v as readOrgUnitOption, x as readPositionOption, r as useAuth, A as useBPMLogout, g as useBPMMember, p as useBPMRoutes, l as useNotificationDrawer, s as useNotificationUnread, t as useRouterAdapter };
51
46
 
52
47
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/lib/use-bpm-logout.ts","../src/lib/use-bpm-member.ts","../src/components/bpm-notification-bell-button.module.scss","../src/components/bpm-notification-bell-button.tsx"],"sourcesContent":["'use client';\n\nimport { useAuth } from './auth-provider';\n\n/**\n * Drop-in logout handler for host navigation menus. Wraps the BPM auth\n * context's logout flow — calls `logoutApi()` against the BPM REST\n * session endpoint, clears the in-memory member, then redirects to the\n * configured `loginPath`.\n *\n * Hosts mount this on their own logout buttons / menu items so they do\n * not need to touch `useAuth()` directly. To customize the post-logout\n * destination, override the `loginPath` prop on `<BPMNextProviders>` or\n * `<AuthProvider>`.\n */\nexport function useBPMLogout(): () => Promise<void> {\n const { logout } = useAuth();\n return logout;\n}\n","'use client';\n\nimport type { ApiMember } from '@rytass/bpm-core-client';\nimport { useAuth } from './auth-provider';\n\n/**\n * Read the currently authenticated BPM member. Returns `null` when there\n * is no active session — typically only seen on the login page or during\n * the brief loading window before `<AuthProvider>` resolves the cookie.\n *\n * Convenience alias for `useAuth().member` aimed at host navigations\n * (avatar, display name, role-based menu visibility) that should not\n * depend on the broader `useAuth()` surface.\n */\nexport function useBPMMember(): ApiMember | null {\n const { member } = useAuth();\n return member;\n}\n",".root {\n display: inline-flex;\n position: relative;\n}\n\n.badge {\n align-items: center;\n background: #d92d20;\n border: 1px solid #fff;\n border-radius: 999px;\n color: #fff;\n display: inline-flex;\n font-size: 10px;\n font-weight: 600;\n height: 16px;\n justify-content: center;\n line-height: 1;\n min-width: 16px;\n padding: 0 4px;\n pointer-events: none;\n position: absolute;\n right: -4px;\n top: -4px;\n}\n","'use client';\n\nimport type { ReactElement } from 'react';\nimport { NavigationIconButton } from '@mezzanine-ui/react';\nimport { NotificationUnreadIcon } from '@mezzanine-ui/icons';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport styles from './bpm-notification-bell-button.module.scss';\n\nexport interface BPMNotificationBellButtonProps {\n /** Override the aria-label / tooltip. Defaults to `通知中心`. */\n readonly label?: string;\n}\n\n/**\n * Drop-in notification bell. Reads the unread count from\n * `<NotificationUnreadProvider>`, opens the BPM `<NotificationDrawer />`\n * mounted by `<Providers>` (or `<BPMNextProviders>`) on click, and\n * renders a small red badge with the unread count.\n *\n * Use this when the host navigation wants the BPM notification UX with\n * minimum wiring. Hosts that need a fully custom button can skip this\n * widget and consume `useNotificationDrawer()` + `useNotificationUnread()`\n * directly to wire their own trigger.\n *\n * Visual: uses Mezzanine `NavigationIconButton` so the bell aligns with\n * surrounding Mezzanine navigation chrome. The button is decoupled from\n * the `<Navigation>` container — it does not require a Mezzanine\n * navigation tree to render.\n */\nexport function BPMNotificationBellButton({\n label = '通知中心',\n}: BPMNotificationBellButtonProps = {}): ReactElement {\n const { open } = useNotificationDrawer();\n const { unreadCount } = useNotificationUnread();\n const ariaLabel = unreadCount > 0 ? `${label},${unreadCount} 則未讀` : label;\n return (\n <span className={styles.root}>\n <NavigationIconButton\n aria-label={ariaLabel}\n icon={NotificationUnreadIcon}\n onClick={(): void => {\n open();\n }}\n title={label}\n type=\"button\"\n />\n {unreadCount > 0 ? (\n <span className={styles.badge}>\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n ) : null}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,IAAoC;CAClD,IAAM,EAAE,cAAW,EAAQ;CAC3B,OAAO;AACT;;;ACJA,SAAgB,IAAiC;CAC/C,IAAM,EAAE,cAAW,EAAQ;CAC3B,OAAO;AACT;;;;;;;AEaA,SAAgB,EAA0B,EACxC,WAAQ,WAC0B,CAAC,GAAiB;CACpD,IAAM,EAAE,YAAS,EAAsB,GACjC,EAAE,mBAAgB,EAAsB,GACxC,IAAY,IAAc,IAAI,GAAG,EAAM,GAAG,EAAY,QAAQ;CACpE,OACE,kBAAC,QAAD;EAAM,WAAW,EAAO;EAAxB,UAAA,CACE,kBAAC,GAAD;GACE,cAAY;GACZ,MAAM;GACN,eAAqB;IACnB,EAAK;GACP;GACA,OAAO;GACP,MAAK;EACN,CAAA,GACA,IAAc,IACb,kBAAC,QAAD;GAAM,WAAW,EAAO;GACrB,UAAA,IAAc,KAAK,QAAQ;EACxB,CAAA,IACJ,IACA;;AAEV"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lib/use-bpm-logout.ts","../src/components/bpm-notification-bell-button.module.scss","../src/components/bpm-notification-bell-button.tsx"],"sourcesContent":["'use client';\n\nimport { useAuth } from './auth-provider';\n\n/**\n * Drop-in logout handler for host navigation menus. Wraps the BPM auth\n * context's logout flow — calls `logoutApi()` against the BPM REST\n * session endpoint, clears the in-memory member, then redirects to the\n * configured `loginPath`.\n *\n * Hosts mount this on their own logout buttons / menu items so they do\n * not need to touch `useAuth()` directly. To customize the post-logout\n * destination, override the `loginPath` prop on `<BPMNextProviders>` or\n * `<AuthProvider>`.\n */\nexport function useBPMLogout(): () => Promise<void> {\n const { logout } = useAuth();\n return logout;\n}\n",".root {\n display: inline-flex;\n position: relative;\n}\n\n.badge {\n align-items: center;\n background: #d92d20;\n border: 1px solid #fff;\n border-radius: 999px;\n color: #fff;\n display: inline-flex;\n font-size: 10px;\n font-weight: 600;\n height: 16px;\n justify-content: center;\n line-height: 1;\n min-width: 16px;\n padding: 0 4px;\n pointer-events: none;\n position: absolute;\n right: -4px;\n top: -4px;\n}\n","'use client';\n\nimport type { ReactElement } from 'react';\nimport { NavigationIconButton } from '@mezzanine-ui/react';\nimport { NotificationUnreadIcon } from '@mezzanine-ui/icons';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport styles from './bpm-notification-bell-button.module.scss';\n\nexport interface BPMNotificationBellButtonProps {\n /** Override the aria-label / tooltip. Defaults to `通知中心`. */\n readonly label?: string;\n}\n\n/**\n * Drop-in notification bell. Reads the unread count from\n * `<NotificationUnreadProvider>`, opens the BPM `<NotificationDrawer />`\n * mounted by `<Providers>` (or `<BPMNextProviders>`) on click, and\n * renders a small red badge with the unread count.\n *\n * Use this when the host navigation wants the BPM notification UX with\n * minimum wiring. Hosts that need a fully custom button can skip this\n * widget and consume `useNotificationDrawer()` + `useNotificationUnread()`\n * directly to wire their own trigger.\n *\n * Visual: uses Mezzanine `NavigationIconButton` so the bell aligns with\n * surrounding Mezzanine navigation chrome. The button is decoupled from\n * the `<Navigation>` container — it does not require a Mezzanine\n * navigation tree to render.\n */\nexport function BPMNotificationBellButton({\n label = '通知中心',\n}: BPMNotificationBellButtonProps = {}): ReactElement {\n const { open } = useNotificationDrawer();\n const { unreadCount } = useNotificationUnread();\n const ariaLabel = unreadCount > 0 ? `${label},${unreadCount} 則未讀` : label;\n return (\n <span className={styles.root}>\n <NavigationIconButton\n aria-label={ariaLabel}\n icon={NotificationUnreadIcon}\n onClick={(): void => {\n open();\n }}\n title={label}\n type=\"button\"\n />\n {unreadCount > 0 ? (\n <span className={styles.badge}>\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n ) : null}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAgB,IAAoC;CAClD,IAAM,EAAE,cAAW,EAAQ;CAC3B,OAAO;AACT;;;;;;;AEYA,SAAgB,EAA0B,EACxC,WAAQ,WAC0B,CAAC,GAAiB;CACpD,IAAM,EAAE,YAAS,EAAsB,GACjC,EAAE,mBAAgB,EAAsB,GACxC,IAAY,IAAc,IAAI,GAAG,EAAM,GAAG,EAAY,QAAQ;CACpE,OACE,kBAAC,QAAD;EAAM,WAAW,EAAO;EAAxB,UAAA,CACE,kBAAC,GAAD;GACE,cAAY;GACZ,MAAM;GACN,eAAqB;IACnB,EAAK;GACP;GACA,OAAO;GACP,MAAK;EACN,CAAA,GACA,IAAc,IACb,kBAAC,QAAD;GAAM,WAAW,EAAO;GACrB,UAAA,IAAc,KAAK,QAAQ;EACxB,CAAA,IACJ,IACA;;AAEV"}
@@ -78,6 +78,8 @@ export interface BPMRoutes {
78
78
  adminUsers(): string;
79
79
  /** Admin: delegation rule management. */
80
80
  adminDelegations(): string;
81
+ /** Admin: database-managed notify webhook endpoints (ADR 18). */
82
+ adminWebhookEndpoints(): string;
81
83
  }
82
84
  /**
83
85
  * Factory for the default `BPMRoutes` value. Reproduces the exact path
@@ -9,3 +9,9 @@ import { ApiMember } from '@rytass/bpm-core-client';
9
9
  * depend on the broader `useAuth()` surface.
10
10
  */
11
11
  export declare function useBPMMember(): ApiMember | null;
12
+ /**
13
+ * Whether the member passes the server's `@BPMAdminOnly()` check — the
14
+ * `BPM_ADMIN` role or one of the administrator permissions. Use it to decide
15
+ * whether to show administrator-only UI; the server still enforces access.
16
+ */
17
+ export declare function isBPMAdminMember(member: Pick<ApiMember, 'permissions' | 'roles'> | null): boolean;
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../chunks/router-adapter--gYs13E8.cjs"),t=require("../chunks/providers-BsEn3ikK.cjs"),n=require("../chunks/routes-config-fDVHmvXi.cjs");let r=require("react"),i=require("react/jsx-runtime"),a=require("next/navigation");function o({children:n,locale:o,publicPaths:s,loginPath:c}){let l=(0,a.useRouter)(),u=(0,a.usePathname)(),d=(0,r.useMemo)(()=>({pathname:u,push:e=>l.push(e),replace:e=>l.replace(e),back:()=>l.back(),searchParams:()=>e.n()}),[l,u]);return(0,i.jsx)(e.t,{value:d,children:(0,i.jsx)(t.t,{locale:o,publicPaths:s,loginPath:c,children:n})})}exports.BPMNextProviders=o,exports.BPMRoutesProvider=n.t,exports.createDefaultBPMRoutes=n.n,exports.useBPMRoutes=n.r;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../chunks/router-adapter--gYs13E8.cjs"),t=require("../chunks/providers-DHtDZFNA.cjs"),n=require("../chunks/routes-config-C1j_vFKo.cjs");let r=require("react"),i=require("react/jsx-runtime"),a=require("next/navigation");function o({children:n,locale:o,publicPaths:s,loginPath:c}){let l=(0,a.useRouter)(),u=(0,a.usePathname)(),d=(0,r.useMemo)(()=>({pathname:u,push:e=>l.push(e),replace:e=>l.replace(e),back:()=>l.back(),searchParams:()=>e.n()}),[l,u]);return(0,i.jsx)(e.t,{value:d,children:(0,i.jsx)(t.t,{locale:o,publicPaths:s,loginPath:c,children:n})})}exports.BPMNextProviders=o,exports.BPMRoutesProvider=n.t,exports.createDefaultBPMRoutes=n.n,exports.useBPMRoutes=n.r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { n as e, t } from "../chunks/router-adapter-DftlFTOd.js";
3
- import { t as n } from "../chunks/providers-DjLh4oLY.js";
4
- import { n as r, r as i, t as a } from "../chunks/routes-config-RBYQtUd0.js";
3
+ import { t as n } from "../chunks/providers-J5eyByQj.js";
4
+ import { n as r, r as i, t as a } from "../chunks/routes-config-yZbESPlw.js";
5
5
  import { useMemo as o } from "react";
6
6
  import { jsx as s } from "react/jsx-runtime";
7
7
  import { usePathname as c, useRouter as l } from "next/navigation";
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/delegations-Bc9psOZ3.cjs");let t=require("react/jsx-runtime");var n={title:`代理設定 | BPM Admin`,description:`設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/delegations-DlYwMiAW.cjs");let t=require("react/jsx-runtime");var n={title:`代理設定 | BPM Admin`,description:`設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/delegations-0MbJ7CWj.js";
1
+ import { t as e } from "../../../chunks/delegations-B8gLSt0i.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/admin/delegations/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/orgs-Bz8hBMoQ.cjs");let t=require("react/jsx-runtime");var n={title:`組織管理 | BPM Admin`,description:`維護組織樹、職位、會員歸屬與簽核主管解析規則。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/orgs-D0-5BaHT.cjs");let t=require("react/jsx-runtime");var n={title:`組織管理 | BPM Admin`,description:`維護組織樹、職位、會員歸屬與簽核主管解析規則。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/orgs-Cr_7zsAD.js";
1
+ import { t as e } from "../../../chunks/orgs-BpqVu5ka.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/admin/orgs/index.tsx
4
4
  var n = {
@@ -0,0 +1,2 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../views/admin/webhook-endpoints/index.cjs");let t=require("react/jsx-runtime");var n={title:`Webhook 端點 | BPM Admin`,description:`維護知會節點可呼叫的外部系統端點。`};function r(){return(0,t.jsx)(e.AdminWebhookEndpointsView,{})}exports.default=r,exports.metadata=n;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/pages/admin/webhook-endpoints/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { AdminWebhookEndpointsView } from '../../../views/admin/webhook-endpoints';\n\nexport const metadata: Metadata = {\n title: 'Webhook 端點 | BPM Admin',\n description: '維護知會節點可呼叫的外部系統端點。',\n};\n\nexport default function AdminWebhookEndpointsPage(): ReactElement {\n return <AdminWebhookEndpointsView />;\n}\n"],"mappings":"sMAIA,IAAa,EAAqB,CAChC,MAAO,yBACP,YAAa,mBACf,EAEA,SAAwB,GAA0C,CAChE,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,0BAAD,CAA4B,CAAA,CACrC"}
@@ -0,0 +1,4 @@
1
+ import { Metadata } from 'next';
2
+ import { ReactElement } from 'react';
3
+ export declare const metadata: Metadata;
4
+ export default function AdminWebhookEndpointsPage(): ReactElement;
@@ -0,0 +1,14 @@
1
+ import { AdminWebhookEndpointsView as e } from "../../../views/admin/webhook-endpoints/index.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/pages/admin/webhook-endpoints/index.tsx
4
+ var n = {
5
+ title: "Webhook 端點 | BPM Admin",
6
+ description: "維護知會節點可呼叫的外部系統端點。"
7
+ };
8
+ function r() {
9
+ return /* @__PURE__ */ t(e, {});
10
+ }
11
+ //#endregion
12
+ export { r as default, n as metadata };
13
+
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/admin/webhook-endpoints/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { AdminWebhookEndpointsView } from '../../../views/admin/webhook-endpoints';\n\nexport const metadata: Metadata = {\n title: 'Webhook 端點 | BPM Admin',\n description: '維護知會節點可呼叫的外部系統端點。',\n};\n\nexport default function AdminWebhookEndpointsPage(): ReactElement {\n return <AdminWebhookEndpointsView />;\n}\n"],"mappings":";;;AAIA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwB,IAA0C;CAChE,OAAO,kBAAC,GAAD,CAA4B,CAAA;AACrC"}
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/delegations-vpLtus9g.cjs");let t=require("react/jsx-runtime");var n={title:`我的代理 | BPM Admin`,description:`設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/delegations-8LsxcQM4.cjs");let t=require("react/jsx-runtime");var n={title:`我的代理 | BPM Admin`,description:`設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/delegations-DyMGIDpp.js";
1
+ import { t as e } from "../../chunks/delegations-DRupxJ4_.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/delegations/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/detail-Dnz5aaI-.cjs");let t=require("react/jsx-runtime");var n={title:`案件詳情 | BPM Admin`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{instanceId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/detail-Db-UOELp.cjs");let t=require("react/jsx-runtime");var n={title:`案件詳情 | BPM Admin`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{instanceId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/detail-BgKgMvYx.js";
1
+ import { t as e } from "../../../chunks/detail-pYEIk-jW.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/instances/detail/index.tsx
4
4
  var n = { title: "案件詳情 | BPM Admin" };
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/login-9bCXyjbX.cjs");let t=require("react/jsx-runtime");var n={title:`Login | BPM Admin`,description:`Sign in to the BPM approval workflow administration console.`};async function r({searchParams:n}){let{next:r}=await n;return(0,t.jsx)(e.t,{defaultNextPath:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/login-AtVxZBsC.cjs");let t=require("react/jsx-runtime");var n={title:`Login | BPM Admin`,description:`Sign in to the BPM approval workflow administration console.`};async function r({searchParams:n}){let{next:r}=await n;return(0,t.jsx)(e.t,{defaultNextPath:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/login-BKxpLibd.js";
1
+ import { t as e } from "../../chunks/login-C6qlTC6F.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/login/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/compose-DzRYZcqe.cjs");let t=require("react/jsx-runtime"),n=require("next/server");var r={title:`建立模板(表單 + 流程) | BPM Admin`,description:`以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。`};async function i(){return await(0,n.connection)(),(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`})}exports.default=i,exports.metadata=r;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/compose-BnSRL4ml.cjs");let t=require("react/jsx-runtime"),n=require("next/server");var r={title:`建立模板(表單 + 流程) | BPM Admin`,description:`以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。`};async function i(){return await(0,n.connection)(),(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`})}exports.default=i,exports.metadata=r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/compose-Bb-REfoB.js";
1
+ import { t as e } from "../../../chunks/compose-6P64PO1i.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { connection as n } from "next/server";
4
4
  //#region src/pages/templates/compose/index.tsx
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/designer-gFUdImeZ.cjs");let t=require("react/jsx-runtime");var n={title:`流程設計器 | BPM Admin`,description:`以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`,showDryRun:process.env.BPM_TEMPLATE_DRY_RUN_ENABLED!==`false`,templateId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/designer-_g58R6rQ.cjs");let t=require("react/jsx-runtime");var n={title:`流程設計器 | BPM Admin`,description:`以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`,showDryRun:process.env.BPM_TEMPLATE_DRY_RUN_ENABLED!==`false`,templateId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/designer-C6oIO9Kq.js";
1
+ import { t as e } from "../../../chunks/designer-C3s2kSna.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/templates/designer/index.tsx
4
4
  var n = {
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#777;--xy-background-pattern-lines-color-default:#777;--xy-background-pattern-cross-color-default:#777;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}
1
+ .react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#555;--xy-background-pattern-lines-color-default:#333;--xy-background-pattern-cross-color-default:#333;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-Bc9psOZ3.cjs");exports.AdminDelegationsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-DlYwMiAW.cjs");exports.AdminDelegationsView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../chunks/delegations-0MbJ7CWj.js";
1
+ import { t as e } from "../../../chunks/delegations-B8gLSt0i.js";
2
2
  export { e as AdminDelegationsView };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-C9LA-Rd7.cjs"),t=require("../../chunks/orgs-Bz8hBMoQ.cjs"),n=require("../../chunks/delegations-Bc9psOZ3.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-C9LA-Rd7.cjs"),t=require("../../chunks/orgs-D0-5BaHT.cjs"),n=require("../../chunks/delegations-DlYwMiAW.cjs"),r=require("./webhook-endpoints/index.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t,exports.AdminWebhookEndpointsView=r.AdminWebhookEndpointsView;
@@ -1,3 +1,4 @@
1
1
  export * from './users';
2
2
  export * from './orgs';
3
3
  export * from './delegations';
4
+ export * from './webhook-endpoints';
@@ -1,4 +1,5 @@
1
1
  import { t as e } from "../../chunks/users-FWrb3ehW.js";
2
- import { t } from "../../chunks/orgs-Cr_7zsAD.js";
3
- import { t as n } from "../../chunks/delegations-0MbJ7CWj.js";
4
- export { n as AdminDelegationsView, t as AdminOrgsView, e as AdminUsersView };
2
+ import { t } from "../../chunks/orgs-BpqVu5ka.js";
3
+ import { t as n } from "../../chunks/delegations-B8gLSt0i.js";
4
+ import { AdminWebhookEndpointsView as r } from "./webhook-endpoints/index.js";
5
+ export { n as AdminDelegationsView, t as AdminOrgsView, e as AdminUsersView, r as AdminWebhookEndpointsView };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-Bz8hBMoQ.cjs");exports.AdminOrgsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-D0-5BaHT.cjs");exports.AdminOrgsView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../chunks/orgs-Cr_7zsAD.js";
1
+ import { t as e } from "../../../chunks/orgs-BpqVu5ka.js";
2
2
  export { e as AdminOrgsView };
@@ -0,0 +1,8 @@
1
+ import { ReactElement } from 'react';
2
+ /**
3
+ * Back-office management of database webhook endpoints (ADR 18 §3.13):
4
+ * create, edit, disable, rotate the signing secret, test-send and read the
5
+ * change history. Header values and secrets are entered here and never shown
6
+ * again. Administrator-only on the server.
7
+ */
8
+ export declare function AdminWebhookEndpointsView(): ReactElement;
@@ -0,0 +1,2 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../../chunks/format-date-time-D-cx5M8z.cjs"),n=require("../../../chunks/bpm-form-field-Bc6k4ZEO.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("react/jsx-runtime"),o=require("@mezzanine-ui/react/ContentHeader");o=e.t(o,1);let s=require("@mezzanine-ui/icons"),c=require("@rytass/bpm-core-client/template");var l={display:`grid`,gap:`var(--mzn-spacing-gap-base)`},u={alignItems:`center`,display:`grid`,gap:`var(--mzn-spacing-gap-base)`,gridTemplateColumns:`minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) auto auto`},d={alignItems:`center`,display:`grid`,gap:`var(--mzn-spacing-gap-base)`,gridTemplateColumns:`minmax(0, 1fr) minmax(0, 2fr) auto`},f=[{id:`POST`,name:`POST`},{id:`PUT`,name:`PUT`},{id:`PATCH`,name:`PATCH`}],p=[{id:`string`,name:`文字`},{id:`number`,name:`數字`},{id:`boolean`,name:`是/否`},{id:`stringArray`,name:`文字清單`},{id:`json`,name:`JSON`}],m={CREATED:`建立`,DISABLED:`停用`,ENABLED:`啟用`,SECRET_ROTATED:`輪替金鑰`,TEST_SENT:`測試送出`,UPDATED:`更新`},h={deprecated:!1,description:``,endpointId:null,headers:[],key:``,label:``,method:`POST`,mode:`create`,originalUrl:``,parameters:[],replaceHeaders:!0,signingSecret:``,timeoutMs:``,url:``,version:`1`};function g(){let[e,u]=(0,r.useState)(null),[d,f]=(0,r.useState)([]),[p,m]=(0,r.useState)(!0),[g,S]=(0,r.useState)(null),[w,T]=(0,r.useState)(null),[E,D]=(0,r.useState)(null),[O,k]=(0,r.useState)(!1),[A,j]=(0,r.useState)(null),[M,N]=(0,r.useState)(``),[P,F]=(0,r.useState)(!1),[I,L]=(0,r.useState)(null),R=(0,r.useCallback)(async()=>{m(!0);try{let e=await(0,c.readWorkflowWebhookEndpointManagement)();u(e),f(e.enabled?await(0,c.listWorkflowWebhookManagedEndpoints)():[]),S(null)}catch(e){S(C(e))}finally{m(!1)}},[]);(0,r.useEffect)(()=>{R()},[R]);let z=(0,r.useCallback)(async e=>{S(null),T(null);try{return T(await e()),await R(),!0}catch(e){return S(C(e)),!1}},[R]),B=(0,r.useMemo)(()=>d.map(e=>({endpoint:e,key:e.id})),[d]),V=(0,r.useMemo)(()=>[{key:`label`,render:({endpoint:e})=>(0,a.jsxs)(`div`,{style:l,children:[(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:e.label}),(0,a.jsxs)(i.Typography,{color:`text-neutral`,component:`span`,variant:`caption`,children:[e.key,`@`,e.version,` · 參數`,` `,e.parameters.length,` 個`]})]}),title:`端點`,width:240},{key:`url`,render:({endpoint:e})=>(0,a.jsxs)(i.Typography,{component:`span`,variant:`body`,children:[e.method,` `,e.url]}),title:`URL`,width:320},{key:`status`,render:({endpoint:e})=>e.active?e.deprecated?(0,a.jsx)(i.Badge,{size:`sub`,text:`不建議使用`,variant:`dot-warning`}):(0,a.jsx)(i.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):(0,a.jsx)(i.Badge,{size:`sub`,text:`已停用`,variant:`dot-inactive`}),title:`狀態`,width:120},{key:`credentials`,render:({endpoint:e})=>(0,a.jsxs)(`div`,{style:l,children:[(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:e.hasSigningSecret?`已設定簽章金鑰`:`未簽章`}),(0,a.jsx)(i.Typography,{color:`text-neutral`,component:`span`,variant:`caption`,children:e.headerNames.length?`Header:${e.headerNames.join(`、`)}`:`沒有自訂 header`})]}),title:`憑證`,width:200},{key:`updatedAt`,render:({endpoint:e})=>(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:t.t(e.updatedAt)}),title:`更新時間`,width:180}],[]),H=(0,r.useMemo)(()=>({render:({endpoint:e})=>[{name:`編輯`,onClick:()=>D(y(e,`edit`))},{name:`建立新版本`,onClick:()=>D(y(e,`version`))},{name:`測試送出`,onClick:()=>{z(async()=>b(e,await(0,c.testWorkflowWebhookEndpoint)(e.id)))}},{name:`輪替金鑰`,onClick:()=>{N(``),F(!1),j(e)}},{name:e.active?`停用`:`啟用`,onClick:()=>{z(async()=>(await(0,c.setWorkflowWebhookEndpointActive)(e.id,!e.active),`已${e.active?`停用`:`啟用`}「${e.label}」。`))}},{name:`異動紀錄`,onClick:()=>{(0,c.listWorkflowWebhookEndpointAudits)(e.id).then(t=>L({endpoint:e,records:t})).catch(e=>S(C(e)))}}],variant:`base-secondary`,width:180}),[z]);async function U(){if(!E)return;k(!0);let e=await z(async()=>{let e=E.parameters.map(e=>({description:e.description.trim()||null,key:e.key.trim(),label:e.label.trim(),required:e.required,type:e.type})),t=E.headers.filter(e=>e.name.trim()).map(e=>({name:e.name.trim(),value:e.value})),n=E.timeoutMs.trim()?Number(E.timeoutMs):null;return E.mode===`edit`&&E.endpointId?(await(0,c.updateWorkflowWebhookEndpoint)({deprecated:E.deprecated,description:E.description,headers:E.replaceHeaders||x(E)?t:null,id:E.endpointId,label:E.label,method:E.method,parameters:e,timeoutMs:n,url:E.url}),`已更新「${E.label}」。`):(await(0,c.createWorkflowWebhookEndpoint)({deprecated:E.deprecated,description:E.description,headers:t,key:E.key,label:E.label,method:E.method,parameters:e,signingSecret:E.signingSecret||null,timeoutMs:n,url:E.url,version:Number(E.version)}),`已建立「${E.label}」v${E.version},設計器現在可以選用。`)});k(!1),e&&D(null)}async function W(){if(!A)return;let e=A;await z(async()=>(await(0,c.rotateWorkflowWebhookEndpointSecret)(e.id,P?null:M),P?`已移除「${e.label}」的簽章金鑰,之後的請求不再簽章。`:`已輪替「${e.label}」的簽章金鑰,接收端需改用新金鑰驗簽。`))&&(j(null),N(``))}let G=!!e?.enabled;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.PageHeader,{children:(0,a.jsx)(o.default,{description:`維護知會節點可呼叫的外部系統端點。Header 值與簽章金鑰加密保存,儲存後不會再顯示。`,title:`Webhook 端點`,children:(0,a.jsx)(i.Button,{disabled:!G,icon:s.PlusIcon,iconType:`leading`,onClick:()=>D(h),variant:`base-primary`,children:`新增端點`})})}),(0,a.jsx)(i.SectionGroup,{children:(0,a.jsx)(i.Section,{children:(0,a.jsxs)(`div`,{style:l,children:[g?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:g}):null,w?(0,a.jsx)(i.Typography,{color:`text-success`,variant:`body`,children:w}):null,e&&!G?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`此伺服器未啟用後台維護的 Webhook 端點:需要設定 workflowWebhookTargetSources 含 DATABASE、URL 白名單與加密金鑰。程式註冊的端點不受影響。`}):null,G?(0,a.jsxs)(i.Typography,{color:`text-neutral`,variant:`caption`,children:[`允許的 URL:`,e?.allowedUrlPatterns.join(`、`)]}):null,(0,a.jsx)(i.Table,{actions:H,columns:V,dataSource:B,fullWidth:!0,loading:p})]})})}),E?(0,a.jsx)(v,{draft:E,onCancel:()=>D(null),onChange:D,onConfirm:()=>void U(),saving:O}):null,(0,a.jsx)(i.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!P&&!M},confirmText:P?`移除金鑰`:`輪替金鑰`,modalType:`standard`,onCancel:()=>j(null),onClose:()=>j(null),onConfirm:()=>void W(),open:!!A,showModalFooter:!0,showModalHeader:!0,supportingText:`新金鑰會加密保存,不會再顯示;請同時更新接收端的驗簽金鑰。`,title:`輪替簽章金鑰:${A?.label??``}`,children:(0,a.jsxs)(`div`,{style:l,children:[(0,a.jsx)(n.t,{label:`移除金鑰`,name:`removeSigningSecret`,children:(0,a.jsx)(i.Toggle,{checked:P,onChange:e=>F(e.target.checked)})}),P?null:(0,a.jsx)(n.t,{label:`新金鑰`,name:`nextSigningSecret`,required:!0,children:(0,a.jsx)(i.Input,{onChange:e=>N(e.target.value),value:M,inputProps:{autoComplete:`new-password`},variant:`password`})})]})}),(0,a.jsx)(i.Modal,{confirmText:`關閉`,modalType:`standard`,onClose:()=>L(null),onConfirm:()=>L(null),open:!!I,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:`只記錄誰在何時變更了哪些欄位,不記錄任何值。`,title:`異動紀錄:${I?.endpoint.label??``}`,children:(0,a.jsx)(i.Table,{columns:_,dataSource:(I?.records??[]).map(e=>({audit:e,key:e.id})),fullWidth:!0})})]})}var _=[{key:`createdAt`,render:({audit:e})=>(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:t.t(e.createdAt)}),title:`時間`,width:180},{key:`action`,render:({audit:e})=>(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:m[e.action]}),title:`動作`,width:120},{key:`changedFields`,render:({audit:e})=>(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:e.changedFields.join(`、`)||`—`}),title:`欄位`,width:280},{key:`actor`,render:({audit:e})=>(0,a.jsx)(i.Typography,{component:`span`,variant:`body`,children:e.actorMemberId??`系統`}),title:`操作者`,width:160}];function v({draft:e,onCancel:t,onChange:r,onConfirm:o,saving:c}){let m=e.mode===`edit`,h=x(e),g=e.replaceHeaders||h,_=t=>r({...e,...t}),v=(t,n)=>_({parameters:e.parameters.map((e,r)=>r===t?{...e,...n}:e)}),y=(t,n)=>_({headers:e.headers.map((e,r)=>r===t?{...e,...n}:e)}),b=e=>t=>_({[e]:t.target.value});return(0,a.jsx)(i.Modal,{cancelText:`取消`,confirmText:m?`儲存`:`建立`,loading:c,modalType:`standard`,onCancel:t,onClose:t,onConfirm:o,open:!0,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:m?`參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。`:e.mode===`version`?`新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。`:`URL 需符合伺服器設定的白名單。`,title:m?`編輯端點:${e.label}`:e.mode===`version`?`建立新版本:${e.key}`:`新增 Webhook 端點`,children:(0,a.jsxs)(`div`,{style:l,children:[(0,a.jsx)(n.t,{label:`Key`,name:`endpointKey`,required:!0,children:(0,a.jsx)(i.Input,{...e.mode===`create`?{}:{readonly:!0},onChange:b(`key`),placeholder:`例如 crm.lead-created`,value:e.key,inputProps:{autoComplete:`off`},variant:`base`})}),(0,a.jsx)(n.t,{label:`版本`,name:`endpointVersion`,required:!0,children:(0,a.jsx)(i.Input,{...m?{readonly:!0}:{},inputProps:{autoComplete:`off`,inputMode:`numeric`},onChange:b(`version`),value:e.version,variant:`base`})}),(0,a.jsx)(n.t,{label:`名稱`,name:`endpointLabel`,required:!0,children:(0,a.jsx)(i.Input,{onChange:b(`label`),placeholder:`例如 CRM 建立名單`,value:e.label,inputProps:{autoComplete:`off`},variant:`base`})}),(0,a.jsx)(n.t,{label:`說明`,name:`endpointDescription`,children:(0,a.jsx)(i.Textarea,{onChange:b(`description`),rows:2,value:e.description})}),(0,a.jsx)(n.t,{label:`URL`,name:`endpointUrl`,required:!0,children:(0,a.jsx)(i.Input,{onChange:b(`url`),placeholder:`https://`,value:e.url,inputProps:{autoComplete:`off`},variant:`base`})}),(0,a.jsx)(n.t,{label:`Method`,name:`endpointMethod`,required:!0,children:(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>_({method:e?.id??`POST`}),options:[...f],value:f.find(t=>t.id===e.method)??null})}),(0,a.jsx)(n.t,{hintText:`留空使用預設 10 秒,上限 30000 毫秒。`,label:`逾時(毫秒)`,name:`endpointTimeout`,children:(0,a.jsx)(i.Input,{inputProps:{autoComplete:`off`,inputMode:`numeric`},onChange:b(`timeoutMs`),value:e.timeoutMs,variant:`base`})}),(0,a.jsx)(n.t,{label:`不建議使用`,name:`endpointDeprecated`,children:(0,a.jsx)(i.Toggle,{checked:e.deprecated,onChange:e=>_({deprecated:e.target.checked})})}),m?null:(0,a.jsx)(n.t,{hintText:`選填;設定後 BPM 以 HMAC-SHA256 簽章,儲存後不會再顯示。`,label:`簽章金鑰`,name:`endpointSigningSecret`,children:(0,a.jsx)(i.Input,{onChange:b(`signingSecret`),placeholder:`選填,儲存後不再顯示`,value:e.signingSecret,inputProps:{autoComplete:`new-password`},variant:`password`})}),(0,a.jsx)(i.Typography,{variant:`label-primary-highlight`,children:`Headers`}),m?(0,a.jsx)(n.t,{hintText:h?`URL 已改到其他主機,必須重新輸入 header(留空代表不帶任何 header)。`:`現有 header 的值不會顯示;開啟後以下列內容取代全部 header。`,label:`取代 headers`,name:`endpointReplaceHeaders`,children:(0,a.jsx)(i.Toggle,{checked:g,disabled:h,onChange:e=>_({replaceHeaders:e.target.checked})})}):null,g?e.headers.map((t,n)=>(0,a.jsxs)(`div`,{style:d,children:[(0,a.jsx)(i.Input,{onChange:e=>y(n,{name:e.target.value}),placeholder:`名稱,例如 Authorization`,inputProps:{autoComplete:`off`},value:t.name,variant:`base`}),(0,a.jsx)(i.Input,{onChange:e=>y(n,{value:e.target.value}),placeholder:`值`,value:t.value,inputProps:{autoComplete:`new-password`},variant:`password`}),(0,a.jsx)(i.Button,{icon:s.TrashIcon,iconType:`icon-only`,onClick:()=>_({headers:e.headers.filter((e,t)=>t!==n)}),variant:`destructive-text-link`,children:`移除 header`})]},n)):null,g?(0,a.jsx)(`div`,{children:(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>_({headers:[...e.headers,{name:``,value:``}]}),variant:`base-dashed`,children:`新增 header`})}):null,(0,a.jsx)(i.Typography,{variant:`label-primary-highlight`,children:`參數`}),e.parameters.map((t,n)=>(0,a.jsxs)(`div`,{style:u,children:[(0,a.jsx)(i.Input,{...m?{readonly:!0}:{},onChange:e=>v(n,{key:e.target.value}),placeholder:`參數鍵`,inputProps:{autoComplete:`off`},value:t.key,variant:`base`}),(0,a.jsx)(i.Input,{onChange:e=>v(n,{label:e.target.value}),placeholder:`顯示名稱`,inputProps:{autoComplete:`off`},value:t.label,variant:`base`}),(0,a.jsx)(i.Select,{clearable:!1,disabled:m,onChange:e=>v(n,{type:S(e?.id??null)}),options:[...p],value:p.find(e=>e.id===t.type)??null}),(0,a.jsx)(i.Toggle,{checked:t.required,disabled:m,label:`必填`,onChange:e=>v(n,{required:e.target.checked})}),(0,a.jsx)(i.Button,{disabled:m,icon:s.TrashIcon,iconType:`icon-only`,onClick:()=>_({parameters:e.parameters.filter((e,t)=>t!==n)}),variant:`destructive-text-link`,children:`移除參數`})]},n)),m?null:(0,a.jsx)(`div`,{children:(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>_({parameters:[...e.parameters,{description:``,key:``,label:``,required:!1,type:`string`}]}),variant:`base-dashed`,children:`新增參數`})})]})})}function y(e,t){return{deprecated:e.deprecated,description:e.description??``,endpointId:t===`edit`?e.id:null,headers:[],key:e.key,label:e.label,method:e.method,mode:t,originalUrl:e.url,parameters:e.parameters.map(e=>({description:e.description??``,key:e.key,label:e.label,required:e.required,type:e.type})),replaceHeaders:t===`version`,signingSecret:``,timeoutMs:e.timeoutMs?String(e.timeoutMs):``,url:e.url,version:String(t===`version`?e.version+1:e.version)}}function b(e,t){if(t.ok)return`測試送出成功:「${e.label}」回應 HTTP ${t.status??``}。`;throw Error(`測試送出失敗:「${e.label}」${t.status?`回應 HTTP ${t.status}`:``}(${t.errorCode??`未知錯誤`})${t.errorDetail?`:${t.errorDetail}`:``}`)}function x(e){if(e.mode!==`edit`)return!1;let t=e=>{try{return new URL(e.trim()).origin}catch{return e.trim()}};return t(e.url)!==t(e.originalUrl)}function S(e){return p.some(t=>t.id===e)?e:`string`}function C(e){if(!(e instanceof Error))return`發生未知錯誤`;let t=e.message;return t.includes(`WORKFLOW_WEBHOOK_URL_NOT_ALLOWED`)?`URL 不在伺服器允許的白名單內。`:t.includes(`WORKFLOW_WEBHOOK_ENDPOINT_KEY_CONFLICT`)?`這個 Key 已由程式註冊的端點使用,請換一個。`:t.includes(`WORKFLOW_WEBHOOK_ENDPOINT_CONTRACT_CHANGED`)?`參數契約不能修改,請改用「建立新版本」。`:t.includes(`WORKFLOW_WEBHOOK_TEST_RATE_LIMITED`)?`測試送出太頻繁,請稍後再試(每 10 秒一次、10 分鐘最多 5 次)。`:t}exports.AdminWebhookEndpointsView=g;
2
+ //# sourceMappingURL=index.cjs.map