@silexlabs/silex 3.7.0 → 3.9.0-canary.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.
Files changed (596) hide show
  1. package/README.md +115 -78
  2. package/common/examples/plugin.js +6 -0
  3. package/common/silex-plugins/config.test.ts +71 -0
  4. package/common/silex-plugins/config.ts +25 -0
  5. package/common/silex-plugins/index.ts +2 -0
  6. package/common/silex-plugins/plugin.test.ts +57 -0
  7. package/common/silex-plugins/plugin.ts +65 -0
  8. package/dist/client/css/admin.css +25 -12
  9. package/dist/client/css/all.min.css +5 -5
  10. package/dist/client/index.html +2 -2
  11. package/dist/client/js/main.js +3108 -2940
  12. package/dist/client/js/main.js.LICENSE.txt +6 -4
  13. package/dist/client/webfonts/fa-brands-400.woff2 +0 -0
  14. package/dist/client/webfonts/fa-regular-400.woff2 +0 -0
  15. package/dist/client/webfonts/fa-solid-900.woff2 +0 -0
  16. package/dist/client/webfonts/fa-v4compatibility.woff2 +0 -0
  17. package/dist/server/common/externs.js +2 -0
  18. package/dist/server/common/silex-plugins/config.js +25 -0
  19. package/dist/server/common/silex-plugins/index.js +18 -0
  20. package/dist/server/common/silex-plugins/plugin.js +41 -0
  21. package/dist/server/server/api/api.js +9 -9
  22. package/dist/server/server/api/connectorApi.js +35 -35
  23. package/dist/server/server/api/publicationApi.js +19 -19
  24. package/dist/server/server/api/websiteApi.js +46 -46
  25. package/dist/server/server/config.js +19 -19
  26. package/dist/server/server/connectors/FsHosting.js +6 -6
  27. package/dist/server/server/connectors/FsStorage.js +35 -35
  28. package/dist/server/server/connectors/connectors.js +3 -3
  29. package/dist/server/server/expose.js +18 -8
  30. package/dist/server/server/express.js +3 -3
  31. package/dist/server/server/index.js +29 -19
  32. package/dist/server/server/jobs.js +4 -4
  33. package/dist/{plugins/server/plugins/server → server/server/plugins}/DownloadConnector.js +23 -28
  34. package/dist/{plugins/server/plugins/server → server/server/plugins}/FtpConnector.js +42 -117
  35. package/dist/{plugins/server/plugins/server → server/server/plugins}/GitlabConnector.js +80 -271
  36. package/dist/{plugins/server/plugins/server → server/server/plugins}/GitlabHostingConnector.js +11 -134
  37. package/dist/server/server/plugins/PublicationOptimizer.js +2 -0
  38. package/dist/{plugins/server/plugins/server → server/server/plugins}/SslPlugin.js +3 -32
  39. package/dist/{plugins/server/plugins/server → server/server/plugins}/StaticPlugin.js +4 -21
  40. package/dist/server/server/utils/BackwardCompat.js +2 -0
  41. package/dist/server/server/utils/websiteDataSerialization.js +10 -10
  42. package/{src/ts/client → editor}/api.ts +2 -2
  43. package/{src/ts/client → editor}/assetUrl.test.ts +6 -33
  44. package/{src/ts/client → editor}/assetUrl.ts +2 -2
  45. package/{src/ts/client → editor}/config.ts +3 -3
  46. package/{src/css/theme-modern.scss → editor/css/design-system.scss} +29 -14
  47. package/{src → editor}/css/index.scss +1 -3
  48. package/{src → editor}/css/project-bar.scss +5 -0
  49. package/{src/ts/client → editor}/expose.ts +3 -3
  50. package/{src/ts/client → editor}/grapesjs/LoginDialog.ts +3 -3
  51. package/{src/ts/client → editor}/grapesjs/PublicationManager.ts +3 -3
  52. package/{src/ts/client → editor}/grapesjs/PublicationUi.ts +1 -1
  53. package/{src/ts/client → editor}/grapesjs/cms/index.ts +1 -1
  54. package/{src/ts/client → editor}/grapesjs/cms/page-settings.ts +1 -1
  55. package/{src/ts/client → editor}/grapesjs/cms/publication.ts +1 -1
  56. package/{src/ts/client → editor}/grapesjs/eleventy.ts +1 -1
  57. package/{src/ts/client → editor}/grapesjs/index.ts +5 -3
  58. package/{src/ts/client → editor}/grapesjs/internal-links.ts +2 -2
  59. package/{src/ts/client → editor}/grapesjs/resize-panel.ts +2 -1
  60. package/{src/ts/client → editor}/grapesjs/settings-sections.ts +1 -1
  61. package/{src/ts/client → editor}/grapesjs/settings.ts +2 -2
  62. package/{src/ts/client → editor}/grapesjs/storage.ts +1 -1
  63. package/editor/grapesjs/website-info.ts +52 -0
  64. package/{src/ts/client → editor}/index.ts +1 -1
  65. package/{src/ts/client → editor}/publication-transformers.test.ts +10 -10
  66. package/{src/ts/client → editor}/publication-transformers.ts +1 -1
  67. package/{src/ts/client → editor}/publish-fonts.ts +2 -2
  68. package/grapesjs-plugins/expression-input/.husky/pre-commit +2 -0
  69. package/grapesjs-plugins/expression-input/.prettierrc.json +7 -0
  70. package/grapesjs-plugins/expression-input/.vscode/extensions.json +9 -0
  71. package/grapesjs-plugins/expression-input/CHANGELOG.md +47 -0
  72. package/grapesjs-plugins/expression-input/LICENSE +661 -0
  73. package/grapesjs-plugins/expression-input/README.md +59 -0
  74. package/grapesjs-plugins/expression-input/babel.config.js +3 -0
  75. package/grapesjs-plugins/expression-input/commitlint.config.js +1 -0
  76. package/grapesjs-plugins/expression-input/dev/README.md +1 -0
  77. package/grapesjs-plugins/expression-input/dev/expression-input.html +148 -0
  78. package/grapesjs-plugins/expression-input/dev/input-chain.html +88 -0
  79. package/grapesjs-plugins/expression-input/dev/popin-form.html +83 -0
  80. package/grapesjs-plugins/expression-input/docs/expression-input.md +173 -0
  81. package/grapesjs-plugins/expression-input/docs/popin-form.md +228 -0
  82. package/grapesjs-plugins/expression-input/eslint.config.mjs +71 -0
  83. package/grapesjs-plugins/expression-input/package.json +84 -0
  84. package/grapesjs-plugins/expression-input/playwright.config.ts +6 -0
  85. package/grapesjs-plugins/expression-input/rollup.config.js +39 -0
  86. package/grapesjs-plugins/expression-input/src/expression-input.ts +339 -0
  87. package/grapesjs-plugins/expression-input/src/index.ts +3 -0
  88. package/grapesjs-plugins/expression-input/src/input-chain.ts +216 -0
  89. package/grapesjs-plugins/expression-input/src/popin-form.ts +189 -0
  90. package/grapesjs-plugins/expression-input/src/popin-overlay.ts +188 -0
  91. package/grapesjs-plugins/expression-input/src/styles.ts +374 -0
  92. package/grapesjs-plugins/expression-input/src/test/popin-form_test.ts +47 -0
  93. package/grapesjs-plugins/expression-input/tsconfig.json +34 -0
  94. package/grapesjs-plugins/expression-input/web-dev-server.config.js +25 -0
  95. package/grapesjs-plugins/expression-input/web-test-runner.config.js +124 -0
  96. package/grapesjs-plugins/grapesjs-advanced-selector/.editorconfig +5 -0
  97. package/grapesjs-plugins/grapesjs-advanced-selector/.husky/pre-commit +4 -0
  98. package/grapesjs-plugins/grapesjs-advanced-selector/LICENSE +661 -0
  99. package/grapesjs-plugins/grapesjs-advanced-selector/README.md +158 -0
  100. package/grapesjs-plugins/grapesjs-advanced-selector/babel.config.js +3 -0
  101. package/grapesjs-plugins/grapesjs-advanced-selector/eslint.config.mjs +20 -0
  102. package/grapesjs-plugins/grapesjs-advanced-selector/index.html +353 -0
  103. package/grapesjs-plugins/grapesjs-advanced-selector/jest.config.cjs +11 -0
  104. package/grapesjs-plugins/grapesjs-advanced-selector/package-lock.json +12500 -0
  105. package/grapesjs-plugins/grapesjs-advanced-selector/package.json +75 -0
  106. package/grapesjs-plugins/grapesjs-advanced-selector/public/simple-selector.html +12 -0
  107. package/grapesjs-plugins/grapesjs-advanced-selector/src/StylableElement.ts +15 -0
  108. package/grapesjs-plugins/grapesjs-advanced-selector/src/capabilities.ts +49 -0
  109. package/grapesjs-plugins/grapesjs-advanced-selector/src/commands.ts +89 -0
  110. package/grapesjs-plugins/grapesjs-advanced-selector/src/components/complex-selector.ts +187 -0
  111. package/grapesjs-plugins/grapesjs-advanced-selector/src/components/compound-selector.ts +241 -0
  112. package/grapesjs-plugins/grapesjs-advanced-selector/src/components/current-selector-display.ts +289 -0
  113. package/grapesjs-plugins/grapesjs-advanced-selector/src/components/inline-select.ts +199 -0
  114. package/grapesjs-plugins/grapesjs-advanced-selector/src/components/resize-input.ts +19 -0
  115. package/grapesjs-plugins/grapesjs-advanced-selector/src/components/simple-selector.ts +537 -0
  116. package/grapesjs-plugins/grapesjs-advanced-selector/src/i18n/en.ts +75 -0
  117. package/grapesjs-plugins/grapesjs-advanced-selector/src/i18n/fr.ts +75 -0
  118. package/grapesjs-plugins/grapesjs-advanced-selector/src/index.ts +47 -0
  119. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/ComplexSelector.test.ts +380 -0
  120. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/ComplexSelector.ts +231 -0
  121. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/CompoundSelector.test.ts +232 -0
  122. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/CompoundSelector.ts +128 -0
  123. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/GrapesJsSelectors.test.ts +1077 -0
  124. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/GrapesJsSelectors.ts +653 -0
  125. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/Operator.test.ts +45 -0
  126. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/Operator.ts +129 -0
  127. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/PseudoClass.test.ts +31 -0
  128. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/PseudoClass.ts +159 -0
  129. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/SimpleSelector.test.ts +181 -0
  130. package/grapesjs-plugins/grapesjs-advanced-selector/src/model/SimpleSelector.ts +379 -0
  131. package/grapesjs-plugins/grapesjs-advanced-selector/src/plugin.ts +225 -0
  132. package/grapesjs-plugins/grapesjs-advanced-selector/src/styles.ts +40 -0
  133. package/grapesjs-plugins/grapesjs-advanced-selector/src/test-data.json +3546 -0
  134. package/grapesjs-plugins/grapesjs-advanced-selector/tsconfig.json +37 -0
  135. package/grapesjs-plugins/grapesjs-ai-capabilities/.eslintrc.json +31 -0
  136. package/grapesjs-plugins/grapesjs-ai-capabilities/LICENSE +17 -0
  137. package/grapesjs-plugins/grapesjs-ai-capabilities/README.md +129 -0
  138. package/grapesjs-plugins/grapesjs-ai-capabilities/_index.html +37 -0
  139. package/grapesjs-plugins/grapesjs-ai-capabilities/package-lock.json +9023 -0
  140. package/grapesjs-plugins/grapesjs-ai-capabilities/package.json +46 -0
  141. package/grapesjs-plugins/grapesjs-ai-capabilities/src/index.js +97 -0
  142. package/grapesjs-plugins/grapesjs-ai-capabilities/test/index.test.js +198 -0
  143. package/grapesjs-plugins/grapesjs-ai-capabilities/tsconfig.json +29 -0
  144. package/grapesjs-plugins/grapesjs-css-variables/.eslintrc.json +31 -0
  145. package/grapesjs-plugins/grapesjs-css-variables/LICENSE +661 -0
  146. package/grapesjs-plugins/grapesjs-css-variables/README.md +172 -0
  147. package/grapesjs-plugins/grapesjs-css-variables/TEST_SCENARIOS.md +181 -0
  148. package/grapesjs-plugins/grapesjs-css-variables/_index.html +93 -0
  149. package/grapesjs-plugins/grapesjs-css-variables/package-lock.json +9020 -0
  150. package/grapesjs-plugins/grapesjs-css-variables/package.json +46 -0
  151. package/grapesjs-plugins/grapesjs-css-variables/src/capabilities.js +133 -0
  152. package/grapesjs-plugins/grapesjs-css-variables/src/index.js +37 -0
  153. package/grapesjs-plugins/grapesjs-css-variables/src/locale/en.js +22 -0
  154. package/grapesjs-plugins/grapesjs-css-variables/src/locale/fr.js +22 -0
  155. package/grapesjs-plugins/grapesjs-css-variables/src/modal.js +692 -0
  156. package/grapesjs-plugins/grapesjs-css-variables/src/style-manager.js +461 -0
  157. package/grapesjs-plugins/grapesjs-css-variables/src/types.js +8 -0
  158. package/grapesjs-plugins/grapesjs-css-variables/src/variables.js +439 -0
  159. package/grapesjs-plugins/grapesjs-data-source/.husky/pre-commit +4 -0
  160. package/grapesjs-plugins/grapesjs-data-source/.nvmrc +1 -0
  161. package/grapesjs-plugins/grapesjs-data-source/LICENSE +661 -0
  162. package/grapesjs-plugins/grapesjs-data-source/README.md +674 -0
  163. package/grapesjs-plugins/grapesjs-data-source/__mocks__/directus-schema.json +67137 -0
  164. package/grapesjs-plugins/grapesjs-data-source/__mocks__/directus-test-schema.json +8393 -0
  165. package/grapesjs-plugins/grapesjs-data-source/__mocks__/graphql-mocks.js +7 -0
  166. package/grapesjs-plugins/grapesjs-data-source/__mocks__/simple-schema.json +493 -0
  167. package/grapesjs-plugins/grapesjs-data-source/__mocks__/squidex-schema.json +6656 -0
  168. package/grapesjs-plugins/grapesjs-data-source/__mocks__/strapi-schema.json +7986 -0
  169. package/grapesjs-plugins/grapesjs-data-source/_index.html +110 -0
  170. package/grapesjs-plugins/grapesjs-data-source/babel.config.js +7 -0
  171. package/grapesjs-plugins/grapesjs-data-source/eslint.config.mjs +47 -0
  172. package/grapesjs-plugins/grapesjs-data-source/example.graphql +355 -0
  173. package/grapesjs-plugins/grapesjs-data-source/example.graphql.json +5666 -0
  174. package/grapesjs-plugins/grapesjs-data-source/example.page.json +1 -0
  175. package/grapesjs-plugins/grapesjs-data-source/integration-tests/base/graphql-response.json +6 -0
  176. package/grapesjs-plugins/grapesjs-data-source/integration-tests/base/graphql-types.json +2095 -0
  177. package/grapesjs-plugins/grapesjs-data-source/integration-tests/base/preview.html +5 -0
  178. package/grapesjs-plugins/grapesjs-data-source/integration-tests/base/website.json +79 -0
  179. package/grapesjs-plugins/grapesjs-data-source/integration-tests/countries-lists/graphql-response.json +1056 -0
  180. package/grapesjs-plugins/grapesjs-data-source/integration-tests/countries-lists/graphql-types.json +2095 -0
  181. package/grapesjs-plugins/grapesjs-data-source/integration-tests/countries-lists/preview.html +36 -0
  182. package/grapesjs-plugins/grapesjs-data-source/integration-tests/countries-lists/website.json +422 -0
  183. package/grapesjs-plugins/grapesjs-data-source/integration-tests/example.graphql-result.json +18718 -0
  184. package/grapesjs-plugins/grapesjs-data-source/integration-tests/example.graphql-types.json +1955 -0
  185. package/grapesjs-plugins/grapesjs-data-source/integration-tests/graphql-modules.json +191 -0
  186. package/grapesjs-plugins/grapesjs-data-source/integration-tests/modules.html +45 -0
  187. package/grapesjs-plugins/grapesjs-data-source/integration-tests/visibility-truthy/graphql-response.json +1056 -0
  188. package/grapesjs-plugins/grapesjs-data-source/integration-tests/visibility-truthy/graphql-types.json +2095 -0
  189. package/grapesjs-plugins/grapesjs-data-source/integration-tests/visibility-truthy/preview.html +31 -0
  190. package/grapesjs-plugins/grapesjs-data-source/integration-tests/visibility-truthy/website.json +261 -0
  191. package/grapesjs-plugins/grapesjs-data-source/integration-tests/website-modules.json +650 -0
  192. package/grapesjs-plugins/grapesjs-data-source/jest.config.js +21 -0
  193. package/grapesjs-plugins/grapesjs-data-source/package-lock.json +13182 -0
  194. package/grapesjs-plugins/grapesjs-data-source/package.json +77 -0
  195. package/grapesjs-plugins/grapesjs-data-source/src/api.ts +386 -0
  196. package/grapesjs-plugins/grapesjs-data-source/src/capabilities.ts +80 -0
  197. package/grapesjs-plugins/grapesjs-data-source/src/commands.ts +269 -0
  198. package/grapesjs-plugins/grapesjs-data-source/src/datasources/GraphQL.ts +1039 -0
  199. package/grapesjs-plugins/grapesjs-data-source/src/datasources/graphql-introspection-query.ts +112 -0
  200. package/grapesjs-plugins/grapesjs-data-source/src/datasources/graphql.test.ts +657 -0
  201. package/grapesjs-plugins/grapesjs-data-source/src/filters/index.ts +102 -0
  202. package/grapesjs-plugins/grapesjs-data-source/src/filters/liquid.test.ts +27 -0
  203. package/grapesjs-plugins/grapesjs-data-source/src/filters/liquid.ts +985 -0
  204. package/grapesjs-plugins/grapesjs-data-source/src/index.ts +103 -0
  205. package/grapesjs-plugins/grapesjs-data-source/src/integration.test.ts +504 -0
  206. package/grapesjs-plugins/grapesjs-data-source/src/model/ExpressionTree.ts +251 -0
  207. package/grapesjs-plugins/grapesjs-data-source/src/model/completion.ts +213 -0
  208. package/grapesjs-plugins/grapesjs-data-source/src/model/dataSourceManager.ts +315 -0
  209. package/grapesjs-plugins/grapesjs-data-source/src/model/dataSourceRegistry.test.ts +170 -0
  210. package/grapesjs-plugins/grapesjs-data-source/src/model/dataSourceRegistry.ts +117 -0
  211. package/grapesjs-plugins/grapesjs-data-source/src/model/expressionEvaluator.ts +241 -0
  212. package/grapesjs-plugins/grapesjs-data-source/src/model/previewDataLoader.ts +196 -0
  213. package/grapesjs-plugins/grapesjs-data-source/src/model/queryBuilder.ts +118 -0
  214. package/grapesjs-plugins/grapesjs-data-source/src/model/state.test.ts +76 -0
  215. package/grapesjs-plugins/grapesjs-data-source/src/model/state.ts +243 -0
  216. package/grapesjs-plugins/grapesjs-data-source/src/model/token.ts +336 -0
  217. package/grapesjs-plugins/grapesjs-data-source/src/storage.test.ts +81 -0
  218. package/grapesjs-plugins/grapesjs-data-source/src/storage.ts +55 -0
  219. package/grapesjs-plugins/grapesjs-data-source/src/test-data.ts +154 -0
  220. package/grapesjs-plugins/grapesjs-data-source/src/types.ts +299 -0
  221. package/grapesjs-plugins/grapesjs-data-source/src/utils.test.ts +46 -0
  222. package/grapesjs-plugins/grapesjs-data-source/src/utils.ts +367 -0
  223. package/grapesjs-plugins/grapesjs-data-source/src/view/canvas.ts +718 -0
  224. package/grapesjs-plugins/grapesjs-data-source/src/view/custom-states-editor.ts +371 -0
  225. package/grapesjs-plugins/grapesjs-data-source/src/view/defaultStyles.ts +432 -0
  226. package/grapesjs-plugins/grapesjs-data-source/src/view/index.ts +168 -0
  227. package/grapesjs-plugins/grapesjs-data-source/src/view/properties-editor.ts +249 -0
  228. package/grapesjs-plugins/grapesjs-data-source/src/view/settings.ts +1551 -0
  229. package/grapesjs-plugins/grapesjs-data-source/src/view/state-editor.ts +528 -0
  230. package/grapesjs-plugins/grapesjs-data-source/strapi/.editorconfig +16 -0
  231. package/grapesjs-plugins/grapesjs-data-source/strapi/.env.example +7 -0
  232. package/grapesjs-plugins/grapesjs-data-source/strapi/.eslintignore +3 -0
  233. package/grapesjs-plugins/grapesjs-data-source/strapi/.eslintrc +27 -0
  234. package/grapesjs-plugins/grapesjs-data-source/strapi/README.md +57 -0
  235. package/grapesjs-plugins/grapesjs-data-source/strapi/config/admin.js +13 -0
  236. package/grapesjs-plugins/grapesjs-data-source/strapi/config/api.js +7 -0
  237. package/grapesjs-plugins/grapesjs-data-source/strapi/config/database.js +92 -0
  238. package/grapesjs-plugins/grapesjs-data-source/strapi/config/middlewares.js +12 -0
  239. package/grapesjs-plugins/grapesjs-data-source/strapi/config/server.js +10 -0
  240. package/grapesjs-plugins/grapesjs-data-source/strapi/database/migrations/.gitkeep +0 -0
  241. package/grapesjs-plugins/grapesjs-data-source/strapi/favicon.png +0 -0
  242. package/grapesjs-plugins/grapesjs-data-source/strapi/jsconfig.json +8 -0
  243. package/grapesjs-plugins/grapesjs-data-source/strapi/package.json +31 -0
  244. package/grapesjs-plugins/grapesjs-data-source/strapi/public/robots.txt +3 -0
  245. package/grapesjs-plugins/grapesjs-data-source/strapi/public/uploads/.gitkeep +0 -0
  246. package/grapesjs-plugins/grapesjs-data-source/strapi/src/admin/app.example.js +39 -0
  247. package/grapesjs-plugins/grapesjs-data-source/strapi/src/admin/webpack.config.example.js +9 -0
  248. package/grapesjs-plugins/grapesjs-data-source/strapi/src/api/.gitkeep +0 -0
  249. package/grapesjs-plugins/grapesjs-data-source/strapi/src/api/post/content-types/post/schema.json +26 -0
  250. package/grapesjs-plugins/grapesjs-data-source/strapi/src/api/post/controllers/post.js +9 -0
  251. package/grapesjs-plugins/grapesjs-data-source/strapi/src/api/post/routes/post.js +9 -0
  252. package/grapesjs-plugins/grapesjs-data-source/strapi/src/api/post/services/post.js +9 -0
  253. package/grapesjs-plugins/grapesjs-data-source/strapi/src/extensions/.gitkeep +0 -0
  254. package/grapesjs-plugins/grapesjs-data-source/strapi/src/index.js +20 -0
  255. package/grapesjs-plugins/grapesjs-data-source/strapi/types/generated/components.d.ts +5 -0
  256. package/grapesjs-plugins/grapesjs-data-source/strapi/types/generated/contentTypes.d.ts +723 -0
  257. package/grapesjs-plugins/grapesjs-data-source/tmp/countries-lists.html +1 -0
  258. package/grapesjs-plugins/grapesjs-data-source/tsconfig.cjs.json +8 -0
  259. package/grapesjs-plugins/grapesjs-data-source/tsconfig.json +49 -0
  260. package/grapesjs-plugins/grapesjs-filter-styles/README.md +137 -0
  261. package/grapesjs-plugins/grapesjs-filter-styles/eslint.config.mjs +35 -0
  262. package/grapesjs-plugins/grapesjs-filter-styles/package-lock.json +8927 -0
  263. package/grapesjs-plugins/grapesjs-filter-styles/package.json +40 -0
  264. package/grapesjs-plugins/grapesjs-filter-styles/src/index.js +283 -0
  265. package/grapesjs-plugins/grapesjs-filter-styles/tsconfig.json +26 -0
  266. package/grapesjs-plugins/grapesjs-fonts/.eslintrc.json +31 -0
  267. package/grapesjs-plugins/grapesjs-fonts/LICENSE +9 -0
  268. package/grapesjs-plugins/grapesjs-fonts/README.md +231 -0
  269. package/grapesjs-plugins/grapesjs-fonts/_index.html +95 -0
  270. package/grapesjs-plugins/grapesjs-fonts/package-lock.json +9024 -0
  271. package/grapesjs-plugins/grapesjs-fonts/package.json +46 -0
  272. package/grapesjs-plugins/grapesjs-fonts/src/capabilities.js +61 -0
  273. package/grapesjs-plugins/grapesjs-fonts/src/commands.js +100 -0
  274. package/grapesjs-plugins/grapesjs-fonts/src/fonts.js +396 -0
  275. package/grapesjs-plugins/grapesjs-fonts/src/index.js +34 -0
  276. package/grapesjs-plugins/grapesjs-fonts/src/locale/en.js +19 -0
  277. package/grapesjs-plugins/grapesjs-fonts/src/locale/fr.js +21 -0
  278. package/grapesjs-plugins/grapesjs-fonts/src/locale/ptbr.js +18 -0
  279. package/grapesjs-plugins/grapesjs-fonts/tsconfig.json +29 -0
  280. package/grapesjs-plugins/grapesjs-keymaps-dialog/README.md +116 -0
  281. package/grapesjs-plugins/grapesjs-keymaps-dialog/package.json +46 -0
  282. package/grapesjs-plugins/grapesjs-keymaps-dialog/src/KeymapsDialog.ts +208 -0
  283. package/grapesjs-plugins/grapesjs-keymaps-dialog/src/KeymapsDialogManager.ts +78 -0
  284. package/grapesjs-plugins/grapesjs-keymaps-dialog/src/index.ts +70 -0
  285. package/grapesjs-plugins/grapesjs-keymaps-dialog/tsconfig.json +29 -0
  286. package/grapesjs-plugins/grapesjs-loading/.eslintrc.json +22 -0
  287. package/grapesjs-plugins/grapesjs-loading/README.md +140 -0
  288. package/grapesjs-plugins/grapesjs-loading/_index.html +90 -0
  289. package/grapesjs-plugins/grapesjs-loading/eslint.config.mjs +20 -0
  290. package/grapesjs-plugins/grapesjs-loading/grapesjs-loading.gif +0 -0
  291. package/grapesjs-plugins/grapesjs-loading/package.json +50 -0
  292. package/grapesjs-plugins/grapesjs-loading/src/index.ts +54 -0
  293. package/grapesjs-plugins/grapesjs-loading/tsconfig.json +20 -0
  294. package/grapesjs-plugins/grapesjs-notifications/LICENSE +661 -0
  295. package/grapesjs-plugins/grapesjs-notifications/README.md +295 -0
  296. package/grapesjs-plugins/grapesjs-notifications/_index.html +95 -0
  297. package/grapesjs-plugins/grapesjs-notifications/package-lock.json +8187 -0
  298. package/grapesjs-plugins/grapesjs-notifications/package.json +58 -0
  299. package/grapesjs-plugins/grapesjs-notifications/src/Notification.ts +117 -0
  300. package/grapesjs-plugins/grapesjs-notifications/src/NotificationManager.ts +93 -0
  301. package/grapesjs-plugins/grapesjs-notifications/src/Storage.ts +26 -0
  302. package/grapesjs-plugins/grapesjs-notifications/src/capabilities.ts +33 -0
  303. package/grapesjs-plugins/grapesjs-notifications/src/commands.ts +5 -0
  304. package/grapesjs-plugins/grapesjs-notifications/src/index.ts +126 -0
  305. package/grapesjs-plugins/grapesjs-notifications/src/locale/en.js +8 -0
  306. package/grapesjs-plugins/grapesjs-notifications/src/view.ts +127 -0
  307. package/grapesjs-plugins/grapesjs-notifications/tsconfig.json +30 -0
  308. package/grapesjs-plugins/grapesjs-storage-rate-limit/LICENSE +213 -0
  309. package/grapesjs-plugins/grapesjs-storage-rate-limit/README.md +119 -0
  310. package/grapesjs-plugins/grapesjs-storage-rate-limit/jest.config.js +197 -0
  311. package/grapesjs-plugins/grapesjs-storage-rate-limit/package-lock.json +10752 -0
  312. package/grapesjs-plugins/grapesjs-storage-rate-limit/package.json +44 -0
  313. package/grapesjs-plugins/grapesjs-storage-rate-limit/src/index.js +90 -0
  314. package/grapesjs-plugins/grapesjs-storage-rate-limit/src/index.test.js +122 -0
  315. package/grapesjs-plugins/grapesjs-symbols/.eslintrc.cjs +20 -0
  316. package/grapesjs-plugins/grapesjs-symbols/.husky/pre-commit +5 -0
  317. package/grapesjs-plugins/grapesjs-symbols/.nvmrc +1 -0
  318. package/grapesjs-plugins/grapesjs-symbols/LICENSE +661 -0
  319. package/grapesjs-plugins/grapesjs-symbols/README.md +228 -0
  320. package/grapesjs-plugins/grapesjs-symbols/_index.html +104 -0
  321. package/grapesjs-plugins/grapesjs-symbols/es5.html +119 -0
  322. package/grapesjs-plugins/grapesjs-symbols/es6.html +107 -0
  323. package/grapesjs-plugins/grapesjs-symbols/eslint.config.mjs +72 -0
  324. package/grapesjs-plugins/grapesjs-symbols/jest.config.js +12 -0
  325. package/grapesjs-plugins/grapesjs-symbols/package-lock.json +6867 -0
  326. package/grapesjs-plugins/grapesjs-symbols/package.json +73 -0
  327. package/grapesjs-plugins/grapesjs-symbols/rollup.config.mjs +26 -0
  328. package/grapesjs-plugins/grapesjs-symbols/src/SymbolsCommands.test.ts +147 -0
  329. package/grapesjs-plugins/grapesjs-symbols/src/SymbolsCommands.ts +144 -0
  330. package/grapesjs-plugins/grapesjs-symbols/src/capabilities.ts +50 -0
  331. package/grapesjs-plugins/grapesjs-symbols/src/events.ts +8 -0
  332. package/grapesjs-plugins/grapesjs-symbols/src/id-utils.ts +158 -0
  333. package/grapesjs-plugins/grapesjs-symbols/src/index.ts +46 -0
  334. package/grapesjs-plugins/grapesjs-symbols/src/test-utils.ts +51 -0
  335. package/grapesjs-plugins/grapesjs-symbols/src/utils.test.ts +118 -0
  336. package/grapesjs-plugins/grapesjs-symbols/src/utils.ts +90 -0
  337. package/grapesjs-plugins/grapesjs-symbols/src/view/SymbolsView.ts +251 -0
  338. package/grapesjs-plugins/grapesjs-symbols/src/view/traits.ts +101 -0
  339. package/grapesjs-plugins/grapesjs-symbols/tsconfig.json +35 -0
  340. package/grapesjs-plugins/grapesjs-symbols/tsconfig.test.json +12 -0
  341. package/grapesjs-plugins/grapesjs-version-flow/LICENSE +661 -0
  342. package/grapesjs-plugins/grapesjs-version-flow/README.md +422 -0
  343. package/grapesjs-plugins/grapesjs-version-flow/_index.html +494 -0
  344. package/grapesjs-plugins/grapesjs-version-flow/babel.config.js +9 -0
  345. package/grapesjs-plugins/grapesjs-version-flow/package-lock.json +11832 -0
  346. package/grapesjs-plugins/grapesjs-version-flow/package.json +77 -0
  347. package/grapesjs-plugins/grapesjs-version-flow/prompts/initial.txt +116 -0
  348. package/grapesjs-plugins/grapesjs-version-flow/src/event-system.js +48 -0
  349. package/grapesjs-plugins/grapesjs-version-flow/src/index.js +87 -0
  350. package/grapesjs-plugins/grapesjs-version-flow/src/locale/en.js +26 -0
  351. package/grapesjs-plugins/grapesjs-version-flow/src/locale/fr.js +26 -0
  352. package/grapesjs-plugins/grapesjs-version-flow/src/modal-ui.js +562 -0
  353. package/grapesjs-plugins/grapesjs-version-flow/src/style-manager.js +240 -0
  354. package/grapesjs-plugins/grapesjs-version-flow/src/upgrade-engine.js +237 -0
  355. package/grapesjs-plugins/grapesjs-version-flow/src/version-manager.js +117 -0
  356. package/grapesjs-plugins/grapesjs-version-flow/tests/index.test.js +241 -0
  357. package/grapesjs-plugins/grapesjs-version-flow/tests/integration.test.js +227 -0
  358. package/grapesjs-plugins/grapesjs-version-flow/tests/setup.js +67 -0
  359. package/grapesjs-plugins/grapesjs-version-flow/tests/upgrade-engine.test.js +360 -0
  360. package/grapesjs-plugins/grapesjs-version-flow/tests/version-manager.test.js +168 -0
  361. package/grapesjs-plugins/grapesjs-version-flow/tests/version-storage.test.js +203 -0
  362. package/grapesjs-plugins/grapesjs-version-flow/tsconfig.json +26 -0
  363. package/package.json +127 -159
  364. package/{src/ts/server → server}/api/api.ts +6 -6
  365. package/{src/ts/server → server}/api/connectorApi.ts +5 -5
  366. package/{src/ts/server → server}/api/publicationApi.ts +7 -7
  367. package/{src/ts/server → server}/api/websiteApi.ts +7 -8
  368. package/{src/ts/server → server}/config.ts +14 -12
  369. package/{src/ts/server → server}/connectors/FsHosting.ts +4 -4
  370. package/{src/ts/server → server}/connectors/FsStorage.test.ts +2 -2
  371. package/{src/ts/server → server}/connectors/FsStorage.ts +8 -8
  372. package/{src/ts/server → server}/connectors/connectors.ts +3 -3
  373. package/server/deploy/.nvmrc +1 -0
  374. package/server/deploy/.silex.js +220 -0
  375. package/server/deploy/client-config.js +17 -0
  376. package/server/deploy/client-plugins/.gitkeep +0 -0
  377. package/server/deploy/client-plugins/onboarding.js +67 -0
  378. package/server/deploy/example.env +25 -0
  379. package/server/deploy/onboarding.json +22 -0
  380. package/server/deploy/picto-silex@3x.png +0 -0
  381. package/server/deploy/server-plugins/dashboard.js +74 -0
  382. package/server/deploy/server-plugins/onboarding.js +212 -0
  383. package/server/deploy/silex-platform.yml +75 -0
  384. package/{src/ts/server → server}/events.ts +2 -2
  385. package/{src/ts/server → server}/expose.ts +1 -1
  386. package/{src/ts/server → server}/express.ts +2 -2
  387. package/{src/ts/server → server}/index.ts +7 -7
  388. package/{src/ts/server → server}/jobs.test.ts +1 -1
  389. package/{src/ts/server → server}/jobs.ts +1 -1
  390. package/server/plugins/DownloadConnector.publish.test.ts +32 -0
  391. package/server/plugins/DownloadConnector.test.ts +70 -0
  392. package/{src/ts/plugins/server → server/plugins}/DownloadConnector.ts +22 -10
  393. package/{src/ts/plugins/server → server/plugins}/FtpConnector.test.ts +3 -3
  394. package/{src/ts/plugins/server → server/plugins}/FtpConnector.ts +7 -7
  395. package/{src/ts/plugins/server → server/plugins}/GitlabConnector.ts +9 -26
  396. package/{src/ts/plugins/server → server/plugins}/GitlabHostingConnector.ts +5 -5
  397. package/{src/ts/plugins/server → server/plugins}/SslPlugin.ts +2 -2
  398. package/{src/ts/plugins/server → server/plugins}/StaticPlugin.ts +2 -2
  399. package/{src/ts/server → server}/utils/BackwardCompat.ts +1 -1
  400. package/{src/ts/server → server}/utils/websiteDataSerialization.test.ts +2 -2
  401. package/{src/ts/server → server}/utils/websiteDataSerialization.ts +3 -3
  402. package/.silex.js +0 -76
  403. package/dist/client/client/api.d.ts +0 -101
  404. package/dist/client/client/assetUrl.d.ts +0 -60
  405. package/dist/client/client/config.d.ts +0 -110
  406. package/dist/client/client/events.d.ts +0 -23
  407. package/dist/client/client/expose.d.ts +0 -10
  408. package/dist/client/client/grapesjs/LoginDialog.d.ts +0 -15
  409. package/dist/client/client/grapesjs/PublicationManager.d.ts +0 -117
  410. package/dist/client/client/grapesjs/PublicationUi.d.ts +0 -59
  411. package/dist/client/client/grapesjs/blocks.d.ts +0 -1
  412. package/dist/client/client/grapesjs/body-remap.d.ts +0 -15
  413. package/dist/client/client/grapesjs/breadcrumbs.d.ts +0 -1
  414. package/dist/client/client/grapesjs/cms/DataSource.d.ts +0 -43
  415. package/dist/client/client/grapesjs/cms/blocks.d.ts +0 -2
  416. package/dist/client/client/grapesjs/cms/buttons.d.ts +0 -2
  417. package/dist/client/client/grapesjs/cms/collection-pages.d.ts +0 -4
  418. package/dist/client/client/grapesjs/cms/config.d.ts +0 -9
  419. package/dist/client/client/grapesjs/cms/filters.d.ts +0 -3
  420. package/dist/client/client/grapesjs/cms/index.d.ts +0 -43
  421. package/dist/client/client/grapesjs/cms/liquid.d.ts +0 -73
  422. package/dist/client/client/grapesjs/cms/page-settings.d.ts +0 -6
  423. package/dist/client/client/grapesjs/cms/publication.d.ts +0 -60
  424. package/dist/client/client/grapesjs/cms/site-settings.d.ts +0 -3
  425. package/dist/client/client/grapesjs/cms/states.d.ts +0 -8
  426. package/dist/client/client/grapesjs/cms/traits.d.ts +0 -8
  427. package/dist/client/client/grapesjs/core-commands.d.ts +0 -3
  428. package/dist/client/client/grapesjs/css-props.d.ts +0 -6
  429. package/dist/client/client/grapesjs/flex.d.ts +0 -3
  430. package/dist/client/client/grapesjs/footer.d.ts +0 -2
  431. package/dist/client/client/grapesjs/img.d.ts +0 -6
  432. package/dist/client/client/grapesjs/index.d.ts +0 -9
  433. package/dist/client/client/grapesjs/internal-links.d.ts +0 -1
  434. package/dist/client/client/grapesjs/keymaps.d.ts +0 -123
  435. package/dist/client/client/grapesjs/li.d.ts +0 -7
  436. package/dist/client/client/grapesjs/new-page-dialog.d.ts +0 -2
  437. package/dist/client/client/grapesjs/openImport.d.ts +0 -9
  438. package/dist/client/client/grapesjs/page-panel.d.ts +0 -13
  439. package/dist/client/client/grapesjs/project-bar.d.ts +0 -21
  440. package/dist/client/client/grapesjs/resize-panel.d.ts +0 -1
  441. package/dist/client/client/grapesjs/rich-text.d.ts +0 -4
  442. package/dist/client/client/grapesjs/sectors.d.ts +0 -12
  443. package/dist/client/client/grapesjs/semantic.d.ts +0 -1
  444. package/dist/client/client/grapesjs/settings-sections.d.ts +0 -19
  445. package/dist/client/client/grapesjs/settings.d.ts +0 -16
  446. package/dist/client/client/grapesjs/storage.d.ts +0 -3
  447. package/dist/client/client/grapesjs/symbolDialogs.d.ts +0 -4
  448. package/dist/client/client/grapesjs/upload-progress.d.ts +0 -2
  449. package/dist/client/client/grapesjs/view-buttons.d.ts +0 -2
  450. package/dist/client/client/index.d.ts +0 -10
  451. package/dist/client/client/publication-transformers.d.ts +0 -42
  452. package/dist/client/client/publish-custom-code-block.d.ts +0 -4
  453. package/dist/client/client/publish-fonts.d.ts +0 -4
  454. package/dist/client/client/utils.d.ts +0 -23
  455. package/dist/client/constants.d.ts +0 -35
  456. package/dist/client/page.d.ts +0 -2
  457. package/dist/client/types.d.ts +0 -365
  458. package/dist/client/webfonts/fa-brands-400.ttf +0 -0
  459. package/dist/client/webfonts/fa-regular-400.ttf +0 -0
  460. package/dist/client/webfonts/fa-solid-900.ttf +0 -0
  461. package/dist/client/webfonts/fa-v4compatibility.ttf +0 -0
  462. package/dist/plugins/client/client/events.d.ts +0 -23
  463. package/dist/plugins/client/client/events.js +0 -43
  464. package/dist/plugins/client/client/events.js.map +0 -1
  465. package/dist/plugins/client/plugins/client/template.d.ts +0 -2
  466. package/dist/plugins/client/plugins/client/template.js +0 -234
  467. package/dist/plugins/client/plugins/client/template.js.map +0 -1
  468. package/dist/plugins/client/plugins/client/website-info.d.ts +0 -1
  469. package/dist/plugins/client/plugins/client/website-info.js +0 -72
  470. package/dist/plugins/client/plugins/client/website-info.js.map +0 -1
  471. package/dist/plugins/client/types.d.ts +0 -365
  472. package/dist/plugins/client/types.js +0 -83
  473. package/dist/plugins/client/types.js.map +0 -1
  474. package/dist/plugins/server/constants.d.ts +0 -35
  475. package/dist/plugins/server/constants.js +0 -79
  476. package/dist/plugins/server/constants.js.map +0 -1
  477. package/dist/plugins/server/page.d.ts +0 -2
  478. package/dist/plugins/server/page.js +0 -35
  479. package/dist/plugins/server/page.js.map +0 -1
  480. package/dist/plugins/server/plugins/server/Cache.d.ts +0 -2
  481. package/dist/plugins/server/plugins/server/Cache.js +0 -36
  482. package/dist/plugins/server/plugins/server/Cache.js.map +0 -1
  483. package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +0 -29
  484. package/dist/plugins/server/plugins/server/DownloadConnector.js.map +0 -1
  485. package/dist/plugins/server/plugins/server/FtpConnector.d.ts +0 -86
  486. package/dist/plugins/server/plugins/server/FtpConnector.js.map +0 -1
  487. package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +0 -172
  488. package/dist/plugins/server/plugins/server/GitlabConnector.js.map +0 -1
  489. package/dist/plugins/server/plugins/server/GitlabHostingConnector.d.ts +0 -23
  490. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js.map +0 -1
  491. package/dist/plugins/server/plugins/server/PublicationOptimizer.js +0 -14
  492. package/dist/plugins/server/plugins/server/PublicationOptimizer.js.map +0 -1
  493. package/dist/plugins/server/plugins/server/SslPlugin.d.ts +0 -1
  494. package/dist/plugins/server/plugins/server/SslPlugin.js.map +0 -1
  495. package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +0 -8
  496. package/dist/plugins/server/plugins/server/StaticPlugin.js.map +0 -1
  497. package/dist/plugins/server/server/config.d.ts +0 -59
  498. package/dist/plugins/server/server/config.js +0 -181
  499. package/dist/plugins/server/server/config.js.map +0 -1
  500. package/dist/plugins/server/server/connectors/FsHosting.d.ts +0 -14
  501. package/dist/plugins/server/server/connectors/FsHosting.js +0 -66
  502. package/dist/plugins/server/server/connectors/FsHosting.js.map +0 -1
  503. package/dist/plugins/server/server/connectors/FsStorage.d.ts +0 -44
  504. package/dist/plugins/server/server/connectors/FsStorage.js +0 -303
  505. package/dist/plugins/server/server/connectors/FsStorage.js.map +0 -1
  506. package/dist/plugins/server/server/connectors/connectors.d.ts +0 -86
  507. package/dist/plugins/server/server/connectors/connectors.js +0 -126
  508. package/dist/plugins/server/server/connectors/connectors.js.map +0 -1
  509. package/dist/plugins/server/server/events.d.ts +0 -26
  510. package/dist/plugins/server/server/events.js +0 -31
  511. package/dist/plugins/server/server/events.js.map +0 -1
  512. package/dist/plugins/server/server/jobs.d.ts +0 -12
  513. package/dist/plugins/server/server/jobs.js +0 -79
  514. package/dist/plugins/server/server/jobs.js.map +0 -1
  515. package/dist/plugins/server/server/utils/validation.d.ts +0 -7
  516. package/dist/plugins/server/server/utils/validation.js +0 -37
  517. package/dist/plugins/server/server/utils/validation.js.map +0 -1
  518. package/dist/plugins/server/server/utils/websiteDataSerialization.d.ts +0 -24
  519. package/dist/plugins/server/server/utils/websiteDataSerialization.js +0 -136
  520. package/dist/plugins/server/server/utils/websiteDataSerialization.js.map +0 -1
  521. package/dist/plugins/server/types.d.ts +0 -365
  522. package/dist/plugins/server/types.js +0 -87
  523. package/dist/plugins/server/types.js.map +0 -1
  524. package/dist/server/server/cli.js +0 -71
  525. package/src/css/grapesjs-light.scss +0 -180
  526. package/src/ts/plugins/client/template.ts +0 -246
  527. package/src/ts/plugins/client/website-info.ts +0 -84
  528. package/src/ts/server/cli.ts +0 -67
  529. /package/{src/ts → common}/constants.ts +0 -0
  530. /package/{src/ts → common}/externs.ts +0 -0
  531. /package/{src/ts → common}/page.ts +0 -0
  532. /package/{src/ts → common}/types.ts +0 -0
  533. /package/dist/server/{constants.js → common/constants.js} +0 -0
  534. /package/dist/server/{page.js → common/page.js} +0 -0
  535. /package/dist/server/{types.js → common/types.js} +0 -0
  536. /package/dist/server/{plugins/server → server/plugins}/Cache.js +0 -0
  537. /package/{src → editor}/css/_mixins.scss +0 -0
  538. /package/{src → editor}/css/_variables.scss +0 -0
  539. /package/{src → editor}/css/dialog.scss +0 -0
  540. /package/{src → editor}/css/dialogs.scss +0 -0
  541. /package/{src → editor}/css/fonts.scss +0 -0
  542. /package/{src → editor}/css/footer.scss +0 -0
  543. /package/{src → editor}/css/grapesjs-plugins.scss +0 -0
  544. /package/{src → editor}/css/grapesjs.scss +0 -0
  545. /package/{src → editor}/css/loader.scss +0 -0
  546. /package/{src → editor}/css/page-panel.scss +0 -0
  547. /package/{src → editor}/css/panels.scss +0 -0
  548. /package/{src → editor}/css/silex.scss +0 -0
  549. /package/{src → editor}/css/theme-base.scss +0 -0
  550. /package/{src → editor}/css/website-info.scss +0 -0
  551. /package/{src/ts/client → editor}/events.ts +0 -0
  552. /package/{src/ts/client → editor}/grapesjs/blocks.ts +0 -0
  553. /package/{src/ts/client → editor}/grapesjs/body-remap.ts +0 -0
  554. /package/{src/ts/client → editor}/grapesjs/breadcrumbs.ts +0 -0
  555. /package/{src/ts/client → editor}/grapesjs/cms/DataSource.ts +0 -0
  556. /package/{src/ts/client → editor}/grapesjs/cms/blocks.ts +0 -0
  557. /package/{src/ts/client → editor}/grapesjs/cms/buttons.ts +0 -0
  558. /package/{src/ts/client → editor}/grapesjs/cms/collection-pages.ts +0 -0
  559. /package/{src/ts/client → editor}/grapesjs/cms/config.ts +0 -0
  560. /package/{src/ts/client → editor}/grapesjs/cms/filters.ts +0 -0
  561. /package/{src/ts/client → editor}/grapesjs/cms/liquid.mock.ts +0 -0
  562. /package/{src/ts/client → editor}/grapesjs/cms/liquid.test.ts +0 -0
  563. /package/{src/ts/client → editor}/grapesjs/cms/liquid.ts +0 -0
  564. /package/{src/ts/client → editor}/grapesjs/cms/publication.test.ts +0 -0
  565. /package/{src/ts/client → editor}/grapesjs/cms/site-settings.ts +0 -0
  566. /package/{src/ts/client → editor}/grapesjs/cms/states.ts +0 -0
  567. /package/{src/ts/client → editor}/grapesjs/cms/traits.ts +0 -0
  568. /package/{src/ts/client → editor}/grapesjs/core-commands.ts +0 -0
  569. /package/{src/ts/client → editor}/grapesjs/css-props.ts +0 -0
  570. /package/{src/ts/client → editor}/grapesjs/flex.ts +0 -0
  571. /package/{src/ts/client → editor}/grapesjs/footer.ts +0 -0
  572. /package/{src/ts/client → editor}/grapesjs/img.ts +0 -0
  573. /package/{src/ts/client → editor}/grapesjs/internal-links.test.ts +0 -0
  574. /package/{src/ts/client → editor}/grapesjs/keymaps.ts +0 -0
  575. /package/{src/ts/client → editor}/grapesjs/li.ts +0 -0
  576. /package/{src/ts/client → editor}/grapesjs/new-page-dialog.ts +0 -0
  577. /package/{src/ts/client → editor}/grapesjs/openImport.ts +0 -0
  578. /package/{src/ts/client → editor}/grapesjs/page-panel.ts +0 -0
  579. /package/{src/ts/client → editor}/grapesjs/project-bar.ts +0 -0
  580. /package/{src/ts/client → editor}/grapesjs/rich-text.ts +0 -0
  581. /package/{src/ts/client → editor}/grapesjs/sectors.ts +0 -0
  582. /package/{src/ts/client → editor}/grapesjs/semantic.ts +0 -0
  583. /package/{src/ts/client → editor}/grapesjs/static-plugins.ts +0 -0
  584. /package/{src/ts/client → editor}/grapesjs/symbolDialogs.ts +0 -0
  585. /package/{src/ts/client → editor}/grapesjs/upload-progress.ts +0 -0
  586. /package/{src/ts/client → editor}/grapesjs/view-buttons.ts +0 -0
  587. /package/{src → editor}/html/debug.pug +0 -0
  588. /package/{src → editor}/html/index.pug +0 -0
  589. /package/{src → editor}/html/templates/includes.pug +0 -0
  590. /package/{src → editor}/html/templates/workspace.pug +0 -0
  591. /package/{src/ts/client → editor}/publish-custom-code-block.ts +0 -0
  592. /package/{src/ts/client → editor}/utils.ts +0 -0
  593. /package/{dist/plugins/server/plugins/server/PublicationOptimizer.d.ts → grapesjs-plugins/expression-input/docs/.nojekyll} +0 -0
  594. /package/{src/ts/plugins/server → server/plugins}/Cache.ts +0 -0
  595. /package/{src/ts/plugins/server → server/plugins}/PublicationOptimizer.ts +0 -0
  596. /package/{src/ts/server → server}/utils/validation.ts +0 -0
@@ -0,0 +1,1551 @@
1
+ import { createRef, Ref, ref } from 'lit/directives/ref.js'
2
+ import {repeat} from 'lit/directives/repeat.js'
3
+ import GraphQL, { GraphQLOptions, GraphQLBackendType, LightweightType } from '../datasources/GraphQL'
4
+ import { COMMAND_ADD_DATA_SOURCE, DATA_SOURCE_CHANGED, DATA_SOURCE_DATA_LOAD_END, DATA_SOURCE_ERROR, DATA_SOURCE_READY, DataSourceEditorViewOptions, IDataSource } from '../types'
5
+ import { getDefaultOptions, getElementFromOption } from '../utils'
6
+ import { getAllDataSources, addDataSource, removeDataSource } from '../model/dataSourceRegistry'
7
+ import { css, html, LitElement, render, TemplateResult } from 'lit'
8
+ import { property, state } from 'lit/decorators.js'
9
+ import { Editor } from 'grapesjs'
10
+
11
+ const COMMON_STYLES = css`
12
+ :host {
13
+ font-family: var(--gjs-main-font);
14
+ font-size: var(--gjs-font-size);
15
+ }
16
+ .ds-field {
17
+ padding: 10px;
18
+ }
19
+ .ds-field > span {
20
+ display: block;
21
+ }
22
+ hr.ds-separator {
23
+ border: none;
24
+ border-top: 1px solid var(--ds-button-bg);
25
+ }
26
+ .ds-field input,
27
+ .ds-field select {
28
+ -webkit-appearance: none;
29
+ -moz-appearance: none;
30
+ appearance: none;
31
+ background-color: var(--gjs-main-dark-color);
32
+ border: none;
33
+ box-shadow: none;
34
+ border-radius: 2px;
35
+ box-sizing: border-box;
36
+ padding: 0;
37
+ position: relative;
38
+
39
+ padding: 10px;
40
+ color: inherit;
41
+ width: 100%;
42
+ }
43
+ .ds-btn-prim {
44
+ color:inherit;
45
+ background-color:var(--gjs-main-light-color);
46
+ border-radius:2px;
47
+ padding:3px 6px;
48
+ padding:var(--gjs-input-padding);
49
+ cursor:pointer;
50
+ border:none
51
+ }
52
+ .ds-btn-prim:active {
53
+ background-color:var(--gjs-main-light-color)
54
+ }
55
+ .ds-btn-danger {
56
+ color: var(--gjs-light-color);
57
+ background-color: transparent;
58
+ }
59
+ .ds-btn-danger:hover {
60
+ color: var(--ds-highlight);
61
+ }
62
+ [disabled],
63
+ [readonly] {
64
+ font-style: italic;
65
+ }
66
+
67
+ /* Modal specific styles */
68
+ :host(.ds-modal) {
69
+ max-width: 600px;
70
+ width: 90vw;
71
+ }
72
+ `
73
+
74
+ export default (editor: Editor, options: Partial<DataSourceEditorViewOptions> = {}) => {
75
+ // Settings dialog
76
+ if (options.settingsEl) {
77
+ // Get the container element for the UI
78
+ const settingsEl = getElementFromOption(options.settingsEl, 'options.settingsEl')
79
+ const dsSettings: Ref<SettingsDataSources> = createRef()
80
+ editor.on(`${DATA_SOURCE_CHANGED} ${DATA_SOURCE_ERROR} ${DATA_SOURCE_READY} ${DATA_SOURCE_DATA_LOAD_END}`, () => {
81
+ if(dsSettings.value) {
82
+ dsSettings.value.dataSources = [...getAllDataSources()]
83
+ dsSettings.value.requestUpdate()
84
+ } else {
85
+ renderSettings(editor, dsSettings, settingsEl)
86
+ }
87
+ })
88
+ renderSettings(editor, dsSettings, settingsEl)
89
+
90
+ // Add a data source
91
+ editor.Commands.add(COMMAND_ADD_DATA_SOURCE, {
92
+ run() {
93
+ dsSettings.value?.openDataSourceModal()
94
+ },
95
+ })
96
+ }
97
+ }
98
+
99
+ function renderSettings(editor: Editor, dsSettings: Ref, settingsEl: HTMLElement) {
100
+ render(html`
101
+ <ds-settings
102
+ ${ref(dsSettings)}
103
+ .dataSources=${[]}
104
+ .editor=${editor}
105
+ @add=${(e: CustomEvent) => {
106
+ const ds = e.detail as GraphQLOptions
107
+ const newDS = new GraphQL(ds)
108
+ addDataSource(newDS)
109
+ }}
110
+ @add-top=${(e: CustomEvent) => {
111
+ const ds = e.detail as GraphQLOptions
112
+ const newDS = new GraphQL(ds)
113
+ addDataSource(newDS)
114
+ }}
115
+ @change=${() => {
116
+ // Refresh the datasources list when a datasource is edited
117
+ if (dsSettings.value) {
118
+ const settings = dsSettings.value as SettingsDataSources
119
+ settings.dataSources = [...getAllDataSources()]
120
+ settings.requestUpdate()
121
+ }
122
+ }}
123
+ @delete=${(e: CustomEvent) => {
124
+ const ds = e.detail as IDataSource
125
+ removeDataSource(ds)
126
+ }}
127
+ ></ds-settings>
128
+ `, settingsEl)
129
+ }
130
+
131
+ /**
132
+ * <ds-settings> is a web component that renders the settings dialog for the DataSourceEditor plugin
133
+ */
134
+ class SettingsDataSources extends LitElement {
135
+
136
+ @property({ type: Array })
137
+ dataSources: IDataSource[]
138
+
139
+ @property({ type: Object })
140
+ editor: Editor | null
141
+
142
+ @state()
143
+ private updateCounter: number = 0
144
+
145
+ constructor() {
146
+ super()
147
+ this.dataSources = []
148
+ this.editor = null
149
+ }
150
+
151
+ connectedCallback() {
152
+ super.connectedCallback()
153
+ }
154
+
155
+ openDataSourceModal(dataSource: IDataSource | null = null) {
156
+ if (!this.editor) return
157
+
158
+ const isEdit = !!dataSource
159
+ const title = isEdit ? 'Edit Data Source' : 'Add Data Source'
160
+
161
+ // Create or use existing data source
162
+ const ds = dataSource || new GraphQL(getDefaultOptions(this.dataSources.length.toString()))
163
+
164
+ // Create the form element
165
+ const formElement = document.createElement('ds-settings__data-source') as SettingsDataSource
166
+ formElement.dataSource = ds
167
+ formElement.isEdit = isEdit
168
+
169
+ // Handle form events
170
+ const handleSave = () => {
171
+ if (isEdit) {
172
+ // Force new array reference and increment counter to trigger card re-renders
173
+ this.dataSources = [...this.dataSources]
174
+ this.updateCounter++
175
+ this.dispatchEvent(new CustomEvent('change', { detail: ds }))
176
+ } else {
177
+ this.dispatchEvent(new CustomEvent('add', { detail: ds }))
178
+ }
179
+ this.requestUpdate()
180
+ this.editor!.Modal.close()
181
+ }
182
+
183
+ const handleDelete = () => {
184
+ this.dispatchEvent(new CustomEvent('delete', { detail: ds }))
185
+ this.editor!.Modal.close()
186
+ }
187
+
188
+ const handleCancel = () => {
189
+ this.editor!.Modal.close()
190
+ }
191
+
192
+ const handleKeyDown = (e: KeyboardEvent) => {
193
+ if (e.key === 'Escape') {
194
+ this.editor!.Modal.close()
195
+ }
196
+ }
197
+
198
+ formElement.addEventListener('change', handleSave)
199
+ formElement.addEventListener('cancel', handleCancel)
200
+ if (isEdit) {
201
+ formElement.addEventListener('delete', handleDelete)
202
+ }
203
+
204
+ // Add ESC key handler
205
+ document.addEventListener('keydown', handleKeyDown)
206
+
207
+ // Clean up on modal close
208
+ const modalObserver = new MutationObserver(() => {
209
+ if (!this.editor!.Modal.isOpen()) {
210
+ document.removeEventListener('keydown', handleKeyDown)
211
+ modalObserver.disconnect()
212
+ }
213
+ })
214
+ const modalParent = this.editor.Modal.getContentEl()?.parentElement
215
+ if (modalParent) {
216
+ modalObserver.observe(modalParent, {
217
+ attributes: true,
218
+ attributeFilter: ['style', 'class'],
219
+ })
220
+ }
221
+
222
+ // Open the modal
223
+ this.editor.Modal.open({
224
+ title,
225
+ content: formElement,
226
+ attributes: { class: 'ds-modal' },
227
+ })
228
+ }
229
+
230
+ static styles = [
231
+ COMMON_STYLES,
232
+ css`
233
+ .ds-settings {
234
+ padding: 16px 0;
235
+ }
236
+ .ds-empty-state {
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ min-height: 200px;
241
+ text-align: center;
242
+ }
243
+ .ds-empty-state__content {
244
+ max-width: 300px;
245
+ }
246
+ .ds-empty-state__title {
247
+ margin: 0 0 8px 0;
248
+ font-size: 18px;
249
+ color: inherit;
250
+ }
251
+ .ds-empty-state__description {
252
+ margin: 0 0 24px 0;
253
+ color: var(--gjs-light-color);
254
+ line-height: 1.4;
255
+ }
256
+ .ds-data-sources {
257
+ margin-bottom: 16px;
258
+ }
259
+ .ds-add-section {
260
+ padding: 16px 0;
261
+ border-top: 1px solid var(--ds-button-bg);
262
+ text-align: center;
263
+ }
264
+ .ds-btn-prim--large {
265
+ padding: 12px 24px;
266
+ font-size: 14px;
267
+ }
268
+ `,
269
+ ]
270
+
271
+ protected render() {
272
+ const visibleDataSources = this.dataSources.filter(ds => !ds.hidden)
273
+
274
+ return html`
275
+ <section class="ds-settings">
276
+ ${visibleDataSources.length === 0 ? html`
277
+ <div class="ds-empty-state">
278
+ <div class="ds-empty-state__content">
279
+ <h3 class="ds-empty-state__title">No Data Sources</h3>
280
+ <p class="ds-empty-state__description">
281
+ Connect to GraphQL APIs to display dynamic data in your website
282
+ </p>
283
+ <button
284
+ type="button"
285
+ class="ds-btn-prim ds-btn-prim--large"
286
+ @click=${() => this.openDataSourceModal()}
287
+ >
288
+ Add Your First Data Source
289
+ </button>
290
+ </div>
291
+ </div>
292
+ ` : html`
293
+ <div class="ds-data-sources">
294
+ ${repeat(visibleDataSources, (ds: IDataSource) => `${ds.id}-${this.updateCounter}`, (ds: IDataSource) => html`
295
+ <ds-data-source-card
296
+ .dataSource=${ds}
297
+ data-id=${ds.id}
298
+ @edit=${(e: CustomEvent) => this.openDataSourceModal(e.detail)}
299
+ @test=${(e: CustomEvent) => this.testConnection(e.detail)}
300
+ @delete=${(e: CustomEvent) => {
301
+ this.dispatchEvent(new CustomEvent('delete', { detail: e.detail }))
302
+ }}
303
+ ></ds-data-source-card>
304
+ `)}
305
+ </div>
306
+ <div class="ds-add-section">
307
+ <button
308
+ type="button"
309
+ class="ds-btn-prim"
310
+ @click=${() => this.openDataSourceModal()}
311
+ >
312
+ Add Data Source
313
+ </button>
314
+ </div>
315
+ `}
316
+ </section>
317
+ `
318
+ }
319
+
320
+ testConnection(dataSource: IDataSource) {
321
+ // Find the card component to update its loading state
322
+ const cardElement = this.shadowRoot?.querySelector(`ds-data-source-card[data-id="${dataSource.id}"]`) as DataSourceCard
323
+ if (cardElement) {
324
+ cardElement.isTestingConnection = true
325
+ }
326
+
327
+ // Create a temporary form element to handle the connection test
328
+ const tempForm = document.createElement('ds-settings__data-source') as SettingsDataSource
329
+ tempForm.dataSource = dataSource
330
+
331
+ // Override the original connectDataSource to handle card updates
332
+ tempForm.connectDataSource = () => {
333
+ if (cardElement) {
334
+ cardElement.isTestingConnection = true
335
+ }
336
+
337
+ dataSource.connect().then(() => {
338
+ if (cardElement) {
339
+ cardElement.isTestingConnection = false
340
+ }
341
+ this.dispatchEvent(new CustomEvent('change', { detail: dataSource }))
342
+ this.requestUpdate()
343
+ }).catch((err: Error) => {
344
+ console.error('Data source connection error', { err })
345
+ if (cardElement) {
346
+ cardElement.isTestingConnection = false
347
+ }
348
+ this.requestUpdate()
349
+ })
350
+ }
351
+
352
+ tempForm.connectDataSource()
353
+ }
354
+ }
355
+
356
+ if(!customElements.get('ds-settings')) {
357
+ customElements.define('ds-settings', SettingsDataSources)
358
+ }
359
+
360
+
361
+ class SettingsDataSource extends LitElement {
362
+ @property({ type: Object })
363
+ dataSource: IDataSource | null
364
+ @property({ type: Boolean })
365
+ isEdit: boolean = false
366
+
367
+ // State for the creation flow
368
+ @state()
369
+ errorMessage: string = ''
370
+ @state()
371
+ connected: boolean = false
372
+ @state()
373
+ isLoading: boolean = false
374
+ @state()
375
+ creationPhase: 'config' | 'types' = 'config' // config = initial form, types = type selection
376
+ @state()
377
+ availableTypes: LightweightType[] = [] // List of types (name + kind) from lightweight query
378
+ @state()
379
+ selectedTypes: Set<string> = new Set() // Currently selected types
380
+ @state()
381
+ typeSearchQuery: string = '' // Search/filter for type list
382
+ @state()
383
+ queryTypeName: string = 'Query' // The query type name from schema introspection
384
+
385
+ private loadingIcon = html`<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="12" r="3"><animate attributeName="r" values="3;8;3" dur="1s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;0.3;1" dur="1s" repeatCount="indefinite"/></circle></svg>`
386
+ private connectedIcon = html`<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>`
387
+ // private unknownIcon = html`<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="12" r="2"/></svg>`
388
+
389
+ constructor() {
390
+ super()
391
+ this.dataSource = null
392
+ }
393
+
394
+ connectedCallback() {
395
+ super.connectedCallback()
396
+ }
397
+
398
+ /**
399
+ * Phase 1: Fetch lightweight type names from the GraphQL endpoint
400
+ */
401
+ async fetchTypeNames() {
402
+ if (!this.dataSource || !(this.dataSource instanceof GraphQL)) {
403
+ this.errorMessage = 'Invalid data source'
404
+ return
405
+ }
406
+
407
+ this.isLoading = true
408
+ this.errorMessage = ''
409
+ this.requestUpdate()
410
+
411
+ try {
412
+ const ds = this.dataSource as GraphQL
413
+ const result = await ds.fetchTypeNames()
414
+ // Store the queryType name from the schema
415
+ this.queryTypeName = result.queryTypeName
416
+ // Sort types by name
417
+ this.availableTypes = result.types.sort((a, b) => a.name.localeCompare(b.name))
418
+
419
+ // For existing datasources with disabledTypes, compute selected = all - disabled
420
+ // Otherwise, apply backend-specific default selection
421
+ if (this.isEdit && ds.disabledTypes && ds.disabledTypes.length > 0) {
422
+ const allTypeNames = this.availableTypes.map(t => t.name)
423
+ const selectedNames = allTypeNames.filter(name => !ds.disabledTypes!.includes(name))
424
+ this.selectedTypes = new Set(selectedNames)
425
+ } else {
426
+ const backendType = ds.backendType || 'generic'
427
+ const defaultEnabled = GraphQL.getDefaultEnabledTypes(backendType, this.availableTypes, this.queryTypeName)
428
+ this.selectedTypes = new Set(defaultEnabled)
429
+ }
430
+
431
+ // Move to type selection phase
432
+ this.creationPhase = 'types'
433
+ this.isLoading = false
434
+ this.requestUpdate()
435
+ } catch (e) {
436
+ console.error('[Settings] Failed to fetch type names:', e)
437
+ this.errorMessage = (e as Error).message
438
+ this.isLoading = false
439
+ this.requestUpdate()
440
+ }
441
+ }
442
+
443
+ /**
444
+ * Check if a type is required (cannot be blacklisted)
445
+ * The queryType and all SCALAR types are required
446
+ */
447
+ isRequiredType(typeName: string): boolean {
448
+ if (typeName === this.queryTypeName) return true
449
+ const type = this.availableTypes.find(t => t.name === typeName)
450
+ return type?.kind === 'SCALAR'
451
+ }
452
+
453
+ /**
454
+ * Toggle a type's selected state
455
+ */
456
+ toggleType(typeName: string) {
457
+ // Query and SCALAR types cannot be unchecked - they're always required
458
+ if (this.isRequiredType(typeName)) return
459
+
460
+ if (this.selectedTypes.has(typeName)) {
461
+ this.selectedTypes.delete(typeName)
462
+ } else {
463
+ this.selectedTypes.add(typeName)
464
+ }
465
+ this.selectedTypes = new Set(this.selectedTypes) // Trigger reactivity
466
+ this.requestUpdate()
467
+ }
468
+
469
+ /**
470
+ * Select all types
471
+ */
472
+ selectAllTypes() {
473
+ this.selectedTypes = new Set(this.availableTypes.map(t => t.name))
474
+ this.requestUpdate()
475
+ }
476
+
477
+ /**
478
+ * Deselect all types (except queryType and SCALAR types which are always required)
479
+ */
480
+ deselectAllTypes() {
481
+ // Always keep queryType and SCALAR types selected
482
+ const requiredTypes = this.availableTypes
483
+ .filter(t => t.name === this.queryTypeName || t.kind === 'SCALAR')
484
+ .map(t => t.name)
485
+ this.selectedTypes = new Set(requiredTypes)
486
+ this.requestUpdate()
487
+ }
488
+
489
+ /**
490
+ * Reset types to default selection based on backend type
491
+ */
492
+ resetToDefaults() {
493
+ const isGraphQL = this.dataSource instanceof GraphQL
494
+ if (!isGraphQL) return
495
+
496
+ const backendType = (this.dataSource as GraphQL).backendType || 'generic'
497
+ const defaultEnabled = GraphQL.getDefaultEnabledTypes(backendType, this.availableTypes, this.queryTypeName)
498
+ this.selectedTypes = new Set(defaultEnabled)
499
+ this.requestUpdate()
500
+ }
501
+
502
+ /**
503
+ * Get filtered types based on search query
504
+ * Selected types are always shown first
505
+ */
506
+ getFilteredTypes(): LightweightType[] {
507
+ let types = this.availableTypes
508
+ if (this.typeSearchQuery) {
509
+ const query = this.typeSearchQuery.toLowerCase()
510
+ types = types.filter(t => t.name.toLowerCase().includes(query))
511
+ }
512
+ // Sort: selected types first, then alphabetically within each group
513
+ return types.sort((a, b) => {
514
+ const aSelected = this.selectedTypes.has(a.name)
515
+ const bSelected = this.selectedTypes.has(b.name)
516
+ if (aSelected && !bSelected) return -1
517
+ if (!aSelected && bSelected) return 1
518
+ return a.name.localeCompare(b.name)
519
+ })
520
+ }
521
+
522
+ /**
523
+ * Go back to config phase
524
+ */
525
+ goBackToConfig() {
526
+ this.creationPhase = 'config'
527
+ this.availableTypes = []
528
+ this.selectedTypes = new Set()
529
+ this.queryTypeName = 'Query'
530
+ this.errorMessage = ''
531
+ this.requestUpdate()
532
+ }
533
+
534
+ /**
535
+ * Handle backend type change - updates selected types based on new backend defaults
536
+ */
537
+ onBackendTypeChange(newBackendType: GraphQLBackendType) {
538
+ if (!this.dataSource || !(this.dataSource instanceof GraphQL)) return
539
+
540
+ const ds = this.dataSource as GraphQL
541
+ ds.backendType = newBackendType
542
+
543
+ // Apply new default selection based on backend type
544
+ const defaultEnabled = GraphQL.getDefaultEnabledTypes(newBackendType, this.availableTypes, this.queryTypeName)
545
+ this.selectedTypes = new Set(defaultEnabled)
546
+
547
+ this.requestUpdate()
548
+ }
549
+
550
+ connectDataSource() {
551
+ if(!this.dataSource) throw new Error('No data source provided')
552
+
553
+ // Compute disabledTypes from selection (blacklist approach)
554
+ if (this.dataSource instanceof GraphQL && this.availableTypes.length > 0) {
555
+ const ds = this.dataSource as GraphQL
556
+ const allTypeNames = this.availableTypes.map(t => t.name)
557
+ const disabledTypes = allTypeNames.filter(name => !this.selectedTypes.has(name))
558
+
559
+ // Set disabled types for persistence (only blacklist, no whitelist)
560
+ ds.disabledTypes = disabledTypes
561
+ }
562
+
563
+ this.isLoading = true
564
+ this.errorMessage = ''
565
+ this.requestUpdate()
566
+
567
+ this.dataSource.connect().then(() => {
568
+ this.dispatchEvent(new CustomEvent('change'))
569
+ this.errorMessage = ''
570
+ this.connected = true
571
+ this.isLoading = false
572
+ this.requestUpdate()
573
+ }).catch((err: Error) => {
574
+ console.error('Data source connection error', { err })
575
+ this.errorMessage = err.message
576
+ this.connected = false
577
+ this.isLoading = false
578
+ this.requestUpdate()
579
+ })
580
+ }
581
+
582
+ static styles = [
583
+ css`
584
+ form {
585
+ display: flex;
586
+ flex-direction: column;
587
+ align-items: stretch;
588
+ }
589
+ .ds-field--large {
590
+ flex: 1 1 auto;
591
+ }
592
+ .ds-property__wrapper {
593
+ display: flex;
594
+ flex-direction: column;
595
+ width: 100%;
596
+ flex-wrap: wrap;
597
+ }
598
+ .ds-property__wrapper--horiz {
599
+ flex-direction: row;
600
+ }
601
+ .ds-property__wrapper--vert {
602
+ flex-direction: column;
603
+ }
604
+ .ds-status-section {
605
+ margin: 10px 0;
606
+ }
607
+ .ds-status-item {
608
+ display: flex;
609
+ align-items: center;
610
+ gap: 8px;
611
+ padding: 8px 12px;
612
+ border-radius: 4px;
613
+ font-size: 14px;
614
+ }
615
+ .ds-status-loading {
616
+ background-color: var(--gjs-main-dark-color);
617
+ color: var(--ds-highlight);
618
+ }
619
+ .ds-status-success {
620
+ background-color: var(--gjs-main-dark-color);
621
+ color: var(--ds-primary);
622
+ }
623
+ .ds-status-error {
624
+ background-color: var(--gjs-main-dark-color);
625
+ color: var(--ds-highlight);
626
+ }
627
+ .ds-actions {
628
+ display: flex;
629
+ gap: 10px;
630
+ justify-content: space-between;
631
+ align-items: center;
632
+ margin-top: 15px;
633
+ }
634
+ .ds-actions-left {
635
+ display: flex;
636
+ gap: 10px;
637
+ }
638
+ .ds-actions-right {
639
+ display: flex;
640
+ gap: 10px;
641
+ margin-left: auto;
642
+ }
643
+ .ds-no-resize {
644
+ flex: 0 0 auto;
645
+ }
646
+ button:disabled {
647
+ opacity: 0.6;
648
+ cursor: not-allowed;
649
+ }
650
+ /* Backend selector styles */
651
+ .ds-backend-selector {
652
+ margin-bottom: 15px;
653
+ }
654
+ .ds-backend-options {
655
+ display: flex;
656
+ gap: 10px;
657
+ border: none;
658
+ padding: 0;
659
+ margin: 0;
660
+ }
661
+ .ds-backend-option {
662
+ display: flex;
663
+ flex-direction: column;
664
+ align-items: center;
665
+ gap: 6px;
666
+ padding: 12px 16px;
667
+ border: 2px solid var(--gjs-main-dark-color);
668
+ border-radius: 8px;
669
+ cursor: pointer;
670
+ transition: all 0.2s ease;
671
+ background: var(--gjs-main-dark-color);
672
+ min-width: 80px;
673
+ }
674
+ .ds-backend-option:hover {
675
+ border-color: var(--gjs-light-color);
676
+ }
677
+ .ds-backend-option--selected {
678
+ border-color: var(--ds-primary);
679
+ background: rgba(var(--ds-primary-rgb, 76, 175, 80), 0.1);
680
+ }
681
+ .ds-backend-option input[type="radio"] {
682
+ position: absolute;
683
+ opacity: 0;
684
+ pointer-events: none;
685
+ }
686
+ .ds-backend-option svg {
687
+ width: 40px;
688
+ height: 40px;
689
+ }
690
+ .ds-backend-option span {
691
+ font-size: 11px;
692
+ color: var(--gjs-light-color);
693
+ text-align: center;
694
+ }
695
+ .ds-backend-option--beta {
696
+ position: relative;
697
+ }
698
+ .ds-backend-option--beta::after {
699
+ content: 'beta';
700
+ position: absolute;
701
+ top: 4px;
702
+ right: 4px;
703
+ padding: 1px 4px;
704
+ padding-top: 3px;
705
+ font-size: smaller;
706
+ font-weight: bold;
707
+ text-transform: uppercase;
708
+ background: var(--ds-primary);
709
+ color: var(--gjs-secondary-color);
710
+ border-radius: 3px;
711
+ line-height: 1.2;
712
+ }
713
+ /* Inline backend selector (compact for config phase) */
714
+ .ds-backend-selector--inline {
715
+ display: flex;
716
+ gap: 8px;
717
+ margin-top: 8px;
718
+ }
719
+ .ds-backend-option--compact {
720
+ flex-direction: row;
721
+ padding: 8px 14px;
722
+ min-width: auto;
723
+ gap: 8px;
724
+ }
725
+ .ds-backend-option--compact svg {
726
+ width: 20px;
727
+ height: 20px;
728
+ }
729
+ .ds-backend-option--compact span {
730
+ font-size: 13px;
731
+ }
732
+ /* Advanced options accordion */
733
+ .ds-advanced-details {
734
+ margin: 15px 0;
735
+ border: 1px solid var(--gjs-main-dark-color);
736
+ border-radius: 6px;
737
+ background: var(--gjs-main-dark-color);
738
+ }
739
+ .ds-advanced-summary {
740
+ padding: 12px 15px;
741
+ cursor: pointer;
742
+ font-size: 13px;
743
+ color: var(--gjs-light-color);
744
+ user-select: none;
745
+ display: flex;
746
+ align-items: center;
747
+ gap: 8px;
748
+ }
749
+ .ds-advanced-summary:hover {
750
+ color: inherit;
751
+ }
752
+ .ds-advanced-summary::before {
753
+ content: '▶';
754
+ font-size: 10px;
755
+ transition: transform 0.2s;
756
+ }
757
+ .ds-advanced-details[open] .ds-advanced-summary::before {
758
+ transform: rotate(90deg);
759
+ }
760
+ .ds-advanced-content {
761
+ padding: 0 15px 15px;
762
+ border-top: 1px solid var(--gjs-main-light-color);
763
+ }
764
+ .ds-hint {
765
+ display: block;
766
+ margin-top: 5px;
767
+ font-size: 11px;
768
+ color: var(--gjs-light-color);
769
+ }
770
+ .ds-help-text {
771
+ margin: 0 0 10px;
772
+ font-size: 11px;
773
+ color: var(--gjs-light-color);
774
+ font-style: italic;
775
+ }
776
+ .ds-types-count-inline {
777
+ font-size: 12px;
778
+ color: var(--gjs-light-color);
779
+ margin-left: auto;
780
+ }
781
+ /* Type selection styles */
782
+ .ds-types-header {
783
+ display: flex;
784
+ justify-content: space-between;
785
+ align-items: center;
786
+ margin-bottom: 10px;
787
+ flex-wrap: wrap;
788
+ gap: 10px;
789
+ }
790
+ .ds-types-search {
791
+ flex: 1;
792
+ min-width: 150px;
793
+ }
794
+ .ds-types-actions {
795
+ display: flex;
796
+ gap: 5px;
797
+ }
798
+ .ds-types-actions button {
799
+ padding: 4px 8px;
800
+ font-size: 12px;
801
+ }
802
+ .ds-types-list {
803
+ max-height: 300px;
804
+ overflow-y: auto;
805
+ border: 1px solid var(--gjs-main-dark-color);
806
+ border-radius: 4px;
807
+ padding: 8px;
808
+ background-color: var(--gjs-main-dark-color);
809
+ }
810
+ .ds-type-item {
811
+ display: flex;
812
+ align-items: center;
813
+ gap: 8px;
814
+ padding: 4px 8px;
815
+ border-radius: 3px;
816
+ cursor: pointer;
817
+ transition: background-color 0.15s;
818
+ }
819
+ .ds-type-item:hover {
820
+ background-color: var(--gjs-main-light-color);
821
+ }
822
+ .ds-type-item input[type="checkbox"] {
823
+ width: 16px;
824
+ height: 16px;
825
+ cursor: pointer;
826
+ }
827
+ .ds-type-item label {
828
+ cursor: pointer;
829
+ flex: 1;
830
+ font-family: monospace;
831
+ font-size: 13px;
832
+ }
833
+ .ds-type-kind {
834
+ font-size: 10px;
835
+ padding: 2px 5px;
836
+ border-radius: 3px;
837
+ background-color: var(--gjs-main-light-color);
838
+ color: var(--gjs-light-color);
839
+ text-transform: lowercase;
840
+ }
841
+ .ds-type-kind--scalar {
842
+ background-color: rgba(100, 200, 100, 0.2);
843
+ color: #4caf50;
844
+ }
845
+ .ds-type-kind--object {
846
+ background-color: rgba(100, 150, 255, 0.2);
847
+ color: #2196f3;
848
+ }
849
+ .ds-type-kind--interface {
850
+ background-color: rgba(200, 150, 255, 0.2);
851
+ color: #9c27b0;
852
+ }
853
+ .ds-type-kind--enum {
854
+ background-color: rgba(255, 200, 100, 0.2);
855
+ color: #ff9800;
856
+ }
857
+ .ds-type-kind--union {
858
+ background-color: rgba(255, 150, 150, 0.2);
859
+ color: #f44336;
860
+ }
861
+ .ds-type-kind--input_object {
862
+ background-color: rgba(150, 200, 200, 0.2);
863
+ color: #00bcd4;
864
+ }
865
+ .ds-types-count {
866
+ font-size: 12px;
867
+ color: var(--gjs-light-color);
868
+ margin-top: 8px;
869
+ }
870
+ `,
871
+ COMMON_STYLES,
872
+ ]
873
+
874
+ /**
875
+ * Render the configuration form (Phase 1)
876
+ */
877
+ renderConfigPhase(): TemplateResult {
878
+ if (!this.dataSource) throw new Error('No data source provided')
879
+ const dsHeaders: Ref<SettingsHeaders> = createRef()
880
+
881
+ return html`
882
+ <h3 class="ds-property__title">
883
+ ${this.dataSource.label || 'Unnamed'}
884
+ <small>${this.dataSource.readonly !== false ? ' (Read-only)' : ''}</small>
885
+ </h3>
886
+ <div class="ds-property__wrapper ds-property__wrapper--horiz">
887
+ <label class="ds-field">
888
+ <span>Label</span>
889
+ <input
890
+ type="text"
891
+ name="label"
892
+ value=${this.dataSource.label}
893
+ @input=${(e: Event) => {
894
+ if (this.dataSource) this.dataSource.label = (e.target as HTMLInputElement).value
895
+ this.requestUpdate()
896
+ }}
897
+ ?readonly=${this.dataSource.readonly !== false}
898
+ />
899
+ </label>
900
+ <label class="ds-field ds-field--large">
901
+ <span>URL</span>
902
+ <input
903
+ type="url"
904
+ name="url"
905
+ value=${this.dataSource.url}
906
+ @input=${(e: Event) => {
907
+ if (this.dataSource) {
908
+ this.dataSource.url = (e.target as HTMLInputElement).value
909
+ this.requestUpdate()
910
+ }
911
+ }}
912
+ ?readonly=${this.dataSource.readonly !== false}
913
+ />
914
+ </label>
915
+ <!-- ID field hidden - not needed by users, auto-generated -->
916
+ <label class="ds-field">
917
+ <span>Method</span>
918
+ <select
919
+ name="method"
920
+ @change=${(e: Event) => { if (this.dataSource) this.dataSource.method = (e.target as HTMLInputElement).value as 'GET' | 'POST' }}
921
+ ?readonly=${this.dataSource.readonly !== false}
922
+ ?disabled=${this.dataSource.readonly !== false}
923
+ >
924
+ <option value="POST" ?selected=${this.dataSource.method === 'POST'}>POST</option>
925
+ <option value="GET" ?selected=${this.dataSource.method === 'GET'}>GET</option>
926
+ </select>
927
+ </label>
928
+ </div>
929
+ <details class="ds-advanced-details">
930
+ <summary class="ds-advanced-summary">HTTP Headers</summary>
931
+ <div class="ds-advanced-content">
932
+ <ds-settings__headers
933
+ ${ref(dsHeaders)}
934
+ .headers=${this.dataSource.headers}
935
+ @change=${() => {
936
+ if (this.dataSource) this.dataSource.headers = dsHeaders.value?.headers || {}
937
+ dsHeaders.value?.requestUpdate()
938
+ }}
939
+ ?readonly=${this.dataSource.readonly !== false}
940
+ ></ds-settings__headers>
941
+ </div>
942
+ </details>
943
+
944
+ <div class="ds-field">
945
+ <div class="ds-status-section">
946
+ ${this.isLoading
947
+ ? html`<div class="ds-status-item ds-status-loading">${this.loadingIcon} Fetching types...</div>`
948
+ : this.errorMessage
949
+ ? html`<div class="ds-status-item ds-status-error">Error: ${this.errorMessage}</div>`
950
+ : ''
951
+ }
952
+ </div>
953
+ </div>
954
+
955
+ <div class="ds-field ds-actions">
956
+ <div class="ds-actions-right">
957
+ <button
958
+ type="button"
959
+ class="ds-btn-prim"
960
+ @click=${() => this.dispatchEvent(new CustomEvent('cancel'))}
961
+ >Cancel</button>
962
+ ${this.isEdit ? html`
963
+ <button
964
+ type="button"
965
+ class="ds-btn-prim"
966
+ ?disabled=${this.isLoading || !this.dataSource.url}
967
+ @click=${() => this.fetchTypeNames()}
968
+ >${this.isLoading ? 'Loading...' : 'Options'}</button>
969
+ <button
970
+ type="submit"
971
+ class="ds-btn-prim"
972
+ ?disabled=${this.isLoading || !this.dataSource.url}
973
+ >${this.isLoading ? 'Applying...' : 'Apply'}</button>
974
+ ` : html`
975
+ <button
976
+ type="submit"
977
+ class="ds-btn-prim"
978
+ ?disabled=${this.isLoading || !this.dataSource.url}
979
+ >${this.isLoading ? 'Fetching...' : 'Next'}</button>
980
+ `}
981
+ </div>
982
+ </div>
983
+ </div>
984
+ `
985
+ }
986
+
987
+ /**
988
+ * Render the type selection phase (Phase 2)
989
+ */
990
+ renderTypesPhase(): TemplateResult {
991
+ const filteredTypes = this.getFilteredTypes()
992
+ const selectedCount = this.selectedTypes.size
993
+ const totalCount = this.availableTypes.length
994
+ const isGraphQL = this.dataSource instanceof GraphQL
995
+ const backendType = isGraphQL ? (this.dataSource as GraphQL).backendType : 'generic'
996
+
997
+ return html`
998
+ <h3 class="ds-property__title">Data Source Options</h3>
999
+ <p class="ds-help-text">Select your backend type. Any GraphQL API is a supported, choose "GraphQL" for a generic connector.</p>
1000
+
1001
+ <div class="ds-backend-selector">
1002
+ <fieldset class="ds-backend-options">
1003
+ <label class="ds-backend-option ${backendType === 'generic' ? 'ds-backend-option--selected' : ''}">
1004
+ <input
1005
+ type="radio"
1006
+ name="backendType"
1007
+ value="generic"
1008
+ ?checked=${backendType === 'generic'}
1009
+ @change=${() => this.onBackendTypeChange('generic')}
1010
+ />
1011
+ <svg viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
1012
+ <path fill="#E535AB" d="M57.468 302.66l-14.376-8.3 160.15-277.38 14.376 8.3z"/>
1013
+ <path fill="#E535AB" d="M39.8 272.2h320.3v16.6H39.8z"/>
1014
+ <path fill="#E535AB" d="M206.348 374.026l-160.21-92.5 8.3-14.376 160.21 92.5zM345.522 132.947l-160.21-92.5 8.3-14.376 160.21 92.5z"/>
1015
+ <path fill="#E535AB" d="M54.482 132.883l-8.3-14.375 160.21-92.5 8.3 14.376z"/>
1016
+ <path fill="#E535AB" d="M342.568 302.663l-160.15-277.38 14.376-8.3 160.15 277.38zM52.5 107.5h16.6v185H52.5zM330.9 107.5h16.6v185h-16.6z"/>
1017
+ <path fill="#E535AB" d="M203.522 367l-7.25-12.558 139.34-80.45 7.25 12.557z"/>
1018
+ <path fill="#E535AB" d="M369.5 297.9c-9.6 16.7-31 22.4-47.7 12.8-16.7-9.6-22.4-31-12.8-47.7 9.6-16.7 31-22.4 47.7-12.8 16.8 9.7 22.5 31 12.8 47.7M90.9 137c-9.6 16.7-31 22.4-47.7 12.8-16.7-9.6-22.4-31-12.8-47.7 9.6-16.7 31-22.4 47.7-12.8 16.7 9.7 22.4 31 12.8 47.7M30.5 297.9c-9.6-16.7-3.9-38 12.8-47.7 16.7-9.6 38-3.9 47.7 12.8 9.6 16.7 3.9 38-12.8 47.7-16.8 9.6-38.1 3.9-47.7-12.8M309.1 137c-9.6-16.7-3.9-38 12.8-47.7 16.7-9.6 38-3.9 47.7 12.8 9.6 16.7 3.9 38-12.8 47.7-16.7 9.6-38.1 3.9-47.7-12.8M200 395.8c-19.3 0-34.9-15.6-34.9-34.9 0-19.3 15.6-34.9 34.9-34.9 19.3 0 34.9 15.6 34.9 34.9 0 19.2-15.6 34.9-34.9 34.9M200 74c-19.3 0-34.9-15.6-34.9-34.9 0-19.3 15.6-34.9 34.9-34.9 19.3 0 34.9 15.6 34.9 34.9 0 19.3-15.6 34.9-34.9 34.9"/>
1019
+ </svg>
1020
+ <span>GraphQL</span>
1021
+ </label>
1022
+ <label class="ds-backend-option ds-backend-option--beta ${backendType === 'wordpress' ? 'ds-backend-option--selected' : ''}">
1023
+ <input
1024
+ type="radio"
1025
+ name="backendType"
1026
+ value="wordpress"
1027
+ ?checked=${backendType === 'wordpress'}
1028
+ @change=${() => this.onBackendTypeChange('wordpress')}
1029
+ />
1030
+ <svg viewBox="0 0 122.52 122.523" xmlns="http://www.w3.org/2000/svg">
1031
+ <g fill="#21759b">
1032
+ <path d="m8.708 61.26c0 20.802 12.089 38.779 29.619 47.298l-25.069-68.686c-2.916 6.536-4.55 13.769-4.55 21.388z"/>
1033
+ <path d="m96.74 58.608c0-6.495-2.333-10.993-4.334-14.494-2.664-4.329-5.161-7.995-5.161-12.324 0-4.831 3.664-9.328 8.825-9.328.233 0 .454.029.681.042-9.35-8.566-21.807-13.796-35.489-13.796-18.36 0-34.513 9.42-43.91 23.688 1.233.037 2.395.063 3.382.063 5.497 0 14.006-.667 14.006-.667 2.833-.167 3.167 3.994.337 4.329 0 0-2.847.335-6.015.501l19.138 56.925 11.501-34.493-8.188-22.434c-2.83-.166-5.511-.501-5.511-.501-2.832-.166-2.5-4.496.332-4.329 0 0 8.679.667 13.843.667 5.496 0 14.006-.667 14.006-.667 2.835-.167 3.168 3.994.337 4.329 0 0-2.853.335-6.015.501l18.992 56.494 5.242-17.517c2.272-7.269 4.001-12.49 4.001-16.989z"/>
1034
+ <path d="m62.184 65.857-15.768 45.819c4.708 1.384 9.687 2.141 14.846 2.141 6.12 0 11.989-1.058 17.452-2.979-.14-.225-.269-.464-.374-.724z"/>
1035
+ <path d="m107.376 36.046c.226 1.674.354 3.471.354 5.404 0 5.333-.996 11.328-3.996 18.824l-16.053 46.413c15.624-9.111 26.133-26.038 26.133-45.426.001-9.137-2.333-17.729-6.438-25.215z"/>
1036
+ <path d="m61.262 0c-33.779 0-61.262 27.481-61.262 61.26 0 33.783 27.483 61.263 61.262 61.263 33.778 0 61.265-27.48 61.265-61.263-.001-33.779-27.487-61.26-61.265-61.26zm0 119.715c-32.23 0-58.453-26.223-58.453-58.455 0-32.23 26.222-58.451 58.453-58.451 32.229 0 58.45 26.221 58.45 58.451 0 32.232-26.221 58.455-58.45 58.455z"/>
1037
+ </g>
1038
+ </svg>
1039
+ <span>WordPress</span>
1040
+ </label>
1041
+ <label class="ds-backend-option ds-backend-option--beta ${backendType === 'gitlab' ? 'ds-backend-option--selected' : ''}">
1042
+ <input
1043
+ type="radio"
1044
+ name="backendType"
1045
+ value="gitlab"
1046
+ ?checked=${backendType === 'gitlab'}
1047
+ @change=${() => this.onBackendTypeChange('gitlab')}
1048
+ />
1049
+ <svg viewBox="0 0 380 380" xmlns="http://www.w3.org/2000/svg">
1050
+ <path fill="#e24329" d="M190 362.6 256.3 158.8H123.7z"/>
1051
+ <path fill="#fc6d26" d="M190 362.6 123.7 158.8H15.3z"/>
1052
+ <path fill="#fca326" d="m15.3 158.8-13.5 41.6c-1.2 3.8.1 7.9 3.3 10.3L190 362.6z"/>
1053
+ <path fill="#e24329" d="M15.3 158.8h108.4L79.8 24.1c-1.4-4.4-7.6-4.4-9 0z"/>
1054
+ <path fill="#fc6d26" d="m190 362.6 66.3-203.8h108.4z"/>
1055
+ <path fill="#fca326" d="m364.7 158.8 13.5 41.6c1.2 3.8-.1 7.9-3.3 10.3L190 362.6z"/>
1056
+ <path fill="#e24329" d="M364.7 158.8H256.3l43.9-134.7c1.4-4.4 7.6-4.4 9 0z"/>
1057
+ </svg>
1058
+ <span>GitLab</span>
1059
+ </label>
1060
+ <label class="ds-backend-option ds-backend-option--beta ${backendType === 'strapi' ? 'ds-backend-option--selected' : ''}">
1061
+ <input
1062
+ type="radio"
1063
+ name="backendType"
1064
+ value="strapi"
1065
+ ?checked=${backendType === 'strapi'}
1066
+ @change=${() => this.onBackendTypeChange('strapi')}
1067
+ />
1068
+ <svg viewBox=".24262095 .26549587 243.32256626 243.58072911" xmlns="http://www.w3.org/2000/svg">
1069
+ <g fill="#8e75ff" fill-rule="evenodd">
1070
+ <path d="m161.893 165.833v-78.73a5.077 5.077 0 0 0 -5.077-5.076h-78.638v-81.267h159.815a5.077 5.077 0 0 1 5.078 5.077v159.996z"/>
1071
+ <path d="m78.178.76v81.267h-75.054a2.539 2.539 0 0 1 -1.796-4.333zm83.715 240.206v-75.133h81.178l-76.844 76.927a2.539 2.539 0 0 1 -4.334-1.794zm-83.715-158.939h81.176a2.539 2.539 0 0 1 2.539 2.538v81.268h-78.638a5.077 5.077 0 0 1 -5.077-5.077z" opacity=".405"/>
1072
+ </g>
1073
+ </svg>
1074
+ <span>Strapi</span>
1075
+ </label>
1076
+ <label class="ds-backend-option ds-backend-option--beta ${backendType === 'supabase' ? 'ds-backend-option--selected' : ''}">
1077
+ <input
1078
+ type="radio"
1079
+ name="backendType"
1080
+ value="supabase"
1081
+ ?checked=${backendType === 'supabase'}
1082
+ @change=${() => this.onBackendTypeChange('supabase')}
1083
+ />
1084
+ <svg viewBox="0 0 109 113" xmlns="http://www.w3.org/2000/svg">
1085
+ <path fill="url(#supabase-a)" d="M63.7 110.3c-2.5 3.1-7.6 1.4-7.7-2.6l-1.5-66.2h50.2c9.1 0 14.1 10.5 8.4 17.6L63.7 110.3Z"/>
1086
+ <path fill="url(#supabase-b)" fill-opacity=".2" d="M63.7 110.3c-2.5 3.1-7.6 1.4-7.7-2.6l-1.5-66.2h50.2c9.1 0 14.1 10.5 8.4 17.6L63.7 110.3Z"/>
1087
+ <path fill="#3ECF8E" d="M45.3 2.7c2.5-3.1 7.6-1.4 7.7 2.6l.7 66.2H4.4c-9.1 0-14-10.5-8.3-17.6L45.3 2.7Z"/>
1088
+ <defs>
1089
+ <linearGradient id="supabase-a" x1="53.97" x2="94.12" y1="54.97" y2="71.95" gradientUnits="userSpaceOnUse">
1090
+ <stop stop-color="#249361"/><stop offset="1" stop-color="#3ECF8E"/>
1091
+ </linearGradient>
1092
+ <linearGradient id="supabase-b" x1="36.16" x2="54.48" y1="30.58" y2="65.72" gradientUnits="userSpaceOnUse">
1093
+ <stop/><stop offset="1" stop-opacity="0"/>
1094
+ </linearGradient>
1095
+ </defs>
1096
+ </svg>
1097
+ <span>Supabase</span>
1098
+ </label>
1099
+ </fieldset>
1100
+ </div>
1101
+
1102
+ <!-- Advanced: Manual type selection -->
1103
+ <details class="ds-advanced-details">
1104
+ <summary class="ds-advanced-summary">
1105
+ Show / hide fields in the expressions
1106
+ <span class="ds-types-count-inline">(${selectedCount}/${totalCount})</span>
1107
+ </summary>
1108
+ <div class="ds-advanced-content">
1109
+ <p class="ds-help-text"><br>Uncheck types you don't want to see in your expressions.</p>
1110
+ <div class="ds-types-header">
1111
+ <input
1112
+ type="text"
1113
+ class="ds-types-search"
1114
+ placeholder="Search types..."
1115
+ .value=${this.typeSearchQuery}
1116
+ @input=${(e: Event) => {
1117
+ this.typeSearchQuery = (e.target as HTMLInputElement).value
1118
+ this.requestUpdate()
1119
+ }}
1120
+ />
1121
+ <div class="ds-types-actions">
1122
+ <button type="button" class="ds-btn-prim" @click=${() => this.selectAllTypes()}>Select All</button>
1123
+ <button type="button" class="ds-btn-prim" @click=${() => this.deselectAllTypes()}>Deselect All</button>
1124
+ <button type="button" class="ds-btn-prim" @click=${() => this.resetToDefaults()}>Reset to Defaults</button>
1125
+ </div>
1126
+ </div>
1127
+
1128
+ <div class="ds-types-list">
1129
+ ${filteredTypes.map(type => {
1130
+ const isRequired = this.isRequiredType(type.name)
1131
+ return html`
1132
+ <div class="ds-type-item" @click=${() => this.toggleType(type.name)}>
1133
+ <input
1134
+ type="checkbox"
1135
+ .checked=${this.selectedTypes.has(type.name)}
1136
+ ?disabled=${isRequired}
1137
+ @click=${(e: Event) => e.stopPropagation()}
1138
+ @change=${() => this.toggleType(type.name)}
1139
+ />
1140
+ <label>${type.name}</label>
1141
+ <span class="ds-type-kind ds-type-kind--${type.kind.toLowerCase()}">${type.kind}</span>
1142
+ </div>
1143
+ `})}
1144
+ ${filteredTypes.length === 0 ? html`
1145
+ <div style="padding: 20px; text-align: center; color: var(--gjs-light-color);">
1146
+ No types match "${this.typeSearchQuery}"
1147
+ </div>
1148
+ ` : ''}
1149
+ </div>
1150
+
1151
+ <div class="ds-types-count">
1152
+ ${selectedCount} of ${totalCount} types selected
1153
+ ${this.typeSearchQuery ? ` (showing ${filteredTypes.length} matching "${this.typeSearchQuery}")` : ''}
1154
+ </div>
1155
+ </div>
1156
+ </details>
1157
+
1158
+ <div class="ds-field">
1159
+ <div class="ds-status-section">
1160
+ ${this.isLoading
1161
+ ? html`<div class="ds-status-item ds-status-loading">${this.loadingIcon} Connecting...</div>`
1162
+ : this.errorMessage
1163
+ ? html`<div class="ds-status-item ds-status-error">Error: ${this.errorMessage}</div>`
1164
+ : this.connected
1165
+ ? html`<div class="ds-status-item ds-status-success">${this.connectedIcon} Connection successful</div>`
1166
+ : ''
1167
+ }
1168
+ </div>
1169
+ </div>
1170
+
1171
+ <div class="ds-field ds-actions">
1172
+ <div class="ds-actions-left">
1173
+ <button
1174
+ type="button"
1175
+ class="ds-btn-prim"
1176
+ @click=${() => this.goBackToConfig()}
1177
+ ?disabled=${this.isLoading}
1178
+ >Back</button>
1179
+ </div>
1180
+ <div class="ds-actions-right">
1181
+ <button
1182
+ type="button"
1183
+ class="ds-btn-prim"
1184
+ @click=${() => this.dispatchEvent(new CustomEvent('cancel'))}
1185
+ >Cancel</button>
1186
+ <button
1187
+ type="submit"
1188
+ class="ds-btn-prim"
1189
+ ?disabled=${this.isLoading || this.selectedTypes.size === 0}
1190
+ >${this.isLoading ? 'Connecting...' : 'Apply'}</button>
1191
+ </div>
1192
+ </div>
1193
+ `
1194
+ }
1195
+
1196
+ protected render() {
1197
+ if (!this.dataSource) throw new Error('No data source provided')
1198
+
1199
+ return html`
1200
+ <form
1201
+ ?readonly=${this.dataSource.readonly !== false}
1202
+ @submit=${(e: Event) => {
1203
+ e.preventDefault()
1204
+ e.stopImmediatePropagation()
1205
+ // Handle form submission based on current phase
1206
+ if (this.creationPhase === 'config') {
1207
+ if (this.isEdit) {
1208
+ this.connectDataSource()
1209
+ } else {
1210
+ this.fetchTypeNames()
1211
+ }
1212
+ } else {
1213
+ this.connectDataSource()
1214
+ }
1215
+ }}
1216
+ >
1217
+ ${this.creationPhase === 'config' ? this.renderConfigPhase() : this.renderTypesPhase()}
1218
+ </form>
1219
+ `
1220
+ }
1221
+ }
1222
+
1223
+ if(!customElements.get('ds-settings__data-source')) {
1224
+ customElements.define('ds-settings__data-source', SettingsDataSource)
1225
+ }
1226
+
1227
+ /**
1228
+ * Compact card component for displaying data source summary
1229
+ */
1230
+ class DataSourceCard extends LitElement {
1231
+ @property({ type: Object })
1232
+ dataSource: IDataSource | null
1233
+
1234
+ @property({ type: Boolean })
1235
+ isTestingConnection: boolean = false
1236
+
1237
+ private loadingIcon = html`<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="12" r="3"><animate attributeName="r" values="3;8;3" dur="1s" repeatCount="indefinite"/><animate attributeName="opacity" values="1;0.3;1" dur="1s" repeatCount="indefinite"/></circle></svg>`
1238
+ // private connectedIcon = html`<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>`
1239
+ // private errorIcon = html`<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/></svg>`
1240
+
1241
+ constructor() {
1242
+ super()
1243
+ this.dataSource = null
1244
+ this.isTestingConnection = false
1245
+ }
1246
+
1247
+ static styles = [
1248
+ css`
1249
+ .ds-card {
1250
+ background-color: var(--gjs-main-dark-color);
1251
+ border: 1px solid var(--ds-button-bg);
1252
+ border-radius: 6px;
1253
+ padding: 16px;
1254
+ margin: 8px 0;
1255
+ display: flex;
1256
+ justify-content: space-between;
1257
+ align-items: center;
1258
+ transition: border-color 0.2s ease, background-color 0.2s ease;
1259
+ cursor: pointer;
1260
+ }
1261
+ .ds-card:hover {
1262
+ border-color: var(--ds-highlight);
1263
+ background-color: rgba(255, 255, 255, 0.02);
1264
+ }
1265
+ .ds-card__info {
1266
+ flex: 1;
1267
+ min-width: 0;
1268
+ }
1269
+ .ds-card__title {
1270
+ font-weight: 500;
1271
+ margin: 0 0 4px 0;
1272
+ color: inherit;
1273
+ display: flex;
1274
+ align-items: flex-end;
1275
+ }
1276
+ .ds-card__url {
1277
+ font-size: 12px;
1278
+ color: var(--gjs-light-color);
1279
+ margin: 0 0 4px 0;
1280
+ word-break: break-all;
1281
+ }
1282
+ .ds-card__logo {
1283
+ width: 18px;
1284
+ height: 18px;
1285
+ flex-shrink: 0;
1286
+ margin-right: 8px;
1287
+ vertical-align: middle;
1288
+ }
1289
+ .ds-card__backend {
1290
+ display: inline-block;
1291
+ font-size: 11px;
1292
+ font-weight: normal;
1293
+ color: var(--gjs-light-color);
1294
+ background-color: var(--gjs-main-light-color);
1295
+ padding: 2px 6px;
1296
+ border-radius: 3px;
1297
+ margin-left: 8px;
1298
+ vertical-align: middle;
1299
+ }
1300
+ .ds-card__status {
1301
+ display: flex;
1302
+ align-items: center;
1303
+ gap: 6px;
1304
+ font-size: 12px;
1305
+ }
1306
+ .ds-card__status--connected {
1307
+ color: var(--ds-primary);
1308
+ }
1309
+ .ds-card__status--loading {
1310
+ color: var(--ds-highlight);
1311
+ }
1312
+ .ds-card__status--error {
1313
+ color: var(--ds-highlight);
1314
+ }
1315
+ .ds-card__actions {
1316
+ display: flex;
1317
+ gap: 4px;
1318
+ flex-shrink: 0;
1319
+ opacity: 0.6;
1320
+ transition: opacity 0.2s ease;
1321
+ }
1322
+ .ds-card:hover .ds-card__actions {
1323
+ opacity: 1;
1324
+ }
1325
+ .ds-card__btn {
1326
+ padding: 4px 8px;
1327
+ border: none;
1328
+ border-radius: 3px;
1329
+ cursor: pointer;
1330
+ font-size: 11px;
1331
+ background-color: transparent;
1332
+ color: var(--gjs-light-color);
1333
+ transition: background-color 0.2s ease, color 0.2s ease;
1334
+ }
1335
+ .ds-card__btn:hover {
1336
+ background-color: var(--gjs-main-light-color);
1337
+ color: inherit;
1338
+ }
1339
+ .ds-card__btn--danger {
1340
+ color: var(--ds-highlight);
1341
+ }
1342
+ .ds-card__btn--danger:hover {
1343
+ background-color: rgba(255, 0, 0, 0.1);
1344
+ }
1345
+ .ds-card__btn:disabled {
1346
+ opacity: 0.6;
1347
+ cursor: not-allowed;
1348
+ }
1349
+ `,
1350
+ COMMON_STYLES,
1351
+ ]
1352
+
1353
+ private graphqlLogo = html`<svg class="ds-card__logo" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg"><path fill="#E535AB" d="M57.468 302.66l-14.376-8.3 160.15-277.38 14.376 8.3z"/><path fill="#E535AB" d="M39.8 272.2h320.3v16.6H39.8z"/><path fill="#E535AB" d="M206.348 374.026l-160.21-92.5 8.3-14.376 160.21 92.5zM345.522 132.947l-160.21-92.5 8.3-14.376 160.21 92.5z"/><path fill="#E535AB" d="M54.482 132.883l-8.3-14.375 160.21-92.5 8.3 14.376z"/><path fill="#E535AB" d="M342.568 302.663l-160.15-277.38 14.376-8.3 160.15 277.38zM52.5 107.5h16.6v185H52.5zM330.9 107.5h16.6v185h-16.6z"/><path fill="#E535AB" d="M203.522 367l-7.25-12.558 139.34-80.45 7.25 12.557z"/><path fill="#E535AB" d="M369.5 297.9c-9.6 16.7-31 22.4-47.7 12.8-16.7-9.6-22.4-31-12.8-47.7 9.6-16.7 31-22.4 47.7-12.8 16.8 9.7 22.5 31 12.8 47.7M90.9 137c-9.6 16.7-31 22.4-47.7 12.8-16.7-9.6-22.4-31-12.8-47.7 9.6-16.7 31-22.4 47.7-12.8 16.7 9.7 22.4 31 12.8 47.7M30.5 297.9c-9.6-16.7-3.9-38 12.8-47.7 16.7-9.6 38-3.9 47.7 12.8 9.6 16.7 3.9 38-12.8 47.7-16.8 9.6-38.1 3.9-47.7-12.8M309.1 137c-9.6-16.7-3.9-38 12.8-47.7 16.7-9.6 38-3.9 47.7 12.8 9.6 16.7 3.9 38-12.8 47.7-16.7 9.6-38.1 3.9-47.7-12.8M200 395.8c-19.3 0-34.9-15.6-34.9-34.9 0-19.3 15.6-34.9 34.9-34.9 19.3 0 34.9 15.6 34.9 34.9 0 19.2-15.6 34.9-34.9 34.9M200 74c-19.3 0-34.9-15.6-34.9-34.9 0-19.3 15.6-34.9 34.9-34.9 19.3 0 34.9 15.6 34.9 34.9 0 19.3-15.6 34.9-34.9 34.9"/></svg>`
1354
+ private wordpressLogo = html`<svg class="ds-card__logo" viewBox="0 0 122.52 122.523" xmlns="http://www.w3.org/2000/svg"><g fill="#21759b"><path d="m8.708 61.26c0 20.802 12.089 38.779 29.619 47.298l-25.069-68.686c-2.916 6.536-4.55 13.769-4.55 21.388z"/><path d="m96.74 58.608c0-6.495-2.333-10.993-4.334-14.494-2.664-4.329-5.161-7.995-5.161-12.324 0-4.831 3.664-9.328 8.825-9.328.233 0 .454.029.681.042-9.35-8.566-21.807-13.796-35.489-13.796-18.36 0-34.513 9.42-43.91 23.688 1.233.037 2.395.063 3.382.063 5.497 0 14.006-.667 14.006-.667 2.833-.167 3.167 3.994.337 4.329 0 0-2.847.335-6.015.501l19.138 56.925 11.501-34.493-8.188-22.434c-2.83-.166-5.511-.501-5.511-.501-2.832-.166-2.5-4.496.332-4.329 0 0 8.679.667 13.843.667 5.496 0 14.006-.667 14.006-.667 2.835-.167 3.168 3.994.337 4.329 0 0-2.853.335-6.015.501l18.992 56.494 5.242-17.517c2.272-7.269 4.001-12.49 4.001-16.989z"/><path d="m62.184 65.857-15.768 45.819c4.708 1.384 9.687 2.141 14.846 2.141 6.12 0 11.989-1.058 17.452-2.979-.14-.225-.269-.464-.374-.724z"/><path d="m107.376 36.046c.226 1.674.354 3.471.354 5.404 0 5.333-.996 11.328-3.996 18.824l-16.053 46.413c15.624-9.111 26.133-26.038 26.133-45.426.001-9.137-2.333-17.729-6.438-25.215z"/><path d="m61.262 0c-33.779 0-61.262 27.481-61.262 61.26 0 33.783 27.483 61.263 61.262 61.263 33.778 0 61.265-27.48 61.265-61.263-.001-33.779-27.487-61.26-61.265-61.26zm0 119.715c-32.23 0-58.453-26.223-58.453-58.455 0-32.23 26.222-58.451 58.453-58.451 32.229 0 58.45 26.221 58.45 58.451 0 32.232-26.221 58.455-58.45 58.455z"/></g></svg>`
1355
+ private gitlabLogo = html`<svg class="ds-card__logo" viewBox="0 0 380 380" xmlns="http://www.w3.org/2000/svg"><path fill="#e24329" d="M190 362.6 256.3 158.8H123.7z"/><path fill="#fc6d26" d="M190 362.6 123.7 158.8H15.3z"/><path fill="#fca326" d="m15.3 158.8-13.5 41.6c-1.2 3.8.1 7.9 3.3 10.3L190 362.6z"/><path fill="#e24329" d="M15.3 158.8h108.4L79.8 24.1c-1.4-4.4-7.6-4.4-9 0z"/><path fill="#fc6d26" d="m190 362.6 66.3-203.8h108.4z"/><path fill="#fca326" d="m364.7 158.8 13.5 41.6c1.2 3.8-.1 7.9-3.3 10.3L190 362.6z"/><path fill="#e24329" d="M364.7 158.8H256.3l43.9-134.7c1.4-4.4 7.6-4.4 9 0z"/></svg>`
1356
+ private strapiLogo = html`<svg class="ds-card__logo" viewBox=".24262095 .26549587 243.32256626 243.58072911" xmlns="http://www.w3.org/2000/svg"><g fill="#8e75ff" fill-rule="evenodd"><path d="m161.893 165.833v-78.73a5.077 5.077 0 0 0 -5.077-5.076h-78.638v-81.267h159.815a5.077 5.077 0 0 1 5.078 5.077v159.996z"/><path d="m78.178.76v81.267h-75.054a2.539 2.539 0 0 1 -1.796-4.333zm83.715 240.206v-75.133h81.178l-76.844 76.927a2.539 2.539 0 0 1 -4.334-1.794zm-83.715-158.939h81.176a2.539 2.539 0 0 1 2.539 2.538v81.268h-78.638a5.077 5.077 0 0 1 -5.077-5.077z" opacity=".405"/></g></svg>`
1357
+ private supabaseLogo = html`<svg class="ds-card__logo" viewBox="0 0 109 113" xmlns="http://www.w3.org/2000/svg"><path fill="#3ECF8E" d="M63.7 110.3c-2.5 3.1-7.6 1.4-7.7-2.6l-1.5-66.2h50.2c9.1 0 14.1 10.5 8.4 17.6L63.7 110.3Z"/><path fill="#3ECF8E" d="M45.3 2.7c2.5-3.1 7.6-1.4 7.7 2.6l.7 66.2H4.4c-9.1 0-14-10.5-8.3-17.6L45.3 2.7Z"/></svg>`
1358
+
1359
+ protected render() {
1360
+ if (!this.dataSource) return html``
1361
+
1362
+ const isConnected = this.dataSource.isConnected()
1363
+ const isGraphQL = this.dataSource instanceof GraphQL
1364
+ const backendType = isGraphQL ? (this.dataSource as GraphQL).backendType : null
1365
+ const backendLogo = backendType === 'wordpress' ? this.wordpressLogo
1366
+ : backendType === 'gitlab' ? this.gitlabLogo
1367
+ : backendType === 'strapi' ? this.strapiLogo
1368
+ : backendType === 'supabase' ? this.supabaseLogo
1369
+ : backendType === 'generic' ? this.graphqlLogo
1370
+ : null
1371
+
1372
+ return html`
1373
+ <div class="ds-card" @click=${() => this.dispatchEvent(new CustomEvent('edit', { detail: this.dataSource }))}>
1374
+ <div class="ds-card__info">
1375
+ <h4 class="ds-card__title">
1376
+ ${backendLogo}
1377
+ ${this.dataSource.label || 'Unnamed Data Source'}
1378
+ </h4>
1379
+ <p class="ds-card__url">${this.dataSource.url || 'No URL configured'}</p>
1380
+ ${this.isTestingConnection ? html`
1381
+ <div class="ds-card__status ds-card__status--loading">
1382
+ ${this.loadingIcon} Testing...
1383
+ </div>
1384
+ ` : isConnected ? html`
1385
+ <div class="ds-card__status ds-card__status--connected">
1386
+ Connected
1387
+ </div>
1388
+ ` : html`
1389
+ <div class="ds-card__status ds-card__status--error">
1390
+ Not connected
1391
+ </div>
1392
+ `}
1393
+ </div>
1394
+ <div class="ds-card__actions">
1395
+ <button
1396
+ class="ds-card__btn"
1397
+ @click=${(e: Event) => { e.stopPropagation(); this.dispatchEvent(new CustomEvent('test', { detail: this.dataSource })) }}
1398
+ ?disabled=${this.isTestingConnection}
1399
+ >
1400
+ ${this.isTestingConnection ? 'Testing...' : 'Test'}
1401
+ </button>
1402
+ ${this.dataSource.readonly !== false ? '' : html`
1403
+ <button
1404
+ class="ds-card__btn ds-card__btn--danger"
1405
+ @click=${(e: Event) => {
1406
+ e.stopPropagation()
1407
+ if (confirm(`Are you sure you want to delete the data source "${this.dataSource!.label || this.dataSource!.id}"?`)) {
1408
+ this.dispatchEvent(new CustomEvent('delete', { detail: this.dataSource }))
1409
+ }
1410
+ }}
1411
+ ?disabled=${this.isTestingConnection}
1412
+ >
1413
+ Delete
1414
+ </button>
1415
+ `}
1416
+ </div>
1417
+ </div>
1418
+ `
1419
+ }
1420
+ }
1421
+
1422
+ if(!customElements.get('ds-data-source-card')) {
1423
+ customElements.define('ds-data-source-card', DataSourceCard)
1424
+ }
1425
+
1426
+ class SettingsHeaders extends LitElement {
1427
+ @property({ type: Array })
1428
+ headers: Record<string, string>
1429
+
1430
+ @property({ type: Boolean })
1431
+ readonly: boolean
1432
+
1433
+ static styles = [
1434
+ css`
1435
+ fieldset {
1436
+ display: block;
1437
+ border: none;
1438
+ padding: 0;
1439
+ }
1440
+ ul {
1441
+ list-style: none;
1442
+ padding: 0;
1443
+ }
1444
+ ul > li {
1445
+ display: flex;
1446
+ align-items: center;
1447
+ justify-content: space-between;
1448
+ }
1449
+ ul > li > label {
1450
+ flex: 1 1 auto;
1451
+ }
1452
+ ul > li > button {
1453
+ margin: 10px;
1454
+ }
1455
+ `,
1456
+ COMMON_STYLES,
1457
+ ]
1458
+
1459
+ constructor() {
1460
+ super()
1461
+ this.headers = {}
1462
+ this.readonly = false
1463
+ }
1464
+
1465
+ connectedCallback() {
1466
+ super.connectedCallback()
1467
+ }
1468
+
1469
+ protected render() {
1470
+ return html`
1471
+ <div class="ds-field">
1472
+ <fieldset>
1473
+ ${this.readonly ? '' : html`
1474
+ <button
1475
+ type="button"
1476
+ class="ds-btn-prim"
1477
+ @click=${() => {
1478
+ // Default name and value
1479
+ let name = 'Authorization'
1480
+ let value = 'Bearer XXXXXX'
1481
+ // Make sure the header name is unique
1482
+ // Add a number if the header already exists
1483
+ let i = 0
1484
+ while(typeof this.headers[name] !== 'undefined') {
1485
+ i++
1486
+ name = `Header ${i}`
1487
+ value = ''
1488
+ }
1489
+ // Add the header
1490
+ this.headers = {
1491
+ ...this.headers,
1492
+ [name]: value,
1493
+ }
1494
+ this.dispatchEvent(new CustomEvent('change'))
1495
+ }}
1496
+ >Add a header</button>
1497
+ `}
1498
+ <ul>
1499
+ ${Object.entries(this.headers).map(([name, value]) => html`
1500
+ <li>
1501
+ <label class="ds-field">
1502
+ <span>Name</span>
1503
+ <input
1504
+ type="text"
1505
+ value=${name}
1506
+ name=${`header-key-${encodeURI(name)}`}
1507
+ @change=${(e: Event) => {
1508
+ const target = e.target as HTMLInputElement
1509
+ if(!target.value) return
1510
+ if (typeof this.headers[name] !== 'undefined') delete this.headers[name]
1511
+ this.headers[target.value] = value
1512
+ this.dispatchEvent(new CustomEvent('change'))
1513
+ }}
1514
+ />
1515
+ </label>
1516
+ <label class="ds-field">
1517
+ <span>Value</span>
1518
+ <input
1519
+ type="text"
1520
+ value=${value}
1521
+ name=${`header-value-${encodeURI(value)}`}
1522
+ @change=${(e: Event) => {
1523
+ const target = e.target as HTMLInputElement
1524
+ this.headers[name] = target.value
1525
+ this.dispatchEvent(new CustomEvent('change'))
1526
+ }}
1527
+ />
1528
+ </label>
1529
+ ${this.readonly ? '' : html`
1530
+ <button
1531
+ type="button"
1532
+ class="ds-btn-prim"
1533
+ @click=${() => {
1534
+ if (typeof this.headers[name] !== 'undefined') delete this.headers[name]
1535
+ this.dispatchEvent(new CustomEvent('change'))
1536
+ }}
1537
+ .disabled=${this.readonly}
1538
+ >Delete</button>
1539
+ `}
1540
+ </li>
1541
+ `)}
1542
+ </ul>
1543
+ </fieldset>
1544
+ </div>
1545
+ `
1546
+ }
1547
+ }
1548
+
1549
+ if(!customElements.get('ds-settings__headers')) {
1550
+ customElements.define('ds-settings__headers', SettingsHeaders)
1551
+ }