@jxsuite/studio 2.4.3 → 4.0.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 (208) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/Overlay.dev-723bv0df.js +23 -0
  3. package/dist/chunks/cf-settings-45fgyx8y.js +21 -0
  4. package/dist/chunks/{components-z6cnkyy1.js → components-zmx10t62.js} +6 -5
  5. package/dist/chunks/content-source-t88vb2dr.js +49 -0
  6. package/dist/chunks/{convert-to-repeater-k10dvcc7.js → convert-to-repeater-dhw1nrz9.js} +27 -18
  7. package/dist/chunks/entry-commands-6z6bhxg0.js +46 -0
  8. package/dist/chunks/{extension-sections-0ada0xcw.js → extension-sections-3ydgjbdy.js} +32 -23
  9. package/dist/chunks/file-ops-rskmhxyq.js +48 -0
  10. package/dist/chunks/files-0cratsr0.js +92 -0
  11. package/dist/chunks/{format-host-wewba4nq.js → format-host-tgcmfs4p.js} +3 -3
  12. package/dist/chunks/fs-events-hrrg328g.js +21 -0
  13. package/dist/chunks/{git-panel-2dh1aw50.js → git-panel-0yywyk76.js} +21 -15
  14. package/dist/chunks/{jx-validate-jj9rnt4n.js → jx-validate-8q2g05x1.js} +6 -4
  15. package/dist/chunks/layers-panel-z3tqe5cd.js +67 -0
  16. package/dist/chunks/layers-q75tj2mf.js +45 -0
  17. package/dist/chunks/lit-html-j055mkh8.js +22 -0
  18. package/dist/chunks/monaco-buffer-dqw0xxpx.js +25 -0
  19. package/dist/chunks/{monaco-setup-a5wkmbgh.js → monaco-setup-rws7k4br.js} +4 -4
  20. package/dist/chunks/notify-yjm79n4s.js +30 -0
  21. package/dist/chunks/parse-24d0gay3.js +19 -0
  22. package/dist/chunks/platform-ba1j1gbh.js +16 -0
  23. package/dist/chunks/publish-panel-54jvhskq.js +28 -0
  24. package/dist/chunks/quick-search-cgfmjwq5.js +65 -0
  25. package/dist/chunks/references-3qx8fkyp.js +29 -0
  26. package/dist/chunks/right-panel-cqp8bc4v.js +46 -0
  27. package/dist/chunks/sp-overlay.dev-yztmtrs1.js +18 -0
  28. package/dist/chunks/sp-popover.dev-n2etmqdp.js +9 -0
  29. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +15 -0
  30. package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +15 -0
  31. package/dist/chunks/{sp-tray.dev-64v4pxw8.js → sp-tray.dev-tkbscm06.js} +5 -5
  32. package/dist/chunks/{studio-f5yyvqxv.js → studio-1hbqnt19.js} +37 -31
  33. package/dist/chunks/studio-2zkz8evn.js +3163 -0
  34. package/dist/chunks/{studio-0b6fs05q.js → studio-4pqqxbrt.js} +23 -15
  35. package/dist/chunks/{studio-kvfx9z2c.js → studio-4rzyrtjz.js} +70 -31
  36. package/dist/chunks/{studio-ef8t53vc.js → studio-5q69gfag.js} +60 -56
  37. package/dist/chunks/{studio-v2c5pmjj.js → studio-5rywrkxz.js} +565 -133
  38. package/dist/chunks/{studio-6kv3apa9.js → studio-68n67094.js} +25 -9
  39. package/dist/chunks/{studio-0rqqhrdy.js → studio-7nte2hj4.js} +2 -2
  40. package/dist/chunks/{studio-hyn3vhwr.js → studio-8swrjbny.js} +31 -18
  41. package/dist/chunks/studio-92ab2jqe.js +282 -0
  42. package/dist/chunks/{studio-sas7mt3k.js → studio-9ab8gqsm.js} +2 -2
  43. package/dist/chunks/{studio-28xc8ws4.js → studio-9c4k4vhv.js} +14 -10
  44. package/dist/chunks/studio-9n4mrmnb.js +184 -0
  45. package/dist/chunks/{studio-tr20m8g8.js → studio-9r6j5ev1.js} +37 -2
  46. package/dist/chunks/{studio-aweyr4v1.js → studio-ahjfdy6e.js} +9 -7
  47. package/dist/chunks/{studio-s519zc99.js → studio-bgxt93ga.js} +3 -3
  48. package/dist/chunks/{studio-26sv44br.js → studio-cb12yz9w.js} +8543 -8784
  49. package/dist/chunks/studio-cft9r4r7.js +119 -0
  50. package/dist/chunks/{studio-rqemfhz6.js → studio-eenfkt4e.js} +6 -6
  51. package/dist/chunks/studio-eesa1myv.js +498 -0
  52. package/dist/chunks/{studio-ay8wcr2b.js → studio-eqq1w638.js} +7 -9
  53. package/dist/chunks/{studio-ke244pam.js → studio-ex8zyp98.js} +51 -25
  54. package/dist/chunks/studio-gv8vvshc.js +118 -0
  55. package/dist/chunks/studio-hbtp0eh1.js +1315 -0
  56. package/dist/chunks/{studio-cz2j1c0g.js → studio-htsf0w6m.js} +75 -123
  57. package/dist/chunks/{studio-pyrw8h0w.js → studio-kjjsjak4.js} +528 -212
  58. package/dist/chunks/{studio-5x5774ak.js → studio-kryvsw6j.js} +3 -3
  59. package/dist/chunks/studio-kyh9avvv.js +28 -0
  60. package/dist/chunks/{studio-jnakhg87.js → studio-kyk2v92a.js} +14 -14
  61. package/dist/chunks/{studio-twsafr1e.js → studio-m3hwn7y1.js} +3 -3
  62. package/dist/chunks/{studio-tzx3xmvx.js → studio-mmv72a27.js} +8 -8
  63. package/dist/chunks/{studio-vhk5fmfv.js → studio-n8b9wqwy.js} +5 -5
  64. package/dist/chunks/{studio-cjm7fdjf.js → studio-p4ngc046.js} +8 -104
  65. package/dist/chunks/{studio-sccge2wf.js → studio-p8j86wag.js} +2 -2
  66. package/dist/chunks/{studio-v1va0vhd.js → studio-pdfjntbk.js} +75 -139
  67. package/dist/chunks/studio-q43a5y9h.js +394 -0
  68. package/dist/chunks/studio-q7v10cg2.js +106 -0
  69. package/dist/chunks/{studio-2w11grav.js → studio-qq6jym04.js} +3 -3
  70. package/dist/chunks/studio-r1r7afxx.js +1066 -0
  71. package/dist/chunks/{studio-3fk1ac9z.js → studio-rdx8jcxy.js} +4 -4
  72. package/dist/chunks/{studio-4mqb9a0j.js → studio-rn9ta2mz.js} +4 -4
  73. package/dist/chunks/studio-sf7zjgv1.js +91 -0
  74. package/dist/chunks/studio-t7qb9db8.js +665 -0
  75. package/dist/chunks/studio-tmc5emrw.js +8 -0
  76. package/dist/chunks/{studio-wdt9y92a.js → studio-txwkm6p9.js} +2 -2
  77. package/dist/chunks/{studio-dgj7gq44.js → studio-v38hmvx1.js} +7 -7
  78. package/dist/chunks/{studio-7ejemhej.js → studio-vadzgkrz.js} +6 -6
  79. package/dist/chunks/studio-wcy8trfx.js +263 -0
  80. package/dist/chunks/{studio-hb7c46jy.js → studio-wx5609xd.js} +21 -15
  81. package/dist/chunks/studio-xrapxwwc.js +1539 -0
  82. package/dist/chunks/{studio-ws6ef6js.js → studio-yxrkyv8a.js} +41 -29
  83. package/dist/chunks/{studio-xm3dbxvn.js → studio-zczps70q.js} +2 -2
  84. package/dist/chunks/workspace-xpres40v.js +89 -0
  85. package/dist/iframe-entry.js +450 -48
  86. package/dist/studio.js +2455 -1761
  87. package/package.json +16 -15
  88. package/src/browse/library-layouts.ts +3 -3
  89. package/src/browse/library-pane.ts +59 -5
  90. package/src/browse/library-preview.ts +19 -3
  91. package/src/canvas/asset-refs.ts +119 -0
  92. package/src/canvas/asset-resolve.ts +256 -0
  93. package/src/canvas/canvas-live-render.ts +23 -15
  94. package/src/canvas/canvas-render.ts +23 -1
  95. package/src/canvas/iframe-entry.ts +1 -0
  96. package/src/canvas/iframe-host.ts +4 -0
  97. package/src/canvas/iframe-patch.ts +47 -21
  98. package/src/canvas/iframe-protocol.ts +9 -0
  99. package/src/canvas/iframe-render.ts +50 -16
  100. package/src/commands/app-commands.ts +4 -0
  101. package/src/commands/command-args.ts +29 -0
  102. package/src/commands/context.ts +15 -1
  103. package/src/commands/defaults.ts +29 -1
  104. package/src/commands/levels.ts +16 -0
  105. package/src/commands/live-context.ts +3 -0
  106. package/src/content/collection-match.ts +267 -0
  107. package/src/content/entry-commands.ts +38 -29
  108. package/src/content/entry-fields.ts +6 -0
  109. package/src/editor/file-drop-action.ts +2 -1
  110. package/src/editor/shortcuts.ts +5 -0
  111. package/src/files/file-ops.ts +10 -42
  112. package/src/files/files.ts +487 -61
  113. package/src/files/fs-events.ts +9 -0
  114. package/src/files/gitignore.ts +432 -0
  115. package/src/files/media-paths.ts +37 -14
  116. package/src/files/media-upload.ts +47 -6
  117. package/src/files/serialize-document.ts +60 -0
  118. package/src/format/convert-file.ts +511 -0
  119. package/src/format/format-choices.ts +199 -0
  120. package/src/grid/grid-idle.ts +45 -0
  121. package/src/grid/grid-view.ts +35 -0
  122. package/src/grid/schema-columns.ts +2 -1
  123. package/src/grid/sources/content-source.ts +24 -3
  124. package/src/media/media-open.ts +58 -0
  125. package/src/media/media-pane.ts +310 -0
  126. package/src/new-project/import-tab.ts +333 -160
  127. package/src/new-project/new-project-modal.ts +27 -34
  128. package/src/packages/ensure-deps.ts +14 -7
  129. package/src/packages/jxsuite-update.ts +11 -11
  130. package/src/page-params.ts +10 -46
  131. package/src/panels/activity-bar.ts +45 -16
  132. package/src/panels/ai-chat/attached-context.ts +6 -1
  133. package/src/panels/ai-chat/chat-view.ts +255 -13
  134. package/src/panels/ai-chat/composer.ts +21 -80
  135. package/src/panels/ai-panel.ts +116 -2
  136. package/src/panels/frontmatter-fields.ts +6 -2
  137. package/src/panels/navigator-panels.ts +7 -6
  138. package/src/panels/properties-panel.ts +8 -2
  139. package/src/panels/seo-modal.ts +5 -6
  140. package/src/panels/settings-menu.ts +799 -0
  141. package/src/panels/signals-panel.ts +2 -1
  142. package/src/panels/toolbar.ts +135 -15
  143. package/src/platforms/cloud.ts +34 -3
  144. package/src/platforms/devserver.ts +72 -34
  145. package/src/preview/preview-overlay.ts +226 -0
  146. package/src/services/ai-ask.ts +247 -0
  147. package/src/services/ai-import-tools.ts +494 -0
  148. package/src/services/ai-models.ts +101 -11
  149. package/src/services/ai-project-tools.ts +20 -26
  150. package/src/services/ai-settings.ts +69 -71
  151. package/src/services/ai-system-prompt.ts +88 -2
  152. package/src/services/ai-turn-signal.ts +70 -0
  153. package/src/services/cf-settings.ts +19 -37
  154. package/src/services/connection.ts +74 -0
  155. package/src/services/context-manager.ts +89 -0
  156. package/src/services/document-assistant.ts +49 -7
  157. package/src/services/idle.ts +6 -1
  158. package/src/services/import-client.ts +33 -6
  159. package/src/services/import-run.ts +158 -0
  160. package/src/services/import-seed.ts +120 -0
  161. package/src/services/jx-validate.ts +58 -6
  162. package/src/services/project-adoption.ts +71 -0
  163. package/src/services/references.ts +0 -0
  164. package/src/services/settings/definitions.ts +181 -0
  165. package/src/services/settings/kernel.ts +335 -0
  166. package/src/services/settings/write-queue.ts +116 -0
  167. package/src/services/tool-executor.ts +34 -2
  168. package/src/settings/contexts-section.ts +45 -3
  169. package/src/settings/dependencies-editor.ts +43 -23
  170. package/src/settings/general-settings.ts +30 -12
  171. package/src/settings/preferences-accounts.ts +6 -19
  172. package/src/settings/preferences-dialog.ts +18 -41
  173. package/src/settings/preferences-keymap.ts +8 -18
  174. package/src/settings/preferences-sections.ts +57 -0
  175. package/src/settings/schema-field-ui.ts +2 -2
  176. package/src/settings/settings-document.ts +65 -9
  177. package/src/shell.ts +6 -14
  178. package/src/studio.ts +65 -7
  179. package/src/tabs/transact.ts +42 -19
  180. package/src/types.ts +164 -8
  181. package/src/ui/ai-credentials-form.ts +52 -27
  182. package/src/ui/ai-model-picker.ts +162 -0
  183. package/src/ui/choice-field.ts +72 -0
  184. package/src/ui/layers.ts +83 -5
  185. package/src/ui/media-picker.ts +6 -11
  186. package/src/utils/studio-utils.ts +43 -31
  187. package/styles/forced-colors.css +7 -0
  188. package/styles/overlays.css +256 -0
  189. package/styles/panels.css +13 -1
  190. package/styles/shell.css +111 -0
  191. package/dist/chunks/Overlay.dev-d2ajy6sj.js +0 -23
  192. package/dist/chunks/cf-settings-g5fbf2zp.js +0 -17
  193. package/dist/chunks/content-source-k9724vcv.js +0 -39
  194. package/dist/chunks/files-yew27sn9.js +0 -69
  195. package/dist/chunks/layers-panel-qnsghwwd.js +0 -59
  196. package/dist/chunks/publish-panel-a0pdft5w.js +0 -21
  197. package/dist/chunks/quick-search-9avyc4pc.js +0 -54
  198. package/dist/chunks/right-panel-kcnhtc5j.js +0 -38
  199. package/dist/chunks/sp-overlay.dev-s18hymn9.js +0 -18
  200. package/dist/chunks/sp-popover.dev-dj9x7e7a.js +0 -9
  201. package/dist/chunks/sp-progress-circle.dev-0zxcyz3r.js +0 -15
  202. package/dist/chunks/sp-tooltip.dev-5c6d1kjz.js +0 -15
  203. package/dist/chunks/studio-a7pzveq1.js +0 -110
  204. package/dist/chunks/studio-c31yb4t6.js +0 -55
  205. package/dist/chunks/studio-ra7ar50f.js +0 -6682
  206. package/src/canvas/content-assets.ts +0 -263
  207. package/src/canvas/site-style-css.ts +0 -121
  208. package/src/services/settings-store.ts +0 -99
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  project_schema_default,
3
3
  schema_default
4
- } from "./studio-tr20m8g8.js";
4
+ } from "./studio-9r6j5ev1.js";
5
5
  import {
6
6
  __require,
7
7
  __toESM
@@ -36,23 +36,32 @@ function getValidator(kind) {
36
36
  })();
37
37
  return compiling[kind];
38
38
  }
39
+ function asSchema(value) {
40
+ return typeof value === "object" && value !== null && !Array.isArray(value) && Object.keys(value).length > 0 ? value : undefined;
41
+ }
39
42
  function applyProjectSchemas(schemas) {
40
- const document = schemas?.document ?? CORE.document;
41
- const project = schemas?.project ?? CORE.project;
43
+ const document = asSchema(schemas?.document) ?? CORE.document;
44
+ const project = asSchema(schemas?.project) ?? CORE.project;
45
+ const applied = document !== CORE.document || project !== CORE.project;
42
46
  if (document === active.document && project === active.project) {
43
- return Boolean(schemas?.document || schemas?.project);
47
+ return applied;
44
48
  }
45
49
  active.document = document;
46
50
  active.project = project;
47
51
  compiling.document = null;
48
52
  compiling.project = null;
49
- return Boolean(schemas?.document || schemas?.project);
53
+ return applied;
50
54
  }
51
55
  function resetProjectSchemas() {
52
56
  applyProjectSchemas(null);
53
57
  }
58
+ var ERROR_PROPERTY_KEYS = ["unevaluatedProperty", "additionalProperty", "missingProperty"];
54
59
  function formatErrors(validate) {
55
- return (validate.errors || []).map((e) => `${e.instancePath || "(root)"}: ${e.message}`);
60
+ return (validate.errors || []).map((e) => {
61
+ const key = ERROR_PROPERTY_KEYS.find((name) => typeof e.params?.[name] === "string");
62
+ const property = key ? ` (${String(e.params?.[key])})` : "";
63
+ return `${e.instancePath || "(root)"}: ${e.message}${property}`;
64
+ });
56
65
  }
57
66
  async function validateDoc(doc) {
58
67
  const validate = await getValidator("document");
@@ -61,6 +70,13 @@ async function validateDoc(doc) {
61
70
  }
62
71
  return formatErrors(validate);
63
72
  }
73
+ async function validateDocOrNull(doc) {
74
+ const validate = await getValidator("document");
75
+ if (!validate) {
76
+ return null;
77
+ }
78
+ return validate(doc) ? [] : formatErrors(validate);
79
+ }
64
80
  async function validateProjectConfig(config) {
65
81
  const validate = await getValidator("project");
66
82
  if (!validate || validate(config)) {
@@ -69,7 +85,7 @@ async function validateProjectConfig(config) {
69
85
  return formatErrors(validate);
70
86
  }
71
87
 
72
- export { applyProjectSchemas, resetProjectSchemas, validateDoc, validateProjectConfig };
88
+ export { applyProjectSchemas, resetProjectSchemas, validateDoc, validateDocOrNull, validateProjectConfig };
73
89
 
74
- //# debugId=65EFF2410CACDD1964756E2164756E21
75
- //# sourceMappingURL=studio-6kv3apa9.js.map
90
+ //# debugId=8C68AEE13E72EFF064756E2164756E21
91
+ //# sourceMappingURL=studio-68n67094.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  noChange,
3
3
  render
4
- } from "./studio-5x5774ak.js";
4
+ } from "./studio-kryvsw6j.js";
5
5
 
6
6
  // ../../node_modules/@lit/reactive-element/development/css-tag.js
7
7
  var NODE_MODE = false;
@@ -610,4 +610,4 @@ if (DEV_MODE2 && global3.litElementVersions.length > 1) {
610
610
  export { css, defaultConverter, notEqual, LitElement };
611
611
 
612
612
  //# debugId=5925B997A81EB5AC64756E2164756E21
613
- //# sourceMappingURL=studio-0rqqhrdy.js.map
613
+ //# sourceMappingURL=studio-7nte2hj4.js.map
@@ -1,43 +1,43 @@
1
1
  import {
2
2
  parseMediaEntries,
3
3
  schemeOfQuery
4
- } from "./studio-v1va0vhd.js";
5
- import {
6
- live
7
- } from "./studio-c31yb4t6.js";
4
+ } from "./studio-pdfjntbk.js";
8
5
  import {
9
6
  mediaDisplayName,
10
7
  mountStylebookCanvas,
11
8
  panToStylebookTag,
12
9
  serializeJxPath,
13
10
  tabOfPane
14
- } from "./studio-pyrw8h0w.js";
11
+ } from "./studio-kjjsjak4.js";
15
12
  import {
16
- activeTab,
17
13
  getEffectiveMedia,
18
14
  getEffectiveStyle,
15
+ shell
16
+ } from "./studio-hbtp0eh1.js";
17
+ import {
18
+ activeTab,
19
19
  isSpliceablePath,
20
- shell,
21
20
  varDisplayName
22
- } from "./studio-ra7ar50f.js";
21
+ } from "./studio-2zkz8evn.js";
23
22
  import {
24
23
  classMap
25
- } from "./studio-twsafr1e.js";
24
+ } from "./studio-m3hwn7y1.js";
26
25
  import {
26
+ live,
27
27
  ref,
28
28
  repeat
29
- } from "./studio-kvfx9z2c.js";
29
+ } from "./studio-4rzyrtjz.js";
30
30
  import {
31
31
  html,
32
32
  render
33
- } from "./studio-5x5774ak.js";
33
+ } from "./studio-kryvsw6j.js";
34
34
  import {
35
35
  componentRegistry
36
- } from "./studio-s519zc99.js";
36
+ } from "./studio-bgxt93ga.js";
37
37
  import {
38
38
  projectState,
39
39
  updateSession
40
- } from "./studio-cjm7fdjf.js";
40
+ } from "./studio-p4ngc046.js";
41
41
  import {
42
42
  __require
43
43
  } from "./studio-a0tswy0w.js";
@@ -491,6 +491,7 @@ function buildStylebookDoc(opts) {
491
491
 
492
492
  // src/style/project-styles.ts
493
493
  var PROJECT_STYLES_TITLE = "Project Styles";
494
+ var PROJECT_STYLES_VIEW = "stylebook";
494
495
  var TOKEN_GROUPS = [
495
496
  { id: "color", prefix: "--color-", title: "Colors" },
496
497
  { id: "font", prefix: "--font-", title: "Fonts" },
@@ -736,6 +737,7 @@ function noopCommandDeps() {
736
737
  undo: () => {},
737
738
  redo: () => {},
738
739
  openInBrowser: () => {},
740
+ buildSite: () => {},
739
741
  closeDocument: () => {},
740
742
  duplicateSelection: () => {},
741
743
  deleteSelection: () => {},
@@ -793,9 +795,20 @@ function defaultCommands(deps) {
793
795
  group: "2_output",
794
796
  when: (ctx) => ctx.project.isSite,
795
797
  enablement: documentOpen,
796
- requires: "a built page to open",
798
+ requires: "a page to preview",
797
799
  run: () => deps.openInBrowser()
798
800
  },
801
+ {
802
+ id: "project.buildSite",
803
+ title: "Build Site",
804
+ category: "Project",
805
+ level: "project",
806
+ menus: ["commandbar/overflow", "palette"],
807
+ group: "2_output",
808
+ when: (ctx) => ctx.project.isSite,
809
+ requires: "a site project",
810
+ run: () => deps.buildSite()
811
+ },
799
812
  {
800
813
  id: "edit.undo",
801
814
  title: "Undo",
@@ -860,7 +873,7 @@ function defaultCommands(deps) {
860
873
  description: "Turn the selected element into a repeater template, rendering it once per item of a " + "data collection the author picks in the dialog this opens."
861
874
  },
862
875
  run: () => {
863
- import("./convert-to-repeater-k10dvcc7.js").then(({ convertToRepeater }) => convertToRepeater());
876
+ import("./convert-to-repeater-dhw1nrz9.js").then(({ convertToRepeater }) => convertToRepeater());
864
877
  }
865
878
  },
866
879
  {
@@ -1062,7 +1075,7 @@ function inspectorFocusCommands(deps) {
1062
1075
  });
1063
1076
  }
1064
1077
 
1065
- export { transposeStylebookStyle, tokenLabel, groupTokens, listTokenContexts, readTokenOverride, writeTokenOverride, addableContexts, stylebook_meta_default, renderStylebookMode, selectStylebookTag, INSPECTOR_TABS, noopCommandDeps, defaultCommands };
1078
+ export { transposeStylebookStyle, PROJECT_STYLES_TITLE, PROJECT_STYLES_VIEW, tokenLabel, groupTokens, listTokenContexts, readTokenOverride, writeTokenOverride, addableContexts, stylebook_meta_default, renderStylebookMode, selectStylebookTag, INSPECTOR_TABS, noopCommandDeps, defaultCommands };
1066
1079
 
1067
- //# debugId=46ED955C46B01FC864756E2164756E21
1068
- //# sourceMappingURL=studio-hyn3vhwr.js.map
1080
+ //# debugId=1C28C0702015039E64756E2164756E21
1081
+ //# sourceMappingURL=studio-8swrjbny.js.map
@@ -0,0 +1,282 @@
1
+ import {
2
+ notify
3
+ } from "./studio-xrapxwwc.js";
4
+ import {
5
+ getPlatform,
6
+ hasPlatform
7
+ } from "./studio-9ab8gqsm.js";
8
+
9
+ // src/services/settings/definitions.ts
10
+ function normalizeBaseUrl(raw) {
11
+ return raw.trim().replace(/\/+$/, "");
12
+ }
13
+ function trimmed(raw) {
14
+ return raw.trim();
15
+ }
16
+ var SETTINGS = {
17
+ aiBaseUrl: {
18
+ default: "",
19
+ key: "jx.ai.baseUrl",
20
+ normalize: normalizeBaseUrl,
21
+ scope: "user"
22
+ },
23
+ aiOpenAiKey: {
24
+ default: "",
25
+ key: "jx.ai.openaiKey",
26
+ normalize: trimmed,
27
+ scope: "user",
28
+ secret: true
29
+ },
30
+ aiModel: {
31
+ default: "gpt-4o",
32
+ key: "jx.ai.model",
33
+ normalize: trimmed,
34
+ scope: "user"
35
+ },
36
+ keybindings: {
37
+ default: "",
38
+ key: "jx.keybindings",
39
+ normalize: (raw) => raw.trim() === "{}" ? "" : raw.trim(),
40
+ scope: "user"
41
+ },
42
+ theme: {
43
+ default: "",
44
+ key: "jx-studio-theme",
45
+ normalize: trimmed,
46
+ scope: "user"
47
+ },
48
+ showIgnoredFiles: {
49
+ default: "",
50
+ key: "jx.files.showIgnored",
51
+ normalize: trimmed,
52
+ scope: "user"
53
+ },
54
+ cfAccountId: {
55
+ default: "",
56
+ key: "jx.cf.accountId",
57
+ normalize: trimmed,
58
+ scope: "user"
59
+ },
60
+ cfToken: {
61
+ default: "",
62
+ key: "jx.cf.token",
63
+ normalize: trimmed,
64
+ scope: "user",
65
+ secret: true
66
+ }
67
+ };
68
+ var ALL_SETTINGS = Object.values(SETTINGS);
69
+ var USER_SETTINGS = ALL_SETTINGS.filter((definition) => definition.scope === "user");
70
+ var USER_SETTING_KEYS = USER_SETTINGS.map((definition) => definition.key);
71
+
72
+ // src/services/settings/write-queue.ts
73
+ function createWriteQueue(opts) {
74
+ const schedule = opts.schedule ?? queueMicrotask;
75
+ let pending = null;
76
+ let tail = Promise.resolve();
77
+ let idle = Promise.resolve();
78
+ function flush() {
79
+ const patch = pending;
80
+ pending = null;
81
+ if (!patch) {
82
+ return tail;
83
+ }
84
+ tail = tail.then(() => opts.send(patch)).catch((error) => {
85
+ opts.onError?.(error, patch);
86
+ });
87
+ return tail;
88
+ }
89
+ return {
90
+ enqueue(patch) {
91
+ if (pending) {
92
+ Object.assign(pending, patch);
93
+ return;
94
+ }
95
+ pending = { ...patch };
96
+ idle = new Promise((resolve) => {
97
+ schedule(() => {
98
+ flush().then(resolve);
99
+ });
100
+ });
101
+ },
102
+ settled() {
103
+ return idle;
104
+ }
105
+ };
106
+ }
107
+
108
+ // src/services/settings/kernel.ts
109
+ var values = new Map;
110
+ function writeCache(key, value) {
111
+ try {
112
+ if (value === null) {
113
+ globalThis.localStorage?.removeItem(key);
114
+ } else {
115
+ globalThis.localStorage?.setItem(key, value);
116
+ }
117
+ } catch {}
118
+ }
119
+ try {
120
+ for (const definition of ALL_SETTINGS) {
121
+ const cached = globalThis.localStorage?.getItem(definition.key);
122
+ if (cached !== null && cached !== undefined) {
123
+ values.set(definition.key, cached);
124
+ }
125
+ }
126
+ } catch {}
127
+ function readStoredSetting(definition) {
128
+ return values.get(definition.key) ?? "";
129
+ }
130
+ function hasSetting(definition) {
131
+ return (values.get(definition.key) ?? "") !== "";
132
+ }
133
+ var listeners = new Set;
134
+ function onSettingsChanged(listener) {
135
+ listeners.add(listener);
136
+ return () => {
137
+ listeners.delete(listener);
138
+ };
139
+ }
140
+ function announce(keys) {
141
+ for (const listener of listeners) {
142
+ listener(keys);
143
+ }
144
+ }
145
+ var queue = createWriteQueue({
146
+ onError(error) {
147
+ notify("error", "Your settings could not be saved.", {
148
+ detail: error instanceof Error ? error.message : String(error),
149
+ key: "settings-write",
150
+ source: "Settings"
151
+ });
152
+ },
153
+ async send(patch) {
154
+ if (!hasPlatform()) {
155
+ return;
156
+ }
157
+ const platform = getPlatform();
158
+ if (!platform.patchSettings) {
159
+ return;
160
+ }
161
+ const set = {};
162
+ const remove = [];
163
+ for (const [key, value] of Object.entries(patch)) {
164
+ if (value) {
165
+ set[key] = value;
166
+ } else {
167
+ remove.push(key);
168
+ }
169
+ }
170
+ await platform.patchSettings({ remove, set });
171
+ }
172
+ });
173
+ function settingsSettled() {
174
+ return queue.settled();
175
+ }
176
+ function apply(patch) {
177
+ const moved = [];
178
+ for (const [key, next] of Object.entries(patch)) {
179
+ const before = values.get(key) ?? null;
180
+ if (before === next) {
181
+ continue;
182
+ }
183
+ if (next === null) {
184
+ values.delete(key);
185
+ } else {
186
+ values.set(key, next);
187
+ }
188
+ writeCache(key, next);
189
+ moved.push(key);
190
+ }
191
+ return moved;
192
+ }
193
+ function setSetting(definition, value) {
194
+ const next = definition.normalize ? definition.normalize(value) : value;
195
+ const moved = apply({ [definition.key]: next });
196
+ if (moved.length > 0) {
197
+ queue.enqueue({ [definition.key]: next });
198
+ announce(moved);
199
+ }
200
+ }
201
+ function setSettings(entries) {
202
+ const patch = {};
203
+ for (const [definition, value] of entries) {
204
+ patch[definition.key] = definition.normalize ? definition.normalize(value) : value;
205
+ }
206
+ const moved = apply(patch);
207
+ if (moved.length > 0) {
208
+ queue.enqueue(patch);
209
+ announce(moved);
210
+ }
211
+ }
212
+ function clearSettings(definitions) {
213
+ const patch = {};
214
+ for (const definition of definitions) {
215
+ patch[definition.key] = null;
216
+ }
217
+ const moved = apply(patch);
218
+ if (moved.length > 0) {
219
+ queue.enqueue(patch);
220
+ announce(moved);
221
+ }
222
+ }
223
+ async function hydrateSettings() {
224
+ if (!hasPlatform()) {
225
+ return;
226
+ }
227
+ const platform = getPlatform();
228
+ if (!platform.getSettings) {
229
+ return;
230
+ }
231
+ let stored;
232
+ try {
233
+ stored = await platform.getSettings();
234
+ } catch {
235
+ return;
236
+ }
237
+ const incoming = {};
238
+ let needsMigration = false;
239
+ for (const definition of USER_SETTINGS) {
240
+ const backendValue = stored[definition.key];
241
+ if (backendValue) {
242
+ incoming[definition.key] = backendValue;
243
+ } else if (values.get(definition.key)) {
244
+ needsMigration = true;
245
+ }
246
+ }
247
+ const moved = apply(incoming);
248
+ if (moved.length > 0) {
249
+ announce(moved);
250
+ }
251
+ if (needsMigration) {
252
+ const push = {};
253
+ for (const definition of USER_SETTINGS) {
254
+ const value = values.get(definition.key);
255
+ if (value && !stored[definition.key]) {
256
+ push[definition.key] = value;
257
+ }
258
+ }
259
+ queue.enqueue(push);
260
+ }
261
+ }
262
+ function adoptRemoteSettings(stored) {
263
+ const patch = {};
264
+ for (const definition of USER_SETTINGS) {
265
+ patch[definition.key] = stored[definition.key] ?? null;
266
+ }
267
+ const moved = apply(patch);
268
+ if (moved.length > 0) {
269
+ announce(moved);
270
+ }
271
+ }
272
+ function watchRemoteSettings() {
273
+ if (!hasPlatform()) {
274
+ return;
275
+ }
276
+ getPlatform().subscribeSettings?.(adoptRemoteSettings);
277
+ }
278
+
279
+ export { SETTINGS, readStoredSetting, hasSetting, onSettingsChanged, settingsSettled, setSetting, setSettings, clearSettings, hydrateSettings, watchRemoteSettings };
280
+
281
+ //# debugId=C4A4FABDAA7EC06E64756E2164756E21
282
+ //# sourceMappingURL=studio-92ab2jqe.js.map
@@ -71,5 +71,5 @@ function hasPlatform() {
71
71
 
72
72
  export { registerPlatform, platformInFlight, getPlatform, hasPlatform };
73
73
 
74
- //# debugId=02671227FE10A79C64756E2164756E21
75
- //# sourceMappingURL=studio-sas7mt3k.js.map
74
+ //# debugId=48AA6894A0BB2F0464756E2164756E21
75
+ //# sourceMappingURL=studio-9ab8gqsm.js.map
@@ -1,24 +1,28 @@
1
1
  import {
2
2
  renderDeployChecklist
3
- } from "./studio-aweyr4v1.js";
3
+ } from "./studio-ahjfdy6e.js";
4
4
  import {
5
5
  registerPanel,
6
6
  renderEmptyState
7
- } from "./studio-pyrw8h0w.js";
7
+ } from "./studio-kjjsjak4.js";
8
+ import {
9
+ setBottomTab
10
+ } from "./studio-hbtp0eh1.js";
11
+ import {
12
+ openModal
13
+ } from "./studio-t7qb9db8.js";
8
14
  import {
9
15
  notify,
10
16
  now,
11
- openModal,
12
- reactive,
13
- setBottomTab
14
- } from "./studio-ra7ar50f.js";
17
+ reactive
18
+ } from "./studio-xrapxwwc.js";
15
19
  import {
16
20
  repeat
17
- } from "./studio-kvfx9z2c.js";
21
+ } from "./studio-4rzyrtjz.js";
18
22
  import {
19
23
  html,
20
24
  nothing
21
- } from "./studio-5x5774ak.js";
25
+ } from "./studio-kryvsw6j.js";
22
26
 
23
27
  // src/panels/activity-panel.ts
24
28
  var activities = reactive([]);
@@ -349,5 +353,5 @@ function showProgressModal(opts) {
349
353
 
350
354
  export { beginActivity, activityIdleBlockers, registerActivityPanel, showProgressModal };
351
355
 
352
- //# debugId=E5DF930C7E1AD2C064756E2164756E21
353
- //# sourceMappingURL=studio-28xc8ws4.js.map
356
+ //# debugId=55F83A7B38610BED64756E2164756E21
357
+ //# sourceMappingURL=studio-9c4k4vhv.js.map