@powerhousedao/contributor-billing 0.1.39 → 0.1.41

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 (260) hide show
  1. package/dist/document-models/index.d.ts +1 -0
  2. package/dist/document-models/index.d.ts.map +1 -1
  3. package/dist/document-models/index.js +1 -0
  4. package/dist/document-models/resource-template/actions.d.ts +32 -0
  5. package/dist/document-models/resource-template/actions.d.ts.map +1 -0
  6. package/dist/document-models/resource-template/actions.js +12 -0
  7. package/dist/document-models/resource-template/gen/actions.d.ts +14 -0
  8. package/dist/document-models/resource-template/gen/actions.d.ts.map +1 -0
  9. package/dist/document-models/resource-template/gen/actions.js +6 -0
  10. package/dist/document-models/resource-template/gen/audience-management/actions.d.ts +12 -0
  11. package/dist/document-models/resource-template/gen/audience-management/actions.d.ts.map +1 -0
  12. package/dist/document-models/resource-template/gen/audience-management/actions.js +1 -0
  13. package/dist/document-models/resource-template/gen/audience-management/creators.d.ts +5 -0
  14. package/dist/document-models/resource-template/gen/audience-management/creators.d.ts.map +1 -0
  15. package/dist/document-models/resource-template/gen/audience-management/creators.js +4 -0
  16. package/dist/document-models/resource-template/gen/audience-management/error.d.ts +21 -0
  17. package/dist/document-models/resource-template/gen/audience-management/error.d.ts.map +1 -0
  18. package/dist/document-models/resource-template/gen/audience-management/error.js +20 -0
  19. package/dist/document-models/resource-template/gen/audience-management/operations.d.ts +8 -0
  20. package/dist/document-models/resource-template/gen/audience-management/operations.d.ts.map +1 -0
  21. package/dist/document-models/resource-template/gen/audience-management/operations.js +3 -0
  22. package/dist/document-models/resource-template/gen/creators.d.ts +13 -0
  23. package/dist/document-models/resource-template/gen/creators.d.ts.map +1 -0
  24. package/dist/document-models/resource-template/gen/creators.js +12 -0
  25. package/dist/document-models/resource-template/gen/document-model.d.ts +3 -0
  26. package/dist/document-models/resource-template/gen/document-model.d.ts.map +1 -0
  27. package/dist/document-models/resource-template/gen/document-model.js +410 -0
  28. package/dist/document-models/resource-template/gen/document-schema.d.ts +408 -0
  29. package/dist/document-models/resource-template/gen/document-schema.d.ts.map +1 -0
  30. package/dist/document-models/resource-template/gen/document-schema.js +33 -0
  31. package/dist/document-models/resource-template/gen/document-type.d.ts +2 -0
  32. package/dist/document-models/resource-template/gen/document-type.d.ts.map +1 -0
  33. package/dist/document-models/resource-template/gen/document-type.js +1 -0
  34. package/dist/document-models/resource-template/gen/facet-targeting/actions.d.ts +20 -0
  35. package/dist/document-models/resource-template/gen/facet-targeting/actions.d.ts.map +1 -0
  36. package/dist/document-models/resource-template/gen/facet-targeting/actions.js +1 -0
  37. package/dist/document-models/resource-template/gen/facet-targeting/creators.d.ts +7 -0
  38. package/dist/document-models/resource-template/gen/facet-targeting/creators.d.ts.map +1 -0
  39. package/dist/document-models/resource-template/gen/facet-targeting/creators.js +6 -0
  40. package/dist/document-models/resource-template/gen/facet-targeting/error.d.ts +28 -0
  41. package/dist/document-models/resource-template/gen/facet-targeting/error.d.ts.map +1 -0
  42. package/dist/document-models/resource-template/gen/facet-targeting/error.js +29 -0
  43. package/dist/document-models/resource-template/gen/facet-targeting/operations.d.ts +10 -0
  44. package/dist/document-models/resource-template/gen/facet-targeting/operations.d.ts.map +1 -0
  45. package/dist/document-models/resource-template/gen/facet-targeting/operations.js +3 -0
  46. package/dist/document-models/resource-template/gen/index.d.ts +17 -0
  47. package/dist/document-models/resource-template/gen/index.d.ts.map +1 -0
  48. package/dist/document-models/resource-template/gen/index.js +16 -0
  49. package/dist/document-models/resource-template/gen/option-group-management/actions.d.ts +16 -0
  50. package/dist/document-models/resource-template/gen/option-group-management/actions.d.ts.map +1 -0
  51. package/dist/document-models/resource-template/gen/option-group-management/actions.js +1 -0
  52. package/dist/document-models/resource-template/gen/option-group-management/creators.d.ts +6 -0
  53. package/dist/document-models/resource-template/gen/option-group-management/creators.d.ts.map +1 -0
  54. package/dist/document-models/resource-template/gen/option-group-management/creators.js +5 -0
  55. package/dist/document-models/resource-template/gen/option-group-management/error.d.ts +28 -0
  56. package/dist/document-models/resource-template/gen/option-group-management/error.d.ts.map +1 -0
  57. package/dist/document-models/resource-template/gen/option-group-management/error.js +29 -0
  58. package/dist/document-models/resource-template/gen/option-group-management/operations.d.ts +9 -0
  59. package/dist/document-models/resource-template/gen/option-group-management/operations.d.ts.map +1 -0
  60. package/dist/document-models/resource-template/gen/option-group-management/operations.js +3 -0
  61. package/dist/document-models/resource-template/gen/ph-factories.d.ts +23 -0
  62. package/dist/document-models/resource-template/gen/ph-factories.d.ts.map +1 -0
  63. package/dist/document-models/resource-template/gen/ph-factories.js +61 -0
  64. package/dist/document-models/resource-template/gen/reducer.d.ts +3 -0
  65. package/dist/document-models/resource-template/gen/reducer.d.ts.map +1 -0
  66. package/dist/document-models/resource-template/gen/reducer.js +98 -0
  67. package/dist/document-models/resource-template/gen/schema/index.d.ts +3 -0
  68. package/dist/document-models/resource-template/gen/schema/index.d.ts.map +1 -0
  69. package/dist/document-models/resource-template/gen/schema/index.js +2 -0
  70. package/dist/document-models/resource-template/gen/schema/types.d.ts +305 -0
  71. package/dist/document-models/resource-template/gen/schema/types.d.ts.map +1 -0
  72. package/dist/document-models/resource-template/gen/schema/types.js +1 -0
  73. package/dist/document-models/resource-template/gen/schema/zod.d.ts +37 -0
  74. package/dist/document-models/resource-template/gen/schema/zod.d.ts.map +1 -0
  75. package/dist/document-models/resource-template/gen/schema/zod.js +236 -0
  76. package/dist/document-models/resource-template/gen/service-category-management/actions.d.ts +12 -0
  77. package/dist/document-models/resource-template/gen/service-category-management/actions.d.ts.map +1 -0
  78. package/dist/document-models/resource-template/gen/service-category-management/actions.js +1 -0
  79. package/dist/document-models/resource-template/gen/service-category-management/creators.d.ts +5 -0
  80. package/dist/document-models/resource-template/gen/service-category-management/creators.d.ts.map +1 -0
  81. package/dist/document-models/resource-template/gen/service-category-management/creators.js +4 -0
  82. package/dist/document-models/resource-template/gen/service-category-management/error.d.ts +2 -0
  83. package/dist/document-models/resource-template/gen/service-category-management/error.d.ts.map +1 -0
  84. package/dist/document-models/resource-template/gen/service-category-management/error.js +1 -0
  85. package/dist/document-models/resource-template/gen/service-category-management/operations.d.ts +8 -0
  86. package/dist/document-models/resource-template/gen/service-category-management/operations.d.ts.map +1 -0
  87. package/dist/document-models/resource-template/gen/service-category-management/operations.js +3 -0
  88. package/dist/document-models/resource-template/gen/service-management/actions.d.ts +24 -0
  89. package/dist/document-models/resource-template/gen/service-management/actions.d.ts.map +1 -0
  90. package/dist/document-models/resource-template/gen/service-management/actions.js +1 -0
  91. package/dist/document-models/resource-template/gen/service-management/creators.d.ts +8 -0
  92. package/dist/document-models/resource-template/gen/service-management/creators.d.ts.map +1 -0
  93. package/dist/document-models/resource-template/gen/service-management/creators.js +7 -0
  94. package/dist/document-models/resource-template/gen/service-management/error.d.ts +52 -0
  95. package/dist/document-models/resource-template/gen/service-management/error.d.ts.map +1 -0
  96. package/dist/document-models/resource-template/gen/service-management/error.js +61 -0
  97. package/dist/document-models/resource-template/gen/service-management/operations.d.ts +11 -0
  98. package/dist/document-models/resource-template/gen/service-management/operations.d.ts.map +1 -0
  99. package/dist/document-models/resource-template/gen/service-management/operations.js +3 -0
  100. package/dist/document-models/resource-template/gen/template-management/actions.d.ts +20 -0
  101. package/dist/document-models/resource-template/gen/template-management/actions.d.ts.map +1 -0
  102. package/dist/document-models/resource-template/gen/template-management/actions.js +1 -0
  103. package/dist/document-models/resource-template/gen/template-management/creators.d.ts +7 -0
  104. package/dist/document-models/resource-template/gen/template-management/creators.d.ts.map +1 -0
  105. package/dist/document-models/resource-template/gen/template-management/creators.js +6 -0
  106. package/dist/document-models/resource-template/gen/template-management/error.d.ts +2 -0
  107. package/dist/document-models/resource-template/gen/template-management/error.d.ts.map +1 -0
  108. package/dist/document-models/resource-template/gen/template-management/error.js +1 -0
  109. package/dist/document-models/resource-template/gen/template-management/operations.d.ts +10 -0
  110. package/dist/document-models/resource-template/gen/template-management/operations.d.ts.map +1 -0
  111. package/dist/document-models/resource-template/gen/template-management/operations.js +3 -0
  112. package/dist/document-models/resource-template/gen/types.d.ts +12 -0
  113. package/dist/document-models/resource-template/gen/types.d.ts.map +1 -0
  114. package/dist/document-models/resource-template/gen/types.js +1 -0
  115. package/dist/document-models/resource-template/gen/utils.d.ts +15 -0
  116. package/dist/document-models/resource-template/gen/utils.d.ts.map +1 -0
  117. package/dist/document-models/resource-template/gen/utils.js +65 -0
  118. package/dist/document-models/resource-template/hooks.d.ts +11 -0
  119. package/dist/document-models/resource-template/hooks.d.ts.map +1 -0
  120. package/dist/document-models/resource-template/hooks.js +26 -0
  121. package/dist/document-models/resource-template/index.d.ts +10 -0
  122. package/dist/document-models/resource-template/index.d.ts.map +1 -0
  123. package/dist/document-models/resource-template/index.js +9 -0
  124. package/dist/document-models/resource-template/module.d.ts +5 -0
  125. package/dist/document-models/resource-template/module.d.ts.map +1 -0
  126. package/dist/document-models/resource-template/module.js +10 -0
  127. package/dist/document-models/resource-template/src/index.d.ts +2 -0
  128. package/dist/document-models/resource-template/src/index.d.ts.map +1 -0
  129. package/dist/document-models/resource-template/src/index.js +1 -0
  130. package/dist/document-models/resource-template/src/reducers/audience-management.d.ts +3 -0
  131. package/dist/document-models/resource-template/src/reducers/audience-management.d.ts.map +1 -0
  132. package/dist/document-models/resource-template/src/reducers/audience-management.js +17 -0
  133. package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts +3 -0
  134. package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts.map +1 -0
  135. package/dist/document-models/resource-template/src/reducers/facet-targeting.js +46 -0
  136. package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts +3 -0
  137. package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts.map +1 -0
  138. package/dist/document-models/resource-template/src/reducers/option-group-management.js +42 -0
  139. package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts +3 -0
  140. package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts.map +1 -0
  141. package/dist/document-models/resource-template/src/reducers/service-category-management.js +10 -0
  142. package/dist/document-models/resource-template/src/reducers/service-management.d.ts +3 -0
  143. package/dist/document-models/resource-template/src/reducers/service-management.d.ts.map +1 -0
  144. package/dist/document-models/resource-template/src/reducers/service-management.js +68 -0
  145. package/dist/document-models/resource-template/src/reducers/template-management.d.ts +3 -0
  146. package/dist/document-models/resource-template/src/reducers/template-management.d.ts.map +1 -0
  147. package/dist/document-models/resource-template/src/reducers/template-management.js +32 -0
  148. package/dist/document-models/resource-template/src/tests/audience-management.test.d.ts +6 -0
  149. package/dist/document-models/resource-template/src/tests/audience-management.test.d.ts.map +1 -0
  150. package/dist/document-models/resource-template/src/tests/audience-management.test.js +29 -0
  151. package/dist/document-models/resource-template/src/tests/document-model.test.d.ts +10 -0
  152. package/dist/document-models/resource-template/src/tests/document-model.test.d.ts.map +1 -0
  153. package/dist/document-models/resource-template/src/tests/document-model.test.js +104 -0
  154. package/dist/document-models/resource-template/src/tests/facet-targeting.test.d.ts +6 -0
  155. package/dist/document-models/resource-template/src/tests/facet-targeting.test.d.ts.map +1 -0
  156. package/dist/document-models/resource-template/src/tests/facet-targeting.test.js +49 -0
  157. package/dist/document-models/resource-template/src/tests/option-group-management.test.d.ts +6 -0
  158. package/dist/document-models/resource-template/src/tests/option-group-management.test.d.ts.map +1 -0
  159. package/dist/document-models/resource-template/src/tests/option-group-management.test.js +39 -0
  160. package/dist/document-models/resource-template/src/tests/service-category-management.test.d.ts +6 -0
  161. package/dist/document-models/resource-template/src/tests/service-category-management.test.d.ts.map +1 -0
  162. package/dist/document-models/resource-template/src/tests/service-category-management.test.js +29 -0
  163. package/dist/document-models/resource-template/src/tests/service-management.test.d.ts +6 -0
  164. package/dist/document-models/resource-template/src/tests/service-management.test.d.ts.map +1 -0
  165. package/dist/document-models/resource-template/src/tests/service-management.test.js +59 -0
  166. package/dist/document-models/resource-template/src/tests/template-management.test.d.ts +6 -0
  167. package/dist/document-models/resource-template/src/tests/template-management.test.d.ts.map +1 -0
  168. package/dist/document-models/resource-template/src/tests/template-management.test.js +49 -0
  169. package/dist/document-models/resource-template/src/utils.d.ts +2 -0
  170. package/dist/document-models/resource-template/src/utils.d.ts.map +1 -0
  171. package/dist/document-models/resource-template/src/utils.js +1 -0
  172. package/dist/document-models/resource-template/utils.d.ts +14 -0
  173. package/dist/document-models/resource-template/utils.d.ts.map +1 -0
  174. package/dist/document-models/resource-template/utils.js +7 -0
  175. package/dist/document-models/service-offering/actions.d.ts +2 -0
  176. package/dist/document-models/service-offering/actions.d.ts.map +1 -1
  177. package/dist/document-models/service-offering/gen/document-model.d.ts.map +1 -1
  178. package/dist/document-models/service-offering/gen/document-model.js +47 -2
  179. package/dist/document-models/service-offering/gen/document-schema.d.ts +35 -16
  180. package/dist/document-models/service-offering/gen/document-schema.d.ts.map +1 -1
  181. package/dist/document-models/service-offering/gen/offering-management/actions.d.ts +10 -2
  182. package/dist/document-models/service-offering/gen/offering-management/actions.d.ts.map +1 -1
  183. package/dist/document-models/service-offering/gen/offering-management/creators.d.ts +4 -2
  184. package/dist/document-models/service-offering/gen/offering-management/creators.d.ts.map +1 -1
  185. package/dist/document-models/service-offering/gen/offering-management/creators.js +3 -1
  186. package/dist/document-models/service-offering/gen/offering-management/error.d.ts +20 -1
  187. package/dist/document-models/service-offering/gen/offering-management/error.d.ts.map +1 -1
  188. package/dist/document-models/service-offering/gen/offering-management/error.js +25 -0
  189. package/dist/document-models/service-offering/gen/offering-management/operations.d.ts +3 -1
  190. package/dist/document-models/service-offering/gen/offering-management/operations.d.ts.map +1 -1
  191. package/dist/document-models/service-offering/gen/ph-factories.d.ts.map +1 -1
  192. package/dist/document-models/service-offering/gen/ph-factories.js +1 -0
  193. package/dist/document-models/service-offering/gen/reducer.d.ts +1 -1
  194. package/dist/document-models/service-offering/gen/reducer.d.ts.map +1 -1
  195. package/dist/document-models/service-offering/gen/reducer.js +9 -1
  196. package/dist/document-models/service-offering/gen/schema/types.d.ts +21 -11
  197. package/dist/document-models/service-offering/gen/schema/types.d.ts.map +1 -1
  198. package/dist/document-models/service-offering/gen/schema/zod.d.ts +3 -1
  199. package/dist/document-models/service-offering/gen/schema/zod.d.ts.map +1 -1
  200. package/dist/document-models/service-offering/gen/schema/zod.js +14 -0
  201. package/dist/document-models/service-offering/gen/utils.d.ts.map +1 -1
  202. package/dist/document-models/service-offering/gen/utils.js +1 -0
  203. package/dist/document-models/service-offering/src/reducers/offering-management.d.ts.map +1 -1
  204. package/dist/document-models/service-offering/src/reducers/offering-management.js +22 -4
  205. package/dist/document-models/service-offering/src/reducers/option-group-management.d.ts.map +1 -1
  206. package/dist/document-models/service-offering/src/reducers/option-group-management.js +8 -11
  207. package/dist/document-models/service-offering/src/reducers/service-management.d.ts.map +1 -1
  208. package/dist/document-models/service-offering/src/reducers/service-management.js +12 -15
  209. package/dist/document-models/service-offering/src/reducers/tier-management.d.ts.map +1 -1
  210. package/dist/document-models/service-offering/src/reducers/tier-management.js +19 -21
  211. package/dist/document-models/service-offering/src/tests/offering-management.test.js +1 -81
  212. package/dist/document-models/service-offering/src/tests/tier-management.test.d.ts +4 -0
  213. package/dist/document-models/service-offering/src/tests/tier-management.test.d.ts.map +1 -1
  214. package/dist/document-models/service-offering/src/tests/tier-management.test.js +109 -1
  215. package/dist/editors/accounts-editor/components/AccountForm.d.ts.map +1 -1
  216. package/dist/editors/builder-team-admin/components/DriveExplorer.d.ts.map +1 -1
  217. package/dist/editors/builder-team-admin/components/DriveExplorer.js +4 -0
  218. package/dist/editors/builder-team-admin/components/FolderTree.d.ts +1 -1
  219. package/dist/editors/builder-team-admin/components/FolderTree.d.ts.map +1 -1
  220. package/dist/editors/builder-team-admin/components/FolderTree.js +134 -9
  221. package/dist/editors/builder-team-admin/components/ResourcesServices.d.ts +8 -0
  222. package/dist/editors/builder-team-admin/components/ResourcesServices.d.ts.map +1 -0
  223. package/dist/editors/builder-team-admin/components/ResourcesServices.js +76 -0
  224. package/dist/editors/builder-team-admin/hooks/useResourcesServicesAutoPlacement.d.ts +27 -0
  225. package/dist/editors/builder-team-admin/hooks/useResourcesServicesAutoPlacement.d.ts.map +1 -0
  226. package/dist/editors/builder-team-admin/hooks/useResourcesServicesAutoPlacement.js +123 -0
  227. package/dist/editors/index.d.ts +1 -0
  228. package/dist/editors/index.d.ts.map +1 -1
  229. package/dist/editors/index.js +1 -0
  230. package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts +9 -0
  231. package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts.map +1 -0
  232. package/dist/editors/resource-template-editor/components/FacetTargeting.js +451 -0
  233. package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts +9 -0
  234. package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts.map +1 -0
  235. package/dist/editors/resource-template-editor/components/TemplateInfo.js +988 -0
  236. package/dist/editors/resource-template-editor/editor.d.ts +2 -0
  237. package/dist/editors/resource-template-editor/editor.d.ts.map +1 -0
  238. package/dist/editors/resource-template-editor/editor.js +149 -0
  239. package/dist/editors/resource-template-editor/module.d.ts +4 -0
  240. package/dist/editors/resource-template-editor/module.d.ts.map +1 -0
  241. package/dist/editors/resource-template-editor/module.js +10 -0
  242. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts +9 -0
  243. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -0
  244. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +1050 -0
  245. package/dist/editors/service-offering-editor/components/ServicesList.d.ts.map +1 -1
  246. package/dist/editors/service-offering-editor/components/ServicesList.js +1 -1
  247. package/dist/editors/service-offering-editor/components/TabNavigation.d.ts.map +1 -1
  248. package/dist/editors/service-offering-editor/components/TabNavigation.js +17 -3
  249. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -1
  250. package/dist/editors/service-offering-editor/components/TheMatrix.js +284 -25
  251. package/dist/editors/service-offering-editor/editor.d.ts.map +1 -1
  252. package/dist/editors/service-offering-editor/editor.js +2 -2
  253. package/dist/index.d.ts +1 -1
  254. package/dist/index.d.ts.map +1 -1
  255. package/dist/style.css +25 -0
  256. package/dist/subgraphs/budget-statements/resolvers.d.ts.map +1 -1
  257. package/dist/subgraphs/budget-statements/resolvers.js +76 -11
  258. package/dist/subgraphs/budget-statements/schema.d.ts.map +1 -1
  259. package/dist/subgraphs/budget-statements/schema.js +2 -1
  260. package/package.json +1 -1
@@ -0,0 +1,988 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef } from "react";
3
+ import { generateId } from "document-model/core";
4
+ import { updateTemplateInfo, updateTemplateStatus, setOperator, addTargetAudience, removeTargetAudience, setSetupServices, setRecurringServices, } from "../../../document-models/resource-template/gen/creators.js";
5
+ const STATUS_OPTIONS = [
6
+ { value: "DRAFT", label: "Draft", color: "slate" },
7
+ { value: "COMING_SOON", label: "Coming Soon", color: "sky" },
8
+ { value: "ACTIVE", label: "Active", color: "emerald" },
9
+ { value: "DEPRECATED", label: "Deprecated", color: "rose" },
10
+ ];
11
+ const AUDIENCE_PRESETS = [
12
+ { label: "Founders", color: "#8b5cf6" },
13
+ { label: "SNO Governors", color: "#f43f5e" },
14
+ { label: "Builders", color: "#0ea5e9" },
15
+ { label: "Operators", color: "#f97316" },
16
+ { label: "Contributors", color: "#10b981" },
17
+ { label: "Investors", color: "#6366f1" },
18
+ ];
19
+ export function TemplateInfo({ document, dispatch }) {
20
+ const { state } = document;
21
+ const globalState = state.global;
22
+ const [formData, setFormData] = useState({
23
+ title: globalState.title || "",
24
+ summary: globalState.summary || "",
25
+ description: globalState.description || "",
26
+ operatorId: globalState.operatorId || "",
27
+ thumbnailUrl: globalState.thumbnailUrl || "",
28
+ infoLink: globalState.infoLink || "",
29
+ status: globalState.status,
30
+ });
31
+ const [newSetupService, setNewSetupService] = useState("");
32
+ const [newRecurringService, setNewRecurringService] = useState("");
33
+ const [newAudienceLabel, setNewAudienceLabel] = useState("");
34
+ const [showAudienceInput, setShowAudienceInput] = useState(false);
35
+ const setupServiceInputRef = useRef(null);
36
+ const recurringServiceInputRef = useRef(null);
37
+ useEffect(() => {
38
+ setFormData({
39
+ title: globalState.title || "",
40
+ summary: globalState.summary || "",
41
+ description: globalState.description || "",
42
+ operatorId: globalState.operatorId || "",
43
+ thumbnailUrl: globalState.thumbnailUrl || "",
44
+ infoLink: globalState.infoLink || "",
45
+ status: globalState.status,
46
+ });
47
+ }, [
48
+ globalState.title,
49
+ globalState.summary,
50
+ globalState.description,
51
+ globalState.operatorId,
52
+ globalState.thumbnailUrl,
53
+ globalState.infoLink,
54
+ globalState.status,
55
+ ]);
56
+ const handleFieldChange = (field, value) => {
57
+ setFormData((prev) => ({ ...prev, [field]: value }));
58
+ };
59
+ const handleInfoBlur = () => {
60
+ const changes = {};
61
+ let hasChanges = false;
62
+ if (formData.title !== globalState.title) {
63
+ changes.title = formData.title;
64
+ hasChanges = true;
65
+ }
66
+ if (formData.summary !== globalState.summary) {
67
+ changes.summary = formData.summary;
68
+ hasChanges = true;
69
+ }
70
+ if (formData.description !== (globalState.description || "")) {
71
+ changes.description = formData.description || null;
72
+ hasChanges = true;
73
+ }
74
+ if (formData.thumbnailUrl !== (globalState.thumbnailUrl || "")) {
75
+ changes.thumbnailUrl = formData.thumbnailUrl || null;
76
+ hasChanges = true;
77
+ }
78
+ if (formData.infoLink !== (globalState.infoLink || "")) {
79
+ changes.infoLink = formData.infoLink || null;
80
+ hasChanges = true;
81
+ }
82
+ if (hasChanges) {
83
+ dispatch(updateTemplateInfo({
84
+ ...changes,
85
+ lastModified: new Date().toISOString(),
86
+ }));
87
+ }
88
+ };
89
+ const handleOperatorBlur = () => {
90
+ if (formData.operatorId !== globalState.operatorId) {
91
+ dispatch(setOperator({
92
+ operatorId: formData.operatorId,
93
+ lastModified: new Date().toISOString(),
94
+ }));
95
+ }
96
+ };
97
+ const handleStatusChange = (value) => {
98
+ const status = value;
99
+ setFormData((prev) => ({ ...prev, status }));
100
+ dispatch(updateTemplateStatus({
101
+ status,
102
+ lastModified: new Date().toISOString(),
103
+ }));
104
+ };
105
+ const handleAddAudience = (label, color) => {
106
+ if (!label.trim())
107
+ return;
108
+ dispatch(addTargetAudience({
109
+ id: generateId(),
110
+ label: label.trim(),
111
+ color: color || null,
112
+ lastModified: new Date().toISOString(),
113
+ }));
114
+ setNewAudienceLabel("");
115
+ setShowAudienceInput(false);
116
+ };
117
+ const handleRemoveAudience = (id) => {
118
+ dispatch(removeTargetAudience({
119
+ id,
120
+ lastModified: new Date().toISOString(),
121
+ }));
122
+ };
123
+ const handleAddSetupService = () => {
124
+ if (!newSetupService.trim())
125
+ return;
126
+ const updatedServices = [
127
+ ...globalState.setupServices,
128
+ newSetupService.trim(),
129
+ ];
130
+ dispatch(setSetupServices({
131
+ services: updatedServices,
132
+ lastModified: new Date().toISOString(),
133
+ }));
134
+ setNewSetupService("");
135
+ setupServiceInputRef.current?.focus();
136
+ };
137
+ const handleRemoveSetupService = (index) => {
138
+ const updatedServices = globalState.setupServices.filter((_, i) => i !== index);
139
+ dispatch(setSetupServices({
140
+ services: updatedServices,
141
+ lastModified: new Date().toISOString(),
142
+ }));
143
+ };
144
+ const handleAddRecurringService = () => {
145
+ if (!newRecurringService.trim())
146
+ return;
147
+ const updatedServices = [
148
+ ...globalState.recurringServices,
149
+ newRecurringService.trim(),
150
+ ];
151
+ dispatch(setRecurringServices({
152
+ services: updatedServices,
153
+ lastModified: new Date().toISOString(),
154
+ }));
155
+ setNewRecurringService("");
156
+ recurringServiceInputRef.current?.focus();
157
+ };
158
+ const handleRemoveRecurringService = (index) => {
159
+ const updatedServices = globalState.recurringServices.filter((_, i) => i !== index);
160
+ dispatch(setRecurringServices({
161
+ services: updatedServices,
162
+ lastModified: new Date().toISOString(),
163
+ }));
164
+ };
165
+ const currentStatus = STATUS_OPTIONS.find((s) => s.value === formData.status);
166
+ const availablePresets = AUDIENCE_PRESETS.filter((preset) => !globalState.targetAudiences.some((a) => a.label === preset.label));
167
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: styles }), _jsxs("div", { className: "template-editor", children: [_jsxs("section", { className: "template-editor__hero", children: [_jsxs("div", { className: "template-editor__thumbnail-area", children: [_jsxs("div", { className: "template-editor__thumbnail", style: {
168
+ backgroundImage: formData.thumbnailUrl
169
+ ? `url(${formData.thumbnailUrl})`
170
+ : undefined,
171
+ }, children: [!formData.thumbnailUrl && (_jsxs("div", { className: "template-editor__thumbnail-placeholder", children: [_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("circle", { cx: "8.5", cy: "8.5", r: "1.5" }), _jsx("path", { d: "M21 15l-5-5L5 21" })] }), _jsx("span", { children: "Add Thumbnail" })] })), formData.thumbnailUrl && (_jsx("div", { className: `template-editor__status-badge template-editor__status-badge--${currentStatus?.color}`, children: currentStatus?.label }))] }), _jsx("div", { className: "template-editor__thumbnail-input", children: _jsx("input", { type: "text", value: formData.thumbnailUrl, onChange: (e) => handleFieldChange("thumbnailUrl", e.target.value), onBlur: handleInfoBlur, placeholder: "https://example.com/image.jpg", className: "template-editor__input template-editor__input--sm" }) })] }), _jsxs("div", { className: "template-editor__identity", children: [_jsxs("div", { className: "template-editor__title-row", children: [_jsx("input", { type: "text", value: formData.title, onChange: (e) => handleFieldChange("title", e.target.value), onBlur: handleInfoBlur, className: "template-editor__title-input", placeholder: "Resource Template Title" }), _jsxs("div", { className: "template-editor__status-select", children: [_jsx("select", { value: formData.status, onChange: (e) => handleStatusChange(e.target.value), className: "template-editor__select", "data-status": currentStatus?.color, children: STATUS_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) }), _jsx("span", { className: `template-editor__status-indicator template-editor__status-indicator--${currentStatus?.color}` })] })] }), _jsxs("div", { className: "template-editor__audiences", children: [globalState.targetAudiences.map((audience) => (_jsxs("span", { className: "template-editor__audience-tag", style: audience.color
172
+ ? {
173
+ backgroundColor: `${audience.color}15`,
174
+ borderColor: `${audience.color}40`,
175
+ color: audience.color,
176
+ }
177
+ : undefined, children: [audience.label, _jsx("button", { type: "button", onClick: () => handleRemoveAudience(audience.id), className: "template-editor__audience-remove", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", strokeWidth: "2" }) }) })] }, audience.id))), showAudienceInput ? (_jsxs("div", { className: "template-editor__audience-input-wrap", children: [_jsx("input", { type: "text", value: newAudienceLabel, onChange: (e) => setNewAudienceLabel(e.target.value), onKeyDown: (e) => {
178
+ if (e.key === "Enter")
179
+ handleAddAudience(newAudienceLabel);
180
+ if (e.key === "Escape")
181
+ setShowAudienceInput(false);
182
+ }, placeholder: "Audience name...", className: "template-editor__audience-input", autoFocus: true }), _jsx("button", { type: "button", onClick: () => handleAddAudience(newAudienceLabel), className: "template-editor__audience-add-btn", children: "Add" })] })) : (_jsxs("button", { type: "button", onClick: () => setShowAudienceInput(true), className: "template-editor__add-audience-btn", children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 5v14M5 12h14", strokeWidth: "2" }) }), "Add Audience"] }))] }), availablePresets.length > 0 && (_jsxs("div", { className: "template-editor__audience-presets", children: [_jsx("span", { className: "template-editor__presets-label", children: "Quick add:" }), availablePresets.slice(0, 4).map((preset) => (_jsx("button", { type: "button", onClick: () => handleAddAudience(preset.label, preset.color), className: "template-editor__preset-btn", style: { color: preset.color }, children: preset.label }, preset.label)))] })), _jsx("textarea", { value: formData.summary, onChange: (e) => handleFieldChange("summary", e.target.value), onBlur: handleInfoBlur, className: "template-editor__summary", placeholder: "Brief summary of your resource template...", rows: 2 })] })] }), _jsxs("section", { className: "template-editor__card template-editor__card--full", children: [_jsxs("div", { className: "template-editor__card-header", children: [_jsx("div", { className: "template-editor__card-icon template-editor__card-icon--violet", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M4 6h16M4 12h16M4 18h10" }) }) }), _jsxs("div", { children: [_jsx("h3", { className: "template-editor__card-title", children: "Description" }), _jsx("p", { className: "template-editor__card-subtitle", children: "Detailed description of your resource template" })] })] }), _jsx("textarea", { value: formData.description, onChange: (e) => handleFieldChange("description", e.target.value), onBlur: handleInfoBlur, className: "template-editor__textarea", placeholder: "Provide a comprehensive description of your resource template, including what makes it unique and valuable...", rows: 4 })] }), _jsxs("div", { className: "template-editor__grid", children: [_jsxs("section", { className: "template-editor__card", children: [_jsxs("div", { className: "template-editor__card-header", children: [_jsx("div", { className: "template-editor__card-icon template-editor__card-icon--emerald", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M12 2L2 7l10 5 10-5-10-5z" }), _jsx("path", { d: "M2 17l10 5 10-5" }), _jsx("path", { d: "M2 12l10 5 10-5" })] }) }), _jsxs("div", { children: [_jsx("h3", { className: "template-editor__card-title", children: "Formation & Setup" }), _jsx("p", { className: "template-editor__card-subtitle", children: "One-time setup services" })] })] }), _jsxs("div", { className: "template-editor__services", children: [globalState.setupServices.map((service, index) => (_jsxs("div", { className: "template-editor__service", children: [_jsx("span", { className: "template-editor__service-bullet" }), _jsx("span", { className: "template-editor__service-text", children: service }), _jsx("button", { type: "button", onClick: () => handleRemoveSetupService(index), className: "template-editor__service-remove", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", strokeWidth: "2" }) }) })] }, index))), _jsxs("div", { className: "template-editor__add-service", children: [_jsx("span", { className: "template-editor__service-bullet template-editor__service-bullet--ghost" }), _jsx("input", { ref: setupServiceInputRef, type: "text", value: newSetupService, onChange: (e) => setNewSetupService(e.target.value), onKeyDown: (e) => {
183
+ if (e.key === "Enter")
184
+ handleAddSetupService();
185
+ }, placeholder: "Add a setup service...", className: "template-editor__service-new-input" }), newSetupService && (_jsx("button", { type: "button", onClick: handleAddSetupService, className: "template-editor__service-add-btn", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 5v14M5 12h14", strokeWidth: "2" }) }) }))] })] })] }), _jsxs("section", { className: "template-editor__card", children: [_jsxs("div", { className: "template-editor__card-header", children: [_jsx("div", { className: "template-editor__card-icon template-editor__card-icon--amber", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M12 8v4l3 3" }), _jsx("circle", { cx: "12", cy: "12", r: "9" })] }) }), _jsxs("div", { children: [_jsx("h3", { className: "template-editor__card-title", children: "Recurring Services" }), _jsx("p", { className: "template-editor__card-subtitle", children: "Ongoing services included" })] })] }), _jsxs("div", { className: "template-editor__services", children: [globalState.recurringServices.map((service, index) => (_jsxs("div", { className: "template-editor__service", children: [_jsx("span", { className: "template-editor__service-bullet template-editor__service-bullet--recurring" }), _jsx("span", { className: "template-editor__service-text", children: service }), _jsx("button", { type: "button", onClick: () => handleRemoveRecurringService(index), className: "template-editor__service-remove", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", strokeWidth: "2" }) }) })] }, index))), _jsxs("div", { className: "template-editor__add-service", children: [_jsx("span", { className: "template-editor__service-bullet template-editor__service-bullet--ghost" }), _jsx("input", { ref: recurringServiceInputRef, type: "text", value: newRecurringService, onChange: (e) => setNewRecurringService(e.target.value), onKeyDown: (e) => {
186
+ if (e.key === "Enter")
187
+ handleAddRecurringService();
188
+ }, placeholder: "Add a recurring service...", className: "template-editor__service-new-input" }), newRecurringService && (_jsx("button", { type: "button", onClick: handleAddRecurringService, className: "template-editor__service-add-btn", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 5v14M5 12h14", strokeWidth: "2" }) }) }))] })] })] })] }), _jsxs("section", { className: "template-editor__metadata", children: [_jsxs("div", { className: "template-editor__meta-field", children: [_jsx("label", { className: "template-editor__label", children: "Operator ID" }), _jsx("input", { type: "text", value: formData.operatorId, onChange: (e) => handleFieldChange("operatorId", e.target.value), onBlur: handleOperatorBlur, className: "template-editor__input template-editor__input--mono", placeholder: "operator-123" })] }), _jsxs("div", { className: "template-editor__meta-field", children: [_jsx("label", { className: "template-editor__label", children: "More Info Link" }), _jsx("input", { type: "text", value: formData.infoLink, onChange: (e) => handleFieldChange("infoLink", e.target.value), onBlur: handleInfoBlur, className: "template-editor__input", placeholder: "https://example.com/more-info" })] })] })] })] }));
189
+ }
190
+ const styles = `
191
+ @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400;500;600;700&display=swap');
192
+
193
+ .template-editor {
194
+ --te-font: 'Instrument Sans', system-ui, sans-serif;
195
+ --te-mono: 'DM Mono', 'SF Mono', monospace;
196
+
197
+ --te-ink: #1a1f36;
198
+ --te-ink-light: #4a5578;
199
+ --te-ink-muted: #8792a8;
200
+ --te-surface: #ffffff;
201
+ --te-surface-raised: #fafbfc;
202
+ --te-border: #e4e8f0;
203
+ --te-border-light: #f0f2f7;
204
+
205
+ --te-violet: #7c5cff;
206
+ --te-violet-light: #f4f1ff;
207
+ --te-amber: #f59e0b;
208
+ --te-amber-light: #fef7e6;
209
+ --te-emerald: #10b981;
210
+ --te-emerald-light: #e8faf3;
211
+ --te-sky: #0ea5e9;
212
+ --te-sky-light: #e8f7fc;
213
+ --te-rose: #f43f5e;
214
+ --te-rose-light: #fef1f3;
215
+ --te-slate: #64748b;
216
+ --te-slate-light: #f1f5f9;
217
+ --te-teal: #14b8a6;
218
+ --te-teal-light: #ccfbf1;
219
+
220
+ font-family: var(--te-font);
221
+ display: flex;
222
+ flex-direction: column;
223
+ gap: 24px;
224
+ }
225
+
226
+ /* Hero Section */
227
+ .template-editor__hero {
228
+ display: grid;
229
+ grid-template-columns: 160px 1fr;
230
+ gap: 28px;
231
+ background: var(--te-surface);
232
+ border-radius: 16px;
233
+ padding: 24px;
234
+ box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);
235
+ border-left: 4px solid var(--te-teal);
236
+ }
237
+
238
+ .template-editor__thumbnail-area {
239
+ display: flex;
240
+ flex-direction: column;
241
+ gap: 12px;
242
+ }
243
+
244
+ .template-editor__thumbnail {
245
+ width: 160px;
246
+ height: 120px;
247
+ border-radius: 12px;
248
+ background: linear-gradient(135deg, var(--te-border-light) 0%, var(--te-border) 100%);
249
+ background-size: cover;
250
+ background-position: center;
251
+ position: relative;
252
+ overflow: hidden;
253
+ transition: transform 0.2s ease;
254
+ }
255
+
256
+ .template-editor__thumbnail:hover {
257
+ transform: scale(1.02);
258
+ }
259
+
260
+ .template-editor__thumbnail-placeholder {
261
+ position: absolute;
262
+ inset: 0;
263
+ display: flex;
264
+ flex-direction: column;
265
+ align-items: center;
266
+ justify-content: center;
267
+ gap: 8px;
268
+ color: var(--te-ink-muted);
269
+ font-size: 0.75rem;
270
+ font-weight: 500;
271
+ }
272
+
273
+ .template-editor__thumbnail-placeholder svg {
274
+ width: 32px;
275
+ height: 32px;
276
+ opacity: 0.5;
277
+ }
278
+
279
+ .template-editor__status-badge {
280
+ position: absolute;
281
+ top: 8px;
282
+ left: 8px;
283
+ padding: 4px 10px;
284
+ font-size: 0.625rem;
285
+ font-weight: 700;
286
+ text-transform: uppercase;
287
+ letter-spacing: 0.05em;
288
+ border-radius: 100px;
289
+ backdrop-filter: blur(8px);
290
+ }
291
+
292
+ .template-editor__status-badge--emerald {
293
+ background: rgba(16, 185, 129, 0.9);
294
+ color: white;
295
+ }
296
+
297
+ .template-editor__status-badge--sky {
298
+ background: rgba(14, 165, 233, 0.9);
299
+ color: white;
300
+ }
301
+
302
+ .template-editor__status-badge--slate {
303
+ background: rgba(100, 116, 139, 0.9);
304
+ color: white;
305
+ }
306
+
307
+ .template-editor__status-badge--rose {
308
+ background: rgba(244, 63, 94, 0.9);
309
+ color: white;
310
+ }
311
+
312
+ .template-editor__thumbnail-input {
313
+ width: 100%;
314
+ }
315
+
316
+ .template-editor__identity {
317
+ display: flex;
318
+ flex-direction: column;
319
+ gap: 16px;
320
+ }
321
+
322
+ .template-editor__title-row {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 16px;
326
+ }
327
+
328
+ .template-editor__title-input {
329
+ flex: 1;
330
+ font-family: var(--te-font);
331
+ font-size: 1.75rem;
332
+ font-weight: 700;
333
+ color: var(--te-ink);
334
+ background: transparent;
335
+ border: none;
336
+ outline: none;
337
+ padding: 0;
338
+ letter-spacing: -0.02em;
339
+ }
340
+
341
+ .template-editor__title-input::placeholder {
342
+ color: var(--te-ink-muted);
343
+ }
344
+
345
+ .template-editor__status-select {
346
+ position: relative;
347
+ display: flex;
348
+ align-items: center;
349
+ }
350
+
351
+ .template-editor__select {
352
+ appearance: none;
353
+ font-family: var(--te-font);
354
+ font-size: 0.8125rem;
355
+ font-weight: 600;
356
+ padding: 8px 32px 8px 28px;
357
+ border-radius: 100px;
358
+ border: 1.5px solid var(--te-border);
359
+ background: var(--te-surface-raised);
360
+ color: var(--te-ink-light);
361
+ cursor: pointer;
362
+ transition: all 0.15s ease;
363
+ }
364
+
365
+ .template-editor__select:hover {
366
+ border-color: var(--te-ink-muted);
367
+ }
368
+
369
+ .template-editor__select:focus {
370
+ outline: none;
371
+ border-color: var(--te-teal);
372
+ box-shadow: 0 0 0 3px var(--te-teal-light);
373
+ }
374
+
375
+ .template-editor__status-indicator {
376
+ position: absolute;
377
+ left: 10px;
378
+ width: 8px;
379
+ height: 8px;
380
+ border-radius: 50%;
381
+ pointer-events: none;
382
+ }
383
+
384
+ .template-editor__status-indicator--emerald { background: var(--te-emerald); }
385
+ .template-editor__status-indicator--sky { background: var(--te-sky); }
386
+ .template-editor__status-indicator--slate { background: var(--te-slate); }
387
+ .template-editor__status-indicator--rose { background: var(--te-rose); }
388
+
389
+ /* Audiences */
390
+ .template-editor__audiences {
391
+ display: flex;
392
+ flex-wrap: wrap;
393
+ align-items: center;
394
+ gap: 8px;
395
+ }
396
+
397
+ .template-editor__audience-tag {
398
+ display: inline-flex;
399
+ align-items: center;
400
+ gap: 6px;
401
+ padding: 6px 12px;
402
+ font-size: 0.8125rem;
403
+ font-weight: 600;
404
+ border-radius: 100px;
405
+ background: var(--te-teal-light);
406
+ border: 1px solid rgba(20, 184, 166, 0.2);
407
+ color: var(--te-teal);
408
+ transition: all 0.15s ease;
409
+ }
410
+
411
+ .template-editor__audience-remove {
412
+ display: flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ width: 16px;
416
+ height: 16px;
417
+ padding: 0;
418
+ background: transparent;
419
+ border: none;
420
+ cursor: pointer;
421
+ opacity: 0.6;
422
+ transition: opacity 0.15s ease;
423
+ }
424
+
425
+ .template-editor__audience-remove:hover {
426
+ opacity: 1;
427
+ }
428
+
429
+ .template-editor__audience-remove svg {
430
+ width: 12px;
431
+ height: 12px;
432
+ }
433
+
434
+ .template-editor__add-audience-btn {
435
+ display: inline-flex;
436
+ align-items: center;
437
+ gap: 4px;
438
+ padding: 6px 12px;
439
+ font-family: var(--te-font);
440
+ font-size: 0.8125rem;
441
+ font-weight: 500;
442
+ color: var(--te-ink-muted);
443
+ background: transparent;
444
+ border: 1.5px dashed var(--te-border);
445
+ border-radius: 100px;
446
+ cursor: pointer;
447
+ transition: all 0.15s ease;
448
+ }
449
+
450
+ .template-editor__add-audience-btn:hover {
451
+ border-color: var(--te-ink-muted);
452
+ color: var(--te-ink-light);
453
+ }
454
+
455
+ .template-editor__add-audience-btn svg {
456
+ width: 14px;
457
+ height: 14px;
458
+ }
459
+
460
+ .template-editor__audience-input-wrap {
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 6px;
464
+ }
465
+
466
+ .template-editor__audience-input {
467
+ width: 140px;
468
+ padding: 6px 12px;
469
+ font-family: var(--te-font);
470
+ font-size: 0.8125rem;
471
+ border: 1.5px solid var(--te-teal);
472
+ border-radius: 100px;
473
+ outline: none;
474
+ background: var(--te-surface);
475
+ }
476
+
477
+ .template-editor__audience-add-btn {
478
+ padding: 6px 12px;
479
+ font-family: var(--te-font);
480
+ font-size: 0.75rem;
481
+ font-weight: 600;
482
+ color: white;
483
+ background: var(--te-teal);
484
+ border: none;
485
+ border-radius: 100px;
486
+ cursor: pointer;
487
+ transition: background 0.15s ease;
488
+ }
489
+
490
+ .template-editor__audience-add-btn:hover {
491
+ background: #0d9488;
492
+ }
493
+
494
+ .template-editor__audience-presets {
495
+ display: flex;
496
+ align-items: center;
497
+ gap: 8px;
498
+ padding-top: 4px;
499
+ }
500
+
501
+ .template-editor__presets-label {
502
+ font-size: 0.75rem;
503
+ color: var(--te-ink-muted);
504
+ }
505
+
506
+ .template-editor__preset-btn {
507
+ font-family: var(--te-font);
508
+ font-size: 0.75rem;
509
+ font-weight: 500;
510
+ padding: 4px 8px;
511
+ background: transparent;
512
+ border: none;
513
+ cursor: pointer;
514
+ opacity: 0.7;
515
+ transition: opacity 0.15s ease;
516
+ }
517
+
518
+ .template-editor__preset-btn:hover {
519
+ opacity: 1;
520
+ }
521
+
522
+ .template-editor__summary {
523
+ width: 100%;
524
+ font-family: var(--te-font);
525
+ font-size: 0.9375rem;
526
+ line-height: 1.6;
527
+ color: var(--te-ink-light);
528
+ background: transparent;
529
+ border: none;
530
+ outline: none;
531
+ resize: none;
532
+ padding: 0;
533
+ }
534
+
535
+ .template-editor__summary::placeholder {
536
+ color: var(--te-ink-muted);
537
+ }
538
+
539
+ /* Grid Cards */
540
+ .template-editor__grid {
541
+ display: grid;
542
+ grid-template-columns: 1fr 1fr;
543
+ gap: 20px;
544
+ }
545
+
546
+ .template-editor__card {
547
+ background: var(--te-surface);
548
+ border-radius: 16px;
549
+ padding: 24px;
550
+ box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);
551
+ }
552
+
553
+ .template-editor__card-header {
554
+ display: flex;
555
+ align-items: flex-start;
556
+ gap: 14px;
557
+ margin-bottom: 20px;
558
+ }
559
+
560
+ .template-editor__card-icon {
561
+ width: 40px;
562
+ height: 40px;
563
+ border-radius: 10px;
564
+ display: flex;
565
+ align-items: center;
566
+ justify-content: center;
567
+ flex-shrink: 0;
568
+ }
569
+
570
+ .template-editor__card-icon svg {
571
+ width: 20px;
572
+ height: 20px;
573
+ }
574
+
575
+ .template-editor__card-icon--violet {
576
+ background: var(--te-violet-light);
577
+ color: var(--te-violet);
578
+ }
579
+
580
+ .template-editor__card-icon--amber {
581
+ background: var(--te-amber-light);
582
+ color: var(--te-amber);
583
+ }
584
+
585
+ .template-editor__card-icon--emerald {
586
+ background: var(--te-emerald-light);
587
+ color: var(--te-emerald);
588
+ }
589
+
590
+ .template-editor__card--full {
591
+ grid-column: 1 / -1;
592
+ }
593
+
594
+ .template-editor__card-title {
595
+ font-size: 1rem;
596
+ font-weight: 600;
597
+ color: var(--te-ink);
598
+ margin: 0 0 2px;
599
+ }
600
+
601
+ .template-editor__card-subtitle {
602
+ font-size: 0.8125rem;
603
+ color: var(--te-ink-muted);
604
+ margin: 0;
605
+ }
606
+
607
+ .template-editor__textarea {
608
+ width: 100%;
609
+ font-family: var(--te-font);
610
+ font-size: 0.9375rem;
611
+ line-height: 1.7;
612
+ color: var(--te-ink);
613
+ background: var(--te-surface-raised);
614
+ border: 1.5px solid var(--te-border-light);
615
+ border-radius: 12px;
616
+ padding: 16px;
617
+ resize: vertical;
618
+ transition: all 0.15s ease;
619
+ }
620
+
621
+ .template-editor__textarea:hover {
622
+ border-color: var(--te-border);
623
+ }
624
+
625
+ .template-editor__textarea:focus {
626
+ outline: none;
627
+ border-color: var(--te-teal);
628
+ box-shadow: 0 0 0 3px var(--te-teal-light);
629
+ }
630
+
631
+ .template-editor__textarea::placeholder {
632
+ color: var(--te-ink-muted);
633
+ }
634
+
635
+ /* Services */
636
+ .template-editor__services {
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: 8px;
640
+ }
641
+
642
+ .template-editor__service {
643
+ display: flex;
644
+ align-items: center;
645
+ gap: 10px;
646
+ padding: 10px 12px;
647
+ background: var(--te-surface-raised);
648
+ border-radius: 8px;
649
+ transition: background 0.15s ease;
650
+ }
651
+
652
+ .template-editor__service:hover {
653
+ background: var(--te-border-light);
654
+ }
655
+
656
+ .template-editor__service-bullet {
657
+ width: 6px;
658
+ height: 6px;
659
+ border-radius: 50%;
660
+ background: var(--te-emerald);
661
+ flex-shrink: 0;
662
+ }
663
+
664
+ .template-editor__service-bullet--recurring {
665
+ background: var(--te-amber);
666
+ }
667
+
668
+ .template-editor__service-bullet--ghost {
669
+ background: var(--te-border);
670
+ }
671
+
672
+ .template-editor__service-text {
673
+ flex: 1;
674
+ font-size: 0.875rem;
675
+ color: var(--te-ink);
676
+ }
677
+
678
+ .template-editor__service-remove {
679
+ display: flex;
680
+ align-items: center;
681
+ justify-content: center;
682
+ width: 24px;
683
+ height: 24px;
684
+ padding: 0;
685
+ background: transparent;
686
+ border: none;
687
+ border-radius: 6px;
688
+ cursor: pointer;
689
+ color: var(--te-ink-muted);
690
+ opacity: 0;
691
+ transition: all 0.15s ease;
692
+ }
693
+
694
+ .template-editor__service:hover .template-editor__service-remove {
695
+ opacity: 1;
696
+ }
697
+
698
+ .template-editor__service-remove:hover {
699
+ background: var(--te-rose-light);
700
+ color: var(--te-rose);
701
+ }
702
+
703
+ .template-editor__service-remove svg {
704
+ width: 14px;
705
+ height: 14px;
706
+ }
707
+
708
+ .template-editor__add-service {
709
+ display: flex;
710
+ align-items: center;
711
+ gap: 10px;
712
+ padding: 10px 12px;
713
+ background: transparent;
714
+ border: 1.5px dashed var(--te-border);
715
+ border-radius: 8px;
716
+ transition: all 0.15s ease;
717
+ }
718
+
719
+ .template-editor__add-service:focus-within {
720
+ border-color: var(--te-teal);
721
+ border-style: solid;
722
+ }
723
+
724
+ .template-editor__service-new-input {
725
+ flex: 1;
726
+ font-family: var(--te-font);
727
+ font-size: 0.875rem;
728
+ background: transparent;
729
+ border: none;
730
+ outline: none;
731
+ color: var(--te-ink);
732
+ }
733
+
734
+ .template-editor__service-new-input::placeholder {
735
+ color: var(--te-ink-muted);
736
+ }
737
+
738
+ .template-editor__service-add-btn {
739
+ display: flex;
740
+ align-items: center;
741
+ justify-content: center;
742
+ width: 28px;
743
+ height: 28px;
744
+ padding: 0;
745
+ background: var(--te-teal);
746
+ border: none;
747
+ border-radius: 6px;
748
+ cursor: pointer;
749
+ color: white;
750
+ transition: background 0.15s ease;
751
+ }
752
+
753
+ .template-editor__service-add-btn:hover {
754
+ background: #0d9488;
755
+ }
756
+
757
+ .template-editor__service-add-btn svg {
758
+ width: 16px;
759
+ height: 16px;
760
+ }
761
+
762
+ /* Metadata */
763
+ .template-editor__metadata {
764
+ display: grid;
765
+ grid-template-columns: 1fr 1fr;
766
+ gap: 20px;
767
+ background: var(--te-surface);
768
+ border-radius: 16px;
769
+ padding: 24px;
770
+ box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);
771
+ }
772
+
773
+ .template-editor__meta-field {
774
+ display: flex;
775
+ flex-direction: column;
776
+ gap: 8px;
777
+ }
778
+
779
+ .template-editor__label {
780
+ font-size: 0.6875rem;
781
+ font-weight: 700;
782
+ text-transform: uppercase;
783
+ letter-spacing: 0.06em;
784
+ color: var(--te-ink-muted);
785
+ }
786
+
787
+ .template-editor__input {
788
+ width: 100%;
789
+ font-family: var(--te-font);
790
+ font-size: 0.9375rem;
791
+ padding: 12px 16px;
792
+ background: var(--te-surface-raised);
793
+ border: 1.5px solid var(--te-border-light);
794
+ border-radius: 10px;
795
+ color: var(--te-ink);
796
+ transition: all 0.15s ease;
797
+ }
798
+
799
+ .template-editor__input:hover {
800
+ border-color: var(--te-border);
801
+ }
802
+
803
+ .template-editor__input:focus {
804
+ outline: none;
805
+ border-color: var(--te-teal);
806
+ box-shadow: 0 0 0 3px var(--te-teal-light);
807
+ }
808
+
809
+ .template-editor__input::placeholder {
810
+ color: var(--te-ink-muted);
811
+ }
812
+
813
+ .template-editor__input--sm {
814
+ font-size: 0.8125rem;
815
+ padding: 8px 12px;
816
+ }
817
+
818
+ .template-editor__input--mono {
819
+ font-family: var(--te-mono);
820
+ font-size: 0.875rem;
821
+ }
822
+
823
+ /* Facet Targeting */
824
+ .template-editor__facets {
825
+ background: var(--te-surface);
826
+ border-radius: 16px;
827
+ padding: 24px;
828
+ box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);
829
+ }
830
+
831
+ .template-editor__facets-header {
832
+ display: flex;
833
+ align-items: flex-start;
834
+ gap: 14px;
835
+ margin-bottom: 20px;
836
+ }
837
+
838
+ .template-editor__card-icon--sky {
839
+ background: var(--te-sky-light);
840
+ color: var(--te-sky);
841
+ }
842
+
843
+ .template-editor__facets-grid {
844
+ display: grid;
845
+ grid-template-columns: repeat(2, 1fr);
846
+ gap: 16px;
847
+ }
848
+
849
+ .template-editor__facet-card {
850
+ background: var(--te-surface-raised);
851
+ border: 1px solid var(--te-border-light);
852
+ border-radius: 12px;
853
+ padding: 16px;
854
+ transition: border-color 0.15s ease;
855
+ }
856
+
857
+ .template-editor__facet-card:hover {
858
+ border-color: var(--te-border);
859
+ }
860
+
861
+ .template-editor__facet-header {
862
+ display: flex;
863
+ align-items: center;
864
+ justify-content: space-between;
865
+ margin-bottom: 6px;
866
+ }
867
+
868
+ .template-editor__facet-label {
869
+ font-size: 0.875rem;
870
+ font-weight: 600;
871
+ color: var(--te-ink);
872
+ }
873
+
874
+ .template-editor__facet-clear {
875
+ font-family: var(--te-font);
876
+ font-size: 0.75rem;
877
+ font-weight: 500;
878
+ padding: 4px 8px;
879
+ background: transparent;
880
+ border: none;
881
+ color: var(--te-ink-muted);
882
+ cursor: pointer;
883
+ transition: color 0.15s ease;
884
+ }
885
+
886
+ .template-editor__facet-clear:hover {
887
+ color: var(--te-rose);
888
+ }
889
+
890
+ .template-editor__facet-desc {
891
+ font-size: 0.75rem;
892
+ color: var(--te-ink-muted);
893
+ margin: 0 0 12px;
894
+ }
895
+
896
+ .template-editor__facet-options {
897
+ display: flex;
898
+ flex-direction: column;
899
+ gap: 6px;
900
+ }
901
+
902
+ .template-editor__facet-option {
903
+ display: flex;
904
+ align-items: center;
905
+ gap: 10px;
906
+ padding: 8px 12px;
907
+ font-family: var(--te-font);
908
+ font-size: 0.8125rem;
909
+ color: var(--te-ink-light);
910
+ background: var(--te-surface);
911
+ border: 1.5px solid var(--te-border-light);
912
+ border-radius: 8px;
913
+ cursor: pointer;
914
+ transition: all 0.15s ease;
915
+ }
916
+
917
+ .template-editor__facet-option:hover {
918
+ border-color: var(--te-border);
919
+ background: var(--te-surface);
920
+ }
921
+
922
+ .template-editor__facet-option--selected {
923
+ border-color: var(--te-teal);
924
+ background: var(--te-teal-light);
925
+ color: var(--te-ink);
926
+ }
927
+
928
+ .template-editor__facet-option--selected:hover {
929
+ border-color: var(--te-teal);
930
+ background: var(--te-teal-light);
931
+ }
932
+
933
+ .template-editor__facet-checkbox {
934
+ display: flex;
935
+ align-items: center;
936
+ justify-content: center;
937
+ width: 18px;
938
+ height: 18px;
939
+ border-radius: 4px;
940
+ background: var(--te-surface);
941
+ border: 1.5px solid var(--te-border);
942
+ transition: all 0.15s ease;
943
+ }
944
+
945
+ .template-editor__facet-option--selected .template-editor__facet-checkbox {
946
+ background: var(--te-teal);
947
+ border-color: var(--te-teal);
948
+ }
949
+
950
+ .template-editor__facet-checkbox svg {
951
+ width: 12px;
952
+ height: 12px;
953
+ color: white;
954
+ }
955
+
956
+ /* Responsive */
957
+ @media (max-width: 900px) {
958
+ .template-editor__hero {
959
+ grid-template-columns: 1fr;
960
+ }
961
+
962
+ .template-editor__thumbnail-area {
963
+ flex-direction: row;
964
+ align-items: flex-start;
965
+ }
966
+
967
+ .template-editor__thumbnail {
968
+ width: 120px;
969
+ height: 90px;
970
+ }
971
+
972
+ .template-editor__thumbnail-input {
973
+ flex: 1;
974
+ }
975
+
976
+ .template-editor__grid {
977
+ grid-template-columns: 1fr;
978
+ }
979
+
980
+ .template-editor__metadata {
981
+ grid-template-columns: 1fr;
982
+ }
983
+
984
+ .template-editor__facets-grid {
985
+ grid-template-columns: 1fr;
986
+ }
987
+ }
988
+ `;