@powerhousedao/service-offering 0.0.1

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 (1100) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +179 -0
  3. package/dist/document-models/document-models.d.ts +3 -0
  4. package/dist/document-models/document-models.d.ts.map +1 -0
  5. package/dist/document-models/document-models.js +14 -0
  6. package/dist/document-models/facet/actions.d.ts +18 -0
  7. package/dist/document-models/facet/actions.d.ts.map +1 -0
  8. package/dist/document-models/facet/actions.js +8 -0
  9. package/dist/document-models/facet/gen/actions.d.ts +6 -0
  10. package/dist/document-models/facet/gen/actions.d.ts.map +1 -0
  11. package/dist/document-models/facet/gen/actions.js +2 -0
  12. package/dist/document-models/facet/gen/creators.d.ts +5 -0
  13. package/dist/document-models/facet/gen/creators.d.ts.map +1 -0
  14. package/dist/document-models/facet/gen/creators.js +4 -0
  15. package/dist/document-models/facet/gen/document-model.d.ts +3 -0
  16. package/dist/document-models/facet/gen/document-model.d.ts.map +1 -0
  17. package/dist/document-models/facet/gen/document-model.js +134 -0
  18. package/dist/document-models/facet/gen/document-schema.d.ts +56 -0
  19. package/dist/document-models/facet/gen/document-schema.d.ts.map +1 -0
  20. package/dist/document-models/facet/gen/document-schema.js +33 -0
  21. package/dist/document-models/facet/gen/document-type.d.ts +2 -0
  22. package/dist/document-models/facet/gen/document-type.d.ts.map +1 -0
  23. package/dist/document-models/facet/gen/document-type.js +1 -0
  24. package/dist/document-models/facet/gen/facet-management/actions.d.ts +12 -0
  25. package/dist/document-models/facet/gen/facet-management/actions.d.ts.map +1 -0
  26. package/dist/document-models/facet/gen/facet-management/actions.js +1 -0
  27. package/dist/document-models/facet/gen/facet-management/creators.d.ts +5 -0
  28. package/dist/document-models/facet/gen/facet-management/creators.d.ts.map +1 -0
  29. package/dist/document-models/facet/gen/facet-management/creators.js +4 -0
  30. package/dist/document-models/facet/gen/facet-management/error.d.ts +2 -0
  31. package/dist/document-models/facet/gen/facet-management/error.d.ts.map +1 -0
  32. package/dist/document-models/facet/gen/facet-management/error.js +1 -0
  33. package/dist/document-models/facet/gen/facet-management/operations.d.ts +8 -0
  34. package/dist/document-models/facet/gen/facet-management/operations.d.ts.map +1 -0
  35. package/dist/document-models/facet/gen/facet-management/operations.js +1 -0
  36. package/dist/document-models/facet/gen/index.d.ts +13 -0
  37. package/dist/document-models/facet/gen/index.d.ts.map +1 -0
  38. package/dist/document-models/facet/gen/index.js +12 -0
  39. package/dist/document-models/facet/gen/option-management/actions.d.ts +20 -0
  40. package/dist/document-models/facet/gen/option-management/actions.d.ts.map +1 -0
  41. package/dist/document-models/facet/gen/option-management/actions.js +1 -0
  42. package/dist/document-models/facet/gen/option-management/creators.d.ts +7 -0
  43. package/dist/document-models/facet/gen/option-management/creators.d.ts.map +1 -0
  44. package/dist/document-models/facet/gen/option-management/creators.js +6 -0
  45. package/dist/document-models/facet/gen/option-management/error.d.ts +28 -0
  46. package/dist/document-models/facet/gen/option-management/error.d.ts.map +1 -0
  47. package/dist/document-models/facet/gen/option-management/error.js +23 -0
  48. package/dist/document-models/facet/gen/option-management/operations.d.ts +10 -0
  49. package/dist/document-models/facet/gen/option-management/operations.d.ts.map +1 -0
  50. package/dist/document-models/facet/gen/option-management/operations.js +1 -0
  51. package/dist/document-models/facet/gen/ph-factories.d.ts +23 -0
  52. package/dist/document-models/facet/gen/ph-factories.d.ts.map +1 -0
  53. package/dist/document-models/facet/gen/ph-factories.js +51 -0
  54. package/dist/document-models/facet/gen/reducer.d.ts +3 -0
  55. package/dist/document-models/facet/gen/reducer.d.ts.map +1 -0
  56. package/dist/document-models/facet/gen/reducer.js +44 -0
  57. package/dist/document-models/facet/gen/schema/index.d.ts +3 -0
  58. package/dist/document-models/facet/gen/schema/index.d.ts.map +1 -0
  59. package/dist/document-models/facet/gen/schema/index.js +2 -0
  60. package/dist/document-models/facet/gen/schema/types.d.ts +195 -0
  61. package/dist/document-models/facet/gen/schema/types.d.ts.map +1 -0
  62. package/dist/document-models/facet/gen/schema/types.js +1 -0
  63. package/dist/document-models/facet/gen/schema/zod.d.ts +18 -0
  64. package/dist/document-models/facet/gen/schema/zod.d.ts.map +1 -0
  65. package/dist/document-models/facet/gen/schema/zod.js +69 -0
  66. package/dist/document-models/facet/gen/types.d.ts +12 -0
  67. package/dist/document-models/facet/gen/types.d.ts.map +1 -0
  68. package/dist/document-models/facet/gen/types.js +1 -0
  69. package/dist/document-models/facet/gen/utils.d.ts +15 -0
  70. package/dist/document-models/facet/gen/utils.d.ts.map +1 -0
  71. package/dist/document-models/facet/gen/utils.js +55 -0
  72. package/dist/document-models/facet/hooks.d.ts +14 -0
  73. package/dist/document-models/facet/hooks.d.ts.map +1 -0
  74. package/dist/document-models/facet/hooks.js +25 -0
  75. package/dist/document-models/facet/index.d.ts +6 -0
  76. package/dist/document-models/facet/index.d.ts.map +1 -0
  77. package/dist/document-models/facet/index.js +5 -0
  78. package/dist/document-models/facet/module.d.ts +5 -0
  79. package/dist/document-models/facet/module.d.ts.map +1 -0
  80. package/dist/document-models/facet/module.js +11 -0
  81. package/dist/document-models/facet/src/index.d.ts +2 -0
  82. package/dist/document-models/facet/src/index.d.ts.map +1 -0
  83. package/dist/document-models/facet/src/index.js +1 -0
  84. package/dist/document-models/facet/src/reducers/facet-management.d.ts +3 -0
  85. package/dist/document-models/facet/src/reducers/facet-management.d.ts.map +1 -0
  86. package/dist/document-models/facet/src/reducers/facet-management.js +10 -0
  87. package/dist/document-models/facet/src/reducers/index.d.ts +3 -0
  88. package/dist/document-models/facet/src/reducers/index.d.ts.map +1 -0
  89. package/dist/document-models/facet/src/reducers/index.js +2 -0
  90. package/dist/document-models/facet/src/reducers/option-management.d.ts +3 -0
  91. package/dist/document-models/facet/src/reducers/option-management.d.ts.map +1 -0
  92. package/dist/document-models/facet/src/reducers/option-management.js +56 -0
  93. package/dist/document-models/facet/src/tests/document-model.test.d.ts +10 -0
  94. package/dist/document-models/facet/src/tests/document-model.test.d.ts.map +1 -0
  95. package/dist/document-models/facet/src/tests/document-model.test.js +104 -0
  96. package/dist/document-models/facet/src/tests/facet-management.test.d.ts +6 -0
  97. package/dist/document-models/facet/src/tests/facet-management.test.d.ts.map +1 -0
  98. package/dist/document-models/facet/src/tests/facet-management.test.js +29 -0
  99. package/dist/document-models/facet/src/tests/option-management.test.d.ts +6 -0
  100. package/dist/document-models/facet/src/tests/option-management.test.d.ts.map +1 -0
  101. package/dist/document-models/facet/src/tests/option-management.test.js +49 -0
  102. package/dist/document-models/facet/src/utils.d.ts +2 -0
  103. package/dist/document-models/facet/src/utils.d.ts.map +1 -0
  104. package/dist/document-models/facet/src/utils.js +1 -0
  105. package/dist/document-models/facet/tests/document-model.test.d.ts +10 -0
  106. package/dist/document-models/facet/tests/document-model.test.d.ts.map +1 -0
  107. package/dist/document-models/facet/tests/document-model.test.js +104 -0
  108. package/dist/document-models/facet/tests/facet-management.test.d.ts +2 -0
  109. package/dist/document-models/facet/tests/facet-management.test.d.ts.map +1 -0
  110. package/dist/document-models/facet/tests/facet-management.test.js +25 -0
  111. package/dist/document-models/facet/tests/option-management.test.d.ts +2 -0
  112. package/dist/document-models/facet/tests/option-management.test.d.ts.map +1 -0
  113. package/dist/document-models/facet/tests/option-management.test.js +45 -0
  114. package/dist/document-models/facet/utils.d.ts +14 -0
  115. package/dist/document-models/facet/utils.d.ts.map +1 -0
  116. package/dist/document-models/facet/utils.js +7 -0
  117. package/dist/document-models/index.d.ts +7 -0
  118. package/dist/document-models/index.d.ts.map +1 -0
  119. package/dist/document-models/index.js +6 -0
  120. package/dist/document-models/resource-instance/actions.d.ts +31 -0
  121. package/dist/document-models/resource-instance/actions.d.ts.map +1 -0
  122. package/dist/document-models/resource-instance/actions.js +8 -0
  123. package/dist/document-models/resource-instance/gen/actions.d.ts +6 -0
  124. package/dist/document-models/resource-instance/gen/actions.d.ts.map +1 -0
  125. package/dist/document-models/resource-instance/gen/actions.js +2 -0
  126. package/dist/document-models/resource-instance/gen/configuration-management/actions.d.ts +20 -0
  127. package/dist/document-models/resource-instance/gen/configuration-management/actions.d.ts.map +1 -0
  128. package/dist/document-models/resource-instance/gen/configuration-management/actions.js +1 -0
  129. package/dist/document-models/resource-instance/gen/configuration-management/creators.d.ts +7 -0
  130. package/dist/document-models/resource-instance/gen/configuration-management/creators.d.ts.map +1 -0
  131. package/dist/document-models/resource-instance/gen/configuration-management/creators.js +6 -0
  132. package/dist/document-models/resource-instance/gen/configuration-management/error.d.ts +35 -0
  133. package/dist/document-models/resource-instance/gen/configuration-management/error.d.ts.map +1 -0
  134. package/dist/document-models/resource-instance/gen/configuration-management/error.js +32 -0
  135. package/dist/document-models/resource-instance/gen/configuration-management/operations.d.ts +10 -0
  136. package/dist/document-models/resource-instance/gen/configuration-management/operations.d.ts.map +1 -0
  137. package/dist/document-models/resource-instance/gen/configuration-management/operations.js +1 -0
  138. package/dist/document-models/resource-instance/gen/creators.d.ts +5 -0
  139. package/dist/document-models/resource-instance/gen/creators.d.ts.map +1 -0
  140. package/dist/document-models/resource-instance/gen/creators.js +4 -0
  141. package/dist/document-models/resource-instance/gen/document-model.d.ts +3 -0
  142. package/dist/document-models/resource-instance/gen/document-model.d.ts.map +1 -0
  143. package/dist/document-models/resource-instance/gen/document-model.js +394 -0
  144. package/dist/document-models/resource-instance/gen/document-schema.d.ts +104 -0
  145. package/dist/document-models/resource-instance/gen/document-schema.d.ts.map +1 -0
  146. package/dist/document-models/resource-instance/gen/document-schema.js +33 -0
  147. package/dist/document-models/resource-instance/gen/document-type.d.ts +2 -0
  148. package/dist/document-models/resource-instance/gen/document-type.d.ts.map +1 -0
  149. package/dist/document-models/resource-instance/gen/document-type.js +1 -0
  150. package/dist/document-models/resource-instance/gen/index.d.ts +13 -0
  151. package/dist/document-models/resource-instance/gen/index.d.ts.map +1 -0
  152. package/dist/document-models/resource-instance/gen/index.js +12 -0
  153. package/dist/document-models/resource-instance/gen/instance-management/actions.d.ts +64 -0
  154. package/dist/document-models/resource-instance/gen/instance-management/actions.d.ts.map +1 -0
  155. package/dist/document-models/resource-instance/gen/instance-management/actions.js +1 -0
  156. package/dist/document-models/resource-instance/gen/instance-management/creators.d.ts +18 -0
  157. package/dist/document-models/resource-instance/gen/instance-management/creators.d.ts.map +1 -0
  158. package/dist/document-models/resource-instance/gen/instance-management/creators.js +17 -0
  159. package/dist/document-models/resource-instance/gen/instance-management/error.d.ts +99 -0
  160. package/dist/document-models/resource-instance/gen/instance-management/error.d.ts.map +1 -0
  161. package/dist/document-models/resource-instance/gen/instance-management/error.js +112 -0
  162. package/dist/document-models/resource-instance/gen/instance-management/operations.d.ts +21 -0
  163. package/dist/document-models/resource-instance/gen/instance-management/operations.d.ts.map +1 -0
  164. package/dist/document-models/resource-instance/gen/instance-management/operations.js +1 -0
  165. package/dist/document-models/resource-instance/gen/ph-factories.d.ts +23 -0
  166. package/dist/document-models/resource-instance/gen/ph-factories.d.ts.map +1 -0
  167. package/dist/document-models/resource-instance/gen/ph-factories.js +67 -0
  168. package/dist/document-models/resource-instance/gen/reducer.d.ts +3 -0
  169. package/dist/document-models/resource-instance/gen/reducer.d.ts.map +1 -0
  170. package/dist/document-models/resource-instance/gen/reducer.js +109 -0
  171. package/dist/document-models/resource-instance/gen/schema/index.d.ts +3 -0
  172. package/dist/document-models/resource-instance/gen/schema/index.d.ts.map +1 -0
  173. package/dist/document-models/resource-instance/gen/schema/index.js +2 -0
  174. package/dist/document-models/resource-instance/gen/schema/types.d.ts +269 -0
  175. package/dist/document-models/resource-instance/gen/schema/types.d.ts.map +1 -0
  176. package/dist/document-models/resource-instance/gen/schema/types.js +1 -0
  177. package/dist/document-models/resource-instance/gen/schema/zod.d.ts +44 -0
  178. package/dist/document-models/resource-instance/gen/schema/zod.d.ts.map +1 -0
  179. package/dist/document-models/resource-instance/gen/schema/zod.js +184 -0
  180. package/dist/document-models/resource-instance/gen/types.d.ts +12 -0
  181. package/dist/document-models/resource-instance/gen/types.d.ts.map +1 -0
  182. package/dist/document-models/resource-instance/gen/types.js +1 -0
  183. package/dist/document-models/resource-instance/gen/utils.d.ts +15 -0
  184. package/dist/document-models/resource-instance/gen/utils.d.ts.map +1 -0
  185. package/dist/document-models/resource-instance/gen/utils.js +71 -0
  186. package/dist/document-models/resource-instance/hooks.d.ts +14 -0
  187. package/dist/document-models/resource-instance/hooks.d.ts.map +1 -0
  188. package/dist/document-models/resource-instance/hooks.js +25 -0
  189. package/dist/document-models/resource-instance/index.d.ts +6 -0
  190. package/dist/document-models/resource-instance/index.d.ts.map +1 -0
  191. package/dist/document-models/resource-instance/index.js +5 -0
  192. package/dist/document-models/resource-instance/module.d.ts +5 -0
  193. package/dist/document-models/resource-instance/module.d.ts.map +1 -0
  194. package/dist/document-models/resource-instance/module.js +11 -0
  195. package/dist/document-models/resource-instance/src/index.d.ts +2 -0
  196. package/dist/document-models/resource-instance/src/index.d.ts.map +1 -0
  197. package/dist/document-models/resource-instance/src/index.js +1 -0
  198. package/dist/document-models/resource-instance/src/reducers/configuration-management.d.ts +3 -0
  199. package/dist/document-models/resource-instance/src/reducers/configuration-management.d.ts.map +1 -0
  200. package/dist/document-models/resource-instance/src/reducers/configuration-management.js +73 -0
  201. package/dist/document-models/resource-instance/src/reducers/instance-management.d.ts +3 -0
  202. package/dist/document-models/resource-instance/src/reducers/instance-management.d.ts.map +1 -0
  203. package/dist/document-models/resource-instance/src/reducers/instance-management.js +109 -0
  204. package/dist/document-models/resource-instance/src/reducers/usage-tracking.d.ts +2 -0
  205. package/dist/document-models/resource-instance/src/reducers/usage-tracking.d.ts.map +1 -0
  206. package/dist/document-models/resource-instance/src/reducers/usage-tracking.js +4 -0
  207. package/dist/document-models/resource-instance/src/tests/configuration-management.test.d.ts +6 -0
  208. package/dist/document-models/resource-instance/src/tests/configuration-management.test.d.ts.map +1 -0
  209. package/dist/document-models/resource-instance/src/tests/configuration-management.test.js +49 -0
  210. package/dist/document-models/resource-instance/src/tests/document-model.test.d.ts +10 -0
  211. package/dist/document-models/resource-instance/src/tests/document-model.test.d.ts.map +1 -0
  212. package/dist/document-models/resource-instance/src/tests/document-model.test.js +104 -0
  213. package/dist/document-models/resource-instance/src/tests/instance-management.test.d.ts +6 -0
  214. package/dist/document-models/resource-instance/src/tests/instance-management.test.d.ts.map +1 -0
  215. package/dist/document-models/resource-instance/src/tests/instance-management.test.js +59 -0
  216. package/dist/document-models/resource-instance/src/tests/usage-tracking.test.d.ts +6 -0
  217. package/dist/document-models/resource-instance/src/tests/usage-tracking.test.d.ts.map +1 -0
  218. package/dist/document-models/resource-instance/src/tests/usage-tracking.test.js +10 -0
  219. package/dist/document-models/resource-instance/src/utils.d.ts +2 -0
  220. package/dist/document-models/resource-instance/src/utils.d.ts.map +1 -0
  221. package/dist/document-models/resource-instance/src/utils.js +1 -0
  222. package/dist/document-models/resource-instance/tests/configuration-management.test.d.ts +2 -0
  223. package/dist/document-models/resource-instance/tests/configuration-management.test.d.ts.map +1 -0
  224. package/dist/document-models/resource-instance/tests/configuration-management.test.js +45 -0
  225. package/dist/document-models/resource-instance/tests/document-model.test.d.ts +10 -0
  226. package/dist/document-models/resource-instance/tests/document-model.test.d.ts.map +1 -0
  227. package/dist/document-models/resource-instance/tests/document-model.test.js +104 -0
  228. package/dist/document-models/resource-instance/tests/instance-management.test.d.ts +2 -0
  229. package/dist/document-models/resource-instance/tests/instance-management.test.d.ts.map +1 -0
  230. package/dist/document-models/resource-instance/tests/instance-management.test.js +155 -0
  231. package/dist/document-models/resource-instance/tests/usage-tracking.test.d.ts +2 -0
  232. package/dist/document-models/resource-instance/tests/usage-tracking.test.d.ts.map +1 -0
  233. package/dist/document-models/resource-instance/tests/usage-tracking.test.js +6 -0
  234. package/dist/document-models/resource-instance/utils.d.ts +14 -0
  235. package/dist/document-models/resource-instance/utils.d.ts.map +1 -0
  236. package/dist/document-models/resource-instance/utils.js +7 -0
  237. package/dist/document-models/resource-template/actions.d.ts +40 -0
  238. package/dist/document-models/resource-template/actions.d.ts.map +1 -0
  239. package/dist/document-models/resource-template/actions.js +13 -0
  240. package/dist/document-models/resource-template/gen/actions.d.ts +16 -0
  241. package/dist/document-models/resource-template/gen/actions.d.ts.map +1 -0
  242. package/dist/document-models/resource-template/gen/actions.js +7 -0
  243. package/dist/document-models/resource-template/gen/audience-management/actions.d.ts +12 -0
  244. package/dist/document-models/resource-template/gen/audience-management/actions.d.ts.map +1 -0
  245. package/dist/document-models/resource-template/gen/audience-management/actions.js +1 -0
  246. package/dist/document-models/resource-template/gen/audience-management/creators.d.ts +5 -0
  247. package/dist/document-models/resource-template/gen/audience-management/creators.d.ts.map +1 -0
  248. package/dist/document-models/resource-template/gen/audience-management/creators.js +4 -0
  249. package/dist/document-models/resource-template/gen/audience-management/error.d.ts +21 -0
  250. package/dist/document-models/resource-template/gen/audience-management/error.d.ts.map +1 -0
  251. package/dist/document-models/resource-template/gen/audience-management/error.js +16 -0
  252. package/dist/document-models/resource-template/gen/audience-management/operations.d.ts +8 -0
  253. package/dist/document-models/resource-template/gen/audience-management/operations.d.ts.map +1 -0
  254. package/dist/document-models/resource-template/gen/audience-management/operations.js +1 -0
  255. package/dist/document-models/resource-template/gen/content-section-management/actions.d.ts +20 -0
  256. package/dist/document-models/resource-template/gen/content-section-management/actions.d.ts.map +1 -0
  257. package/dist/document-models/resource-template/gen/content-section-management/actions.js +1 -0
  258. package/dist/document-models/resource-template/gen/content-section-management/creators.d.ts +7 -0
  259. package/dist/document-models/resource-template/gen/content-section-management/creators.d.ts.map +1 -0
  260. package/dist/document-models/resource-template/gen/content-section-management/creators.js +6 -0
  261. package/dist/document-models/resource-template/gen/content-section-management/error.d.ts +2 -0
  262. package/dist/document-models/resource-template/gen/content-section-management/error.d.ts.map +1 -0
  263. package/dist/document-models/resource-template/gen/content-section-management/error.js +1 -0
  264. package/dist/document-models/resource-template/gen/content-section-management/operations.d.ts +10 -0
  265. package/dist/document-models/resource-template/gen/content-section-management/operations.d.ts.map +1 -0
  266. package/dist/document-models/resource-template/gen/content-section-management/operations.js +1 -0
  267. package/dist/document-models/resource-template/gen/creators.d.ts +15 -0
  268. package/dist/document-models/resource-template/gen/creators.d.ts.map +1 -0
  269. package/dist/document-models/resource-template/gen/creators.js +14 -0
  270. package/dist/document-models/resource-template/gen/document-model.d.ts +3 -0
  271. package/dist/document-models/resource-template/gen/document-model.d.ts.map +1 -0
  272. package/dist/document-models/resource-template/gen/document-model.js +505 -0
  273. package/dist/document-models/resource-template/gen/document-schema.d.ts +92 -0
  274. package/dist/document-models/resource-template/gen/document-schema.d.ts.map +1 -0
  275. package/dist/document-models/resource-template/gen/document-schema.js +33 -0
  276. package/dist/document-models/resource-template/gen/document-type.d.ts +2 -0
  277. package/dist/document-models/resource-template/gen/document-type.d.ts.map +1 -0
  278. package/dist/document-models/resource-template/gen/document-type.js +1 -0
  279. package/dist/document-models/resource-template/gen/facet-targeting/actions.d.ts +20 -0
  280. package/dist/document-models/resource-template/gen/facet-targeting/actions.d.ts.map +1 -0
  281. package/dist/document-models/resource-template/gen/facet-targeting/actions.js +1 -0
  282. package/dist/document-models/resource-template/gen/facet-targeting/creators.d.ts +7 -0
  283. package/dist/document-models/resource-template/gen/facet-targeting/creators.d.ts.map +1 -0
  284. package/dist/document-models/resource-template/gen/facet-targeting/creators.js +6 -0
  285. package/dist/document-models/resource-template/gen/facet-targeting/error.d.ts +28 -0
  286. package/dist/document-models/resource-template/gen/facet-targeting/error.d.ts.map +1 -0
  287. package/dist/document-models/resource-template/gen/facet-targeting/error.js +23 -0
  288. package/dist/document-models/resource-template/gen/facet-targeting/operations.d.ts +10 -0
  289. package/dist/document-models/resource-template/gen/facet-targeting/operations.d.ts.map +1 -0
  290. package/dist/document-models/resource-template/gen/facet-targeting/operations.js +1 -0
  291. package/dist/document-models/resource-template/gen/index.d.ts +18 -0
  292. package/dist/document-models/resource-template/gen/index.d.ts.map +1 -0
  293. package/dist/document-models/resource-template/gen/index.js +17 -0
  294. package/dist/document-models/resource-template/gen/option-group-management/actions.d.ts +32 -0
  295. package/dist/document-models/resource-template/gen/option-group-management/actions.d.ts.map +1 -0
  296. package/dist/document-models/resource-template/gen/option-group-management/actions.js +1 -0
  297. package/dist/document-models/resource-template/gen/option-group-management/creators.d.ts +10 -0
  298. package/dist/document-models/resource-template/gen/option-group-management/creators.d.ts.map +1 -0
  299. package/dist/document-models/resource-template/gen/option-group-management/creators.js +9 -0
  300. package/dist/document-models/resource-template/gen/option-group-management/error.d.ts +28 -0
  301. package/dist/document-models/resource-template/gen/option-group-management/error.d.ts.map +1 -0
  302. package/dist/document-models/resource-template/gen/option-group-management/error.js +23 -0
  303. package/dist/document-models/resource-template/gen/option-group-management/operations.d.ts +13 -0
  304. package/dist/document-models/resource-template/gen/option-group-management/operations.d.ts.map +1 -0
  305. package/dist/document-models/resource-template/gen/option-group-management/operations.js +1 -0
  306. package/dist/document-models/resource-template/gen/ph-factories.d.ts +23 -0
  307. package/dist/document-models/resource-template/gen/ph-factories.d.ts.map +1 -0
  308. package/dist/document-models/resource-template/gen/ph-factories.js +63 -0
  309. package/dist/document-models/resource-template/gen/reducer.d.ts +3 -0
  310. package/dist/document-models/resource-template/gen/reducer.d.ts.map +1 -0
  311. package/dist/document-models/resource-template/gen/reducer.js +159 -0
  312. package/dist/document-models/resource-template/gen/schema/index.d.ts +3 -0
  313. package/dist/document-models/resource-template/gen/schema/index.d.ts.map +1 -0
  314. package/dist/document-models/resource-template/gen/schema/index.js +2 -0
  315. package/dist/document-models/resource-template/gen/schema/types.d.ts +371 -0
  316. package/dist/document-models/resource-template/gen/schema/types.d.ts.map +1 -0
  317. package/dist/document-models/resource-template/gen/schema/types.js +1 -0
  318. package/dist/document-models/resource-template/gen/schema/zod.d.ts +52 -0
  319. package/dist/document-models/resource-template/gen/schema/zod.d.ts.map +1 -0
  320. package/dist/document-models/resource-template/gen/schema/zod.js +312 -0
  321. package/dist/document-models/resource-template/gen/service-category-management/actions.d.ts +12 -0
  322. package/dist/document-models/resource-template/gen/service-category-management/actions.d.ts.map +1 -0
  323. package/dist/document-models/resource-template/gen/service-category-management/actions.js +1 -0
  324. package/dist/document-models/resource-template/gen/service-category-management/creators.d.ts +5 -0
  325. package/dist/document-models/resource-template/gen/service-category-management/creators.d.ts.map +1 -0
  326. package/dist/document-models/resource-template/gen/service-category-management/creators.js +4 -0
  327. package/dist/document-models/resource-template/gen/service-category-management/error.d.ts +2 -0
  328. package/dist/document-models/resource-template/gen/service-category-management/error.d.ts.map +1 -0
  329. package/dist/document-models/resource-template/gen/service-category-management/error.js +1 -0
  330. package/dist/document-models/resource-template/gen/service-category-management/operations.d.ts +8 -0
  331. package/dist/document-models/resource-template/gen/service-category-management/operations.d.ts.map +1 -0
  332. package/dist/document-models/resource-template/gen/service-category-management/operations.js +1 -0
  333. package/dist/document-models/resource-template/gen/service-management/actions.d.ts +24 -0
  334. package/dist/document-models/resource-template/gen/service-management/actions.d.ts.map +1 -0
  335. package/dist/document-models/resource-template/gen/service-management/actions.js +1 -0
  336. package/dist/document-models/resource-template/gen/service-management/creators.d.ts +8 -0
  337. package/dist/document-models/resource-template/gen/service-management/creators.d.ts.map +1 -0
  338. package/dist/document-models/resource-template/gen/service-management/creators.js +7 -0
  339. package/dist/document-models/resource-template/gen/service-management/error.d.ts +52 -0
  340. package/dist/document-models/resource-template/gen/service-management/error.d.ts.map +1 -0
  341. package/dist/document-models/resource-template/gen/service-management/error.js +49 -0
  342. package/dist/document-models/resource-template/gen/service-management/operations.d.ts +11 -0
  343. package/dist/document-models/resource-template/gen/service-management/operations.d.ts.map +1 -0
  344. package/dist/document-models/resource-template/gen/service-management/operations.js +1 -0
  345. package/dist/document-models/resource-template/gen/template-management/actions.d.ts +20 -0
  346. package/dist/document-models/resource-template/gen/template-management/actions.d.ts.map +1 -0
  347. package/dist/document-models/resource-template/gen/template-management/actions.js +1 -0
  348. package/dist/document-models/resource-template/gen/template-management/creators.d.ts +7 -0
  349. package/dist/document-models/resource-template/gen/template-management/creators.d.ts.map +1 -0
  350. package/dist/document-models/resource-template/gen/template-management/creators.js +6 -0
  351. package/dist/document-models/resource-template/gen/template-management/error.d.ts +2 -0
  352. package/dist/document-models/resource-template/gen/template-management/error.d.ts.map +1 -0
  353. package/dist/document-models/resource-template/gen/template-management/error.js +1 -0
  354. package/dist/document-models/resource-template/gen/template-management/operations.d.ts +10 -0
  355. package/dist/document-models/resource-template/gen/template-management/operations.d.ts.map +1 -0
  356. package/dist/document-models/resource-template/gen/template-management/operations.js +1 -0
  357. package/dist/document-models/resource-template/gen/types.d.ts +12 -0
  358. package/dist/document-models/resource-template/gen/types.d.ts.map +1 -0
  359. package/dist/document-models/resource-template/gen/types.js +1 -0
  360. package/dist/document-models/resource-template/gen/utils.d.ts +15 -0
  361. package/dist/document-models/resource-template/gen/utils.d.ts.map +1 -0
  362. package/dist/document-models/resource-template/gen/utils.js +67 -0
  363. package/dist/document-models/resource-template/hooks.d.ts +14 -0
  364. package/dist/document-models/resource-template/hooks.d.ts.map +1 -0
  365. package/dist/document-models/resource-template/hooks.js +26 -0
  366. package/dist/document-models/resource-template/index.d.ts +6 -0
  367. package/dist/document-models/resource-template/index.d.ts.map +1 -0
  368. package/dist/document-models/resource-template/index.js +5 -0
  369. package/dist/document-models/resource-template/module.d.ts +5 -0
  370. package/dist/document-models/resource-template/module.d.ts.map +1 -0
  371. package/dist/document-models/resource-template/module.js +11 -0
  372. package/dist/document-models/resource-template/src/index.d.ts +2 -0
  373. package/dist/document-models/resource-template/src/index.d.ts.map +1 -0
  374. package/dist/document-models/resource-template/src/index.js +1 -0
  375. package/dist/document-models/resource-template/src/reducers/audience-management.d.ts +3 -0
  376. package/dist/document-models/resource-template/src/reducers/audience-management.d.ts.map +1 -0
  377. package/dist/document-models/resource-template/src/reducers/audience-management.js +17 -0
  378. package/dist/document-models/resource-template/src/reducers/content-section-management.d.ts +3 -0
  379. package/dist/document-models/resource-template/src/reducers/content-section-management.d.ts.map +1 -0
  380. package/dist/document-models/resource-template/src/reducers/content-section-management.js +44 -0
  381. package/dist/document-models/resource-template/src/reducers/facet-preset-management.d.ts +59 -0
  382. package/dist/document-models/resource-template/src/reducers/facet-preset-management.d.ts.map +1 -0
  383. package/dist/document-models/resource-template/src/reducers/facet-preset-management.js +52 -0
  384. package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts +3 -0
  385. package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts.map +1 -0
  386. package/dist/document-models/resource-template/src/reducers/facet-targeting.js +47 -0
  387. package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts +3 -0
  388. package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts.map +1 -0
  389. package/dist/document-models/resource-template/src/reducers/option-group-management.js +85 -0
  390. package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts +3 -0
  391. package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts.map +1 -0
  392. package/dist/document-models/resource-template/src/reducers/service-category-management.js +10 -0
  393. package/dist/document-models/resource-template/src/reducers/service-management.d.ts +3 -0
  394. package/dist/document-models/resource-template/src/reducers/service-management.d.ts.map +1 -0
  395. package/dist/document-models/resource-template/src/reducers/service-management.js +71 -0
  396. package/dist/document-models/resource-template/src/reducers/template-management.d.ts +3 -0
  397. package/dist/document-models/resource-template/src/reducers/template-management.d.ts.map +1 -0
  398. package/dist/document-models/resource-template/src/reducers/template-management.js +32 -0
  399. package/dist/document-models/resource-template/src/tests/audience-management.test.d.ts +6 -0
  400. package/dist/document-models/resource-template/src/tests/audience-management.test.d.ts.map +1 -0
  401. package/dist/document-models/resource-template/src/tests/audience-management.test.js +29 -0
  402. package/dist/document-models/resource-template/src/tests/document-model.test.d.ts +10 -0
  403. package/dist/document-models/resource-template/src/tests/document-model.test.d.ts.map +1 -0
  404. package/dist/document-models/resource-template/src/tests/document-model.test.js +104 -0
  405. package/dist/document-models/resource-template/src/tests/facet-targeting.test.d.ts +6 -0
  406. package/dist/document-models/resource-template/src/tests/facet-targeting.test.d.ts.map +1 -0
  407. package/dist/document-models/resource-template/src/tests/facet-targeting.test.js +49 -0
  408. package/dist/document-models/resource-template/src/tests/option-group-management.test.d.ts +6 -0
  409. package/dist/document-models/resource-template/src/tests/option-group-management.test.d.ts.map +1 -0
  410. package/dist/document-models/resource-template/src/tests/option-group-management.test.js +39 -0
  411. package/dist/document-models/resource-template/src/tests/service-category-management.test.d.ts +6 -0
  412. package/dist/document-models/resource-template/src/tests/service-category-management.test.d.ts.map +1 -0
  413. package/dist/document-models/resource-template/src/tests/service-category-management.test.js +29 -0
  414. package/dist/document-models/resource-template/src/tests/service-management.test.d.ts +6 -0
  415. package/dist/document-models/resource-template/src/tests/service-management.test.d.ts.map +1 -0
  416. package/dist/document-models/resource-template/src/tests/service-management.test.js +59 -0
  417. package/dist/document-models/resource-template/src/tests/template-management.test.d.ts +6 -0
  418. package/dist/document-models/resource-template/src/tests/template-management.test.d.ts.map +1 -0
  419. package/dist/document-models/resource-template/src/tests/template-management.test.js +49 -0
  420. package/dist/document-models/resource-template/src/utils.d.ts +2 -0
  421. package/dist/document-models/resource-template/src/utils.d.ts.map +1 -0
  422. package/dist/document-models/resource-template/src/utils.js +1 -0
  423. package/dist/document-models/resource-template/tests/audience-management.test.d.ts +2 -0
  424. package/dist/document-models/resource-template/tests/audience-management.test.d.ts.map +1 -0
  425. package/dist/document-models/resource-template/tests/audience-management.test.js +25 -0
  426. package/dist/document-models/resource-template/tests/content-section-management.test.d.ts +2 -0
  427. package/dist/document-models/resource-template/tests/content-section-management.test.d.ts.map +1 -0
  428. package/dist/document-models/resource-template/tests/content-section-management.test.js +45 -0
  429. package/dist/document-models/resource-template/tests/document-model.test.d.ts +10 -0
  430. package/dist/document-models/resource-template/tests/document-model.test.d.ts.map +1 -0
  431. package/dist/document-models/resource-template/tests/document-model.test.js +104 -0
  432. package/dist/document-models/resource-template/tests/facet-targeting.test.d.ts +2 -0
  433. package/dist/document-models/resource-template/tests/facet-targeting.test.d.ts.map +1 -0
  434. package/dist/document-models/resource-template/tests/facet-targeting.test.js +45 -0
  435. package/dist/document-models/resource-template/tests/option-group-management.test.d.ts +2 -0
  436. package/dist/document-models/resource-template/tests/option-group-management.test.d.ts.map +1 -0
  437. package/dist/document-models/resource-template/tests/option-group-management.test.js +75 -0
  438. package/dist/document-models/resource-template/tests/service-category-management.test.d.ts +2 -0
  439. package/dist/document-models/resource-template/tests/service-category-management.test.d.ts.map +1 -0
  440. package/dist/document-models/resource-template/tests/service-category-management.test.js +25 -0
  441. package/dist/document-models/resource-template/tests/service-management.test.d.ts +2 -0
  442. package/dist/document-models/resource-template/tests/service-management.test.d.ts.map +1 -0
  443. package/dist/document-models/resource-template/tests/service-management.test.js +55 -0
  444. package/dist/document-models/resource-template/tests/template-management.test.d.ts +2 -0
  445. package/dist/document-models/resource-template/tests/template-management.test.d.ts.map +1 -0
  446. package/dist/document-models/resource-template/tests/template-management.test.js +45 -0
  447. package/dist/document-models/resource-template/utils.d.ts +14 -0
  448. package/dist/document-models/resource-template/utils.d.ts.map +1 -0
  449. package/dist/document-models/resource-template/utils.js +7 -0
  450. package/dist/document-models/service-offering/actions.d.ts +49 -0
  451. package/dist/document-models/service-offering/actions.d.ts.map +1 -0
  452. package/dist/document-models/service-offering/actions.js +11 -0
  453. package/dist/document-models/service-offering/gen/actions.d.ts +12 -0
  454. package/dist/document-models/service-offering/gen/actions.d.ts.map +1 -0
  455. package/dist/document-models/service-offering/gen/actions.js +5 -0
  456. package/dist/document-models/service-offering/gen/creators.d.ts +11 -0
  457. package/dist/document-models/service-offering/gen/creators.d.ts.map +1 -0
  458. package/dist/document-models/service-offering/gen/creators.js +10 -0
  459. package/dist/document-models/service-offering/gen/document-model.d.ts +3 -0
  460. package/dist/document-models/service-offering/gen/document-model.d.ts.map +1 -0
  461. package/dist/document-models/service-offering/gen/document-model.js +797 -0
  462. package/dist/document-models/service-offering/gen/document-schema.d.ts +89 -0
  463. package/dist/document-models/service-offering/gen/document-schema.d.ts.map +1 -0
  464. package/dist/document-models/service-offering/gen/document-schema.js +33 -0
  465. package/dist/document-models/service-offering/gen/document-type.d.ts +2 -0
  466. package/dist/document-models/service-offering/gen/document-type.d.ts.map +1 -0
  467. package/dist/document-models/service-offering/gen/document-type.js +1 -0
  468. package/dist/document-models/service-offering/gen/index.d.ts +16 -0
  469. package/dist/document-models/service-offering/gen/index.d.ts.map +1 -0
  470. package/dist/document-models/service-offering/gen/index.js +15 -0
  471. package/dist/document-models/service-offering/gen/offering-management/actions.d.ts +52 -0
  472. package/dist/document-models/service-offering/gen/offering-management/actions.d.ts.map +1 -0
  473. package/dist/document-models/service-offering/gen/offering-management/actions.js +1 -0
  474. package/dist/document-models/service-offering/gen/offering-management/creators.d.ts +15 -0
  475. package/dist/document-models/service-offering/gen/offering-management/creators.d.ts.map +1 -0
  476. package/dist/document-models/service-offering/gen/offering-management/creators.js +14 -0
  477. package/dist/document-models/service-offering/gen/offering-management/error.d.ts +54 -0
  478. package/dist/document-models/service-offering/gen/offering-management/error.d.ts.map +1 -0
  479. package/dist/document-models/service-offering/gen/offering-management/error.js +50 -0
  480. package/dist/document-models/service-offering/gen/offering-management/operations.d.ts +18 -0
  481. package/dist/document-models/service-offering/gen/offering-management/operations.d.ts.map +1 -0
  482. package/dist/document-models/service-offering/gen/offering-management/operations.js +1 -0
  483. package/dist/document-models/service-offering/gen/option-group-management/actions.d.ts +16 -0
  484. package/dist/document-models/service-offering/gen/option-group-management/actions.d.ts.map +1 -0
  485. package/dist/document-models/service-offering/gen/option-group-management/actions.js +1 -0
  486. package/dist/document-models/service-offering/gen/option-group-management/creators.d.ts +6 -0
  487. package/dist/document-models/service-offering/gen/option-group-management/creators.d.ts.map +1 -0
  488. package/dist/document-models/service-offering/gen/option-group-management/creators.js +5 -0
  489. package/dist/document-models/service-offering/gen/option-group-management/error.d.ts +28 -0
  490. package/dist/document-models/service-offering/gen/option-group-management/error.d.ts.map +1 -0
  491. package/dist/document-models/service-offering/gen/option-group-management/error.js +23 -0
  492. package/dist/document-models/service-offering/gen/option-group-management/operations.d.ts +9 -0
  493. package/dist/document-models/service-offering/gen/option-group-management/operations.d.ts.map +1 -0
  494. package/dist/document-models/service-offering/gen/option-group-management/operations.js +1 -0
  495. package/dist/document-models/service-offering/gen/ph-factories.d.ts +23 -0
  496. package/dist/document-models/service-offering/gen/ph-factories.d.ts.map +1 -0
  497. package/dist/document-models/service-offering/gen/ph-factories.js +62 -0
  498. package/dist/document-models/service-offering/gen/reducer.d.ts +3 -0
  499. package/dist/document-models/service-offering/gen/reducer.d.ts.map +1 -0
  500. package/dist/document-models/service-offering/gen/reducer.js +202 -0
  501. package/dist/document-models/service-offering/gen/schema/index.d.ts +3 -0
  502. package/dist/document-models/service-offering/gen/schema/index.d.ts.map +1 -0
  503. package/dist/document-models/service-offering/gen/schema/index.js +2 -0
  504. package/dist/document-models/service-offering/gen/schema/types.d.ts +516 -0
  505. package/dist/document-models/service-offering/gen/schema/types.d.ts.map +1 -0
  506. package/dist/document-models/service-offering/gen/schema/types.js +1 -0
  507. package/dist/document-models/service-offering/gen/schema/zod.d.ts +93 -0
  508. package/dist/document-models/service-offering/gen/schema/zod.d.ts.map +1 -0
  509. package/dist/document-models/service-offering/gen/schema/zod.js +500 -0
  510. package/dist/document-models/service-offering/gen/service-group-management/actions.d.ts +20 -0
  511. package/dist/document-models/service-offering/gen/service-group-management/actions.d.ts.map +1 -0
  512. package/dist/document-models/service-offering/gen/service-group-management/actions.js +1 -0
  513. package/dist/document-models/service-offering/gen/service-group-management/creators.d.ts +7 -0
  514. package/dist/document-models/service-offering/gen/service-group-management/creators.d.ts.map +1 -0
  515. package/dist/document-models/service-offering/gen/service-group-management/creators.js +6 -0
  516. package/dist/document-models/service-offering/gen/service-group-management/error.d.ts +35 -0
  517. package/dist/document-models/service-offering/gen/service-group-management/error.d.ts.map +1 -0
  518. package/dist/document-models/service-offering/gen/service-group-management/error.js +30 -0
  519. package/dist/document-models/service-offering/gen/service-group-management/operations.d.ts +10 -0
  520. package/dist/document-models/service-offering/gen/service-group-management/operations.d.ts.map +1 -0
  521. package/dist/document-models/service-offering/gen/service-group-management/operations.js +1 -0
  522. package/dist/document-models/service-offering/gen/service-management/actions.d.ts +24 -0
  523. package/dist/document-models/service-offering/gen/service-management/actions.d.ts.map +1 -0
  524. package/dist/document-models/service-offering/gen/service-management/actions.js +1 -0
  525. package/dist/document-models/service-offering/gen/service-management/creators.d.ts +8 -0
  526. package/dist/document-models/service-offering/gen/service-management/creators.d.ts.map +1 -0
  527. package/dist/document-models/service-offering/gen/service-management/creators.js +7 -0
  528. package/dist/document-models/service-offering/gen/service-management/error.d.ts +52 -0
  529. package/dist/document-models/service-offering/gen/service-management/error.d.ts.map +1 -0
  530. package/dist/document-models/service-offering/gen/service-management/error.js +49 -0
  531. package/dist/document-models/service-offering/gen/service-management/operations.d.ts +11 -0
  532. package/dist/document-models/service-offering/gen/service-management/operations.d.ts.map +1 -0
  533. package/dist/document-models/service-offering/gen/service-management/operations.js +1 -0
  534. package/dist/document-models/service-offering/gen/tier-management/actions.d.ts +56 -0
  535. package/dist/document-models/service-offering/gen/tier-management/actions.d.ts.map +1 -0
  536. package/dist/document-models/service-offering/gen/tier-management/actions.js +1 -0
  537. package/dist/document-models/service-offering/gen/tier-management/creators.d.ts +16 -0
  538. package/dist/document-models/service-offering/gen/tier-management/creators.d.ts.map +1 -0
  539. package/dist/document-models/service-offering/gen/tier-management/creators.js +15 -0
  540. package/dist/document-models/service-offering/gen/tier-management/error.d.ts +138 -0
  541. package/dist/document-models/service-offering/gen/tier-management/error.d.ts.map +1 -0
  542. package/dist/document-models/service-offering/gen/tier-management/error.js +162 -0
  543. package/dist/document-models/service-offering/gen/tier-management/operations.d.ts +19 -0
  544. package/dist/document-models/service-offering/gen/tier-management/operations.d.ts.map +1 -0
  545. package/dist/document-models/service-offering/gen/tier-management/operations.js +1 -0
  546. package/dist/document-models/service-offering/gen/types.d.ts +12 -0
  547. package/dist/document-models/service-offering/gen/types.d.ts.map +1 -0
  548. package/dist/document-models/service-offering/gen/types.js +1 -0
  549. package/dist/document-models/service-offering/gen/utils.d.ts +15 -0
  550. package/dist/document-models/service-offering/gen/utils.d.ts.map +1 -0
  551. package/dist/document-models/service-offering/gen/utils.js +66 -0
  552. package/dist/document-models/service-offering/hooks.d.ts +14 -0
  553. package/dist/document-models/service-offering/hooks.d.ts.map +1 -0
  554. package/dist/document-models/service-offering/hooks.js +25 -0
  555. package/dist/document-models/service-offering/index.d.ts +6 -0
  556. package/dist/document-models/service-offering/index.d.ts.map +1 -0
  557. package/dist/document-models/service-offering/index.js +5 -0
  558. package/dist/document-models/service-offering/module.d.ts +5 -0
  559. package/dist/document-models/service-offering/module.d.ts.map +1 -0
  560. package/dist/document-models/service-offering/module.js +11 -0
  561. package/dist/document-models/service-offering/src/index.d.ts +2 -0
  562. package/dist/document-models/service-offering/src/index.d.ts.map +1 -0
  563. package/dist/document-models/service-offering/src/index.js +1 -0
  564. package/dist/document-models/service-offering/src/reducers/offering-management.d.ts +3 -0
  565. package/dist/document-models/service-offering/src/reducers/offering-management.d.ts.map +1 -0
  566. package/dist/document-models/service-offering/src/reducers/offering-management.js +110 -0
  567. package/dist/document-models/service-offering/src/reducers/option-group-management.d.ts +3 -0
  568. package/dist/document-models/service-offering/src/reducers/option-group-management.d.ts.map +1 -0
  569. package/dist/document-models/service-offering/src/reducers/option-group-management.js +63 -0
  570. package/dist/document-models/service-offering/src/reducers/service-group-management.d.ts +3 -0
  571. package/dist/document-models/service-offering/src/reducers/service-group-management.d.ts.map +1 -0
  572. package/dist/document-models/service-offering/src/reducers/service-group-management.js +63 -0
  573. package/dist/document-models/service-offering/src/reducers/service-management.d.ts +3 -0
  574. package/dist/document-models/service-offering/src/reducers/service-management.d.ts.map +1 -0
  575. package/dist/document-models/service-offering/src/reducers/service-management.js +86 -0
  576. package/dist/document-models/service-offering/src/reducers/tier-management.d.ts +3 -0
  577. package/dist/document-models/service-offering/src/reducers/tier-management.d.ts.map +1 -0
  578. package/dist/document-models/service-offering/src/reducers/tier-management.js +216 -0
  579. package/dist/document-models/service-offering/src/tests/document-model.test.d.ts +10 -0
  580. package/dist/document-models/service-offering/src/tests/document-model.test.d.ts.map +1 -0
  581. package/dist/document-models/service-offering/src/tests/document-model.test.js +104 -0
  582. package/dist/document-models/service-offering/src/tests/offering-management.test.d.ts +6 -0
  583. package/dist/document-models/service-offering/src/tests/offering-management.test.d.ts.map +1 -0
  584. package/dist/document-models/service-offering/src/tests/offering-management.test.js +49 -0
  585. package/dist/document-models/service-offering/src/tests/option-group-management.test.d.ts +6 -0
  586. package/dist/document-models/service-offering/src/tests/option-group-management.test.d.ts.map +1 -0
  587. package/dist/document-models/service-offering/src/tests/option-group-management.test.js +39 -0
  588. package/dist/document-models/service-offering/src/tests/service-management.test.d.ts +6 -0
  589. package/dist/document-models/service-offering/src/tests/service-management.test.d.ts.map +1 -0
  590. package/dist/document-models/service-offering/src/tests/service-management.test.js +59 -0
  591. package/dist/document-models/service-offering/src/tests/tier-management.test.d.ts +6 -0
  592. package/dist/document-models/service-offering/src/tests/tier-management.test.d.ts.map +1 -0
  593. package/dist/document-models/service-offering/src/tests/tier-management.test.js +109 -0
  594. package/dist/document-models/service-offering/src/utils.d.ts +2 -0
  595. package/dist/document-models/service-offering/src/utils.d.ts.map +1 -0
  596. package/dist/document-models/service-offering/src/utils.js +1 -0
  597. package/dist/document-models/service-offering/tests/document-model.test.d.ts +10 -0
  598. package/dist/document-models/service-offering/tests/document-model.test.d.ts.map +1 -0
  599. package/dist/document-models/service-offering/tests/document-model.test.js +104 -0
  600. package/dist/document-models/service-offering/tests/offering-management.test.d.ts +2 -0
  601. package/dist/document-models/service-offering/tests/offering-management.test.d.ts.map +1 -0
  602. package/dist/document-models/service-offering/tests/offering-management.test.js +125 -0
  603. package/dist/document-models/service-offering/tests/option-group-management.test.d.ts +2 -0
  604. package/dist/document-models/service-offering/tests/option-group-management.test.d.ts.map +1 -0
  605. package/dist/document-models/service-offering/tests/option-group-management.test.js +35 -0
  606. package/dist/document-models/service-offering/tests/service-group-management.test.d.ts +2 -0
  607. package/dist/document-models/service-offering/tests/service-group-management.test.d.ts.map +1 -0
  608. package/dist/document-models/service-offering/tests/service-group-management.test.js +45 -0
  609. package/dist/document-models/service-offering/tests/service-management.test.d.ts +2 -0
  610. package/dist/document-models/service-offering/tests/service-management.test.d.ts.map +1 -0
  611. package/dist/document-models/service-offering/tests/service-management.test.js +55 -0
  612. package/dist/document-models/service-offering/tests/tier-management.test.d.ts +2 -0
  613. package/dist/document-models/service-offering/tests/tier-management.test.d.ts.map +1 -0
  614. package/dist/document-models/service-offering/tests/tier-management.test.js +135 -0
  615. package/dist/document-models/service-offering/utils.d.ts +14 -0
  616. package/dist/document-models/service-offering/utils.d.ts.map +1 -0
  617. package/dist/document-models/service-offering/utils.js +7 -0
  618. package/dist/document-models/service-subscription/actions.d.ts +24 -0
  619. package/dist/document-models/service-subscription/actions.d.ts.map +1 -0
  620. package/dist/document-models/service-subscription/actions.js +11 -0
  621. package/dist/document-models/service-subscription/gen/actions.d.ts +12 -0
  622. package/dist/document-models/service-subscription/gen/actions.d.ts.map +1 -0
  623. package/dist/document-models/service-subscription/gen/actions.js +5 -0
  624. package/dist/document-models/service-subscription/gen/add-on-management/actions.d.ts +12 -0
  625. package/dist/document-models/service-subscription/gen/add-on-management/actions.d.ts.map +1 -0
  626. package/dist/document-models/service-subscription/gen/add-on-management/actions.js +1 -0
  627. package/dist/document-models/service-subscription/gen/add-on-management/creators.d.ts +5 -0
  628. package/dist/document-models/service-subscription/gen/add-on-management/creators.d.ts.map +1 -0
  629. package/dist/document-models/service-subscription/gen/add-on-management/creators.js +4 -0
  630. package/dist/document-models/service-subscription/gen/add-on-management/error.d.ts +21 -0
  631. package/dist/document-models/service-subscription/gen/add-on-management/error.d.ts.map +1 -0
  632. package/dist/document-models/service-subscription/gen/add-on-management/error.js +16 -0
  633. package/dist/document-models/service-subscription/gen/add-on-management/operations.d.ts +8 -0
  634. package/dist/document-models/service-subscription/gen/add-on-management/operations.d.ts.map +1 -0
  635. package/dist/document-models/service-subscription/gen/add-on-management/operations.js +1 -0
  636. package/dist/document-models/service-subscription/gen/billing-projection/actions.d.ts +12 -0
  637. package/dist/document-models/service-subscription/gen/billing-projection/actions.d.ts.map +1 -0
  638. package/dist/document-models/service-subscription/gen/billing-projection/actions.js +1 -0
  639. package/dist/document-models/service-subscription/gen/billing-projection/creators.d.ts +5 -0
  640. package/dist/document-models/service-subscription/gen/billing-projection/creators.d.ts.map +1 -0
  641. package/dist/document-models/service-subscription/gen/billing-projection/creators.js +4 -0
  642. package/dist/document-models/service-subscription/gen/billing-projection/error.d.ts +2 -0
  643. package/dist/document-models/service-subscription/gen/billing-projection/error.d.ts.map +1 -0
  644. package/dist/document-models/service-subscription/gen/billing-projection/error.js +1 -0
  645. package/dist/document-models/service-subscription/gen/billing-projection/operations.d.ts +8 -0
  646. package/dist/document-models/service-subscription/gen/billing-projection/operations.d.ts.map +1 -0
  647. package/dist/document-models/service-subscription/gen/billing-projection/operations.js +1 -0
  648. package/dist/document-models/service-subscription/gen/creators.d.ts +11 -0
  649. package/dist/document-models/service-subscription/gen/creators.d.ts.map +1 -0
  650. package/dist/document-models/service-subscription/gen/creators.js +10 -0
  651. package/dist/document-models/service-subscription/gen/document-model.d.ts +3 -0
  652. package/dist/document-models/service-subscription/gen/document-model.d.ts.map +1 -0
  653. package/dist/document-models/service-subscription/gen/document-model.js +229 -0
  654. package/dist/document-models/service-subscription/gen/document-schema.d.ts +110 -0
  655. package/dist/document-models/service-subscription/gen/document-schema.d.ts.map +1 -0
  656. package/dist/document-models/service-subscription/gen/document-schema.js +33 -0
  657. package/dist/document-models/service-subscription/gen/document-type.d.ts +2 -0
  658. package/dist/document-models/service-subscription/gen/document-type.d.ts.map +1 -0
  659. package/dist/document-models/service-subscription/gen/document-type.js +1 -0
  660. package/dist/document-models/service-subscription/gen/facet-selection/actions.d.ts +12 -0
  661. package/dist/document-models/service-subscription/gen/facet-selection/actions.d.ts.map +1 -0
  662. package/dist/document-models/service-subscription/gen/facet-selection/actions.js +1 -0
  663. package/dist/document-models/service-subscription/gen/facet-selection/creators.d.ts +5 -0
  664. package/dist/document-models/service-subscription/gen/facet-selection/creators.d.ts.map +1 -0
  665. package/dist/document-models/service-subscription/gen/facet-selection/creators.js +4 -0
  666. package/dist/document-models/service-subscription/gen/facet-selection/error.d.ts +2 -0
  667. package/dist/document-models/service-subscription/gen/facet-selection/error.d.ts.map +1 -0
  668. package/dist/document-models/service-subscription/gen/facet-selection/error.js +1 -0
  669. package/dist/document-models/service-subscription/gen/facet-selection/operations.d.ts +8 -0
  670. package/dist/document-models/service-subscription/gen/facet-selection/operations.d.ts.map +1 -0
  671. package/dist/document-models/service-subscription/gen/facet-selection/operations.js +1 -0
  672. package/dist/document-models/service-subscription/gen/index.d.ts +16 -0
  673. package/dist/document-models/service-subscription/gen/index.d.ts.map +1 -0
  674. package/dist/document-models/service-subscription/gen/index.js +15 -0
  675. package/dist/document-models/service-subscription/gen/ph-factories.d.ts +23 -0
  676. package/dist/document-models/service-subscription/gen/ph-factories.d.ts.map +1 -0
  677. package/dist/document-models/service-subscription/gen/ph-factories.js +69 -0
  678. package/dist/document-models/service-subscription/gen/reducer.d.ts +3 -0
  679. package/dist/document-models/service-subscription/gen/reducer.d.ts.map +1 -0
  680. package/dist/document-models/service-subscription/gen/reducer.js +77 -0
  681. package/dist/document-models/service-subscription/gen/schema/index.d.ts +3 -0
  682. package/dist/document-models/service-subscription/gen/schema/index.d.ts.map +1 -0
  683. package/dist/document-models/service-subscription/gen/schema/index.js +2 -0
  684. package/dist/document-models/service-subscription/gen/schema/types.d.ts +260 -0
  685. package/dist/document-models/service-subscription/gen/schema/types.d.ts.map +1 -0
  686. package/dist/document-models/service-subscription/gen/schema/types.js +1 -0
  687. package/dist/document-models/service-subscription/gen/schema/zod.d.ts +38 -0
  688. package/dist/document-models/service-subscription/gen/schema/zod.d.ts.map +1 -0
  689. package/dist/document-models/service-subscription/gen/schema/zod.js +162 -0
  690. package/dist/document-models/service-subscription/gen/subscription-management/actions.d.ts +20 -0
  691. package/dist/document-models/service-subscription/gen/subscription-management/actions.d.ts.map +1 -0
  692. package/dist/document-models/service-subscription/gen/subscription-management/actions.js +1 -0
  693. package/dist/document-models/service-subscription/gen/subscription-management/creators.d.ts +7 -0
  694. package/dist/document-models/service-subscription/gen/subscription-management/creators.d.ts.map +1 -0
  695. package/dist/document-models/service-subscription/gen/subscription-management/creators.js +6 -0
  696. package/dist/document-models/service-subscription/gen/subscription-management/error.d.ts +14 -0
  697. package/dist/document-models/service-subscription/gen/subscription-management/error.d.ts.map +1 -0
  698. package/dist/document-models/service-subscription/gen/subscription-management/error.js +9 -0
  699. package/dist/document-models/service-subscription/gen/subscription-management/operations.d.ts +10 -0
  700. package/dist/document-models/service-subscription/gen/subscription-management/operations.d.ts.map +1 -0
  701. package/dist/document-models/service-subscription/gen/subscription-management/operations.js +1 -0
  702. package/dist/document-models/service-subscription/gen/tier-selection/actions.d.ts +12 -0
  703. package/dist/document-models/service-subscription/gen/tier-selection/actions.d.ts.map +1 -0
  704. package/dist/document-models/service-subscription/gen/tier-selection/actions.js +1 -0
  705. package/dist/document-models/service-subscription/gen/tier-selection/creators.d.ts +5 -0
  706. package/dist/document-models/service-subscription/gen/tier-selection/creators.d.ts.map +1 -0
  707. package/dist/document-models/service-subscription/gen/tier-selection/creators.js +4 -0
  708. package/dist/document-models/service-subscription/gen/tier-selection/error.d.ts +14 -0
  709. package/dist/document-models/service-subscription/gen/tier-selection/error.d.ts.map +1 -0
  710. package/dist/document-models/service-subscription/gen/tier-selection/error.js +9 -0
  711. package/dist/document-models/service-subscription/gen/tier-selection/operations.d.ts +8 -0
  712. package/dist/document-models/service-subscription/gen/tier-selection/operations.d.ts.map +1 -0
  713. package/dist/document-models/service-subscription/gen/tier-selection/operations.js +1 -0
  714. package/dist/document-models/service-subscription/gen/types.d.ts +12 -0
  715. package/dist/document-models/service-subscription/gen/types.d.ts.map +1 -0
  716. package/dist/document-models/service-subscription/gen/types.js +1 -0
  717. package/dist/document-models/service-subscription/gen/utils.d.ts +15 -0
  718. package/dist/document-models/service-subscription/gen/utils.d.ts.map +1 -0
  719. package/dist/document-models/service-subscription/gen/utils.js +73 -0
  720. package/dist/document-models/service-subscription/hooks.d.ts +14 -0
  721. package/dist/document-models/service-subscription/hooks.d.ts.map +1 -0
  722. package/dist/document-models/service-subscription/hooks.js +25 -0
  723. package/dist/document-models/service-subscription/index.d.ts +6 -0
  724. package/dist/document-models/service-subscription/index.d.ts.map +1 -0
  725. package/dist/document-models/service-subscription/index.js +5 -0
  726. package/dist/document-models/service-subscription/module.d.ts +5 -0
  727. package/dist/document-models/service-subscription/module.d.ts.map +1 -0
  728. package/dist/document-models/service-subscription/module.js +11 -0
  729. package/dist/document-models/service-subscription/src/index.d.ts +2 -0
  730. package/dist/document-models/service-subscription/src/index.d.ts.map +1 -0
  731. package/dist/document-models/service-subscription/src/index.js +1 -0
  732. package/dist/document-models/service-subscription/src/reducers/add-on-management.d.ts +3 -0
  733. package/dist/document-models/service-subscription/src/reducers/add-on-management.d.ts.map +1 -0
  734. package/dist/document-models/service-subscription/src/reducers/add-on-management.js +17 -0
  735. package/dist/document-models/service-subscription/src/reducers/billing-projection.d.ts +3 -0
  736. package/dist/document-models/service-subscription/src/reducers/billing-projection.d.ts.map +1 -0
  737. package/dist/document-models/service-subscription/src/reducers/billing-projection.js +17 -0
  738. package/dist/document-models/service-subscription/src/reducers/facet-selection.d.ts +3 -0
  739. package/dist/document-models/service-subscription/src/reducers/facet-selection.d.ts.map +1 -0
  740. package/dist/document-models/service-subscription/src/reducers/facet-selection.js +27 -0
  741. package/dist/document-models/service-subscription/src/reducers/subscription-management.d.ts +3 -0
  742. package/dist/document-models/service-subscription/src/reducers/subscription-management.d.ts.map +1 -0
  743. package/dist/document-models/service-subscription/src/reducers/subscription-management.js +35 -0
  744. package/dist/document-models/service-subscription/src/reducers/tier-selection.d.ts +3 -0
  745. package/dist/document-models/service-subscription/src/reducers/tier-selection.d.ts.map +1 -0
  746. package/dist/document-models/service-subscription/src/reducers/tier-selection.js +15 -0
  747. package/dist/document-models/service-subscription/src/tests/add-on-management.test.d.ts +6 -0
  748. package/dist/document-models/service-subscription/src/tests/add-on-management.test.d.ts.map +1 -0
  749. package/dist/document-models/service-subscription/src/tests/add-on-management.test.js +29 -0
  750. package/dist/document-models/service-subscription/src/tests/document-model.test.d.ts +10 -0
  751. package/dist/document-models/service-subscription/src/tests/document-model.test.d.ts.map +1 -0
  752. package/dist/document-models/service-subscription/src/tests/document-model.test.js +104 -0
  753. package/dist/document-models/service-subscription/src/tests/facet-selection.test.d.ts +6 -0
  754. package/dist/document-models/service-subscription/src/tests/facet-selection.test.d.ts.map +1 -0
  755. package/dist/document-models/service-subscription/src/tests/facet-selection.test.js +29 -0
  756. package/dist/document-models/service-subscription/src/tests/subscription-management.test.d.ts +6 -0
  757. package/dist/document-models/service-subscription/src/tests/subscription-management.test.d.ts.map +1 -0
  758. package/dist/document-models/service-subscription/src/tests/subscription-management.test.js +49 -0
  759. package/dist/document-models/service-subscription/src/tests/tier-selection.test.d.ts +6 -0
  760. package/dist/document-models/service-subscription/src/tests/tier-selection.test.d.ts.map +1 -0
  761. package/dist/document-models/service-subscription/src/tests/tier-selection.test.js +29 -0
  762. package/dist/document-models/service-subscription/src/utils.d.ts +2 -0
  763. package/dist/document-models/service-subscription/src/utils.d.ts.map +1 -0
  764. package/dist/document-models/service-subscription/src/utils.js +1 -0
  765. package/dist/document-models/service-subscription/tests/add-on-management.test.d.ts +2 -0
  766. package/dist/document-models/service-subscription/tests/add-on-management.test.d.ts.map +1 -0
  767. package/dist/document-models/service-subscription/tests/add-on-management.test.js +25 -0
  768. package/dist/document-models/service-subscription/tests/billing-projection.test.d.ts +2 -0
  769. package/dist/document-models/service-subscription/tests/billing-projection.test.d.ts.map +1 -0
  770. package/dist/document-models/service-subscription/tests/billing-projection.test.js +25 -0
  771. package/dist/document-models/service-subscription/tests/document-model.test.d.ts +10 -0
  772. package/dist/document-models/service-subscription/tests/document-model.test.d.ts.map +1 -0
  773. package/dist/document-models/service-subscription/tests/document-model.test.js +104 -0
  774. package/dist/document-models/service-subscription/tests/facet-selection.test.d.ts +2 -0
  775. package/dist/document-models/service-subscription/tests/facet-selection.test.d.ts.map +1 -0
  776. package/dist/document-models/service-subscription/tests/facet-selection.test.js +25 -0
  777. package/dist/document-models/service-subscription/tests/subscription-management.test.d.ts +2 -0
  778. package/dist/document-models/service-subscription/tests/subscription-management.test.d.ts.map +1 -0
  779. package/dist/document-models/service-subscription/tests/subscription-management.test.js +45 -0
  780. package/dist/document-models/service-subscription/tests/tier-selection.test.d.ts +2 -0
  781. package/dist/document-models/service-subscription/tests/tier-selection.test.d.ts.map +1 -0
  782. package/dist/document-models/service-subscription/tests/tier-selection.test.js +25 -0
  783. package/dist/document-models/service-subscription/utils.d.ts +14 -0
  784. package/dist/document-models/service-subscription/utils.d.ts.map +1 -0
  785. package/dist/document-models/service-subscription/utils.js +7 -0
  786. package/dist/document-models/subscription-instance/actions.d.ts +48 -0
  787. package/dist/document-models/subscription-instance/actions.d.ts.map +1 -0
  788. package/dist/document-models/subscription-instance/actions.js +11 -0
  789. package/dist/document-models/subscription-instance/gen/actions.d.ts +12 -0
  790. package/dist/document-models/subscription-instance/gen/actions.d.ts.map +1 -0
  791. package/dist/document-models/subscription-instance/gen/actions.js +5 -0
  792. package/dist/document-models/subscription-instance/gen/billing/actions.d.ts +2 -0
  793. package/dist/document-models/subscription-instance/gen/billing/actions.d.ts.map +1 -0
  794. package/dist/document-models/subscription-instance/gen/billing/actions.js +2 -0
  795. package/dist/document-models/subscription-instance/gen/billing/creators.d.ts +2 -0
  796. package/dist/document-models/subscription-instance/gen/billing/creators.d.ts.map +1 -0
  797. package/dist/document-models/subscription-instance/gen/billing/creators.js +2 -0
  798. package/dist/document-models/subscription-instance/gen/billing/error.d.ts +2 -0
  799. package/dist/document-models/subscription-instance/gen/billing/error.d.ts.map +1 -0
  800. package/dist/document-models/subscription-instance/gen/billing/error.js +1 -0
  801. package/dist/document-models/subscription-instance/gen/billing/operations.d.ts +2 -0
  802. package/dist/document-models/subscription-instance/gen/billing/operations.d.ts.map +1 -0
  803. package/dist/document-models/subscription-instance/gen/billing/operations.js +2 -0
  804. package/dist/document-models/subscription-instance/gen/creators.d.ts +11 -0
  805. package/dist/document-models/subscription-instance/gen/creators.d.ts.map +1 -0
  806. package/dist/document-models/subscription-instance/gen/creators.js +10 -0
  807. package/dist/document-models/subscription-instance/gen/customer/actions.d.ts +12 -0
  808. package/dist/document-models/subscription-instance/gen/customer/actions.d.ts.map +1 -0
  809. package/dist/document-models/subscription-instance/gen/customer/actions.js +1 -0
  810. package/dist/document-models/subscription-instance/gen/customer/creators.d.ts +5 -0
  811. package/dist/document-models/subscription-instance/gen/customer/creators.d.ts.map +1 -0
  812. package/dist/document-models/subscription-instance/gen/customer/creators.js +4 -0
  813. package/dist/document-models/subscription-instance/gen/customer/error.d.ts +2 -0
  814. package/dist/document-models/subscription-instance/gen/customer/error.d.ts.map +1 -0
  815. package/dist/document-models/subscription-instance/gen/customer/error.js +1 -0
  816. package/dist/document-models/subscription-instance/gen/customer/operations.d.ts +8 -0
  817. package/dist/document-models/subscription-instance/gen/customer/operations.d.ts.map +1 -0
  818. package/dist/document-models/subscription-instance/gen/customer/operations.js +1 -0
  819. package/dist/document-models/subscription-instance/gen/document-model.d.ts +3 -0
  820. package/dist/document-models/subscription-instance/gen/document-model.d.ts.map +1 -0
  821. package/dist/document-models/subscription-instance/gen/document-model.js +461 -0
  822. package/dist/document-models/subscription-instance/gen/document-schema.d.ts +119 -0
  823. package/dist/document-models/subscription-instance/gen/document-schema.d.ts.map +1 -0
  824. package/dist/document-models/subscription-instance/gen/document-schema.js +33 -0
  825. package/dist/document-models/subscription-instance/gen/document-type.d.ts +2 -0
  826. package/dist/document-models/subscription-instance/gen/document-type.d.ts.map +1 -0
  827. package/dist/document-models/subscription-instance/gen/document-type.js +1 -0
  828. package/dist/document-models/subscription-instance/gen/index.d.ts +16 -0
  829. package/dist/document-models/subscription-instance/gen/index.d.ts.map +1 -0
  830. package/dist/document-models/subscription-instance/gen/index.js +15 -0
  831. package/dist/document-models/subscription-instance/gen/metrics/actions.d.ts +28 -0
  832. package/dist/document-models/subscription-instance/gen/metrics/actions.d.ts.map +1 -0
  833. package/dist/document-models/subscription-instance/gen/metrics/actions.js +1 -0
  834. package/dist/document-models/subscription-instance/gen/metrics/creators.d.ts +9 -0
  835. package/dist/document-models/subscription-instance/gen/metrics/creators.d.ts.map +1 -0
  836. package/dist/document-models/subscription-instance/gen/metrics/creators.js +8 -0
  837. package/dist/document-models/subscription-instance/gen/metrics/error.d.ts +2 -0
  838. package/dist/document-models/subscription-instance/gen/metrics/error.d.ts.map +1 -0
  839. package/dist/document-models/subscription-instance/gen/metrics/error.js +1 -0
  840. package/dist/document-models/subscription-instance/gen/metrics/operations.d.ts +12 -0
  841. package/dist/document-models/subscription-instance/gen/metrics/operations.d.ts.map +1 -0
  842. package/dist/document-models/subscription-instance/gen/metrics/operations.js +1 -0
  843. package/dist/document-models/subscription-instance/gen/ph-factories.d.ts +23 -0
  844. package/dist/document-models/subscription-instance/gen/ph-factories.d.ts.map +1 -0
  845. package/dist/document-models/subscription-instance/gen/ph-factories.js +72 -0
  846. package/dist/document-models/subscription-instance/gen/reducer.d.ts +3 -0
  847. package/dist/document-models/subscription-instance/gen/reducer.d.ts.map +1 -0
  848. package/dist/document-models/subscription-instance/gen/reducer.js +197 -0
  849. package/dist/document-models/subscription-instance/gen/schema/index.d.ts +3 -0
  850. package/dist/document-models/subscription-instance/gen/schema/index.d.ts.map +1 -0
  851. package/dist/document-models/subscription-instance/gen/schema/index.js +2 -0
  852. package/dist/document-models/subscription-instance/gen/schema/types.d.ts +423 -0
  853. package/dist/document-models/subscription-instance/gen/schema/types.d.ts.map +1 -0
  854. package/dist/document-models/subscription-instance/gen/schema/types.js +1 -0
  855. package/dist/document-models/subscription-instance/gen/schema/zod.d.ts +81 -0
  856. package/dist/document-models/subscription-instance/gen/schema/zod.d.ts.map +1 -0
  857. package/dist/document-models/subscription-instance/gen/schema/zod.js +395 -0
  858. package/dist/document-models/subscription-instance/gen/service/actions.d.ts +32 -0
  859. package/dist/document-models/subscription-instance/gen/service/actions.d.ts.map +1 -0
  860. package/dist/document-models/subscription-instance/gen/service/actions.js +1 -0
  861. package/dist/document-models/subscription-instance/gen/service/creators.d.ts +10 -0
  862. package/dist/document-models/subscription-instance/gen/service/creators.d.ts.map +1 -0
  863. package/dist/document-models/subscription-instance/gen/service/creators.js +9 -0
  864. package/dist/document-models/subscription-instance/gen/service/error.d.ts +2 -0
  865. package/dist/document-models/subscription-instance/gen/service/error.d.ts.map +1 -0
  866. package/dist/document-models/subscription-instance/gen/service/error.js +1 -0
  867. package/dist/document-models/subscription-instance/gen/service/operations.d.ts +13 -0
  868. package/dist/document-models/subscription-instance/gen/service/operations.d.ts.map +1 -0
  869. package/dist/document-models/subscription-instance/gen/service/operations.js +1 -0
  870. package/dist/document-models/subscription-instance/gen/service-group/actions.d.ts +20 -0
  871. package/dist/document-models/subscription-instance/gen/service-group/actions.d.ts.map +1 -0
  872. package/dist/document-models/subscription-instance/gen/service-group/actions.js +1 -0
  873. package/dist/document-models/subscription-instance/gen/service-group/creators.d.ts +7 -0
  874. package/dist/document-models/subscription-instance/gen/service-group/creators.d.ts.map +1 -0
  875. package/dist/document-models/subscription-instance/gen/service-group/creators.js +6 -0
  876. package/dist/document-models/subscription-instance/gen/service-group/error.d.ts +2 -0
  877. package/dist/document-models/subscription-instance/gen/service-group/error.d.ts.map +1 -0
  878. package/dist/document-models/subscription-instance/gen/service-group/error.js +1 -0
  879. package/dist/document-models/subscription-instance/gen/service-group/operations.d.ts +10 -0
  880. package/dist/document-models/subscription-instance/gen/service-group/operations.d.ts.map +1 -0
  881. package/dist/document-models/subscription-instance/gen/service-group/operations.js +1 -0
  882. package/dist/document-models/subscription-instance/gen/subscription/actions.d.ts +72 -0
  883. package/dist/document-models/subscription-instance/gen/subscription/actions.d.ts.map +1 -0
  884. package/dist/document-models/subscription-instance/gen/subscription/actions.js +1 -0
  885. package/dist/document-models/subscription-instance/gen/subscription/creators.d.ts +20 -0
  886. package/dist/document-models/subscription-instance/gen/subscription/creators.d.ts.map +1 -0
  887. package/dist/document-models/subscription-instance/gen/subscription/creators.js +19 -0
  888. package/dist/document-models/subscription-instance/gen/subscription/error.d.ts +2 -0
  889. package/dist/document-models/subscription-instance/gen/subscription/error.d.ts.map +1 -0
  890. package/dist/document-models/subscription-instance/gen/subscription/error.js +1 -0
  891. package/dist/document-models/subscription-instance/gen/subscription/operations.d.ts +23 -0
  892. package/dist/document-models/subscription-instance/gen/subscription/operations.d.ts.map +1 -0
  893. package/dist/document-models/subscription-instance/gen/subscription/operations.js +1 -0
  894. package/dist/document-models/subscription-instance/gen/types.d.ts +12 -0
  895. package/dist/document-models/subscription-instance/gen/types.d.ts.map +1 -0
  896. package/dist/document-models/subscription-instance/gen/types.js +1 -0
  897. package/dist/document-models/subscription-instance/gen/utils.d.ts +15 -0
  898. package/dist/document-models/subscription-instance/gen/utils.d.ts.map +1 -0
  899. package/dist/document-models/subscription-instance/gen/utils.js +76 -0
  900. package/dist/document-models/subscription-instance/hooks.d.ts +14 -0
  901. package/dist/document-models/subscription-instance/hooks.d.ts.map +1 -0
  902. package/dist/document-models/subscription-instance/hooks.js +25 -0
  903. package/dist/document-models/subscription-instance/index.d.ts +6 -0
  904. package/dist/document-models/subscription-instance/index.d.ts.map +1 -0
  905. package/dist/document-models/subscription-instance/index.js +5 -0
  906. package/dist/document-models/subscription-instance/module.d.ts +5 -0
  907. package/dist/document-models/subscription-instance/module.d.ts.map +1 -0
  908. package/dist/document-models/subscription-instance/module.js +11 -0
  909. package/dist/document-models/subscription-instance/src/index.d.ts +2 -0
  910. package/dist/document-models/subscription-instance/src/index.d.ts.map +1 -0
  911. package/dist/document-models/subscription-instance/src/index.js +1 -0
  912. package/dist/document-models/subscription-instance/src/reducers/billing.d.ts +2 -0
  913. package/dist/document-models/subscription-instance/src/reducers/billing.d.ts.map +1 -0
  914. package/dist/document-models/subscription-instance/src/reducers/billing.js +4 -0
  915. package/dist/document-models/subscription-instance/src/reducers/customer.d.ts +3 -0
  916. package/dist/document-models/subscription-instance/src/reducers/customer.d.ts.map +1 -0
  917. package/dist/document-models/subscription-instance/src/reducers/customer.js +13 -0
  918. package/dist/document-models/subscription-instance/src/reducers/metrics.d.ts +3 -0
  919. package/dist/document-models/subscription-instance/src/reducers/metrics.d.ts.map +1 -0
  920. package/dist/document-models/subscription-instance/src/reducers/metrics.js +90 -0
  921. package/dist/document-models/subscription-instance/src/reducers/requests.d.ts +2 -0
  922. package/dist/document-models/subscription-instance/src/reducers/requests.d.ts.map +1 -0
  923. package/dist/document-models/subscription-instance/src/reducers/requests.js +3 -0
  924. package/dist/document-models/subscription-instance/src/reducers/service-group.d.ts +3 -0
  925. package/dist/document-models/subscription-instance/src/reducers/service-group.d.ts.map +1 -0
  926. package/dist/document-models/subscription-instance/src/reducers/service-group.js +62 -0
  927. package/dist/document-models/subscription-instance/src/reducers/service.d.ts +3 -0
  928. package/dist/document-models/subscription-instance/src/reducers/service.d.ts.map +1 -0
  929. package/dist/document-models/subscription-instance/src/reducers/service.js +110 -0
  930. package/dist/document-models/subscription-instance/src/reducers/subscription.d.ts +3 -0
  931. package/dist/document-models/subscription-instance/src/reducers/subscription.d.ts.map +1 -0
  932. package/dist/document-models/subscription-instance/src/reducers/subscription.js +107 -0
  933. package/dist/document-models/subscription-instance/src/utils.d.ts +2 -0
  934. package/dist/document-models/subscription-instance/src/utils.d.ts.map +1 -0
  935. package/dist/document-models/subscription-instance/src/utils.js +1 -0
  936. package/dist/document-models/subscription-instance/tests/billing.test.d.ts +2 -0
  937. package/dist/document-models/subscription-instance/tests/billing.test.d.ts.map +1 -0
  938. package/dist/document-models/subscription-instance/tests/billing.test.js +17 -0
  939. package/dist/document-models/subscription-instance/tests/customer.test.d.ts +2 -0
  940. package/dist/document-models/subscription-instance/tests/customer.test.d.ts.map +1 -0
  941. package/dist/document-models/subscription-instance/tests/customer.test.js +26 -0
  942. package/dist/document-models/subscription-instance/tests/document-model.test.d.ts +10 -0
  943. package/dist/document-models/subscription-instance/tests/document-model.test.d.ts.map +1 -0
  944. package/dist/document-models/subscription-instance/tests/document-model.test.js +104 -0
  945. package/dist/document-models/subscription-instance/tests/metrics.test.d.ts +2 -0
  946. package/dist/document-models/subscription-instance/tests/metrics.test.d.ts.map +1 -0
  947. package/dist/document-models/subscription-instance/tests/metrics.test.js +65 -0
  948. package/dist/document-models/subscription-instance/tests/requests.test.d.ts +2 -0
  949. package/dist/document-models/subscription-instance/tests/requests.test.d.ts.map +1 -0
  950. package/dist/document-models/subscription-instance/tests/requests.test.js +8 -0
  951. package/dist/document-models/subscription-instance/tests/service-group.test.d.ts +2 -0
  952. package/dist/document-models/subscription-instance/tests/service-group.test.d.ts.map +1 -0
  953. package/dist/document-models/subscription-instance/tests/service-group.test.js +45 -0
  954. package/dist/document-models/subscription-instance/tests/service.test.d.ts +2 -0
  955. package/dist/document-models/subscription-instance/tests/service.test.d.ts.map +1 -0
  956. package/dist/document-models/subscription-instance/tests/service.test.js +75 -0
  957. package/dist/document-models/subscription-instance/tests/subscription.test.d.ts +2 -0
  958. package/dist/document-models/subscription-instance/tests/subscription.test.d.ts.map +1 -0
  959. package/dist/document-models/subscription-instance/tests/subscription.test.js +177 -0
  960. package/dist/document-models/subscription-instance/utils.d.ts +14 -0
  961. package/dist/document-models/subscription-instance/utils.d.ts.map +1 -0
  962. package/dist/document-models/subscription-instance/utils.js +7 -0
  963. package/dist/editors/editors.d.ts +3 -0
  964. package/dist/editors/editors.d.ts.map +1 -0
  965. package/dist/editors/editors.js +10 -0
  966. package/dist/editors/index.d.ts +5 -0
  967. package/dist/editors/index.d.ts.map +1 -0
  968. package/dist/editors/index.js +4 -0
  969. package/dist/editors/resource-instance-editor/editor.d.ts +2 -0
  970. package/dist/editors/resource-instance-editor/editor.d.ts.map +1 -0
  971. package/dist/editors/resource-instance-editor/editor.js +1234 -0
  972. package/dist/editors/resource-instance-editor/module.d.ts +4 -0
  973. package/dist/editors/resource-instance-editor/module.d.ts.map +1 -0
  974. package/dist/editors/resource-instance-editor/module.js +10 -0
  975. package/dist/editors/resource-instance-editor/types.d.ts +2 -0
  976. package/dist/editors/resource-instance-editor/types.d.ts.map +1 -0
  977. package/dist/editors/resource-instance-editor/types.js +1 -0
  978. package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts +9 -0
  979. package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts.map +1 -0
  980. package/dist/editors/resource-template-editor/components/FacetTargeting.js +958 -0
  981. package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts +9 -0
  982. package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts.map +1 -0
  983. package/dist/editors/resource-template-editor/components/TemplateInfo.js +2175 -0
  984. package/dist/editors/resource-template-editor/components/markdown-editor.d.ts +12 -0
  985. package/dist/editors/resource-template-editor/components/markdown-editor.d.ts.map +1 -0
  986. package/dist/editors/resource-template-editor/components/markdown-editor.js +132 -0
  987. package/dist/editors/resource-template-editor/editor.d.ts +2 -0
  988. package/dist/editors/resource-template-editor/editor.d.ts.map +1 -0
  989. package/dist/editors/resource-template-editor/editor.js +146 -0
  990. package/dist/editors/resource-template-editor/module.d.ts +4 -0
  991. package/dist/editors/resource-template-editor/module.d.ts.map +1 -0
  992. package/dist/editors/resource-template-editor/module.js +10 -0
  993. package/dist/editors/service-offering-editor/components/EditName.d.ts +3 -0
  994. package/dist/editors/service-offering-editor/components/EditName.d.ts.map +1 -0
  995. package/dist/editors/service-offering-editor/components/EditName.js +31 -0
  996. package/dist/editors/service-offering-editor/components/MarkdownPreview.d.ts +8 -0
  997. package/dist/editors/service-offering-editor/components/MarkdownPreview.d.ts.map +1 -0
  998. package/dist/editors/service-offering-editor/components/MarkdownPreview.js +87 -0
  999. package/dist/editors/service-offering-editor/components/OfferingInfo.d.ts +9 -0
  1000. package/dist/editors/service-offering-editor/components/OfferingInfo.d.ts.map +1 -0
  1001. package/dist/editors/service-offering-editor/components/OfferingInfo.js +62 -0
  1002. package/dist/editors/service-offering-editor/components/OfferingProgress.d.ts +10 -0
  1003. package/dist/editors/service-offering-editor/components/OfferingProgress.d.ts.map +1 -0
  1004. package/dist/editors/service-offering-editor/components/OfferingProgress.js +240 -0
  1005. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts +9 -0
  1006. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -0
  1007. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +1158 -0
  1008. package/dist/editors/service-offering-editor/components/ScopeAndFacets.d.ts +9 -0
  1009. package/dist/editors/service-offering-editor/components/ScopeAndFacets.d.ts.map +1 -0
  1010. package/dist/editors/service-offering-editor/components/ScopeAndFacets.js +1025 -0
  1011. package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts +9 -0
  1012. package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts.map +1 -0
  1013. package/dist/editors/service-offering-editor/components/ServiceCatalog.js +1704 -0
  1014. package/dist/editors/service-offering-editor/components/ServicesList.d.ts +9 -0
  1015. package/dist/editors/service-offering-editor/components/ServicesList.d.ts.map +1 -0
  1016. package/dist/editors/service-offering-editor/components/ServicesList.js +63 -0
  1017. package/dist/editors/service-offering-editor/components/TabNavigation.d.ts +9 -0
  1018. package/dist/editors/service-offering-editor/components/TabNavigation.d.ts.map +1 -0
  1019. package/dist/editors/service-offering-editor/components/TabNavigation.js +257 -0
  1020. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts +9 -0
  1021. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -0
  1022. package/dist/editors/service-offering-editor/components/TheMatrix.js +2989 -0
  1023. package/dist/editors/service-offering-editor/components/TierDefinition.d.ts +9 -0
  1024. package/dist/editors/service-offering-editor/components/TierDefinition.d.ts.map +1 -0
  1025. package/dist/editors/service-offering-editor/components/TierDefinition.js +1013 -0
  1026. package/dist/editors/service-offering-editor/components/TierPricingOptionsPanel.d.ts +11 -0
  1027. package/dist/editors/service-offering-editor/components/TierPricingOptionsPanel.d.ts.map +1 -0
  1028. package/dist/editors/service-offering-editor/components/TierPricingOptionsPanel.js +391 -0
  1029. package/dist/editors/service-offering-editor/components/TiersList.d.ts +9 -0
  1030. package/dist/editors/service-offering-editor/components/TiersList.d.ts.map +1 -0
  1031. package/dist/editors/service-offering-editor/components/TiersList.js +133 -0
  1032. package/dist/editors/service-offering-editor/components/pricing-utils.d.ts +10 -0
  1033. package/dist/editors/service-offering-editor/components/pricing-utils.d.ts.map +1 -0
  1034. package/dist/editors/service-offering-editor/components/pricing-utils.js +65 -0
  1035. package/dist/editors/service-offering-editor/editor.d.ts +2 -0
  1036. package/dist/editors/service-offering-editor/editor.d.ts.map +1 -0
  1037. package/dist/editors/service-offering-editor/editor.js +327 -0
  1038. package/dist/editors/service-offering-editor/module.d.ts +4 -0
  1039. package/dist/editors/service-offering-editor/module.d.ts.map +1 -0
  1040. package/dist/editors/service-offering-editor/module.js +10 -0
  1041. package/dist/editors/subscription-instance-editor/components/BillingPanel.d.ts +11 -0
  1042. package/dist/editors/subscription-instance-editor/components/BillingPanel.d.ts.map +1 -0
  1043. package/dist/editors/subscription-instance-editor/components/BillingPanel.js +118 -0
  1044. package/dist/editors/subscription-instance-editor/components/CustomerInfo.d.ts +11 -0
  1045. package/dist/editors/subscription-instance-editor/components/CustomerInfo.d.ts.map +1 -0
  1046. package/dist/editors/subscription-instance-editor/components/CustomerInfo.js +56 -0
  1047. package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.d.ts +9 -0
  1048. package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.d.ts.map +1 -0
  1049. package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.js +169 -0
  1050. package/dist/editors/subscription-instance-editor/components/MetricActions.d.ts +21 -0
  1051. package/dist/editors/subscription-instance-editor/components/MetricActions.d.ts.map +1 -0
  1052. package/dist/editors/subscription-instance-editor/components/MetricActions.js +74 -0
  1053. package/dist/editors/subscription-instance-editor/components/MockDataButton.d.ts +9 -0
  1054. package/dist/editors/subscription-instance-editor/components/MockDataButton.d.ts.map +1 -0
  1055. package/dist/editors/subscription-instance-editor/components/MockDataButton.js +258 -0
  1056. package/dist/editors/subscription-instance-editor/components/ModeToggle.d.ts +8 -0
  1057. package/dist/editors/subscription-instance-editor/components/ModeToggle.d.ts.map +1 -0
  1058. package/dist/editors/subscription-instance-editor/components/ModeToggle.js +4 -0
  1059. package/dist/editors/subscription-instance-editor/components/OperatorNotes.d.ts +9 -0
  1060. package/dist/editors/subscription-instance-editor/components/OperatorNotes.d.ts.map +1 -0
  1061. package/dist/editors/subscription-instance-editor/components/OperatorNotes.js +17 -0
  1062. package/dist/editors/subscription-instance-editor/components/PendingRequestsPanel.d.ts +9 -0
  1063. package/dist/editors/subscription-instance-editor/components/PendingRequestsPanel.d.ts.map +1 -0
  1064. package/dist/editors/subscription-instance-editor/components/PendingRequestsPanel.js +4 -0
  1065. package/dist/editors/subscription-instance-editor/components/ServicesPanel.d.ts +11 -0
  1066. package/dist/editors/subscription-instance-editor/components/ServicesPanel.d.ts.map +1 -0
  1067. package/dist/editors/subscription-instance-editor/components/ServicesPanel.js +73 -0
  1068. package/dist/editors/subscription-instance-editor/components/StatusBadge.d.ts +7 -0
  1069. package/dist/editors/subscription-instance-editor/components/StatusBadge.d.ts.map +1 -0
  1070. package/dist/editors/subscription-instance-editor/components/StatusBadge.js +26 -0
  1071. package/dist/editors/subscription-instance-editor/components/SubscriptionActions.d.ts +11 -0
  1072. package/dist/editors/subscription-instance-editor/components/SubscriptionActions.d.ts.map +1 -0
  1073. package/dist/editors/subscription-instance-editor/components/SubscriptionActions.js +99 -0
  1074. package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.d.ts +11 -0
  1075. package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.d.ts.map +1 -0
  1076. package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.js +19 -0
  1077. package/dist/editors/subscription-instance-editor/editor.d.ts +2 -0
  1078. package/dist/editors/subscription-instance-editor/editor.d.ts.map +1 -0
  1079. package/dist/editors/subscription-instance-editor/editor.js +1999 -0
  1080. package/dist/editors/subscription-instance-editor/module.d.ts +4 -0
  1081. package/dist/editors/subscription-instance-editor/module.d.ts.map +1 -0
  1082. package/dist/editors/subscription-instance-editor/module.js +10 -0
  1083. package/dist/editors/subscription-instance-editor/types.d.ts +3 -0
  1084. package/dist/editors/subscription-instance-editor/types.d.ts.map +1 -0
  1085. package/dist/editors/subscription-instance-editor/types.js +1 -0
  1086. package/dist/index.d.ts +5 -0
  1087. package/dist/index.d.ts.map +1 -0
  1088. package/dist/index.js +4 -0
  1089. package/dist/powerhouse.manifest.json +39 -0
  1090. package/dist/processors/index.d.ts +2 -0
  1091. package/dist/processors/index.d.ts.map +1 -0
  1092. package/dist/processors/index.js +1 -0
  1093. package/dist/style.css +1431 -0
  1094. package/dist/subgraphs/index.d.ts +2 -0
  1095. package/dist/subgraphs/index.d.ts.map +1 -0
  1096. package/dist/subgraphs/index.js +1 -0
  1097. package/dist/vite.config.d.ts +3 -0
  1098. package/dist/vite.config.d.ts.map +1 -0
  1099. package/dist/vite.config.js +13 -0
  1100. package/package.json +123 -0
@@ -0,0 +1,2989 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect, useRef, useCallback } from "react";
3
+ import { generateId } from "document-model/core";
4
+ import { BILLING_CYCLE_SHORT_LABELS, formatPrice } from "./pricing-utils.js";
5
+ import { addServiceLevel, updateServiceLevel, addUsageLimit, updateUsageLimit, removeUsageLimit, addService, updateService, } from "../../../document-models/service-offering/gen/creators.js";
6
+ const SERVICE_LEVELS = [
7
+ {
8
+ value: "INCLUDED",
9
+ label: "Included",
10
+ shortLabel: "✓",
11
+ color: "var(--so-emerald-600)",
12
+ },
13
+ {
14
+ value: "OPTIONAL",
15
+ label: "Optional",
16
+ shortLabel: "Optional",
17
+ color: "var(--so-sky-600)",
18
+ },
19
+ {
20
+ value: "NOT_INCLUDED",
21
+ label: "Not Included",
22
+ shortLabel: "—",
23
+ color: "var(--so-slate-400)",
24
+ },
25
+ {
26
+ value: "NOT_APPLICABLE",
27
+ label: "Not Applicable",
28
+ shortLabel: "/",
29
+ color: "var(--so-slate-300)",
30
+ },
31
+ {
32
+ value: "CUSTOM",
33
+ label: "Custom",
34
+ shortLabel: "Custom",
35
+ color: "var(--so-amber-600)",
36
+ },
37
+ {
38
+ value: "VARIABLE",
39
+ label: "Variable",
40
+ shortLabel: "#",
41
+ color: "var(--so-violet-600)",
42
+ },
43
+ ];
44
+ const UNGROUPED_ID = "__ungrouped__";
45
+ const matrixStyles = `
46
+ .matrix {
47
+ background: var(--so-white);
48
+ border-radius: var(--so-radius-lg);
49
+ box-shadow: var(--so-shadow-md);
50
+ overflow: hidden;
51
+ }
52
+
53
+ /* Facet Selector */
54
+ .matrix__facets {
55
+ padding: 1.25rem 1.5rem;
56
+ background: linear-gradient(to bottom, var(--so-slate-50), var(--so-white));
57
+ border-bottom: 1px solid var(--so-slate-200);
58
+ }
59
+
60
+ .matrix__facets-row {
61
+ display: flex;
62
+ flex-wrap: wrap;
63
+ align-items: flex-end;
64
+ gap: 1.5rem;
65
+ }
66
+
67
+ .matrix__facet-group {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 0.375rem;
71
+ }
72
+
73
+ .matrix__facet-label {
74
+ font-family: var(--so-font-mono);
75
+ font-size: 0.625rem;
76
+ font-weight: 500;
77
+ text-transform: uppercase;
78
+ letter-spacing: 0.08em;
79
+ color: var(--so-slate-500);
80
+ }
81
+
82
+ .matrix__facet-select {
83
+ font-family: var(--so-font-sans);
84
+ font-size: 0.8125rem;
85
+ color: var(--so-slate-700);
86
+ background: var(--so-white);
87
+ border: 1px solid var(--so-slate-200);
88
+ border-radius: var(--so-radius-md);
89
+ padding: 0.5rem 2rem 0.5rem 0.75rem;
90
+ cursor: pointer;
91
+ outline: none;
92
+ transition: var(--so-transition-fast);
93
+ appearance: none;
94
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'/%3E%3C/svg%3E");
95
+ background-repeat: no-repeat;
96
+ background-position: right 0.5rem center;
97
+ background-size: 1rem;
98
+ }
99
+
100
+ .matrix__facet-select:hover {
101
+ border-color: var(--so-slate-300);
102
+ }
103
+
104
+ .matrix__facet-select:focus {
105
+ border-color: var(--so-violet-400);
106
+ box-shadow: 0 0 0 3px var(--so-violet-100);
107
+ }
108
+
109
+ /* Toggle Button Group */
110
+ .matrix__toggle-group {
111
+ display: flex;
112
+ background: var(--so-white);
113
+ border: 1px solid var(--so-slate-200);
114
+ border-radius: var(--so-radius-md);
115
+ overflow: hidden;
116
+ }
117
+
118
+ .matrix__toggle-btn {
119
+ padding: 0.5rem 0.875rem;
120
+ font-family: var(--so-font-sans);
121
+ font-size: 0.8125rem;
122
+ font-weight: 500;
123
+ color: var(--so-slate-600);
124
+ background: var(--so-white);
125
+ border: none;
126
+ cursor: pointer;
127
+ transition: var(--so-transition-fast);
128
+ }
129
+
130
+ .matrix__toggle-btn:not(:first-child) {
131
+ border-left: 1px solid var(--so-slate-200);
132
+ }
133
+
134
+ .matrix__toggle-btn:hover:not(.matrix__toggle-btn--active) {
135
+ background: var(--so-slate-50);
136
+ }
137
+
138
+ .matrix__toggle-btn--active {
139
+ background: var(--so-violet-100);
140
+ color: var(--so-violet-700);
141
+ }
142
+
143
+ /* Facet Notice */
144
+ .matrix__facet-notice {
145
+ margin-top: 0.875rem;
146
+ padding: 0.625rem 0.875rem;
147
+ background: var(--so-amber-50);
148
+ border: 1px solid var(--so-amber-200);
149
+ border-radius: var(--so-radius-md);
150
+ }
151
+
152
+ .matrix__facet-notice-text {
153
+ font-size: 0.75rem;
154
+ color: var(--so-amber-700);
155
+ }
156
+
157
+ .matrix__facet-notice-text strong {
158
+ color: var(--so-amber-800);
159
+ }
160
+
161
+ /* Table */
162
+ .matrix__table-wrap {
163
+ overflow-x: auto;
164
+ }
165
+
166
+ .matrix__table {
167
+ width: 100%;
168
+ border-collapse: collapse;
169
+ font-size: 0.8125rem;
170
+ }
171
+
172
+ /* Header */
173
+ .matrix__corner-cell {
174
+ position: sticky;
175
+ left: 0;
176
+ z-index: 10;
177
+ background: var(--so-white);
178
+ padding: 1rem;
179
+ text-align: left;
180
+ font-weight: 400;
181
+ color: var(--so-slate-500);
182
+ border-bottom: 1px solid var(--so-slate-200);
183
+ min-width: 260px;
184
+ }
185
+
186
+ .matrix__tier-header {
187
+ padding: 1rem;
188
+ text-align: center;
189
+ border-bottom: 1px solid var(--so-slate-200);
190
+ min-width: 140px;
191
+ cursor: pointer;
192
+ transition: var(--so-transition-fast);
193
+ background: var(--so-white);
194
+ }
195
+
196
+ .matrix__tier-header:hover:not(.matrix__tier-header--selected) {
197
+ background: linear-gradient(180deg, var(--so-slate-50) 0%, var(--so-violet-50) 100%);
198
+ }
199
+
200
+ .matrix__tier-header--selected {
201
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a855f7 100%);
202
+ color: var(--so-white);
203
+ box-shadow:
204
+ 0 4px 12px rgba(139, 92, 246, 0.35),
205
+ inset 0 1px 0 rgba(255, 255, 255, 0.15);
206
+ position: relative;
207
+ }
208
+
209
+ .matrix__tier-header--selected::before {
210
+ content: "";
211
+ position: absolute;
212
+ inset: 0;
213
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.12) 0%, transparent 50%);
214
+ pointer-events: none;
215
+ }
216
+
217
+ .matrix__tier-header-inner {
218
+ display: flex;
219
+ flex-direction: column;
220
+ align-items: center;
221
+ gap: 0.375rem;
222
+ }
223
+
224
+ .matrix__tier-radio {
225
+ width: 1rem;
226
+ height: 1rem;
227
+ border-radius: 50%;
228
+ border: 2px solid var(--so-slate-300);
229
+ transition: var(--so-transition-fast);
230
+ }
231
+
232
+ .matrix__tier-header--selected .matrix__tier-radio {
233
+ border-color: rgba(255, 255, 255, 0.9);
234
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
235
+ box-shadow:
236
+ inset 0 0 0 3px var(--so-white),
237
+ 0 2px 4px rgba(0, 0, 0, 0.15);
238
+ }
239
+
240
+ .matrix__tier-name {
241
+ font-family: var(--so-font-sans);
242
+ font-weight: 600;
243
+ color: var(--so-slate-900);
244
+ }
245
+
246
+ .matrix__tier-header--selected .matrix__tier-name {
247
+ color: var(--so-white);
248
+ }
249
+
250
+ .matrix__tier-price {
251
+ font-size: 0.6875rem;
252
+ color: var(--so-slate-500);
253
+ }
254
+
255
+ .matrix__tier-header--selected .matrix__tier-price {
256
+ color: rgba(255, 255, 255, 0.85);
257
+ }
258
+
259
+ /* Billing Cycle Selector in Tier Header */
260
+ .matrix__tier-cycle-select {
261
+ font-family: var(--so-font-sans);
262
+ font-size: 0.625rem;
263
+ color: var(--so-slate-600);
264
+ background: var(--so-white);
265
+ border: 1px solid var(--so-slate-200);
266
+ border-radius: var(--so-radius-sm);
267
+ padding: 0.25rem 0.5rem;
268
+ cursor: pointer;
269
+ outline: none;
270
+ transition: var(--so-transition-fast);
271
+ margin-top: 0.25rem;
272
+ }
273
+
274
+ .matrix__tier-cycle-select:hover {
275
+ border-color: var(--so-slate-300);
276
+ }
277
+
278
+ .matrix__tier-cycle-select:focus {
279
+ border-color: var(--so-violet-400);
280
+ box-shadow: 0 0 0 2px var(--so-violet-100);
281
+ }
282
+
283
+ .matrix__tier-header--selected .matrix__tier-cycle-select {
284
+ background: rgba(255, 255, 255, 0.18);
285
+ border-color: rgba(255, 255, 255, 0.3);
286
+ color: var(--so-white);
287
+ backdrop-filter: blur(4px);
288
+ }
289
+
290
+ .matrix__tier-header--selected .matrix__tier-cycle-select:hover {
291
+ background: rgba(255, 255, 255, 0.25);
292
+ border-color: rgba(255, 255, 255, 0.4);
293
+ }
294
+
295
+ .matrix__tier-header--selected .matrix__tier-cycle-select:focus {
296
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.35);
297
+ border-color: rgba(255, 255, 255, 0.5);
298
+ }
299
+
300
+ /* Section Header */
301
+ .matrix__section-header {
302
+ background: var(--so-slate-100);
303
+ padding: 0.625rem 1rem;
304
+ font-family: var(--so-font-mono);
305
+ font-size: 0.625rem;
306
+ font-weight: 600;
307
+ text-transform: uppercase;
308
+ letter-spacing: 0.08em;
309
+ color: var(--so-slate-600);
310
+ border-bottom: 1px solid var(--so-slate-200);
311
+ }
312
+
313
+ /* Category Header */
314
+ .matrix__category-header {
315
+ background: var(--so-slate-50);
316
+ padding: 0.75rem 1rem;
317
+ font-size: 0.75rem;
318
+ font-weight: 600;
319
+ color: var(--so-slate-700);
320
+ border-bottom: 1px solid var(--so-slate-200);
321
+ display: flex;
322
+ align-items: center;
323
+ gap: 0.5rem;
324
+ }
325
+
326
+ .matrix__category-icon {
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ width: 1.25rem;
331
+ height: 1.25rem;
332
+ color: var(--so-slate-500);
333
+ }
334
+
335
+ .matrix__category-icon svg {
336
+ width: 100%;
337
+ height: 100%;
338
+ }
339
+
340
+ /* Group Header */
341
+ .matrix__group-header {
342
+ padding: 0.75rem 1rem;
343
+ border-bottom: 1px solid var(--so-slate-200);
344
+ }
345
+
346
+ .matrix__group-header--setup {
347
+ background: var(--so-amber-100);
348
+ }
349
+
350
+ .matrix__group-header--optional {
351
+ background: var(--so-sky-100);
352
+ }
353
+
354
+ .matrix__group-header--regular {
355
+ background: var(--so-slate-100);
356
+ }
357
+
358
+ .matrix__group-header-sticky {
359
+ position: sticky;
360
+ left: 0;
361
+ z-index: 10;
362
+ }
363
+
364
+ .matrix__group-header-inner {
365
+ display: flex;
366
+ align-items: center;
367
+ gap: 0.75rem;
368
+ }
369
+
370
+ .matrix__group-toggle {
371
+ position: relative;
372
+ width: 2.5rem;
373
+ height: 1.25rem;
374
+ border-radius: 9999px;
375
+ border: none;
376
+ cursor: pointer;
377
+ transition: var(--so-transition-base);
378
+ }
379
+
380
+ .matrix__group-toggle--on {
381
+ background: var(--so-violet-600);
382
+ }
383
+
384
+ .matrix__group-toggle--off {
385
+ background: var(--so-slate-300);
386
+ }
387
+
388
+ .matrix__group-toggle-knob {
389
+ position: absolute;
390
+ top: 0.125rem;
391
+ width: 1rem;
392
+ height: 1rem;
393
+ background: var(--so-white);
394
+ border-radius: 50%;
395
+ box-shadow: var(--so-shadow-sm);
396
+ transition: var(--so-transition-fast);
397
+ }
398
+
399
+ .matrix__group-toggle--on .matrix__group-toggle-knob {
400
+ left: calc(100% - 1.125rem);
401
+ }
402
+
403
+ .matrix__group-toggle--off .matrix__group-toggle-knob {
404
+ left: 0.125rem;
405
+ }
406
+
407
+ .matrix__group-name {
408
+ font-family: var(--so-font-sans);
409
+ font-weight: 600;
410
+ color: var(--so-slate-800);
411
+ }
412
+
413
+ .matrix__group-badge {
414
+ display: inline-block;
415
+ padding: 0.25rem 0.625rem;
416
+ border-radius: var(--so-radius-sm);
417
+ font-size: 0.625rem;
418
+ font-weight: 600;
419
+ text-transform: uppercase;
420
+ letter-spacing: 0.04em;
421
+ }
422
+
423
+ .matrix__group-badge--included {
424
+ background: var(--so-emerald-100);
425
+ color: var(--so-emerald-700);
426
+ }
427
+
428
+ .matrix__group-badge--optional {
429
+ background: var(--so-sky-200);
430
+ color: var(--so-sky-700);
431
+ }
432
+
433
+ .matrix__group-billing-badge {
434
+ display: inline-block;
435
+ padding: 0.125rem 0.5rem;
436
+ border-radius: var(--so-radius-sm);
437
+ font-size: 0.625rem;
438
+ font-weight: 600;
439
+ text-transform: uppercase;
440
+ letter-spacing: 0.03em;
441
+ background: var(--so-violet-100);
442
+ color: var(--so-violet-700);
443
+ margin-left: 8px;
444
+ }
445
+
446
+ .matrix__group-price-badge {
447
+ display: inline-block;
448
+ padding: 0.125rem 0.5rem;
449
+ border-radius: var(--so-radius-sm);
450
+ font-size: 0.625rem;
451
+ font-weight: 600;
452
+ background: var(--so-amber-100);
453
+ color: var(--so-amber-700);
454
+ margin-left: 6px;
455
+ }
456
+
457
+ /* Service Row */
458
+ .matrix__service-row {
459
+ transition: var(--so-transition-fast);
460
+ }
461
+
462
+ .matrix__service-row--setup {
463
+ background: var(--so-amber-50);
464
+ }
465
+
466
+ .matrix__service-row--optional {
467
+ background: var(--so-sky-50);
468
+ }
469
+
470
+ .matrix__service-row--regular {
471
+ background: var(--so-slate-50);
472
+ }
473
+
474
+ .matrix__service-row:hover {
475
+ filter: brightness(0.98);
476
+ }
477
+
478
+ .matrix__service-cell {
479
+ padding: 0.625rem 1rem;
480
+ padding-left: 2rem;
481
+ border-bottom: 1px solid var(--so-slate-100);
482
+ position: sticky;
483
+ left: 0;
484
+ z-index: 10;
485
+ }
486
+
487
+ .matrix__service-title {
488
+ font-family: var(--so-font-sans);
489
+ font-size: 0.8125rem;
490
+ color: var(--so-slate-700);
491
+ }
492
+
493
+ .matrix__service-title--clickable {
494
+ background: none;
495
+ border: none;
496
+ padding: 0.25rem 0.5rem;
497
+ margin: -0.25rem;
498
+ border-radius: 4px;
499
+ cursor: pointer;
500
+ transition: all var(--so-transition-fast);
501
+ text-align: left;
502
+ }
503
+
504
+ .matrix__service-title--clickable:hover {
505
+ background: var(--so-slate-100);
506
+ color: var(--so-violet-700);
507
+ }
508
+
509
+ .matrix__service-setup-badge {
510
+ display: inline-block;
511
+ padding: 0.0625rem 0.375rem;
512
+ margin-left: 0.375rem;
513
+ font-size: 0.5625rem;
514
+ font-weight: 700;
515
+ text-transform: uppercase;
516
+ letter-spacing: 0.04em;
517
+ border-radius: var(--so-radius-sm);
518
+ background: var(--so-amber-100);
519
+ color: var(--so-amber-700);
520
+ vertical-align: middle;
521
+ }
522
+
523
+ .matrix__service-setup-price {
524
+ display: inline-block;
525
+ padding: 0.0625rem 0.375rem;
526
+ margin-left: 0.25rem;
527
+ font-family: var(--so-font-mono);
528
+ font-size: 0.6875rem;
529
+ font-weight: 600;
530
+ border-radius: var(--so-radius-sm);
531
+ background: var(--so-slate-100);
532
+ color: var(--so-slate-700);
533
+ vertical-align: middle;
534
+ }
535
+
536
+ /* Premium Only Badge - Exclusivity Signal (Toggle Button) */
537
+ .matrix__premium-badge {
538
+ display: inline-flex;
539
+ align-items: center;
540
+ gap: 0.25rem;
541
+ padding: 0.125rem 0.5rem;
542
+ margin-left: 0.5rem;
543
+ font-size: 0.5625rem;
544
+ font-weight: 700;
545
+ text-transform: uppercase;
546
+ letter-spacing: 0.04em;
547
+ border-radius: 100px;
548
+ cursor: pointer;
549
+ transition: all var(--so-transition-fast);
550
+ font-family: var(--so-font-sans);
551
+ }
552
+
553
+ .matrix__premium-badge--active {
554
+ color: var(--so-amber-700);
555
+ background: linear-gradient(135deg, var(--so-amber-100) 0%, var(--so-amber-50) 100%);
556
+ border: 1px solid var(--so-amber-200);
557
+ }
558
+
559
+ .matrix__premium-badge--active:hover {
560
+ background: linear-gradient(135deg, var(--so-amber-200) 0%, var(--so-amber-100) 100%);
561
+ border-color: var(--so-amber-300);
562
+ }
563
+
564
+ .matrix__premium-badge--inactive {
565
+ color: var(--so-slate-400);
566
+ background: var(--so-slate-50);
567
+ border: 1px dashed var(--so-slate-200);
568
+ opacity: 0.6;
569
+ }
570
+
571
+ .matrix__premium-badge--inactive:hover {
572
+ opacity: 1;
573
+ color: var(--so-amber-600);
574
+ background: var(--so-amber-50);
575
+ border: 1px dashed var(--so-amber-300);
576
+ }
577
+
578
+ .matrix__premium-badge--active svg {
579
+ width: 0.625rem;
580
+ height: 0.625rem;
581
+ fill: var(--so-amber-500);
582
+ stroke: var(--so-amber-600);
583
+ }
584
+
585
+ .matrix__premium-badge--inactive svg {
586
+ width: 0.625rem;
587
+ height: 0.625rem;
588
+ fill: none;
589
+ stroke: currentColor;
590
+ }
591
+
592
+ /* Incomplete Services Warning */
593
+ .matrix__incomplete-warning {
594
+ display: flex;
595
+ align-items: flex-start;
596
+ gap: 0.875rem;
597
+ padding: 1rem 1.25rem;
598
+ margin-bottom: 1rem;
599
+ background: var(--so-amber-50);
600
+ border: 1px solid var(--so-amber-200);
601
+ border-radius: var(--so-radius-md);
602
+ animation: matrix-warning-pulse 2s ease-in-out infinite;
603
+ }
604
+
605
+ @keyframes matrix-warning-pulse {
606
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(245, 158, 11, 0); }
607
+ 50% { box-shadow: 0 0 0 4px rgba(245, 158, 11, 0.1); }
608
+ }
609
+
610
+ .matrix__incomplete-icon {
611
+ flex-shrink: 0;
612
+ width: 1.5rem;
613
+ height: 1.5rem;
614
+ color: var(--so-amber-600);
615
+ }
616
+
617
+ .matrix__incomplete-icon svg {
618
+ width: 100%;
619
+ height: 100%;
620
+ }
621
+
622
+ .matrix__incomplete-content {
623
+ display: flex;
624
+ flex-direction: column;
625
+ gap: 0.25rem;
626
+ }
627
+
628
+ .matrix__incomplete-title {
629
+ font-size: 0.875rem;
630
+ font-weight: 600;
631
+ color: var(--so-amber-800);
632
+ }
633
+
634
+ .matrix__incomplete-text {
635
+ font-size: 0.8125rem;
636
+ color: var(--so-amber-700);
637
+ line-height: 1.5;
638
+ }
639
+
640
+ .matrix__incomplete-text strong {
641
+ font-weight: 600;
642
+ color: var(--so-amber-900);
643
+ }
644
+
645
+ /* Bulk Actions Toolbar */
646
+ .matrix__bulk-actions {
647
+ margin-bottom: 1rem;
648
+ }
649
+
650
+ .matrix__bulk-toggle {
651
+ display: flex;
652
+ align-items: center;
653
+ gap: 0.5rem;
654
+ padding: 0.625rem 1rem;
655
+ font-family: var(--so-font-sans);
656
+ font-size: 0.8125rem;
657
+ font-weight: 600;
658
+ color: var(--so-slate-600);
659
+ background: var(--so-slate-100);
660
+ border: 1px solid var(--so-slate-200);
661
+ border-radius: var(--so-radius-md);
662
+ cursor: pointer;
663
+ transition: all var(--so-transition-fast);
664
+ }
665
+
666
+ .matrix__bulk-toggle:hover {
667
+ background: var(--so-slate-200);
668
+ color: var(--so-slate-700);
669
+ }
670
+
671
+ .matrix__bulk-toggle svg:first-child {
672
+ width: 1rem;
673
+ height: 1rem;
674
+ }
675
+
676
+ .matrix__bulk-toggle-arrow {
677
+ width: 0.875rem;
678
+ height: 0.875rem;
679
+ margin-left: auto;
680
+ transition: transform var(--so-transition-fast);
681
+ }
682
+
683
+ .matrix__bulk-toggle-arrow--open {
684
+ transform: rotate(180deg);
685
+ }
686
+
687
+ .matrix__bulk-panel {
688
+ margin-top: 0.75rem;
689
+ padding: 1rem;
690
+ background: var(--so-slate-50);
691
+ border: 1px solid var(--so-slate-200);
692
+ border-radius: var(--so-radius-md);
693
+ display: flex;
694
+ flex-direction: column;
695
+ gap: 1rem;
696
+ animation: so-scale-in var(--so-transition-fast) ease-out;
697
+ }
698
+
699
+ .matrix__bulk-section {
700
+ display: flex;
701
+ flex-direction: column;
702
+ gap: 0.5rem;
703
+ }
704
+
705
+ .matrix__bulk-label {
706
+ font-size: 0.6875rem;
707
+ font-weight: 600;
708
+ text-transform: uppercase;
709
+ letter-spacing: 0.05em;
710
+ color: var(--so-slate-500);
711
+ }
712
+
713
+ .matrix__bulk-buttons,
714
+ .matrix__bulk-copy {
715
+ display: flex;
716
+ flex-wrap: wrap;
717
+ gap: 0.5rem;
718
+ }
719
+
720
+ .matrix__bulk-btn {
721
+ display: flex;
722
+ align-items: center;
723
+ gap: 0.375rem;
724
+ padding: 0.5rem 0.875rem;
725
+ font-family: var(--so-font-sans);
726
+ font-size: 0.75rem;
727
+ font-weight: 500;
728
+ border-radius: var(--so-radius-sm);
729
+ border: 1px solid;
730
+ cursor: pointer;
731
+ transition: all var(--so-transition-fast);
732
+ }
733
+
734
+ .matrix__bulk-btn svg {
735
+ width: 0.875rem;
736
+ height: 0.875rem;
737
+ }
738
+
739
+ .matrix__bulk-btn--include {
740
+ background: var(--so-emerald-50);
741
+ border-color: var(--so-emerald-200);
742
+ color: var(--so-emerald-700);
743
+ }
744
+
745
+ .matrix__bulk-btn--include:hover {
746
+ background: var(--so-emerald-100);
747
+ border-color: var(--so-emerald-300);
748
+ }
749
+
750
+ .matrix__bulk-btn--clear {
751
+ background: var(--so-rose-50);
752
+ border-color: var(--so-rose-200);
753
+ color: var(--so-rose-700);
754
+ }
755
+
756
+ .matrix__bulk-btn--clear:hover {
757
+ background: var(--so-rose-100);
758
+ border-color: var(--so-rose-300);
759
+ }
760
+
761
+ .matrix__bulk-btn--copy {
762
+ background: var(--so-sky-50);
763
+ border-color: var(--so-sky-200);
764
+ color: var(--so-sky-700);
765
+ }
766
+
767
+ .matrix__bulk-btn--copy:hover {
768
+ background: var(--so-sky-100);
769
+ border-color: var(--so-sky-300);
770
+ }
771
+
772
+ /* Pattern Presets Section */
773
+ .matrix__bulk-patterns {
774
+ border-top: 1px dashed var(--so-slate-200);
775
+ padding-top: 1rem;
776
+ margin-top: 0.5rem;
777
+ }
778
+
779
+ .matrix__bulk-label-icon {
780
+ width: 1rem;
781
+ height: 1rem;
782
+ vertical-align: middle;
783
+ margin-right: 0.25rem;
784
+ }
785
+
786
+ .matrix__pattern-grid {
787
+ display: grid;
788
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
789
+ gap: 0.75rem;
790
+ margin-top: 0.5rem;
791
+ }
792
+
793
+ .matrix__pattern-btn {
794
+ display: flex;
795
+ flex-direction: column;
796
+ align-items: center;
797
+ gap: 0.25rem;
798
+ padding: 0.875rem 0.75rem;
799
+ background: linear-gradient(135deg, var(--so-white) 0%, var(--so-slate-50) 100%);
800
+ border: 1px solid var(--so-slate-200);
801
+ border-radius: var(--so-radius-md);
802
+ cursor: pointer;
803
+ transition: all var(--so-transition-fast);
804
+ text-align: center;
805
+ }
806
+
807
+ .matrix__pattern-btn:hover {
808
+ transform: translateY(-2px);
809
+ box-shadow: var(--so-shadow-md);
810
+ border-color: var(--so-violet-300);
811
+ background: linear-gradient(135deg, var(--so-violet-50) 0%, var(--so-white) 100%);
812
+ }
813
+
814
+ .matrix__pattern-btn:active {
815
+ transform: translateY(0);
816
+ }
817
+
818
+ .matrix__pattern-icon {
819
+ font-size: 1.5rem;
820
+ line-height: 1;
821
+ }
822
+
823
+ .matrix__pattern-name {
824
+ font-size: 0.8125rem;
825
+ font-weight: 600;
826
+ color: var(--so-slate-700);
827
+ }
828
+
829
+ .matrix__pattern-desc {
830
+ font-size: 0.6875rem;
831
+ color: var(--so-slate-500);
832
+ line-height: 1.3;
833
+ }
834
+
835
+ .matrix__pattern-btn--simple {
836
+ padding: 0.625rem 0.75rem;
837
+ flex-direction: row;
838
+ gap: 0.5rem;
839
+ }
840
+
841
+ .matrix__pattern-btn--simple .matrix__pattern-icon {
842
+ font-size: 1rem;
843
+ }
844
+
845
+ .matrix__pattern-btn--simple .matrix__pattern-name {
846
+ font-size: 0.75rem;
847
+ }
848
+
849
+ .matrix__level-cell {
850
+ padding: 0.625rem 1rem;
851
+ text-align: center;
852
+ border-bottom: 1px solid var(--so-slate-100);
853
+ cursor: pointer;
854
+ transition: var(--so-transition-fast);
855
+ }
856
+
857
+ .matrix__level-cell:hover {
858
+ background: rgba(255, 255, 255, 0.5);
859
+ }
860
+
861
+ .matrix__level-cell--selected {
862
+ box-shadow: inset 0 0 0 2px #8b5cf6;
863
+ background: rgba(139, 92, 246, 0.08);
864
+ }
865
+
866
+ .matrix__level-cell--highlight {
867
+ background: linear-gradient(180deg, rgba(139, 92, 246, 0.06) 0%, rgba(139, 92, 246, 0.12) 100%);
868
+ }
869
+
870
+ .matrix__level-value {
871
+ font-family: var(--so-font-sans);
872
+ font-weight: 500;
873
+ }
874
+
875
+ /* Loss Aversion Styling for NOT_INCLUDED */
876
+ .matrix__level-cell--not-included {
877
+ position: relative;
878
+ background: repeating-linear-gradient(
879
+ 135deg,
880
+ transparent,
881
+ transparent 8px,
882
+ rgba(148, 163, 184, 0.08) 8px,
883
+ rgba(148, 163, 184, 0.08) 16px
884
+ );
885
+ }
886
+
887
+ .matrix__level-cell--not-included:hover .matrix__upgrade-hint {
888
+ opacity: 1;
889
+ transform: translateY(0);
890
+ }
891
+
892
+ .matrix__upgrade-hint {
893
+ position: absolute;
894
+ bottom: 2px;
895
+ left: 50%;
896
+ transform: translateX(-50%) translateY(4px);
897
+ font-size: 0.5625rem;
898
+ font-weight: 500;
899
+ color: var(--so-violet-600);
900
+ white-space: nowrap;
901
+ opacity: 0;
902
+ transition: all 0.15s ease-out;
903
+ pointer-events: none;
904
+ }
905
+
906
+ .matrix__level-value--not-included {
907
+ opacity: 0.6;
908
+ }
909
+
910
+ /* Metric Row */
911
+ .matrix__metric-row {
912
+ background: inherit;
913
+ cursor: pointer;
914
+ transition: var(--so-transition-fast);
915
+ height: 2.25rem;
916
+ }
917
+
918
+ .matrix__metric-row:hover {
919
+ background: rgba(124, 58, 237, 0.08);
920
+ }
921
+
922
+ .matrix__metric-cell {
923
+ padding: 0.5rem 1rem;
924
+ padding-left: 7rem;
925
+ border-bottom: 1px solid var(--so-slate-100);
926
+ position: sticky;
927
+ left: 0;
928
+ z-index: 10;
929
+ height: 2.25rem;
930
+ vertical-align: middle;
931
+ }
932
+
933
+ .matrix__metric-name-wrapper {
934
+ display: flex;
935
+ align-items: center;
936
+ gap: 0.5rem;
937
+ position: relative;
938
+ height: 100%;
939
+ }
940
+
941
+ .matrix__metric-name-wrapper::before {
942
+ content: "";
943
+ position: absolute;
944
+ left: -2rem;
945
+ top: 50%;
946
+ width: 1.5rem;
947
+ height: 1px;
948
+ background: var(--so-slate-300);
949
+ }
950
+
951
+ .matrix__metric-name-wrapper::after {
952
+ content: "";
953
+ position: absolute;
954
+ left: -2rem;
955
+ top: -100%;
956
+ width: 1px;
957
+ height: calc(100% + 50%);
958
+ background: var(--so-slate-300);
959
+ }
960
+
961
+ .matrix__metric-name {
962
+ font-family: var(--so-font-sans);
963
+ font-size: 0.75rem;
964
+ font-style: italic;
965
+ color: var(--so-slate-500);
966
+ }
967
+
968
+ .matrix__metric-actions {
969
+ display: flex;
970
+ gap: 0.25rem;
971
+ opacity: 0;
972
+ transition: var(--so-transition-fast);
973
+ }
974
+
975
+ .matrix__metric-row:hover .matrix__metric-actions {
976
+ opacity: 1;
977
+ }
978
+
979
+ .matrix__metric-btn {
980
+ padding: 0.125rem;
981
+ background: transparent;
982
+ border: none;
983
+ color: var(--so-slate-400);
984
+ cursor: pointer;
985
+ border-radius: var(--so-radius-sm);
986
+ transition: var(--so-transition-fast);
987
+ display: flex;
988
+ align-items: center;
989
+ justify-content: center;
990
+ }
991
+
992
+ .matrix__metric-btn:hover {
993
+ background: var(--so-slate-200);
994
+ }
995
+
996
+ .matrix__metric-btn--edit:hover {
997
+ color: var(--so-violet-600);
998
+ }
999
+
1000
+ .matrix__metric-btn--remove:hover {
1001
+ color: var(--so-rose-600);
1002
+ }
1003
+
1004
+ .matrix__metric-btn-icon {
1005
+ width: 0.75rem;
1006
+ height: 0.75rem;
1007
+ }
1008
+
1009
+ .matrix__metric-value-cell {
1010
+ padding: 0.375rem 1rem;
1011
+ text-align: center;
1012
+ border-bottom: 1px solid var(--so-slate-100);
1013
+ }
1014
+
1015
+ .matrix__metric-value-container {
1016
+ display: flex;
1017
+ flex-direction: column;
1018
+ align-items: center;
1019
+ gap: 0.125rem;
1020
+ }
1021
+
1022
+ .matrix__metric-value {
1023
+ font-size: 0.6875rem;
1024
+ color: var(--so-slate-500);
1025
+ }
1026
+
1027
+ .matrix__metric-overage {
1028
+ font-family: var(--so-font-mono);
1029
+ font-size: 0.5625rem;
1030
+ font-weight: 500;
1031
+ color: #059669;
1032
+ white-space: nowrap;
1033
+ }
1034
+
1035
+ .matrix__metric-reset-cycle {
1036
+ font-size: 0.5625rem;
1037
+ font-weight: 500;
1038
+ color: #64748b;
1039
+ text-transform: capitalize;
1040
+ }
1041
+
1042
+ /* Add Metric Button on Service Row */
1043
+ .matrix__service-cell-wrapper {
1044
+ display: flex;
1045
+ align-items: center;
1046
+ justify-content: flex-start;
1047
+ gap: 0.5rem;
1048
+ }
1049
+
1050
+ .matrix__add-metric-btn {
1051
+ opacity: 0.6;
1052
+ font-family: var(--so-font-sans);
1053
+ font-size: 0.6875rem;
1054
+ font-weight: 500;
1055
+ color: var(--so-violet-600);
1056
+ background: transparent;
1057
+ border: none;
1058
+ cursor: pointer;
1059
+ padding: 0.125rem 0.375rem;
1060
+ border-radius: var(--so-radius-sm);
1061
+ transition: var(--so-transition-fast);
1062
+ white-space: nowrap;
1063
+ }
1064
+
1065
+ .matrix__service-row:hover .matrix__add-metric-btn {
1066
+ opacity: 1;
1067
+ }
1068
+
1069
+ .matrix__add-metric-btn:hover {
1070
+ background: var(--so-violet-100);
1071
+ color: var(--so-violet-700);
1072
+ }
1073
+
1074
+ /* Reorder Buttons for Service Reordering */
1075
+ .matrix__reorder-buttons {
1076
+ display: flex;
1077
+ flex-direction: column;
1078
+ gap: 1px;
1079
+ margin-right: 0.5rem;
1080
+ opacity: 0;
1081
+ transition: opacity 0.15s ease;
1082
+ }
1083
+
1084
+ .matrix__service-row:hover .matrix__reorder-buttons {
1085
+ opacity: 1;
1086
+ }
1087
+
1088
+ .matrix__reorder-btn {
1089
+ display: flex;
1090
+ align-items: center;
1091
+ justify-content: center;
1092
+ width: 18px;
1093
+ height: 14px;
1094
+ padding: 0;
1095
+ border: none;
1096
+ background: transparent;
1097
+ color: var(--so-slate-400);
1098
+ cursor: pointer;
1099
+ border-radius: 2px;
1100
+ transition: all 0.15s ease;
1101
+ }
1102
+
1103
+ .matrix__reorder-btn:hover:not(:disabled) {
1104
+ background: var(--so-violet-100);
1105
+ color: var(--so-violet-600);
1106
+ }
1107
+
1108
+ .matrix__reorder-btn:disabled {
1109
+ opacity: 0.3;
1110
+ cursor: not-allowed;
1111
+ }
1112
+
1113
+ .matrix__reorder-btn svg {
1114
+ width: 12px;
1115
+ height: 12px;
1116
+ }
1117
+
1118
+ /* Add Service Row */
1119
+ .matrix__add-service-row td {
1120
+ padding: 0.5rem 1rem;
1121
+ padding-left: 2rem;
1122
+ border-bottom: 1px solid var(--so-slate-100);
1123
+ }
1124
+
1125
+ .matrix__add-service-btn {
1126
+ display: flex;
1127
+ align-items: center;
1128
+ gap: 0.375rem;
1129
+ font-family: var(--so-font-sans);
1130
+ font-size: 0.8125rem;
1131
+ font-weight: 500;
1132
+ color: var(--so-violet-600);
1133
+ background: transparent;
1134
+ border: none;
1135
+ cursor: pointer;
1136
+ transition: var(--so-transition-fast);
1137
+ }
1138
+
1139
+ .matrix__add-service-btn:hover {
1140
+ color: var(--so-violet-700);
1141
+ }
1142
+
1143
+ .matrix__add-service-icon {
1144
+ width: 1rem;
1145
+ height: 1rem;
1146
+ }
1147
+
1148
+ /* Total Rows */
1149
+ .matrix__total-row {
1150
+ background: var(--so-slate-100);
1151
+ }
1152
+
1153
+ .matrix__total-row td {
1154
+ padding: 0.625rem 1rem;
1155
+ font-weight: 600;
1156
+ color: var(--so-slate-700);
1157
+ border-bottom: 1px solid var(--so-slate-300);
1158
+ }
1159
+
1160
+ .matrix__total-row td:first-child {
1161
+ position: sticky;
1162
+ left: 0;
1163
+ z-index: 10;
1164
+ background: var(--so-slate-100);
1165
+ }
1166
+
1167
+ .matrix__setup-total-row {
1168
+ background: var(--so-slate-50);
1169
+ }
1170
+
1171
+ .matrix__setup-total-row td {
1172
+ padding: 0.625rem 1rem;
1173
+ font-weight: 600;
1174
+ color: var(--so-slate-700);
1175
+ border-bottom: 1px solid var(--so-slate-200);
1176
+ }
1177
+
1178
+ .matrix__setup-total-row td:first-child {
1179
+ position: sticky;
1180
+ left: 0;
1181
+ z-index: 10;
1182
+ background: var(--so-slate-50);
1183
+ }
1184
+
1185
+ /* Grand Total */
1186
+ .matrix__grand-total-row {
1187
+ background: var(--so-violet-100);
1188
+ }
1189
+
1190
+ .matrix__grand-total-row td {
1191
+ padding: 0.875rem 1rem;
1192
+ font-weight: 700;
1193
+ color: var(--so-violet-900);
1194
+ border-top: 2px solid var(--so-violet-300);
1195
+ }
1196
+
1197
+ .matrix__grand-total-row td:first-child {
1198
+ position: sticky;
1199
+ left: 0;
1200
+ z-index: 10;
1201
+ background: var(--so-violet-100);
1202
+ }
1203
+
1204
+ .matrix__grand-total-cell--selected {
1205
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a855f7 100%);
1206
+ color: var(--so-white);
1207
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15);
1208
+ position: relative;
1209
+ }
1210
+
1211
+ .matrix__grand-total-row--setup {
1212
+ background: var(--so-violet-50);
1213
+ border-top: none;
1214
+ }
1215
+
1216
+ .matrix__grand-total-row--setup td {
1217
+ border-top: 1px dashed var(--so-violet-200);
1218
+ font-weight: 600;
1219
+ font-size: 0.8125rem;
1220
+ color: var(--so-violet-700);
1221
+ padding: 0.5rem 1rem;
1222
+ }
1223
+
1224
+ .matrix__grand-total-row--setup td:first-child {
1225
+ background: var(--so-violet-50);
1226
+ }
1227
+
1228
+ .matrix__grand-total-row--addon {
1229
+ background: var(--so-violet-50);
1230
+ }
1231
+
1232
+ .matrix__grand-total-row--addon td {
1233
+ border-top: 1px dashed var(--so-violet-200);
1234
+ font-weight: 600;
1235
+ font-size: 0.8125rem;
1236
+ color: var(--so-violet-700);
1237
+ padding: 0.5rem 1rem;
1238
+ }
1239
+
1240
+ .matrix__grand-total-row--addon td:first-child {
1241
+ background: var(--so-violet-50);
1242
+ }
1243
+
1244
+ /* Empty State */
1245
+ .matrix__empty {
1246
+ padding: 4rem 2rem;
1247
+ text-align: center;
1248
+ }
1249
+
1250
+ .matrix__empty-icon {
1251
+ width: 4rem;
1252
+ height: 4rem;
1253
+ margin: 0 auto 1rem;
1254
+ color: var(--so-slate-300);
1255
+ }
1256
+
1257
+ .matrix__empty-title {
1258
+ font-family: var(--so-font-sans);
1259
+ font-size: 1.125rem;
1260
+ font-weight: 600;
1261
+ color: var(--so-slate-900);
1262
+ margin-bottom: 0.5rem;
1263
+ }
1264
+
1265
+ .matrix__empty-text {
1266
+ font-size: 0.875rem;
1267
+ color: var(--so-slate-500);
1268
+ max-width: 28rem;
1269
+ margin: 0 auto;
1270
+ }
1271
+
1272
+ /* Detail Panel */
1273
+ .matrix__panel-overlay {
1274
+ position: fixed;
1275
+ inset: 0;
1276
+ background: rgba(15, 23, 42, 0.75);
1277
+ backdrop-filter: blur(4px);
1278
+ display: flex;
1279
+ align-items: center;
1280
+ justify-content: flex-end;
1281
+ z-index: 50;
1282
+ animation: panel-overlay-fade 0.2s ease-out;
1283
+ }
1284
+
1285
+ @keyframes panel-overlay-fade {
1286
+ from {
1287
+ opacity: 0;
1288
+ backdrop-filter: blur(0px);
1289
+ }
1290
+ to {
1291
+ opacity: 1;
1292
+ backdrop-filter: blur(4px);
1293
+ }
1294
+ }
1295
+
1296
+ .matrix__panel {
1297
+ width: 24rem;
1298
+ height: 100%;
1299
+ background: #ffffff;
1300
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
1301
+ overflow-y: auto;
1302
+ animation: panel-slide-in 0.2s ease-out;
1303
+ }
1304
+
1305
+ @keyframes panel-slide-in {
1306
+ from {
1307
+ transform: translateX(100%);
1308
+ }
1309
+ to {
1310
+ transform: translateX(0);
1311
+ }
1312
+ }
1313
+
1314
+ .matrix__panel-header {
1315
+ background: #7c3aed;
1316
+ color: #ffffff;
1317
+ padding: 1rem;
1318
+ }
1319
+
1320
+ .matrix__panel-header-top {
1321
+ display: flex;
1322
+ align-items: center;
1323
+ justify-content: space-between;
1324
+ margin-bottom: 0.25rem;
1325
+ }
1326
+
1327
+ .matrix__panel-tier {
1328
+ font-family: var(--so-font-mono);
1329
+ font-size: 0.6875rem;
1330
+ text-transform: uppercase;
1331
+ letter-spacing: 0.08em;
1332
+ opacity: 0.8;
1333
+ }
1334
+
1335
+ .matrix__panel-close {
1336
+ padding: 0.25rem;
1337
+ background: transparent;
1338
+ border: none;
1339
+ color: #ffffff;
1340
+ cursor: pointer;
1341
+ border-radius: var(--so-radius-sm);
1342
+ transition: var(--so-transition-fast);
1343
+ }
1344
+
1345
+ .matrix__panel-close:hover {
1346
+ background: rgba(255, 255, 255, 0.2);
1347
+ }
1348
+
1349
+ .matrix__panel-close-icon {
1350
+ width: 1.25rem;
1351
+ height: 1.25rem;
1352
+ }
1353
+
1354
+ .matrix__panel-title {
1355
+ font-family: var(--so-font-sans);
1356
+ font-size: 1.125rem;
1357
+ font-weight: 600;
1358
+ }
1359
+
1360
+ .matrix__panel-body {
1361
+ padding: 1rem;
1362
+ display: flex;
1363
+ flex-direction: column;
1364
+ gap: 1.5rem;
1365
+ }
1366
+
1367
+ .matrix__panel-section-label {
1368
+ display: block;
1369
+ font-family: var(--so-font-sans);
1370
+ font-size: 0.8125rem;
1371
+ font-weight: 600;
1372
+ color: #334155;
1373
+ margin-bottom: 0.75rem;
1374
+ }
1375
+
1376
+ .matrix__panel-level-grid {
1377
+ display: grid;
1378
+ grid-template-columns: repeat(2, 1fr);
1379
+ gap: 0.5rem;
1380
+ }
1381
+
1382
+ .matrix__panel-level-btn {
1383
+ padding: 0.625rem 0.875rem;
1384
+ font-family: var(--so-font-sans);
1385
+ font-size: 0.8125rem;
1386
+ font-weight: 500;
1387
+ color: #1e293b;
1388
+ border-radius: var(--so-radius-md);
1389
+ border: 2px solid #cbd5e1;
1390
+ background: #ffffff;
1391
+ cursor: pointer;
1392
+ transition: var(--so-transition-fast);
1393
+ }
1394
+
1395
+ .matrix__panel-level-btn:hover:not(.matrix__panel-level-btn--active) {
1396
+ border-color: #94a3b8;
1397
+ background: #f8fafc;
1398
+ }
1399
+
1400
+ .matrix__panel-level-btn--active {
1401
+ border-color: #8b5cf6;
1402
+ background: #f5f3ff;
1403
+ color: #6d28d9;
1404
+ font-weight: 600;
1405
+ }
1406
+
1407
+ .matrix__panel-input {
1408
+ width: 100%;
1409
+ font-family: var(--so-font-sans);
1410
+ font-size: 0.8125rem;
1411
+ color: #0f172a;
1412
+ background: #ffffff;
1413
+ border: 1.5px solid #cbd5e1;
1414
+ border-radius: var(--so-radius-md);
1415
+ padding: 0.625rem 0.875rem;
1416
+ outline: none;
1417
+ transition: var(--so-transition-fast);
1418
+ }
1419
+
1420
+ .matrix__panel-input:focus {
1421
+ border-color: #8b5cf6;
1422
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.15);
1423
+ }
1424
+
1425
+ .matrix__panel-limits-header {
1426
+ display: flex;
1427
+ align-items: center;
1428
+ justify-content: space-between;
1429
+ margin-bottom: 0.75rem;
1430
+ }
1431
+
1432
+ .matrix__panel-add-btn {
1433
+ font-family: var(--so-font-sans);
1434
+ font-size: 0.8125rem;
1435
+ font-weight: 600;
1436
+ color: #7c3aed;
1437
+ background: transparent;
1438
+ border: none;
1439
+ cursor: pointer;
1440
+ transition: var(--so-transition-fast);
1441
+ }
1442
+
1443
+ .matrix__panel-add-btn:hover {
1444
+ color: #6d28d9;
1445
+ }
1446
+
1447
+ .matrix__panel-empty-text {
1448
+ font-size: 0.8125rem;
1449
+ font-style: italic;
1450
+ color: #64748b;
1451
+ }
1452
+
1453
+ .matrix__panel-limit-item {
1454
+ display: flex;
1455
+ align-items: center;
1456
+ gap: 0.75rem;
1457
+ padding: 0.75rem;
1458
+ background: #f8fafc;
1459
+ border: 1px solid #e2e8f0;
1460
+ border-radius: var(--so-radius-md);
1461
+ margin-bottom: 0.75rem;
1462
+ }
1463
+
1464
+ .matrix__panel-limit-item:hover .matrix__panel-limit-actions {
1465
+ opacity: 1;
1466
+ }
1467
+
1468
+ .matrix__panel-limit-content {
1469
+ flex: 1;
1470
+ cursor: pointer;
1471
+ padding: 0.25rem;
1472
+ margin: -0.25rem;
1473
+ border-radius: var(--so-radius-sm);
1474
+ transition: var(--so-transition-fast);
1475
+ }
1476
+
1477
+ .matrix__panel-limit-content:hover {
1478
+ background: #e2e8f0;
1479
+ }
1480
+
1481
+ .matrix__panel-limit-metric {
1482
+ font-family: var(--so-font-sans);
1483
+ font-size: 0.875rem;
1484
+ font-weight: 600;
1485
+ color: #0f172a;
1486
+ }
1487
+
1488
+ .matrix__panel-limit-value {
1489
+ font-size: 0.8125rem;
1490
+ color: #64748b;
1491
+ }
1492
+
1493
+ .matrix__panel-limit-value-group {
1494
+ display: flex;
1495
+ flex-direction: column;
1496
+ gap: 0.125rem;
1497
+ }
1498
+
1499
+ .matrix__panel-limit-overage {
1500
+ font-family: var(--so-font-mono);
1501
+ font-size: 0.6875rem;
1502
+ color: #059669;
1503
+ font-weight: 500;
1504
+ }
1505
+
1506
+ /* Overage Pricing Section */
1507
+ .matrix__panel-overage-section {
1508
+ margin-top: 0.5rem;
1509
+ padding-top: 0.75rem;
1510
+ border-top: 1px dashed #cbd5e1;
1511
+ }
1512
+
1513
+ .matrix__panel-overage-row {
1514
+ display: flex;
1515
+ align-items: center;
1516
+ gap: 0.375rem;
1517
+ flex-wrap: wrap;
1518
+ }
1519
+
1520
+ .matrix__panel-overage-price {
1521
+ display: flex;
1522
+ align-items: center;
1523
+ gap: 0.25rem;
1524
+ }
1525
+
1526
+ .matrix__panel-overage-currency {
1527
+ font-family: var(--so-font-mono);
1528
+ font-size: 0.875rem;
1529
+ color: #64748b;
1530
+ }
1531
+
1532
+ .matrix__panel-overage-input {
1533
+ width: 4.5rem;
1534
+ font-family: var(--so-font-mono);
1535
+ font-size: 0.875rem;
1536
+ font-weight: 500;
1537
+ color: #0f172a;
1538
+ background: #ffffff;
1539
+ border: 1px solid #cbd5e1;
1540
+ border-radius: var(--so-radius-sm);
1541
+ padding: 0.375rem 0.5rem;
1542
+ outline: none;
1543
+ transition: border-color 0.15s ease;
1544
+ }
1545
+
1546
+ .matrix__panel-overage-input:focus {
1547
+ border-color: #7c3aed;
1548
+ }
1549
+
1550
+ .matrix__panel-overage-separator {
1551
+ font-size: 0.875rem;
1552
+ color: #94a3b8;
1553
+ }
1554
+
1555
+ .matrix__panel-overage-select {
1556
+ font-family: var(--so-font-sans);
1557
+ font-size: 0.8125rem;
1558
+ color: #334155;
1559
+ background: #ffffff;
1560
+ border: 1px solid #cbd5e1;
1561
+ border-radius: var(--so-radius-sm);
1562
+ padding: 0.375rem 0.5rem;
1563
+ cursor: pointer;
1564
+ outline: none;
1565
+ }
1566
+
1567
+ .matrix__panel-overage-select:focus {
1568
+ border-color: #7c3aed;
1569
+ }
1570
+
1571
+ .matrix__panel-overage-label {
1572
+ font-size: 0.75rem;
1573
+ color: #64748b;
1574
+ }
1575
+
1576
+ .matrix__panel-limit-actions {
1577
+ display: flex;
1578
+ gap: 0.25rem;
1579
+ opacity: 0;
1580
+ transition: var(--so-transition-fast);
1581
+ }
1582
+
1583
+ .matrix__panel-limit-btn {
1584
+ padding: 0.25rem;
1585
+ background: transparent;
1586
+ border: none;
1587
+ color: #94a3b8;
1588
+ cursor: pointer;
1589
+ border-radius: var(--so-radius-sm);
1590
+ transition: var(--so-transition-fast);
1591
+ }
1592
+
1593
+ .matrix__panel-limit-btn:hover {
1594
+ background: #e2e8f0;
1595
+ }
1596
+
1597
+ .matrix__panel-limit-btn--edit:hover {
1598
+ color: #7c3aed;
1599
+ }
1600
+
1601
+ .matrix__panel-limit-btn--remove:hover {
1602
+ color: #e11d48;
1603
+ }
1604
+
1605
+ .matrix__panel-limit-icon {
1606
+ width: 1rem;
1607
+ height: 1rem;
1608
+ }
1609
+
1610
+ /* Edit Form */
1611
+ .matrix__panel-edit-form {
1612
+ padding: 0.75rem;
1613
+ background: #f5f3ff;
1614
+ border-radius: var(--so-radius-md);
1615
+ margin-bottom: 0.75rem;
1616
+ }
1617
+
1618
+ .matrix__panel-edit-form > div {
1619
+ margin-bottom: 0.625rem;
1620
+ }
1621
+
1622
+ .matrix__panel-edit-form > div:last-child {
1623
+ margin-bottom: 0;
1624
+ }
1625
+
1626
+ .matrix__panel-edit-label {
1627
+ display: block;
1628
+ font-family: var(--so-font-mono);
1629
+ font-size: 0.625rem;
1630
+ font-weight: 600;
1631
+ text-transform: uppercase;
1632
+ letter-spacing: 0.08em;
1633
+ color: #64748b;
1634
+ margin-bottom: 0.25rem;
1635
+ }
1636
+
1637
+ .matrix__panel-edit-hint {
1638
+ font-size: 0.6875rem;
1639
+ color: #94a3b8;
1640
+ margin-top: 0.25rem;
1641
+ }
1642
+
1643
+ .matrix__panel-edit-actions {
1644
+ display: flex;
1645
+ gap: 0.5rem;
1646
+ }
1647
+
1648
+ .matrix__panel-edit-btn {
1649
+ flex: 1;
1650
+ padding: 0.5rem 0.75rem;
1651
+ font-family: var(--so-font-sans);
1652
+ font-size: 0.8125rem;
1653
+ font-weight: 600;
1654
+ border-radius: var(--so-radius-md);
1655
+ cursor: pointer;
1656
+ transition: var(--so-transition-fast);
1657
+ }
1658
+
1659
+ .matrix__panel-edit-btn--primary {
1660
+ background: #7c3aed;
1661
+ color: #ffffff;
1662
+ border: none;
1663
+ }
1664
+
1665
+ .matrix__panel-edit-btn--primary:hover:not(:disabled) {
1666
+ background: #6d28d9;
1667
+ }
1668
+
1669
+ .matrix__panel-edit-btn--primary:disabled {
1670
+ opacity: 0.5;
1671
+ cursor: not-allowed;
1672
+ }
1673
+
1674
+ .matrix__panel-edit-btn--secondary {
1675
+ background: #e2e8f0;
1676
+ color: #334155;
1677
+ border: none;
1678
+ }
1679
+
1680
+ .matrix__panel-edit-btn--secondary:hover {
1681
+ background: #cbd5e1;
1682
+ }
1683
+
1684
+ .matrix__panel-footer {
1685
+ padding: 1rem;
1686
+ border-top: 1px solid #e2e8f0;
1687
+ background: #ffffff;
1688
+ }
1689
+
1690
+ .matrix__panel-done-btn {
1691
+ width: 100%;
1692
+ padding: 0.625rem 1rem;
1693
+ font-family: var(--so-font-sans);
1694
+ font-size: 0.875rem;
1695
+ font-weight: 600;
1696
+ background: #7c3aed;
1697
+ color: #ffffff;
1698
+ border: none;
1699
+ border-radius: var(--so-radius-md);
1700
+ cursor: pointer;
1701
+ transition: var(--so-transition-fast);
1702
+ }
1703
+
1704
+ .matrix__panel-done-btn:hover {
1705
+ background: var(--so-violet-700);
1706
+ }
1707
+
1708
+ /* Modal */
1709
+ .matrix__modal-overlay {
1710
+ position: fixed;
1711
+ inset: 0;
1712
+ background: rgba(15, 23, 42, 0.75);
1713
+ backdrop-filter: blur(4px);
1714
+ display: flex;
1715
+ align-items: center;
1716
+ justify-content: center;
1717
+ z-index: 100;
1718
+ animation: modal-backdrop 0.2s ease-out;
1719
+ }
1720
+
1721
+ @keyframes modal-backdrop {
1722
+ from {
1723
+ opacity: 0;
1724
+ backdrop-filter: blur(0px);
1725
+ }
1726
+ to {
1727
+ opacity: 1;
1728
+ backdrop-filter: blur(4px);
1729
+ }
1730
+ }
1731
+
1732
+ .matrix__modal {
1733
+ width: 24rem;
1734
+ background: #ffffff;
1735
+ border-radius: var(--so-radius-lg);
1736
+ box-shadow:
1737
+ 0 25px 50px -12px rgba(0, 0, 0, 0.35),
1738
+ 0 0 0 1px rgba(0, 0, 0, 0.08);
1739
+ padding: 1.5rem;
1740
+ animation: modal-pop 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
1741
+ }
1742
+
1743
+ @keyframes modal-pop {
1744
+ from {
1745
+ opacity: 0;
1746
+ transform: scale(0.9) translateY(10px);
1747
+ }
1748
+ to {
1749
+ opacity: 1;
1750
+ transform: scale(1) translateY(0);
1751
+ }
1752
+ }
1753
+
1754
+ .matrix__modal-title {
1755
+ font-family: var(--so-font-sans);
1756
+ font-size: 1.25rem;
1757
+ font-weight: 700;
1758
+ color: #0f172a;
1759
+ margin-bottom: 1.25rem;
1760
+ letter-spacing: -0.02em;
1761
+ }
1762
+
1763
+ .matrix__modal-field {
1764
+ margin-bottom: 1.25rem;
1765
+ }
1766
+
1767
+ .matrix__modal-label {
1768
+ display: block;
1769
+ font-family: var(--so-font-sans);
1770
+ font-size: 0.8125rem;
1771
+ font-weight: 600;
1772
+ color: #334155;
1773
+ margin-bottom: 0.5rem;
1774
+ }
1775
+
1776
+ .matrix__modal-input {
1777
+ width: 100%;
1778
+ font-family: var(--so-font-sans);
1779
+ font-size: 0.875rem;
1780
+ color: #0f172a;
1781
+ background: #ffffff;
1782
+ border: 1.5px solid #cbd5e1;
1783
+ border-radius: var(--so-radius-md);
1784
+ padding: 0.75rem 1rem;
1785
+ outline: none;
1786
+ transition: var(--so-transition-fast);
1787
+ }
1788
+
1789
+ .matrix__modal-input:focus {
1790
+ border-color: #8b5cf6;
1791
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.15);
1792
+ }
1793
+
1794
+ .matrix__modal-input::placeholder {
1795
+ color: #94a3b8;
1796
+ }
1797
+
1798
+ .matrix__modal-hint {
1799
+ font-size: 0.8125rem;
1800
+ color: #475569;
1801
+ margin-bottom: 1.25rem;
1802
+ line-height: 1.5;
1803
+ }
1804
+
1805
+ .matrix__modal-actions {
1806
+ display: flex;
1807
+ gap: 0.75rem;
1808
+ justify-content: flex-end;
1809
+ padding-top: 0.5rem;
1810
+ }
1811
+
1812
+ .matrix__modal-btn {
1813
+ padding: 0.625rem 1.25rem;
1814
+ font-family: var(--so-font-sans);
1815
+ font-size: 0.875rem;
1816
+ font-weight: 600;
1817
+ border-radius: var(--so-radius-md);
1818
+ cursor: pointer;
1819
+ transition: all var(--so-transition-fast);
1820
+ }
1821
+
1822
+ .matrix__modal-btn--cancel {
1823
+ background: #e2e8f0;
1824
+ color: #475569;
1825
+ border: none;
1826
+ }
1827
+
1828
+ .matrix__modal-btn--cancel:hover {
1829
+ background: #cbd5e1;
1830
+ color: #1e293b;
1831
+ }
1832
+
1833
+ .matrix__modal-btn--primary {
1834
+ background: #7c3aed;
1835
+ color: #ffffff;
1836
+ border: none;
1837
+ box-shadow: 0 2px 4px rgba(124, 58, 237, 0.3);
1838
+ }
1839
+
1840
+ .matrix__modal-btn--primary:hover:not(:disabled) {
1841
+ background: #6d28d9;
1842
+ box-shadow: 0 4px 8px rgba(124, 58, 237, 0.4);
1843
+ transform: translateY(-1px);
1844
+ }
1845
+
1846
+ .matrix__modal-btn--primary:active:not(:disabled) {
1847
+ transform: translateY(0);
1848
+ }
1849
+
1850
+ .matrix__modal-btn--primary:disabled {
1851
+ opacity: 0.5;
1852
+ cursor: not-allowed;
1853
+ box-shadow: none;
1854
+ }
1855
+
1856
+ .matrix__modal--wide {
1857
+ width: min(32rem, calc(100vw - 2rem));
1858
+ max-width: 32rem;
1859
+ max-height: 85vh;
1860
+ overflow-y: auto;
1861
+ }
1862
+
1863
+ .matrix__modal-textarea {
1864
+ width: 100%;
1865
+ font-family: var(--so-font-sans);
1866
+ font-size: 0.875rem;
1867
+ color: #0f172a;
1868
+ background: #ffffff;
1869
+ border: 1.5px solid #cbd5e1;
1870
+ border-radius: var(--so-radius-md);
1871
+ padding: 0.75rem 1rem;
1872
+ outline: none;
1873
+ transition: var(--so-transition-fast);
1874
+ resize: vertical;
1875
+ min-height: 80px;
1876
+ }
1877
+
1878
+ .matrix__modal-textarea:focus {
1879
+ border-color: #8b5cf6;
1880
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.15);
1881
+ }
1882
+
1883
+ .matrix__modal-textarea::placeholder {
1884
+ color: #94a3b8;
1885
+ }
1886
+
1887
+ .matrix__modal-tier-grid {
1888
+ display: grid;
1889
+ grid-template-columns: repeat(2, 1fr);
1890
+ gap: 0.625rem;
1891
+ }
1892
+
1893
+ .matrix__modal-tier-option {
1894
+ position: relative;
1895
+ display: flex;
1896
+ align-items: center;
1897
+ gap: 0.5rem;
1898
+ padding: 0.75rem;
1899
+ background: #ffffff;
1900
+ border: 2px solid #cbd5e1;
1901
+ border-radius: var(--so-radius-lg);
1902
+ cursor: pointer;
1903
+ transition: all var(--so-transition-fast);
1904
+ min-width: 0;
1905
+ overflow: hidden;
1906
+ }
1907
+
1908
+ .matrix__modal-tier-option:hover {
1909
+ border-color: #a78bfa;
1910
+ background: #f5f3ff;
1911
+ }
1912
+
1913
+ .matrix__modal-tier-option--selected {
1914
+ border-color: #8b5cf6;
1915
+ background: #f5f3ff;
1916
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.15);
1917
+ }
1918
+
1919
+ .matrix__modal-tier-option--selected:hover {
1920
+ border-color: #7c3aed;
1921
+ background: #f5f3ff;
1922
+ }
1923
+
1924
+ /* Custom checkbox styling */
1925
+ .matrix__modal-tier-checkbox {
1926
+ position: relative;
1927
+ width: 1.25rem;
1928
+ height: 1.25rem;
1929
+ flex-shrink: 0;
1930
+ appearance: none;
1931
+ -webkit-appearance: none;
1932
+ background: #ffffff;
1933
+ border: 2px solid #94a3b8;
1934
+ border-radius: 0.375rem;
1935
+ cursor: pointer;
1936
+ transition: all var(--so-transition-fast);
1937
+ }
1938
+
1939
+ .matrix__modal-tier-checkbox:checked {
1940
+ background: #7c3aed;
1941
+ border-color: #7c3aed;
1942
+ }
1943
+
1944
+ .matrix__modal-tier-checkbox:checked::after {
1945
+ content: '';
1946
+ position: absolute;
1947
+ top: 50%;
1948
+ left: 50%;
1949
+ width: 0.375rem;
1950
+ height: 0.625rem;
1951
+ border: 2px solid white;
1952
+ border-top: none;
1953
+ border-left: none;
1954
+ transform: translate(-50%, -60%) rotate(45deg);
1955
+ }
1956
+
1957
+ .matrix__modal-tier-option:hover .matrix__modal-tier-checkbox:not(:checked) {
1958
+ border-color: #a78bfa;
1959
+ }
1960
+
1961
+ .matrix__modal-tier-name {
1962
+ flex: 1;
1963
+ font-size: 0.875rem;
1964
+ font-weight: 600;
1965
+ color: #1e293b;
1966
+ min-width: 0;
1967
+ overflow: hidden;
1968
+ text-overflow: ellipsis;
1969
+ white-space: nowrap;
1970
+ }
1971
+
1972
+ .matrix__modal-tier-price {
1973
+ font-size: 0.75rem;
1974
+ font-weight: 600;
1975
+ color: #64748b;
1976
+ white-space: nowrap;
1977
+ flex-shrink: 0;
1978
+ }
1979
+
1980
+ .matrix__modal-tier-option--selected .matrix__modal-tier-name {
1981
+ color: #4c1d95;
1982
+ }
1983
+
1984
+ .matrix__modal-tier-option--selected .matrix__modal-tier-price {
1985
+ color: #7c3aed;
1986
+ }
1987
+
1988
+ .matrix__modal-tier-hint {
1989
+ font-size: 0.8125rem;
1990
+ color: #64748b;
1991
+ margin: 0.75rem 0 0;
1992
+ font-style: italic;
1993
+ }
1994
+
1995
+ .matrix__modal-hint strong {
1996
+ color: #334155;
1997
+ font-weight: 600;
1998
+ }
1999
+ `;
2000
+ export function TheMatrix({ document, dispatch }) {
2001
+ const { state } = document;
2002
+ const services = state.global.services ?? [];
2003
+ const tiers = state.global.tiers ?? [];
2004
+ const optionGroups = state.global.optionGroups ?? [];
2005
+ // Get selected facets from the offering document's facetTargets
2006
+ const offeringFacetTargets = state.global.facetTargets ?? [];
2007
+ // Build facet categories from the SERVICE OFFERING's selected facet targets
2008
+ // This ensures only the options selected in the offering's facet targeting appear in the Matrix
2009
+ const facetCategories = useMemo(() => {
2010
+ const categories = {};
2011
+ offeringFacetTargets.forEach((facet) => {
2012
+ categories[facet.categoryKey] = {
2013
+ label: facet.categoryLabel,
2014
+ options: facet.selectedOptions.map((option) => ({
2015
+ id: option.toLowerCase().replace(/\s+/g, "-"),
2016
+ label: option,
2017
+ })),
2018
+ };
2019
+ });
2020
+ return categories;
2021
+ }, [offeringFacetTargets]);
2022
+ const [enabledOptionalGroups, setEnabledOptionalGroups] = useState(new Set(optionGroups.filter((g) => g.defaultSelected).map((g) => g.id)));
2023
+ const [selectedCell, setSelectedCell] = useState(null);
2024
+ const [addServiceModal, setAddServiceModal] = useState(null);
2025
+ const [newServiceName, setNewServiceName] = useState("");
2026
+ const [newServiceDescription, setNewServiceDescription] = useState("");
2027
+ const [newServiceSelectedTiers, setNewServiceSelectedTiers] = useState(new Set());
2028
+ // Edit service modal state
2029
+ const [editServiceModal, setEditServiceModal] = useState(null);
2030
+ const [editServiceName, setEditServiceName] = useState("");
2031
+ const [editServiceDescription, setEditServiceDescription] = useState("");
2032
+ const [editServiceSelectedTiers, setEditServiceSelectedTiers] = useState(new Set());
2033
+ const [selectedTierIdx, setSelectedTierIdx] = useState(0);
2034
+ // Selected billing cycle per tier (for tiers with multiple pricing options)
2035
+ const [selectedBillingCycles, setSelectedBillingCycles] = useState({});
2036
+ // Initialize selected facets from offering's facet targets
2037
+ const [selectedFacets, setSelectedFacets] = useState(() => {
2038
+ const initial = {};
2039
+ offeringFacetTargets.forEach((facet) => {
2040
+ if (facet.selectedOptions.length > 0) {
2041
+ initial[facet.categoryKey] = facet.selectedOptions[0]
2042
+ .toLowerCase()
2043
+ .replace(/\s+/g, "-");
2044
+ }
2045
+ });
2046
+ return initial;
2047
+ });
2048
+ // Metric editing modal state
2049
+ const [metricModal, setMetricModal] = useState(null);
2050
+ const [metricName, setMetricName] = useState("");
2051
+ const [metricLimits, setMetricLimits] = useState({});
2052
+ const [metricEnabledTiers, setMetricEnabledTiers] = useState(new Set());
2053
+ // Per-tier overage pricing for metric modal
2054
+ const [metricOveragePrices, setMetricOveragePrices] = useState({});
2055
+ const [metricOverageCycles, setMetricOverageCycles] = useState({});
2056
+ // Unit name for the metric (e.g., "entity", "user", "API call")
2057
+ const [metricUnitName, setMetricUnitName] = useState("");
2058
+ // Per-tier paid limits for the metric modal (dual limits: freeLimit + paidLimit)
2059
+ const [metricPaidLimits, setMetricPaidLimits] = useState({});
2060
+ // Reset cycle for the metric (shared across tiers)
2061
+ const [metricResetCycle, setMetricResetCycle] = useState("MONTHLY");
2062
+ // Service reordering state (not used - arrow buttons handle reorder directly)
2063
+ const getServiceGroup = (service) => {
2064
+ // Services now have optionGroupId directly on them
2065
+ return service.optionGroupId || null;
2066
+ };
2067
+ const groupedServices = useMemo(() => {
2068
+ const groups = new Map();
2069
+ optionGroups.forEach((g) => groups.set(g.id, []));
2070
+ groups.set(UNGROUPED_ID, []);
2071
+ services.forEach((service) => {
2072
+ const groupId = getServiceGroup(service) || UNGROUPED_ID;
2073
+ const groupServices = groups.get(groupId) || [];
2074
+ groupServices.push(service);
2075
+ groups.set(groupId, groupServices);
2076
+ });
2077
+ // Sort services within each group by displayOrder
2078
+ groups.forEach((groupServices, _groupId) => {
2079
+ groupServices.sort((a, b) => {
2080
+ const orderA = a.displayOrder ?? 999;
2081
+ const orderB = b.displayOrder ?? 999;
2082
+ return orderA - orderB;
2083
+ });
2084
+ });
2085
+ return groups;
2086
+ }, [services, tiers, optionGroups]);
2087
+ const setupGroups = useMemo(() => {
2088
+ return optionGroups.filter((g) => g.costType === "SETUP");
2089
+ }, [optionGroups]);
2090
+ const regularGroups = useMemo(() => {
2091
+ return optionGroups.filter((g) => g.costType !== "SETUP" && !g.isAddOn);
2092
+ }, [optionGroups]);
2093
+ const addonGroups = useMemo(() => {
2094
+ return optionGroups.filter((g) => g.isAddOn);
2095
+ }, [optionGroups]);
2096
+ const ungroupedSetupServices = useMemo(() => {
2097
+ return (groupedServices.get(UNGROUPED_ID) || []).filter((s) => s.isSetupFormation);
2098
+ }, [groupedServices]);
2099
+ const ungroupedRegularServices = useMemo(() => {
2100
+ return (groupedServices.get(UNGROUPED_ID) || []).filter((s) => !s.isSetupFormation);
2101
+ }, [groupedServices]);
2102
+ const getServiceLevelForTier = (serviceId, tier) => {
2103
+ return tier.serviceLevels.find((sl) => sl.serviceId === serviceId);
2104
+ };
2105
+ const getUniqueMetricsForService = (serviceId) => {
2106
+ const metricsSet = new Set();
2107
+ tiers.forEach((tier) => {
2108
+ tier.usageLimits
2109
+ .filter((ul) => ul.serviceId === serviceId)
2110
+ .forEach((ul) => metricsSet.add(ul.metric));
2111
+ });
2112
+ return Array.from(metricsSet);
2113
+ };
2114
+ // Incomplete services detection - services not assigned to any tier
2115
+ const incompleteServices = useMemo(() => {
2116
+ if (tiers.length === 0)
2117
+ return [];
2118
+ return services.filter((service) => {
2119
+ // Check if service is included in at least one tier
2120
+ const isIncludedAnywhere = tiers.some((tier) => tier.serviceLevels.some((sl) => sl.serviceId === service.id && sl.level === "INCLUDED"));
2121
+ return !isIncludedAnywhere;
2122
+ });
2123
+ }, [services, tiers]);
2124
+ const getUsageLimitForMetric = (serviceId, metric, tier) => {
2125
+ return tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
2126
+ };
2127
+ const handleSetServiceLevel = (serviceId, tierId, level, existingLevelId, optionGroupId) => {
2128
+ if (existingLevelId) {
2129
+ dispatch(updateServiceLevel({
2130
+ tierId,
2131
+ serviceLevelId: existingLevelId,
2132
+ level,
2133
+ lastModified: new Date().toISOString(),
2134
+ }));
2135
+ }
2136
+ else {
2137
+ dispatch(addServiceLevel({
2138
+ tierId,
2139
+ serviceLevelId: generateId(),
2140
+ serviceId,
2141
+ level,
2142
+ optionGroupId,
2143
+ lastModified: new Date().toISOString(),
2144
+ }));
2145
+ }
2146
+ };
2147
+ const toggleOptionalGroup = (groupId) => {
2148
+ setEnabledOptionalGroups((prev) => {
2149
+ const next = new Set(prev);
2150
+ if (next.has(groupId)) {
2151
+ next.delete(groupId);
2152
+ }
2153
+ else {
2154
+ next.add(groupId);
2155
+ }
2156
+ return next;
2157
+ });
2158
+ };
2159
+ const handleAddService = () => {
2160
+ if (!addServiceModal || !newServiceName.trim())
2161
+ return;
2162
+ const newServiceId = generateId();
2163
+ const now = new Date().toISOString();
2164
+ // Add the service with optionGroupId directly on the service
2165
+ dispatch(addService({
2166
+ id: newServiceId,
2167
+ title: newServiceName.trim(),
2168
+ description: newServiceDescription.trim() || null,
2169
+ isSetupFormation: addServiceModal.isSetupFormation,
2170
+ optionGroupId: addServiceModal.groupId !== UNGROUPED_ID
2171
+ ? addServiceModal.groupId
2172
+ : undefined,
2173
+ lastModified: now,
2174
+ }));
2175
+ // Create ServiceLevelBindings for each selected tier
2176
+ newServiceSelectedTiers.forEach((tierId) => {
2177
+ dispatch(addServiceLevel({
2178
+ tierId,
2179
+ serviceLevelId: generateId(),
2180
+ serviceId: newServiceId,
2181
+ level: "INCLUDED",
2182
+ optionGroupId: addServiceModal.groupId !== UNGROUPED_ID
2183
+ ? addServiceModal.groupId
2184
+ : undefined,
2185
+ lastModified: now,
2186
+ }));
2187
+ });
2188
+ setNewServiceName("");
2189
+ setNewServiceDescription("");
2190
+ setNewServiceSelectedTiers(new Set());
2191
+ setAddServiceModal(null);
2192
+ };
2193
+ const openAddServiceModal = (groupId, isSetupFormation) => {
2194
+ setAddServiceModal({ groupId, isSetupFormation });
2195
+ setNewServiceName("");
2196
+ setNewServiceDescription("");
2197
+ setNewServiceSelectedTiers(new Set());
2198
+ };
2199
+ const openEditServiceModal = (service) => {
2200
+ setEditServiceModal(service);
2201
+ setEditServiceName(service.title);
2202
+ setEditServiceDescription(service.description || "");
2203
+ // Initialize selected tiers based on current service levels
2204
+ const includedTiers = new Set();
2205
+ tiers.forEach((tier) => {
2206
+ const serviceLevel = tier.serviceLevels.find((sl) => sl.serviceId === service.id);
2207
+ if (serviceLevel && serviceLevel.level === "INCLUDED") {
2208
+ includedTiers.add(tier.id);
2209
+ }
2210
+ });
2211
+ setEditServiceSelectedTiers(includedTiers);
2212
+ };
2213
+ const handleSaveEditService = () => {
2214
+ if (!editServiceModal || !editServiceName.trim())
2215
+ return;
2216
+ const now = new Date().toISOString();
2217
+ // Update service name/description
2218
+ dispatch(updateService({
2219
+ id: editServiceModal.id,
2220
+ title: editServiceName.trim(),
2221
+ description: editServiceDescription.trim() || null,
2222
+ lastModified: now,
2223
+ }));
2224
+ // Update tier assignments
2225
+ tiers.forEach((tier) => {
2226
+ const existingLevel = tier.serviceLevels.find((sl) => sl.serviceId === editServiceModal.id);
2227
+ const shouldBeIncluded = editServiceSelectedTiers.has(tier.id);
2228
+ if (shouldBeIncluded && !existingLevel) {
2229
+ // Add to tier
2230
+ dispatch(addServiceLevel({
2231
+ tierId: tier.id,
2232
+ serviceLevelId: generateId(),
2233
+ serviceId: editServiceModal.id,
2234
+ level: "INCLUDED",
2235
+ optionGroupId: editServiceModal.optionGroupId || undefined,
2236
+ lastModified: now,
2237
+ }));
2238
+ }
2239
+ else if (shouldBeIncluded &&
2240
+ existingLevel &&
2241
+ existingLevel.level !== "INCLUDED") {
2242
+ // Update to included
2243
+ dispatch(updateServiceLevel({
2244
+ tierId: tier.id,
2245
+ serviceLevelId: existingLevel.id,
2246
+ level: "INCLUDED",
2247
+ lastModified: now,
2248
+ }));
2249
+ }
2250
+ else if (!shouldBeIncluded &&
2251
+ existingLevel &&
2252
+ existingLevel.level === "INCLUDED") {
2253
+ // Remove from tier (set to NOT_INCLUDED)
2254
+ dispatch(updateServiceLevel({
2255
+ tierId: tier.id,
2256
+ serviceLevelId: existingLevel.id,
2257
+ level: "NOT_INCLUDED",
2258
+ lastModified: now,
2259
+ }));
2260
+ }
2261
+ });
2262
+ setEditServiceModal(null);
2263
+ setEditServiceName("");
2264
+ setEditServiceDescription("");
2265
+ setEditServiceSelectedTiers(new Set());
2266
+ };
2267
+ // Metric modal handlers
2268
+ const handleAddMetric = (serviceId) => {
2269
+ setMetricModal({ serviceId, metric: null });
2270
+ setMetricName("");
2271
+ // Initialize limits for all tiers to empty string
2272
+ const initialLimits = {};
2273
+ const initialPaidLimits = {};
2274
+ const initialOveragePrices = {};
2275
+ const initialOverageCycles = {};
2276
+ // For new metrics, enable all tiers by default
2277
+ const allTierIds = new Set();
2278
+ tiers.forEach((tier) => {
2279
+ initialLimits[tier.id] = "";
2280
+ initialPaidLimits[tier.id] = "";
2281
+ initialOveragePrices[tier.id] = "";
2282
+ initialOverageCycles[tier.id] = "";
2283
+ allTierIds.add(tier.id);
2284
+ });
2285
+ setMetricLimits(initialLimits);
2286
+ setMetricPaidLimits(initialPaidLimits);
2287
+ setMetricEnabledTiers(allTierIds);
2288
+ // Reset per-tier overage pricing and unit name
2289
+ setMetricOveragePrices(initialOveragePrices);
2290
+ setMetricOverageCycles(initialOverageCycles);
2291
+ setMetricUnitName("");
2292
+ setMetricResetCycle("MONTHLY");
2293
+ };
2294
+ const handleEditMetric = (serviceId, metric) => {
2295
+ setMetricModal({ serviceId, metric });
2296
+ setMetricName(metric);
2297
+ // Initialize limits with existing values and track which tiers have this metric
2298
+ const existingLimits = {};
2299
+ const existingPaidLimits = {};
2300
+ const existingOveragePrices = {};
2301
+ const existingOverageCycles = {};
2302
+ const enabledTiers = new Set();
2303
+ let existingUnitName = "";
2304
+ let existingResetCycle = "MONTHLY";
2305
+ tiers.forEach((tier) => {
2306
+ const usageLimit = tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
2307
+ // Load value from either limit (numeric) or notes (string)
2308
+ existingLimits[tier.id] =
2309
+ usageLimit?.freeLimit?.toString() || usageLimit?.notes || "";
2310
+ existingPaidLimits[tier.id] = usageLimit?.paidLimit?.toString() || "";
2311
+ // Load per-tier overage pricing
2312
+ existingOveragePrices[tier.id] = usageLimit?.unitPrice?.toString() || "";
2313
+ existingOverageCycles[tier.id] = "";
2314
+ if (usageLimit) {
2315
+ enabledTiers.add(tier.id);
2316
+ // Get unit name from first tier that has it
2317
+ if (!existingUnitName && usageLimit.unitName) {
2318
+ existingUnitName = usageLimit.unitName;
2319
+ }
2320
+ // Get reset cycle from first tier that has it
2321
+ if (usageLimit.resetCycle) {
2322
+ existingResetCycle = usageLimit.resetCycle;
2323
+ }
2324
+ }
2325
+ });
2326
+ setMetricLimits(existingLimits);
2327
+ setMetricPaidLimits(existingPaidLimits);
2328
+ setMetricEnabledTiers(enabledTiers);
2329
+ setMetricOveragePrices(existingOveragePrices);
2330
+ setMetricOverageCycles(existingOverageCycles);
2331
+ setMetricUnitName(existingUnitName);
2332
+ setMetricResetCycle(existingResetCycle);
2333
+ };
2334
+ const handleRemoveMetric = (serviceId, metric) => {
2335
+ // Remove this metric from all tiers
2336
+ tiers.forEach((tier) => {
2337
+ const usageLimit = tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
2338
+ if (usageLimit) {
2339
+ dispatch(removeUsageLimit({
2340
+ tierId: tier.id,
2341
+ limitId: usageLimit.id,
2342
+ lastModified: new Date().toISOString(),
2343
+ }));
2344
+ }
2345
+ });
2346
+ };
2347
+ // Arrow button handler for service reordering
2348
+ const handleReorderService = (serviceId, direction, groupServices) => {
2349
+ // Sort services by displayOrder for consistent ordering
2350
+ const sortedServices = [...groupServices].sort((a, b) => {
2351
+ const orderA = a.displayOrder ?? 999;
2352
+ const orderB = b.displayOrder ?? 999;
2353
+ return orderA - orderB;
2354
+ });
2355
+ const currentIndex = sortedServices.findIndex((s) => s.id === serviceId);
2356
+ if (currentIndex === -1)
2357
+ return;
2358
+ const newIndex = direction === "up" ? currentIndex - 1 : currentIndex + 1;
2359
+ // Check bounds
2360
+ if (newIndex < 0 || newIndex >= sortedServices.length)
2361
+ return;
2362
+ const now = new Date().toISOString();
2363
+ // Swap the two services
2364
+ const currentService = sortedServices[currentIndex];
2365
+ const swapService = sortedServices[newIndex];
2366
+ dispatch(updateService({
2367
+ id: currentService.id,
2368
+ displayOrder: newIndex,
2369
+ lastModified: now,
2370
+ }));
2371
+ dispatch(updateService({
2372
+ id: swapService.id,
2373
+ displayOrder: currentIndex,
2374
+ lastModified: now,
2375
+ }));
2376
+ };
2377
+ const handleSaveMetric = () => {
2378
+ if (!metricModal || !metricName.trim())
2379
+ return;
2380
+ const { serviceId, metric: originalMetric } = metricModal;
2381
+ const now = new Date().toISOString();
2382
+ tiers.forEach((tier) => {
2383
+ const isEnabled = metricEnabledTiers.has(tier.id);
2384
+ const limitValue = metricLimits[tier.id];
2385
+ const existingLimit = originalMetric
2386
+ ? tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === originalMetric)
2387
+ : null;
2388
+ // Check if value is numeric or string
2389
+ const parsedLimit = limitValue ? parseInt(limitValue, 10) : null;
2390
+ const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
2391
+ // Parse paid limit
2392
+ const paidLimitValue = metricPaidLimits[tier.id];
2393
+ const parsedPaidLimit = paidLimitValue
2394
+ ? parseInt(paidLimitValue, 10)
2395
+ : null;
2396
+ const isPaidNumeric = parsedPaidLimit !== null && !isNaN(parsedPaidLimit);
2397
+ // Get per-tier overage pricing
2398
+ const tierOveragePrice = metricOveragePrices[tier.id];
2399
+ const parsedOveragePrice = tierOveragePrice
2400
+ ? parseFloat(tierOveragePrice)
2401
+ : null;
2402
+ const hasOveragePricing = parsedOveragePrice !== null && !isNaN(parsedOveragePrice);
2403
+ if (existingLimit && !isEnabled) {
2404
+ // Remove limit - tier was disabled
2405
+ dispatch(removeUsageLimit({
2406
+ tierId: tier.id,
2407
+ limitId: existingLimit.id,
2408
+ lastModified: now,
2409
+ }));
2410
+ }
2411
+ else if (existingLimit && isEnabled) {
2412
+ // Update existing limit - use limit for numeric values, notes for strings
2413
+ dispatch(updateUsageLimit({
2414
+ tierId: tier.id,
2415
+ limitId: existingLimit.id,
2416
+ metric: metricName.trim(),
2417
+ unitName: metricUnitName.trim() || undefined,
2418
+ freeLimit: isNumeric ? parsedLimit : null,
2419
+ paidLimit: isPaidNumeric ? parsedPaidLimit : null,
2420
+ notes: !isNumeric && limitValue ? limitValue.trim() : null,
2421
+ resetCycle: metricResetCycle,
2422
+ unitPrice: hasOveragePricing ? parsedOveragePrice : null,
2423
+ unitPriceCurrency: hasOveragePricing ? "USD" : undefined,
2424
+ lastModified: now,
2425
+ }));
2426
+ }
2427
+ else if (!existingLimit && isEnabled) {
2428
+ // Add new limit - use limit for numeric values, notes for strings
2429
+ dispatch(addUsageLimit({
2430
+ tierId: tier.id,
2431
+ limitId: generateId(),
2432
+ serviceId,
2433
+ metric: metricName.trim(),
2434
+ unitName: metricUnitName.trim() || undefined,
2435
+ freeLimit: isNumeric ? parsedLimit : null,
2436
+ paidLimit: isPaidNumeric ? parsedPaidLimit : null,
2437
+ notes: !isNumeric && limitValue ? limitValue.trim() : null,
2438
+ resetCycle: metricResetCycle,
2439
+ unitPrice: hasOveragePricing ? parsedOveragePrice : undefined,
2440
+ unitPriceCurrency: hasOveragePricing ? "USD" : undefined,
2441
+ lastModified: now,
2442
+ }));
2443
+ }
2444
+ });
2445
+ setMetricModal(null);
2446
+ setMetricName("");
2447
+ setMetricLimits({});
2448
+ setMetricPaidLimits({});
2449
+ setMetricEnabledTiers(new Set());
2450
+ setMetricOveragePrices({});
2451
+ setMetricOverageCycles({});
2452
+ setMetricUnitName("");
2453
+ setMetricResetCycle("MONTHLY");
2454
+ };
2455
+ const getLevelDisplay = (serviceLevel) => {
2456
+ if (!serviceLevel)
2457
+ return { label: "—", color: "var(--so-slate-300)" };
2458
+ const level = serviceLevel.level;
2459
+ const config = SERVICE_LEVELS.find((l) => l.value === level);
2460
+ if (level === "CUSTOM" && serviceLevel.customValue) {
2461
+ return {
2462
+ label: serviceLevel.customValue,
2463
+ color: config?.color || "var(--so-amber-600)",
2464
+ };
2465
+ }
2466
+ return {
2467
+ label: config?.shortLabel || level,
2468
+ color: config?.color || "var(--so-slate-600)",
2469
+ };
2470
+ };
2471
+ if (services.length === 0 || tiers.length === 0) {
2472
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: matrixStyles }), _jsx("div", { className: "matrix", children: _jsxs("div", { className: "matrix__empty", children: [_jsx("svg", { className: "matrix__empty-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M4 6h16M4 10h16M4 14h16M4 18h16" }) }), _jsx("h3", { className: "matrix__empty-title", children: "Matrix Not Ready" }), _jsx("p", { className: "matrix__empty-text", children: services.length === 0 && tiers.length === 0
2473
+ ? "Add services in the Service Catalog and tiers in Tier Definition to configure the matrix."
2474
+ : services.length === 0
2475
+ ? "Add services in the Service Catalog to configure the matrix."
2476
+ : "Add tiers in Tier Definition to configure the matrix." })] }) })] }));
2477
+ }
2478
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: matrixStyles }), _jsxs("div", { className: "matrix", children: [Object.keys(facetCategories).length > 0 && (_jsx("div", { className: "matrix__facets", children: _jsx("div", { className: "matrix__facets-row", children: Object.entries(facetCategories).map(([key, category]) => (_jsxs("div", { className: "matrix__facet-group", children: [_jsx("span", { className: "matrix__facet-label", children: category.label }), category.options.length <= 3 ? (_jsx("div", { className: "matrix__toggle-group", children: category.options.map((option) => (_jsx("button", { type: "button", onClick: () => setSelectedFacets((prev) => ({
2479
+ ...prev,
2480
+ [key]: option.id,
2481
+ })), className: `matrix__toggle-btn ${selectedFacets[key] === option.id
2482
+ ? "matrix__toggle-btn--active"
2483
+ : ""}`, children: option.label }, option.id))) })) : (_jsx("select", { value: selectedFacets[key] || category.options[0]?.id || "", onChange: (e) => setSelectedFacets((prev) => ({
2484
+ ...prev,
2485
+ [key]: e.target.value,
2486
+ })), className: "matrix__facet-select", children: category.options.map((option) => (_jsx("option", { value: option.id, children: option.label }, option.id))) }))] }, key))) }) })), incompleteServices.length > 0 && (_jsxs("div", { className: "matrix__incomplete-warning", children: [_jsx("div", { className: "matrix__incomplete-icon", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }) }), _jsxs("div", { className: "matrix__incomplete-content", children: [_jsxs("span", { className: "matrix__incomplete-title", children: [incompleteServices.length, " service", incompleteServices.length !== 1 ? "s" : "", " not configured"] }), _jsxs("span", { className: "matrix__incomplete-text", children: ["The following services are not included in any tier:", " ", _jsx("strong", { children: incompleteServices
2487
+ .slice(0, 3)
2488
+ .map((s) => s.title)
2489
+ .join(", ") }), incompleteServices.length > 3 &&
2490
+ ` and ${incompleteServices.length - 3} more`] })] })] })), _jsx("div", { className: "matrix__table-wrap", children: _jsxs("table", { className: "matrix__table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: "matrix__corner-cell" }), tiers.map((tier, idx) => {
2491
+ const hasPricingOptions = tier.pricingOptions && tier.pricingOptions.length > 0;
2492
+ const selectedCycleId = selectedBillingCycles[tier.id];
2493
+ const activePricingOption = hasPricingOptions
2494
+ ? tier.pricingOptions.find((po) => po.id === selectedCycleId) ||
2495
+ tier.pricingOptions.find((po) => po.isDefault) ||
2496
+ tier.pricingOptions[0]
2497
+ : null;
2498
+ const displayAmount = activePricingOption
2499
+ ? activePricingOption.amount
2500
+ : tier.pricing.amount;
2501
+ return (_jsx("th", { onClick: () => setSelectedTierIdx(idx), className: `matrix__tier-header ${idx === selectedTierIdx
2502
+ ? "matrix__tier-header--selected"
2503
+ : ""}`, 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
2504
+ ? "Custom"
2505
+ : displayAmount !== null
2506
+ ? `$${displayAmount}/mo`
2507
+ : "$null/mo" }), hasPricingOptions &&
2508
+ tier.pricingOptions.length > 1 && (_jsx("select", { value: selectedCycleId || activePricingOption?.id || "", onClick: (e) => e.stopPropagation(), onChange: (e) => {
2509
+ e.stopPropagation();
2510
+ setSelectedBillingCycles((prev) => ({
2511
+ ...prev,
2512
+ [tier.id]: e.target.value,
2513
+ }));
2514
+ }, className: "matrix__tier-cycle-select", children: tier.pricingOptions.map((po) => (_jsxs("option", { value: po.id, children: ["$", po.amount] }, po.id))) }))] }) }, tier.id));
2515
+ })] }) }), _jsxs("tbody", { children: [_jsx("tr", { children: _jsx("td", { colSpan: tiers.length + 1, className: "matrix__section-header", children: "Service Catalog" }) }), (setupGroups.length > 0 ||
2516
+ 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, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric, onEditService: openEditServiceModal, onReorderService: handleReorderService }, group.id))), ungroupedSetupServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
2517
+ id: UNGROUPED_ID,
2518
+ name: "Setup & Formation",
2519
+ description: null,
2520
+ isAddOn: false,
2521
+ defaultSelected: true,
2522
+ billingCycle: null,
2523
+ costType: null,
2524
+ currency: null,
2525
+ price: null,
2526
+ }, 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, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric, onEditService: openEditServiceModal, onReorderService: handleReorderService }, "ungrouped-setup")), (regularGroups.length > 0 ||
2527
+ 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, onEditService: openEditServiceModal, onReorderService: handleReorderService }, group.id))), ungroupedRegularServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
2528
+ id: UNGROUPED_ID,
2529
+ name: "Recurring Services",
2530
+ description: null,
2531
+ isAddOn: false,
2532
+ defaultSelected: true,
2533
+ billingCycle: null,
2534
+ costType: null,
2535
+ currency: null,
2536
+ price: null,
2537
+ }, 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, onEditService: openEditServiceModal, onReorderService: handleReorderService }, "ungrouped-regular")), _jsxs("tr", { className: "matrix__total-row", children: [_jsx("td", { children: "SUBTOTAL" }), tiers.map((tier) => (_jsx("td", { style: { textAlign: "center" }, children: tier.isCustomPricing
2538
+ ? "Custom"
2539
+ : `$${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, onEditService: openEditServiceModal, onReorderService: handleReorderService }, group.id))), _jsxs("tr", { className: "matrix__grand-total-row", children: [_jsx("td", { children: "Recurring Tier Price" }), tiers.map((tier, idx) => (_jsx("td", { className: idx === selectedTierIdx
2540
+ ? "matrix__grand-total-cell--selected"
2541
+ : "", style: { textAlign: "center" }, children: idx === selectedTierIdx
2542
+ ? tier.isCustomPricing
2543
+ ? "Custom"
2544
+ : `${formatPrice(tier.pricing.amount || 0, tier.pricing.currency || "USD")}/mo`
2545
+ : null }, tier.id)))] }), addonGroups
2546
+ .filter((g) => enabledOptionalGroups.has(g.id) && g.price != null)
2547
+ .map((g) => {
2548
+ const billingLabel = g.billingCycle
2549
+ ? `/${BILLING_CYCLE_SHORT_LABELS[g.billingCycle].toLowerCase()}`
2550
+ : "/mo";
2551
+ return (_jsxs("tr", { className: "matrix__grand-total-row matrix__grand-total-row--addon", children: [_jsxs("td", { children: ["+ ", g.name] }), tiers.map((tier, idx) => (_jsx("td", { className: idx === selectedTierIdx
2552
+ ? "matrix__grand-total-cell--selected"
2553
+ : "", style: { textAlign: "center" }, children: idx === selectedTierIdx
2554
+ ? `${formatPrice(g.price || 0, g.currency || "USD")}${billingLabel}`
2555
+ : null }, tier.id)))] }, `addon-recurring-${g.id}`));
2556
+ }), (() => {
2557
+ const addonSetupServices = addonGroups.flatMap((g) => {
2558
+ if (!enabledOptionalGroups.has(g.id))
2559
+ return [];
2560
+ return (groupedServices.get(g.id) || []).filter((s) => s.costType === "SETUP" && s.price != null);
2561
+ });
2562
+ const addonSetupTotal = addonSetupServices.reduce((sum, s) => sum + (s.price || 0), 0);
2563
+ if (addonSetupTotal === 0)
2564
+ return null;
2565
+ return (_jsxs("tr", { className: "matrix__grand-total-row matrix__grand-total-row--setup", children: [_jsx("td", { children: "+ Add-on Setup Fees" }), tiers.map((tier, idx) => (_jsx("td", { className: idx === selectedTierIdx
2566
+ ? "matrix__grand-total-cell--selected"
2567
+ : "", style: { textAlign: "center" }, children: idx === selectedTierIdx
2568
+ ? `${formatPrice(addonSetupTotal, "USD")} one-time`
2569
+ : null }, tier.id)))] }));
2570
+ })(), (() => {
2571
+ const totalSetupGroupFee = setupGroups.reduce((sum, g) => sum + (g.price || 0), 0);
2572
+ if (totalSetupGroupFee === 0)
2573
+ return null;
2574
+ return (_jsxs("tr", { className: "matrix__grand-total-row matrix__grand-total-row--setup", children: [_jsx("td", { children: "+ Setup & Formation Fees" }), tiers.map((tier, idx) => (_jsx("td", { className: idx === selectedTierIdx
2575
+ ? "matrix__grand-total-cell--selected"
2576
+ : "", style: { textAlign: "center" }, children: idx === selectedTierIdx
2577
+ ? `${formatPrice(totalSetupGroupFee, "USD")} one-time`
2578
+ : null }, tier.id)))] }));
2579
+ })()] })] }) }), selectedCell && (_jsx(ServiceLevelDetailPanel, { serviceId: selectedCell.serviceId, tierId: selectedCell.tierId, services: services, tiers: tiers, optionGroups: optionGroups, dispatch: dispatch, onClose: () => setSelectedCell(null) })), addServiceModal && (_jsx("div", { className: "matrix__modal-overlay", children: _jsxs("div", { className: "matrix__modal matrix__modal--wide", children: [_jsx("h3", { className: "matrix__modal-title", children: "Add New Service" }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Service Name" }), _jsx("input", { type: "text", value: newServiceName, onChange: (e) => setNewServiceName(e.target.value), placeholder: "Enter service name", className: "matrix__modal-input", autoFocus: true })] }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Description (optional)" }), _jsx("textarea", { value: newServiceDescription, onChange: (e) => setNewServiceDescription(e.target.value), placeholder: "Enter description...", rows: 2, className: "matrix__modal-textarea" })] }), tiers.length > 0 && (_jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Include in Tiers" }), _jsx("div", { className: "matrix__modal-tier-grid", children: tiers.map((tier) => {
2580
+ const isSelected = newServiceSelectedTiers.has(tier.id);
2581
+ return (_jsxs("label", { className: `matrix__modal-tier-option ${isSelected ? "matrix__modal-tier-option--selected" : ""}`, children: [_jsx("input", { type: "checkbox", checked: isSelected, onChange: (e) => {
2582
+ const newSet = new Set(newServiceSelectedTiers);
2583
+ if (e.target.checked) {
2584
+ newSet.add(tier.id);
2585
+ }
2586
+ else {
2587
+ newSet.delete(tier.id);
2588
+ }
2589
+ setNewServiceSelectedTiers(newSet);
2590
+ }, className: "matrix__modal-tier-checkbox" }), _jsx("span", { className: "matrix__modal-tier-name", children: tier.name }), tier.pricing.amount !== null && (_jsxs("span", { className: "matrix__modal-tier-price", children: ["$", tier.pricing.amount, "/mo"] }))] }, tier.id));
2591
+ }) }), newServiceSelectedTiers.size === 0 && (_jsx("p", { className: "matrix__modal-tier-hint", children: "Select at least one tier to include this service" }))] })), _jsxs("p", { className: "matrix__modal-hint", children: ["This service will be added to", " ", _jsx("strong", { children: addServiceModal.groupId !== UNGROUPED_ID
2592
+ ? optionGroups.find((g) => g.id === addServiceModal.groupId)
2593
+ ?.name || "Unknown Group"
2594
+ : "Ungrouped Services" }), " ", "as a", " ", addServiceModal.isSetupFormation
2595
+ ? "Setup/Formation"
2596
+ : "Recurring", " ", "service."] }), _jsxs("div", { className: "matrix__modal-actions", children: [_jsx("button", { onClick: () => {
2597
+ setAddServiceModal(null);
2598
+ setNewServiceName("");
2599
+ setNewServiceDescription("");
2600
+ setNewServiceSelectedTiers(new Set());
2601
+ }, 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" })] })] }) })), editServiceModal && (_jsx("div", { className: "matrix__modal-overlay", children: _jsxs("div", { className: "matrix__modal matrix__modal--wide", children: [_jsx("h3", { className: "matrix__modal-title", children: "Edit Service" }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Service Name" }), _jsx("input", { type: "text", value: editServiceName, onChange: (e) => setEditServiceName(e.target.value), placeholder: "Enter service name", className: "matrix__modal-input", autoFocus: true })] }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Description (optional)" }), _jsx("textarea", { value: editServiceDescription, onChange: (e) => setEditServiceDescription(e.target.value), placeholder: "Enter description...", rows: 2, className: "matrix__modal-textarea" })] }), tiers.length > 0 && (_jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Include in Tiers" }), _jsx("div", { className: "matrix__modal-tier-grid", children: tiers.map((tier) => {
2602
+ const isSelected = editServiceSelectedTiers.has(tier.id);
2603
+ return (_jsxs("label", { className: `matrix__modal-tier-option ${isSelected ? "matrix__modal-tier-option--selected" : ""}`, children: [_jsx("input", { type: "checkbox", checked: isSelected, onChange: (e) => {
2604
+ const newSet = new Set(editServiceSelectedTiers);
2605
+ if (e.target.checked) {
2606
+ newSet.add(tier.id);
2607
+ }
2608
+ else {
2609
+ newSet.delete(tier.id);
2610
+ }
2611
+ setEditServiceSelectedTiers(newSet);
2612
+ }, className: "matrix__modal-tier-checkbox" }), _jsx("span", { className: "matrix__modal-tier-name", children: tier.name }), tier.pricing.amount !== null && (_jsxs("span", { className: "matrix__modal-tier-price", children: ["$", tier.pricing.amount, "/mo"] }))] }, tier.id));
2613
+ }) })] })), _jsxs("div", { className: "matrix__modal-actions", children: [_jsx("button", { onClick: () => {
2614
+ setEditServiceModal(null);
2615
+ setEditServiceName("");
2616
+ setEditServiceDescription("");
2617
+ setEditServiceSelectedTiers(new Set());
2618
+ }, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleSaveEditService, disabled: !editServiceName.trim(), className: "matrix__modal-btn matrix__modal-btn--primary", children: "Save Changes" })] })] }) })), 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., Number of Entities, API Calls, Storage", className: "matrix__modal-input", autoFocus: true })] }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Unit Name (Optional)" }), _jsx("input", { type: "text", value: metricUnitName, onChange: (e) => setMetricUnitName(e.target.value), placeholder: "e.g., entity, user, API call, GB", className: "matrix__modal-input" }), _jsx("p", { className: "matrix__modal-hint", style: { marginTop: "0.375rem" }, children: "Used for overage pricing (e.g., \"$50/entity above free limit\")" })] }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Reset Cycle" }), _jsxs("select", { value: metricResetCycle, onChange: (e) => setMetricResetCycle(e.target.value), className: "matrix__modal-input", style: { cursor: "pointer" }, children: [_jsx("option", { value: "DAILY", children: "Daily" }), _jsx("option", { value: "WEEKLY", children: "Weekly" }), _jsx("option", { value: "MONTHLY", children: "Monthly" })] }), _jsx("p", { className: "matrix__modal-hint", style: { marginTop: "0.375rem" }, children: "How often usage limits reset" })] }), _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: {
2619
+ display: "flex",
2620
+ flexDirection: "column",
2621
+ gap: "0.5rem",
2622
+ }, children: tiers.map((tier) => {
2623
+ const isEnabled = metricEnabledTiers.has(tier.id);
2624
+ const tierOveragePrice = metricOveragePrices[tier.id] || "";
2625
+ return (_jsxs("div", { style: {
2626
+ display: "flex",
2627
+ flexDirection: "column",
2628
+ gap: "0.5rem",
2629
+ padding: "0.75rem",
2630
+ borderRadius: "6px",
2631
+ background: isEnabled
2632
+ ? "rgba(124, 58, 237, 0.05)"
2633
+ : "#f8fafc",
2634
+ border: isEnabled
2635
+ ? "1px solid rgba(124, 58, 237, 0.2)"
2636
+ : "1px solid #e2e8f0",
2637
+ transition: "all 0.15s ease",
2638
+ }, children: [_jsxs("div", { style: {
2639
+ display: "flex",
2640
+ alignItems: "center",
2641
+ gap: "0.75rem",
2642
+ }, children: [_jsxs("label", { style: {
2643
+ display: "flex",
2644
+ alignItems: "center",
2645
+ gap: "0.5rem",
2646
+ cursor: "pointer",
2647
+ minWidth: "120px",
2648
+ }, children: [_jsx("input", { type: "checkbox", checked: isEnabled, onChange: (e) => {
2649
+ setMetricEnabledTiers((prev) => {
2650
+ const next = new Set(prev);
2651
+ if (e.target.checked) {
2652
+ next.add(tier.id);
2653
+ }
2654
+ else {
2655
+ next.delete(tier.id);
2656
+ }
2657
+ return next;
2658
+ });
2659
+ }, style: {
2660
+ width: "16px",
2661
+ height: "16px",
2662
+ accentColor: "#7c3aed",
2663
+ cursor: "pointer",
2664
+ } }), _jsx("span", { style: {
2665
+ fontWeight: 600,
2666
+ color: isEnabled ? "#334155" : "#94a3b8",
2667
+ fontSize: "0.875rem",
2668
+ }, children: tier.name })] }), _jsx("input", { type: "text", value: metricLimits[tier.id] || "", onChange: (e) => setMetricLimits((prev) => ({
2669
+ ...prev,
2670
+ [tier.id]: e.target.value,
2671
+ })), placeholder: isEnabled ? "Free limit" : "—", className: "matrix__modal-input", disabled: !isEnabled, style: {
2672
+ flex: 1,
2673
+ opacity: isEnabled ? 1 : 0.5,
2674
+ cursor: isEnabled ? "text" : "not-allowed",
2675
+ } }), _jsx("input", { type: "text", value: metricPaidLimits[tier.id] || "", onChange: (e) => setMetricPaidLimits((prev) => ({
2676
+ ...prev,
2677
+ [tier.id]: e.target.value,
2678
+ })), placeholder: isEnabled ? "Paid limit" : "—", className: "matrix__modal-input", disabled: !isEnabled, style: {
2679
+ flex: 1,
2680
+ opacity: isEnabled ? 1 : 0.5,
2681
+ cursor: isEnabled ? "text" : "not-allowed",
2682
+ } })] }), isEnabled && (_jsxs("div", { style: {
2683
+ display: "flex",
2684
+ alignItems: "center",
2685
+ gap: "0.5rem",
2686
+ marginLeft: "1.75rem",
2687
+ padding: "0.5rem 0.75rem",
2688
+ background: "rgba(255,255,255,0.6)",
2689
+ borderRadius: "4px",
2690
+ }, children: [_jsx("span", { style: {
2691
+ fontSize: "0.75rem",
2692
+ color: "#64748b",
2693
+ whiteSpace: "nowrap",
2694
+ }, children: "Overage price:" }), _jsx("span", { style: {
2695
+ fontFamily: "var(--so-font-mono)",
2696
+ fontSize: "0.8125rem",
2697
+ color: "#64748b",
2698
+ }, children: "$" }), _jsx("input", { type: "number", value: tierOveragePrice, onChange: (e) => setMetricOveragePrices((prev) => ({
2699
+ ...prev,
2700
+ [tier.id]: e.target.value,
2701
+ })), placeholder: "0.00", step: "0.01", style: {
2702
+ width: "4rem",
2703
+ fontFamily: "var(--so-font-mono)",
2704
+ fontSize: "0.8125rem",
2705
+ fontWeight: 500,
2706
+ color: "#0f172a",
2707
+ background: "#ffffff",
2708
+ border: "1px solid #cbd5e1",
2709
+ borderRadius: "4px",
2710
+ padding: "0.25rem 0.375rem",
2711
+ outline: "none",
2712
+ } }), _jsxs("span", { style: {
2713
+ fontSize: "0.6875rem",
2714
+ color: "#64748b",
2715
+ }, children: ["per ", metricUnitName || "unit", " above free limit", metricResetCycle
2716
+ ? ` / ${metricResetCycle.toLowerCase()}`
2717
+ : ""] })] }))] }, tier.id));
2718
+ }) })] }), _jsxs("div", { className: "matrix__modal-actions", children: [_jsx("button", { onClick: () => {
2719
+ setMetricModal(null);
2720
+ setMetricName("");
2721
+ setMetricUnitName("");
2722
+ setMetricLimits({});
2723
+ setMetricPaidLimits({});
2724
+ setMetricEnabledTiers(new Set());
2725
+ setMetricOveragePrices({});
2726
+ setMetricOverageCycles({});
2727
+ setMetricResetCycle("MONTHLY");
2728
+ }, 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" })] })] }) }))] })] }));
2729
+ }
2730
+ function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptional, isEnabled, onToggle, getServiceLevelForTier, getUniqueMetricsForService, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, onAddService, selectedTierIdx, onAddMetric, onEditMetric, onRemoveMetric, onEditService, onReorderService, }) {
2731
+ const showGroup = services.length > 0 || onAddService;
2732
+ if (!showGroup)
2733
+ return null;
2734
+ const headerClass = isSetupFormation
2735
+ ? "matrix__group-header--setup"
2736
+ : isOptional
2737
+ ? "matrix__group-header--optional"
2738
+ : "matrix__group-header--regular";
2739
+ const rowClass = isSetupFormation
2740
+ ? "matrix__service-row--setup"
2741
+ : isOptional
2742
+ ? "matrix__service-row--optional"
2743
+ : "matrix__service-row--regular";
2744
+ return (_jsxs(_Fragment, { children: [_jsxs("tr", { className: `matrix__group-header ${headerClass}`, children: [_jsx("td", { className: `matrix__group-header-sticky ${headerClass}`, children: _jsxs("div", { className: "matrix__group-header-inner", children: [isOptional && (_jsx("button", { onClick: onToggle, className: `matrix__group-toggle ${isEnabled ? "matrix__group-toggle--on" : "matrix__group-toggle--off"}`, children: _jsx("span", { className: "matrix__group-toggle-knob" }) })), _jsx("span", { className: "matrix__group-name", children: group.name }), group.billingCycle && (_jsx("span", { className: "matrix__group-billing-badge", children: BILLING_CYCLE_SHORT_LABELS[group.billingCycle] })), group.isAddOn && group.price != null && (_jsx("span", { className: "matrix__group-price-badge", children: formatPrice(group.price, group.currency || "USD") }))] }) }), _jsx("td", { colSpan: tiers.length, className: headerClass, style: { textAlign: "center" }, children: _jsx("span", { className: `matrix__group-badge ${isSetupFormation || !isOptional
2745
+ ? "matrix__group-badge--included"
2746
+ : "matrix__group-badge--optional"}`, children: isSetupFormation
2747
+ ? "INCLUDED"
2748
+ : isOptional
2749
+ ? "OPTIONAL"
2750
+ : "INCLUDED" }) })] }), services.map((service) => {
2751
+ const metrics = getUniqueMetricsForService(service.id);
2752
+ 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, onEditService: onEditService, onReorderService: onReorderService, groupServices: services, serviceIndex: services.indexOf(service) }, service.id));
2753
+ }), 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: group.price
2754
+ ? `${formatPrice(group.price, group.currency || "USD")} flat fee (applied to all tiers)`
2755
+ : "No setup fee configured" })] })), isOptional && (_jsxs(_Fragment, { children: [(() => {
2756
+ const setupServicesInGroup = services.filter((s) => s.costType === "SETUP" && s.price != null);
2757
+ if (setupServicesInGroup.length === 0)
2758
+ return null;
2759
+ const setupTotal = setupServicesInGroup.reduce((sum, s) => sum + (s.price || 0), 0);
2760
+ return (_jsxs("tr", { className: "matrix__setup-total-row", children: [_jsxs("td", { children: ["Setup fees (", group.name, ")"] }), _jsx("td", { colSpan: tiers.length, style: { textAlign: "center" }, children: isEnabled
2761
+ ? `${formatPrice(setupTotal, group.currency || "USD")} one-time`
2762
+ : "—" })] }));
2763
+ })(), _jsxs("tr", { className: `matrix__total-row ${headerClass}`, children: [_jsx("td", { className: headerClass, children: "SUBTOTAL" }), tiers.map((tier, tierIdx) => {
2764
+ const recurringPrice = isEnabled && group.price ? group.price : 0;
2765
+ const billingLabel = group.billingCycle
2766
+ ? `/${BILLING_CYCLE_SHORT_LABELS[group.billingCycle].toLowerCase()}`
2767
+ : "/mo";
2768
+ return (_jsx("td", { style: {
2769
+ textAlign: "center",
2770
+ background: tierIdx === selectedTierIdx && isEnabled
2771
+ ? "var(--so-violet-200)"
2772
+ : undefined,
2773
+ color: tierIdx === selectedTierIdx && isEnabled
2774
+ ? "var(--so-violet-900)"
2775
+ : undefined,
2776
+ }, children: isEnabled && recurringPrice > 0
2777
+ ? `+${formatPrice(recurringPrice, group.currency || "USD")}${billingLabel}`
2778
+ : isEnabled
2779
+ ? "Included"
2780
+ : "—" }, tier.id));
2781
+ })] })] }))] }));
2782
+ }
2783
+ function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLevelForTier, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, selectedTierIdx, onAddMetric, onEditMetric, onRemoveMetric, onEditService, onReorderService, groupServices, serviceIndex, }) {
2784
+ const isFirst = serviceIndex === 0;
2785
+ const isLast = serviceIndex === groupServices.length - 1;
2786
+ 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: [_jsxs("div", { className: "matrix__reorder-buttons", children: [_jsx("button", { className: "matrix__reorder-btn", onClick: (e) => {
2787
+ e.stopPropagation();
2788
+ onReorderService(service.id, "up", groupServices);
2789
+ }, disabled: isFirst, title: "Move up", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M18 15l-6-6-6 6" }) }) }), _jsx("button", { className: "matrix__reorder-btn", onClick: (e) => {
2790
+ e.stopPropagation();
2791
+ onReorderService(service.id, "down", groupServices);
2792
+ }, disabled: isLast, title: "Move down", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M6 9l6 6 6-6" }) }) })] }), _jsx("button", { className: "matrix__service-title matrix__service-title--clickable", onClick: (e) => {
2793
+ e.stopPropagation();
2794
+ onEditService(service);
2795
+ }, title: "Click to edit service", children: service.title }), service.costType === "SETUP" && (_jsx("span", { className: "matrix__service-setup-badge", children: "Setup" })), service.costType === "SETUP" && service.price != null && (_jsx("span", { className: "matrix__service-setup-price", children: formatPrice(service.price, service.currency || "USD") })), _jsx("button", { onClick: (e) => {
2796
+ e.stopPropagation();
2797
+ onAddMetric(service.id);
2798
+ }, className: "matrix__add-metric-btn", title: "Add metric to this service", children: "+ Metric" })] }) }), tiers.map((tier, tierIdx) => {
2799
+ const serviceLevel = getServiceLevelForTier(service.id, tier);
2800
+ const display = getLevelDisplay(serviceLevel);
2801
+ const isSelected = selectedCell?.serviceId === service.id &&
2802
+ selectedCell?.tierId === tier.id;
2803
+ const isNotIncluded = !serviceLevel || serviceLevel.level === "NOT_INCLUDED";
2804
+ // Find next tier that has this service included (for upgrade hint)
2805
+ const nextTierWithService = isNotIncluded
2806
+ ? tiers.slice(tierIdx + 1).find((t) => {
2807
+ const sl = getServiceLevelForTier(service.id, t);
2808
+ return sl && sl.level === "INCLUDED";
2809
+ })
2810
+ : null;
2811
+ return (_jsxs("td", { className: `matrix__level-cell ${isSelected ? "matrix__level-cell--selected" : ""} ${tierIdx === selectedTierIdx ? "matrix__level-cell--highlight" : ""} ${isNotIncluded ? "matrix__level-cell--not-included" : ""}`, onClick: () => setSelectedCell(isSelected
2812
+ ? null
2813
+ : { serviceId: service.id, tierId: tier.id }), children: [_jsx("span", { className: `matrix__level-value ${isNotIncluded ? "matrix__level-value--not-included" : ""}`, style: { color: display.color }, children: display.label }), isNotIncluded && nextTierWithService && (_jsxs("span", { className: "matrix__upgrade-hint", children: ["In ", nextTierWithService.name, " \u2192"] }))] }, tier.id));
2814
+ })] }), 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) => {
2815
+ e.stopPropagation();
2816
+ onEditMetric(service.id, metric);
2817
+ }, 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) => {
2818
+ e.stopPropagation();
2819
+ onRemoveMetric(service.id, metric);
2820
+ }, 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) => {
2821
+ const usageLimit = getUsageLimitForMetric(service.id, metric, tier);
2822
+ return (_jsx("td", { className: `matrix__metric-value-cell ${tierIdx === selectedTierIdx
2823
+ ? "matrix__level-cell--highlight"
2824
+ : ""}`, children: _jsxs("div", { className: "matrix__metric-value-container", children: [_jsx("span", { className: "matrix__metric-value", children: usageLimit
2825
+ ? usageLimit.freeLimit
2826
+ ? `Free: ${usageLimit.freeLimit}${usageLimit.paidLimit ? ` / Paid: ${usageLimit.paidLimit}` : ""}`
2827
+ : usageLimit.notes || "Unlimited"
2828
+ : "—" }), usageLimit?.resetCycle && (_jsx("span", { className: "matrix__metric-reset-cycle", children: usageLimit.resetCycle.toLowerCase() })), usageLimit?.unitPrice != null && (_jsxs("span", { className: "matrix__metric-overage", children: ["+", formatPrice(usageLimit.unitPrice, usageLimit.unitPriceCurrency || "USD"), "/", usageLimit.unitName || "unit", " above free", usageLimit.resetCycle
2829
+ ? ` / ${usageLimit.resetCycle.toLowerCase()}`
2830
+ : ""] }))] }) }, tier.id));
2831
+ })] }, `${service.id}-${metric}`)))] }));
2832
+ }
2833
+ function ServiceLevelDetailPanel({ serviceId, tierId, services, tiers, optionGroups: _optionGroups, dispatch, onClose, }) {
2834
+ const service = services.find((s) => s.id === serviceId);
2835
+ const tier = tiers.find((t) => t.id === tierId);
2836
+ const panelRef = useRef(null);
2837
+ const overlayRef = useRef(null);
2838
+ // Scroll lock when modal is open
2839
+ useEffect(() => {
2840
+ const originalOverflow = document.body.style.overflow;
2841
+ document.body.style.overflow = "hidden";
2842
+ return () => {
2843
+ document.body.style.overflow = originalOverflow;
2844
+ };
2845
+ }, []);
2846
+ // Handle Escape key press
2847
+ useEffect(() => {
2848
+ const handleKeyDown = (e) => {
2849
+ if (e.key === "Escape") {
2850
+ onClose();
2851
+ }
2852
+ };
2853
+ document.addEventListener("keydown", handleKeyDown);
2854
+ return () => document.removeEventListener("keydown", handleKeyDown);
2855
+ }, [onClose]);
2856
+ // Focus trap - keep focus inside the panel
2857
+ useEffect(() => {
2858
+ const panel = panelRef.current;
2859
+ if (!panel)
2860
+ return;
2861
+ const focusableElements = panel.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
2862
+ const firstElement = focusableElements[0];
2863
+ const lastElement = focusableElements[focusableElements.length - 1];
2864
+ // Focus the first element
2865
+ firstElement?.focus();
2866
+ const handleTabKey = (e) => {
2867
+ if (e.key !== "Tab")
2868
+ return;
2869
+ if (e.shiftKey) {
2870
+ if (document.activeElement === firstElement) {
2871
+ e.preventDefault();
2872
+ lastElement?.focus();
2873
+ }
2874
+ }
2875
+ else {
2876
+ if (document.activeElement === lastElement) {
2877
+ e.preventDefault();
2878
+ firstElement?.focus();
2879
+ }
2880
+ }
2881
+ };
2882
+ document.addEventListener("keydown", handleTabKey);
2883
+ return () => document.removeEventListener("keydown", handleTabKey);
2884
+ }, []);
2885
+ // Click outside to close
2886
+ const handleOverlayClick = useCallback((e) => {
2887
+ if (e.target === overlayRef.current) {
2888
+ onClose();
2889
+ }
2890
+ }, [onClose]);
2891
+ const serviceLevel = service
2892
+ ? tier?.serviceLevels.find((sl) => sl.serviceId === serviceId)
2893
+ : undefined;
2894
+ const usageLimits = service
2895
+ ? tier?.usageLimits.filter((ul) => ul.serviceId === serviceId) || []
2896
+ : [];
2897
+ const [isAddingMetric, setIsAddingMetric] = useState(false);
2898
+ const [newMetric, setNewMetric] = useState("");
2899
+ const [newLimit, setNewLimit] = useState("");
2900
+ const [customValue, setCustomValue] = useState(serviceLevel?.customValue || "");
2901
+ if (!service || !tier)
2902
+ return null;
2903
+ const handleAddLimit = () => {
2904
+ if (!newMetric.trim())
2905
+ return;
2906
+ const parsedLimit = newLimit ? parseInt(newLimit, 10) : null;
2907
+ const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
2908
+ dispatch(addUsageLimit({
2909
+ tierId: tier.id,
2910
+ limitId: generateId(),
2911
+ serviceId: service.id,
2912
+ metric: newMetric.trim(),
2913
+ freeLimit: isNumeric ? parsedLimit : undefined,
2914
+ notes: !isNumeric && newLimit ? newLimit.trim() : undefined,
2915
+ resetCycle: "MONTHLY",
2916
+ lastModified: new Date().toISOString(),
2917
+ }));
2918
+ setNewMetric("");
2919
+ setNewLimit("");
2920
+ setIsAddingMetric(false);
2921
+ };
2922
+ const handleRemoveLimit = (limitId) => {
2923
+ dispatch(removeUsageLimit({
2924
+ tierId: tier.id,
2925
+ limitId,
2926
+ lastModified: new Date().toISOString(),
2927
+ }));
2928
+ };
2929
+ 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: () => {
2930
+ setNewMetric("");
2931
+ setNewLimit("");
2932
+ setIsAddingMetric(false);
2933
+ }, 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" }) })] }) }));
2934
+ }
2935
+ function MetricLimitItem({ limit, tierId, dispatch, onRemove, }) {
2936
+ const [isEditing, setIsEditing] = useState(false);
2937
+ const [editMetric, setEditMetric] = useState(limit.metric);
2938
+ const [editUnitName, setEditUnitName] = useState(limit.unitName || "");
2939
+ const [editLimit, setEditLimit] = useState(limit.freeLimit?.toString() || limit.notes || "");
2940
+ const [editPaidLimit, setEditPaidLimit] = useState(limit.paidLimit?.toString() || "");
2941
+ const [editResetCycle, setEditResetCycle] = useState(limit.resetCycle || "MONTHLY");
2942
+ // Overage pricing state
2943
+ const [editUnitPrice, setEditUnitPrice] = useState(limit.unitPrice?.toString() || "");
2944
+ const [editUnitPriceCurrency] = useState(limit.unitPriceCurrency || "USD");
2945
+ const handleSave = () => {
2946
+ const parsedLimit = editLimit ? parseInt(editLimit, 10) : null;
2947
+ const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
2948
+ const parsedPaidLimit = editPaidLimit ? parseInt(editPaidLimit, 10) : null;
2949
+ const isPaidNumeric = parsedPaidLimit !== null && !isNaN(parsedPaidLimit);
2950
+ const parsedUnitPrice = editUnitPrice ? parseFloat(editUnitPrice) : null;
2951
+ dispatch(updateUsageLimit({
2952
+ tierId,
2953
+ limitId: limit.id,
2954
+ metric: editMetric.trim() || limit.metric,
2955
+ unitName: editUnitName.trim() || undefined,
2956
+ freeLimit: isNumeric ? parsedLimit : undefined,
2957
+ paidLimit: isPaidNumeric ? parsedPaidLimit : undefined,
2958
+ notes: !isNumeric && editLimit ? editLimit.trim() : undefined,
2959
+ resetCycle: editResetCycle,
2960
+ unitPrice: parsedUnitPrice,
2961
+ unitPriceCurrency: parsedUnitPrice ? editUnitPriceCurrency : undefined,
2962
+ lastModified: new Date().toISOString(),
2963
+ }));
2964
+ setIsEditing(false);
2965
+ };
2966
+ const handleCancel = () => {
2967
+ setEditMetric(limit.metric);
2968
+ setEditUnitName(limit.unitName || "");
2969
+ setEditLimit(limit.freeLimit?.toString() || limit.notes || "");
2970
+ setEditPaidLimit(limit.paidLimit?.toString() || "");
2971
+ setEditResetCycle(limit.resetCycle || "MONTHLY");
2972
+ setEditUnitPrice(limit.unitPrice?.toString() || "");
2973
+ setIsEditing(false);
2974
+ };
2975
+ // Format overage display string
2976
+ const getOverageDisplay = () => {
2977
+ if (!limit.unitPrice)
2978
+ return null;
2979
+ const unitLabel = limit.unitName || "unit";
2980
+ return `+${formatPrice(limit.unitPrice, limit.unitPriceCurrency || "USD")} per ${unitLabel}`;
2981
+ };
2982
+ const overageDisplay = getOverageDisplay();
2983
+ if (isEditing) {
2984
+ 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: "e.g., Number of Entities", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Unit Name" }), _jsx("input", { type: "text", value: editUnitName, onChange: (e) => setEditUnitName(e.target.value), placeholder: "e.g., entity, credit card, contractor", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Used for overage pricing display (e.g., \"$50 per entity\")" })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Free Limit" }), _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: "Included free limit for this tier" })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Paid Limit" }), _jsx("input", { type: "text", value: editPaidLimit, onChange: (e) => setEditPaidLimit(e.target.value), placeholder: "e.g., 500, 1000", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Maximum paid usage beyond the free limit (optional)" })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Reset Cycle" }), _jsxs("select", { value: editResetCycle, onChange: (e) => setEditResetCycle(e.target.value), className: "matrix__panel-input", style: { cursor: "pointer" }, children: [_jsx("option", { value: "DAILY", children: "Daily" }), _jsx("option", { value: "WEEKLY", children: "Weekly" }), _jsx("option", { value: "MONTHLY", children: "Monthly" })] })] }), _jsxs("div", { className: "matrix__panel-overage-section", children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Overage Pricing (Optional)" }), _jsx("p", { className: "matrix__panel-edit-hint", style: { marginBottom: "0.5rem" }, children: "Set a price for usage beyond the included limit" }), _jsxs("div", { className: "matrix__panel-overage-row", children: [_jsxs("div", { className: "matrix__panel-overage-price", children: [_jsx("span", { className: "matrix__panel-overage-currency", children: "$" }), _jsx("input", { type: "number", value: editUnitPrice, onChange: (e) => setEditUnitPrice(e.target.value), placeholder: "0.00", step: "0.01", className: "matrix__panel-overage-input" })] }), _jsxs("span", { className: "matrix__panel-overage-label", children: ["per ", editUnitName || "unit"] })] })] }), _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" })] })] }));
2985
+ }
2986
+ 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 }), _jsxs("div", { className: "matrix__panel-limit-value-group", children: [_jsx("div", { className: "matrix__panel-limit-value", children: limit.freeLimit != null
2987
+ ? `Free: ${limit.freeLimit}${limit.paidLimit != null ? ` / Paid: ${limit.paidLimit}` : ""}`
2988
+ : (limit.notes ?? "—") }), limit.resetCycle && (_jsxs("div", { style: { fontSize: "0.6875rem", color: "#64748b" }, children: ["Resets ", limit.resetCycle.toLowerCase()] })), overageDisplay && (_jsx("div", { className: "matrix__panel-limit-overage", children: overageDisplay }))] })] }), _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" }) }) })] })] }));
2989
+ }