@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
@@ -1 +1 @@
1
- {"version":3,"file":"ServicesList.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/ServicesList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,wDAAwD,CAAC;AAShE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA8QrE"}
1
+ {"version":3,"file":"ServicesList.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/ServicesList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,wDAAwD,CAAC;AAOhE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA8QrE"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
3
  import { generateId } from "document-model/core";
4
- import { addService, updateService, deleteService, addFacetBinding, removeFacetBinding, } from "../../../document-models/service-offering/gen/creators.js";
4
+ import { addService, updateService, deleteService, } from "../../../document-models/service-offering/gen/creators.js";
5
5
  export function ServicesList({ document, dispatch }) {
6
6
  const { state } = document;
7
7
  const globalState = state.global;
@@ -1 +1 @@
1
- {"version":3,"file":"TabNavigation.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TabNavigation.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GACb,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,YAAY,CAAC;AAgFjB,UAAU,kBAAkB;IAC1B,SAAS,EAAE,KAAK,CAAC;IACjB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,WAAW,EACX,aAAkB,GACnB,EAAE,kBAAkB,2CAsDpB"}
1
+ {"version":3,"file":"TabNavigation.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TabNavigation.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GACb,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,YAAY,CAAC;AA6EjB,UAAU,kBAAkB;IAC1B,SAAS,EAAE,KAAK,CAAC;IACjB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,WAAW,EACX,aAAkB,GACnB,EAAE,kBAAkB,2CAsDpB"}
@@ -2,9 +2,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  const tabs = [
3
3
  {
4
4
  id: "scope-facets",
5
- label: "Scope & Facets",
6
- accentColor: "violet",
7
- icon: (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("circle", { cx: "12", cy: "8", r: "3" }), _jsx("circle", { cx: "6", cy: "16", r: "3" }), _jsx("circle", { cx: "18", cy: "16", r: "3" }), _jsx("path", { d: "M12 11v2M9 14l-1.5 1M15 14l1.5 1" })] })),
5
+ label: "Resource Template",
6
+ accentColor: "teal",
7
+ icon: (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" }) })),
8
8
  },
9
9
  {
10
10
  id: "tier-definition",
@@ -199,6 +199,20 @@ const styles = `
199
199
  font-weight: 600;
200
200
  }
201
201
 
202
+ .so-tabs__item--active[data-accent="teal"] .so-tabs__icon-ring {
203
+ background: #ccfbf1;
204
+ box-shadow: 0 0 0 4px #f0fdfa, 0 4px 12px rgba(20, 184, 166, 0.25);
205
+ }
206
+
207
+ .so-tabs__item--active[data-accent="teal"] .so-tabs__icon {
208
+ color: #0d9488;
209
+ }
210
+
211
+ .so-tabs__item--active[data-accent="teal"] .so-tabs__label {
212
+ color: #0f766e;
213
+ font-weight: 600;
214
+ }
215
+
202
216
  .so-tabs__item--active[data-accent="emerald"] .so-tabs__icon-ring {
203
217
  background: var(--so-emerald-100);
204
218
  box-shadow: 0 0 0 4px var(--so-emerald-50), 0 4px 12px rgba(16, 185, 129, 0.25);
@@ -1 +1 @@
1
- {"version":3,"file":"TheMatrix.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TheMatrix.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAOtB,MAAM,wDAAwD,CAAC;AAUhE,UAAU,cAAc;IACtB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;AA2uCD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,cAAmB,GACpB,EAAE,cAAc,2CAgsBhB"}
1
+ {"version":3,"file":"TheMatrix.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TheMatrix.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAOtB,MAAM,wDAAwD,CAAC;AAUhE,UAAU,cAAc;IACtB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;AAg0CD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,cAAmB,GACpB,EAAE,cAAc,2CAi+BhB"}
@@ -465,6 +465,12 @@ const matrixStyles = `
465
465
  /* Metric Row */
466
466
  .matrix__metric-row {
467
467
  background: inherit;
468
+ cursor: pointer;
469
+ transition: var(--so-transition-fast);
470
+ }
471
+
472
+ .matrix__metric-row:hover {
473
+ background: rgba(124, 58, 237, 0.08);
468
474
  }
469
475
 
470
476
  .matrix__metric-cell {
@@ -476,6 +482,12 @@ const matrixStyles = `
476
482
  z-index: 10;
477
483
  }
478
484
 
485
+ .matrix__metric-name-wrapper {
486
+ display: flex;
487
+ align-items: center;
488
+ gap: 0.5rem;
489
+ }
490
+
479
491
  .matrix__metric-name {
480
492
  font-family: var(--so-font-sans);
481
493
  font-size: 0.6875rem;
@@ -483,6 +495,47 @@ const matrixStyles = `
483
495
  color: var(--so-slate-500);
484
496
  }
485
497
 
498
+ .matrix__metric-actions {
499
+ display: flex;
500
+ gap: 0.25rem;
501
+ opacity: 0;
502
+ transition: var(--so-transition-fast);
503
+ }
504
+
505
+ .matrix__metric-row:hover .matrix__metric-actions {
506
+ opacity: 1;
507
+ }
508
+
509
+ .matrix__metric-btn {
510
+ padding: 0.125rem;
511
+ background: transparent;
512
+ border: none;
513
+ color: var(--so-slate-400);
514
+ cursor: pointer;
515
+ border-radius: var(--so-radius-sm);
516
+ transition: var(--so-transition-fast);
517
+ display: flex;
518
+ align-items: center;
519
+ justify-content: center;
520
+ }
521
+
522
+ .matrix__metric-btn:hover {
523
+ background: var(--so-slate-200);
524
+ }
525
+
526
+ .matrix__metric-btn--edit:hover {
527
+ color: var(--so-violet-600);
528
+ }
529
+
530
+ .matrix__metric-btn--remove:hover {
531
+ color: var(--so-rose-600);
532
+ }
533
+
534
+ .matrix__metric-btn-icon {
535
+ width: 0.75rem;
536
+ height: 0.75rem;
537
+ }
538
+
486
539
  .matrix__metric-value-cell {
487
540
  padding: 0.375rem 1rem;
488
541
  text-align: center;
@@ -494,6 +547,38 @@ const matrixStyles = `
494
547
  color: var(--so-slate-500);
495
548
  }
496
549
 
550
+ /* Add Metric Button on Service Row */
551
+ .matrix__service-cell-wrapper {
552
+ display: flex;
553
+ align-items: center;
554
+ justify-content: space-between;
555
+ gap: 0.5rem;
556
+ }
557
+
558
+ .matrix__add-metric-btn {
559
+ opacity: 0.6;
560
+ font-family: var(--so-font-sans);
561
+ font-size: 0.6875rem;
562
+ font-weight: 500;
563
+ color: var(--so-violet-600);
564
+ background: transparent;
565
+ border: none;
566
+ cursor: pointer;
567
+ padding: 0.125rem 0.375rem;
568
+ border-radius: var(--so-radius-sm);
569
+ transition: var(--so-transition-fast);
570
+ white-space: nowrap;
571
+ }
572
+
573
+ .matrix__service-row:hover .matrix__add-metric-btn {
574
+ opacity: 1;
575
+ }
576
+
577
+ .matrix__add-metric-btn:hover {
578
+ background: var(--so-violet-100);
579
+ color: var(--so-violet-700);
580
+ }
581
+
497
582
  /* Add Service Row */
498
583
  .matrix__add-service-row td {
499
584
  padding: 0.5rem 1rem;
@@ -1268,6 +1353,11 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
1268
1353
  TEAM_STRUCTURE: "remote-team",
1269
1354
  ANONYMITY: "high-anonymity",
1270
1355
  });
1356
+ // Metric editing modal state
1357
+ const [metricModal, setMetricModal] = useState(null);
1358
+ const [metricName, setMetricName] = useState("");
1359
+ const [metricLimits, setMetricLimits] = useState({});
1360
+ const [metricEnabledTiers, setMetricEnabledTiers] = useState(new Set());
1271
1361
  const getServiceGroup = (service) => {
1272
1362
  // Services now have optionGroupId directly on them
1273
1363
  return service.optionGroupId || null;
@@ -1389,6 +1479,104 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
1389
1479
  setNewServiceDescription("");
1390
1480
  setNewServiceSelectedTiers(new Set());
1391
1481
  };
1482
+ // Metric modal handlers
1483
+ const handleAddMetric = (serviceId) => {
1484
+ setMetricModal({ serviceId, metric: null });
1485
+ setMetricName("");
1486
+ // Initialize limits for all tiers to empty string
1487
+ const initialLimits = {};
1488
+ // For new metrics, enable all tiers by default
1489
+ const allTierIds = new Set();
1490
+ tiers.forEach((tier) => {
1491
+ initialLimits[tier.id] = "";
1492
+ allTierIds.add(tier.id);
1493
+ });
1494
+ setMetricLimits(initialLimits);
1495
+ setMetricEnabledTiers(allTierIds);
1496
+ };
1497
+ const handleEditMetric = (serviceId, metric) => {
1498
+ setMetricModal({ serviceId, metric });
1499
+ setMetricName(metric);
1500
+ // Initialize limits with existing values and track which tiers have this metric
1501
+ const existingLimits = {};
1502
+ const enabledTiers = new Set();
1503
+ tiers.forEach((tier) => {
1504
+ const usageLimit = tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
1505
+ // Load value from either limit (numeric) or notes (string)
1506
+ existingLimits[tier.id] =
1507
+ usageLimit?.limit?.toString() || usageLimit?.notes || "";
1508
+ if (usageLimit) {
1509
+ enabledTiers.add(tier.id);
1510
+ }
1511
+ });
1512
+ setMetricLimits(existingLimits);
1513
+ setMetricEnabledTiers(enabledTiers);
1514
+ };
1515
+ const handleRemoveMetric = (serviceId, metric) => {
1516
+ // Remove this metric from all tiers
1517
+ tiers.forEach((tier) => {
1518
+ const usageLimit = tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
1519
+ if (usageLimit) {
1520
+ dispatch(removeUsageLimit({
1521
+ tierId: tier.id,
1522
+ limitId: usageLimit.id,
1523
+ lastModified: new Date().toISOString(),
1524
+ }));
1525
+ }
1526
+ });
1527
+ };
1528
+ const handleSaveMetric = () => {
1529
+ if (!metricModal || !metricName.trim())
1530
+ return;
1531
+ const { serviceId, metric: originalMetric } = metricModal;
1532
+ const now = new Date().toISOString();
1533
+ tiers.forEach((tier) => {
1534
+ const isEnabled = metricEnabledTiers.has(tier.id);
1535
+ const limitValue = metricLimits[tier.id];
1536
+ const existingLimit = originalMetric
1537
+ ? tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === originalMetric)
1538
+ : null;
1539
+ // Check if value is numeric or string
1540
+ const parsedLimit = limitValue ? parseInt(limitValue, 10) : null;
1541
+ const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
1542
+ if (existingLimit && !isEnabled) {
1543
+ // Remove limit - tier was disabled
1544
+ dispatch(removeUsageLimit({
1545
+ tierId: tier.id,
1546
+ limitId: existingLimit.id,
1547
+ lastModified: now,
1548
+ }));
1549
+ }
1550
+ else if (existingLimit && isEnabled) {
1551
+ // Update existing limit - use limit for numeric values, notes for strings
1552
+ dispatch(updateUsageLimit({
1553
+ tierId: tier.id,
1554
+ limitId: existingLimit.id,
1555
+ metric: metricName.trim(),
1556
+ limit: isNumeric ? parsedLimit : null,
1557
+ notes: !isNumeric && limitValue ? limitValue.trim() : null,
1558
+ lastModified: now,
1559
+ }));
1560
+ }
1561
+ else if (!existingLimit && isEnabled) {
1562
+ // Add new limit - use limit for numeric values, notes for strings
1563
+ dispatch(addUsageLimit({
1564
+ tierId: tier.id,
1565
+ limitId: generateId(),
1566
+ serviceId,
1567
+ metric: metricName.trim(),
1568
+ limit: isNumeric ? parsedLimit : null,
1569
+ notes: !isNumeric && limitValue ? limitValue.trim() : null,
1570
+ resetPeriod: "MONTHLY",
1571
+ lastModified: now,
1572
+ }));
1573
+ }
1574
+ });
1575
+ setMetricModal(null);
1576
+ setMetricName("");
1577
+ setMetricLimits({});
1578
+ setMetricEnabledTiers(new Set());
1579
+ };
1392
1580
  const getLevelDisplay = (serviceLevel) => {
1393
1581
  if (!serviceLevel)
1394
1582
  return { label: "—", color: "var(--so-slate-300)" };
@@ -1425,22 +1613,22 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
1425
1613
  : ""}`, children: _jsxs("div", { className: "matrix__tier-header-inner", children: [_jsx("div", { className: "matrix__tier-radio" }), _jsx("span", { className: "matrix__tier-name", children: tier.name }), _jsx("span", { className: "matrix__tier-price", children: tier.isCustomPricing
1426
1614
  ? "Custom"
1427
1615
  : `$${tier.pricing.amount}/mo` })] }) }, tier.id)))] }) }), _jsxs("tbody", { children: [_jsx("tr", { children: _jsx("td", { colSpan: tiers.length + 1, className: "matrix__section-header", children: "Service Catalog" }) }), (setupGroups.length > 0 ||
1428
- ungroupedSetupServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M19 21V5a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v16" }), _jsx("path", { d: "M9 21v-6h6v6" }), _jsx("path", { d: "M9 7h.01M9 11h.01M15 7h.01M15 11h.01" })] }) }), "Setup & Formation"] }) })), setupGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[group.id], onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx }, group.id))), ungroupedSetupServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
1616
+ ungroupedSetupServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M19 21V5a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v16" }), _jsx("path", { d: "M9 21v-6h6v6" }), _jsx("path", { d: "M9 7h.01M9 11h.01M15 7h.01M15 11h.01" })] }) }), "Setup & Formation"] }) })), setupGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[group.id], onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, group.id))), ungroupedSetupServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
1429
1617
  id: UNGROUPED_ID,
1430
1618
  name: "Setup & Formation",
1431
1619
  description: null,
1432
1620
  isAddOn: false,
1433
1621
  defaultSelected: true,
1434
- }, services: ungroupedSetupServices, tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[UNGROUPED_ID], selectedTierIdx: selectedTierIdx }, "ungrouped-setup")), (regularGroups.length > 0 ||
1435
- ungroupedRegularServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83" }) }) }), "Recurring Services"] }) })), regularGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, dispatch: dispatch }, group.id))), ungroupedRegularServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
1622
+ }, services: ungroupedSetupServices, tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[UNGROUPED_ID], selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, "ungrouped-setup")), (regularGroups.length > 0 ||
1623
+ ungroupedRegularServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83" }) }) }), "Recurring Services"] }) })), regularGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, dispatch: dispatch, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, group.id))), ungroupedRegularServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
1436
1624
  id: UNGROUPED_ID,
1437
1625
  name: "Recurring Services",
1438
1626
  description: null,
1439
1627
  isAddOn: false,
1440
1628
  defaultSelected: true,
1441
- }, services: ungroupedRegularServices, tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, selectedTierIdx: selectedTierIdx }, "ungrouped-regular")), _jsxs("tr", { className: "matrix__total-row", children: [_jsx("td", { children: "SUBTOTAL" }), tiers.map((tier) => (_jsx("td", { style: { textAlign: "center" }, children: tier.isCustomPricing
1629
+ }, services: ungroupedRegularServices, tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, "ungrouped-regular")), _jsxs("tr", { className: "matrix__total-row", children: [_jsx("td", { children: "SUBTOTAL" }), tiers.map((tier) => (_jsx("td", { style: { textAlign: "center" }, children: tier.isCustomPricing
1442
1630
  ? "Custom"
1443
- : `$${tier.pricing.amount}` }, tier.id)))] }), addonGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: true, isEnabled: enabledOptionalGroups.has(group.id), onToggle: () => toggleOptionalGroup(group.id), getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx }, group.id))), _jsxs("tr", { className: "matrix__grand-total-row", children: [_jsx("td", { children: "Grand Total (Recurring)" }), tiers.map((tier, idx) => {
1631
+ : `$${tier.pricing.amount}` }, tier.id)))] }), addonGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: true, isEnabled: enabledOptionalGroups.has(group.id), onToggle: () => toggleOptionalGroup(group.id), getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, group.id))), _jsxs("tr", { className: "matrix__grand-total-row", children: [_jsx("td", { children: "Grand Total (Recurring)" }), tiers.map((tier, idx) => {
1444
1632
  const tierPrice = tier.pricing.amount || 0;
1445
1633
  const grandTotal = tierPrice;
1446
1634
  return (_jsx("td", { className: idx === selectedTierIdx
@@ -1468,9 +1656,67 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
1468
1656
  setNewServiceName("");
1469
1657
  setNewServiceDescription("");
1470
1658
  setNewServiceSelectedTiers(new Set());
1471
- }, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleAddService, disabled: !newServiceName.trim() || newServiceSelectedTiers.size === 0, className: "matrix__modal-btn matrix__modal-btn--primary", children: "Add Service" })] })] }) }))] })] }));
1659
+ }, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleAddService, disabled: !newServiceName.trim() || newServiceSelectedTiers.size === 0, className: "matrix__modal-btn matrix__modal-btn--primary", children: "Add Service" })] })] }) })), metricModal && (_jsx("div", { className: "matrix__modal-overlay", children: _jsxs("div", { className: "matrix__modal matrix__modal--wide", children: [_jsx("h3", { className: "matrix__modal-title", children: metricModal.metric ? "Edit Metric" : "Add Metric" }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Metric Name" }), _jsx("input", { type: "text", value: metricName, onChange: (e) => setMetricName(e.target.value), placeholder: "e.g., API Calls, Storage, Users", className: "matrix__modal-input", autoFocus: true })] }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Pricing Tiers & Values" }), _jsx("p", { className: "matrix__modal-hint", style: { marginBottom: "0.75rem" }, children: "Enable the metric for each tier and set values." }), _jsx("div", { style: {
1660
+ display: "flex",
1661
+ flexDirection: "column",
1662
+ gap: "0.5rem",
1663
+ }, children: tiers.map((tier) => {
1664
+ const isEnabled = metricEnabledTiers.has(tier.id);
1665
+ return (_jsxs("div", { style: {
1666
+ display: "flex",
1667
+ alignItems: "center",
1668
+ gap: "0.75rem",
1669
+ padding: "0.5rem",
1670
+ borderRadius: "6px",
1671
+ background: isEnabled
1672
+ ? "rgba(124, 58, 237, 0.05)"
1673
+ : "#f8fafc",
1674
+ border: isEnabled
1675
+ ? "1px solid rgba(124, 58, 237, 0.2)"
1676
+ : "1px solid #e2e8f0",
1677
+ transition: "all 0.15s ease",
1678
+ }, children: [_jsxs("label", { style: {
1679
+ display: "flex",
1680
+ alignItems: "center",
1681
+ gap: "0.5rem",
1682
+ cursor: "pointer",
1683
+ minWidth: "120px",
1684
+ }, children: [_jsx("input", { type: "checkbox", checked: isEnabled, onChange: (e) => {
1685
+ setMetricEnabledTiers((prev) => {
1686
+ const next = new Set(prev);
1687
+ if (e.target.checked) {
1688
+ next.add(tier.id);
1689
+ }
1690
+ else {
1691
+ next.delete(tier.id);
1692
+ }
1693
+ return next;
1694
+ });
1695
+ }, style: {
1696
+ width: "16px",
1697
+ height: "16px",
1698
+ accentColor: "#7c3aed",
1699
+ cursor: "pointer",
1700
+ } }), _jsx("span", { style: {
1701
+ fontWeight: 600,
1702
+ color: isEnabled ? "#334155" : "#94a3b8",
1703
+ fontSize: "0.875rem",
1704
+ }, children: tier.name })] }), _jsx("input", { type: "text", value: metricLimits[tier.id] || "", onChange: (e) => setMetricLimits((prev) => ({
1705
+ ...prev,
1706
+ [tier.id]: e.target.value,
1707
+ })), placeholder: isEnabled ? "Enter value" : "—", className: "matrix__modal-input", disabled: !isEnabled, style: {
1708
+ flex: 1,
1709
+ opacity: isEnabled ? 1 : 0.5,
1710
+ cursor: isEnabled ? "text" : "not-allowed",
1711
+ } })] }, tier.id));
1712
+ }) })] }), _jsxs("div", { className: "matrix__modal-actions", children: [_jsx("button", { onClick: () => {
1713
+ setMetricModal(null);
1714
+ setMetricName("");
1715
+ setMetricLimits({});
1716
+ setMetricEnabledTiers(new Set());
1717
+ }, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleSaveMetric, disabled: !metricName.trim() || metricEnabledTiers.size === 0, className: "matrix__modal-btn matrix__modal-btn--primary", children: metricModal.metric ? "Save Changes" : "Add Metric" })] })] }) }))] })] }));
1472
1718
  }
1473
- function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptional, isEnabled, onToggle, getServiceLevelForTier, getUniqueMetricsForService, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, setupFee, onAddService, selectedTierIdx, }) {
1719
+ function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptional, isEnabled, onToggle, getServiceLevelForTier, getUniqueMetricsForService, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, setupFee, onAddService, selectedTierIdx, onAddMetric, onEditMetric, onRemoveMetric, }) {
1474
1720
  const showGroup = services.length > 0 || onAddService;
1475
1721
  if (!showGroup)
1476
1722
  return null;
@@ -1492,7 +1738,7 @@ function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptio
1492
1738
  ? "OPTIONAL"
1493
1739
  : "INCLUDED" }) })] }), services.map((service) => {
1494
1740
  const metrics = getUniqueMetricsForService(service.id);
1495
- return (_jsx(ServiceRowWithMetrics, { service: service, metrics: metrics, tiers: tiers, rowClass: rowClass, getServiceLevelForTier: getServiceLevelForTier, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, selectedTierIdx: selectedTierIdx }, service.id));
1741
+ return (_jsx(ServiceRowWithMetrics, { service: service, metrics: metrics, tiers: tiers, rowClass: rowClass, getServiceLevelForTier: getServiceLevelForTier, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, selectedTierIdx: selectedTierIdx, onAddMetric: onAddMetric, onEditMetric: onEditMetric, onRemoveMetric: onRemoveMetric }, service.id));
1496
1742
  }), onAddService && group.id !== "__ungrouped__" && (_jsxs("tr", { className: `matrix__add-service-row ${rowClass}`, children: [_jsx("td", { className: rowClass, children: _jsxs("button", { onClick: () => onAddService(group.id, isSetupFormation), className: "matrix__add-service-btn", children: [_jsx("svg", { className: "matrix__add-service-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }), "+ Add a Service"] }) }), _jsx("td", { colSpan: tiers.length, className: rowClass })] })), isSetupFormation && (_jsxs("tr", { className: "matrix__setup-total-row", children: [_jsx("td", { children: "TOTAL SETUP FEE" }), _jsx("td", { colSpan: tiers.length, style: { textAlign: "center" }, children: setupFee
1497
1743
  ? `$${setupFee} flat fee (applied to all tiers)`
1498
1744
  : "No setup fee configured" })] })), isOptional && (_jsxs("tr", { className: `matrix__total-row ${headerClass}`, children: [_jsx("td", { className: headerClass, children: "SUBTOTAL" }), tiers.map((tier, tierIdx) => {
@@ -1508,8 +1754,11 @@ function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptio
1508
1754
  }, children: isEnabled ? priceDisplay : "$0" }, tier.id));
1509
1755
  })] }))] }));
1510
1756
  }
1511
- function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLevelForTier, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, selectedTierIdx, }) {
1512
- return (_jsxs(_Fragment, { children: [_jsxs("tr", { className: `matrix__service-row ${rowClass}`, children: [_jsx("td", { className: `matrix__service-cell ${rowClass}`, children: _jsx("span", { className: "matrix__service-title", children: service.title }) }), tiers.map((tier, tierIdx) => {
1757
+ function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLevelForTier, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, selectedTierIdx, onAddMetric, onEditMetric, onRemoveMetric, }) {
1758
+ return (_jsxs(_Fragment, { children: [_jsxs("tr", { className: `matrix__service-row ${rowClass}`, children: [_jsx("td", { className: `matrix__service-cell ${rowClass}`, children: _jsxs("div", { className: "matrix__service-cell-wrapper", children: [_jsx("span", { className: "matrix__service-title", children: service.title }), _jsx("button", { onClick: (e) => {
1759
+ e.stopPropagation();
1760
+ onAddMetric(service.id);
1761
+ }, className: "matrix__add-metric-btn", title: "Add metric to this service", children: "+ Metric" })] }) }), tiers.map((tier, tierIdx) => {
1513
1762
  const serviceLevel = getServiceLevelForTier(service.id, tier);
1514
1763
  const display = getLevelDisplay(serviceLevel);
1515
1764
  const isSelected = selectedCell?.serviceId === service.id &&
@@ -1517,14 +1766,20 @@ function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLe
1517
1766
  return (_jsx("td", { className: `matrix__level-cell ${isSelected ? "matrix__level-cell--selected" : ""} ${tierIdx === selectedTierIdx ? "matrix__level-cell--highlight" : ""}`, onClick: () => setSelectedCell(isSelected
1518
1767
  ? null
1519
1768
  : { serviceId: service.id, tierId: tier.id }), children: _jsx("span", { className: "matrix__level-value", style: { color: display.color }, children: display.label }) }, tier.id));
1520
- })] }), metrics.map((metric) => (_jsxs("tr", { className: `matrix__metric-row ${rowClass}`, children: [_jsx("td", { className: `matrix__metric-cell ${rowClass}`, children: _jsx("span", { className: "matrix__metric-name", children: metric }) }), tiers.map((tier, tierIdx) => {
1769
+ })] }), metrics.map((metric) => (_jsxs("tr", { className: `matrix__metric-row ${rowClass}`, onClick: () => onEditMetric(service.id, metric), children: [_jsx("td", { className: `matrix__metric-cell ${rowClass}`, children: _jsxs("div", { className: "matrix__metric-name-wrapper", children: [_jsx("span", { className: "matrix__metric-name", children: metric }), _jsxs("div", { className: "matrix__metric-actions", children: [_jsx("button", { onClick: (e) => {
1770
+ e.stopPropagation();
1771
+ onEditMetric(service.id, metric);
1772
+ }, className: "matrix__metric-btn matrix__metric-btn--edit", title: "Edit metric", children: _jsx("svg", { className: "matrix__metric-btn-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" }) }) }), _jsx("button", { onClick: (e) => {
1773
+ e.stopPropagation();
1774
+ onRemoveMetric(service.id, metric);
1775
+ }, className: "matrix__metric-btn matrix__metric-btn--remove", title: "Remove metric", children: _jsx("svg", { className: "matrix__metric-btn-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" }) }) })] })] }) }), tiers.map((tier, tierIdx) => {
1521
1776
  const usageLimit = getUsageLimitForMetric(service.id, metric, tier);
1522
1777
  return (_jsx("td", { className: `matrix__metric-value-cell ${tierIdx === selectedTierIdx
1523
1778
  ? "matrix__level-cell--highlight"
1524
1779
  : ""}`, children: _jsx("span", { className: "matrix__metric-value", children: usageLimit
1525
1780
  ? usageLimit.limit
1526
1781
  ? `Up to ${usageLimit.limit}`
1527
- : "Unlimited"
1782
+ : usageLimit.notes || "Unlimited"
1528
1783
  : "—" }) }, tier.id));
1529
1784
  })] }, `${service.id}-${metric}`)))] }));
1530
1785
  }
@@ -1601,12 +1856,15 @@ function ServiceLevelDetailPanel({ serviceId, tierId, services, tiers, optionGro
1601
1856
  const handleAddLimit = () => {
1602
1857
  if (!newMetric.trim())
1603
1858
  return;
1859
+ const parsedLimit = newLimit ? parseInt(newLimit, 10) : null;
1860
+ const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
1604
1861
  dispatch(addUsageLimit({
1605
1862
  tierId: tier.id,
1606
1863
  limitId: generateId(),
1607
1864
  serviceId: service.id,
1608
1865
  metric: newMetric.trim(),
1609
- limit: newLimit ? parseInt(newLimit) : undefined,
1866
+ limit: isNumeric ? parsedLimit : undefined,
1867
+ notes: !isNumeric && newLimit ? newLimit.trim() : undefined,
1610
1868
  resetPeriod: "MONTHLY",
1611
1869
  lastModified: new Date().toISOString(),
1612
1870
  }));
@@ -1652,35 +1910,36 @@ function ServiceLevelDetailPanel({ serviceId, tierId, services, tiers, optionGro
1652
1910
  }));
1653
1911
  }
1654
1912
  };
1655
- return (_jsx("div", { ref: overlayRef, className: "matrix__panel-overlay", onClick: handleOverlayClick, role: "dialog", "aria-modal": "true", "aria-labelledby": "panel-title", children: _jsxs("div", { ref: panelRef, className: "matrix__panel", children: [_jsxs("div", { className: "matrix__panel-header", children: [_jsxs("div", { className: "matrix__panel-header-top", children: [_jsxs("span", { className: "matrix__panel-tier", children: [tier.name, " Tier"] }), _jsx("button", { onClick: onClose, className: "matrix__panel-close", children: _jsx("svg", { className: "matrix__panel-close-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsx("h3", { id: "panel-title", className: "matrix__panel-title", children: service.title })] }), _jsxs("div", { className: "matrix__panel-body", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-section-label", children: "Service Level" }), _jsx("div", { className: "matrix__panel-level-grid", children: SERVICE_LEVELS.map((option) => (_jsx("button", { onClick: () => handleSetLevel(option.value), className: `matrix__panel-level-btn ${serviceLevel?.level === option.value
1656
- ? "matrix__panel-level-btn--active"
1657
- : ""}`, children: option.label }, option.value))) })] }), serviceLevel?.level === "CUSTOM" && (_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-section-label", children: "Custom Value" }), _jsx("input", { type: "text", value: customValue, onChange: (e) => setCustomValue(e.target.value), onBlur: handleUpdateCustomValue, placeholder: "e.g., Expedited, Basic, Pro", className: "matrix__panel-input" })] })), _jsxs("div", { children: [_jsxs("div", { className: "matrix__panel-limits-header", children: [_jsx("label", { className: "matrix__panel-section-label", style: { marginBottom: 0 }, children: "Usage Limits / Metrics" }), _jsx("button", { onClick: () => setIsAddingMetric(true), className: "matrix__panel-add-btn", children: "+ Add Metric" })] }), usageLimits.map((limit) => (_jsx(MetricLimitItem, { limit: limit, tierId: tier.id, dispatch: dispatch, onRemove: () => handleRemoveLimit(limit.id) }, limit.id))), usageLimits.length === 0 && !isAddingMetric && (_jsx("p", { className: "matrix__panel-empty-text", children: "No metrics added yet. Metrics will appear as nested rows under this service in the matrix." })), isAddingMetric && (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: newMetric, onChange: (e) => setNewMetric(e.target.value), placeholder: "e.g., API Calls, Storage, Users", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Limit Value" }), _jsx("input", { type: "text", value: newLimit, onChange: (e) => setNewLimit(e.target.value), placeholder: "e.g., 100, 5, leave empty for Unlimited", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Enter a number or leave empty for \"Unlimited\"" })] }), _jsxs("div", { className: "matrix__panel-edit-actions", children: [_jsx("button", { onClick: handleAddLimit, disabled: !newMetric.trim(), className: "matrix__panel-edit-btn matrix__panel-edit-btn--primary", children: "Add Metric" }), _jsx("button", { onClick: () => {
1658
- setNewMetric("");
1659
- setNewLimit("");
1660
- setIsAddingMetric(false);
1661
- }, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }))] })] }), _jsx("div", { className: "matrix__panel-footer", children: _jsx("button", { onClick: onClose, className: "matrix__panel-done-btn", children: "Done" }) })] }) }));
1913
+ return (_jsx("div", { ref: overlayRef, className: "matrix__panel-overlay", onClick: handleOverlayClick, role: "dialog", "aria-modal": "true", "aria-labelledby": "panel-title", children: _jsxs("div", { ref: panelRef, className: "matrix__panel", children: [_jsxs("div", { className: "matrix__panel-header", children: [_jsxs("div", { className: "matrix__panel-header-top", children: [_jsxs("span", { className: "matrix__panel-tier", children: [tier.name, " Tier"] }), _jsx("button", { onClick: onClose, className: "matrix__panel-close", children: _jsx("svg", { className: "matrix__panel-close-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsx("h3", { id: "panel-title", className: "matrix__panel-title", children: service.title })] }), _jsx("div", { className: "matrix__panel-body", children: _jsxs("div", { children: [_jsxs("div", { className: "matrix__panel-limits-header", children: [_jsx("label", { className: "matrix__panel-section-label", style: { marginBottom: 0 }, children: "Metrics" }), _jsx("button", { onClick: () => setIsAddingMetric(true), className: "matrix__panel-add-btn", children: "+ Add Metric" })] }), usageLimits.map((limit) => (_jsx(MetricLimitItem, { limit: limit, tierId: tier.id, dispatch: dispatch, onRemove: () => handleRemoveLimit(limit.id) }, limit.id))), usageLimits.length === 0 && !isAddingMetric && (_jsx("p", { className: "matrix__panel-empty-text", children: "No metrics added yet. Metrics will appear as nested rows under this service in the matrix." })), isAddingMetric && (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: newMetric, onChange: (e) => setNewMetric(e.target.value), placeholder: "e.g., API Calls, Storage, Users", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Value" }), _jsx("input", { type: "text", value: newLimit, onChange: (e) => setNewLimit(e.target.value), placeholder: "e.g., 100, Unlimited, Custom", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Enter a value or leave empty" })] }), _jsxs("div", { className: "matrix__panel-edit-actions", children: [_jsx("button", { onClick: handleAddLimit, disabled: !newMetric.trim(), className: "matrix__panel-edit-btn matrix__panel-edit-btn--primary", children: "Add Metric" }), _jsx("button", { onClick: () => {
1914
+ setNewMetric("");
1915
+ setNewLimit("");
1916
+ setIsAddingMetric(false);
1917
+ }, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }))] }) }), _jsx("div", { className: "matrix__panel-footer", children: _jsx("button", { onClick: onClose, className: "matrix__panel-done-btn", children: "Done" }) })] }) }));
1662
1918
  }
1663
1919
  function MetricLimitItem({ limit, tierId, dispatch, onRemove, }) {
1664
1920
  const [isEditing, setIsEditing] = useState(false);
1665
1921
  const [editMetric, setEditMetric] = useState(limit.metric);
1666
- const [editLimit, setEditLimit] = useState(limit.limit?.toString() || "");
1922
+ const [editLimit, setEditLimit] = useState(limit.limit?.toString() || limit.notes || "");
1667
1923
  const handleSave = () => {
1924
+ const parsedLimit = editLimit ? parseInt(editLimit, 10) : null;
1925
+ const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
1668
1926
  dispatch(updateUsageLimit({
1669
1927
  tierId,
1670
1928
  limitId: limit.id,
1671
1929
  metric: editMetric.trim() || limit.metric,
1672
- limit: editLimit ? parseInt(editLimit) : undefined,
1930
+ limit: isNumeric ? parsedLimit : undefined,
1931
+ notes: !isNumeric && editLimit ? editLimit.trim() : undefined,
1673
1932
  lastModified: new Date().toISOString(),
1674
1933
  }));
1675
1934
  setIsEditing(false);
1676
1935
  };
1677
1936
  const handleCancel = () => {
1678
1937
  setEditMetric(limit.metric);
1679
- setEditLimit(limit.limit?.toString() || "");
1938
+ setEditLimit(limit.limit?.toString() || limit.notes || "");
1680
1939
  setIsEditing(false);
1681
1940
  };
1682
1941
  if (isEditing) {
1683
- return (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: editMetric, onChange: (e) => setEditMetric(e.target.value), placeholder: "Metric name", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Limit Value" }), _jsx("input", { type: "text", value: editLimit, onChange: (e) => setEditLimit(e.target.value), placeholder: "e.g., 3, Unlimited, As needed", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Can be numeric (3) or descriptive (Unlimited, Custom)" })] }), _jsxs("div", { className: "matrix__panel-edit-actions", children: [_jsx("button", { onClick: handleSave, className: "matrix__panel-edit-btn matrix__panel-edit-btn--primary", children: "Save" }), _jsx("button", { onClick: handleCancel, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }));
1942
+ return (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: editMetric, onChange: (e) => setEditMetric(e.target.value), placeholder: "Metric name", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Value" }), _jsx("input", { type: "text", value: editLimit, onChange: (e) => setEditLimit(e.target.value), placeholder: "e.g., 100, Unlimited, Custom", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Enter a value or leave empty" })] }), _jsxs("div", { className: "matrix__panel-edit-actions", children: [_jsx("button", { onClick: handleSave, className: "matrix__panel-edit-btn matrix__panel-edit-btn--primary", children: "Save" }), _jsx("button", { onClick: handleCancel, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }));
1684
1943
  }
1685
- return (_jsxs("div", { className: "matrix__panel-limit-item", children: [_jsxs("div", { className: "matrix__panel-limit-content", onClick: () => setIsEditing(true), children: [_jsx("div", { className: "matrix__panel-limit-metric", children: limit.metric }), _jsx("div", { className: "matrix__panel-limit-value", children: limit.limit ? `Up to ${limit.limit}` : "Unlimited" })] }), _jsxs("div", { className: "matrix__panel-limit-actions", children: [_jsx("button", { onClick: () => setIsEditing(true), className: "matrix__panel-limit-btn matrix__panel-limit-btn--edit", title: "Edit metric", children: _jsx("svg", { className: "matrix__panel-limit-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" }) }) }), _jsx("button", { onClick: onRemove, className: "matrix__panel-limit-btn matrix__panel-limit-btn--remove", title: "Remove metric", children: _jsx("svg", { className: "matrix__panel-limit-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] })] }));
1944
+ return (_jsxs("div", { className: "matrix__panel-limit-item", children: [_jsxs("div", { className: "matrix__panel-limit-content", onClick: () => setIsEditing(true), children: [_jsx("div", { className: "matrix__panel-limit-metric", children: limit.metric }), _jsx("div", { className: "matrix__panel-limit-value", children: limit.limit ?? limit.notes ?? "" })] }), _jsxs("div", { className: "matrix__panel-limit-actions", children: [_jsx("button", { onClick: () => setIsEditing(true), className: "matrix__panel-limit-btn matrix__panel-limit-btn--edit", title: "Edit metric", children: _jsx("svg", { className: "matrix__panel-limit-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" }) }) }), _jsx("button", { onClick: onRemove, className: "matrix__panel-limit-btn matrix__panel-limit-btn--remove", title: "Remove metric", children: _jsx("svg", { className: "matrix__panel-limit-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] })] }));
1686
1945
  }
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/service-offering-editor/editor.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,qBAAqB,4CAqF5C"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/service-offering-editor/editor.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,qBAAqB,4CAuF5C"}
@@ -3,7 +3,7 @@ import { useState } from "react";
3
3
  import { DocumentToolbar } from "@powerhousedao/design-system/connect";
4
4
  import { useSelectedServiceOfferingDocument } from "../../document-models/service-offering/hooks.js";
5
5
  import { TabNavigation } from "./components/TabNavigation.js";
6
- import { ScopeAndFacets } from "./components/ScopeAndFacets.js";
6
+ import { ResourceTemplateSelector } from "./components/ResourceTemplateSelector.js";
7
7
  import { ServiceCatalog, } from "./components/ServiceCatalog.js";
8
8
  import { TierDefinition } from "./components/TierDefinition.js";
9
9
  import { TheMatrix } from "./components/TheMatrix.js";
@@ -25,7 +25,7 @@ export default function ServiceOfferingEditor() {
25
25
  const renderTabContent = () => {
26
26
  switch (activeTab) {
27
27
  case "scope-facets":
28
- return _jsx(ScopeAndFacets, { document: document, dispatch: dispatch });
28
+ return (_jsx(ResourceTemplateSelector, { document: document, dispatch: dispatch }));
29
29
  case "service-catalog":
30
30
  return (_jsx(ServiceCatalog, { document: document, dispatch: dispatch, groupMetadata: groupMetadata, setGroupMetadata: setGroupMetadata }));
31
31
  case "tier-definition":
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Manifest } from "document-model";
2
2
  export declare const manifest: Manifest;
3
- export declare const documentModels: (import("document-model").DocumentModelModule<import("./document-models/account-transactions/index.js").AccountTransactionsPHState> | import("document-model").DocumentModelModule<import("./document-models/accounts/index.js").AccountsPHState> | import("document-model").DocumentModelModule<import("./document-models/billing-statement/index.js").BillingStatementPHState> | import("document-model").DocumentModelModule<import("./document-models/expense-report/index.js").ExpenseReportPHState> | import("document-model").DocumentModelModule<import("./document-models/invoice/index.js").InvoicePHState> | import("document-model").DocumentModelModule<import("./document-models/snapshot-report/index.js").SnapshotReportPHState> | import("document-model").DocumentModelModule<import("./document-models/service-subscriptions/index.js").ServiceSubscriptionsPHState> | import("document-model").DocumentModelModule<import("./document-models/service-offering/index.js").ServiceOfferingPHState>)[];
3
+ export declare const documentModels: (import("document-model").DocumentModelModule<import("./document-models/account-transactions/index.js").AccountTransactionsPHState> | import("document-model").DocumentModelModule<import("./document-models/accounts/index.js").AccountsPHState> | import("document-model").DocumentModelModule<import("./document-models/billing-statement/index.js").BillingStatementPHState> | import("document-model").DocumentModelModule<import("./document-models/expense-report/index.js").ExpenseReportPHState> | import("document-model").DocumentModelModule<import("./document-models/invoice/index.js").InvoicePHState> | import("document-model").DocumentModelModule<import("./document-models/snapshot-report/index.js").SnapshotReportPHState> | import("document-model").DocumentModelModule<import("./document-models/service-subscriptions/index.js").ServiceSubscriptionsPHState> | import("document-model").DocumentModelModule<import("./document-models/service-offering/index.js").ServiceOfferingPHState> | import("document-model").DocumentModelModule<import("./document-models/resource-template/index.js").ResourceTemplatePHState>)[];
4
4
  export declare const editors: import("document-model").EditorModule[];
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,eAAO,MAAM,QAAQ,EAAE,QAAuB,CAAC;AAC/C,eAAO,MAAM,cAAc,y9BAAuC,CAAC;AACnE,eAAO,MAAM,OAAO,yCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,eAAO,MAAM,QAAQ,EAAE,QAAuB,CAAC;AAC/C,eAAO,MAAM,cAAc,wlCAAuC,CAAC;AACnE,eAAO,MAAM,OAAO,yCAAgC,CAAC"}