@jxsuite/studio 6.0.0 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/chunks/{2020-cs2sb9t1.js → 2020-nkxms0ay.js} +3 -3
  2. package/dist/chunks/adapter-m948ab5f.js +4 -0
  3. package/dist/chunks/{cf-account-picker-bb2yq946.js → cf-account-picker-n8hr38v7.js} +3 -3
  4. package/dist/chunks/cf-settings-356xdtne.js +4 -0
  5. package/dist/chunks/components-yk3t844e.js +4 -0
  6. package/dist/chunks/content-source-bawmyc09.js +4 -0
  7. package/dist/chunks/{convert-to-repeater-vqkt7s3s.js → convert-to-repeater-7wns8kf1.js} +3 -3
  8. package/dist/chunks/editor-6sc8nacq.js +4 -0
  9. package/dist/chunks/entry-commands-8ay9fh81.js +4 -0
  10. package/dist/chunks/{extension-sections-8beq9ac3.js → extension-sections-na7rj3nr.js} +3 -3
  11. package/dist/chunks/file-ops-gye0qw56.js +4 -0
  12. package/dist/chunks/files-dmc2xvcq.js +4 -0
  13. package/dist/chunks/format-host-t76b53f8.js +4 -0
  14. package/dist/chunks/fs-events-cg4tpz06.js +4 -0
  15. package/dist/chunks/git-panel-yef7bshy.js +4 -0
  16. package/dist/chunks/{grid-view-ca10def6.js → grid-view-7tt4bxw1.js} +6 -6
  17. package/dist/chunks/iframe-host-tmz30gfp.js +4 -0
  18. package/dist/chunks/{index-9ydfe04y.js → index-gybvv7a6.js} +3 -3
  19. package/dist/chunks/index-nag78a9h.js +4 -0
  20. package/dist/chunks/{javascript-d9pqgc2p.js → javascript-rnvdp3k4.js} +2 -2
  21. package/dist/chunks/{jsonMode-800yvbem.js → jsonMode-zhwsprqk.js} +5 -5
  22. package/dist/chunks/jx-validate-3gbp5nkn.js +4 -0
  23. package/dist/chunks/layers-fvz99859.js +4 -0
  24. package/dist/chunks/layers-panel-gchmbf9p.js +4 -0
  25. package/dist/chunks/lit-html-9agdspkt.js +4 -0
  26. package/dist/chunks/media-picker-rhjvyy00.js +4 -0
  27. package/dist/chunks/menu-2e4y9j7b.js +4 -0
  28. package/dist/chunks/{monaco-binding-62dtmgbf.js → monaco-binding-2jnhjjvr.js} +3 -3
  29. package/dist/chunks/monaco-buffer-rp21359g.js +4 -0
  30. package/dist/chunks/{monaco-setup-tj13ndtm.js → monaco-setup-vhh7gayr.js} +3 -3
  31. package/dist/chunks/notify-h3www560.js +4 -0
  32. package/dist/chunks/platform-hz34wcd7.js +4 -0
  33. package/dist/chunks/publish-panel-exsmjzyj.js +4 -0
  34. package/dist/chunks/quick-search-pgaqeh0m.js +4 -0
  35. package/dist/chunks/references-2cgdxnb8.js +4 -0
  36. package/dist/chunks/right-panel-jf856w5w.js +4 -0
  37. package/dist/chunks/section-registry-jnf8r5gy.js +4 -0
  38. package/dist/chunks/studio-0f55h9ye.js +5 -0
  39. package/dist/chunks/{studio-hjbg8d5y.js → studio-0sqdhnew.js} +7 -7
  40. package/dist/chunks/{studio-1wvfxkyy.js → studio-0x3jyb8r.js} +4 -4
  41. package/dist/chunks/{studio-yr04mv2j.js → studio-19x1c75w.js} +4 -4
  42. package/dist/chunks/{studio-evwgp1ym.js → studio-2sqcndak.js} +4 -4
  43. package/dist/chunks/{studio-x5g1xk77.js → studio-3aey7dd3.js} +4 -4
  44. package/dist/chunks/{studio-xkfs0dp2.js → studio-3bpdkq2s.js} +4 -4
  45. package/dist/chunks/{studio-5gs9th4b.js → studio-47y6fbpf.js} +4 -4
  46. package/dist/chunks/{studio-e47215hh.js → studio-4m3826v2.js} +4 -4
  47. package/dist/chunks/studio-4nx2dj1g.js +4 -0
  48. package/dist/chunks/{studio-gjknvzam.js → studio-4xv5s47r.js} +5 -5
  49. package/dist/chunks/{studio-sxc0zvpt.js → studio-5g0ag7c0.js} +3 -3
  50. package/dist/chunks/{studio-semd1s8s.js → studio-5g4t8v6w.js} +4 -4
  51. package/dist/chunks/studio-5py436sf.js +5 -0
  52. package/dist/chunks/{studio-aje966s9.js → studio-77kt594t.js} +4 -4
  53. package/dist/chunks/{studio-3ck2a5c4.js → studio-8f87n763.js} +6 -6
  54. package/dist/chunks/studio-8mb00b84.js +5 -0
  55. package/dist/chunks/studio-8p51gq2h.js +6 -0
  56. package/dist/chunks/studio-954ds834.js +5 -0
  57. package/dist/chunks/{studio-capk0583.js → studio-9ft45c83.js} +6 -6
  58. package/dist/chunks/studio-a2138x5k.js +7 -0
  59. package/dist/chunks/studio-a9yzstqj.js +5 -0
  60. package/dist/chunks/{studio-gp02nqnw.js → studio-acdksxx6.js} +4 -4
  61. package/dist/chunks/{studio-edbtvcd1.js → studio-anyrgzvb.js} +4 -4
  62. package/dist/chunks/{studio-4r0sjtx8.js → studio-ar8jcf2y.js} +4 -4
  63. package/dist/chunks/{studio-rmn2dz59.js → studio-bmn4mn9j.js} +5 -5
  64. package/dist/chunks/{studio-03wwfvyt.js → studio-cpxkgjrj.js} +4 -4
  65. package/dist/chunks/{studio-7qvs7v0m.js → studio-e7xxa0sj.js} +4 -4
  66. package/dist/chunks/{studio-01qza1n3.js → studio-ecaz25vk.js} +4 -4
  67. package/dist/chunks/{studio-5e9zsamh.js → studio-fzdywr6p.js} +6 -6
  68. package/dist/chunks/{studio-xg1942as.js → studio-g5fmf0c1.js} +4 -4
  69. package/dist/chunks/{studio-1q6amtph.js → studio-g7nse7zb.js} +4 -4
  70. package/dist/chunks/studio-geq1ea6k.js +14 -0
  71. package/dist/chunks/{studio-n78gjfy8.js → studio-ghkb32r8.js} +4 -4
  72. package/dist/chunks/{studio-bftp4n4b.js → studio-ghrhy2y7.js} +4 -4
  73. package/dist/chunks/{studio-5d7wfmnp.js → studio-grawhey1.js} +4 -4
  74. package/dist/chunks/{studio-rr4xkv81.js → studio-h0xgswew.js} +4 -4
  75. package/dist/chunks/{studio-cbr9czkn.js → studio-h9c4p2tx.js} +4 -4
  76. package/dist/chunks/studio-jyzj5cxs.js +5 -0
  77. package/dist/chunks/{studio-x92tgnee.js → studio-mgx8yhnz.js} +31 -31
  78. package/dist/chunks/{studio-g8dsj3d2.js → studio-mpb04y1d.js} +5 -5
  79. package/dist/chunks/{studio-zev8ssp1.js → studio-n17mty64.js} +4 -4
  80. package/dist/chunks/{studio-4jj9gme2.js → studio-nwh2eqsk.js} +5 -5
  81. package/dist/chunks/{studio-8xcwewjq.js → studio-pxg4ap1e.js} +3 -3
  82. package/dist/chunks/{studio-4m50vh74.js → studio-q1h883bt.js} +5 -5
  83. package/dist/chunks/{studio-c6zdm25z.js → studio-q4tv82h7.js} +6 -6
  84. package/dist/chunks/{studio-st75kn99.js → studio-qbj760tx.js} +5 -5
  85. package/dist/chunks/{studio-y7jehjrp.js → studio-qpqa7vk3.js} +4 -4
  86. package/dist/chunks/{studio-5vy2wfm5.js → studio-qqz8e5gk.js} +4 -4
  87. package/dist/chunks/{studio-qa73881a.js → studio-qvasen3f.js} +4 -4
  88. package/dist/chunks/studio-rggdb3hm.js +5 -0
  89. package/dist/chunks/{studio-4xppwncr.js → studio-sghy936h.js} +3 -3
  90. package/dist/chunks/{studio-mk00zd5d.js → studio-skprc6ef.js} +4 -4
  91. package/dist/chunks/{studio-cqmtbg2p.js → studio-tt2nactf.js} +4 -4
  92. package/dist/chunks/{studio-ge5fqjth.js → studio-txjjzrsm.js} +5 -5
  93. package/dist/chunks/{studio-tmeq6mjb.js → studio-tyasmc39.js} +4 -4
  94. package/dist/chunks/{studio-0bbxhhce.js → studio-v2bvmbjj.js} +4 -4
  95. package/dist/chunks/{studio-pwqfmt4p.js → studio-vk9ezads.js} +4 -4
  96. package/dist/chunks/{studio-fqq890ap.js → studio-vzacdfsc.js} +3 -3
  97. package/dist/chunks/{studio-zd4kayn2.js → studio-w4c0xmrw.js} +4 -4
  98. package/dist/chunks/{studio-ztvcxm3w.js → studio-wfjqhhbk.js} +4 -4
  99. package/dist/chunks/{studio-tp642n5g.js → studio-wgh5kxpj.js} +4 -4
  100. package/dist/chunks/studio-xasj0796.js +5 -0
  101. package/dist/chunks/{studio-tzegmy4w.js → studio-y78s8r2n.js} +4 -4
  102. package/dist/chunks/{studio-7pgy3xaf.js → studio-z8w183sh.js} +4 -4
  103. package/dist/chunks/{studio-01kbbqg3.js → studio-zscd9ty4.js} +124 -124
  104. package/dist/chunks/{studio-hnvnfbdv.js → studio-zxp13sss.js} +6 -6
  105. package/dist/chunks/{studio-r3kaka4d.js → studio-zygnmm01.js} +4 -4
  106. package/dist/chunks/{tsMode-k9s9fcag.js → tsMode-gr0m4dzr.js} +5 -5
  107. package/dist/chunks/workspace-m15qtcqp.js +4 -0
  108. package/dist/chunks/{ws-client-0ja08haa.js → ws-client-nf61frr1.js} +3 -3
  109. package/dist/manifest.json +62 -62
  110. package/dist/studio.js +83 -83
  111. package/package.json +2 -2
  112. package/src/new-project/add-repo-modal.ts +459 -59
  113. package/src/platforms/cloud.ts +95 -18
  114. package/src/publish/pages-service.ts +7 -0
  115. package/src/publish/publish-panel.ts +16 -2
  116. package/src/surfaces/add-repo.json +721 -224
  117. package/src/surfaces/add-repo.ts +196 -31
  118. package/src/types.ts +42 -3
  119. package/src/utils/project-dir.ts +24 -0
  120. package/dist/chunks/adapter-y5gdq19c.js +0 -4
  121. package/dist/chunks/cf-settings-20dznc3j.js +0 -4
  122. package/dist/chunks/components-q037dya7.js +0 -4
  123. package/dist/chunks/content-source-t0q184js.js +0 -4
  124. package/dist/chunks/editor-j5sq149q.js +0 -4
  125. package/dist/chunks/entry-commands-fxzgcc4k.js +0 -4
  126. package/dist/chunks/file-ops-2n77759h.js +0 -4
  127. package/dist/chunks/files-fjy7zpxt.js +0 -4
  128. package/dist/chunks/format-host-wj3mf3n8.js +0 -4
  129. package/dist/chunks/fs-events-7kcgn4e9.js +0 -4
  130. package/dist/chunks/git-panel-7z2mpt2d.js +0 -4
  131. package/dist/chunks/iframe-host-a0zjd6xp.js +0 -4
  132. package/dist/chunks/index-m0x5ztax.js +0 -4
  133. package/dist/chunks/jx-validate-zc9zp77s.js +0 -4
  134. package/dist/chunks/layers-p677nrh5.js +0 -4
  135. package/dist/chunks/layers-panel-y4w1dq90.js +0 -4
  136. package/dist/chunks/lit-html-cfn61dn7.js +0 -4
  137. package/dist/chunks/media-picker-xg7yjpz9.js +0 -4
  138. package/dist/chunks/menu-fpekzj6w.js +0 -4
  139. package/dist/chunks/monaco-buffer-nn4dtx27.js +0 -4
  140. package/dist/chunks/notify-ahs57a2z.js +0 -4
  141. package/dist/chunks/platform-v9xyfkbx.js +0 -4
  142. package/dist/chunks/publish-panel-xtbfgg2r.js +0 -4
  143. package/dist/chunks/quick-search-d3a6m7j3.js +0 -4
  144. package/dist/chunks/references-99ws0b0m.js +0 -4
  145. package/dist/chunks/right-panel-31vbk5xp.js +0 -4
  146. package/dist/chunks/section-registry-b2yzp9sw.js +0 -4
  147. package/dist/chunks/studio-1a99w39s.js +0 -5
  148. package/dist/chunks/studio-4fde4a0x.js +0 -5
  149. package/dist/chunks/studio-84rtc120.js +0 -5
  150. package/dist/chunks/studio-aekhcdzw.js +0 -7
  151. package/dist/chunks/studio-aqmph6k4.js +0 -5
  152. package/dist/chunks/studio-chdmwwzw.js +0 -5
  153. package/dist/chunks/studio-cp1gbff9.js +0 -14
  154. package/dist/chunks/studio-fbx6twps.js +0 -6
  155. package/dist/chunks/studio-fthwn4kf.js +0 -5
  156. package/dist/chunks/studio-nbxqcgvf.js +0 -5
  157. package/dist/chunks/studio-t1eedsyx.js +0 -4
  158. package/dist/chunks/studio-vavmwshr.js +0 -5
  159. package/dist/chunks/workspace-5vmgsagj.js +0 -4
@@ -3,29 +3,36 @@
3
3
  * The repository picker as a mounted document.
4
4
  *
5
5
  * `new-project/add-repo-modal.ts` is the flow — it asks the platform which repositories the account
6
- * link reaches, decides which of them Open Project may offer, adopts the one that was chosen and
6
+ * link reaches, which projects a chosen repository holds, adopts the one that was confirmed and
7
7
  * resolves the promise its two entry points return — and this is the surface it draws into: the
8
- * reactive scope the document reads, the one discriminant it branches on, and the mount that lives
9
- * in the dialog layer until the flow takes it down.
8
+ * reactive scope the document reads, the discriminants it branches on, and the mount that lives in
9
+ * the dialog layer until the flow takes it down.
10
+ *
11
+ * **Two fields, each with the list it drives.** The filter drives the repository list and the
12
+ * project-folder field drives the list of folders that repository holds a `project.json` in. A
13
+ * `jx-listbox` never takes focus (ui.md §5.3), so a list a reader can only click is a list a
14
+ * keyboard cannot reach; pairing each list with a field is what makes both of them operable from
15
+ * the keys — the palette's shape, twice. The folder field is also the answer when a list cannot be:
16
+ * a repository too large to scan, or a platform with no way to scan one.
10
17
  *
11
18
  * **The flow states facts; the surface derives what the document branches on.** Which repositories
12
- * are visible, what each row says and whether the listing has landed are the flow's; whether that
13
- * adds up to a list, a spinner or one of four different absences is {@link derive}'s, so neither
14
- * the flow nor the document has to know that "nothing matched your filter" and "the App cannot see
15
- * anything" are two sentences with two different remedies.
19
+ * are visible, which one is chosen and which folders it holds are the flow's; whether that adds up
20
+ * to a list, a spinner or one of four different absences, which row id each listbox is told is
21
+ * active, and whether the dialog can be answered yet are {@link derive}'s.
16
22
  *
17
23
  * **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
18
24
  * a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
19
25
  * no `<dialog>` to open — the body is all there, correctly styled, and never shows. `whenReady` is
20
26
  * shared with `surfaces/dialog.ts` and `surfaces/cf-account-picker.ts` rather than reimplemented.
21
27
  *
22
- * @docs studio/projects/create
28
+ * @docs studio/interface/welcome-screen
23
29
  */
24
30
 
25
31
  import { reactive } from "../reactivity";
26
32
  import { mountSurface, registerSurface } from "../ui/surface";
27
33
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
28
34
  import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
35
+ import { focusField } from "@jxsuite/ui/behaviors/textfield";
29
36
  import { whenReady } from "./dialog";
30
37
  import addRepoDoc from "./add-repo.json";
31
38
  import type { SurfaceHandle } from "../ui/surface";
@@ -35,17 +42,23 @@ registerSurface("add-repo", addRepoDoc as unknown as JxDocument);
35
42
 
36
43
  /** One repository, as the list draws it. Every field is already a string or a flag. */
37
44
  export interface AddRepoRow {
38
- /** `owner/name`, which is the row's key, its title and the text it leads with. */
45
+ /** `owner/name`, which is the row's key, its value, its title and the text it leads with. */
39
46
  fullName: string;
40
- /** The branch and permission line beside the name. */
47
+ /** The default branch, beside the name. */
41
48
  meta: string;
42
49
  /** The repository already carries the Jx topic, so it gets the badge. */
43
50
  isJx: boolean;
44
51
  isPrivate: boolean;
45
- /** This row is the one being adopted, so it says so. */
46
- importing: boolean;
47
- /** Any adoption is in flight, so no row may start another. */
48
- disabled: boolean;
52
+ }
53
+
54
+ /** One folder of the chosen repository that holds a `project.json`. */
55
+ export interface AddRepoLocation {
56
+ /** The folder, repository-relative and canonical; `""` is the root. The row's value. */
57
+ dir: string;
58
+ /** What the row says: the project's own name, else the folder's. */
59
+ label: string;
60
+ /** Where it is: `/` for the root, `sites/blog/` for a folder. */
61
+ path: string;
49
62
  }
50
63
 
51
64
  /** One way to widen what the GitHub App can reach. */
@@ -55,24 +68,50 @@ export interface AddRepoAccessLink {
55
68
  title: string;
56
69
  }
57
70
 
71
+ /** One entry of the account filter. `""` is every account. */
72
+ export interface AddRepoOwner {
73
+ value: string;
74
+ label: string;
75
+ }
76
+
58
77
  /**
59
- * Why the list is empty, when it is.
78
+ * Why the repository list is empty, when it is.
60
79
  *
61
80
  * Four, not one, because only two of them are the reader's to fix and each is fixed differently: a
62
81
  * filter is cleared, write access is asked for, and an App that was never installed is installed.
63
82
  */
64
83
  export type AddRepoEmptyState = "filter" | "write" | "install" | "none";
65
84
 
85
+ /**
86
+ * What the detail pane knows about the chosen repository's projects.
87
+ *
88
+ * - `none`: no repository is chosen yet.
89
+ * - `loading`: the platform is looking.
90
+ * - `listed`: it found at least one folder with a `project.json`.
91
+ * - `empty`: it looked and found none.
92
+ * - `unlisted`: the platform cannot look, so the folder is the reader's to name.
93
+ * - `failed`: the look itself failed; the folder field still works.
94
+ */
95
+ export type AddRepoDetailState = "none" | "loading" | "listed" | "empty" | "unlisted" | "failed";
96
+
66
97
  /** What the flow knows. Every one of these may change while the dialog is up. */
67
98
  export interface AddRepoView {
68
99
  /** The headline, which is also the dialog's accessible name: the two flows name themselves. */
69
100
  title: string;
101
+ /** The primary answer: Open or Add, and the progressive form while an adoption runs. */
102
+ confirmLabel: string;
70
103
  /** The filter text, held by the flow so a repaint cannot lose what the reader typed. */
71
104
  filter: string;
105
+ /** The account the list is narrowed to; `""` is every account. */
106
+ owner: string;
107
+ /** The account filter's entries, "All accounts" first; empty hides it (one account, or none). */
108
+ owners: AddRepoOwner[];
72
109
  /** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
73
110
  loading: boolean;
74
111
  /** The repositories to draw, already filtered and ordered. */
75
112
  rows: AddRepoRow[];
113
+ /** The chosen repository's full name; `""` when none is. It may be filtered out of `rows`. */
114
+ selected: string;
76
115
  /** Which absence to say, read only when `rows` is empty and the listing has landed. */
77
116
  emptyState: AddRepoEmptyState;
78
117
  /** Where the GitHub App is installed from, for the sentence that offers to install it. */
@@ -81,6 +120,30 @@ export interface AddRepoView {
81
120
  failure: string;
82
121
  /** The access footer's links; empty for a platform with no account status to widen. */
83
122
  access: AddRepoAccessLink[];
123
+ /** The chosen repository's projects, as far as the platform has looked. */
124
+ detailState: AddRepoDetailState;
125
+ /** The chosen repository's full name and the line beside it, for the pane's heading. */
126
+ detailName: string;
127
+ detailMeta: string;
128
+ /** The folders the chosen repository holds a `project.json` in. */
129
+ locations: AddRepoLocation[];
130
+ /** The folder field's text: the folder the dialog will open, `""` for the repository root. */
131
+ folder: string;
132
+ /**
133
+ * The same folder in its canonical spelling (`utils/project-dir.ts`), which is what a folder row
134
+ * is matched against: `sites/blog/` typed by hand is the `sites/blog` row.
135
+ */
136
+ chosenFolder: string;
137
+ /** Why the folder field's text cannot be opened; `""` when it can. */
138
+ folderError: string;
139
+ /** The sentence under the folder field. */
140
+ folderHelp: string;
141
+ /** What confirming will do, said in one line; `""` when nothing is chosen. */
142
+ summary: string;
143
+ /** The dialog can be answered: a repository is chosen, its folder is usable, nothing is running. */
144
+ canConfirm: boolean;
145
+ /** An adoption is in flight. */
146
+ busy: boolean;
84
147
  }
85
148
 
86
149
  export interface AddRepoSurfaceOptions {
@@ -90,8 +153,22 @@ export interface AddRepoSurfaceOptions {
90
153
  view: AddRepoView;
91
154
  /** The reader typed in the filter field. The flow decides what it hides. */
92
155
  onFilter: (value: string) => void;
93
- /** A row was pressed: this repository, please. */
94
- onChoose: (fullName: string) => void;
156
+ /** The reader narrowed the list to one account, or widened it to all of them (`""`). */
157
+ onOwner: (value: string) => void;
158
+ /** A repository row was chosen, by pointer or by the filter's arrows. */
159
+ onSelect: (fullName: string) => void;
160
+ /** The caret moved by `delta` rows through the visible repositories. */
161
+ onMove: (delta: number) => void;
162
+ /** The reader typed in the folder field. */
163
+ onFolder: (value: string) => void;
164
+ /** A folder row was chosen. */
165
+ onLocation: (dir: string) => void;
166
+ /** The caret moved by `delta` rows through the chosen repository's folders. */
167
+ onMoveLocation: (delta: number) => void;
168
+ /** Open what is chosen: the confirm button, Enter in either field, or a double-click on a row. */
169
+ onConfirm: () => void;
170
+ /** A repository row was double-clicked: choose it and open it as soon as that is unambiguous. */
171
+ onOpenRepo: (fullName: string) => void;
95
172
  /** Read the listing again, after access was granted in another tab. */
96
173
  onRefresh: () => void;
97
174
  /** The dialog closed, for any reason the platform owns as well as this module's `close`. */
@@ -109,43 +186,101 @@ export interface AddRepoSurfaceHandle {
109
186
  close: () => void;
110
187
  }
111
188
 
189
+ /** A repository row with the id its listbox addresses it by. */
190
+ interface DrawnRow extends AddRepoRow {
191
+ id: string;
192
+ }
193
+
194
+ /** A folder row with the id its listbox addresses it by. */
195
+ interface DrawnLocation extends AddRepoLocation {
196
+ id: string;
197
+ }
198
+
112
199
  /** What the document discriminates on, and the flags it reads. Derived, never handed in. */
113
200
  interface AddRepoFlags {
114
201
  /**
115
- * Which body to draw.
202
+ * Which body the repository pane draws.
116
203
  *
117
204
  * Six, because a spinner, a list and four absences are six different things to say and only one
118
205
  * of them is fixed by looking again.
119
206
  */
120
207
  listState: "loading" | "listed" | "empty-filter" | "empty-write" | "empty-install" | "empty-none";
121
- /** Whether a refusal sits above the list that survived it. */
208
+ rows: DrawnRow[];
209
+ locations: DrawnLocation[];
210
+ /** The id each listbox is told is active: one string per list (ui.md §5.3); `""` for none. */
211
+ activeRepoId: string;
212
+ activeLocationId: string;
213
+ /** Whether there is more than one account to narrow by. */
214
+ hasOwners: boolean;
215
+ /** Whether a refusal sits above the panes that survived it. */
122
216
  hasFailure: boolean;
123
217
  /** Whether there is anything to offer in the access footer. */
124
218
  hasAccess: boolean;
125
- /** Refresh cannot re-ask while the answer is still coming, or while a row is being adopted. */
219
+ /** Whether a repository is chosen, so the folder field has something to name a folder of. */
220
+ hasDetail: boolean;
221
+ /** Whether the folder field's text is refused. */
222
+ folderInvalid: boolean;
223
+ /** Refresh cannot re-ask while the answer is still coming, or while an adoption runs. */
126
224
  refreshDisabled: boolean;
225
+ /** The confirm button's state, the inverse of `canConfirm`. */
226
+ confirmDisabled: boolean;
127
227
  }
128
228
 
129
- interface AddRepoScope extends Record<string, unknown>, AddRepoView, AddRepoFlags {
229
+ interface AddRepoScope
230
+ extends Record<string, unknown>, Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
130
231
  setFilter: (value: string) => void;
131
- choose: (fullName: string) => void;
232
+ setOwner: (value: string) => void;
233
+ select: (fullName: string) => void;
234
+ move: (delta: number) => void;
235
+ setFolder: (value: string) => void;
236
+ pickLocation: (dir: string) => void;
237
+ moveLocation: (delta: number) => void;
238
+ confirm: () => void;
239
+ openRepo: (fullName: string) => void;
132
240
  refresh: () => void;
133
241
  closed: () => void;
134
242
  }
135
243
 
244
+ /** The id the repository list addresses row `index` by. */
245
+ export function repoRowId(index: number): string {
246
+ return `add-repo-repo-${index}`;
247
+ }
248
+
249
+ /** The id the folder list addresses row `index` by. */
250
+ export function locationRowId(index: number): string {
251
+ return `add-repo-location-${index}`;
252
+ }
253
+
136
254
  /** The view plus the flags the document renders from. */
137
- function derive(view: AddRepoView): AddRepoView & AddRepoFlags {
138
- const importing = view.rows.some((row) => row.importing);
255
+ function derive(view: AddRepoView): Omit<AddRepoView, "rows" | "locations"> & AddRepoFlags {
256
+ const rows = view.rows.map((row, index) => ({ ...row, id: repoRowId(index) }));
257
+ const locations = view.locations.map((location, index) => ({
258
+ ...location,
259
+ id: locationRowId(index),
260
+ }));
261
+ const activeRow = rows.find((row) => row.fullName === view.selected);
262
+ const activeLocation =
263
+ view.folderError === ""
264
+ ? locations.find((location) => location.dir === view.chosenFolder)
265
+ : undefined;
139
266
  return {
140
267
  ...view,
268
+ activeLocationId: activeLocation?.id ?? "",
269
+ activeRepoId: activeRow?.id ?? "",
270
+ confirmDisabled: !view.canConfirm,
271
+ folderInvalid: view.folderError !== "",
141
272
  hasAccess: view.access.length > 0,
273
+ hasDetail: view.detailState !== "none",
142
274
  hasFailure: view.failure !== "",
275
+ hasOwners: view.owners.length > 0,
143
276
  listState: view.loading
144
277
  ? "loading"
145
- : view.rows.length > 0
278
+ : rows.length > 0
146
279
  ? "listed"
147
280
  : (`empty-${view.emptyState}` as AddRepoFlags["listState"]),
148
- refreshDisabled: view.loading || importing,
281
+ locations,
282
+ refreshDisabled: view.loading || view.busy,
283
+ rows,
149
284
  };
150
285
  }
151
286
 
@@ -177,21 +312,44 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
177
312
 
178
313
  const scope = reactive({
179
314
  ...derive(options.view),
180
- choose: (fullName: string) => {
181
- options.onChoose(fullName);
182
- },
183
315
  closed: finish,
316
+ confirm: () => {
317
+ options.onConfirm();
318
+ },
319
+ move: (delta: number) => {
320
+ options.onMove(delta);
321
+ },
322
+ moveLocation: (delta: number) => {
323
+ options.onMoveLocation(delta);
324
+ },
325
+ openRepo: (fullName: string) => {
326
+ options.onOpenRepo(fullName);
327
+ },
328
+ pickLocation: (dir: string) => {
329
+ options.onLocation(dir);
330
+ },
184
331
  refresh: () => {
185
332
  options.onRefresh();
186
333
  },
334
+ select: (fullName: string) => {
335
+ options.onSelect(fullName);
336
+ },
187
337
  setFilter: (value: string) => {
188
338
  /* What the control holds, first and unconditionally. A binding only writes when the scope
189
339
  CHANGES, so a surface that decided a value without announcing the raw one would leave the
190
- field showing text the scope does not have (`studio-ui-guidelines.md` §9.3). Nothing
191
- refuses a filter today; the echo is what makes a refusal possible at all. */
340
+ field showing text the scope does not have (`studio-ui-guidelines.md` §9.3). */
192
341
  scope.filter = value;
193
342
  options.onFilter(value);
194
343
  },
344
+ setFolder: (value: string) => {
345
+ // The same echo as the filter's, for the same reason.
346
+ scope.folder = value;
347
+ options.onFolder(value);
348
+ },
349
+ setOwner: (value: string) => {
350
+ scope.owner = value;
351
+ options.onOwner(value);
352
+ },
195
353
  }) as AddRepoScope;
196
354
 
197
355
  let mounted: SurfaceHandle | null = null;
@@ -207,6 +365,13 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
207
365
  return element;
208
366
  }
209
367
  showModal(element);
368
+ /* The body claims focus (studio-ui-guidelines.md §8.7): the filter is where every way of
369
+ choosing starts, and the confirm button that would otherwise take it is disabled until a
370
+ repository is chosen, which leaves the platform nothing to land on. */
371
+ const filter = element.querySelector<HTMLElement>('[part="filter"]');
372
+ if (filter) {
373
+ focusField(filter);
374
+ }
210
375
  return element;
211
376
  });
212
377
 
package/src/types.ts CHANGED
@@ -189,6 +189,33 @@ export interface RepoInfo {
189
189
  isJxProject: boolean;
190
190
  }
191
191
 
192
+ /**
193
+ * One folder of a repository that holds a `project.json`, as `StudioPlatform.listRepoProjects`
194
+ * finds it: a place Open Project can start a session from.
195
+ */
196
+ export interface RepoProjectLocation {
197
+ /**
198
+ * The folder, relative to the repository root, without leading or trailing slashes; `""` is the
199
+ * root.
200
+ */
201
+ dir: string;
202
+ /** The `name` its `project.json` declares, when the platform read one; absent otherwise. */
203
+ name?: string;
204
+ }
205
+
206
+ /** Every project a repository holds, as far as the platform could look. */
207
+ export interface RepoProjects {
208
+ /** The branch the scan read: the repository's default branch. */
209
+ branch: string;
210
+ /** Each folder holding a `project.json`, the root first and the rest in path order. */
211
+ locations: RepoProjectLocation[];
212
+ /**
213
+ * The repository was too large to list in one read, so a project may exist that `locations` does
214
+ * not name. The picker offers a typed folder when this is set.
215
+ */
216
+ truncated: boolean;
217
+ }
218
+
192
219
  /**
193
220
  * Where a new project is written. The New Project modal collects this from the user and the backend
194
221
  * MUST honor it — no backend may pick a destination on its own (see
@@ -727,12 +754,24 @@ export interface StudioPlatform {
727
754
  * local platforms omit it (the OS picker / clone flow covers them).
728
755
  */
729
756
  listRepos?: () => Promise<RepoInfo[]>;
757
+ /**
758
+ * The folders of a repository that hold a `project.json` — the project locations Open Project
759
+ * offers once a repository is chosen, so a project that lives in a subfolder (a monorepo's
760
+ * `sites/marketing`) can be opened as itself. Optional beside `listRepos`: without it the picker
761
+ * opens a repository at its root, as it always has.
762
+ */
763
+ listRepoProjects?: (repo: { owner: string; name: string }) => Promise<RepoProjects>;
730
764
  /**
731
765
  * Adopt an existing repository as a Jx project and return its catalogue root key (openable via
732
- * the recent-projects path). Rejects with a structured message when the repository carries no
733
- * project.json.
766
+ * the recent-projects path). `dir` names the folder that holds the `project.json`, relative to
767
+ * the repository root; absent or `""` is the root. Rejects with a structured message when that
768
+ * folder carries no project.json.
734
769
  */
735
- importProject?: (opts: { owner: string; name: string }) => Promise<{ root: string }>;
770
+ importProject?: (opts: {
771
+ owner: string;
772
+ name: string;
773
+ dir?: string;
774
+ }) => Promise<{ root: string }>;
736
775
  /**
737
776
  * Open a pull request for the current branch. Cloud platforms implement it against their session;
738
777
  * local platforms omit it and Studio falls back to a direct GitHub API call with the user's
@@ -0,0 +1,24 @@
1
+ /**
2
+ * A project folder in its one canonical spelling: slash-separated, no leading, trailing or doubled
3
+ * slashes, `""` for the repository root. Null for a path that climbs (`..`) or names itself (`.`),
4
+ * which no project location can be.
5
+ *
6
+ * Canonical because the folder is part of a cloud project's IDENTITY — the root key Recent stores,
7
+ * the editor URL, and the session the backend keys a working tree on — so `sites/a/` and `/sites/a`
8
+ * must not become two projects, two Recent rows and two sessions over the same files. The cloud
9
+ * adapter spells the grammar on the wire with this function, and Open Project's folder field checks
10
+ * what the reader typed with it, so the field can never accept a folder the adapter would refuse.
11
+ *
12
+ * @param dir - The folder as typed, listed or parsed
13
+ * @returns The canonical folder, or null when it is not one
14
+ */
15
+ export function normalizeProjectDir(dir: string): string | null {
16
+ const segments = dir
17
+ .trim()
18
+ .replaceAll("\\", "/")
19
+ .split("/")
20
+ .filter((segment) => segment !== "");
21
+ return segments.some((segment) => segment === "." || segment === "..")
22
+ ? null
23
+ : segments.join("/");
24
+ }
@@ -1,4 +0,0 @@
1
- import{zs,Ws,gs}from"./studio-st75kn99.js";export{gs as draggable,zs as dropTargetForElements,Ws as monitorForElements};
2
-
3
- //# debugId=EB4AE5E5C16F5E1A64756E2164756E21
4
- //# sourceMappingURL=adapter-y5gdq19c.js.map
@@ -1,4 +0,0 @@
1
- import{Rf,$_,D_,h$,A_}from"./studio-1a99w39s.js";import"./studio-semd1s8s.js";import"./studio-y7jehjrp.js";import"./studio-fqq890ap.js";export{A_ as clearCfConnection,D_ as getCfAccountId,Rf as getCfToken,h$ as setCfAccountId,$_ as setCfToken};
2
-
3
- //# debugId=E35D3D83D56705F164756E2164756E21
4
- //# sourceMappingURL=cf-settings-20dznc3j.js.map
@@ -1,4 +0,0 @@
1
- import{st,Dl,MC,um,xc}from"./studio-pwqfmt4p.js";import"./studio-y7jehjrp.js";export{um as buildComponentInstance,st as componentRegistry,xc as computeRelativePath,Dl as loadComponentRegistry,MC as noteComponentSaved};
2
-
3
- //# debugId=FD1EDA888A02A57364756E2164756E21
4
- //# sourceMappingURL=components-q037dya7.js.map
@@ -1,4 +0,0 @@
1
- import{gb,Fw,L1,I1,R1,$1}from"./studio-xg1942as.js";import"./studio-qa73881a.js";import"./studio-mk00zd5d.js";import"./studio-fbx6twps.js";import"./studio-capk0583.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{Fw as collectionDirs,gb as collectionInfo,R1 as createCollectionSource,$1 as createPagesSource,L1 as listCollectionEntryIds,I1 as reloadDraftAwareGrids};
2
-
3
- //# debugId=7E99BE8FB92EAF4964756E2164756E21
4
- //# sourceMappingURL=content-source-t0q184js.js.map
@@ -1,4 +0,0 @@
1
- import{i$,zh,o$,r$,s$,gu,a$,l$,Ns,jy,sc,c$,Tn,pe}from"./studio-01kbbqg3.js";export{i$ as CancellationTokenSource,zh as Emitter,o$ as KeyCode,r$ as KeyMod,Ns as MarkerSeverity,jy as MarkerTag,s$ as Position,gu as Range,a$ as Selection,l$ as SelectionDirection,c$ as Token,sc as Uri,Tn as editor,pe as languages};
2
-
3
- //# debugId=1BF5DF5C74949B6C64756E2164756E21
4
- //# sourceMappingURL=editor-j5sq149q.js.map
@@ -1,4 +0,0 @@
1
- import{Ew,v1}from"./studio-cbr9czkn.js";import"./studio-84rtc120.js";import"./studio-zev8ssp1.js";import"./studio-8xcwewjq.js";import"./studio-xg1942as.js";import"./studio-qa73881a.js";import"./studio-mk00zd5d.js";import"./studio-fbx6twps.js";import"./studio-capk0583.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";import"./studio-k1wvtp03.js";export{Ew as createEntry,v1 as registerContentCommands};
2
-
3
- //# debugId=6033AE28DF14D98E64756E2164756E21
4
- //# sourceMappingURL=entry-commands-fxzgcc4k.js.map
@@ -1,4 +0,0 @@
1
- import{Er,D1,A1,op,N1,Jf,Yf}from"./studio-qa73881a.js";import"./studio-mk00zd5d.js";import"./studio-fbx6twps.js";import"./studio-capk0583.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{Jf as confirmFileDelete,N1 as exportFile,D1 as parseCollabSource,Er as parseSourceForPath,Yf as renamePromptMessage,op as saveFile,A1 as setDocumentSavedListener};
2
-
3
- //# debugId=8178505254E52C1864756E2164756E21
4
- //# sourceMappingURL=file-ops-2n77759h.js.map
@@ -1,4 +0,0 @@
1
- import{To,Z_,X_,Q_,fw,jf,e1,t1,mw,cE,t$,Lo,gw,n1,i1,ep,o1}from"./studio-hnvnfbdv.js";import"./studio-5vy2wfm5.js";import"./studio-ge5fqjth.js";import"./studio-fthwn4kf.js";import"./studio-84rtc120.js";import"./studio-3ck2a5c4.js";import"./studio-8xcwewjq.js";import"./studio-xg1942as.js";import"./studio-qa73881a.js";import"./studio-mk00zd5d.js";import"./studio-fbx6twps.js";import"./studio-capk0583.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{mw as createFileIn,fw as findHomePage,Q_ as initProjectRepo,To as loadDirectory,Z_ as loadProject,cE as notifyMoveOutcome,gw as openFileInPane,Lo as openFileInTab,jf as openLastSessionOrHome,X_ as openProject,t1 as registerFileTreeDnD,o1 as registerFilesPanel,n1 as reloadCleanTab,ep as reloadFileInTab,i1 as reloadTabsIfChanged,e1 as renderFilesTemplate,t$ as settleRename};
2
-
3
- //# debugId=680868955B4EBCC064756E2164756E21
4
- //# sourceMappingURL=files-fjy7zpxt.js.map
@@ -1,4 +0,0 @@
1
- import{qt,Md,Pd,$m,Lv,Ga,Tp,Vs,wi,Lp,Zt,Ka,Dr,ck,Us,dk}from"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";export{Dr as defaultContentFormat,Ka as documentExtensions,Vs as formatByExtension,wi as formatByName,Zt as formatForPath,ck as formatParse,Us as formatSerialize,Lv as getExtensionCatalog,$m as getExtensions,Tp as getFormats,Pd as loadExtensions,qt as loadFormats,Lp as noFormatError,Ga as refreshExtensionUi,Md as refreshFormats,dk as splitFormatDocument};
2
-
3
- //# debugId=C6A38191EA46416364756E2164756E21
4
- //# sourceMappingURL=format-host-wj3mf3n8.js.map
@@ -1,4 +0,0 @@
1
- import{Ps,mc,O1}from"./studio-mk00zd5d.js";import"./studio-yr04mv2j.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{mc as isRecentLocal,Ps as markLocalMutation,O1 as startFsSync};
2
-
3
- //# debugId=FF74ADED3812ACE764756E2164756E21
4
- //# sourceMappingURL=fs-events-7kcgn4e9.js.map
@@ -1,4 +0,0 @@
1
- import{dc,a1,xw,_w,l1,c1,d1,Bf,u1}from"./studio-5vy2wfm5.js";import"./studio-ge5fqjth.js";import"./studio-fthwn4kf.js";import"./studio-capk0583.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{Bf as cleanupGitPanel,xw as cloneRepository,l1 as loadDiffForLens,a1 as noteFileSaved,_w as platformSupportsClone,dc as refreshGitStatus,u1 as registerGitPanel,d1 as registerSourceControlCommands,c1 as renderGitPanel};
2
-
3
- //# debugId=26F3E292C838E66E64756E2164756E21
4
- //# sourceMappingURL=git-panel-7z2mpt2d.js.map
@@ -1,4 +0,0 @@
1
- import{nC,iC,oC,rC,sC,sm,am,fx,za,aC,lC,lm,n$,b$,cC,Rl,Hb,Bb,dC,uC,hC,pC,fC,mC,gC,bC,vC,yC,wC,xC,mx,_C,cm,CC,kC,SC,EC,TC,LC,zb,IC,Wa,RC,Cd,$C,Wb,gx}from"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{cC as adoptCanvasPreviewMode,iC as allowAutoRequestsOnNextRender,am as beginDragSession,aC as canvasIdleBlockers,lC as canvasPointAt,Bb as clearDropIndicator,Wb as commitActiveEditSession,fx as currentDragSession,_C as dragHostTab,Hb as endDragSession,rC as flushCanvasEdits,gx as getEditBarAnchorRect,Wa as getEditSnapshot,za as hostDragGeometry,sC as hostForCanvas,gC as isCaretActive,sm as liveDragHostAt,b$ as measureInCanvas,CC as mountIframeCanvas,kC as mountStylebookCanvas,IC as panToStylebookTag,Cd as postApplyFormat,SC as postColorSchemeToLiveHosts,xC as postDialogOpen,Rl as postDragMessage,EC as postLocaleToLiveHosts,$C as postOpenSlash,mx as postPatchToHosts,wC as postPopoverOpen,TC as postRedefineElementToLiveHosts,LC as postSiteStyleToLiveHosts,zb as postStyleUpdateToStylebookHosts,cm as releaseCanvasHosts,oC as requestCanvasEval,lm as revealCanvasPath,n$ as revealCanvasPathIn,nC as sawIframeDragOver,fC as setCanvasContextMenuHandler,vC as setCanvasPointerDownHandler,pC as setCanvasSlashHandler,hC as setFileDropHandler,yC as setIframePatchEscalation,uC as setInsertZoneClickHandler,RC as setKeymapSource,dC as setNativeDragEnterHandler,mC as setStylebookHitHandler,bC as setToolbarRefresh};
2
-
3
- //# debugId=31012BBC4949E6D164756E2164756E21
4
- //# sourceMappingURL=iframe-host-a0zjd6xp.js.map
@@ -1,4 +0,0 @@
1
- import{sS,aS,lS,cS,dS,Xc,uS,_f,hS,Wh,pS,Qc,PR,By,m_,FR,jR,HR,BR,ed,zR,WR,VR,g_,b_,UR,qR,GR,KR,v_,JR}from"./studio-4xppwncr.js";import{ac,zy,Cf,YR,bS,vS,yS,wS,Ef,w_,x_}from"./studio-c6zdm25z.js";import{ls,f$}from"./studio-tzegmy4w.js";import{Ae,Od,Ic,Im}from"./studio-evwgp1ym.js";export{dS as COLLAB_SCHEMA_VERSION,ed as CollabPathError,Ef as EnvelopeError,vS as FRAME_AWARENESS,wS as FRAME_CONTROL,yS as FRAME_DOC_CLOSE,bS as FRAME_DOC_SYNC,aS as FRONTMATTER_KEY,jR as LOCAL_ORIGIN,sS as META_KEY,HR as MIRROR_ORIGIN,v_ as PRESENCE_PALETTE,BR as SEED_ORIGIN,cS as SOURCE_KEY,lS as STRUCTURE_KEY,YR as UndoManager,ac as YDoc,UR as acquireSourceCanonical,Im as applyDocOpToDoc,zR as applyDocOpsToY,g_ as canonicalOf,b_ as canonicalRevOf,Ic as childArray,Ae as cloneValue,JR as colorForKey,Cf as createAbsolutePositionFromRelativePosition,zy as createRelativePositionFromTypeIndex,x_ as decodeFrame,ls as deepEqual,f$ as diffDocs,w_ as encodeFrame,uS as frontmatterMap,Od as getNodeAtPath,KR as isSourceReconciler,Xc as metaMap,GR as otherSourceEditors,qR as releaseSourceCanonical,VR as replaceYStructure,By as resolveYPath,FR as seedStructure,hS as sourceText,_f as structureMap,Wh as toYChildren,pS as toYNode,m_ as updateSourceText,PR as yDocToJson,WR as yEventsToDocOps,Qc as yValueToJson};
2
-
3
- //# debugId=68D0F981E96017D864756E2164756E21
4
- //# sourceMappingURL=index-m0x5ztax.js.map
@@ -1,4 +0,0 @@
1
- import{m$,ip,g$,dd}from"./studio-01qza1n3.js";export{m$ as applyProjectSchemas,ip as validateDoc,g$ as validateDocOrNull,dd as validateProjectConfig};
2
-
3
- //# debugId=1BBC9834159ECDF764756E2164756E21
4
- //# sourceMappingURL=jx-validate-zc9zp77s.js.map
@@ -1,4 +0,0 @@
1
- import{Ct,mk,Am,Xo,Bx,Nn,vs,Nm,gk}from"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{Nm as clearLayerSlot,vs as getLayerSlot,mk as initLayers,Am as isModalOpen,Ct as layerHost,gk as overlayIdleBlockers,Xo as showConfirmDialog,Nn as showPromptDialog,Bx as showSaveDiscardDialog};
2
-
3
- //# debugId=0F30FA765389BA1D64756E2164756E21
4
- //# sourceMappingURL=layers-p677nrh5.js.map
@@ -1,4 +0,0 @@
1
- import{ZR,L_}from"./studio-4jj9gme2.js";import"./studio-gjknvzam.js";import"./studio-g8dsj3d2.js";import"./studio-4r0sjtx8.js";import"./studio-fthwn4kf.js";import"./studio-zev8ssp1.js";import"./studio-8xcwewjq.js";import"./studio-fbx6twps.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";import"./studio-k1wvtp03.js";export{L_ as registerLayersPanel,ZR as startLayerTitleEdit};
2
-
3
- //# debugId=57B1EF3CE90DB11F64756E2164756E21
4
- //# sourceMappingURL=layers-panel-y4w1dq90.js.map
@@ -1,4 +0,0 @@
1
- import{br,Bl,tt,bk,Ni}from"./studio-sxc0zvpt.js";export{bk as _$LH,br as html,Bl as noChange,tt as nothing,Ni as render};
2
-
3
- //# debugId=B6FDEC7149CF3B7B64756E2164756E21
4
- //# sourceMappingURL=lit-html-cfn61dn7.js.map
@@ -1,4 +0,0 @@
1
- import{Y_,XR,QR,e$,cd,uw}from"./studio-4r0sjtx8.js";import"./studio-fthwn4kf.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{Y_ as invalidateMediaCache,cd as mountMediaPicker,e$ as pickAndUpload,XR as showMediaPickerPopover,uw as unmountMediaPicker,QR as uploadAndAssign};
2
-
3
- //# debugId=04D480B7388D37A964756E2164756E21
4
- //# sourceMappingURL=media-picker-xg7yjpz9.js.map
@@ -1,4 +0,0 @@
1
- import{Nt}from"./studio-8xcwewjq.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{Nt as openMenu};
2
-
3
- //# debugId=FDE80DD45A9F62A564756E2164756E21
4
- //# sourceMappingURL=menu-fpekzj6w.js.map
@@ -1,4 +0,0 @@
1
- import{Yu,km,Sm,ik,Ec,Zu,kp,Em}from"./studio-7pgy3xaf.js";import"./studio-fqq890ap.js";export{Yu as BUFFER_COMMIT,Ec as bufferIsLive,Zu as bufferMovedOn,km as bufferWrites,ik as cancelBufferWrites,Sm as commitBufferWrites,kp as commitTabBuffers,Em as tabBufferUnsaved};
2
-
3
- //# debugId=EFF2E13B87F596CD64756E2164756E21
4
- //# sourceMappingURL=monaco-buffer-nn4dtx27.js.map
@@ -1,4 +0,0 @@
1
- import{$c,ys,k,Wd,tl,lh,zm}from"./studio-fqq890ap.js";export{tl as clearProblems,Wd as dismiss,k as notify,zm as problemCount,lh as problemFindings,ys as problems,$c as toasts};
2
-
3
- //# debugId=C80AFC1F793B02A864756E2164756E21
4
- //# sourceMappingURL=notify-ahs57a2z.js.map
@@ -1,4 +0,0 @@
1
- import{uk,Dm,hk,p,We}from"./studio-y7jehjrp.js";export{p as getPlatform,We as hasPlatform,Dm as launcherSignal,hk as platformInFlight,uk as registerPlatform};
2
-
3
- //# debugId=43C88251A747E52464756E2164756E21
4
- //# sourceMappingURL=platform-v9xyfkbx.js.map
@@ -1,4 +0,0 @@
1
- import{__,u$}from"./studio-chdmwwzw.js";import"./studio-1a99w39s.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-4m50vh74.js";import"./studio-semd1s8s.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{u$ as openPublishPanel,__ as seedPublishConnected};
2
-
3
- //# debugId=E76105DB74DC57E164756E2164756E21
4
- //# sourceMappingURL=publish-panel-xtbfgg2r.js.map
@@ -1,4 +0,0 @@
1
- import{P_,$f}from"./studio-rr4xkv81.js";import"./studio-hnvnfbdv.js";import"./studio-5vy2wfm5.js";import"./studio-ge5fqjth.js";import"./studio-fthwn4kf.js";import"./studio-84rtc120.js";import"./studio-3ck2a5c4.js";import"./studio-8xcwewjq.js";import"./studio-xg1942as.js";import"./studio-qa73881a.js";import"./studio-mk00zd5d.js";import"./studio-fbx6twps.js";import"./studio-capk0583.js";import"./studio-aekhcdzw.js";import"./studio-bftp4n4b.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";export{P_ as initQuickSearch,$f as openQuickSearch};
2
-
3
- //# debugId=FBCA3E582BA9D67D64756E2164756E21
4
- //# sourceMappingURL=quick-search-d3a6m7j3.js.map
@@ -1,4 +0,0 @@
1
- import{Rb,yc,js,U1,ua,tm,q1,nm}from"./studio-yr04mv2j.js";import"./studio-y7jehjrp.js";import"./studio-ery42sqr.js";export{ua as invalidateUsages,js as loadUsages,yc as peekUsages,U1 as retryUsages,nm as usageFiles,tm as usageHeadline,q1 as usageWarning,Rb as usagesSupported};
2
-
3
- //# debugId=6E6F4A1DA97303AD64756E2164756E21
4
- //# sourceMappingURL=references-99ws0b0m.js.map
@@ -1,4 +0,0 @@
1
- import{F_,p$,Df,sd,Af}from"./studio-ztvcxm3w.js";import"./studio-gjknvzam.js";import"./studio-g8dsj3d2.js";import"./studio-4r0sjtx8.js";import"./studio-fthwn4kf.js";import"./studio-zev8ssp1.js";import"./studio-8xcwewjq.js";import"./studio-fbx6twps.js";import"./studio-rmn2dz59.js";import"./studio-yr04mv2j.js";import"./studio-5gs9th4b.js";import"./studio-4m50vh74.js";import"./studio-pwqfmt4p.js";import"./studio-semd1s8s.js";import"./studio-e47215hh.js";import"./studio-5d7wfmnp.js";import"./studio-xkfs0dp2.js";import"./studio-x5g1xk77.js";import"./studio-7pgy3xaf.js";import"./studio-st75kn99.js";import"./studio-cqmtbg2p.js";import"./studio-y7jehjrp.js";import"./studio-7qvs7v0m.js";import"./studio-sxc0zvpt.js";import"./studio-cp1gbff9.js";import"./studio-1q6amtph.js";import"./studio-ery42sqr.js";import"./studio-fqq890ap.js";import"./studio-k1wvtp03.js";export{sd as inspectorTab,F_ as mount,Df as render,Af as setInspectorTab,p$ as unmount};
2
-
3
- //# debugId=2A643E12E29C1FE964756E2164756E21
4
- //# sourceMappingURL=right-panel-31vbk5xp.js.map