@ketvietlab/ketsuite 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import { serveDeployment } from '@ketvietlab/ketjs';
4
4
  import { ketsuite } from './deployment.js';
5
5
  import { ensureDevelopmentAdmin } from './development.js';
6
6
  import { scaffoldKetsuite } from './scaffold/index.js';
7
- const VERSION = '0.1.13';
7
+ const VERSION = '0.1.14';
8
8
  const HELP = `KetSuite ${VERSION}
9
9
 
10
10
  Usage:
@@ -240,23 +240,24 @@ Các selector này đã có baseline trong `auth.css` và nằm trong `@layer ke
240
240
  Việc đổi công ty/chi nhánh dùng `context-switcher` trên thanh trên. Footer chỉ hiển
241
241
  thị ngữ cảnh hiện tại trong menu tài khoản để giữ hàng systray gọn như KétViệt cũ.
242
242
 
243
- ## Điều hướng hai cấp
243
+ ## Điều hướng phân cấp
244
244
 
245
- Sidebar giờ hai tầng: danh sách ứng dụng, rồi menu bên trong ứng dụng đang mở.
245
+ Sidebar dùng `AppNavigation` của design system: mỗi phân hệ cấp một mở menu con ngay
246
+ bên dưới chính nó. Chỉ một phân hệ mở tại một thời điểm; bấm lại phân hệ đang mở không
247
+ đóng nó. Trạng thái active chỉ nằm trên link con dẫn tới trang hiện tại, không nằm trên
248
+ phân hệ và không dùng badge đếm hay mũi tên trang trí.
246
249
  Cây menu do module khai báo (xem D42) và **đã được lọc trước khi tới CSS** — cái gì
247
250
  chưa cài, hoặc người đang đăng nhập không có quyền gọi, thì không có trong HTML.
248
251
  Không cần CSS ẩn gì cả.
249
252
 
250
253
  | hook | ý nghĩa |
251
254
  | --- | --- |
252
- | `[data-ui="app-switch"]`, `[data-ui="app-current"]` | tên ứng dụng đang mở, trên cùng |
253
- | `[data-ui="app-list"]`, `[data-ui="app-list-title"]` | danh sách ứng dụng nhãn của |
254
- | `[data-ui="app-entry"][data-active]` | một ứng dụng; `true` cái đang mở |
255
- | `[data-ui="app-icon"]`, `[data-ui="app-name"]` | dấu hiệu tên bên trong `app-entry` |
256
- | `[data-ui="menu"]`, `[data-ui="menu-app"]` | menu của ứng dụng đang mở, tên |
257
- | `[data-ui="menu-item"][data-active]` | một mục dẫn tới trang; `true` trang đang xem |
258
- | `[data-ui="menu-section"][open]` | một nhóm — là `<details>`, gập được không cần JavaScript |
259
- | `[data-ui="menu-section-title"]` | `<summary>` của nhóm đó |
255
+ | `[data-ui="app-navigation"]`, `[data-ui="navigation-drawer"]` | cùng một navigation model cho desktop drawer mobile mở từ trái |
256
+ | `[data-ui="navigation-groups"]` | vùng cuộn; headerfooter đứng yên |
257
+ | `[data-ui="navigation-branch"]`, `[data-ui="navigation-branch-trigger"]` | phân hệ hoặc nhóm con thể mở tại chỗ |
258
+ | `[data-ui="navigation-children"]` | menu con, đường kẻ dọc để biểu thị độ sâu |
259
+ | `[data-ui="navigation-item"][data-active="true"]` | link của trang đang xem; đây nơi duy nhất có active |
260
+ | `[data-ui="navigation-trigger"]`, `[data-ui="navigation-backdrop"]` | hamburger mobile vùng click-ra-ngoài để đóng drawer |
260
261
 
261
262
  `[data-ui="nav-item"]` vẫn còn, nhưng chỉ dành cho module khác chèn thêm qua joint
262
263
  `backend:nav.items`. Màn hình không tự sinh ra nó nữa.
@@ -382,22 +383,20 @@ hình vài trăm pixel.
382
383
  Icon Lucide (ISC) được **chép vào** `icons.ts`, không cài package — giống hệt cách
383
384
  theme the domain contract làm. Mỗi module tự chọn tên icon ngữ nghĩa trên bất kỳ `MenuDef` nào;
384
385
  design system sở hữu glyph. Tên app không có glyph thì rơi về monogram (chữ đầu),
385
- tên menu con không có glyph thì rơi về dot; cả hai đều không làm mất dòng.
386
+ tên menu con không có glyph thì chỉ dùng nhãn; cả hai đều không làm mất dòng.
386
387
 
387
388
  `[data-ui="icon"]` mặc định `1em`. Hộp nào cỡ cố định thì tự khai báo cho `<svg>`
388
389
  bên trong đầy hộp — đừng đặt `width:100%` ở mức chung.
389
390
 
390
391
  | hook | ý nghĩa |
391
392
  | --- | --- |
392
- | `[data-ui="sidebar-header"]`, `[data-ui="sidebar-brand"]` | hàng thương hiệu / tên app đang mở |
393
+ | `[data-ui="navigation-header"]`, `[data-ui="navigation-identity"]` | thương hiệu nút đóng drawer |
393
394
  | `[data-ui="sidebar-search"]`, `[data-ui="sidebar-search-input"]` | **tìm menu** (khác ô tìm bản ghi ở control panel) |
394
- | `[data-ui="sidebar-nav"]` | vùng cuộn; brand, search và chân đứng yên |
395
- | `[data-ui="sidebar-section-label"][data-scope="app"]` | nhãn nhóm; `data-scope="app"` là nhãn của app đang mở |
395
+ | `[data-ui="navigation-groups"]` | vùng cuộn; brand, search và chân đứng yên |
396
396
  | `[data-ui="sidebar-empty"]` | không tìm thấy gì |
397
- | `[data-ui="app-entry"][data-active]`, `[data-ui="app-icon"]`, `[data-ui="app-monogram"]` | một app |
398
- | `[data-ui="menu-item-wrap"][data-depth]` | một mục, kèm độ sâu |
399
- | `[data-ui="menu-section-chevron"]`, `[data-ui="menu-section-text"]`, `[data-ui="menu-section-children"]` | nhóm; con đường kẻ dọc bên trái |
400
- | `[data-ui="menu-item"][data-active]`, `[data-ui="menu-icon"]`, `[data-ui="menu-dot"]`, `[data-ui="menu-label"]` | một mục lá; icon do module chọn, dot là fallback |
397
+ | `[data-ui="navigation-item-leading"]`, `[data-ui="app-monogram"]` | icon do module chọn; monogram là fallback của phân hệ |
398
+ | `[data-ui="navigation-branch"][data-level]` | một nhóm độ sâu của nó |
399
+ | `[data-ui="navigation-item"][data-level]` | một link độ sâu của |
401
400
 
402
401
  ## Form và media
403
402
 
@@ -1,6 +1,6 @@
1
- declare var _: ({ navigation: n, lifetime: e }: {
1
+ declare var Gs: ({ navigation: i, lifetime: t }: {
2
2
  lifetime: any;
3
3
  navigation: any;
4
4
  }) => () => void;
5
- export { _ as backendShell };
5
+ export { Gs as backendShell };
6
6
  //# sourceMappingURL=backend-shell.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend-shell.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/backend-shell.mjs"],"names":[],"mappings":"AAC26G,QAAA,IAAonO,CAAC;;;gBAAgH,CAAC;AAAA,OAAM,EAAC,CAAC,IAAI,YAAY,EAAC,CAAC"}
1
+ {"version":3,"file":"backend-shell.d.mts","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/backend/design/client/backend-shell.mjs"],"names":[],"mappings":"AACy1qB,QAAA,IAAspO,EAAE;;;gBAAwI,CAAC;AAAA,OAAM,EAAC,EAAE,IAAI,YAAY,EAAC,CAAC"}
@@ -1,2 +1,2 @@
1
1
  // @ts-nocheck Generated by tools/build-backend-client.mjs — do not edit.
2
- function q(n){let e,t,o=0;async function l(a){let s=a.querySelector("input[type=email]"),d=a.querySelector("[data-email-status]");if(!s||!d)return;e?.abort(),clearTimeout(t);let f=++o,m=s.value.trim(),p=a.querySelector("[data-email-next]"),b=a.querySelector("[data-email-retry]"),y=(u,E)=>{d.textContent=u,p&&(p.disabled=!E),s.setAttribute("aria-invalid",String(!E)),a.dataset.emailAvailable=E?"true":"false"};if(b&&(b.hidden=!0),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(m)){y(m?"Email ch\u01B0a \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng.":"Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.",!1);return}y("\u0110ang ki\u1EC3m tra email\u2026",!1),t=setTimeout(async()=>{e=new AbortController;try{let u=await fetch(a.dataset.emailCheck,{method:"POST",cache:"no-store",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({email:m}),signal:AbortSignal.any([e.signal,AbortSignal.timeout(1e4)])});if(!u.ok)throw new Error("email-check-failed");let E=await u.json();if(f!==o||!a.isConnected)return;if(!E.ok)throw new Error("email-check-failed");y(E.available?"Email c\xF3 th\u1EC3 s\u1EED d\u1EE5ng.":"Email \u0111\xE3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng. Nh\u1EADp email kh\xE1c.",E.available)}catch{if(f!==o||!a.isConnected)return;y("Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\xF2ng th\u1EED l\u1EA1i.",!1),b&&(b.hidden=!1)}},400)}function r(a,s=!1){let d=a.querySelector('select[name="companyId"]'),f=a.querySelector('select[name="branchId"]'),m=a.querySelector('select[name="scopeKind"]')?.value;if(f&&d){s&&(f.value="");for(let u of f.options)u.value&&(u.hidden=u.dataset.companyId!==d.value,u.disabled=u.hidden)}let p=m==="tenant"?"tenant":m==="branch"?`branch:${d?.value}:${f?.value}`:`company:${d?.value}`;for(let u of a.querySelectorAll("[data-assigned-scopes]")){let v=JSON.parse(u.dataset.assignedScopes??"[]").includes(p);u.disabled=u.dataset.roleDisabled==="true"||v;let k=u.closest("[data-role-option]"),H=k?.querySelector("[data-role-assigned]"),A=k?.querySelector("[data-role-description]");H&&(H.hidden=!v),A&&(A.hidden=v),u.disabled&&(u.checked=!1)}let b=d?.closest('[data-ui="form-field"]'),y=f?.closest('[data-ui="form-field"]');b&&(b.hidden=m==="tenant"),y&&(y.hidden=m==="tenant"||m==="company")}function c(){for(let a of document.querySelectorAll("form[data-user-workflow]"))a.dataset.initialized||(a.dataset.initialized="true",r(a),l(a))}document.addEventListener("input",a=>{let s=a.target,d=s.closest("form[data-user-workflow]");if(d&&(s.type==="email"&&l(d),s.matches("[data-role-search]"))){let f=0;for(let p of d.querySelectorAll("[data-role-option]"))p.hidden=!p.textContent?.toLocaleLowerCase("vi").includes(s.value.toLocaleLowerCase("vi")),p.hidden||f++;let m=d.querySelector("[data-role-empty]");m&&(m.hidden=f>0)}},{signal:n}),document.addEventListener("change",a=>{let s=a.target,d=s.closest("form[data-user-workflow]");d&&s.matches('select[name="companyId"],select[name="branchId"],select[name="scopeKind"]')&&r(d,s.matches('select[name="companyId"]'))},{signal:n}),document.addEventListener("click",a=>{let s=a.target;s.matches("[data-email-retry]")&&l(s.closest("form"))},{signal:n}),document.addEventListener("submit",a=>{let s=a.target;s.matches("form[data-user-workflow]")&&s.querySelector("input[type=email]")&&s.dataset.emailAvailable!=="true"&&a.preventDefault()},{signal:n});let i=new MutationObserver(c);return i.observe(document.documentElement,{childList:!0,subtree:!0}),c(),()=>{e?.abort(),clearTimeout(t),i.disconnect()}}var S="ket.backend.theme",M=['[data-ui="search-menu"]','[data-ui="col-config"]','[data-ui="bulk-actions"]','[data-ui="viewer"]','[data-ui="record-more"]'].join(", "),B=globalThis,h=n=>n.target instanceof Element?n.target:null,T=n=>n==="light"||n==="dark"?n:null,P=()=>{try{return T(localStorage.getItem(S))}catch{return null}},K=n=>{try{localStorage.setItem(S,n)}catch{}},C=()=>T(document.documentElement.dataset.theme)??(matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),L=()=>{let n=String(C()==="dark");for(let e of document.querySelectorAll('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]'))e.setAttribute("aria-pressed",n)},N=n=>{let e=P();e&&(document.documentElement.dataset.theme=e),L(),document.addEventListener("click",t=>{let o=h(t)?.closest('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]');if(!o||o.disabled)return;let l=C()==="dark"?"light":"dark";document.documentElement.dataset.theme=l,K(l),L()},{signal:n}),matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{T(document.documentElement.dataset.theme)||L()},{signal:n}),addEventListener("storage",t=>{if(t.key!==S)return;let o=T(t.newValue);o?document.documentElement.dataset.theme=o:delete document.documentElement.dataset.theme,L()},{signal:n})},R=n=>{let e=[...n.querySelectorAll('[data-ui="row-select"]:not(:disabled)')],t=e.filter(l=>l.checked).length,o=n.querySelector('[data-ui="select-all"]');if(o&&(o.checked=e.length>0&&t===e.length,o.indeterminate=t>0&&t<e.length),!t){let l=n.closest('[data-ui="shell"]');for(let r of l?.querySelectorAll('[data-ui="bulk-actions"][open]')??[])r.removeAttribute("open")}},$=(n,e)=>{document.addEventListener("change",t=>{let o=h(t);if(!(o instanceof HTMLInputElement)||!o.matches('[data-ui="select-all"], [data-ui="row-select"]'))return;let l=o.closest('[data-ui="table"]');if(l){if(o.matches('[data-ui="select-all"]'))for(let r of l.querySelectorAll('[data-ui="row-select"]:not(:disabled)'))r.checked=o.checked;R(l)}},{signal:n}),document.addEventListener("click",t=>{if(t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;let o=h(t);if(o?.closest('a, button, input, select, textarea, label, summary, details, [data-ui="select-cell"]'))return;let r=o?.closest('[data-ui="row"][data-row-href]')?.getAttribute("data-row-href");r&&(t.preventDefault(),e.navigate(r))},{signal:n}),document.addEventListener("keydown",t=>{if(t.defaultPrevented||t.key!=="Enter"&&t.key!==" ")return;let o=h(t),r=(o?.matches('[data-ui="row"][data-row-href][tabindex="0"]')?o:null)?.getAttribute("data-row-href");r&&(t.preventDefault(),w(r,e))},{signal:n})},D=()=>[...document.querySelectorAll(`${M}[open]`)],O=n=>{document.addEventListener("click",e=>{let t=h(e)?.closest(M);for(let o of D())o!==t&&!o.contains(t??null)&&o.removeAttribute("open")},{signal:n}),document.addEventListener("keydown",e=>{if(e.key!=="Escape")return;let t=D();if(!t.length)return;let o=document.activeElement?.closest(M),l=o?.open?o:t.at(-1);l?.removeAttribute("open"),l?.querySelector("summary")?.focus(),e.preventDefault()},{signal:n})},U=n=>{document.addEventListener("click",e=>{let t=h(e)?.closest('[data-ui="chrome-search-toggle"]'),o=t?.getAttribute("aria-controls");if(!t||!o)return;let l=document.getElementById(o);!(l instanceof HTMLDialogElement)||l.open||(l.showModal(),t.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>l.querySelector('[data-presentation="modal"] [data-ui="chrome-search-input"]')?.focus()))},{signal:n}),document.addEventListener("cancel",e=>{h(e)?.matches('[data-ui="chrome-search-modal"]')&&e.preventDefault()},{capture:!0,signal:n}),document.addEventListener("close",e=>{let t=h(e);if(!(t instanceof HTMLDialogElement)||!t.matches('[data-ui="chrome-search-modal"]'))return;let o=document.querySelector(`[data-ui="chrome-search-toggle"][aria-controls="${CSS.escape(t.id)}"]`);o?.setAttribute("aria-expanded","false"),o?.focus()},{capture:!0,signal:n})},j=["a[href]","button:not(:disabled)",'input:not(:disabled):not([type="hidden"])',"select:not(:disabled)","textarea:not(:disabled)",'[tabindex]:not([tabindex="-1"])'].join(", "),g=()=>document.querySelector('[data-ui="modal-layer"][data-route-modal="true"]'),I=n=>[...n.querySelectorAll(j)].filter(e=>!e.hidden&&e.getAttribute("aria-hidden")!=="true"&&!e.matches('[data-ui="modal-backdrop"]')),w=(n,e)=>{e.navigate(n)},G=(n,e)=>n.composedPath().some(t=>t instanceof HTMLElement&&t!==e&&t.matches('[data-ui="modal-layer"][data-presentation="dialog"]')),F=n=>{for(let e of n.querySelectorAll('input:not([type="hidden"])'))if(!e.disabled){if(e.type==="checkbox"||e.type==="radio"){if(e.checked!==e.defaultChecked)return!0}else if(e.value!==e.defaultValue)return!0}for(let e of n.querySelectorAll("textarea"))if(!e.disabled&&e.value!==e.defaultValue)return!0;for(let e of n.querySelectorAll("select"))if(!e.disabled){for(let t of e.options)if(t.selected!==t.defaultSelected)return!0}return!1},x=n=>{if(!F(n))return!0;let e=n.getAttribute("data-unsaved-prompt");return e?B.confirm(e):!0},V=(n,e)=>{if(typeof EventSource!="function")return;let t=null,o=null,l=()=>{o?.close(),o=null,t=null},r=()=>{let i=document.querySelector('[data-ui="live-region"][data-stream]');if(i===t)return;l();let a=i instanceof HTMLElement?i.dataset.stream??"":"";if(!a)return;t=i,o=new EventSource(`/_ket/stream/${encodeURIComponent(a)}`);let s=()=>w(location.href,e);o.onmessage=s,o.addEventListener("done",()=>{l(),s()}),o.onerror=()=>{o?.readyState===EventSource.CLOSED&&l()}};r();let c=new MutationObserver(r);return c.observe(document.body,{childList:!0,subtree:!0}),addEventListener("pagehide",l,{signal:n}),()=>{c.disconnect(),l()}},W=(n,e)=>{let t=new WeakSet,o=()=>{let r=g();!r||t.has(r)||(t.add(r),requestAnimationFrame(()=>{let c=r.querySelector('[data-ui="modal-sheet"]');(I(r).find(a=>!a.matches('[data-ui="modal-close"]'))??c)?.focus()}))};o();let l=new MutationObserver(o);return l.observe(document.body,{childList:!0,subtree:!0}),document.addEventListener("click",r=>{let c=g();if(!c)return;let i=r.composedPath().find(a=>a instanceof HTMLElement&&(a.matches('[data-ui="modal-close"], [data-ui="modal-backdrop"], a[data-ui="tab"]')||a.matches('a[data-ui="action"][href]')));!i||!c.contains(i)||x(c)||(r.preventDefault(),r.stopPropagation())},{capture:!0,signal:n}),document.addEventListener("click",r=>{let c=document.querySelector("[data-save-before-navigation]"),i=c instanceof HTMLFormElement?c:c?.querySelector("form"),a=h(r)?.closest("a[href]");if(!c||!i||!a||g()||!F(c)||(r.preventDefault(),r.stopPropagation(),!B.confirm(c.dataset.saveBeforeNavigation)))return;let s=i.querySelector('input[name="returnTo"]');s||(s=document.createElement("input"),s.type="hidden",s.name="returnTo",i.append(s)),s.value=a.href,i.requestSubmit()},{capture:!0,signal:n}),document.addEventListener("keydown",r=>{let c=g();if(!c||G(r,c))return;if(r.key==="Escape"){let d=c.querySelector('[data-ui="modal-close"]');if(!d||(r.preventDefault(),!x(c)))return;w(d.getAttribute("href")??d.href,e);return}if(r.key!=="Tab")return;let i=I(c);if(!i.length)return;let a=i[0],s=i.at(-1);r.shiftKey&&document.activeElement===a?(r.preventDefault(),s.focus()):!r.shiftKey&&document.activeElement===s&&(r.preventDefault(),a.focus())},{signal:n}),()=>l.disconnect()},_=({navigation:n,lifetime:e})=>{let t=q(e);N(e),$(e,n),O(e),U(e);let o=W(e,n),l=V(e,n);return()=>{l?.(),o(),t()}};export{_ as backendShell};
2
+ function Q(i){let t,a,n=0;async function s(r){let d=r.querySelector("input[type=email]"),p=r.querySelector("[data-email-status]");if(!d||!p)return;t?.abort(),clearTimeout(a);let R=++n,T=d.value.trim(),P=r.querySelector("[data-email-next]"),C=r.querySelector("[data-email-retry]"),H=(y,k)=>{p.textContent=y,P&&(P.disabled=!k),d.setAttribute("aria-invalid",String(!k)),r.dataset.emailAvailable=k?"true":"false"};if(C&&(C.hidden=!0),!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(T)){H(T?"Email ch\u01B0a \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng.":"Nh\u1EADp email \u0111\u1EC3 ki\u1EC3m tra.",!1);return}H("\u0110ang ki\u1EC3m tra email\u2026",!1),a=setTimeout(async()=>{t=new AbortController;try{let y=await fetch(r.dataset.emailCheck,{method:"POST",cache:"no-store",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({email:T}),signal:AbortSignal.any([t.signal,AbortSignal.timeout(1e4)])});if(!y.ok)throw new Error("email-check-failed");let k=await y.json();if(R!==n||!r.isConnected)return;if(!k.ok)throw new Error("email-check-failed");H(k.available?"Email c\xF3 th\u1EC3 s\u1EED d\u1EE5ng.":"Email \u0111\xE3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng. Nh\u1EADp email kh\xE1c.",k.available)}catch{if(R!==n||!r.isConnected)return;H("Ch\u01B0a ki\u1EC3m tra \u0111\u01B0\u1EE3c email. Vui l\xF2ng th\u1EED l\u1EA1i.",!1),C&&(C.hidden=!1)}},400)}function o(r,d=!1){let p=r.querySelector('select[name="companyId"]'),R=r.querySelector('select[name="branchId"]'),T=r.querySelector('select[name="scopeKind"]')?.value;if(R&&p){d&&(R.value="");for(let y of R.options)y.value&&(y.hidden=y.dataset.companyId!==p.value,y.disabled=y.hidden)}let P=T==="tenant"?"tenant":T==="branch"?`branch:${p?.value}:${R?.value}`:`company:${p?.value}`;for(let y of r.querySelectorAll("[data-assigned-scopes]")){let e=JSON.parse(y.dataset.assignedScopes??"[]").includes(P);y.disabled=y.dataset.roleDisabled==="true"||e;let g=y.closest("[data-role-option]"),l=g?.querySelector("[data-role-assigned]"),x=g?.querySelector("[data-role-description]");l&&(l.hidden=!e),x&&(x.hidden=e),y.disabled&&(y.checked=!1)}let C=p?.closest('[data-ui="form-field"]'),H=R?.closest('[data-ui="form-field"]');C&&(C.hidden=T==="tenant"),H&&(H.hidden=T==="tenant"||T==="company")}function u(){for(let r of document.querySelectorAll("form[data-user-workflow]"))r.dataset.initialized||(r.dataset.initialized="true",o(r),s(r))}document.addEventListener("input",r=>{let d=r.target,p=d.closest("form[data-user-workflow]");if(p&&(d.type==="email"&&s(p),d.matches("[data-role-search]"))){let R=0;for(let P of p.querySelectorAll("[data-role-option]"))P.hidden=!P.textContent?.toLocaleLowerCase("vi").includes(d.value.toLocaleLowerCase("vi")),P.hidden||R++;let T=p.querySelector("[data-role-empty]");T&&(T.hidden=R>0)}},{signal:i}),document.addEventListener("change",r=>{let d=r.target,p=d.closest("form[data-user-workflow]");p&&d.matches('select[name="companyId"],select[name="branchId"],select[name="scopeKind"]')&&o(p,d.matches('select[name="companyId"]'))},{signal:i}),document.addEventListener("click",r=>{let d=r.target;d.matches("[data-email-retry]")&&s(d.closest("form"))},{signal:i}),document.addEventListener("submit",r=>{let d=r.target;d.matches("form[data-user-workflow]")&&d.querySelector("input[type=email]")&&d.dataset.emailAvailable!=="true"&&r.preventDefault()},{signal:i});let f=new MutationObserver(u);return f.observe(document.documentElement,{childList:!0,subtree:!0}),u(),()=>{t?.abort(),clearTimeout(a),f.disconnect()}}import{each as Ct}from"/_ket/view/index.js";import{Fragment as Mt,jsx as Et,jsxs as Dt}from"/_ket/view/jsx-runtime.js";var Z=["action","action-leading","action-label","action-spinner","action-group"];import{jsx as Jt,jsxs as Xt}from"/_ket/view/jsx-runtime.js";var Y=["badge","tag","tag-remove","count-badge","avatar","code"];import{each as Kt}from"/_ket/view/index.js";import{jsx as Bt,jsxs as qt}from"/_ket/view/jsx-runtime.js";var j=["notice","notice-mark","notice-copy","notice-title","notice-message","notice-actions","empty","empty-mark","empty-title","empty-message","empty-actions","loading","loading-label"];import{each as fa}from"/_ket/view/index.js";import{each as Yt}from"/_ket/view/index.js";import{jsx as zt,jsxs as Ut}from"/_ket/view/jsx-runtime.js";var ee=["app-shell","app-sidebar","app-main","app-right-rail","page","page-header","page-heading","page-title","page-description","page-actions","page-body","record-canvas","record-content","record-section","record-section-title"];import{Fragment as aa,jsx as ta,jsxs as ia}from"/_ket/view/jsx-runtime.js";var te=["stack","inline","grid","surface","surface-head","surface-title","surface-actions","disclosure","disclosure-summary","disclosure-body","section","section-head","section-eyebrow","section-title","section-description","section-actions","section-body","content-card","card-head","card-title","card-summary","card-body","card-meta","card-actions","metric","metric-icon","metric-label","metric-value","metric-detail"];import{each as da}from"/_ket/view/index.js";import{Fragment as ca,jsx as ua}from"/_ket/view/jsx-runtime.js";import{jsx as va,jsxs as xa}from"/_ket/view/jsx-runtime.js";var ae=["field","field-label","field-required","field-control","field-options","field-option","field-option-input","field-help","field-error"];import{each as wa}from"/_ket/view/index.js";import{jsx as Pa,jsxs as ka}from"/_ket/view/jsx-runtime.js";var ie=["breadcrumbs","breadcrumb","nav-list","nav-item","nav-item-leading","nav-item-label","nav-item-count","tabs","tab","tab-count"];import{jsx as Ca,jsxs as Oa}from"/_ket/view/jsx-runtime.js";var ne=["progress","progress-label","progress-value","progress-track","progress-bar"];import{each as Da}from"/_ket/view/index.js";import{Fragment as Xa,jsx as Fa,jsxs as Ja}from"/_ket/view/jsx-runtime.js";var oe=["menu","menu-trigger","menu-panel","menu-item","menu-item-copy"];import{jsx as Ka,jsxs as $a}from"/_ket/view/jsx-runtime.js";var re=["popover","popover-trigger","popover-panel","popover-close"];import{jsx as Va,jsxs as Ga}from"/_ket/view/jsx-runtime.js";var le=["tooltip","tooltip-trigger","tooltip-content"];import{jsx as Wa,jsxs as _a}from"/_ket/view/jsx-runtime.js";var de=["modal-layer","modal-backdrop","modal-sheet","modal-head","modal-heading","modal-title","modal-description","modal-close","modal-body","modal-actions"];import{jsx as ei}from"/_ket/view/jsx-runtime.js";var se=["dialog","confirm-dialog-message"];import{each as ii}from"/_ket/view/index.js";import{jsx as oi,jsxs as ri}from"/_ket/view/jsx-runtime.js";var ce=["toast-region","toast","toast-copy","toast-title","toast-message","toast-actions"];import{jsx as si}from"/_ket/view/jsx-runtime.js";var ue=["spinner","visually-hidden"];import{each as mi}from"/_ket/view/index.js";import{jsx as bi}from"/_ket/view/jsx-runtime.js";var me=["skeleton","skeleton-line"];var at=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","summary",'[tabindex]:not([tabindex="-1"])'].join(","),J=i=>[...i.querySelectorAll(at)].filter(t=>t instanceof HTMLElement&&!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&(typeof t.checkVisibility!="function"||t.checkVisibility())),q=(i=document)=>{let t=document.activeElement instanceof HTMLElement?document.activeElement:null,a=i.querySelector('[data-ui="modal-layer"][data-route-modal="true"] [role="dialog"]'),n=i.querySelector('[data-ui="app-shell"], [data-ui="shell"]'),s=n instanceof HTMLElement?n.inert:!1;if(a instanceof HTMLElement){n instanceof HTMLElement&&!n.contains(a)&&(n.inert=!0);let e=J(a)[0];(e instanceof HTMLElement?e:a).focus()}let o=window.matchMedia("(max-width: 48rem)"),u=document.documentElement,f=u.dataset.kvNavigationOpen,r=[...i.querySelectorAll('[data-ui="app-navigation"]')].filter(e=>e instanceof HTMLDetailsElement),d=new Map,p=e=>{let g=d.get(e);if(g?.targets){for(let{element:l,inert:x}of g.targets)l.inert=x;g.targets=null}},R=()=>{o.matches&&r.some(g=>g.open)?u.dataset.kvNavigationOpen="true":f===void 0?delete u.dataset.kvNavigationOpen:u.dataset.kvNavigationOpen=f},T=e=>{let g=e.querySelector('[data-ui="navigation-trigger"]'),l=e.querySelector('[data-ui="navigation-drawer"]');if(!(g instanceof HTMLElement)||!(l instanceof HTMLElement))return;let x=o.matches;if(g.dataset.open=String(x&&e.open),!x){l.removeAttribute("role"),l.removeAttribute("aria-modal"),l.removeAttribute("aria-label"),p(e),R();return}if(l.setAttribute("role","dialog"),l.setAttribute("aria-modal","true"),l.setAttribute("aria-label",l.dataset.navigationLabel??"Navigation"),!e.open){p(e),R();return}let v=d.get(e)??{};if(!v.targets){let O=e.closest('[data-ui="app-shell"], [data-ui="shell"]'),L=O?[...O.querySelectorAll(':scope > [data-ui="app-main"], :scope > [data-ui="main"], :scope > [data-ui="app-right-rail"]')].filter(w=>w instanceof HTMLElement).map(w=>({element:w,inert:w.inert})):[];for(let{element:w}of L)w.inert=!0;v.targets=L,v.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:g,d.set(e,v),queueMicrotask(()=>{if(!e.open||!o.matches)return;let w=l.querySelector('[data-ui="navigation-item"][aria-current="page"]'),M=J(l)[0],m=w instanceof HTMLElement?w:M;(m instanceof HTMLElement?m:l).focus()})}R()},P=(e,g=!0)=>{let l=d.get(e);e.open=!1,T(e),g&&l?.returnFocus instanceof HTMLElement&&l.returnFocus.isConnected&&l.returnFocus.focus(),d.delete(e)},C=r.map(e=>{let g=()=>T(e),l=x=>{let v=x.target;if(!(v instanceof Element))return;let L=v.closest('[data-ui="navigation-branch-trigger"]')?.closest('[data-ui="navigation-branch"]');if(L instanceof HTMLDetailsElement&&L.open){x.preventDefault();return}!o.matches||!e.open||(v.closest('[data-ui="navigation-close"]')||v.closest('[data-ui="navigation-backdrop"]')||v.closest('[data-ui="navigation-item"]'))&&P(e)};return e.addEventListener("toggle",g),e.addEventListener("click",l),T(e),()=>{e.removeEventListener("toggle",g),e.removeEventListener("click",l),p(e)}}),H=()=>{for(let e of r)e.open?P(e,!1):T(e)};o.addEventListener("change",H);for(let e of i.querySelectorAll('[data-ui="popover"][data-open="true"]')){let g=e.querySelector('[data-ui="popover-trigger"]'),l=e.querySelector('[data-ui="popover-panel"]');if(!(g instanceof HTMLElement)||!(l instanceof HTMLElement))continue;let x=g.getBoundingClientRect(),v=8,O=e.getAttribute("data-placement")??"bottom-start",L=O.startsWith("top"),w=O.endsWith("end"),M=x.top-l.offsetHeight-v,m=x.bottom+v,c=M>=8,S=m+l.offsetHeight<=window.innerHeight-8,b=L?c||!S:!S&&c,h=w?x.right-l.offsetWidth:x.left,D=Math.max(8,Math.min(h,window.innerWidth-l.offsetWidth-8)),$=Math.max(8,Math.min(b?M:m,window.innerHeight-l.offsetHeight-8));l.dataset.runtimePositioned="true",l.dataset.runtimePlacement=`${b?"top":"bottom"}-${w?"end":"start"}`,l.style.left=`${Math.round(D)}px`,l.style.top=`${Math.round($)}px`,l.style.right="auto",l.style.bottom="auto"}let y=e=>{let g=r.find(m=>o.matches&&m.open);if(g instanceof HTMLDetailsElement){let m=g.querySelector('[data-ui="navigation-drawer"]');if(e.key==="Escape"){P(g),e.preventDefault();return}if(e.key==="Tab"&&m instanceof HTMLElement){let c=J(m),S=c[0],b=c.at(-1);if(!c.length){e.preventDefault(),m.focus();return}if(e.shiftKey&&(document.activeElement===S||document.activeElement===m)){e.preventDefault(),b instanceof HTMLElement&&b.focus();return}if(!e.shiftKey&&document.activeElement===b){e.preventDefault(),S instanceof HTMLElement&&S.focus();return}}}let l=document.activeElement?.closest('[data-ui="tree"] [role="treeitem"]');if(l instanceof HTMLElement){let m=l.closest('[data-ui="tree"]'),c=m?[...m.querySelectorAll('[role="treeitem"]')].filter(h=>h instanceof HTMLElement):[],S=c.indexOf(l),b=-1;if(e.key==="ArrowDown")b=Math.min(c.length-1,S+1);else if(e.key==="ArrowUp")b=Math.max(0,S-1);else if(e.key==="Home")b=0;else if(e.key==="End")b=c.length-1;else if(e.key==="ArrowRight"){let h=Number(l.getAttribute("aria-level"));l.getAttribute("aria-expanded")==="true"&&Number(c[S+1]?.getAttribute("aria-level"))>h&&(b=S+1)}else if(e.key==="ArrowLeft"){let h=Number(l.getAttribute("aria-level"));h>1&&(b=c.findLastIndex((D,$)=>$<S&&Number(D.getAttribute("aria-level"))<h))}if(b>=0&&c[b]){for(let h of c)h.tabIndex=-1;c[b].tabIndex=0,c[b].focus(),e.preventDefault();return}}let x=document.activeElement?.closest('[data-ui="tree-grid-row"]');if(x instanceof HTMLElement){let m=x.closest('[data-ui="tree-grid"]'),c=m?[...m.querySelectorAll('[data-ui="tree-grid-row"]')].filter(h=>h instanceof HTMLElement):[],S=c.indexOf(x),b=e.key==="ArrowDown"?Math.min(c.length-1,S+1):e.key==="ArrowUp"?Math.max(0,S-1):e.key==="Home"?0:e.key==="End"?c.length-1:-1;if(b>=0&&c[b]){for(let h of c)h.tabIndex=-1;c[b].tabIndex=0,c[b].focus(),e.preventDefault();return}}let v=document.activeElement?.closest('[data-ui="menu"][open]');if(v instanceof HTMLDetailsElement){let m=v.querySelector('[data-ui="menu-trigger"]'),c=[...v.querySelectorAll('[role="menuitem"]')].filter(D=>D instanceof HTMLElement&&D.getAttribute("aria-disabled")!=="true"),S=document.activeElement,b=S instanceof HTMLElement?c.indexOf(S):-1,h=-1;if(e.key==="ArrowDown"?h=b<0?0:(b+1)%c.length:e.key==="ArrowUp"?h=b<0?c.length-1:(b-1+c.length)%c.length:e.key==="Home"?h=0:e.key==="End"&&(h=c.length-1),h>=0&&c[h]instanceof HTMLElement){c[h].focus(),e.preventDefault();return}if((e.key==="Enter"||e.key===" ")&&document.activeElement===m){c[0]instanceof HTMLElement&&c[0].focus(),e.preventDefault();return}}if(e.key==="Escape"&&v instanceof HTMLDetailsElement){v.open=!1;let m=v.querySelector('[data-ui="menu-trigger"]');m instanceof HTMLElement&&m.focus(),e.preventDefault();return}let O=document.activeElement?.closest('[data-ui="popover"][data-open="true"]');if(e.key==="Escape"&&O instanceof HTMLElement){let m=O.querySelector('[data-ui="popover-close"]');m instanceof HTMLElement&&m.click(),e.preventDefault();return}if(!(a instanceof HTMLElement))return;if(e.key==="Escape"){let m=a.querySelector('[data-ui="modal-close"]');m instanceof HTMLElement&&m.click(),e.preventDefault();return}if(e.key!=="Tab")return;let L=J(a);if(!L.length){e.preventDefault(),a.focus();return}let w=L[0],M=L.at(-1);e.shiftKey&&(document.activeElement===w||document.activeElement===a)?(e.preventDefault(),M instanceof HTMLElement&&M.focus()):!e.shiftKey&&document.activeElement===M&&(e.preventDefault(),w instanceof HTMLElement&&w.focus())},k=e=>{let g=e.target;if(g instanceof Node)for(let l of i.querySelectorAll('[data-ui="menu"][open]'))l instanceof HTMLDetailsElement&&!l.contains(g)&&(l.open=!1)};return document.addEventListener("keydown",y),document.addEventListener("click",k),()=>{document.removeEventListener("keydown",y),document.removeEventListener("click",k),o.removeEventListener("change",H);for(let e of C)e();f===void 0?delete u.dataset.kvNavigationOpen:u.dataset.kvNavigationOpen=f,n instanceof HTMLElement&&(n.inert=s),t?.isConnected&&t.focus()}};import{jsx as yi,jsxs as vi}from"/_ket/view/jsx-runtime.js";import{jsx as Ri,jsxs as Pi}from"/_ket/view/jsx-runtime.js";var fe=["switch-control","switch-track"];import{each as Hi}from"/_ket/view/index.js";import{Fragment as Di,jsx as Ei,jsxs as Mi}from"/_ket/view/jsx-runtime.js";var pe=["combobox","combobox-input-row","combobox-toggle","combobox-listbox","combobox-option","combobox-empty","tag-picker"];import{jsx as Ii,jsxs as Ni}from"/_ket/view/jsx-runtime.js";var he=["date-range"];import{jsx as qi,jsxs as Vi}from"/_ket/view/jsx-runtime.js";var ye=["file-upload","drop-zone","upload-status"];import{jsx as Wi}from"/_ket/view/jsx-runtime.js";var ve=["relation-picker"];import{each as Zi}from"/_ket/view/index.js";import{jsx as tn,jsxs as an}from"/_ket/view/jsx-runtime.js";var xe=["search-bar","filter-bar","applied-filters","applied-filter","saved-views","saved-view","view-settings","view-settings-options"];import{jsx as ln,jsxs as dn}from"/_ket/view/jsx-runtime.js";var Se=["inline-edit","inline-edit-value","inline-edit-form","inline-edit-actions"];import{each as xn}from"/_ket/view/index.js";import{each as gn}from"/_ket/view/index.js";import{jsx as pn,jsxs as hn}from"/_ket/view/jsx-runtime.js";var Te=["list-chrome","list-chrome-row","list-search","list-search-label","list-search-input","list-search-submit","list-facets","list-facet","list-facet-count","list-view-switch","list-view","list-sort","list-sort-label","list-sort-select","list-status","list-actions","bulk-actions","bulk-summary","bulk-action-list","pager-bar","pager-summary","pager-pages","pager-page","pager-actions","pager-link"];import{jsx as Rn,jsxs as Pn}from"/_ket/view/jsx-runtime.js";var we=["resource-list","resource-list-item","resource-list-select","resource-list-link"];import{each as Hn}from"/_ket/view/index.js";import{jsx as On,jsxs as En}from"/_ket/view/jsx-runtime.js";var Re=["data-grid-scroll","data-grid","data-grid-cap","data-grid-cell"];import{each as An}from"/_ket/view/index.js";import{jsx as Jn,jsxs as Xn}from"/_ket/view/jsx-runtime.js";var Pe=["tree","tree-item","tree-link","tree-grid","tree-grid-row"];import{each as Kn}from"/_ket/view/index.js";import{jsx as qn,jsxs as Vn}from"/_ket/view/jsx-runtime.js";var ke=["description-list","key-value","key-value-label","key-value-value","person","person-body","avatar-group","status"];import{jsx as Un}from"/_ket/view/jsx-runtime.js";var Le=["formatted-date","formatted-number","formatted-money"];import{each as Qn}from"/_ket/view/index.js";import{jsx as to,jsxs as ao}from"/_ket/view/jsx-runtime.js";var Ce=["record-summary","record-summary-main","record-actions","record-rail"];import{each as oo}from"/_ket/view/index.js";import{jsx as co,jsxs as uo}from"/_ket/view/jsx-runtime.js";var Ee=["activity-timeline","activity-item","activity-marker","audit-log","audit-item"];import{each as bo}from"/_ket/view/index.js";import{jsx as ho,jsxs as yo}from"/_ket/view/jsx-runtime.js";var Me=["attachments","attachment","media-gallery","media-item"];import{each as So}from"/_ket/view/index.js";import{Fragment as Po,jsx as wo,jsxs as Ro}from"/_ket/view/jsx-runtime.js";var De=["app-navigation","navigation-trigger","navigation-trigger-icon","navigation-trigger-identity","navigation-trigger-label","navigation-layer","navigation-backdrop","navigation-drawer","navigation-header","navigation-identity","navigation-context","navigation-close","navigation-groups","navigation-group","navigation-group-label","navigation-items","navigation-supplementary","navigation-item","navigation-branch","navigation-branch-trigger","navigation-children","navigation-item-leading","navigation-item-copy","navigation-item-label","navigation-item-description","navigation-item-count","navigation-footer"];import{each as Oo}from"/_ket/view/index.js";import{Fragment as Jo,jsx as Ao,jsxs as Fo}from"/_ket/view/jsx-runtime.js";var Ae=["table-scroll","table","table-caption","select-col","select-all","col","sort-link","sort-icon","row","group-row","group-cell","group-link","group-indent","group-count","group-pager","group-pager-actions","cell","select-cell","row-select","row-link"];import{Fragment as $o,jsx as No,jsxs as Ko}from"/_ket/view/jsx-runtime.js";import{jsx as Uo,jsxs as Wo}from"/_ket/view/jsx-runtime.js";var Fe=["list-page","list-page-context","list-page-header","list-page-heading","list-page-title-row","list-page-eyebrow","list-page-title","list-page-description","list-page-actions","list-page-toolbar","list-page-controls","list-page-status","list-page-body","list-page-footer"];import{jsx as jo,jsxs as er}from"/_ket/view/jsx-runtime.js";var Je=["record-page","record-page-context","record-page-header","record-page-title-row","record-page-heading","record-page-title","record-page-subline","record-page-status","record-page-description","record-page-actions","record-page-meta","record-page-controller","record-page-navigation","record-page-layout","record-page-body","record-page-aside"];var Xe=["form-page","form-page-context","form-page-header","form-page-title-row","form-page-heading","form-page-title","form-page-subline","form-page-status","form-page-description","form-page-actions","form-page-meta","form-page-controller","form-page-navigation","form-page-layout","form-page-body","form-page-aside"];import{jsx as sr,jsxs as cr}from"/_ket/view/jsx-runtime.js";var Ie=["dashboard-page","dashboard-page-context","dashboard-page-header","dashboard-page-heading","dashboard-page-eyebrow","dashboard-page-title-row","dashboard-page-title","dashboard-page-subline","dashboard-page-status","dashboard-page-description","dashboard-page-actions","dashboard-page-meta","dashboard-page-body"];var Ne=["board-page","board-page-context","board-page-header","board-page-heading","board-page-eyebrow","board-page-title-row","board-page-title","board-page-subline","board-page-status","board-page-description","board-page-actions","board-page-meta","board-page-toolbar","board-page-controls","board-page-body"];import{each as vr}from"/_ket/view/index.js";import{jsx as Sr,jsxs as Tr}from"/_ket/view/jsx-runtime.js";var Ke=["pipeline","pipeline-step","pipeline-arrow","pipeline-step-label","pipeline-step-value","pipeline-step-node"];import{each as Lr}from"/_ket/view/index.js";import{jsx as Er,jsxs as Mr}from"/_ket/view/jsx-runtime.js";var $e=["record-form","form-errors","form-grid","form-actions"];var Be={actions:Z,feedback:j,fields:ae,status:Y,navigation:ie,progress:ne,menu:oe,popover:re,tooltip:le,dialog:se,toast:ce,spinner:ue,skeleton:me,scalarFields:fe,combobox:pe,dateTime:he,upload:ye,relationPicker:ve,listControls:xe,inlineEdit:Se,resourceList:we,dataGrid:Re,tree:Pe,recordDisplay:ke,formattedValues:Le,recordComposition:Ce,activity:Ee,media:Me,layouts:te,shell:ee,appNavigation:De,table:Ae,listChrome:Te,listPage:Fe,formPage:Xe,recordPage:Je,dashboardPage:Ie,boardPage:Ne,modal:de,pipeline:Ke,form:$e},bt=[...new Set(Object.values(Be).flat())].sort(),ft=Object.freeze(Object.fromEntries(Object.entries(Be).map(([i,t])=>[i,[...t]])));var W="ket.backend.theme",U=['[data-ui="search-menu"]','[data-ui="col-config"]','[data-ui="bulk-actions"]','[data-ui="viewer"]','[data-ui="record-more"]'].join(", "),ze=globalThis,E=i=>i.target instanceof Element?i.target:null,K=i=>i==="light"||i==="dark"?i:null,pt=()=>{try{return K(localStorage.getItem(W))}catch{return null}},ht=i=>{try{localStorage.setItem(W,i)}catch{}},Ue=()=>K(document.documentElement.dataset.theme)??(matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),I=()=>{let i=String(Ue()==="dark");for(let t of document.querySelectorAll('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]'))t.setAttribute("aria-pressed",i)},yt=i=>{let t=pt();t&&(document.documentElement.dataset.theme=t),I(),document.addEventListener("click",a=>{let n=E(a)?.closest('[data-ui="sidebar-tools"] [data-ui="action"][name="theme"]');if(!n||n.disabled)return;let s=Ue()==="dark"?"light":"dark";document.documentElement.dataset.theme=s,ht(s),I()},{signal:i}),matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{K(document.documentElement.dataset.theme)||I()},{signal:i}),addEventListener("storage",a=>{if(a.key!==W)return;let n=K(a.newValue);n?document.documentElement.dataset.theme=n:delete document.documentElement.dataset.theme,I()},{signal:i})},vt=i=>{let t=[...i.querySelectorAll('[data-ui="row-select"]:not(:disabled)')],a=t.filter(s=>s.checked).length,n=i.querySelector('[data-ui="select-all"]');if(n&&(n.checked=t.length>0&&a===t.length,n.indeterminate=a>0&&a<t.length),!a){let s=i.closest('[data-ui="shell"]');for(let o of s?.querySelectorAll('[data-ui="bulk-actions"][open]')??[])o.removeAttribute("open")}},xt=(i,t)=>{document.addEventListener("change",a=>{let n=E(a);if(!(n instanceof HTMLInputElement)||!n.matches('[data-ui="select-all"], [data-ui="row-select"]'))return;let s=n.closest('[data-ui="table"]');if(s){if(n.matches('[data-ui="select-all"]'))for(let o of s.querySelectorAll('[data-ui="row-select"]:not(:disabled)'))o.checked=n.checked;vt(s)}},{signal:i}),document.addEventListener("click",a=>{if(a.defaultPrevented||a.button!==0||a.metaKey||a.ctrlKey||a.shiftKey||a.altKey)return;let n=E(a);if(n?.closest('a, button, input, select, textarea, label, summary, details, [data-ui="select-cell"]'))return;let o=n?.closest('[data-ui="row"][data-row-href]')?.getAttribute("data-row-href");o&&(a.preventDefault(),t.navigate(o))},{signal:i}),document.addEventListener("keydown",a=>{if(a.defaultPrevented||a.key!=="Enter"&&a.key!==" ")return;let n=E(a),o=(n?.matches('[data-ui="row"][data-row-href][tabindex="0"]')?n:null)?.getAttribute("data-row-href");o&&(a.preventDefault(),_(o,t))},{signal:i})},qe=()=>[...document.querySelectorAll(`${U}[open]`)],St=i=>{document.addEventListener("click",t=>{let a=E(t)?.closest(U);for(let n of qe())n!==a&&!n.contains(a??null)&&n.removeAttribute("open")},{signal:i}),document.addEventListener("keydown",t=>{if(t.key!=="Escape")return;let a=qe();if(!a.length)return;let n=document.activeElement?.closest(U),s=n?.open?n:a.at(-1);s?.removeAttribute("open"),s?.querySelector("summary")?.focus(),t.preventDefault()},{signal:i})},Tt=i=>{document.addEventListener("click",t=>{let a=E(t)?.closest('[data-ui="chrome-search-toggle"]'),n=a?.getAttribute("aria-controls");if(!a||!n)return;let s=document.getElementById(n);!(s instanceof HTMLDialogElement)||s.open||(s.showModal(),a.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>s.querySelector('[data-presentation="modal"] [data-ui="chrome-search-input"]')?.focus()))},{signal:i}),document.addEventListener("cancel",t=>{E(t)?.matches('[data-ui="chrome-search-modal"]')&&t.preventDefault()},{capture:!0,signal:i}),document.addEventListener("close",t=>{let a=E(t);if(!(a instanceof HTMLDialogElement)||!a.matches('[data-ui="chrome-search-modal"]'))return;let n=document.querySelector(`[data-ui="chrome-search-toggle"][aria-controls="${CSS.escape(a.id)}"]`);n?.setAttribute("aria-expanded","false"),n?.focus()},{capture:!0,signal:i})},wt=["a[href]","button:not(:disabled)",'input:not(:disabled):not([type="hidden"])',"select:not(:disabled)","textarea:not(:disabled)",'[tabindex]:not([tabindex="-1"])'].join(", "),N=()=>document.querySelector('[data-ui="modal-layer"][data-route-modal="true"]'),Ve=i=>[...i.querySelectorAll(wt)].filter(t=>!t.hidden&&t.getAttribute("aria-hidden")!=="true"&&!t.matches('[data-ui="modal-backdrop"]')),_=(i,t)=>{t.navigate(i)},Rt=(i,t)=>i.composedPath().some(a=>a instanceof HTMLElement&&a!==t&&a.matches('[data-ui="modal-layer"][data-presentation="dialog"]')),We=i=>{for(let t of i.querySelectorAll('input:not([type="hidden"])'))if(!t.disabled){if(t.type==="checkbox"||t.type==="radio"){if(t.checked!==t.defaultChecked)return!0}else if(t.value!==t.defaultValue)return!0}for(let t of i.querySelectorAll("textarea"))if(!t.disabled&&t.value!==t.defaultValue)return!0;for(let t of i.querySelectorAll("select"))if(!t.disabled){for(let a of t.options)if(a.selected!==a.defaultSelected)return!0}return!1},Ge=i=>{if(!We(i))return!0;let t=i.getAttribute("data-unsaved-prompt");return t?ze.confirm(t):!0},Pt=(i,t)=>{if(typeof EventSource!="function")return;let a=null,n=null,s=()=>{n?.close(),n=null,a=null},o=()=>{let f=document.querySelector('[data-ui="live-region"][data-stream]');if(f===a)return;s();let r=f instanceof HTMLElement?f.dataset.stream??"":"";if(!r)return;a=f,n=new EventSource(`/_ket/stream/${encodeURIComponent(r)}`);let d=()=>_(location.href,t);n.onmessage=d,n.addEventListener("done",()=>{s(),d()}),n.onerror=()=>{n?.readyState===EventSource.CLOSED&&s()}};o();let u=new MutationObserver(o);return u.observe(document.body,{childList:!0,subtree:!0}),addEventListener("pagehide",s,{signal:i}),()=>{u.disconnect(),s()}},kt=(i,t)=>{let a=new WeakSet,n=()=>{let o=N();!o||a.has(o)||(a.add(o),requestAnimationFrame(()=>{let u=o.querySelector('[data-ui="modal-sheet"]');(Ve(o).find(r=>!r.matches('[data-ui="modal-close"]'))??u)?.focus()}))};n();let s=new MutationObserver(n);return s.observe(document.body,{childList:!0,subtree:!0}),document.addEventListener("click",o=>{let u=N();if(!u)return;let f=o.composedPath().find(r=>r instanceof HTMLElement&&(r.matches('[data-ui="modal-close"], [data-ui="modal-backdrop"], a[data-ui="tab"]')||r.matches('a[data-ui="action"][href]')));!f||!u.contains(f)||Ge(u)||(o.preventDefault(),o.stopPropagation())},{capture:!0,signal:i}),document.addEventListener("click",o=>{let u=document.querySelector("[data-save-before-navigation]"),f=u instanceof HTMLFormElement?u:u?.querySelector("form"),r=E(o)?.closest("a[href]");if(!u||!f||!r||N()||!We(u)||(o.preventDefault(),o.stopPropagation(),!ze.confirm(u.dataset.saveBeforeNavigation)))return;let d=f.querySelector('input[name="returnTo"]');d||(d=document.createElement("input"),d.type="hidden",d.name="returnTo",f.append(d)),d.value=r.href,f.requestSubmit()},{capture:!0,signal:i}),document.addEventListener("keydown",o=>{let u=N();if(!u||Rt(o,u))return;if(o.key==="Escape"){let p=u.querySelector('[data-ui="modal-close"]');if(!p||(o.preventDefault(),!Ge(u)))return;_(p.getAttribute("href")??p.href,t);return}if(o.key!=="Tab")return;let f=Ve(u);if(!f.length)return;let r=f[0],d=f.at(-1);o.shiftKey&&document.activeElement===r?(o.preventDefault(),d.focus()):!o.shiftKey&&document.activeElement===d&&(o.preventDefault(),r.focus())},{signal:i}),()=>s.disconnect()},Gs=({navigation:i,lifetime:t})=>{let a=q(document),n=Q(t);yt(t),xt(t,i),St(t),Tt(t);let s=kt(t,i),o=Pt(t,i);return()=>{a(),o?.(),s(),n()}};export{Gs as backendShell};