beads-enhanced-ui 0.1.0 → 0.1.2

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/CHANGES.md ADDED
@@ -0,0 +1,24 @@
1
+ # Changes
2
+
3
+ ## 0.1.2
4
+
5
+ Released April 15, 2026
6
+
7
+ ### Fixed
8
+
9
+ - Reduced Dolt workspace lock contention by skipping `bd --sandbox` where it does not help and by coalescing watcher-triggered refreshes during backend file churn.
10
+
11
+ ## 0.1.1
12
+
13
+ Released April 02, 2026
14
+
15
+ ### Changed
16
+
17
+ - Refined the Epics experience with a redesigned layout, updated spacing, and clearer title and status alignment across the view.
18
+ - Tightened issue ID rendering across the UI so Beads IDs display consistently in lists, rows, and issue dialogs.
19
+ - Rebranded the fork as `beads-enhanced-ui` and updated package metadata for publishing and installation under the new name.
20
+
21
+ ### Fixed
22
+
23
+ - Fixed Epics sorting, row sizing, and column width regressions that made the page harder to scan.
24
+ - Fixed the issues table ID cell rendering so Beads identifiers stay readable and aligned in the main list view.
package/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ## Features
18
18
 
19
- - ✨ **Zero setup** – just run `bdui start`
19
+ - ✨ **Zero setup** – just run `bdui start --open`
20
20
  - 📺 **Live updates** – Monitors the beads database for changes
21
21
  - 🔎 **Issues view** – Filter and search issues, edit inline
22
22
  - ⛰️ **Epics view** – Show progress per epic, expand rows, edit inline
@@ -28,8 +28,8 @@
28
28
  ## Setup
29
29
 
30
30
  ```sh
31
- npm i beads-ui -g
32
- # In your project directory:
31
+ npm install -g beads-enhanced-ui
32
+ # Run UI in your project directory:
33
33
  bdui start --open
34
34
  ```
35
35
 
@@ -39,15 +39,15 @@ See `bdui --help` for options.
39
39
 
40
40
  **Issues**
41
41
 
42
- ![Issues view](https://github.com/mantoni/beads-ui/raw/main/media/bdui-issues.png)
42
+ ![Issues view](docs/media/issues-view.png)
43
43
 
44
44
  **Epics**
45
45
 
46
- ![Epics view](https://github.com/mantoni/beads-ui/raw/main/media/bdui-epics.png)
46
+ ![Epics view](docs/media/epics-view.png)
47
47
 
48
48
  **Board**
49
49
 
50
- ![Board view](https://github.com/mantoni/beads-ui/raw/main/media/bdui-board.png)
50
+ ![Board view](docs/media/board-view.png)
51
51
 
52
52
  ## Environment variables
53
53
 
@@ -607,10 +607,7 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
607
607
  >
608
608
  ${E}
609
609
  </td>`:""}
610
- </tr>`}return h}function yn(s,e,t,n=void 0,r=void 0){let i=[],a="id",l="asc",o="priority",f="asc",u=new Set,h=new Set,d=new Map,m=r?st(r):null;m&&m.subscribe(()=>{let k=i.length===0;if(i=B(),S(),k&&i.length>0){let x=String(D(i)[0]?.epic?.id||"");x&&!u.has(x)&&G(x)}});let y=ms({navigate:k=>t(k),onUpdate:q,requestRender:S,getSelectedId:()=>null,row_class:"epic-row",show_dependencies:!1});function S(){Te(E(),s)}function E(){if(!i.length)return T`<div
611
- class="panel__header muted"
612
- data-testid="epics-empty"
613
- >
610
+ </tr>`}return h}function yn(s,e,t,n=void 0,r=void 0){let i=[],a="id",l="asc",o="priority",f="asc",u=new Set,h=new Set,d=new Map,m=r?st(r):null;m&&m.subscribe(()=>{let k=i.length===0;if(i=B(),S(),k&&i.length>0){let x=String(D(i)[0]?.epic?.id||"");x&&!u.has(x)&&G(x)}});let y=ms({navigate:k=>t(k),onUpdate:q,requestRender:S,getSelectedId:()=>null,row_class:"epic-row",show_dependencies:!1});function S(){Te(E(),s)}function E(){if(!i.length)return T`<div class="panel__header muted" data-testid="epics-empty">
614
611
  No epics found.
615
612
  </div>`;let k=D(i);return T`
616
613
  <div class="epics-table-wrap" data-testid="epics-view">
@@ -625,16 +622,68 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
625
622
  </colgroup>
626
623
  <thead class="epics-list-header" data-testid="epics-header">
627
624
  <tr>
628
- <th scope="col" data-testid="epics-header-id">${M("id","Id")}</th>
629
- <th scope="col" colspan="2" data-testid="epics-header-name">${M("name","Name")}</th>
630
- <th scope="col" data-testid="epics-header-status">${M("status","Status")}</th>
631
- <th scope="col" colspan="2" class="epics-list-header__meta" data-testid="epics-header-progress">Progress</th>
625
+ <th scope="col" data-testid="epics-header-id">
626
+ ${M("id","Id")}
627
+ </th>
628
+ <th scope="col" colspan="2" data-testid="epics-header-name">
629
+ ${M("name","Name")}
630
+ </th>
631
+ <th scope="col" data-testid="epics-header-status">
632
+ ${M("status","Status")}
633
+ </th>
634
+ <th
635
+ scope="col"
636
+ colspan="2"
637
+ class="epics-list-header__meta"
638
+ data-testid="epics-header-progress"
639
+ >
640
+ Progress
641
+ </th>
632
642
  </tr>
633
643
  </thead>
634
644
  ${k.map(x=>N(x))}
635
645
  </table>
636
646
  </div>
637
- `}function M(k,x){return Z({column:k,label:x,active_column:a,active_direction:l,data_attribute_name:"data-sort-column",onToggle:()=>H(k)})}function F(k,x){return Z({column:k,label:x,active_column:o,active_direction:f,data_attribute_name:"data-child-sort-column",onToggle:()=>ee(k)})}function Z(k){let{column:x,label:$,active_column:K,active_direction:fe,data_attribute_name:ue,onToggle:se}=k,V=K===x,pe=V&&fe==="asc"?"desc":"asc",we=V?fe==="asc"?T`<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="M5 12l7-7 7 7"/></svg>`:T`<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="M19 12l-7 7-7-7"/></svg>`:T`<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 15l5 5 5-5"/><path d="M7 9l5-5 5 5"/></svg>`;return T`
647
+ `}function M(k,x){return Z({column:k,label:x,active_column:a,active_direction:l,data_attribute_name:"data-sort-column",onToggle:()=>H(k)})}function F(k,x){return Z({column:k,label:x,active_column:o,active_direction:f,data_attribute_name:"data-child-sort-column",onToggle:()=>ee(k)})}function Z(k){let{column:x,label:$,active_column:K,active_direction:fe,data_attribute_name:ue,onToggle:se}=k,V=K===x,pe=V&&fe==="asc"?"desc":"asc",we=V?fe==="asc"?T`<svg
648
+ width="11"
649
+ height="11"
650
+ viewBox="0 0 24 24"
651
+ fill="none"
652
+ stroke="currentColor"
653
+ stroke-width="2.5"
654
+ stroke-linecap="round"
655
+ stroke-linejoin="round"
656
+ aria-hidden="true"
657
+ >
658
+ <path d="M12 19V5" />
659
+ <path d="M5 12l7-7 7 7" />
660
+ </svg>`:T`<svg
661
+ width="11"
662
+ height="11"
663
+ viewBox="0 0 24 24"
664
+ fill="none"
665
+ stroke="currentColor"
666
+ stroke-width="2.5"
667
+ stroke-linecap="round"
668
+ stroke-linejoin="round"
669
+ aria-hidden="true"
670
+ >
671
+ <path d="M12 5v14" />
672
+ <path d="M19 12l-7 7-7-7" />
673
+ </svg>`:T`<svg
674
+ width="11"
675
+ height="11"
676
+ viewBox="0 0 24 24"
677
+ fill="none"
678
+ stroke="currentColor"
679
+ stroke-width="2.5"
680
+ stroke-linecap="round"
681
+ stroke-linejoin="round"
682
+ aria-hidden="true"
683
+ >
684
+ <path d="M7 15l5 5 5-5" />
685
+ <path d="M7 9l5-5 5 5" />
686
+ </svg>`;return T`
638
687
  <button
639
688
  type="button"
640
689
  class="epics-sort-button ${V?"is-active":""}"
@@ -674,7 +723,35 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
674
723
  data-testid=${`epic-header-name-${$}`}
675
724
  >
676
725
  <span class="epic-header-name">
677
- ${K?T`<svg class="epic-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-testid=${`epic-header-chevron-${$}`}><polyline points="6 9 12 15 18 9"></polyline></svg>`:T`<svg class="epic-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-testid=${`epic-header-chevron-${$}`}><polyline points="9 18 15 12 9 6"></polyline></svg>`}
726
+ ${K?T`<svg
727
+ class="epic-chevron"
728
+ width="14"
729
+ height="14"
730
+ viewBox="0 0 24 24"
731
+ fill="none"
732
+ stroke="currentColor"
733
+ stroke-width="2.5"
734
+ stroke-linecap="round"
735
+ stroke-linejoin="round"
736
+ aria-hidden="true"
737
+ data-testid=${`epic-header-chevron-${$}`}
738
+ >
739
+ <polyline points="6 9 12 15 18 9"></polyline>
740
+ </svg>`:T`<svg
741
+ class="epic-chevron"
742
+ width="14"
743
+ height="14"
744
+ viewBox="0 0 24 24"
745
+ fill="none"
746
+ stroke="currentColor"
747
+ stroke-width="2.5"
748
+ stroke-linecap="round"
749
+ stroke-linejoin="round"
750
+ aria-hidden="true"
751
+ data-testid=${`epic-header-chevron-${$}`}
752
+ >
753
+ <polyline points="9 18 15 12 9 6"></polyline>
754
+ </svg>`}
678
755
  <span
679
756
  class="text-truncate"
680
757
  data-testid=${`epic-header-title-${$}`}
@@ -697,10 +774,7 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
697
774
  colspan="2"
698
775
  data-testid=${`epic-header-progress-${$}`}
699
776
  >
700
- <span
701
- class="epic-progress"
702
- data-testid=${`epic-progress-${$}`}
703
- >
777
+ <span class="epic-progress" data-testid=${`epic-progress-${$}`}>
704
778
  <progress
705
779
  value=${Number(k.closed_children||0)}
706
780
  max=${Math.max(1,Number(k.total_children||0))}
@@ -729,20 +803,52 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
729
803
  >
730
804
  <colgroup>
731
805
  <col class="epics-table__col epics-table__col--id" />
732
- <col class="epics-table__col epics-table__col--type" />
733
- <col class="epics-table__col epics-table__col--title" />
734
- <col class="epics-table__col epics-table__col--status" />
735
- <col class="epics-table__col epics-table__col--assignee" />
736
- <col class="epics-table__col epics-table__col--priority" />
806
+ <col
807
+ class="epics-table__col epics-table__col--type"
808
+ />
809
+ <col
810
+ class="epics-table__col epics-table__col--title"
811
+ />
812
+ <col
813
+ class="epics-table__col epics-table__col--status"
814
+ />
815
+ <col
816
+ class="epics-table__col epics-table__col--assignee"
817
+ />
818
+ <col
819
+ class="epics-table__col epics-table__col--priority"
820
+ />
737
821
  </colgroup>
738
822
  <thead data-testid=${`epic-children-header-${$}`}>
739
823
  <tr>
740
- <th data-testid=${`epic-children-header-id-${$}`}>${F("id","ID")}</th>
741
- <th data-testid=${`epic-children-header-type-${$}`}>${F("type","Type")}</th>
742
- <th data-testid=${`epic-children-header-title-${$}`}>${F("title","Title")}</th>
743
- <th data-testid=${`epic-children-header-status-${$}`}>${F("status","Status")}</th>
744
- <th data-testid=${`epic-children-header-assignee-${$}`}>${F("assignee","Assignee")}</th>
745
- <th data-testid=${`epic-children-header-priority-${$}`}>${F("priority","Priority")}</th>
824
+ <th data-testid=${`epic-children-header-id-${$}`}>
825
+ ${F("id","ID")}
826
+ </th>
827
+ <th
828
+ data-testid=${`epic-children-header-type-${$}`}
829
+ >
830
+ ${F("type","Type")}
831
+ </th>
832
+ <th
833
+ data-testid=${`epic-children-header-title-${$}`}
834
+ >
835
+ ${F("title","Title")}
836
+ </th>
837
+ <th
838
+ data-testid=${`epic-children-header-status-${$}`}
839
+ >
840
+ ${F("status","Status")}
841
+ </th>
842
+ <th
843
+ data-testid=${`epic-children-header-assignee-${$}`}
844
+ >
845
+ ${F("assignee","Assignee")}
846
+ </th>
847
+ <th
848
+ data-testid=${`epic-children-header-priority-${$}`}
849
+ >
850
+ ${F("priority","Priority")}
851
+ </th>
746
852
  </tr>
747
853
  </thead>
748
854
  <tbody data-testid=${`epic-children-rows-${$}`}>
@@ -778,71 +884,77 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
778
884
  `,s.appendChild(n);let r=n.querySelector("#issue-dialog-body"),i=n.querySelector("#issue-dialog-title"),a=n.querySelector(".issue-dialog__close");a?.setAttribute("data-testid","issue-dialog-close"),i?.setAttribute("data-testid","issue-dialog-title");function l(m){i.replaceChildren(),i.appendChild(nt(m))}n.addEventListener("mousedown",m=>{m.target===n&&(m.preventDefault(),f())}),n.addEventListener("cancel",m=>{m.preventDefault(),f()}),a.addEventListener("click",()=>f());let o=null;function f(){try{typeof n.close=="function"?n.close():n.removeAttribute("open")}catch{n.removeAttribute("open")}try{t()}catch{}d()}function u(m){try{let y=document.activeElement;y&&y instanceof HTMLElement?o=y:o=null}catch{o=null}l(m);try{"showModal"in n&&typeof n.showModal=="function"?n.showModal():n.setAttribute("open",""),setTimeout(()=>{try{a.focus()}catch{}},0)}catch{n.setAttribute("open","")}}function h(){try{typeof n.close=="function"?n.close():n.removeAttribute("open")}catch{n.removeAttribute("open")}d()}function d(){try{o&&document.contains(o)&&o.focus()}catch{}finally{o=null}}return{open:u,close:h,getMount(){return r}}}var bs=["bug","feature","task","epic","chore"];function Vt(s){switch((s||"").toString().toLowerCase()){case"bug":return"Bug";case"feature":return"Feature";case"task":return"Task";case"epic":return"Epic";case"chore":return"Chore";default:return""}}function _n(s,e,t,n,r=void 0,i=void 0){let a=de("views:list"),l=[],o="",f=[],u=[],h=n?n.getState().selected_id:null,d=null,m=!1,y=!1;function S(w){return Array.isArray(w)?w:typeof w=="string"&&w!==""&&w!=="all"?[w]:[]}function E(w){return Array.isArray(w)?w:typeof w=="string"&&w!==""?[w]:[]}let M=ms({navigate:w=>{let b=t||(O=>window.location.hash=O),v=n?n.getState().view:"issues";b(rt(v,w))},onUpdate:re,requestRender:W,getSelectedId:()=>h,row_class:"issue-row"}),F=async w=>{l.includes(w)?l=l.filter(b=>b!==w):l=[...l,w],a("status toggle %s -> %o",w,l),n&&n.setState({filters:{status:l}}),await le()},Z=w=>{o=w.currentTarget.value,a("search input %s",o),n&&n.setState({filters:{search:o}}),W()},N=w=>{u.includes(w)?u=u.filter(b=>b!==w):u=[...u,w],a("type toggle %s -> %o",w,u),n&&n.setState({filters:{type:u}}),W()},z=w=>{w.stopPropagation(),m=!m,y=!1,W()},H=w=>{w.stopPropagation(),y=!y,m=!1,W()};function ee(w,b,v){return w.length===0?`${b}: Any`:w.length===1?`${b}: ${v(w[0])}`:`${b} (${w.length})`}if(n){let w=n.getState();w&&w.filters&&typeof w.filters=="object"&&(l=S(w.filters.status),o=w.filters.search||"",u=E(w.filters.type))}let D=i?st(i):null;function X(){let w=f;if(l.length>0&&!l.includes("ready")&&(w=w.filter(b=>l.includes(String(b.status||"")))),o){let b=o.toLowerCase();w=w.filter(v=>{let O=String(v.id).toLowerCase(),L=String(v.title||"").toLowerCase();return O.includes(b)||L.includes(b)})}return u.length>0&&(w=w.filter(b=>u.includes(String(b.issue_type||"")))),l.length===1&&l[0]==="closed"&&(w=w.slice().sort(vt)),T`
779
885
  <div class="panel__header" data-testid="list-view">
780
886
  <div class="list-filters" data-testid="list-filters">
781
- <div
782
- class="filter-dropdown ${m?"is-open":""}"
783
- data-testid="list-filter-status"
784
- >
785
- <button
786
- class="filter-dropdown__trigger"
787
- @click=${z}
788
- data-testid="list-filter-status-trigger"
887
+ <div
888
+ class="filter-dropdown ${m?"is-open":""}"
889
+ data-testid="list-filter-status"
789
890
  >
790
- ${ee(l,"Status",Je)}
791
- <span class="filter-dropdown__arrow">▾</span>
792
- </button>
793
- <div class="filter-dropdown__menu" data-testid="list-filter-status-menu">
794
- ${["ready","open","in_progress","closed"].map(b=>T`
795
- <label
796
- class="filter-dropdown__option"
797
- data-testid=${`list-filter-status-option-${b}`}
798
- >
799
- <input
800
- type="checkbox"
801
- .checked=${l.includes(b)}
802
- @change=${()=>F(b)}
803
- data-testid=${`list-filter-status-checkbox-${b}`}
804
- />
805
- ${b==="ready"?"Ready":Je(b)}
806
- </label>
807
- `)}
891
+ <button
892
+ class="filter-dropdown__trigger"
893
+ @click=${z}
894
+ data-testid="list-filter-status-trigger"
895
+ >
896
+ ${ee(l,"Status",Je)}
897
+ <span class="filter-dropdown__arrow">▾</span>
898
+ </button>
899
+ <div
900
+ class="filter-dropdown__menu"
901
+ data-testid="list-filter-status-menu"
902
+ >
903
+ ${["ready","open","in_progress","closed"].map(b=>T`
904
+ <label
905
+ class="filter-dropdown__option"
906
+ data-testid=${`list-filter-status-option-${b}`}
907
+ >
908
+ <input
909
+ type="checkbox"
910
+ .checked=${l.includes(b)}
911
+ @change=${()=>F(b)}
912
+ data-testid=${`list-filter-status-checkbox-${b}`}
913
+ />
914
+ ${b==="ready"?"Ready":Je(b)}
915
+ </label>
916
+ `)}
917
+ </div>
808
918
  </div>
809
- </div>
810
- <div
811
- class="filter-dropdown ${y?"is-open":""}"
812
- data-testid="list-filter-type"
813
- >
814
- <button
815
- class="filter-dropdown__trigger"
816
- @click=${H}
817
- data-testid="list-filter-type-trigger"
919
+ <div
920
+ class="filter-dropdown ${y?"is-open":""}"
921
+ data-testid="list-filter-type"
818
922
  >
819
- ${ee(u,"Types",Vt)}
820
- <span class="filter-dropdown__arrow">▾</span>
821
- </button>
822
- <div class="filter-dropdown__menu" data-testid="list-filter-type-menu">
823
- ${bs.map(b=>T`
824
- <label
825
- class="filter-dropdown__option"
826
- data-testid=${`list-filter-type-option-${b}`}
827
- >
828
- <input
829
- type="checkbox"
830
- .checked=${u.includes(b)}
831
- @change=${()=>N(b)}
832
- data-testid=${`list-filter-type-checkbox-${b}`}
833
- />
834
- ${Vt(b)}
835
- </label>
836
- `)}
923
+ <button
924
+ class="filter-dropdown__trigger"
925
+ @click=${H}
926
+ data-testid="list-filter-type-trigger"
927
+ >
928
+ ${ee(u,"Types",Vt)}
929
+ <span class="filter-dropdown__arrow">▾</span>
930
+ </button>
931
+ <div
932
+ class="filter-dropdown__menu"
933
+ data-testid="list-filter-type-menu"
934
+ >
935
+ ${bs.map(b=>T`
936
+ <label
937
+ class="filter-dropdown__option"
938
+ data-testid=${`list-filter-type-option-${b}`}
939
+ >
940
+ <input
941
+ type="checkbox"
942
+ .checked=${u.includes(b)}
943
+ @change=${()=>N(b)}
944
+ data-testid=${`list-filter-type-checkbox-${b}`}
945
+ />
946
+ ${Vt(b)}
947
+ </label>
948
+ `)}
949
+ </div>
837
950
  </div>
838
- </div>
839
- <input
840
- type="search"
841
- placeholder="Search…"
842
- @input=${Z}
843
- .value=${o}
844
- data-testid="list-search-input"
845
- />
951
+ <input
952
+ type="search"
953
+ placeholder="Search…"
954
+ @input=${Z}
955
+ .value=${o}
956
+ data-testid="list-search-input"
957
+ />
846
958
  </div>
847
959
  </div>
848
960
  <div class="panel__body" id="list-root" data-testid="list-body">
@@ -877,12 +989,24 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
877
989
  <thead data-testid="list-header">
878
990
  <tr role="row">
879
991
  <th role="columnheader" data-testid="list-header-id">ID</th>
880
- <th role="columnheader" data-testid="list-header-type">Type</th>
881
- <th role="columnheader" data-testid="list-header-title">Title</th>
882
- <th role="columnheader" data-testid="list-header-status">Status</th>
883
- <th role="columnheader" data-testid="list-header-assignee">Assignee</th>
884
- <th role="columnheader" data-testid="list-header-priority">Priority</th>
885
- <th role="columnheader" data-testid="list-header-deps">Deps</th>
992
+ <th role="columnheader" data-testid="list-header-type">
993
+ Type
994
+ </th>
995
+ <th role="columnheader" data-testid="list-header-title">
996
+ Title
997
+ </th>
998
+ <th role="columnheader" data-testid="list-header-status">
999
+ Status
1000
+ </th>
1001
+ <th role="columnheader" data-testid="list-header-assignee">
1002
+ Assignee
1003
+ </th>
1004
+ <th role="columnheader" data-testid="list-header-priority">
1005
+ Priority
1006
+ </th>
1007
+ <th role="columnheader" data-testid="list-header-deps">
1008
+ Deps
1009
+ </th>
886
1010
  </tr>
887
1011
  </thead>
888
1012
  <tbody role="rowgroup" data-testid="list-rows">
@@ -892,11 +1016,7 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
892
1016
  </div>`}
893
1017
  </div>
894
1018
  `}function W(){Te(X(),s)}W();async function re(w,b){try{a("updateInline %s %o",w,Object.keys(b)),typeof b.title=="string"&&await e("edit-text",{id:w,field:"title",value:b.title}),typeof b.assignee=="string"&&await e("update-assignee",{id:w,assignee:b.assignee}),typeof b.status=="string"&&await e("update-status",{id:w,status:b.status}),typeof b.priority=="number"&&await e("update-priority",{id:w,priority:b.priority})}catch{}}async function le(){a("load");let w=s.querySelector("#list-root"),b=w?w.scrollTop:0;try{D?f=D.selectIssuesFor("tab:issues"):f=[]}catch(v){a("load failed: %o",v),f=[]}W();try{let v=s.querySelector("#list-root");v&&b>0&&(v.scrollTop=b)}catch{}}s.tabIndex=0,s.addEventListener("keydown",w=>{if(w.key==="ArrowDown"||w.key==="ArrowUp"){let L=w.target;if((L&&typeof L.closest=="function"?L.closest("#list-root table.table"):null)&&!!!(L&&typeof L.closest=="function"&&(L.closest("input")||L.closest("textarea")||L.closest("select")))){let B=L&&typeof L.closest=="function"?L.closest("td"):null;if(B&&B.parentElement){let k=B.parentElement,x=k.parentElement;if(x&&x.querySelectorAll){let $=Array.from(x.querySelectorAll("tr")),K=Math.max(0,$.indexOf(k)),fe=B.cellIndex||0,ue=w.key==="ArrowDown"?Math.min(K+1,$.length-1):Math.max(K-1,0),se=$[ue],V=se&&se.cells?se.cells[fe]:null;if(V){let pe=V.querySelector('button:not([disabled]), [tabindex]:not([tabindex="-1"]), a[href], select:not([disabled]), input:not([disabled]):not([type="hidden"]), textarea:not([disabled])');if(pe&&typeof pe.focus=="function"){w.preventDefault(),pe.focus();return}}}}}}let b=s.querySelector("#list-root tbody"),v=b?b.querySelectorAll("tr"):[];if(v.length===0)return;let O=0;if(h&&(O=Array.from(v).findIndex(q=>(q.getAttribute("data-issue-id")||"")===h),O<0&&(O=0)),w.key==="ArrowDown"){w.preventDefault();let L=v[Math.min(O+1,v.length-1)],q=L?L.getAttribute("data-issue-id"):"",G=q||null;n&&G&&n.setState({selected_id:G}),h=G,W()}else if(w.key==="ArrowUp"){w.preventDefault();let L=v[Math.max(O-1,0)],q=L?L.getAttribute("data-issue-id"):"",G=q||null;n&&G&&n.setState({selected_id:G}),h=G,W()}else if(w.key==="Enter"){w.preventDefault();let L=v[O],q=L?L.getAttribute("data-issue-id"):"";if(q){let G=t||(k=>window.location.hash=k),B=n?n.getState().view:"issues";G(rt(B,q))}}});let ye=w=>{let b=w.target;b&&!b.closest(".filter-dropdown")&&(m||y)&&(m=!1,y=!1,W())};return document.addEventListener("click",ye),n&&(d=n.subscribe(w=>{if(w.selected_id!==h&&(h=w.selected_id,a("selected %s",h||"(none)"),W()),w.filters&&typeof w.filters=="object"){let b=S(w.filters.status),v=w.filters.search||"",O=!1;if(JSON.stringify(b)!==JSON.stringify(l)){l=b,le();return}v!==o&&(o=v,O=!0);let q=E(w.filters.type);JSON.stringify(q)!==JSON.stringify(u)&&(u=q,O=!0),O&&W()}})),D&&D.subscribe(()=>{try{f=D.selectIssuesFor("tab:issues"),W()}catch{}}),{load:le,destroy(){s.replaceChildren(),document.removeEventListener("click",ye),d&&(d(),d=null)}}}function vn(s,e,t){let n=de("views:nav"),r=null;function i(o){return f=>{f.preventDefault(),n("click tab %s",o),t.gotoView(o)}}function a(){let f=e.getState().view||"issues";return T`
895
- <nav
896
- class="header-nav"
897
- aria-label="Primary"
898
- data-testid="top-nav"
899
- >
1019
+ <nav class="header-nav" aria-label="Primary" data-testid="top-nav">
900
1020
  <a
901
1021
  href="#/issues"
902
1022
  class="tab ${f==="issues"?"active":""}"
@@ -960,7 +1080,8 @@ Please report this to https://github.com/markedjs/marked.`,s){let n="<p>An error
960
1080
  class="workspace-picker__label"
961
1081
  title="${h[0].path}"
962
1082
  data-testid="workspace-picker-label"
963
- >${m}</span>
1083
+ >${m}</span
1084
+ >
964
1085
  </div>
965
1086
  `}let d=u?.path||"";return T`
966
1087
  <div class="workspace-picker" data-testid="workspace-picker">