@happyvertical/smrt-planner 0.57.3 → 0.57.5

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 (537) hide show
  1. package/agents/assistant.md +8 -1
  2. package/agents/cookbook.md +8 -2
  3. package/app/404.html +21 -21
  4. package/app/_app/immutable/assets/2.CdEXvRg0.css +1 -0
  5. package/app/_app/immutable/assets/{feedback.DePeap37.css → feedback.qFktqYFY.css} +1 -1
  6. package/app/_app/immutable/chunks/{DveAWx7t.js → 5ukUzDcw.js} +1 -1
  7. package/app/_app/immutable/chunks/{DR_9YSDq.js → BDbFl7UA.js} +1 -1
  8. package/app/_app/immutable/chunks/{rkUL-DlL.js → BG9Gz_25.js} +25 -25
  9. package/app/_app/immutable/chunks/{BfPYbnRI.js → Bal1oPZu.js} +1 -1
  10. package/app/_app/immutable/chunks/BhU_yBI_.js +1 -0
  11. package/app/_app/immutable/chunks/{CZwkvsZI.js → BiEOJeYb.js} +1 -1
  12. package/app/_app/immutable/chunks/{DsY7g8iJ.js → Bsn3IIve.js} +3 -3
  13. package/app/_app/immutable/chunks/{PJY04JNF.js → BybfWt-B.js} +1 -1
  14. package/app/_app/immutable/chunks/{CF503c7E.js → C1VofLtR.js} +1 -1
  15. package/app/_app/immutable/chunks/{2l76O8yg.js → C3sRGrYK.js} +1 -1
  16. package/app/_app/immutable/chunks/{Bz0ybtg3.js → CTlMHIE6.js} +1 -1
  17. package/app/_app/immutable/chunks/C_3CJO_1.js +1 -0
  18. package/app/_app/immutable/chunks/Cga8zF3r.js +1 -0
  19. package/app/_app/immutable/chunks/Cr4byQts.js +24 -0
  20. package/app/_app/immutable/chunks/{U6_OBRq_.js → CtjBwCj8.js} +1 -1
  21. package/app/_app/immutable/chunks/CyUSxz1P.js +4 -0
  22. package/app/_app/immutable/chunks/{BAeyjCL_.js → DTWraE40.js} +1 -1
  23. package/app/_app/immutable/chunks/{Cfd9dmBM.js → DjJovMrk.js} +1 -1
  24. package/app/_app/immutable/chunks/{BJKoxDbG.js → DuZeZzOA.js} +1 -1
  25. package/app/_app/immutable/chunks/{C-DLpfU4.js → J9kOiFLO.js} +1 -1
  26. package/app/_app/immutable/chunks/NppCG--v.js +1 -0
  27. package/app/_app/immutable/chunks/{EZsakmZX.js → O8DAZ_le.js} +1 -1
  28. package/app/_app/immutable/chunks/{Dq8aYheE.js → YGONf0jr.js} +1 -1
  29. package/app/_app/immutable/chunks/d_dqmeIr.js +1 -0
  30. package/app/_app/immutable/chunks/{Bb0f-PWY.js → gCpxN2IC.js} +1 -1
  31. package/app/_app/immutable/chunks/nphy1MQF.js +1 -0
  32. package/app/_app/immutable/entry/{app.BOdcGXnx.js → app.B4gMiHwR.js} +2 -2
  33. package/app/_app/immutable/entry/start.BXkBl20Z.js +1 -0
  34. package/app/_app/immutable/nodes/0.2MYMg80l.js +9 -0
  35. package/app/_app/immutable/nodes/{1.CULLAAlp.js → 1.DKP901Gn.js} +1 -1
  36. package/app/_app/immutable/nodes/{10.D3aS_KZl.js → 10.DNN0cVai.js} +1 -1
  37. package/app/_app/immutable/nodes/{11.C92xaiTE.js → 11.DgbmegX3.js} +1 -1
  38. package/app/_app/immutable/nodes/{12.D1Lzt56L.js → 12.D5MtnJoE.js} +1 -1
  39. package/app/_app/immutable/nodes/{13.Bx4rov-F.js → 13._rY66Xa_.js} +1 -1
  40. package/app/_app/immutable/nodes/{14.CEBy0En2.js → 14.B6TD25VU.js} +1 -1
  41. package/app/_app/immutable/nodes/2.x9WyxQ1S.js +24 -0
  42. package/app/_app/immutable/nodes/{3.C8f09BsJ.js → 3.V5uGCpGb.js} +1 -1
  43. package/app/_app/immutable/nodes/{4.Z1MwZ_rU.js → 4.CCwzLrgu.js} +1 -1
  44. package/app/_app/immutable/nodes/{5.BnknP-NB.js → 5.CgHzwpns.js} +1 -1
  45. package/app/_app/immutable/nodes/{6.B0InO4bR.js → 6.CvQHLh_u.js} +1 -1
  46. package/app/_app/immutable/nodes/{7.CLnj1BGB.js → 7.7EIrly34.js} +1 -1
  47. package/app/_app/immutable/nodes/{8.BmZYIUmz.js → 8.DyyRBuTw.js} +1 -1
  48. package/app/_app/immutable/nodes/{9.BKWSHjz-.js → 9.DcURs0gN.js} +1 -1
  49. package/app/_app/version.json +1 -1
  50. package/app/advanced-styles/index.html +24 -24
  51. package/app/ai/index.html +28 -33
  52. package/app/blueprint/index.html +22 -22
  53. package/app/cookbook/index.html +22 -22
  54. package/app/index.html +38 -38
  55. package/app/m/ads/AdDeliveryTier/index.html +25 -25
  56. package/app/m/ads/AdEvent/index.html +25 -25
  57. package/app/m/ads/AdFormat/index.html +25 -25
  58. package/app/m/ads/AdGroup/index.html +25 -25
  59. package/app/m/ads/AdVariation/index.html +25 -25
  60. package/app/m/analytics/AnalyticsDataStream/index.html +25 -25
  61. package/app/m/analytics/AnalyticsEvent/index.html +25 -25
  62. package/app/m/analytics/AnalyticsProperty/index.html +25 -25
  63. package/app/m/analytics/AnalyticsReport/index.html +25 -25
  64. package/app/m/approvals/ApprovalEvent/index.html +25 -25
  65. package/app/m/approvals/ApprovalPolicy/index.html +25 -25
  66. package/app/m/approvals/ApprovalRequest/index.html +25 -25
  67. package/app/m/assets/Asset/attachments/index.html +26 -26
  68. package/app/m/assets/Asset/index.html +25 -25
  69. package/app/m/assets/AssetAssociation/index.html +25 -25
  70. package/app/m/assets/AssetMetafield/index.html +25 -25
  71. package/app/m/assets/AssetStatus/index.html +25 -25
  72. package/app/m/assets/AssetType/index.html +25 -25
  73. package/app/m/assets/Folder/index.html +25 -25
  74. package/app/m/chat/AgentSession/index.html +25 -25
  75. package/app/m/chat/ChatMessage/index.html +25 -25
  76. package/app/m/chat/ChatParticipant/index.html +25 -25
  77. package/app/m/chat/ChatReaction/index.html +25 -25
  78. package/app/m/chat/ChatRoom/index.html +25 -25
  79. package/app/m/chat/ChatThread/index.html +25 -25
  80. package/app/m/chat/VoiceGatewayTurn/index.html +25 -25
  81. package/app/m/chat/VoiceSession/index.html +25 -25
  82. package/app/m/commerce/Agreement/index.html +25 -25
  83. package/app/m/commerce/Cart/index.html +25 -25
  84. package/app/m/commerce/Contract/index.html +25 -25
  85. package/app/m/commerce/ContractLineItem/index.html +26 -26
  86. package/app/m/commerce/Customer/index.html +25 -25
  87. package/app/m/commerce/DocumentTax/index.html +25 -25
  88. package/app/m/commerce/Estimate/index.html +25 -25
  89. package/app/m/commerce/Fulfillment/index.html +25 -25
  90. package/app/m/commerce/FulfillmentLineItem/index.html +25 -25
  91. package/app/m/commerce/HistoricalCustomerFunds/index.html +89 -0
  92. package/app/m/commerce/HistoricalCustomerFundsAllocation/index.html +89 -0
  93. package/app/m/commerce/HistoricalSalesLine/index.html +89 -0
  94. package/app/m/commerce/Invoice/index.html +25 -25
  95. package/app/m/commerce/InvoiceLineItem/index.html +25 -25
  96. package/app/m/commerce/Lease/index.html +25 -25
  97. package/app/m/commerce/LicenseSale/index.html +25 -25
  98. package/app/m/commerce/Order/index.html +25 -25
  99. package/app/m/commerce/Payment/index.html +25 -25
  100. package/app/m/commerce/PaymentAllocation/index.html +25 -25
  101. package/app/m/commerce/PaymentInstrument/index.html +25 -25
  102. package/app/m/commerce/PaymentIntent/index.html +25 -25
  103. package/app/m/commerce/Payout/index.html +25 -25
  104. package/app/m/commerce/ProductionOrder/index.html +25 -25
  105. package/app/m/commerce/PurchaseContract/index.html +25 -25
  106. package/app/m/commerce/PurchaseOrder/index.html +25 -25
  107. package/app/m/commerce/SalesContract/index.html +25 -25
  108. package/app/m/commerce/SupplierQuote/index.html +25 -25
  109. package/app/m/commerce/TaxCode/index.html +25 -25
  110. package/app/m/commerce/TaxComponent/index.html +25 -25
  111. package/app/m/commerce/TaxSettings/index.html +25 -25
  112. package/app/m/commerce/TaxSummaryReport/index.html +25 -25
  113. package/app/m/commerce/Vendor/index.html +25 -25
  114. package/app/m/commerce/WholesaleOrder/index.html +25 -25
  115. package/app/m/content/Content/index.html +25 -25
  116. package/app/m/content/ContentContribution/index.html +25 -25
  117. package/app/m/content/ContentContributionAttachment/index.html +25 -25
  118. package/app/m/content/ContentContributionRevision/index.html +25 -25
  119. package/app/m/content/ContentContributionType/index.html +25 -25
  120. package/app/m/content/ContentContributor/index.html +25 -25
  121. package/app/m/content/ContentCorrection/index.html +25 -25
  122. package/app/m/content/ContentFeedSource/index.html +25 -25
  123. package/app/m/content/ContentGovernanceAssignment/index.html +25 -25
  124. package/app/m/content/ContentGovernancePolicy/index.html +25 -25
  125. package/app/m/content/ContentGovernanceProfile/index.html +25 -25
  126. package/app/m/content/ContentReference/index.html +25 -25
  127. package/app/m/content/ContentReview/index.html +25 -25
  128. package/app/m/content/ContentVersion/index.html +25 -25
  129. package/app/m/events/Event/index.html +25 -25
  130. package/app/m/events/EventParticipant/index.html +25 -25
  131. package/app/m/events/EventSeries/index.html +26 -26
  132. package/app/m/events/EventType/index.html +25 -25
  133. package/app/m/expenses/Expense/index.html +25 -25
  134. package/app/m/facts/Fact/index.html +25 -25
  135. package/app/m/facts/FactContent/index.html +25 -25
  136. package/app/m/facts/FactEvidence/index.html +25 -25
  137. package/app/m/facts/FactSource/index.html +25 -25
  138. package/app/m/facts/FactSubject/index.html +25 -25
  139. package/app/m/facts/FactTag/index.html +25 -25
  140. package/app/m/fields/FieldPolicy/index.html +25 -25
  141. package/app/m/fields/FieldPolicySuggestion/index.html +25 -25
  142. package/app/m/fields/FieldUsageCounter/index.html +25 -25
  143. package/app/m/images/Image/index.html +25 -25
  144. package/app/m/inventory/InventoryLocation/index.html +25 -25
  145. package/app/m/inventory/StockLevel/index.html +25 -25
  146. package/app/m/inventory/StockMovement/index.html +25 -25
  147. package/app/m/ledgers/Account/index.html +25 -25
  148. package/app/m/ledgers/Journal/index.html +25 -25
  149. package/app/m/ledgers/JournalEntry/index.html +25 -25
  150. package/app/m/ledgers/Ledger/index.html +25 -25
  151. package/app/m/manufacturing/Assembly/index.html +25 -25
  152. package/app/m/manufacturing/BillOfMaterials/index.html +25 -25
  153. package/app/m/manufacturing/BomLine/index.html +25 -25
  154. package/app/m/manufacturing/Operation/index.html +25 -25
  155. package/app/m/manufacturing/ProductionRun/index.html +25 -25
  156. package/app/m/manufacturing/ProductionRunCompletion/index.html +25 -25
  157. package/app/m/manufacturing/RoutingStep/index.html +25 -25
  158. package/app/m/marketing/Campaign/index.html +25 -25
  159. package/app/m/marketing/CampaignChannel/index.html +25 -25
  160. package/app/m/marketing/CampaignMetricSnapshot/index.html +25 -25
  161. package/app/m/messages/Account/index.html +25 -25
  162. package/app/m/messages/Attachment/index.html +25 -25
  163. package/app/m/messages/Blacklist/index.html +25 -25
  164. package/app/m/messages/Email/failed-sends/index.html +26 -26
  165. package/app/m/messages/Email/index.html +25 -25
  166. package/app/m/messages/Email/mailbox/index.html +26 -26
  167. package/app/m/messages/EmailAccount/index.html +25 -25
  168. package/app/m/messages/EmailAttachment/index.html +25 -25
  169. package/app/m/messages/EmailFolder/index.html +25 -25
  170. package/app/m/messages/Message/index.html +25 -25
  171. package/app/m/messages/MessagingEndpoint/index.html +25 -25
  172. package/app/m/messages/PersonaMessageRoute/index.html +25 -25
  173. package/app/m/messages/SlackAccount/index.html +25 -25
  174. package/app/m/messages/SlackMessage/index.html +25 -25
  175. package/app/m/messages/TelegramAccount/index.html +25 -25
  176. package/app/m/messages/Tweet/index.html +25 -25
  177. package/app/m/messages/TwitterAccount/index.html +25 -25
  178. package/app/m/messages/Whitelist/index.html +25 -25
  179. package/app/m/messages/ZulipAccount/index.html +25 -25
  180. package/app/m/places/Place/index.html +25 -25
  181. package/app/m/places/PlaceType/index.html +25 -25
  182. package/app/m/products/Category/index.html +25 -25
  183. package/app/m/products/Material/index.html +25 -25
  184. package/app/m/products/Product/index.html +25 -25
  185. package/app/m/products/Product/ingredients/index.html +26 -26
  186. package/app/m/products/ProductVariant/index.html +25 -25
  187. package/app/m/products/Sku/index.html +25 -25
  188. package/app/m/profiles/ApiKey/index.html +25 -25
  189. package/app/m/profiles/Bot/index.html +25 -25
  190. package/app/m/profiles/MagicLinkToken/index.html +25 -25
  191. package/app/m/profiles/NostrIdentity/index.html +25 -25
  192. package/app/m/profiles/OidcIdentity/index.html +25 -25
  193. package/app/m/profiles/Organization/index.html +25 -25
  194. package/app/m/profiles/Person/index.html +25 -25
  195. package/app/m/profiles/Profile/index.html +25 -25
  196. package/app/m/profiles/ProfileMetadata/index.html +25 -25
  197. package/app/m/profiles/ProfileMetafield/index.html +25 -25
  198. package/app/m/profiles/ProfileRelationship/index.html +25 -25
  199. package/app/m/profiles/ProfileRelationshipTerm/index.html +25 -25
  200. package/app/m/profiles/ProfileRelationshipType/index.html +25 -25
  201. package/app/m/profiles/ProfileType/index.html +25 -25
  202. package/app/m/projects/Comment/index.html +25 -25
  203. package/app/m/projects/Issue/index.html +25 -25
  204. package/app/m/projects/Label/index.html +25 -25
  205. package/app/m/projects/Project/index.html +25 -25
  206. package/app/m/projects/ProjectIntegration/index.html +25 -25
  207. package/app/m/projects/PullRequest/index.html +25 -25
  208. package/app/m/projects/Repository/index.html +25 -25
  209. package/app/m/properties/Property/index.html +25 -25
  210. package/app/m/properties/Zone/index.html +25 -25
  211. package/app/m/reports/RuntimeReport/index.html +25 -25
  212. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +26 -26
  213. package/app/m/reports/SmrtReportLock/index.html +26 -26
  214. package/app/m/reports/SmrtReportRefreshTask/index.html +26 -26
  215. package/app/m/reports/SmrtReportRun/index.html +26 -26
  216. package/app/m/reports/SmrtReportSchedule/index.html +26 -26
  217. package/app/m/reports/SmrtReportWatermark/index.html +26 -26
  218. package/app/m/sales/Agreement/index.html +25 -25
  219. package/app/m/sales/AttributionException/index.html +25 -25
  220. package/app/m/sales/AttributionPolicy/index.html +25 -25
  221. package/app/m/sales/Commission/index.html +25 -25
  222. package/app/m/sales/CommissionAdjustment/index.html +25 -25
  223. package/app/m/sales/CommissionPayout/index.html +25 -25
  224. package/app/m/sales/CommissionPlan/index.html +25 -25
  225. package/app/m/sales/Earner/index.html +25 -25
  226. package/app/m/sales/EarnerSourceAttribution/index.html +25 -25
  227. package/app/m/sales/EarningEvent/index.html +25 -25
  228. package/app/m/sales/ExecutedAgreement/index.html +25 -25
  229. package/app/m/sales/Lead/index.html +25 -25
  230. package/app/m/sales/Opportunity/index.html +25 -25
  231. package/app/m/sales/OpportunityConversion/index.html +25 -25
  232. package/app/m/sales/PipelineDefinition/index.html +25 -25
  233. package/app/m/sales/PipelineStage/index.html +25 -25
  234. package/app/m/sales/Referral/index.html +25 -25
  235. package/app/m/sales/ReferralAgreement/index.html +25 -25
  236. package/app/m/sales/ReferralLink/index.html +25 -25
  237. package/app/m/sales/ReferralProgram/index.html +25 -25
  238. package/app/m/sales/ReferralTermSnapshot/index.html +25 -25
  239. package/app/m/sales/ReferralTouch/index.html +25 -25
  240. package/app/m/sales/Referrer/index.html +25 -25
  241. package/app/m/sales/SalesActivity/index.html +25 -25
  242. package/app/m/sales/SalesRepresentative/index.html +25 -25
  243. package/app/m/sites/Site/index.html +25 -25
  244. package/app/m/sites/SiteAgentBinding/index.html +25 -25
  245. package/app/m/social/OAuthState/index.html +25 -25
  246. package/app/m/social/SocialAccount/index.html +25 -25
  247. package/app/m/social/SocialPost/index.html +25 -25
  248. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +25 -25
  249. package/app/m/subscriptions/BillingAdjustment/index.html +25 -25
  250. package/app/m/subscriptions/ClientCharge/index.html +25 -25
  251. package/app/m/subscriptions/CreditGrant/index.html +25 -25
  252. package/app/m/subscriptions/PricingRule/index.html +25 -25
  253. package/app/m/subscriptions/RetailCharge/index.html +25 -25
  254. package/app/m/subscriptions/SpendingPolicy/index.html +25 -25
  255. package/app/m/subscriptions/SubscriptionPlan/index.html +25 -25
  256. package/app/m/subscriptions/TenantSubscription/index.html +25 -25
  257. package/app/m/subscriptions/TenantUsageMetric/index.html +25 -25
  258. package/app/m/support/ServiceTimeEntry/index.html +25 -25
  259. package/app/m/support/SupportAiRun/index.html +25 -25
  260. package/app/m/support/SupportAvailability/index.html +25 -25
  261. package/app/m/support/SupportCase/index.html +25 -25
  262. package/app/m/support/SupportCaseEvent/index.html +25 -25
  263. package/app/m/support/SupportChannelBinding/index.html +25 -25
  264. package/app/m/support/SupportCharge/index.html +25 -25
  265. package/app/m/support/SupportCompensation/index.html +25 -25
  266. package/app/m/support/SupportCompensationPlan/index.html +25 -25
  267. package/app/m/support/SupportEscalation/index.html +25 -25
  268. package/app/m/support/SupportInteraction/index.html +25 -25
  269. package/app/m/support/SupportPlan/index.html +25 -25
  270. package/app/m/support/SupportPolicy/index.html +25 -25
  271. package/app/m/support/SupportQualification/index.html +25 -25
  272. package/app/m/support/SupportServiceTarget/index.html +25 -25
  273. package/app/m/support/SupportSpecialist/index.html +25 -25
  274. package/app/m/support/SupportWorkLink/index.html +25 -25
  275. package/app/m/tags/Tag/index.html +25 -25
  276. package/app/m/tags/TagAlias/index.html +25 -25
  277. package/app/m/timesheets/AttendanceBreak/index.html +25 -25
  278. package/app/m/timesheets/AttendancePunch/index.html +25 -25
  279. package/app/m/timesheets/AttendanceSegment/index.html +25 -25
  280. package/app/m/timesheets/ServiceChargeSnapshot/index.html +25 -25
  281. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +25 -25
  282. package/app/m/timesheets/ServiceTimeEntry/index.html +25 -25
  283. package/app/m/users/Group/index.html +25 -25
  284. package/app/m/users/GroupMember/index.html +25 -25
  285. package/app/m/users/GroupRole/index.html +25 -25
  286. package/app/m/users/Membership/index.html +25 -25
  287. package/app/m/users/MembershipOverride/index.html +25 -25
  288. package/app/m/users/Permission/index.html +25 -25
  289. package/app/m/users/Role/index.html +25 -25
  290. package/app/m/users/RolePermission/index.html +25 -25
  291. package/app/m/users/Session/index.html +25 -25
  292. package/app/m/users/Tenant/index.html +25 -25
  293. package/app/m/users/TenantIntegration/index.html +25 -25
  294. package/app/m/users/TenantPermissionOverride/index.html +25 -25
  295. package/app/m/users/User/index.html +25 -25
  296. package/app/m/video/Character/index.html +25 -25
  297. package/app/m/video/CharacterAsset/index.html +25 -25
  298. package/app/m/video/CompositeJob/index.html +25 -25
  299. package/app/m/video/Performer/index.html +25 -25
  300. package/app/m/video/PerformerAsset/index.html +25 -25
  301. package/app/m/video/Scene/index.html +25 -25
  302. package/app/m/video/SceneAsset/index.html +25 -25
  303. package/app/m/video/VideoComposition/index.html +25 -25
  304. package/app/m/video/VideoCompositionAsset/index.html +25 -25
  305. package/app/m/video/VideoSequence/index.html +25 -25
  306. package/app/m/video/VideoSequenceAsset/index.html +25 -25
  307. package/app/m/video/VideoShot/index.html +25 -25
  308. package/app/m/video/VideoShotAsset/index.html +25 -25
  309. package/app/m/video/VideoShotCharacter/index.html +25 -25
  310. package/app/m/video/VideoWorkflow/index.html +25 -25
  311. package/app/m/voice/VoiceOutput/index.html +25 -25
  312. package/app/m/voice/VoiceProfile/index.html +25 -25
  313. package/app/m/voice/VoiceSample/index.html +25 -25
  314. package/app/mcp.html +2 -2
  315. package/app/packages/ads/index.html +24 -24
  316. package/app/packages/analytics/index.html +24 -24
  317. package/app/packages/approvals/index.html +24 -24
  318. package/app/packages/assets/index.html +24 -24
  319. package/app/packages/chat/index.html +24 -24
  320. package/app/packages/comments/index.html +24 -24
  321. package/app/packages/commerce/index.html +25 -25
  322. package/app/packages/content/index.html +24 -24
  323. package/app/packages/events/index.html +24 -24
  324. package/app/packages/expenses/index.html +25 -25
  325. package/app/packages/facts/index.html +24 -24
  326. package/app/packages/fields/index.html +24 -24
  327. package/app/packages/human-resources/index.html +24 -24
  328. package/app/packages/images/index.html +24 -24
  329. package/app/packages/index.html +24 -24
  330. package/app/packages/ingestion/index.html +24 -24
  331. package/app/packages/inventory/index.html +24 -24
  332. package/app/packages/ledgers/index.html +24 -24
  333. package/app/packages/manufacturing/index.html +24 -24
  334. package/app/packages/marketing/index.html +24 -24
  335. package/app/packages/messages/index.html +24 -24
  336. package/app/packages/places/index.html +24 -24
  337. package/app/packages/preferences/index.html +24 -24
  338. package/app/packages/products/index.html +24 -24
  339. package/app/packages/profiles/index.html +24 -24
  340. package/app/packages/projects/index.html +24 -24
  341. package/app/packages/properties/index.html +24 -24
  342. package/app/packages/reports/index.html +24 -24
  343. package/app/packages/sales/index.html +24 -24
  344. package/app/packages/sites/index.html +24 -24
  345. package/app/packages/social/index.html +24 -24
  346. package/app/packages/subscriptions/index.html +24 -24
  347. package/app/packages/support/index.html +24 -24
  348. package/app/packages/tags/index.html +24 -24
  349. package/app/packages/timesheets/index.html +24 -24
  350. package/app/packages/users/index.html +24 -24
  351. package/app/packages/video/index.html +24 -24
  352. package/app/packages/voice/index.html +24 -24
  353. package/app/packages/webhooks/index.html +24 -24
  354. package/app/recipes/account-access/help/index.html +24 -24
  355. package/app/recipes/account-access/index.html +26 -26
  356. package/app/recipes/activity/help/index.html +24 -24
  357. package/app/recipes/activity/index.html +26 -26
  358. package/app/recipes/agreements/help/index.html +26 -26
  359. package/app/recipes/agreements/index.html +27 -27
  360. package/app/recipes/analytics.reports/help/index.html +24 -24
  361. package/app/recipes/analytics.reports/index.html +26 -26
  362. package/app/recipes/assets/help/index.html +24 -24
  363. package/app/recipes/assets/index.html +27 -27
  364. package/app/recipes/billing/help/index.html +26 -26
  365. package/app/recipes/billing/index.html +26 -26
  366. package/app/recipes/chat.assistant/help/index.html +24 -24
  367. package/app/recipes/chat.assistant/index.html +26 -26
  368. package/app/recipes/comments/help/index.html +24 -24
  369. package/app/recipes/comments/index.html +26 -26
  370. package/app/recipes/commerce.customers/help/index.html +24 -24
  371. package/app/recipes/commerce.customers/index.html +26 -26
  372. package/app/recipes/commerce.estimates/help/index.html +26 -26
  373. package/app/recipes/commerce.estimates/index.html +26 -26
  374. package/app/recipes/commerce.purchases/help/index.html +26 -26
  375. package/app/recipes/commerce.purchases/index.html +26 -26
  376. package/app/recipes/commerce.sales/help/index.html +26 -26
  377. package/app/recipes/commerce.sales/index.html +26 -26
  378. package/app/recipes/commerce.vendors/help/index.html +24 -24
  379. package/app/recipes/commerce.vendors/index.html +26 -26
  380. package/app/recipes/commerce.wholesale/help/index.html +26 -26
  381. package/app/recipes/commerce.wholesale/index.html +26 -26
  382. package/app/recipes/events.calendar/help/index.html +24 -24
  383. package/app/recipes/events.calendar/index.html +26 -26
  384. package/app/recipes/expenses.tracking/help/index.html +26 -26
  385. package/app/recipes/expenses.tracking/index.html +26 -26
  386. package/app/recipes/fields.form-customization/help/index.html +24 -24
  387. package/app/recipes/fields.form-customization/index.html +26 -26
  388. package/app/recipes/ingestion/help/index.html +24 -24
  389. package/app/recipes/ingestion/index.html +26 -26
  390. package/app/recipes/integrations/help/index.html +24 -24
  391. package/app/recipes/integrations/index.html +26 -26
  392. package/app/recipes/inventory.stock/help/index.html +24 -24
  393. package/app/recipes/inventory.stock/index.html +26 -26
  394. package/app/recipes/ledgers.bookkeeping/help/index.html +24 -24
  395. package/app/recipes/ledgers.bookkeeping/index.html +26 -26
  396. package/app/recipes/messages/help/index.html +24 -24
  397. package/app/recipes/messages/index.html +26 -26
  398. package/app/recipes/products/help/index.html +24 -24
  399. package/app/recipes/products/index.html +26 -26
  400. package/app/recipes/projects.tracker/help/index.html +24 -24
  401. package/app/recipes/projects.tracker/index.html +27 -27
  402. package/app/recipes/reports.materialized/help/index.html +26 -26
  403. package/app/recipes/reports.materialized/index.html +29 -29
  404. package/app/recipes/reports.runtime/help/index.html +24 -24
  405. package/app/recipes/reports.runtime/index.html +27 -27
  406. package/app/recipes/sales.pipeline/help/index.html +24 -24
  407. package/app/recipes/sales.pipeline/index.html +26 -26
  408. package/app/recipes/tags.taxonomy/help/index.html +24 -24
  409. package/app/recipes/tags.taxonomy/index.html +26 -26
  410. package/app/recipes/team-collaboration/help/index.html +24 -24
  411. package/app/recipes/team-collaboration/index.html +26 -26
  412. package/app/recipes/timesheets.time-entries/help/index.html +24 -24
  413. package/app/recipes/timesheets.time-entries/index.html +26 -26
  414. package/app/s/custom-accounts/index.html +22 -22
  415. package/app/s/custom-appointments/index.html +22 -22
  416. package/app/s/custom-billing/index.html +22 -22
  417. package/app/s/custom-buying/index.html +22 -22
  418. package/app/s/custom-checkout/index.html +22 -22
  419. package/app/s/custom-classes/index.html +22 -22
  420. package/app/s/custom-clients/index.html +22 -22
  421. package/app/s/custom-events/index.html +22 -22
  422. package/app/s/custom-fleet/index.html +22 -22
  423. package/app/s/custom-giving/index.html +22 -22
  424. package/app/s/custom-jobs/index.html +22 -22
  425. package/app/s/custom-kitchen/index.html +22 -22
  426. package/app/s/custom-material/index.html +22 -22
  427. package/app/s/custom-meetings/index.html +22 -22
  428. package/app/s/custom-members/index.html +22 -22
  429. package/app/s/custom-paint/index.html +82 -0
  430. package/app/s/custom-parts/index.html +22 -22
  431. package/app/s/custom-rentals/index.html +22 -22
  432. package/app/s/custom-roastery/index.html +22 -22
  433. package/app/s/custom-schedule/index.html +22 -22
  434. package/app/s/custom-shelf/index.html +22 -22
  435. package/app/s/custom-shop/index.html +22 -22
  436. package/app/s/custom-wholesale/index.html +22 -22
  437. package/app/s/custom-work/index.html +22 -22
  438. package/app/s/custom-yard/index.html +22 -22
  439. package/app/s/section-access-control/index.html +22 -22
  440. package/app/s/section-account-security/index.html +22 -22
  441. package/app/s/section-accounting/index.html +22 -22
  442. package/app/s/section-activity/index.html +22 -22
  443. package/app/s/section-agreements/index.html +22 -22
  444. package/app/s/section-analytics/index.html +22 -22
  445. package/app/s/section-assets/index.html +22 -22
  446. package/app/s/section-billing/index.html +22 -22
  447. package/app/s/section-calendar/index.html +22 -22
  448. package/app/s/section-catalog/index.html +22 -22
  449. package/app/s/section-chat.assistant/index.html +22 -22
  450. package/app/s/section-comments/index.html +22 -22
  451. package/app/s/section-fields.form-customization/index.html +22 -22
  452. package/app/s/section-ingestion/index.html +22 -22
  453. package/app/s/section-integrations/index.html +22 -22
  454. package/app/s/section-messages/index.html +22 -22
  455. package/app/s/section-more/index.html +22 -22
  456. package/app/s/section-operations/index.html +22 -22
  457. package/app/s/section-projects/index.html +22 -22
  458. package/app/s/section-purchasing/index.html +22 -22
  459. package/app/s/section-reports.materialized/index.html +22 -22
  460. package/app/s/section-reports.runtime/index.html +22 -22
  461. package/app/s/section-sales/index.html +22 -22
  462. package/app/s/section-taxonomy/index.html +22 -22
  463. package/app/s/section-team/index.html +22 -22
  464. package/app/s/section-work/index.html +22 -22
  465. package/dist/ai/instance.d.ts.map +1 -1
  466. package/dist/ai/instance.js +9 -1
  467. package/dist/assistant/change.d.ts +13 -3
  468. package/dist/assistant/change.d.ts.map +1 -1
  469. package/dist/assistant/change.js +18 -3
  470. package/dist/assistant/prompt.d.ts +6 -1
  471. package/dist/assistant/prompt.d.ts.map +1 -1
  472. package/dist/assistant/prompt.js +13 -1
  473. package/dist/assistant/session.svelte.d.ts +5 -0
  474. package/dist/assistant/session.svelte.d.ts.map +1 -1
  475. package/dist/assistant/session.svelte.js +1 -0
  476. package/dist/assistant/transport.d.ts +24 -1
  477. package/dist/assistant/transport.d.ts.map +1 -1
  478. package/dist/assistant/transport.js +57 -8
  479. package/dist/catalog/catalog.json +1366 -51
  480. package/dist/components/BrowserAssistant.svelte +0 -2
  481. package/dist/components/BrowserAssistant.svelte.d.ts.map +1 -1
  482. package/dist/components/CookbooksPanel.svelte +101 -21
  483. package/dist/components/CookbooksPanel.svelte.d.ts.map +1 -1
  484. package/dist/data/format.d.ts.map +1 -1
  485. package/dist/data/format.js +3 -0
  486. package/dist/data/money.d.ts +1 -1
  487. package/dist/data/money.js +2 -2
  488. package/dist/data/packs.d.ts +0 -1
  489. package/dist/data/packs.d.ts.map +1 -1
  490. package/dist/data/packs.js +835 -1
  491. package/dist/library/apply.d.ts +7 -3
  492. package/dist/library/apply.d.ts.map +1 -1
  493. package/dist/library/apply.js +19 -6
  494. package/dist/library/document.d.ts +9 -0
  495. package/dist/library/document.d.ts.map +1 -1
  496. package/dist/library/document.js +29 -0
  497. package/dist/library/icons.d.ts.map +1 -1
  498. package/dist/library/icons.js +15 -0
  499. package/dist/library/index.d.ts +4 -1
  500. package/dist/library/index.d.ts.map +1 -1
  501. package/dist/library/index.js +9 -2
  502. package/dist/library/library.json +919 -14
  503. package/dist/library/state.svelte.d.ts +5 -1
  504. package/dist/library/state.svelte.d.ts.map +1 -1
  505. package/dist/library/state.svelte.js +12 -1
  506. package/dist/library/view.svelte.d.ts +41 -0
  507. package/dist/library/view.svelte.d.ts.map +1 -0
  508. package/dist/library/view.svelte.js +67 -0
  509. package/dist/planner/Planner.svelte +79 -2
  510. package/dist/planner/Planner.svelte.d.ts.map +1 -1
  511. package/dist/planner/PlannerControls.svelte +21 -2
  512. package/dist/planner/PlannerControls.svelte.d.ts.map +1 -1
  513. package/dist/planner/assistant.d.ts.map +1 -1
  514. package/dist/planner/assistant.js +9 -0
  515. package/dist/planner/commands/adapter.d.ts.map +1 -1
  516. package/dist/planner/commands/adapter.js +10 -3
  517. package/dist/planner/commands/controller.svelte.d.ts.map +1 -1
  518. package/dist/planner/commands/controller.svelte.js +2 -1
  519. package/dist/recipes/scope.d.ts +23 -0
  520. package/dist/recipes/scope.d.ts.map +1 -1
  521. package/dist/recipes/scope.js +20 -0
  522. package/dist/smrt-version.d.ts +1 -1
  523. package/dist/smrt-version.js +1 -1
  524. package/package.json +56 -56
  525. package/app/_app/immutable/assets/2.Djk1H2wk.css +0 -1
  526. package/app/_app/immutable/chunks/BV_A2GBw.js +0 -24
  527. package/app/_app/immutable/chunks/CbCYY1ps.js +0 -1
  528. package/app/_app/immutable/chunks/DD4mX3od.js +0 -1
  529. package/app/_app/immutable/chunks/DgkBKeKW.js +0 -4
  530. package/app/_app/immutable/chunks/DvUWb_GS.js +0 -1
  531. package/app/_app/immutable/chunks/M81UeXT1.js +0 -1
  532. package/app/_app/immutable/chunks/g7M7feZg.js +0 -1
  533. package/app/_app/immutable/chunks/r7IFcw-O.js +0 -1
  534. package/app/_app/immutable/entry/start.BixveMT0.js +0 -1
  535. package/app/_app/immutable/nodes/0._WFh95JB.js +0 -9
  536. package/app/_app/immutable/nodes/2.D3Lg90Nn.js +0 -24
  537. /package/app/_app/immutable/chunks/{DVQPWAnI.js → Bv5jGtB8.js} +0 -0
@@ -1 +1 @@
1
- import{$ as e,Ct as t,Dt as n,Ot as r,a as i}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{n as a}from"./DVQPWAnI.js";import{t as o}from"./CUyVrfsu.js";function s(s,c){r(c,!0);let l=i(c,`dismissible`,3,!1),u=i(c,`class`,3,``),d=o(),f=t(()=>d.isAILoading),p=t(()=>d.aiLoading),m=t(()=>c.show??e(f));function h(e){switch(e){case`checking`:return`Checking AI capabilities...`;case`downloading`:return`Downloading AI models...`;case`initializing`:return`Initializing AI...`;case`ready`:return`AI Ready`;case`error`:return`Error loading AI`;default:return`Loading...`}}let g=t(()=>c.message??h(e(p).phase)),_=t(()=>e(p).overallProgress),v=t(()=>e(p).loaded),y=t(()=>e(p).error);a(s,{get show(){return e(m)},get message(){return e(g)},get progress(){return e(_)},get items(){return e(v)},get error(){return e(y)},get dismissible(){return l()},get class(){return u()},get ondismiss(){return c.ondismiss}}),n()}export{s as default};
1
+ import{$ as e,Ct as t,Dt as n,Ot as r,a as i}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{n as a}from"./Bv5jGtB8.js";import{t as o}from"./CUyVrfsu.js";function s(s,c){r(c,!0);let l=i(c,`dismissible`,3,!1),u=i(c,`class`,3,``),d=o(),f=t(()=>d.isAILoading),p=t(()=>d.aiLoading),m=t(()=>c.show??e(f));function h(e){switch(e){case`checking`:return`Checking AI capabilities...`;case`downloading`:return`Downloading AI models...`;case`initializing`:return`Initializing AI...`;case`ready`:return`AI Ready`;case`error`:return`Error loading AI`;default:return`Loading...`}}let g=t(()=>c.message??h(e(p).phase)),_=t(()=>e(p).overallProgress),v=t(()=>e(p).loaded),y=t(()=>e(p).error);a(s,{get show(){return e(m)},get message(){return e(g)},get progress(){return e(_)},get items(){return e(v)},get error(){return e(y)},get dismissible(){return l()},get class(){return u()},get ondismiss(){return c.ondismiss}}),n()}export{s as default};
@@ -1,2 +1,2 @@
1
- import{$ as e,B as t,Ct as n,Dt as r,Ft as i,G as a,H as o,L as s,Ot as c,Pt as l,U as u,ft as d,ht as f,mt as p,pt as m,st as h}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{yt as g}from"./rkUL-DlL.js";var _=a(`<li><code class="svelte-kxkftj"><b> </b> </code></li>`),v=a(`<li class="none svelte-kxkftj">None</li>`),y=a(`<li><code class="svelte-kxkftj"> </code></li>`),b=a(`<mark class="svelte-kxkftj">AI</mark>`),x=a(`<li><code class="svelte-kxkftj"> </code> <!></li>`),S=a(`<article class="svelte-kxkftj"><h3 class="svelte-kxkftj"> </h3> <div class="grid svelte-kxkftj"><div><h4 class="svelte-kxkftj">REST routes <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">MCP tools <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">CLI commands <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">Methods <span class="svelte-kxkftj"> </span> AI-callable</h4> <ul class="svelte-kxkftj"></ul></div></div></article>`),C=a(`<p class="svelte-kxkftj">This app exposes no generated REST, MCP or CLI surface.</p>`),w=a(`<p class="lede svelte-kxkftj">For connecting other software or an AI assistant to this app. All of it is
1
+ import{$ as e,B as t,Ct as n,Dt as r,Ft as i,G as a,H as o,L as s,Ot as c,Pt as l,U as u,ft as d,ht as f,mt as p,pt as m,st as h}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{yt as g}from"./BG9Gz_25.js";var _=a(`<li><code class="svelte-kxkftj"><b> </b> </code></li>`),v=a(`<li class="none svelte-kxkftj">None</li>`),y=a(`<li><code class="svelte-kxkftj"> </code></li>`),b=a(`<mark class="svelte-kxkftj">AI</mark>`),x=a(`<li><code class="svelte-kxkftj"> </code> <!></li>`),S=a(`<article class="svelte-kxkftj"><h3 class="svelte-kxkftj"> </h3> <div class="grid svelte-kxkftj"><div><h4 class="svelte-kxkftj">REST routes <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">MCP tools <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">CLI commands <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">Methods <span class="svelte-kxkftj"> </span> AI-callable</h4> <ul class="svelte-kxkftj"></ul></div></div></article>`),C=a(`<p class="svelte-kxkftj">This app exposes no generated REST, MCP or CLI surface.</p>`),w=a(`<p class="lede svelte-kxkftj">For connecting other software or an AI assistant to this app. All of it is
2
2
  generated by s-m-r-t from the model; none of it was written by hand.</p> <!>`,1),T=a(`<section class="panel svelte-kxkftj" aria-label="Connect other tools"><!></section>`);function E(a,E){c(E,!0);let D=n(()=>E.models.filter(e=>e.exposed));var O=T(),k=d(O);g(k,{title:`Connect other tools`,children:(n,r)=>{var a=w(),c=f(m(a),2);s(c,17,()=>e(D),e=>e.id,(n,r)=>{var a=S(),c=d(a),m=p(c,!0),g=f(c,2),C=d(g),w=d(C),T=f(d(w)),E=p(T,!0);i(w);var D=f(w,2);s(D,21,()=>e(r).rest,e=>e.method+e.path,(t,n)=>{var r=_(),a=d(r),s=d(a),c=p(s,!0),l=f(s);i(a),i(r),h(()=>{o(c,e(n).method),o(l,` /api${e(n).path??``}`)}),u(t,r)},e=>{var t=v();u(e,t)}),i(D),i(C);var O=f(C,2),k=d(O),A=f(d(k)),j=p(A,!0);i(k);var M=f(k,2);s(M,21,()=>e(r).mcp,e=>e.name,(t,n)=>{var r=y(),a=d(r),s=p(a,!0);i(r),h(()=>o(s,e(n).name)),u(t,r)},e=>{var t=v();u(e,t)}),i(M),i(O);var N=f(O,2),P=d(N),F=f(d(P)),I=p(F,!0);i(P);var L=f(P,2);s(L,21,()=>e(r).cli,e=>e.name,(t,n)=>{var r=y(),a=d(r),s=p(a,!0);i(r),h(()=>o(s,e(n).name)),u(t,r)},e=>{var t=v();u(e,t)}),i(L),i(N);var R=f(N,2),z=d(R),B=f(d(z)),V=p(B,!0);l(),i(z);var H=f(z,2);s(H,21,()=>e(r).methods,e=>e.name,(n,r)=>{var a=x(),s=d(a),c=p(s),l=f(s,2),m=e=>{var t=b();u(e,t)};t(l,t=>{e(r).aiCallable&&t(m)}),i(a),h(t=>o(c,`${e(r).name??``}(${t??``})`),[()=>e(r).parameters.join(`, `)]),u(n,a)},e=>{var t=v();u(e,t)}),i(H),i(R),i(g),i(a),h(t=>{o(m,e(r).name),o(E,e(r).rest.length),o(j,e(r).mcp.length),o(I,e(r).cli.length),o(V,t)},[()=>e(r).methods.filter(e=>e.aiCallable).length]),u(n,a)},e=>{var t=C();u(e,t)}),u(n,a)},$$slots:{default:!0}}),i(O),u(a,O),r()}export{E as t};
@@ -1 +1 @@
1
- import{$ as e,B as t,Ct as n,Dt as r,E as i,Ft as a,G as o,H as s,J as c,L as l,Ot as u,Pt as d,U as f,W as p,Y as m,a as h,bt as ee,d as g,ft as _,ht as v,mt as y,n as b,nt as te,o as x,pt as S,q as C,r as w,st as T,tt as ne,v as E,vt as re}from"./DG3qFFTE.js";import"./xihTtKlq.js";import"./DVQPWAnI.js";import{t as ie}from"./YUSKx8_q.js";import"./rkUL-DlL.js";import{n as D}from"./DK8Blf1Y.js";import{d as ae,f as oe,g as O,v as k}from"./DsY7g8iJ.js";import{t as se}from"./M-CuJzQN.js";import{o as A,u as j}from"./9pRTae44.js";import{i as M}from"./gMSmS-_y.js";var N=new Set([`$$slots`,`$$events`,`$$legacy`]);function P(e,t){u(t,!0);let n=k(),i=x(t,N),a=null;w(()=>{a=n.registerFocusTool(i)}),b(()=>{a?.()}),r()}var ce=o(`<!> <!>`,1),le=o(`<span class="smrt-shell-layout-editor__muted svelte-xzk327"> </span>`),ue=o(`<div class="smrt-shell-layout-editor__row svelte-xzk327"><!></div>`),de=o(`<strong> </strong>`),fe=o(`<!> <!> <!> <!>`,1),F=o(`<span> </span> <!>`,1),I=o(`<div class="smrt-shell-layout-editor__preview"><h3 class="svelte-xzk327"> </h3> <div class="smrt-shell-layout-editor__preview-frame svelte-xzk327" role="group" inert=""><!></div></div>`),L=o(`<section class="smrt-shell-layout-editor svelte-xzk327" data-smrt-component="ShellLayoutEditor"><header class="svelte-xzk327"><div><h2 class="svelte-xzk327"> </h2> <p class="svelte-xzk327"> </p></div> <!></header> <fieldset class="smrt-shell-layout-editor__panels svelte-xzk327"><legend class="svelte-xzk327"> </legend> <!></fieldset> <div class="smrt-shell-layout-editor__body svelte-xzk327"><div class="smrt-shell-layout-editor__nav"><div class="smrt-shell-layout-editor__nav-head svelte-xzk327"><h3 class="svelte-xzk327"> </h3> <!></div> <!></div> <!></div></section>`);function R(o,m){let b=C();u(m,!0);let x=h(m,`preview`,3,!0),{t:w}=ie(),k=te(()=>m.controller??j()),N=`${b}-heading`,P=n(()=>k.sections),R=n(()=>k.panels),z=n(()=>k.applied),B=n(()=>e(P).map(e=>({id:e.id,label:e.heading??w(O[`ui.shell_layout_editor.top_level`]),fixed:e.group===null,root:e.group===null,hidden:e.hidden,custom:e.custom,titleVisible:e.titleVisible,count:e.items.length}))),V=n(()=>e(P).flatMap(e=>e.items.map(t=>({id:t.id,containerId:e.id,label:t.label}))));function H(e,t){t?k.show(e):k.hide(e)}let U=ee(void 0);function pe(t,n){let r=n.currentTarget;k.renameSection(t,r.value),r.value=e(B).find(e=>e.id===t)?.label??``}async function me(){let t=k.createSection(w(O[`ui.shell_layout_editor.new_section_label`]));if(!t)return;await ne();let n=e(U)?.querySelector(`input[data-section-name="${CSS.escape(t)}"]`);n?.focus(),n?.select()}function he(e,t,n){n>0&&!globalThis.confirm?.(w(O[`ui.shell_layout_editor.delete_confirm`],{label:t}))||k.deleteSection(e)}function ge(e){k.moveItem(e.item.id,e.target.containerId,e.target.index)}function _e(e){k.moveSection(e.container.id,e.target)}var W=L(),G=_(W),K=_(G),q=_(K),ve=y(q,!0),ye=v(q,2),be=y(ye,!0);a(K);var xe=v(K,2);{let t=n(()=>!k.customized);D(xe,{variant:`secondary`,size:`sm`,get disabled(){return e(t)},onclick:()=>k.reset(),children:(e,t)=>{d();var n=c();T(e=>s(n,e),[()=>w(O[`ui.shell_layout_editor.reset`])]),f(e,n)},$$slots:{default:!0}})}a(G);var J=v(G,2),Y=_(J),Se=y(Y,!0),Ce=v(Y,2);l(Ce,17,()=>e(R),e=>e.edge,(r,i)=>{var o=ue(),c=_(o),l=t=>{var r=ce(),a=S(r);{let t=n(()=>w(O[`ui.shell_layout_editor.show_panel`],{panel:e(i).label}));M(a,{interaction:!1,get checked(){return e(i).visible},get label(){return e(t)},onchange:t=>k.setPanel(e(i).edge,{visible:t.currentTarget.checked})})}var o=v(a,2);{let t=n(()=>e(i).initial===`expanded`),r=n(()=>!e(i).visible),a=n(()=>w(O[`ui.shell_layout_editor.start_expanded`],{panel:e(i).label}));M(o,{interaction:!1,get checked(){return e(t)},get disabled(){return e(r)},get label(){return e(a)},onchange:t=>k.setPanel(e(i).edge,{initial:t.currentTarget.checked?`expanded`:`collapsed`})})}f(t,r)},u=t=>{var n=le(),r=y(n,!0);T(e=>s(r,e),[()=>w(O[`ui.shell_layout_editor.panel_unavailable`],{panel:e(i).label})]),f(t,n)};t(c,t=>{e(i).available?t(l):t(u,-1)}),a(o),T(()=>E(o,`data-edge`,e(i).edge)),f(r,o)}),a(J);var X=v(J,2),Z=_(X),Q=_(Z),$=_(Q),we=y($,!0),Te=v($,2);D(Te,{variant:`secondary`,size:`sm`,onclick:me,children:(e,t)=>{d();var n=c();T(e=>s(n,e),[()=>w(O[`ui.shell_layout_editor.new_section`])]),f(e,n)},$$slots:{default:!0}}),a(Q);var Ee=v(Q,2);{let r=(r,i)=>{let a=()=>(i?.()).container,o=n(()=>e(B).find(e=>e.id===a().id));var c=p(),l=S(c),u=e=>{var t=de(),n=y(t,!0);T(()=>s(n,a().label)),f(e,t)},d=r=>{var i=fe(),s=S(i);{let t=n(()=>w(O[`ui.shell_layout_editor.section_name`],{label:a().label}));se(s,{class:`smrt-shell-layout-editor__name`,interaction:!1,get"data-section-name"(){return a().id},get"aria-label"(){return e(t)},get value(){return a().label},onchange:e=>pe(a().id,e)})}var c=v(s,2);{let t=n(()=>e(o)?.hidden?`eyeOff`:`eye`),r=n(()=>!e(o)?.hidden),i=n(()=>w(O[`ui.shell_layout_editor.show_entry`],{label:a().label}));A(c,{get icon(){return e(t)},get pressed(){return e(r)},get label(){return e(i)},onclick:()=>H(a().id,!!e(o)?.hidden)})}var l=v(c,2);{let t=n(()=>e(o)?.titleVisible===!1?`headingOff`:`heading`),r=n(()=>e(o)?.titleVisible??!0),i=n(()=>w(O[`ui.shell_layout_editor.show_title_for`],{label:a().label}));A(l,{get icon(){return e(t)},get pressed(){return e(r)},get label(){return e(i)},onclick:()=>k.setSectionTitleVisible(a().id,!(e(o)?.titleVisible??!0))})}var u=v(l,2),d=t=>{{let r=n(()=>w(O[`ui.shell_layout_editor.delete_section`],{label:a().label}));A(t,{icon:`trash`,get label(){return e(r)},onclick:()=>he(a().id,a().label,e(o).count)})}};t(u,t=>{e(o)?.custom&&t(d)}),f(r,i)};t(l,t=>{e(o)?.root?t(u):t(d,-1)}),f(r,c)},a=(t,r)=>{let a=()=>(r?.()).item,o=()=>(r?.()).container,c=n(()=>k.isHidden(a().id));var l=F(),u=S(l);let d;var p=y(u,!0),m=v(u,2);{let t=n(()=>e(c)?`eyeOff`:`eye`),r=n(()=>!e(c)),i=n(()=>w(O[`ui.shell_layout_editor.show_entry`],{label:a().label}));A(m,{get icon(){return e(t)},get pressed(){return e(r)},get label(){return e(i)},onclick:()=>H(a().id,e(c))})}T(e=>{d=i(u,1,`smrt-shell-layout-editor__label svelte-xzk327`,null,d,{"smrt-shell-layout-editor__muted":e}),s(p,a().label)},[()=>e(c)||k.isHidden(o().id)]),f(t,l)},o=n(()=>w(O[`ui.shell_layout_editor.sortable_label`]));oe(Ee,{get containers(){return e(B)},get items(){return e(V)},get label(){return e(o)},reorderContainers:!0,onmove:ge,oncontainermove:_e,containerHeader:r,item:a,$$slots:{containerHeader:!0,item:!0}})}a(Z);var De=v(Z,2),Oe=t=>{var r=I(),i=_(r),o=y(i,!0),c=v(i,2),l=_(c);{let t=n(()=>w(O[`ui.shell_layout_editor.preview_label`]));ae(l,{get items(){return e(z).nav},get groups(){return e(z).groups},get iconComponent(){return m.iconComponent},get"aria-label"(){return e(t)}})}a(c),a(r),T((e,t)=>{s(o,e),E(c,`aria-label`,t)},[()=>w(O[`ui.shell_layout_editor.preview`]),()=>w(O[`ui.shell_layout_editor.preview_label`])]),f(t,r)};t(De,e=>{x()&&e(Oe)}),a(X),a(W),g(W,e=>re(U,e),()=>e(U)),T((e,t,n,r)=>{E(W,`aria-labelledby`,N),E(q,`id`,N),s(ve,e),s(be,t),s(Se,n),s(we,r)},[()=>w(O[`ui.shell_layout_editor.heading`]),()=>w(O[`ui.shell_layout_editor.description`]),()=>w(O[`ui.shell_layout_editor.panels`]),()=>w(O[`ui.shell_layout_editor.navigation`])]),f(o,W),r()}m([`click`]);export{P as n,R as t};
1
+ import{$ as e,B as t,Ct as n,Dt as r,E as i,Ft as a,G as o,H as s,J as c,L as l,Ot as u,Pt as d,U as f,W as p,Y as m,a as h,bt as ee,d as g,ft as _,ht as v,mt as y,n as b,nt as te,o as x,pt as S,q as C,r as w,st as T,tt as ne,v as E,vt as re}from"./DG3qFFTE.js";import"./xihTtKlq.js";import"./Bv5jGtB8.js";import{t as ie}from"./YUSKx8_q.js";import"./BG9Gz_25.js";import{n as D}from"./DK8Blf1Y.js";import{_ as O,f as ae,p as oe,y as k}from"./Bsn3IIve.js";import{t as se}from"./M-CuJzQN.js";import{o as A,u as j}from"./9pRTae44.js";import{i as M}from"./gMSmS-_y.js";var N=new Set([`$$slots`,`$$events`,`$$legacy`]);function P(e,t){u(t,!0);let n=k(),i=x(t,N),a=null;w(()=>{a=n.registerFocusTool(i)}),b(()=>{a?.()}),r()}var ce=o(`<!> <!>`,1),le=o(`<span class="smrt-shell-layout-editor__muted svelte-xzk327"> </span>`),ue=o(`<div class="smrt-shell-layout-editor__row svelte-xzk327"><!></div>`),de=o(`<strong> </strong>`),fe=o(`<!> <!> <!> <!>`,1),F=o(`<span> </span> <!>`,1),I=o(`<div class="smrt-shell-layout-editor__preview"><h3 class="svelte-xzk327"> </h3> <div class="smrt-shell-layout-editor__preview-frame svelte-xzk327" role="group" inert=""><!></div></div>`),L=o(`<section class="smrt-shell-layout-editor svelte-xzk327" data-smrt-component="ShellLayoutEditor"><header class="svelte-xzk327"><div><h2 class="svelte-xzk327"> </h2> <p class="svelte-xzk327"> </p></div> <!></header> <fieldset class="smrt-shell-layout-editor__panels svelte-xzk327"><legend class="svelte-xzk327"> </legend> <!></fieldset> <div class="smrt-shell-layout-editor__body svelte-xzk327"><div class="smrt-shell-layout-editor__nav"><div class="smrt-shell-layout-editor__nav-head svelte-xzk327"><h3 class="svelte-xzk327"> </h3> <!></div> <!></div> <!></div></section>`);function R(o,m){let b=C();u(m,!0);let x=h(m,`preview`,3,!0),{t:w}=ie(),k=te(()=>m.controller??j()),N=`${b}-heading`,P=n(()=>k.sections),R=n(()=>k.panels),z=n(()=>k.applied),B=n(()=>e(P).map(e=>({id:e.id,label:e.heading??w(O[`ui.shell_layout_editor.top_level`]),fixed:e.group===null,root:e.group===null,hidden:e.hidden,custom:e.custom,titleVisible:e.titleVisible,count:e.items.length}))),V=n(()=>e(P).flatMap(e=>e.items.map(t=>({id:t.id,containerId:e.id,label:t.label}))));function H(e,t){t?k.show(e):k.hide(e)}let U=ee(void 0);function pe(t,n){let r=n.currentTarget;k.renameSection(t,r.value),r.value=e(B).find(e=>e.id===t)?.label??``}async function me(){let t=k.createSection(w(O[`ui.shell_layout_editor.new_section_label`]));if(!t)return;await ne();let n=e(U)?.querySelector(`input[data-section-name="${CSS.escape(t)}"]`);n?.focus(),n?.select()}function he(e,t,n){n>0&&!globalThis.confirm?.(w(O[`ui.shell_layout_editor.delete_confirm`],{label:t}))||k.deleteSection(e)}function ge(e){k.moveItem(e.item.id,e.target.containerId,e.target.index)}function _e(e){k.moveSection(e.container.id,e.target)}var W=L(),G=_(W),K=_(G),q=_(K),ve=y(q,!0),ye=v(q,2),be=y(ye,!0);a(K);var xe=v(K,2);{let t=n(()=>!k.customized);D(xe,{variant:`secondary`,size:`sm`,get disabled(){return e(t)},onclick:()=>k.reset(),children:(e,t)=>{d();var n=c();T(e=>s(n,e),[()=>w(O[`ui.shell_layout_editor.reset`])]),f(e,n)},$$slots:{default:!0}})}a(G);var J=v(G,2),Y=_(J),Se=y(Y,!0),Ce=v(Y,2);l(Ce,17,()=>e(R),e=>e.edge,(r,i)=>{var o=ue(),c=_(o),l=t=>{var r=ce(),a=S(r);{let t=n(()=>w(O[`ui.shell_layout_editor.show_panel`],{panel:e(i).label}));M(a,{interaction:!1,get checked(){return e(i).visible},get label(){return e(t)},onchange:t=>k.setPanel(e(i).edge,{visible:t.currentTarget.checked})})}var o=v(a,2);{let t=n(()=>e(i).initial===`expanded`),r=n(()=>!e(i).visible),a=n(()=>w(O[`ui.shell_layout_editor.start_expanded`],{panel:e(i).label}));M(o,{interaction:!1,get checked(){return e(t)},get disabled(){return e(r)},get label(){return e(a)},onchange:t=>k.setPanel(e(i).edge,{initial:t.currentTarget.checked?`expanded`:`collapsed`})})}f(t,r)},u=t=>{var n=le(),r=y(n,!0);T(e=>s(r,e),[()=>w(O[`ui.shell_layout_editor.panel_unavailable`],{panel:e(i).label})]),f(t,n)};t(c,t=>{e(i).available?t(l):t(u,-1)}),a(o),T(()=>E(o,`data-edge`,e(i).edge)),f(r,o)}),a(J);var X=v(J,2),Z=_(X),Q=_(Z),$=_(Q),we=y($,!0),Te=v($,2);D(Te,{variant:`secondary`,size:`sm`,onclick:me,children:(e,t)=>{d();var n=c();T(e=>s(n,e),[()=>w(O[`ui.shell_layout_editor.new_section`])]),f(e,n)},$$slots:{default:!0}}),a(Q);var Ee=v(Q,2);{let r=(r,i)=>{let a=()=>(i?.()).container,o=n(()=>e(B).find(e=>e.id===a().id));var c=p(),l=S(c),u=e=>{var t=de(),n=y(t,!0);T(()=>s(n,a().label)),f(e,t)},d=r=>{var i=fe(),s=S(i);{let t=n(()=>w(O[`ui.shell_layout_editor.section_name`],{label:a().label}));se(s,{class:`smrt-shell-layout-editor__name`,interaction:!1,get"data-section-name"(){return a().id},get"aria-label"(){return e(t)},get value(){return a().label},onchange:e=>pe(a().id,e)})}var c=v(s,2);{let t=n(()=>e(o)?.hidden?`eyeOff`:`eye`),r=n(()=>!e(o)?.hidden),i=n(()=>w(O[`ui.shell_layout_editor.show_entry`],{label:a().label}));A(c,{get icon(){return e(t)},get pressed(){return e(r)},get label(){return e(i)},onclick:()=>H(a().id,!!e(o)?.hidden)})}var l=v(c,2);{let t=n(()=>e(o)?.titleVisible===!1?`headingOff`:`heading`),r=n(()=>e(o)?.titleVisible??!0),i=n(()=>w(O[`ui.shell_layout_editor.show_title_for`],{label:a().label}));A(l,{get icon(){return e(t)},get pressed(){return e(r)},get label(){return e(i)},onclick:()=>k.setSectionTitleVisible(a().id,!(e(o)?.titleVisible??!0))})}var u=v(l,2),d=t=>{{let r=n(()=>w(O[`ui.shell_layout_editor.delete_section`],{label:a().label}));A(t,{icon:`trash`,get label(){return e(r)},onclick:()=>he(a().id,a().label,e(o).count)})}};t(u,t=>{e(o)?.custom&&t(d)}),f(r,i)};t(l,t=>{e(o)?.root?t(u):t(d,-1)}),f(r,c)},a=(t,r)=>{let a=()=>(r?.()).item,o=()=>(r?.()).container,c=n(()=>k.isHidden(a().id));var l=F(),u=S(l);let d;var p=y(u,!0),m=v(u,2);{let t=n(()=>e(c)?`eyeOff`:`eye`),r=n(()=>!e(c)),i=n(()=>w(O[`ui.shell_layout_editor.show_entry`],{label:a().label}));A(m,{get icon(){return e(t)},get pressed(){return e(r)},get label(){return e(i)},onclick:()=>H(a().id,e(c))})}T(e=>{d=i(u,1,`smrt-shell-layout-editor__label svelte-xzk327`,null,d,{"smrt-shell-layout-editor__muted":e}),s(p,a().label)},[()=>e(c)||k.isHidden(o().id)]),f(t,l)},o=n(()=>w(O[`ui.shell_layout_editor.sortable_label`]));oe(Ee,{get containers(){return e(B)},get items(){return e(V)},get label(){return e(o)},reorderContainers:!0,onmove:ge,oncontainermove:_e,containerHeader:r,item:a,$$slots:{containerHeader:!0,item:!0}})}a(Z);var De=v(Z,2),Oe=t=>{var r=I(),i=_(r),o=y(i,!0),c=v(i,2),l=_(c);{let t=n(()=>w(O[`ui.shell_layout_editor.preview_label`]));ae(l,{get items(){return e(z).nav},get groups(){return e(z).groups},get iconComponent(){return m.iconComponent},get"aria-label"(){return e(t)}})}a(c),a(r),T((e,t)=>{s(o,e),E(c,`aria-label`,t)},[()=>w(O[`ui.shell_layout_editor.preview`]),()=>w(O[`ui.shell_layout_editor.preview_label`])]),f(t,r)};t(De,e=>{x()&&e(Oe)}),a(X),a(W),g(W,e=>re(U,e),()=>e(U)),T((e,t,n,r)=>{E(W,`aria-labelledby`,N),E(q,`id`,N),s(ve,e),s(be,t),s(Se,n),s(we,r)},[()=>w(O[`ui.shell_layout_editor.heading`]),()=>w(O[`ui.shell_layout_editor.description`]),()=>w(O[`ui.shell_layout_editor.panels`]),()=>w(O[`ui.shell_layout_editor.navigation`])]),f(o,W),r()}m([`click`]);export{P as n,R as t};
@@ -1,4 +1,4 @@
1
- import{$ as e,B as t,Ct as n,D as r,Dt as i,E as a,Ft as o,G as s,H as c,J as l,L as u,Ot as d,Pt as f,U as p,W as m,X as h,Y as g,a as _,b as v,bt as y,ct as b,ft as x,ht as S,mt as C,pt as w,st as T,v as E,vt as D}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{n as O}from"./DK8Blf1Y.js";import{t as k}from"./M-CuJzQN.js";import{i as A,v as j,y as M}from"./gMSmS-_y.js";import{C as N,D as P,E as F,O as I,T as L,_ as R,i as z,k as B,n as V,r as ee,t as H,v as U,w as W}from"./BV_A2GBw.js";import{et as G}from"./U6_OBRq_.js";var te=s(`<p class="notice svelte-19u3zp7" role="status"> </p>`),K=s(`<option> </option>`),ne=s(`<label class="svelte-19u3zp7">Assistant mode <!></label> <p class="meta svelte-19u3zp7">Changing modes happens only when you choose it here.</p>`,1),re=s(`<p class="status svelte-19u3zp7">Inference off</p> <p class="meta svelte-19u3zp7">Build, edit, validate and export your cookbook without a model. No
1
+ import{$ as e,B as t,Ct as n,D as r,Dt as i,E as a,Ft as o,G as s,H as c,J as l,L as u,Ot as d,Pt as f,U as p,W as m,X as h,Y as g,a as _,b as v,bt as y,ct as b,ft as x,ht as S,mt as C,pt as w,st as T,v as E,vt as D}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{n as O}from"./DK8Blf1Y.js";import{t as k}from"./M-CuJzQN.js";import{i as A,v as j,y as M}from"./gMSmS-_y.js";import{C as N,D as P,E as F,O as I,T as L,_ as R,i as z,k as B,n as V,r as ee,t as H,v as U,w as W}from"./Cr4byQts.js";import{et as G}from"./CtjBwCj8.js";var te=s(`<p class="notice svelte-19u3zp7" role="status"> </p>`),K=s(`<option> </option>`),ne=s(`<label class="svelte-19u3zp7">Assistant mode <!></label> <p class="meta svelte-19u3zp7">Changing modes happens only when you choose it here.</p>`,1),re=s(`<p class="status svelte-19u3zp7">Inference off</p> <p class="meta svelte-19u3zp7">Build, edit, validate and export your cookbook without a model. No
2
2
  provider is contacted and no browser model is downloaded.</p>`,1),ie=s(`<p class="status svelte-19u3zp7">Server</p> <p class="meta svelte-19u3zp7">This site's server answers the assistant. What you type, and a short
3
3
  summary of your plan, is sent to it. Nothing is downloaded.</p>`,1),ae=s(`<p class="meta svelte-19u3zp7">A key is saved for another address, so it is not used here. Paste it again for this address.</p>`),oe=s(`<div class="field svelte-19u3zp7"><!> <!></div> <!> <p class="meta svelte-19u3zp7"> <button class="link svelte-19u3zp7" type="button">Forget the key</button></p>`,1),se=s(`<p class="meta svelte-19u3zp7"><strong>Browser access.</strong> </p>`),ce=s(`<p> </p>`),le=s(`<p class="status svelte-19u3zp7" role="status"> </p>`),ue=s(`<label class="svelte-19u3zp7">Model provider <!></label> <div class="field svelte-19u3zp7"><!> <!></div> <div class="field svelte-19u3zp7"><!> <!></div> <!> <!> <p class="meta svelte-19u3zp7">What you type, and a short summary of your plan, is sent to this
4
4
  endpoint.</p> <!> <!> <div class="actions svelte-19u3zp7"><!> <!></div>`,1),de=s(`<p role="status" class="svelte-19u3zp7">This browser has no WebGPU, which the model needs. Try a recent
@@ -0,0 +1 @@
1
+ import{$ as e,bt as t,tt as n,vt as r}from"./DG3qFFTE.js";import{F as i,N as a,P as o,at as ee,et as s,it as c,lt as l,w as u}from"./BG9Gz_25.js";import{h as d,r as f}from"./Bsn3IIve.js";import"./BhU_yBI_.js";import{F as p,I as m,N as h,P as g,c as te}from"./Cr4byQts.js";import{a as _,i as ne,n as re,o as v,r as y,s as b}from"./O8DAZ_le.js";import{B as x,N as S,R as C,U as w,b as T,j as E,t as D,v as O,x as k}from"./CtjBwCj8.js";import{n as A}from"./nphy1MQF.js";import{r as j,t as M}from"./C3sRGrYK.js";import{a as N,c as P,d as F,l as I,n as L}from"./CTlMHIE6.js";function ie(e,t=h.appliedWork){return m(e.snapshot(),t)}function R(e,t,n){let r=g(e,v,n);if(r.ok){let n=t.theme,a=r.cookbook.theme,o=a?a.colorScheme||!n?.colorScheme?void 0:{...a,colorScheme:n.colorScheme}:n;t.replace(r.cookbook),o&&(t.theme=o),i(e.id),h.select(e.id,p(t.snapshot()))}return r}function z(e,t){return e.document.recipes.every(e=>t.recipes.includes(e))&&e.document.features.every(e=>t.features.includes(e))}function B(e){let t=e.recipes.flatMap(e=>{let t=k.get(e);return t?[t]:[]}),n=C(t).map(e=>{let t=new Set,n=[];for(let r of e.recipes)for(let e of O(r)){let r=x(e.packageId,e.model.name,e.key);t.has(r)||(t.add(r),n.push({id:r,href:`#`,label:e.label,icon:e.icon,description:e.description}))}return{id:`section:${e.id}`,heading:e.label,items:n}}).filter(e=>e.items.length>0),r=S(e.features).map(e=>({id:e.id,href:`#`,label:e.label,icon:e.icon,description:e.description}));return r.length&&n.push({id:`section:${E.id}`,heading:E.label,items:r}),n}function V(e){let t=e.layout;return d([],B(e),void 0,t).groups.map(e=>({id:e.id??String(e.heading),label:e.heading??``,entries:e.items.map(e=>({id:e.id??e.href,label:t?.items?.[e.id??e.href]?.label?.trim()||e.label}))}))}var H={live:`Live`,mock:`Mock`,sample:`Sample`,server:`Server`},U={live:`Runs for real in your browser.`,mock:`Runs in your browser, but a provider is faked.`,sample:`Shows sample data only; it cannot reach what it needs.`,server:`Needs a server, which this browser-only demo does not have.`},W={live:`success`,mock:`info`,sample:`warning`,server:`default`};function G(e){return e.effectiveDemo??e.demo}function K(e){if(e)return{mode:e.mode,label:H[e.mode],meaning:U[e.mode],variant:W[e.mode],reasons:e.reasons,mocked:e.mocked??[]}}function q(e){if(!e)return;if(e.status===`browser-safe`)return`Its package builds for a browser.`;let t=[`Its package does not build for a browser yet`];return e.reason&&t.push(`(${e.reason})`),e.issues?.length&&t.push(`and is tracked in ${e.issues.join(`, `)}`),`${t.join(` `)}.`}var J=`@happyvertical/smrt-commerce:`,Y=`${J}TaxCode`,ae=`${J}TaxComponent`,X=`${J}TaxSettings`,oe=`${J}DocumentTax`;function Z(){let e=o()??.05;return{codes:c(e),fallback:s(e)}}function se(e){try{let t=e?.getItem(ne);if(!t)return;let n=b(t,{dropUnknownRecipes:!0});n.ok&&y(n.cookbook)}catch{}}function ce(){return se(_()),M({storage:_(),defaults:e=>D.apply(e).background,empty:[N,L,oe],samples:{[Y]:{from:[],make:()=>Z().codes.map(e=>({id:e.id,code:e.code,name:e.name,kind:e.kind,appliesTo:e.appliesTo,active:e.active,componentsJson:JSON.stringify(e.components.map(e=>({taxComponentId:e.id,compound:!1})))}))},[ae]:{from:[],make:()=>ee(Z().codes).map(e=>({id:e.id,name:e.name,percent:e.percent,liabilityAccountId:null,recoverable:e.recoverable,active:!0}))},[X]:{from:[],make:()=>{let{fallback:e}=Z(),t=a();return[{id:u(`${X}:sample`),defaultSalesTaxCodeId:e.id,defaultPurchaseTaxCodeId:e.id,defaultLineAmountType:t.pricesIncludeTax?`inclusive`:`exclusive`,taxRoundingScope:t.taxRounding}]}},...P(j),[I]:{from:[j(`@happyvertical/smrt-products:Product`)],make:([e])=>(e??[]).map((e,t)=>({id:u(`${I}:sample:${e.id}`),name:`${String(e.name??`Product`)} image`,sourceUri:`data:image/svg+xml,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240"><rect width="240" height="240" fill="hsl(${t*47%360} 40% 82%)"/><circle cx="120" cy="94" r="46" fill="hsl(${(t*47+30)%360} 35% 58%)"/><path d="M44 214c20-55 132-55 152 0" fill="hsl(${(t*47+10)%360} 30% 46%)"/><text x="120" y="224" text-anchor="middle" font-family="sans-serif" font-size="14" fill="white">${String(e.name??``).replace(/[<&>]/g,``)}</text></svg>`)}`,mimeType:`image/svg+xml`,description:`Sample image for ${String(e.name??`this product`)}.`,sourceType:`browser-demo`}))},[F]:{from:[j(`@happyvertical/smrt-products:Product`),j(I)],make:([e,t])=>(e??[]).flatMap((e,n)=>{let r=t?.[n];return r?[{id:u(`${F}:sample:${e.id}`),productId:e.id,assetId:r.id,relationship:`gallery`,sortOrder:0}]:[]})}},children:{models:l.packages.flatMap(e=>e.models),links:e=>w(l,T,e)}})}var le=new class{#e=t(void 0);get endpoint(){return e(this.#e)}set endpoint(e){r(this.#e,e,!0)}#t=t(!1);get tokenInConfig(){return e(this.#t)}set tokenInConfig(e){r(this.#t,e,!0)}#n=t(void 0);get token(){return e(this.#n)}set token(e){r(this.#n,e,!0)}#r=t(`idle`);get status(){return e(this.#r)}set status(e){r(this.#r,e,!0)}#i=t(void 0);get outcome(){return e(this.#i)}set outcome(e){r(this.#i,e,!0)}get config(){return this.endpoint&&this.token&&!this.tokenInConfig?{endpoint:this.endpoint,token:this.token}:void 0}get needsLink(){return!!this.endpoint&&!this.token&&!this.tokenInConfig}configure(e,t){this.endpoint=e?.endpoint,this.tokenInConfig=e?.tokenInConfig===!0,this.token=e?t:void 0,this.status=`idle`,this.outcome=void 0}async send(e,t){let n=this.config;if(!n||this.status===`sending`)return;this.status=`sending`,this.outcome=void 0;let r=await te(n,e,t);this.outcome=r,this.status=r.ok?`sent`:`failed`}},Q=`cookbook`,$=new class{#e=t(null);get open(){return e(this.#e)}set open(e){r(this.#e,e,!0)}#t=t(null);get returnTo(){return e(this.#t)}set returnTo(e){r(this.#t,e,!0)}navigator=null;show(e){this.returnTo=e,this.navigator?this.navigator.open(e):this.set(e)}back(){this.open&&(this.returnTo=this.open),this.navigator?this.navigator.close():this.set(null)}async set(e,t=!0){this.open!==e&&(t?await f(async()=>{this.open=e,await n()}):this.open=e)}};function ue(e,t){let n=new URLSearchParams(e).get(Q);return n&&t.includes(n)?n:null}function de(e,t){let n=new URLSearchParams(e);t?n.set(Q,t):n.delete(Q);let r=n.toString().replace(/%2C/gi,`,`);return r?`?${r}`:``}var fe=`Planner`;function pe(e,t,n=A,r=fe){let i=e.name?.trim();if(i)return i;let a=t?n.find(e=>e.id===t):void 0;return a&&z(a,e)?a.name:r}function me(e){return pe(re.snapshot(),h.active,void 0,e)}export{le as a,K as c,V as d,R as f,de as i,G as l,ie as m,ue as n,ce as o,z as p,$ as r,q as s,me as t,B as u};
@@ -1 +1 @@
1
- import{$ as e,Et as t,Mt as n,bt as r,vt as i}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{I as a,K as o,L as s,O as c,U as l,W as u,_ as d,dt as f,ft as p,h as m,lt as h,p as g,st as _,x as v}from"./rkUL-DlL.js";import{h as y}from"./DsY7g8iJ.js";import"./M-CuJzQN.js";import"./9pRTae44.js";import{u as b}from"./DD4mX3od.js";import{A as x,C as S,D as C,E as w,F as ee,M as T,N as te,S as ne,T as re,_ as ie,b as ae,d as oe,g as se,h as ce,j as le,n as ue,r as de,v as fe,w as pe,x as me,y as he}from"./DgkBKeKW.js";import{B as ge,G as _e,J as ve,R as ye,V as be,W as xe,X as Se,Y as Ce,a as we,b as E,c as Te,d as Ee,i as De,j as Oe,l as ke,n as Ae,o as je,q as Me,t as D,v as Ne,x as O,z as Pe}from"./U6_OBRq_.js";function Fe(e){let t=e.lastIndexOf(`#`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1);return n.startsWith(`.`)||n.startsWith(`/`)||/\s/.test(n)||!/^[A-Za-z_$][\w$]*$/.test(r)?null:{specifier:n,exportName:r}}function k(e,t){let n=Fe(e);return n?Promise.resolve(t(n.specifier,n.exportName)).then(t=>{if(t==null)throw Error(`export "${e}" was not found`);return t}):Promise.reject(Error(`invalid export ref "${e}"`))}function A(e){let t;return()=>(t??=e(),t)}function Ie(e){return typeof e==`object`&&!!e&&`default`in e&&!!e.default}function Le(e,t,n){let r=A(()=>k(e.export,t)),i=e.optionsEditor?A(()=>k(e.optionsEditor,t)):void 0,a=e.data?.load?A(()=>k(e.data?.load,t)):void 0,o={type:e.type,title:e.label,options:e.options??[],loadComponent:async()=>{let e=await r();return Ie(e)?e.default:e}};return e.description!==void 0&&(o.description=e.description),e.icon!==void 0&&(o.icon=e.icon),e.version!==void 0&&(o.version=e.version),e.allowedIn&&(o.allowedIn=e.allowedIn),e.defaultSpan!==void 0&&(o.defaultSpan=e.defaultSpan),e.minSpan!==void 0&&(o.minSpan=e.minSpan),e.maxSpan!==void 0&&(o.maxSpan=e.maxSpan),n&&(o.migrate=n),i&&(o.loadOptionsEditor=async()=>{let e=await i();return Ie(e)?e.default:e}),a&&(o.load=async(t,n)=>{let r=await a();if(typeof r!=`function`)throw Error(`loader "${e.data?.load}" is not a function`);return r(t,n)}),o}async function Re(e,t,n,r={}){let i=[],a=[],o=[];for(let s of t)if(!r.enabled||r.enabled(s.id))for(let t of s.surfaces??[]){if(t.kind!==`widget`)continue;let c=(e,n)=>a.push({recipeId:s.id,type:t.type,reason:e,message:n});if(e.has(t.type)&&!r.replace){c(`duplicate_type`,`"${t.type}" is already registered`);continue}let l;if(t.migrate)try{let e=await k(t.migrate,n);if(typeof e!=`function`)throw Error(`not a function`);l=e}catch(e){c(`unresolved`,`migrate "${t.migrate}": ${e instanceof Error?e.message:String(e)}`);continue}try{o.push(e.register(Le(t,n,l),{replace:r.replace})),i.push(t.type)}catch(e){c(`invalid`,e instanceof Error?e.message:String(e))}}return{registered:i,skipped:a,dispose:()=>{for(let e of o.splice(0))e()}}}var ze=[`identifier`,`status`,`date`,`party`,`total`,`money`];function Be(e){for(let t of[`identifier`,`status`,`date`,`money`,`quantity`,`party`,`title`])if(e.includes(t))return t}function Ve(e,t,n={}){let r=new Set(n.exclude??[]),i=n.max??4,a=Object.keys(t).filter(t=>!r.has(t)&&t in e.fields),o=e=>a.find(n=>t[n]?.includes(e)),s=[],c=e=>{e&&!s.includes(e)&&s.push(e)};c(o(`identifier`)??o(`title`));for(let e of ze)e!==`identifier`&&(e===`money`&&s.some(e=>t[e]?.includes(`money`))||c(e===`date`?a.find(e=>t[e]?.includes(`date`)&&e!==`createdAt`&&e!==`updatedAt`)??o(`date`):o(e)));return s.slice(0,i).map(n=>({key:n,label:j(n,e),...Be(t[n]??[])?{role:Be(t[n]??[])}:{}}))}function He(e,t,n={}){let r=new Set(n.exclude??[]),i=Object.keys(t).filter(t=>!r.has(t)&&t in e.fields),a=i.filter(t=>e.fields[t]?.type===`text`),o=a.find(e=>/^(?:description|title|name|label)$/.test(e))??a.find(e=>t[e]?.includes(`title`))??a.find(e=>!t[e]?.includes(`identifier`)),s=i.find(e=>t[e]?.includes(`quantity`)),c=i.filter(e=>t[e]?.includes(`money`)),l=c.find(e=>/unit|price|rate/i.test(e)),u=c.find(e=>/^(?:amount|lineTotal|total|lineAmount)$/.test(e))??[...c].reverse().find(e=>e!==l),d=[];return o&&d.push({key:o,label:j(o,e)}),s&&d.push({key:s,label:j(s,e),role:`quantity`}),l&&d.push({key:l,label:j(l,e),role:`money`,summarize:!1}),u&&u!==l&&d.push({key:u,label:j(u,e),role:`money`}),d}function j(e,t){let n=t.fields[e];return n&&(n.type===`foreignKey`||n.type===`crossPackageRef`)&&/.[a-z]Id$/.test(e)?re(e.slice(0,-2)):re(e)}var Ue=[`text`,`integer`,`decimal`,`boolean`,`datetime`,`json`,`foreignKey`,`crossPackageRef`];function We(e){return Ue.includes(e)?e:`text`}var Ge=/(Date|^date|period(Start|End))$/;function Ke(e,t){return t.type===`datetime`&&!t.system&&Ge.test(t.name)&&!e.fields.some(e=>e.name===`allDay`)?`date`:void 0}function qe(e){return oe(e)[0]}function Je(e,t){let n=t.ui?{...t.ui}:void 0,r=c(t)?`money`:Ke(e,t);return{type:We(t.type),required:t.required,nullable:!t.required,...t.default===void 0?{}:{default:t.default},...t.description?{description:t.description}:{},...n?{ui:n}:{},...t.enum?.length?{enum:[...t.enum]}:{},...r?{format:r}:{},...qe(e)===t.name?{display:!0}:{}}}function Ye(e,t){return e.includes(`:`)?e:`${t.slice(0,t.lastIndexOf(`:`))}:${e}`}function Xe(e,t){if(!t.related)return!1;let n=Ye(t.related,e.id);return ve(h,n,o).some(t=>t.id===e.id)}function Ze(e){return e.fields.flatMap(t=>{if(t.type!==`foreignKey`&&t.type!==`crossPackageRef`||!t.related)return[];let n=p(Ye(t.related,e.id));return n?[{field:t.name,kind:t.type===`crossPackageRef`?`crossPackageRef`:`foreignKey`,relatedCollection:n.model.collection,...Xe(e,t)?{role:`items`}:{}}]:[]})}function M(e){let t=Ze(e);return{name:e.collection,objectRef:e.id,className:e.name,idField:`id`,fields:Object.fromEntries(e.fields.map(t=>[t.name,Je(e,t)])),...t.length?{relationships:t}:{}}}function Qe(e,t){return{objectRef:e.id,fields:Object.fromEntries(t.map((e,t)=>[e.name,{visibility:`basic`,label:e.label,help:e.help??null,order:t,required:e.required}]))}}function $e(e,t){let n=new Set(t);for(let t of e)for(let e of t.models)n.add(e);return n}function et(e){return g(e.replace(/_?id$/i,``)||e)}function N(e,t,n){let r=Ce(e,t),i=Se(e,t).filter(e=>e.model.exposed&&n.has(e.model.id)),a=new Set(ve(e,t,o).map(e=>e.id)),s=new Map;for(let e of i)s.set(e.model.id,(s.get(e.model.id)??0)+1);let c=i.map(e=>{let t=a.has(e.model.id)?`items`:`children`,n=M(e.model),i=C(n),o=[e.fk];return{model:e.model.id,field:e.fk,label:(s.get(e.model.id)??0)>1?`${xe(e.model.name,r)} (${et(e.fk).toLowerCase()})`:xe(e.model.name,r),kind:t,columns:t===`items`?He(n,i,{exclude:o}):Ve(n,i,{exclude:o,max:5}),...t===`items`&&`sortOrder`in n.fields?{sort:`sortOrder`}:{}}});for(let n of _e(e,t))c.push({model:n.model.id,field:n.fk,label:et(n.fk),kind:`reference`});return c}var tt=Symbol(`smrt-cookbook`);function nt(){return t(tt)}function rt(e,t){let{sections:n}=t;if(!n)throw Error(`the cookbook widget context is missing`);let r=typeof e.section==`string`?e.section:``,i=r?n.find(e=>e.id===`section:${r}`||e.id===`custom:${r}`)?.id:t.overviewId;if(!i)throw Error(`unknown section ${r}`);return pe(n,i)}function it(e){return e?async(t,n)=>{let r=rt(t,n);try{let t=await e(n,r.items.map(e=>({...e})));if(!Array.isArray(t))return r;let i=new Set,a=[];for(let e of t){if(!e||typeof e.href!=`string`)continue;let t=typeof e.id==`string`&&e.id?e.id:e.href;i.has(t)&&(t=`${t}#${a.length}`),i.add(t),a.push({...e,id:t})}return{items:a}}catch(e){if(n.signal?.aborted)throw e;return r}}:rt}var at=new Set([`foreignKey`,`crossPackageRef`]);function P(e,t){return`/m/${e}/${t}/`}function ot(e,t,n,r=`view`){let i=`${P(e,t)}${encodeURIComponent(n)}/`;return r===`edit`?`${i}edit/`:i}function st(e,t,n,r){return`${P(e,t)}?${encodeURIComponent(n)}=${encodeURIComponent(r)}`}function ct(e,t){let n=new URLSearchParams(e);for(let e of t.fields){if(!at.has(e.type))continue;let t=n.get(e.name);if(t)return{field:e.name,equals:t}}}function lt(e){return e?.equals===void 0?``:`${encodeURIComponent(e.field)}=${encodeURIComponent(e.equals)}`}function ut(e,t,n){let r=n.filter(t=>t.model.id===e&&t.filter);if(t){let e=r.find(e=>e.key===t)?.filter;return e?{field:e.field,equals:e.value}:void 0}let i=r[0]?.filter;if(!i)return;let a=r.map(e=>e.filter).filter(e=>e?.field===i.field).map(e=>String(e?.value));return{field:i.field,notIn:[...new Set(a)]}}function dt(e,t){if(!e)return!0;let n=String(t[e.field]??``);return e.equals===void 0?!e.notIn?.includes(n):n===e.equals}function ft(e){return e?.equals===void 0?{}:{[e.field]:e.equals}}var F=e=>typeof e==`number`&&Number.isSafeInteger(e)?e:null,pt=(e,t)=>e.fields.some(e=>e.name===t);function mt(e,t){let n=C(M(e)),r=ce(t,n);return Object.values(r).some(e=>F(e)!==null)?r:void 0}function ht(e,t){return!!e.fields.find(e=>e.name===`status`)?.enum?.includes(`draft`)&&typeof t.status==`string`&&t.status!==``&&t.status!==`draft`}function gt(e,t,n){if(!ht(e,t)||![`subtotal`,`taxAmount`,`totalAmount`,`discountTotal`].every(t=>pt(e,t)))return;let r=F(t.subtotal),i=F(t.taxAmount),a=F(t.totalAmount),o=F(t.discountTotal)??0;if(r===null||i===null||a===null)return;let s=l(t,`exclusive`);return{subtotal:r,discount:o,tax:i,total:a,lineAmountType:s,roundingScope:u(t,`line`),showNetSubtotal:s===`inclusive`,taxes:_(n,s).flatMap(e=>e.taxComponentId?[{taxComponentId:e.taxComponentId,name:e.name,percent:e.percent,taxable:e.taxable,tax:e.tax}]:[])}}var I=x();function L(e){let{source:t,href:n}=e;if(!t||!n)throw Error(`the planner widget context is missing`);return{source:t,href:n}}function R(e){let t=typeof e==`string`?p(e):void 0;if(!t)throw Error(`unknown model ${String(e)}`);return{model:t.model,packageId:t.pkg.id,path:P(t.pkg.id,t.model.name)}}var z=new Set([`foreignKey`,`crossPackageRef`]);function B(e,t,n){let r=e.filter;if(typeof r!=`string`||r===``)return;if(r!==`parent`)throw Error(`unknown filter ${r}`);let{record:i}=t;if(!i?.id)throw Error(`the parent filter needs a record`);let a=typeof e.parentField==`string`&&e.parentField?e.parentField:e.field,o=typeof a==`string`?a:``,s=n.fields.find(e=>e.name===o);if(!s||!z.has(s.type))throw Error(`${n.name} has no reference field ${o}`);return{field:o,id:i.id}}async function _t(e,t,n){return n?e.listWhere(t,n.field,n.id):e.list(t)}function vt(e,t,n){return e(n?st(t.packageId,t.model.name,n.field,n.id):t.path)}var V=e=>typeof e==`number`&&Number.isFinite(e);async function yt(e,t){let{source:n,href:r}=L(t),i=R(e.model),{model:a}=i,o=B(e,t,a),s=await _t(n,a,o),l=vt(r,i,o),u=typeof e.measure==`string`?e.measure:``;if(u===`count`||u===``)return{value:s.length,format:`integer`,href:l};let d=a.fields.find(t=>t.name===e.field);if(!d||d.type!==`integer`&&d.type!==`decimal`)throw Error(`${u} needs a numeric field of ${a.name}`);let f=s.map(e=>e[d.name]).filter(V),p=0;if(f.length){if(u===`sum`||u===`avg`)p=f.reduce((e,t)=>e+t,0),u===`avg`&&(p/=f.length);else if(u===`min`)p=Math.min(...f);else if(u===`max`)p=Math.max(...f);else throw Error(`unknown measure ${u}`)}let m=c(d);return{value:m?Math.round(p):p,format:m?`money`:d.type===`integer`?`integer`:`decimal`,...m?{currency:`USD`}:{},href:l}}function bt(e,t){return V(e)&&V(t)?e-t:String(e??``).localeCompare(String(t??``))}var xt=new Set([`createdAt`,`updatedAt`]),St=[`identifier`,`status`,`date`,`money`,`quantity`,`party`,`title`];function Ct(e=[]){return St.find(t=>e.includes(t))}function wt(e,t,n,r){let i=M(e),a=r?[r]:[],o=S(n);if(o.length===0)return Ve(i,t,{exclude:a,max:5});let s=[...He(i,t,{exclude:a}),...Ve(i,t,{exclude:a,max:o.length+8})];return o.map(n=>{let r=e.fields.find(e=>e.name===n);if(!r)throw Error(`${e.name} has no field ${n}`);let i=s.find(e=>e.key===n);if(i)return i;let a=Ct(t[n]);return{key:n,label:z.has(r.type)?g(n.replace(/Id$/,``)):g(n),...a?{role:a}:{}}})}var Tt=new Set([`money`,`quantity`]);function Et(e,t){let n={};for(let r of e)(r.summarize??Tt.has(r.role))&&(n[r.key]=t.reduce((e,t)=>{let n=t[r.key];return V(n)?e+n:e},0));return n}function Dt(e,t){let n=w(M(e)),r=new Set(t.map(e=>n?e[n]:void 0).filter(e=>typeof e==`string`&&e!==``));return r.size===1?[...r][0]??`USD`:`USD`}async function Ot(e,t){let{source:n,href:r}=L(t),i=R(e.model),{model:a}=i,o=B(e,t,a),s=await _t(n,a,o);if(typeof e.sort==`string`&&e.sort){if(!a.fields.find(t=>t.name===e.sort)&&!xt.has(e.sort))throw Error(`${a.name} has no field ${e.sort}`);let t=s.some(t=>t[e.sort]!==void 0)?e.sort:It(a)?.name;if(t){let n=e.direction===`asc`?1:-1;s=[...s].sort((e,r)=>n*bt(e[t],r[t]))}}let c=wt(a,C(M(a)),e.columns,o?.field),l=V(e.limit)?e.limit:5,u=s.slice(0,l),d=a.fields.filter(e=>z.has(e.type)&&c.some(t=>t.key===e.name)),f=await de(n,d,u),p=e=>Object.fromEntries(c.map(t=>{let n=e[t.key],r=d.find(e=>e.name===t.key);return r?.related&&typeof n==`string`&&n?[t.key,f.get(m(r.related,n))??``]:[t.key,n??null]})),h=Et(c,s),g=!Me(a);return{rows:await Promise.all(u.map(async e=>({id:String(e.id),title:await ue(n,a,e,0,o?.field),...g?{href:r(ot(i.packageId,a.name,String(e.id)))}:{},cells:p(e)}))),total:s.length,...g?{href:vt(r,i,o)}:{},columns:c,currency:Dt(a,s),...Object.keys(h).length?{summaries:h}:{}}}var kt={"7d":7,"30d":30,"90d":90,"12m":365,all:null},At=864e5;function jt(e){return e===`7d`||e===`30d`?`day`:e===`90d`?`week`:`month`}function Mt(e,t){let n=new Date(e);if(t===`month`)return Date.UTC(n.getUTCFullYear(),n.getUTCMonth(),1);let r=Date.UTC(n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate());return t===`week`?r-(n.getUTCDay()+6)%7*At:r}function Nt(e,t){if(t===`month`){let t=new Date(e);return Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+1,1)}return e+(t===`week`?7:1)*At}function Pt(e,t){let n=new Date(e).toISOString();return t===`month`?n.slice(0,7):n.slice(0,10)}var Ft=e=>e.type===`datetime`&&!e.system;function It(e){let t=e.fields.filter(Ft);return t.find(e=>/^(issue|order|start|created)/i.test(e.name))??t[0]}function H(e){if(typeof e!=`string`&&typeof e!=`number`)return;let t=new Date(e).getTime();return Number.isFinite(t)?t:void 0}async function Lt(e,t){let{source:n,href:r}=L(t),i=R(e.model),{model:a}=i,o=B(e,t,a),s=typeof e.groupBy==`string`?e.groupBy:``,l=s?a.fields.find(e=>e.name===s):It(a);if(!l)throw Error(s?`${a.name} has no field ${s}`:`${a.name} has no date field to chart; choose a group-by field`);let u=typeof e.measure==`string`?e.measure:``,d;if(u&&u!==`count`){if(u!==`sum`&&u!==`avg`)throw Error(`unknown measure ${u}`);if(d=a.fields.find(t=>t.name===e.field),!d||d.type!==`integer`&&d.type!==`decimal`)throw Error(`${u} needs a numeric field of ${a.name}`)}let f=typeof e.period==`string`?e.period:`30d`;if(!Object.hasOwn(kt,f))throw Error(`unknown period ${f}`);let p=kt[f],m=Ft(l),h=m?l:It(a),g=p!==null&&h?v-p*At:-1/0,_=await _t(n,a,o);h&&g!==-1/0&&(_=_.filter(e=>{let t=H(e[h.name]);return t!==void 0&&t>=g&&t<=v}));let y=new Map,b=(e,t,n)=>{let r=y.get(e)??{key:t,sum:0,n:0};if(d){let e=n[d.name];if(!V(e))return;r.sum+=e}r.n+=1,y.set(e,r)},x=jt(f);if(m){let e=g===-1/0?Math.min(..._.map(e=>H(e[l.name])??v),v):g;for(let t=Mt(e,x);t<=v;t=Nt(t,x))y.set(Pt(t,x),{key:t,sum:0,n:0});for(let e of _){let t=H(e[l.name]);if(t===void 0)continue;let n=Mt(t,x);b(Pt(n,x),n,e)}}else for(let e of _){let t=e[l.name],n=t==null||t===``?`(none)`:String(t);b(n,n,e)}let S=d?c(d):!1,C=e=>{if(!d)return e.n;let t=u===`avg`&&e.n?e.sum/e.n:e.sum;return S?Math.round(t):t},w=[...y.entries()].map(([e,t])=>({label:e,value:C(t),key:t.key}));return w=m?w.sort((e,t)=>Number(e.key)-Number(t.key)):w.sort((e,t)=>t.value-e.value||e.label.localeCompare(t.label)),{points:w.map(({label:e,value:t})=>({label:e,value:t})),format:d?S?`money`:d.type===`integer`?`integer`:`decimal`:`integer`,...S?{currency:`USD`}:{},href:vt(r,i,o)}}var Rt=async(e,t)=>{let{source:n,entryIndex:r}=e;if(!n||!r)throw Error(`the planner widget context is missing`);return Promise.all(t.map(async e=>{let t=r.get(e.id??``);if(!t)return e;let i=await n.list(t.model);return{...e,count:i.filter(e=>dt(t.scope,e)).length}}))};fe(I,{metric:yt,records:Ot,chart:Lt,shortcuts:Rt,shortcuts:it(Rt)});function zt(e){let{relations:t,viewAllHref:n}=e;if(!t)throw Error(`the record page context is missing`);return{relations:t,records:Ot,viewAllHref:n}}async function Bt(e,t){let{source:n}=L(e),r=e.record;if(!r?.id)throw Error(`line items need a record`);let{model:i}=R(r.model),a=await n.get(i,r.id);if(!a)return{};let o=t.find(e=>e.kind===`items`),s=o?p(o.model)?.model:void 0,c=gt(i,a,o&&s?await n.listWhere(s,o.field,r.id):[]),l=c?void 0:mt(i,a),u=w(M(i)),d=u?a[u]:void 0;return{...c?{storedTotals:c}:{},...l?{totals:l}:{},...typeof d==`string`&&d?{currency:d}:{}}}I.register(ie((e,t)=>ae(zt(t))(e,t))),I.register(se(async(e,t)=>{let n=zt(t),{totals:r,storedTotals:i,currency:a}=await Bt(t,n.relations);return he({...n,totals:()=>r,storedTotals:()=>i,currency:()=>a})(e,t)}));var Vt=[`shortcuts`,`metric`,`records`,`chart`,`note`],Ht={},Ut=async(e,t)=>{let n=Ht[e];if(n)return(await n())[t]},Wt=E.filter(e=>e.surfaces?.some(e=>e.kind===`widget`)),Gt=Wt.flatMap(e=>(e.surfaces??[]).flatMap(e=>e.kind===`widget`?[e.type]:[]));Re(I,Wt,Ut);var Kt=new Map(ye(E).map(e=>[`section:${e.id}`,e])),qt=h.packages.flatMap(e=>e.models.map(e=>e.id)),Jt=[...Vt,...Gt];function Yt(e){let t=Kt.get(e);for(let e of t?.recipes??[]){let t=Ne(e)[0];if(t)return{id:t.model.id,name:g(t.model.name)}}}function Xt(e){let t=[{id:`shortcuts`,type:`shortcuts`,span:4,options:{}}],n=Yt(e);return n&&t.push({id:`count`,type:`metric`,span:1,options:{title:d(n.name),model:n.id,measure:`count`}},{id:`latest`,type:`records`,span:3,options:{title:`${n.name} records`,model:n.id,limit:5}}),t}var Zt=new Map;function Qt(e){if(!ee.test(e))return;let t=Zt.get(e);return t||(t=T({id:e,allowed:Jt,models:qt,defaults:Xt(e)}),Zt.set(e,t)),t}function $t(e,t){return`detail:${e}.${t}`}var en=new Map(h.packages.flatMap(e=>e.models.filter(e=>e.exposed).map(t=>[ne(t.id),{packageId:e.id,model:t}])));function U(e){let[,t,n]=/^detail:([A-Za-z0-9_-]+)\.([A-Za-z0-9_]+)$/.exec(e)??[],r=t&&n?f(t,n):void 0;return t&&r?.exposed?{packageId:t,model:r}:en.get(e)}var tn=new Set(h.packages.flatMap(e=>e.models.filter(e=>e.exposed).map(e=>e.id))),nn=new Map;function rn(e){let t=nn.get(e);if(t)return t;let n=U(e);if(!n)return;let r=N(h,n.model.id,tn),i=me(M(n.model),r,{id:e,maxMetrics:2*r.length});return t=T({...i,maxWidgets:Math.max(i.maxWidgets??24,i.defaults.length+24)}),nn.set(e,t),t}function an(e,t){let n=rn(e),r=U(e);if(!n||!r)return;let i=N(h,r.model.id,t),a=0,o=n.defaults.filter(e=>e.type===`line-items`?i.some(e=>e.kind===`items`):e.type===`related`?i.some(e=>e.kind===`children`):t.has(String(e.options.model))?e.type!==`metric`||(a+=1,a<=4):!1);return T({...n,defaults:o})}function on(e){return e.startsWith(`detail:`)?rn(e):Qt(e)}function sn(e,t){return Kt.has(e)||e===`section:${Oe.id}`?!0:e.startsWith(`detail:`)?U(e)!==void 0:e.startsWith(`custom:`)&&ee.test(e)&&(t?.customSections??[]).some(t=>t.id===e)}var cn=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function ln(e,t){let n=t.widgetId?`widget ${t.widgetId}${t.type?` (${t.type})`:``}`:`an entry`,r=t.options?.length?`: ${t.options.map(e=>`${e.key} ${e.code}`).join(`, `)}`:``;return`Overview ${e}: ${n} was dropped (${t.code}${r}).`}function un(e,t){let n={...e};return e.added&&(n.added=e.added.filter(e=>!t.has(e.id))),e.changed&&(n.changed=Object.fromEntries(Object.entries(e.changed).filter(([e])=>!t.has(e)))),n}function dn(e,t){let n=on(e);if(!n)return{override:null,issues:[{widgetId:null,type:null,code:`malformed`,message:`not an overview id`}]};let r=le(n,t,I);if(r.ok)return{override:r.override,issues:[]};let i=te(t),a=new Set(r.issues.flatMap(e=>e.widgetId?[e.widgetId]:[]));if(!i.override)return{override:null,issues:r.issues};let o=le(n,un(i.override,a),I);return o.ok?{override:o.override,issues:r.issues}:{override:null,issues:[...r.issues,...o.issues]}}function fn(e,t){if(!cn(e))return null;let n=[],r=[];for(let i of Object.keys(e).sort()){if(!sn(i,t)){r.push(`Overview ${i} is not a page in this app and was dropped.`);continue}let{override:a,issues:o}=dn(i,e[i]);for(let e of o)r.push(ln(i,e));a&&n.push([i,a])}return{overviews:Object.fromEntries(n),dropped:r}}var W=b,pn=`glass`,mn=`system`,hn=[`light`,`dark`,`system`],gn=[`none`,`sm`,`md`,`lg`,`xl`,`full`],_n=[`comfortable`,`touch`],vn=[`auto`,`standard`,`more`],G={"system-ui":`system-ui, -apple-system, "Segoe UI", sans-serif`,Inter:`Inter, system-ui, sans-serif`,Georgia:`Georgia, "Times New Roman", serif`,"ui-rounded":`ui-rounded, "SF Pro Rounded", system-ui, sans-serif`,"ui-monospace":`ui-monospace, "SF Mono", Menlo, monospace`},yn=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;function bn(e){if(typeof e!=`string`)return null;let t=yn.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase();return n.length===3&&(n=[...n].map(e=>e+e).join(``)),`#${n}`}var xn=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Sn(e){if(e===void 0)return{ok:!0,theme:void 0};if(!xn(e))return{ok:!1,error:`The cookbook "theme" must be an object.`};let t={};if(e.preset!==void 0){if(typeof e.preset!=`string`||!W.includes(e.preset))return{ok:!1,error:`The theme preset must be one of ${W.join(`, `)}.`};t.preset=e.preset}if(e.colorScheme!==void 0){if(!hn.includes(e.colorScheme))return{ok:!1,error:`The theme colorScheme must be light, dark or system.`};t.colorScheme=e.colorScheme}for(let[n,r]of[[`borderRadius`,gn],[`density`,_n],[`contrast`,vn]]){let i=e[n];if(i!==void 0){if(!r.includes(i))return{ok:!1,error:`The theme ${n} must be one of ${r.join(`, `)}.`};t[n]=i}}if(e.fontFamily!==void 0){if(typeof e.fontFamily!=`string`||!Object.hasOwn(G,e.fontFamily))return{ok:!1,error:`The theme font must be one of ${Object.keys(G).join(`, `)}.`};t.fontFamily=e.fontFamily}if(e.custom!==void 0){if(!xn(e.custom))return{ok:!1,error:`The theme "custom" must be an object.`};let n=bn(e.custom.primary);if(!n)return{ok:!1,error:`The theme custom primary must be a hex colour like #c2410c.`};let r={primary:n};if(e.custom.fontFamily!==void 0){let t=e.custom.fontFamily;if(typeof t!=`string`||!Object.hasOwn(G,t))return{ok:!1,error:`The theme font must be one of ${Object.keys(G).join(`, `)}.`};r.fontFamily=t}t.custom=r}if(e.customCss!==void 0){if(typeof e.customCss!=`string`)return{ok:!1,error:`The theme customCss must be a string.`};if(Array.from(e.customCss).length>65536)return{ok:!1,error:`The theme customCss is too long (65,536 characters maximum).`};e.customCss&&(t.customCss=e.customCss)}return{ok:!0,theme:Object.keys(t).length?t:void 0}}function Cn(e){if(!e)return;let t={};return e.preset&&(t.preset=e.preset),e.colorScheme&&(t.colorScheme=e.colorScheme),e.borderRadius&&(t.borderRadius=e.borderRadius),e.density&&(t.density=e.density),e.contrast&&(t.contrast=e.contrast),e.fontFamily&&(t.fontFamily=e.fontFamily),e.custom&&(t.custom={...e.custom}),e.customCss&&(t.customCss=e.customCss),Object.keys(t).length?t:void 0}function wn(e){let t=e?.colorScheme??`system`,n=e?.custom?`brand colour ${e.custom.primary}`:e?.preset??`glass`;return t===`system`?n:`${n}, ${t}`}var K=`section:`;function Tn(e,t=Pe(E)){let n=Object.keys(t).sort((e,t)=>t.length-e.length);if(!n.length)return e;let r=e=>{if(!e.startsWith(K))return e;let r=e.slice(8);for(let e of n){if(r===e)return`${K}${t[e]}`;if(r.startsWith(`${e}:`))return`${K}${t[e]}${r.slice(e.length)}`}return e},i=e=>e.startsWith(K)&&n.includes(e.slice(8)),a=e=>[...new Set(e)],o={...e};if(e.sectionOrder&&(o.sectionOrder=a(e.sectionOrder.map(r))),e.hidden&&(o.hidden=a(e.hidden.filter(e=>!i(e)).map(r))),e.itemOrder){let t={};for(let[n,i]of Object.entries(e.itemOrder)){let e=r(n);t[e]=a([...t[e]??[],...i.map(r)])}o.itemOrder=t}return e.moved&&(o.moved=Object.fromEntries(Object.entries(e.moved).map(([e,t])=>[r(e),r(t)]))),o}function En(e,t=E){let n=new Map;for(let e of t){let t=be(e).id;for(let r of Ne(e))r.key&&n.set(`${K}${t}:${r.packageId}:${r.model.name}:${r.label}`,ge(r.packageId,r.model.name,r.key))}let r=e=>{let t=n.get(e);if(t)return t;if(!e.startsWith(K))return e;let r=e.slice(8).split(`:`);return r.length<3||!r[1]||!r[2]?e:ge(r[1],r[2])},i=e=>[...new Set(e)],a=(e,t)=>{let n={};for(let[i,a]of Object.entries(e)){let e=r(i);e in n||(n[e]=t(a))}return n},o={...e};return e.hidden&&(o.hidden=i(e.hidden.map(r))),e.itemOrder&&(o.itemOrder=a(e.itemOrder,e=>i(e.map(r)))),e.moved&&(o.moved=a(e.moved,r)),e.items&&(o.items=a(e.items,e=>e)),o}var q=`https://s-m-r-t.dev/schemas/cookbook/v1.json`,Dn=new Set([`basic`,`advanced`,`hidden`]),On=new Set([`api`,`mcp`,`cli`]),J=e=>({ok:!1,error:e}),Y=e=>typeof e==`object`&&!!e&&!Array.isArray(e),X=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function kn(e,t){if(!Y(e))return`${t} is not an object`;let{objectRef:n,fieldName:r}=e;if(typeof n!=`string`||!n)return`${t} has no objectRef`;if(typeof r!=`string`||!r)return`${t} has no fieldName`;if(e.scopeType!==`app`)return`${t} must have scopeType "app"`;let i={objectRef:n,fieldName:r,scopeType:`app`};for(let n of[`defaultValue`,`help`,`label`]){let r=e[n];if(r!==void 0){if(typeof r!=`string`&&r!==null)return`${t}.${n} is invalid`;i[n]=r}}if(e.visibility!==void 0){let n=e.visibility;if(n!==null&&!(typeof n==`string`&&Dn.has(n)))return`${t}.visibility is invalid`;i.visibility=n}if(e.displayOrder!==void 0){let n=e.displayOrder;if(n!==null&&!(typeof n==`number`&&Number.isFinite(n)))return`${t}.displayOrder is invalid`;i.displayOrder=n}if(e.locked!==void 0){if(e.locked!==null&&typeof e.locked!=`boolean`)return`${t}.locked is invalid`;i.locked=e.locked}return i}function An(e){if(!Y(e)||e.version!==1)return`layout must be an object with version 1`;for(let t of[`sectionOrder`,`hidden`])if(e[t]!==void 0&&!X(e[t]))return`layout.${t} must be a list of strings`;for(let t of[`itemOrder`,`moved`,`panels`])if(e[t]!==void 0&&!Y(e[t]))return`layout.${t} must be an object`;let t=e.itemOrder;if(Y(t)){for(let[e,n]of Object.entries(t))if(e===`__proto__`||!X(n))return`layout.itemOrder.${e} must be a list of strings`}let n=e.moved;if(Y(n)){for(let[e,t]of Object.entries(n))if(e===`__proto__`||typeof t!=`string`)return`layout.moved.${e} must be a string`}return e}function jn(e,t={}){if(!Y(e))return J(`This is not a cookbook: expected a JSON object.`);if(e.$schema!==void 0&&e.$schema!==`https://s-m-r-t.dev/schemas/cookbook/v1.json`&&e.$schema!==`https://s-m-r-t.dev/schemas/blueprint/v1.json`)return J(`This is not a cookbook: its "$schema" is not a cookbook schema this planner knows.`);let{version:n}=e;if(n===void 0)return J(`This is not a cookbook: it has no "version".`);if(typeof n!=`number`||!Number.isInteger(n))return J(`The cookbook "version" must be a whole number.`);if(n>1)return J(`This cookbook is version ${n}, newer than this planner understands (1). Update the planner or re-export it.`);if(n!==1)return J(`Cookbook version ${n} is not supported (this planner reads version 1).`);if(!X(e.recipes))return J(`The cookbook "recipes" must be a list of recipe ids.`);let r=e.recipes.filter(e=>!O.has(e)),i=[...new Set([...Ee(e.recipes.filter(e=>O.has(e)),O),...r])].sort(),a=[];if(e.features!==void 0){if(!X(e.features))return J(`The cookbook "features" must be a list of model names.`);let t=new Set;for(let n of e.features){if(t.has(n))return J(`The cookbook lists the feature ${n} more than once.`);t.add(n)}a=[...e.features].sort()}let o=new Set([...i.flatMap(e=>O.get(e)?.models??[]),...a]);if(!Array.isArray(e.policies))return J(`The cookbook "policies" must be a list.`);let s=[];for(let[t,n]of e.policies.entries()){let e=kn(n,`policies[${t}]`);if(typeof e==`string`)return J(`Invalid cookbook: ${e}.`);(o.has(e.objectRef)||we(e))&&s.push(e)}let c;if(e.exposure!==void 0){if(!Y(e.exposure))return J(`The cookbook "exposure" must be an object.`);let t=[];for(let[n,r]of Object.entries(e.exposure)){if(!X(r)||!r.every(e=>On.has(e)))return J(`Invalid cookbook: exposure for ${n} must list api, mcp or cli.`);r.length&&o.has(n)&&t.push([n,[...r]])}c=Object.fromEntries(t)}let l;if(e.layout!==void 0){let t=An(e.layout);if(typeof t==`string`)return J(`Invalid cookbook: ${t}.`);l=En(Tn(t))}let u;if(e.theme!==void 0){let n=Sn(e.theme);if(n.ok)u=n.theme;else if(!t.dropUnknownRecipes)return J(n.error)}let d,f=[];if(e.overviews!==void 0){if(t.overviews){let n=t.overviews(e.overviews,l);if(!n)return J(`The cookbook "overviews" must be an object.`);d=n.overviews,f=n.dropped}else{if(!Y(e.overviews))return J(`The cookbook "overviews" must be an object.`);Object.keys(e.overviews).length&&(f=[`Page customisations (overviews) are not kept by this host and were dropped.`])}}let p={$schema:q,version:1,recipes:i,features:a,policies:s};for(let t of[`name`,`description`]){let n=e[t];if(n!==void 0){if(typeof n!=`string`)return J(`The cookbook "${t}" must be a string.`);n.trim()&&(p[t]=n.trim())}}return c&&Object.keys(c).length&&(p.exposure=c),l&&(p.layout=l),u&&(p.theme=u),d&&Object.keys(d).length&&(p.overviews=d),f.length?{ok:!0,cookbook:p,dropped:f}:{ok:!0,cookbook:p}}var Mn=e=>({ok:!1,error:e});function Nn(e,t={}){return jn(e,{...t,overviews:fn})}function Pn(e,t={}){let n;try{n=JSON.parse(e)}catch{return Mn(`This file is not valid JSON.`)}try{return Nn(n,t)}catch{return Mn(`This file is not a valid cookbook.`)}}var Z=`smrt-planner:cookbook-doc:v1`,Fn=`smrt-planner:blueprint:v1`,In=`smrt-planner:cookbook-doc:unreadable`;function Ln(){try{return globalThis.localStorage??null}catch{return null}}function Rn(e){if(!e)return{status:`unavailable`};let t;try{t=e.getItem(Z)}catch{return{status:`unavailable`}}let n=null;try{n=e.getItem(Fn)}catch{}let r=t===null&&n!==null,i=r?n:t;if(i===null)return{status:`empty`};let a=Pn(i,{dropUnknownRecipes:!0});if(a.ok)return r&&Q(e,Z,JSON.stringify(a.cookbook)),{status:`loaded`,cookbook:a.cookbook,previousKept:n!==null,...a.dropped?{dropped:a.dropped}:{}};t=i;let o=Q(e,In,t);return{status:`unreadable`,reason:a.error,keptAside:o}}function Q(e,t,n){if(!e)return!1;try{return e.setItem(t,n),!0}catch{return!1}}function zn(e,t){if(!e)return!1;try{return e.removeItem(t),!0}catch{return!1}}function Bn(e,t){return Q(e,Z,JSON.stringify(t))}function Vn(e,t={}){let n={$schema:q,version:1,...Ae(e)};t.name&&(n.name=t.name),t.description&&(n.description=t.description),t.layout&&(n.layout=t.layout);let r=Cn(t.theme);r&&(n.theme=r);let i=t.overviews??{},a=Object.keys(i).sort();return a.length&&(n.overviews=Object.fromEntries(a.map(e=>[e,i[e]]))),n}var Hn=new Set([`basic`,`advanced`,`hidden`]),Un=new Set([`api`,`mcp`,`cli`]);function Wn(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t+`=`.repeat((4-t.length%4)%4));return new TextDecoder().decode(Uint8Array.from(n,e=>e.charCodeAt(0)))}function Gn(e){let t=new URLSearchParams(e);return t.has(`r`)||t.has(`o`)}function Kn(e){let t={rows:[],narrowed:{}};if(!e)return t;let n;try{n=JSON.parse(Wn(e))}catch{return t}if(!n||typeof n!=`object`)return t;let r=[];for(let[e,t]of Object.entries(n.r??{}))if(t&&typeof t==`object`)for(let[n,i]of Object.entries(t)){if(!i||typeof i!=`object`)continue;let t={objectRef:e,fieldName:n,scopeType:`app`};typeof i.v==`string`&&Hn.has(i.v)&&(t.visibility=i.v),typeof i.l==`string`&&(t.label=i.l),(typeof i.h==`string`||i.h===null)&&(t.help=i.h),(typeof i.d==`string`||i.d===null)&&(t.defaultValue=i.d),typeof i.o==`number`&&Number.isFinite(i.o)&&(t.displayOrder=i.o),typeof i.k==`boolean`&&(t.locked=i.k),r.push(t)}let i={};for(let[e,t]of Object.entries(n.x??{})){if(!Array.isArray(t))continue;let n=t.filter(e=>Un.has(e));n.length&&(i[e]=n)}return{rows:r,narrowed:i}}function qn(e){let t=new URLSearchParams(e),n=(t.get(`r`)??``).split(`,`).filter(Boolean),r=Ee(ke(n,O),O),i=new Set(r.flatMap(e=>O.get(e)?.models??[])),{rows:a,narrowed:o}=Kn(t.get(`o`)??``),s={$schema:q,version:1,recipes:r,features:[],policies:a.filter(e=>i.has(e.objectRef))},c=Object.fromEntries(Object.entries(o).filter(([e])=>i.has(e)));return Object.keys(c).length&&(s.exposure=c),s}var Jn=`smrt-planner:shell`;function $(e){let t=je(e),n=e.policies.some(e=>e.defaultValue!==void 0&&we(e));s(De(e)||n?t.taxRate:void 0),a({pricesIncludeTax:t.pricesIncludeTax,taxRounding:t.taxRounding,currency:t.currency})}var Yn=new class{#e=r();get layout(){return e(this.#e)}set layout(e){i(this.#e,e,!0)}#t=r();get name(){return e(this.#t)}set name(e){i(this.#t,e,!0)}#n=r();get description(){return e(this.#n)}set description(e){i(this.#n,e,!0)}#r=r();get theme(){return e(this.#r)}set theme(e){i(this.#r,e,!0)}#i=r({});get overviews(){return e(this.#i)}set overviews(e){i(this.#i,e)}#a=r(`unknown`);get persist(){return e(this.#a)}set persist(e){i(this.#a,e,!0)}#o=r(!1);get loaded(){return e(this.#o)}set loaded(e){i(this.#o,e,!0)}hostManaged=!1;#s=r(``);get loadNotice(){return e(this.#s)}set loadNotice(e){i(this.#s,e,!0)}saveBlocked=!1;#c=r(!1);get keepLegacyUrl(){return e(this.#c)}set keepLegacyUrl(e){i(this.#c,e,!0)}replacedBeforeLoad=!1;previousKept=!1;storage=null;timer;snapshot(){return Vn(n(D.data),{layout:n(this.layout),theme:n(this.theme),overviews:n(this.overviews),name:this.name,description:this.description})}overview(e){return Object.hasOwn(this.overviews,e)?this.overviews[e]:null}setOverview(e,t){let n=Object.fromEntries(Object.entries(this.overviews).filter(([t])=>t!==e));t&&(n[e]=t),this.overviews=n}setLayout(e){this.layout=y(e)?void 0:e}apply(e){D.load(e),this.layout=e.layout,this.theme=e.theme,this.name=e.name,this.description=e.description,this.overviews={...e.overviews??{}},$(e)}get unavailableNotice(){let e=[...D.unavailableRecipes,...D.unavailableFeatures];if(!e.length)return``;let t=e.length;return`${t} ${t===1?`recipe`:`recipes`} in this cookbook ${t===1?`isn't`:`aren't`} available in this version: ${e.join(`, `)}. They are kept when you save or export.`}removeUnavailable(){D.removeUnavailable(),this.scheduleSave()}setTheme(e){this.theme=Cn(e)}settings(){return je(this.snapshot())}setSettings(e){let t=Te(this.snapshot(),e);D.rows=t.policies.map(e=>({...e})),$(t)}replace(e){this.apply(e),this.loaded||(this.replacedBeforeLoad=!0),this.saveBlocked=!1,this.keepLegacyUrl=!1}reset(){D.clear(),$({policies:[]}),this.layout=void 0,this.theme=void 0,this.name=void 0,this.description=void 0,this.overviews={};try{globalThis.localStorage?.removeItem(Jn)}catch{}this.saveBlocked=!1,this.keepLegacyUrl=!1}importText(e){let t=Pn(e);return t.ok&&this.replace(t.cookbook),t}hydrate(e,t=Ln()){this.storage=t;let n=Rn(t);n.status===`loaded`&&(this.previousKept=n.previousKept),n.status===`loaded`&&!this.replacedBeforeLoad?(this.apply(n.cookbook),n.dropped?.length&&(this.loadNotice=`Some saved page customisations could not be used and were removed: ${n.dropped.join(` `)}`)):n.status===`unreadable`&&(this.saveBlocked=!n.keptAside,this.loadNotice=n.keptAside?`The saved cookbook could not be read (${n.reason}) and was kept aside; starting empty.`:`The saved cookbook could not be read (${n.reason}). Starting empty without overwriting it; import or reset to save again.`);let r=!1;if(Gn(e)&&(n.status===`loaded`&&!Q(t,`smrt-planner:cookbook-doc:backup`,JSON.stringify(n.cookbook))&&(this.saveBlocked=!0),this.apply(qn(e)),r=!0),this.persist=n.status===`unavailable`?`memory`:`unknown`,this.loaded=!0,r){let e=this.save();this.keepLegacyUrl=!e}return r}save(){if(clearTimeout(this.timer),this.timer=void 0,!this.loaded)return!1;if(this.hostManaged)return!0;if(this.saveBlocked)return this.persist=`memory`,!1;let e=Bn(this.storage,this.snapshot());return this.persist=e?`ok`:`memory`,e&&this.previousKept&&(this.previousKept=!zn(this.storage,Fn)),e&&(this.keepLegacyUrl=!1),e}scheduleSave(){this.loaded&&!this.hostManaged&&(clearTimeout(this.timer),this.timer=setTimeout(()=>this.save(),300))}flush(){this.timer!==void 0&&this.save()}};export{nt as A,ut as C,ct as D,P as E,N as M,M as N,lt as O,Qe as P,dt as S,st as T,bn as _,Ln as a,Qt as b,q as c,mn as d,pn as f,wn as g,W as h,Z as i,$e as j,ot as k,gn as l,G as m,Yn as n,Nn as o,_n as p,$ as r,Pn as s,Jn as t,vn as u,an as v,ft as w,I as x,$t as y};
1
+ import{$ as e,Et as t,Mt as n,bt as r,vt as i}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{I as a,K as o,L as s,O as c,U as l,W as u,_ as d,dt as f,ft as p,h as m,lt as h,p as g,st as _,x as v}from"./BG9Gz_25.js";import{g as y}from"./Bsn3IIve.js";import"./M-CuJzQN.js";import"./9pRTae44.js";import{u as b}from"./Cga8zF3r.js";import{A as x,C as S,D as C,E as w,F as ee,M as T,N as te,S as ne,T as re,_ as ie,b as ae,d as oe,g as se,h as ce,j as le,n as ue,r as de,v as fe,w as pe,x as me,y as he}from"./CyUSxz1P.js";import{B as ge,G as _e,J as ve,R as ye,V as be,W as xe,X as Se,Y as Ce,a as we,b as E,c as Te,d as Ee,i as De,j as Oe,l as ke,n as Ae,o as je,q as Me,t as D,v as Ne,x as O,z as Pe}from"./CtjBwCj8.js";function Fe(e){let t=e.lastIndexOf(`#`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1);return n.startsWith(`.`)||n.startsWith(`/`)||/\s/.test(n)||!/^[A-Za-z_$][\w$]*$/.test(r)?null:{specifier:n,exportName:r}}function k(e,t){let n=Fe(e);return n?Promise.resolve(t(n.specifier,n.exportName)).then(t=>{if(t==null)throw Error(`export "${e}" was not found`);return t}):Promise.reject(Error(`invalid export ref "${e}"`))}function A(e){let t;return()=>(t??=e(),t)}function Ie(e){return typeof e==`object`&&!!e&&`default`in e&&!!e.default}function Le(e,t,n){let r=A(()=>k(e.export,t)),i=e.optionsEditor?A(()=>k(e.optionsEditor,t)):void 0,a=e.data?.load?A(()=>k(e.data?.load,t)):void 0,o={type:e.type,title:e.label,options:e.options??[],loadComponent:async()=>{let e=await r();return Ie(e)?e.default:e}};return e.description!==void 0&&(o.description=e.description),e.icon!==void 0&&(o.icon=e.icon),e.version!==void 0&&(o.version=e.version),e.allowedIn&&(o.allowedIn=e.allowedIn),e.defaultSpan!==void 0&&(o.defaultSpan=e.defaultSpan),e.minSpan!==void 0&&(o.minSpan=e.minSpan),e.maxSpan!==void 0&&(o.maxSpan=e.maxSpan),n&&(o.migrate=n),i&&(o.loadOptionsEditor=async()=>{let e=await i();return Ie(e)?e.default:e}),a&&(o.load=async(t,n)=>{let r=await a();if(typeof r!=`function`)throw Error(`loader "${e.data?.load}" is not a function`);return r(t,n)}),o}async function Re(e,t,n,r={}){let i=[],a=[],o=[];for(let s of t)if(!r.enabled||r.enabled(s.id))for(let t of s.surfaces??[]){if(t.kind!==`widget`)continue;let c=(e,n)=>a.push({recipeId:s.id,type:t.type,reason:e,message:n});if(e.has(t.type)&&!r.replace){c(`duplicate_type`,`"${t.type}" is already registered`);continue}let l;if(t.migrate)try{let e=await k(t.migrate,n);if(typeof e!=`function`)throw Error(`not a function`);l=e}catch(e){c(`unresolved`,`migrate "${t.migrate}": ${e instanceof Error?e.message:String(e)}`);continue}try{o.push(e.register(Le(t,n,l),{replace:r.replace})),i.push(t.type)}catch(e){c(`invalid`,e instanceof Error?e.message:String(e))}}return{registered:i,skipped:a,dispose:()=>{for(let e of o.splice(0))e()}}}var ze=[`identifier`,`status`,`date`,`party`,`total`,`money`];function Be(e){for(let t of[`identifier`,`status`,`date`,`money`,`quantity`,`party`,`title`])if(e.includes(t))return t}function Ve(e,t,n={}){let r=new Set(n.exclude??[]),i=n.max??4,a=Object.keys(t).filter(t=>!r.has(t)&&t in e.fields),o=e=>a.find(n=>t[n]?.includes(e)),s=[],c=e=>{e&&!s.includes(e)&&s.push(e)};c(o(`identifier`)??o(`title`));for(let e of ze)e!==`identifier`&&(e===`money`&&s.some(e=>t[e]?.includes(`money`))||c(e===`date`?a.find(e=>t[e]?.includes(`date`)&&e!==`createdAt`&&e!==`updatedAt`)??o(`date`):o(e)));return s.slice(0,i).map(n=>({key:n,label:j(n,e),...Be(t[n]??[])?{role:Be(t[n]??[])}:{}}))}function He(e,t,n={}){let r=new Set(n.exclude??[]),i=Object.keys(t).filter(t=>!r.has(t)&&t in e.fields),a=i.filter(t=>e.fields[t]?.type===`text`),o=a.find(e=>/^(?:description|title|name|label)$/.test(e))??a.find(e=>t[e]?.includes(`title`))??a.find(e=>!t[e]?.includes(`identifier`)),s=i.find(e=>t[e]?.includes(`quantity`)),c=i.filter(e=>t[e]?.includes(`money`)),l=c.find(e=>/unit|price|rate/i.test(e)),u=c.find(e=>/^(?:amount|lineTotal|total|lineAmount)$/.test(e))??[...c].reverse().find(e=>e!==l),d=[];return o&&d.push({key:o,label:j(o,e)}),s&&d.push({key:s,label:j(s,e),role:`quantity`}),l&&d.push({key:l,label:j(l,e),role:`money`,summarize:!1}),u&&u!==l&&d.push({key:u,label:j(u,e),role:`money`}),d}function j(e,t){let n=t.fields[e];return n&&(n.type===`foreignKey`||n.type===`crossPackageRef`)&&/.[a-z]Id$/.test(e)?re(e.slice(0,-2)):re(e)}var Ue=[`text`,`integer`,`decimal`,`boolean`,`datetime`,`json`,`foreignKey`,`crossPackageRef`];function We(e){return Ue.includes(e)?e:`text`}var Ge=/(Date|^date|period(Start|End))$/;function Ke(e,t){return t.type===`datetime`&&!t.system&&Ge.test(t.name)&&!e.fields.some(e=>e.name===`allDay`)?`date`:void 0}function qe(e){return oe(e)[0]}function Je(e,t){let n=t.ui?{...t.ui}:void 0,r=c(t)?`money`:Ke(e,t);return{type:We(t.type),required:t.required,nullable:!t.required,...t.default===void 0?{}:{default:t.default},...t.description?{description:t.description}:{},...n?{ui:n}:{},...t.enum?.length?{enum:[...t.enum]}:{},...r?{format:r}:{},...qe(e)===t.name?{display:!0}:{}}}function Ye(e,t){return e.includes(`:`)?e:`${t.slice(0,t.lastIndexOf(`:`))}:${e}`}function Xe(e,t){if(!t.related)return!1;let n=Ye(t.related,e.id);return ve(h,n,o).some(t=>t.id===e.id)}function Ze(e){return e.fields.flatMap(t=>{if(t.type!==`foreignKey`&&t.type!==`crossPackageRef`||!t.related)return[];let n=p(Ye(t.related,e.id));return n?[{field:t.name,kind:t.type===`crossPackageRef`?`crossPackageRef`:`foreignKey`,relatedCollection:n.model.collection,...Xe(e,t)?{role:`items`}:{}}]:[]})}function M(e){let t=Ze(e);return{name:e.collection,objectRef:e.id,className:e.name,idField:`id`,fields:Object.fromEntries(e.fields.map(t=>[t.name,Je(e,t)])),...t.length?{relationships:t}:{}}}function Qe(e,t){return{objectRef:e.id,fields:Object.fromEntries(t.map((e,t)=>[e.name,{visibility:`basic`,label:e.label,help:e.help??null,order:t,required:e.required}]))}}function $e(e,t){let n=new Set(t);for(let t of e)for(let e of t.models)n.add(e);return n}function et(e){return g(e.replace(/_?id$/i,``)||e)}function N(e,t,n){let r=Ce(e,t),i=Se(e,t).filter(e=>e.model.exposed&&n.has(e.model.id)),a=new Set(ve(e,t,o).map(e=>e.id)),s=new Map;for(let e of i)s.set(e.model.id,(s.get(e.model.id)??0)+1);let c=i.map(e=>{let t=a.has(e.model.id)?`items`:`children`,n=M(e.model),i=C(n),o=[e.fk];return{model:e.model.id,field:e.fk,label:(s.get(e.model.id)??0)>1?`${xe(e.model.name,r)} (${et(e.fk).toLowerCase()})`:xe(e.model.name,r),kind:t,columns:t===`items`?He(n,i,{exclude:o}):Ve(n,i,{exclude:o,max:5}),...t===`items`&&`sortOrder`in n.fields?{sort:`sortOrder`}:{}}});for(let n of _e(e,t))c.push({model:n.model.id,field:n.fk,label:et(n.fk),kind:`reference`});return c}var tt=Symbol(`smrt-cookbook`);function nt(){return t(tt)}function rt(e,t){let{sections:n}=t;if(!n)throw Error(`the cookbook widget context is missing`);let r=typeof e.section==`string`?e.section:``,i=r?n.find(e=>e.id===`section:${r}`||e.id===`custom:${r}`)?.id:t.overviewId;if(!i)throw Error(`unknown section ${r}`);return pe(n,i)}function it(e){return e?async(t,n)=>{let r=rt(t,n);try{let t=await e(n,r.items.map(e=>({...e})));if(!Array.isArray(t))return r;let i=new Set,a=[];for(let e of t){if(!e||typeof e.href!=`string`)continue;let t=typeof e.id==`string`&&e.id?e.id:e.href;i.has(t)&&(t=`${t}#${a.length}`),i.add(t),a.push({...e,id:t})}return{items:a}}catch(e){if(n.signal?.aborted)throw e;return r}}:rt}var at=new Set([`foreignKey`,`crossPackageRef`]);function P(e,t){return`/m/${e}/${t}/`}function ot(e,t,n,r=`view`){let i=`${P(e,t)}${encodeURIComponent(n)}/`;return r===`edit`?`${i}edit/`:i}function st(e,t,n,r){return`${P(e,t)}?${encodeURIComponent(n)}=${encodeURIComponent(r)}`}function ct(e,t){let n=new URLSearchParams(e);for(let e of t.fields){if(!at.has(e.type))continue;let t=n.get(e.name);if(t)return{field:e.name,equals:t}}}function lt(e){return e?.equals===void 0?``:`${encodeURIComponent(e.field)}=${encodeURIComponent(e.equals)}`}function ut(e,t,n){let r=n.filter(t=>t.model.id===e&&t.filter);if(t){let e=r.find(e=>e.key===t)?.filter;return e?{field:e.field,equals:e.value}:void 0}let i=r[0]?.filter;if(!i)return;let a=r.map(e=>e.filter).filter(e=>e?.field===i.field).map(e=>String(e?.value));return{field:i.field,notIn:[...new Set(a)]}}function dt(e,t){if(!e)return!0;let n=String(t[e.field]??``);return e.equals===void 0?!e.notIn?.includes(n):n===e.equals}function ft(e){return e?.equals===void 0?{}:{[e.field]:e.equals}}var F=e=>typeof e==`number`&&Number.isSafeInteger(e)?e:null,pt=(e,t)=>e.fields.some(e=>e.name===t);function mt(e,t){let n=C(M(e)),r=ce(t,n);return Object.values(r).some(e=>F(e)!==null)?r:void 0}function ht(e,t){return!!e.fields.find(e=>e.name===`status`)?.enum?.includes(`draft`)&&typeof t.status==`string`&&t.status!==``&&t.status!==`draft`}function gt(e,t,n){if(!ht(e,t)||![`subtotal`,`taxAmount`,`totalAmount`,`discountTotal`].every(t=>pt(e,t)))return;let r=F(t.subtotal),i=F(t.taxAmount),a=F(t.totalAmount),o=F(t.discountTotal)??0;if(r===null||i===null||a===null)return;let s=l(t,`exclusive`);return{subtotal:r,discount:o,tax:i,total:a,lineAmountType:s,roundingScope:u(t,`line`),showNetSubtotal:s===`inclusive`,taxes:_(n,s).flatMap(e=>e.taxComponentId?[{taxComponentId:e.taxComponentId,name:e.name,percent:e.percent,taxable:e.taxable,tax:e.tax}]:[])}}var I=x();function L(e){let{source:t,href:n}=e;if(!t||!n)throw Error(`the planner widget context is missing`);return{source:t,href:n}}function R(e){let t=typeof e==`string`?p(e):void 0;if(!t)throw Error(`unknown model ${String(e)}`);return{model:t.model,packageId:t.pkg.id,path:P(t.pkg.id,t.model.name)}}var z=new Set([`foreignKey`,`crossPackageRef`]);function B(e,t,n){let r=e.filter;if(typeof r!=`string`||r===``)return;if(r!==`parent`)throw Error(`unknown filter ${r}`);let{record:i}=t;if(!i?.id)throw Error(`the parent filter needs a record`);let a=typeof e.parentField==`string`&&e.parentField?e.parentField:e.field,o=typeof a==`string`?a:``,s=n.fields.find(e=>e.name===o);if(!s||!z.has(s.type))throw Error(`${n.name} has no reference field ${o}`);return{field:o,id:i.id}}async function _t(e,t,n){return n?e.listWhere(t,n.field,n.id):e.list(t)}function vt(e,t,n){return e(n?st(t.packageId,t.model.name,n.field,n.id):t.path)}var V=e=>typeof e==`number`&&Number.isFinite(e);async function yt(e,t){let{source:n,href:r}=L(t),i=R(e.model),{model:a}=i,o=B(e,t,a),s=await _t(n,a,o),l=vt(r,i,o),u=typeof e.measure==`string`?e.measure:``;if(u===`count`||u===``)return{value:s.length,format:`integer`,href:l};let d=a.fields.find(t=>t.name===e.field);if(!d||d.type!==`integer`&&d.type!==`decimal`)throw Error(`${u} needs a numeric field of ${a.name}`);let f=s.map(e=>e[d.name]).filter(V),p=0;if(f.length){if(u===`sum`||u===`avg`)p=f.reduce((e,t)=>e+t,0),u===`avg`&&(p/=f.length);else if(u===`min`)p=Math.min(...f);else if(u===`max`)p=Math.max(...f);else throw Error(`unknown measure ${u}`)}let m=c(d);return{value:m?Math.round(p):p,format:m?`money`:d.type===`integer`?`integer`:`decimal`,...m?{currency:`USD`}:{},href:l}}function bt(e,t){return V(e)&&V(t)?e-t:String(e??``).localeCompare(String(t??``))}var xt=new Set([`createdAt`,`updatedAt`]),St=[`identifier`,`status`,`date`,`money`,`quantity`,`party`,`title`];function Ct(e=[]){return St.find(t=>e.includes(t))}function wt(e,t,n,r){let i=M(e),a=r?[r]:[],o=S(n);if(o.length===0)return Ve(i,t,{exclude:a,max:5});let s=[...He(i,t,{exclude:a}),...Ve(i,t,{exclude:a,max:o.length+8})];return o.map(n=>{let r=e.fields.find(e=>e.name===n);if(!r)throw Error(`${e.name} has no field ${n}`);let i=s.find(e=>e.key===n);if(i)return i;let a=Ct(t[n]);return{key:n,label:z.has(r.type)?g(n.replace(/Id$/,``)):g(n),...a?{role:a}:{}}})}var Tt=new Set([`money`,`quantity`]);function Et(e,t){let n={};for(let r of e)(r.summarize??Tt.has(r.role))&&(n[r.key]=t.reduce((e,t)=>{let n=t[r.key];return V(n)?e+n:e},0));return n}function Dt(e,t){let n=w(M(e)),r=new Set(t.map(e=>n?e[n]:void 0).filter(e=>typeof e==`string`&&e!==``));return r.size===1?[...r][0]??`USD`:`USD`}async function Ot(e,t){let{source:n,href:r}=L(t),i=R(e.model),{model:a}=i,o=B(e,t,a),s=await _t(n,a,o);if(typeof e.sort==`string`&&e.sort){if(!a.fields.find(t=>t.name===e.sort)&&!xt.has(e.sort))throw Error(`${a.name} has no field ${e.sort}`);let t=s.some(t=>t[e.sort]!==void 0)?e.sort:It(a)?.name;if(t){let n=e.direction===`asc`?1:-1;s=[...s].sort((e,r)=>n*bt(e[t],r[t]))}}let c=wt(a,C(M(a)),e.columns,o?.field),l=V(e.limit)?e.limit:5,u=s.slice(0,l),d=a.fields.filter(e=>z.has(e.type)&&c.some(t=>t.key===e.name)),f=await de(n,d,u),p=e=>Object.fromEntries(c.map(t=>{let n=e[t.key],r=d.find(e=>e.name===t.key);return r?.related&&typeof n==`string`&&n?[t.key,f.get(m(r.related,n))??``]:[t.key,n??null]})),h=Et(c,s),g=!Me(a);return{rows:await Promise.all(u.map(async e=>({id:String(e.id),title:await ue(n,a,e,0,o?.field),...g?{href:r(ot(i.packageId,a.name,String(e.id)))}:{},cells:p(e)}))),total:s.length,...g?{href:vt(r,i,o)}:{},columns:c,currency:Dt(a,s),...Object.keys(h).length?{summaries:h}:{}}}var kt={"7d":7,"30d":30,"90d":90,"12m":365,all:null},At=864e5;function jt(e){return e===`7d`||e===`30d`?`day`:e===`90d`?`week`:`month`}function Mt(e,t){let n=new Date(e);if(t===`month`)return Date.UTC(n.getUTCFullYear(),n.getUTCMonth(),1);let r=Date.UTC(n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate());return t===`week`?r-(n.getUTCDay()+6)%7*At:r}function Nt(e,t){if(t===`month`){let t=new Date(e);return Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+1,1)}return e+(t===`week`?7:1)*At}function Pt(e,t){let n=new Date(e).toISOString();return t===`month`?n.slice(0,7):n.slice(0,10)}var Ft=e=>e.type===`datetime`&&!e.system;function It(e){let t=e.fields.filter(Ft);return t.find(e=>/^(issue|order|start|created)/i.test(e.name))??t[0]}function H(e){if(typeof e!=`string`&&typeof e!=`number`)return;let t=new Date(e).getTime();return Number.isFinite(t)?t:void 0}async function Lt(e,t){let{source:n,href:r}=L(t),i=R(e.model),{model:a}=i,o=B(e,t,a),s=typeof e.groupBy==`string`?e.groupBy:``,l=s?a.fields.find(e=>e.name===s):It(a);if(!l)throw Error(s?`${a.name} has no field ${s}`:`${a.name} has no date field to chart; choose a group-by field`);let u=typeof e.measure==`string`?e.measure:``,d;if(u&&u!==`count`){if(u!==`sum`&&u!==`avg`)throw Error(`unknown measure ${u}`);if(d=a.fields.find(t=>t.name===e.field),!d||d.type!==`integer`&&d.type!==`decimal`)throw Error(`${u} needs a numeric field of ${a.name}`)}let f=typeof e.period==`string`?e.period:`30d`;if(!Object.hasOwn(kt,f))throw Error(`unknown period ${f}`);let p=kt[f],m=Ft(l),h=m?l:It(a),g=p!==null&&h?v-p*At:-1/0,_=await _t(n,a,o);h&&g!==-1/0&&(_=_.filter(e=>{let t=H(e[h.name]);return t!==void 0&&t>=g&&t<=v}));let y=new Map,b=(e,t,n)=>{let r=y.get(e)??{key:t,sum:0,n:0};if(d){let e=n[d.name];if(!V(e))return;r.sum+=e}r.n+=1,y.set(e,r)},x=jt(f);if(m){let e=g===-1/0?Math.min(..._.map(e=>H(e[l.name])??v),v):g;for(let t=Mt(e,x);t<=v;t=Nt(t,x))y.set(Pt(t,x),{key:t,sum:0,n:0});for(let e of _){let t=H(e[l.name]);if(t===void 0)continue;let n=Mt(t,x);b(Pt(n,x),n,e)}}else for(let e of _){let t=e[l.name],n=t==null||t===``?`(none)`:String(t);b(n,n,e)}let S=d?c(d):!1,C=e=>{if(!d)return e.n;let t=u===`avg`&&e.n?e.sum/e.n:e.sum;return S?Math.round(t):t},w=[...y.entries()].map(([e,t])=>({label:e,value:C(t),key:t.key}));return w=m?w.sort((e,t)=>Number(e.key)-Number(t.key)):w.sort((e,t)=>t.value-e.value||e.label.localeCompare(t.label)),{points:w.map(({label:e,value:t})=>({label:e,value:t})),format:d?S?`money`:d.type===`integer`?`integer`:`decimal`:`integer`,...S?{currency:`USD`}:{},href:vt(r,i,o)}}var Rt=async(e,t)=>{let{source:n,entryIndex:r}=e;if(!n||!r)throw Error(`the planner widget context is missing`);return Promise.all(t.map(async e=>{let t=r.get(e.id??``);if(!t)return e;let i=await n.list(t.model);return{...e,count:i.filter(e=>dt(t.scope,e)).length}}))};fe(I,{metric:yt,records:Ot,chart:Lt,shortcuts:Rt,shortcuts:it(Rt)});function zt(e){let{relations:t,viewAllHref:n}=e;if(!t)throw Error(`the record page context is missing`);return{relations:t,records:Ot,viewAllHref:n}}async function Bt(e,t){let{source:n}=L(e),r=e.record;if(!r?.id)throw Error(`line items need a record`);let{model:i}=R(r.model),a=await n.get(i,r.id);if(!a)return{};let o=t.find(e=>e.kind===`items`),s=o?p(o.model)?.model:void 0,c=gt(i,a,o&&s?await n.listWhere(s,o.field,r.id):[]),l=c?void 0:mt(i,a),u=w(M(i)),d=u?a[u]:void 0;return{...c?{storedTotals:c}:{},...l?{totals:l}:{},...typeof d==`string`&&d?{currency:d}:{}}}I.register(ie((e,t)=>ae(zt(t))(e,t))),I.register(se(async(e,t)=>{let n=zt(t),{totals:r,storedTotals:i,currency:a}=await Bt(t,n.relations);return he({...n,totals:()=>r,storedTotals:()=>i,currency:()=>a})(e,t)}));var Vt=[`shortcuts`,`metric`,`records`,`chart`,`note`],Ht={},Ut=async(e,t)=>{let n=Ht[e];if(n)return(await n())[t]},Wt=E.filter(e=>e.surfaces?.some(e=>e.kind===`widget`)),Gt=Wt.flatMap(e=>(e.surfaces??[]).flatMap(e=>e.kind===`widget`?[e.type]:[]));Re(I,Wt,Ut);var Kt=new Map(ye(E).map(e=>[`section:${e.id}`,e])),qt=h.packages.flatMap(e=>e.models.map(e=>e.id)),Jt=[...Vt,...Gt];function Yt(e){let t=Kt.get(e);for(let e of t?.recipes??[]){let t=Ne(e)[0];if(t)return{id:t.model.id,name:g(t.model.name)}}}function Xt(e){let t=[{id:`shortcuts`,type:`shortcuts`,span:4,options:{}}],n=Yt(e);return n&&t.push({id:`count`,type:`metric`,span:1,options:{title:d(n.name),model:n.id,measure:`count`}},{id:`latest`,type:`records`,span:3,options:{title:`${n.name} records`,model:n.id,limit:5}}),t}var Zt=new Map;function Qt(e){if(!ee.test(e))return;let t=Zt.get(e);return t||(t=T({id:e,allowed:Jt,models:qt,defaults:Xt(e)}),Zt.set(e,t)),t}function $t(e,t){return`detail:${e}.${t}`}var en=new Map(h.packages.flatMap(e=>e.models.filter(e=>e.exposed).map(t=>[ne(t.id),{packageId:e.id,model:t}])));function U(e){let[,t,n]=/^detail:([A-Za-z0-9_-]+)\.([A-Za-z0-9_]+)$/.exec(e)??[],r=t&&n?f(t,n):void 0;return t&&r?.exposed?{packageId:t,model:r}:en.get(e)}var tn=new Set(h.packages.flatMap(e=>e.models.filter(e=>e.exposed).map(e=>e.id))),nn=new Map;function rn(e){let t=nn.get(e);if(t)return t;let n=U(e);if(!n)return;let r=N(h,n.model.id,tn),i=me(M(n.model),r,{id:e,maxMetrics:2*r.length});return t=T({...i,maxWidgets:Math.max(i.maxWidgets??24,i.defaults.length+24)}),nn.set(e,t),t}function an(e,t){let n=rn(e),r=U(e);if(!n||!r)return;let i=N(h,r.model.id,t),a=0,o=n.defaults.filter(e=>e.type===`line-items`?i.some(e=>e.kind===`items`):e.type===`related`?i.some(e=>e.kind===`children`):t.has(String(e.options.model))?e.type!==`metric`||(a+=1,a<=4):!1);return T({...n,defaults:o})}function on(e){return e.startsWith(`detail:`)?rn(e):Qt(e)}function sn(e,t){return Kt.has(e)||e===`section:${Oe.id}`?!0:e.startsWith(`detail:`)?U(e)!==void 0:e.startsWith(`custom:`)&&ee.test(e)&&(t?.customSections??[]).some(t=>t.id===e)}var cn=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function ln(e,t){let n=t.widgetId?`widget ${t.widgetId}${t.type?` (${t.type})`:``}`:`an entry`,r=t.options?.length?`: ${t.options.map(e=>`${e.key} ${e.code}`).join(`, `)}`:``;return`Overview ${e}: ${n} was dropped (${t.code}${r}).`}function un(e,t){let n={...e};return e.added&&(n.added=e.added.filter(e=>!t.has(e.id))),e.changed&&(n.changed=Object.fromEntries(Object.entries(e.changed).filter(([e])=>!t.has(e)))),n}function dn(e,t){let n=on(e);if(!n)return{override:null,issues:[{widgetId:null,type:null,code:`malformed`,message:`not an overview id`}]};let r=le(n,t,I);if(r.ok)return{override:r.override,issues:[]};let i=te(t),a=new Set(r.issues.flatMap(e=>e.widgetId?[e.widgetId]:[]));if(!i.override)return{override:null,issues:r.issues};let o=le(n,un(i.override,a),I);return o.ok?{override:o.override,issues:r.issues}:{override:null,issues:[...r.issues,...o.issues]}}function fn(e,t){if(!cn(e))return null;let n=[],r=[];for(let i of Object.keys(e).sort()){if(!sn(i,t)){r.push(`Overview ${i} is not a page in this app and was dropped.`);continue}let{override:a,issues:o}=dn(i,e[i]);for(let e of o)r.push(ln(i,e));a&&n.push([i,a])}return{overviews:Object.fromEntries(n),dropped:r}}var W=b,pn=`glass`,mn=`system`,hn=[`light`,`dark`,`system`],gn=[`none`,`sm`,`md`,`lg`,`xl`,`full`],_n=[`comfortable`,`touch`],vn=[`auto`,`standard`,`more`],G={"system-ui":`system-ui, -apple-system, "Segoe UI", sans-serif`,Inter:`Inter, system-ui, sans-serif`,Georgia:`Georgia, "Times New Roman", serif`,"ui-rounded":`ui-rounded, "SF Pro Rounded", system-ui, sans-serif`,"ui-monospace":`ui-monospace, "SF Mono", Menlo, monospace`},yn=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;function bn(e){if(typeof e!=`string`)return null;let t=yn.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase();return n.length===3&&(n=[...n].map(e=>e+e).join(``)),`#${n}`}var xn=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Sn(e){if(e===void 0)return{ok:!0,theme:void 0};if(!xn(e))return{ok:!1,error:`The cookbook "theme" must be an object.`};let t={};if(e.preset!==void 0){if(typeof e.preset!=`string`||!W.includes(e.preset))return{ok:!1,error:`The theme preset must be one of ${W.join(`, `)}.`};t.preset=e.preset}if(e.colorScheme!==void 0){if(!hn.includes(e.colorScheme))return{ok:!1,error:`The theme colorScheme must be light, dark or system.`};t.colorScheme=e.colorScheme}for(let[n,r]of[[`borderRadius`,gn],[`density`,_n],[`contrast`,vn]]){let i=e[n];if(i!==void 0){if(!r.includes(i))return{ok:!1,error:`The theme ${n} must be one of ${r.join(`, `)}.`};t[n]=i}}if(e.fontFamily!==void 0){if(typeof e.fontFamily!=`string`||!Object.hasOwn(G,e.fontFamily))return{ok:!1,error:`The theme font must be one of ${Object.keys(G).join(`, `)}.`};t.fontFamily=e.fontFamily}if(e.custom!==void 0){if(!xn(e.custom))return{ok:!1,error:`The theme "custom" must be an object.`};let n=bn(e.custom.primary);if(!n)return{ok:!1,error:`The theme custom primary must be a hex colour like #c2410c.`};let r={primary:n};if(e.custom.fontFamily!==void 0){let t=e.custom.fontFamily;if(typeof t!=`string`||!Object.hasOwn(G,t))return{ok:!1,error:`The theme font must be one of ${Object.keys(G).join(`, `)}.`};r.fontFamily=t}t.custom=r}if(e.customCss!==void 0){if(typeof e.customCss!=`string`)return{ok:!1,error:`The theme customCss must be a string.`};if(Array.from(e.customCss).length>65536)return{ok:!1,error:`The theme customCss is too long (65,536 characters maximum).`};e.customCss&&(t.customCss=e.customCss)}return{ok:!0,theme:Object.keys(t).length?t:void 0}}function Cn(e){if(!e)return;let t={};return e.preset&&(t.preset=e.preset),e.colorScheme&&(t.colorScheme=e.colorScheme),e.borderRadius&&(t.borderRadius=e.borderRadius),e.density&&(t.density=e.density),e.contrast&&(t.contrast=e.contrast),e.fontFamily&&(t.fontFamily=e.fontFamily),e.custom&&(t.custom={...e.custom}),e.customCss&&(t.customCss=e.customCss),Object.keys(t).length?t:void 0}function wn(e){let t=e?.colorScheme??`system`,n=e?.custom?`brand colour ${e.custom.primary}`:e?.preset??`glass`;return t===`system`?n:`${n}, ${t}`}var K=`section:`;function Tn(e,t=Pe(E)){let n=Object.keys(t).sort((e,t)=>t.length-e.length);if(!n.length)return e;let r=e=>{if(!e.startsWith(K))return e;let r=e.slice(8);for(let e of n){if(r===e)return`${K}${t[e]}`;if(r.startsWith(`${e}:`))return`${K}${t[e]}${r.slice(e.length)}`}return e},i=e=>e.startsWith(K)&&n.includes(e.slice(8)),a=e=>[...new Set(e)],o={...e};if(e.sectionOrder&&(o.sectionOrder=a(e.sectionOrder.map(r))),e.hidden&&(o.hidden=a(e.hidden.filter(e=>!i(e)).map(r))),e.itemOrder){let t={};for(let[n,i]of Object.entries(e.itemOrder)){let e=r(n);t[e]=a([...t[e]??[],...i.map(r)])}o.itemOrder=t}return e.moved&&(o.moved=Object.fromEntries(Object.entries(e.moved).map(([e,t])=>[r(e),r(t)]))),o}function En(e,t=E){let n=new Map;for(let e of t){let t=be(e).id;for(let r of Ne(e))r.key&&n.set(`${K}${t}:${r.packageId}:${r.model.name}:${r.label}`,ge(r.packageId,r.model.name,r.key))}let r=e=>{let t=n.get(e);if(t)return t;if(!e.startsWith(K))return e;let r=e.slice(8).split(`:`);return r.length<3||!r[1]||!r[2]?e:ge(r[1],r[2])},i=e=>[...new Set(e)],a=(e,t)=>{let n={};for(let[i,a]of Object.entries(e)){let e=r(i);e in n||(n[e]=t(a))}return n},o={...e};return e.hidden&&(o.hidden=i(e.hidden.map(r))),e.itemOrder&&(o.itemOrder=a(e.itemOrder,e=>i(e.map(r)))),e.moved&&(o.moved=a(e.moved,r)),e.items&&(o.items=a(e.items,e=>e)),o}var q=`https://s-m-r-t.dev/schemas/cookbook/v1.json`,Dn=new Set([`basic`,`advanced`,`hidden`]),On=new Set([`api`,`mcp`,`cli`]),J=e=>({ok:!1,error:e}),Y=e=>typeof e==`object`&&!!e&&!Array.isArray(e),X=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function kn(e,t){if(!Y(e))return`${t} is not an object`;let{objectRef:n,fieldName:r}=e;if(typeof n!=`string`||!n)return`${t} has no objectRef`;if(typeof r!=`string`||!r)return`${t} has no fieldName`;if(e.scopeType!==`app`)return`${t} must have scopeType "app"`;let i={objectRef:n,fieldName:r,scopeType:`app`};for(let n of[`defaultValue`,`help`,`label`]){let r=e[n];if(r!==void 0){if(typeof r!=`string`&&r!==null)return`${t}.${n} is invalid`;i[n]=r}}if(e.visibility!==void 0){let n=e.visibility;if(n!==null&&!(typeof n==`string`&&Dn.has(n)))return`${t}.visibility is invalid`;i.visibility=n}if(e.displayOrder!==void 0){let n=e.displayOrder;if(n!==null&&!(typeof n==`number`&&Number.isFinite(n)))return`${t}.displayOrder is invalid`;i.displayOrder=n}if(e.locked!==void 0){if(e.locked!==null&&typeof e.locked!=`boolean`)return`${t}.locked is invalid`;i.locked=e.locked}return i}function An(e){if(!Y(e)||e.version!==1)return`layout must be an object with version 1`;for(let t of[`sectionOrder`,`hidden`])if(e[t]!==void 0&&!X(e[t]))return`layout.${t} must be a list of strings`;for(let t of[`itemOrder`,`moved`,`panels`])if(e[t]!==void 0&&!Y(e[t]))return`layout.${t} must be an object`;let t=e.itemOrder;if(Y(t)){for(let[e,n]of Object.entries(t))if(e===`__proto__`||!X(n))return`layout.itemOrder.${e} must be a list of strings`}let n=e.moved;if(Y(n)){for(let[e,t]of Object.entries(n))if(e===`__proto__`||typeof t!=`string`)return`layout.moved.${e} must be a string`}return e}function jn(e,t={}){if(!Y(e))return J(`This is not a cookbook: expected a JSON object.`);if(e.$schema!==void 0&&e.$schema!==`https://s-m-r-t.dev/schemas/cookbook/v1.json`&&e.$schema!==`https://s-m-r-t.dev/schemas/blueprint/v1.json`)return J(`This is not a cookbook: its "$schema" is not a cookbook schema this planner knows.`);let{version:n}=e;if(n===void 0)return J(`This is not a cookbook: it has no "version".`);if(typeof n!=`number`||!Number.isInteger(n))return J(`The cookbook "version" must be a whole number.`);if(n>1)return J(`This cookbook is version ${n}, newer than this planner understands (1). Update the planner or re-export it.`);if(n!==1)return J(`Cookbook version ${n} is not supported (this planner reads version 1).`);if(!X(e.recipes))return J(`The cookbook "recipes" must be a list of recipe ids.`);let r=e.recipes.filter(e=>!O.has(e)),i=[...new Set([...Ee(e.recipes.filter(e=>O.has(e)),O),...r])].sort(),a=[];if(e.features!==void 0){if(!X(e.features))return J(`The cookbook "features" must be a list of model names.`);let t=new Set;for(let n of e.features){if(t.has(n))return J(`The cookbook lists the feature ${n} more than once.`);t.add(n)}a=[...e.features].sort()}let o=new Set([...i.flatMap(e=>O.get(e)?.models??[]),...a]);if(!Array.isArray(e.policies))return J(`The cookbook "policies" must be a list.`);let s=[];for(let[t,n]of e.policies.entries()){let e=kn(n,`policies[${t}]`);if(typeof e==`string`)return J(`Invalid cookbook: ${e}.`);(o.has(e.objectRef)||we(e))&&s.push(e)}let c;if(e.exposure!==void 0){if(!Y(e.exposure))return J(`The cookbook "exposure" must be an object.`);let t=[];for(let[n,r]of Object.entries(e.exposure)){if(!X(r)||!r.every(e=>On.has(e)))return J(`Invalid cookbook: exposure for ${n} must list api, mcp or cli.`);r.length&&o.has(n)&&t.push([n,[...r]])}c=Object.fromEntries(t)}let l;if(e.layout!==void 0){let t=An(e.layout);if(typeof t==`string`)return J(`Invalid cookbook: ${t}.`);l=En(Tn(t))}let u;if(e.theme!==void 0){let n=Sn(e.theme);if(n.ok)u=n.theme;else if(!t.dropUnknownRecipes)return J(n.error)}let d,f=[];if(e.overviews!==void 0){if(t.overviews){let n=t.overviews(e.overviews,l);if(!n)return J(`The cookbook "overviews" must be an object.`);d=n.overviews,f=n.dropped}else{if(!Y(e.overviews))return J(`The cookbook "overviews" must be an object.`);Object.keys(e.overviews).length&&(f=[`Page customisations (overviews) are not kept by this host and were dropped.`])}}let p={$schema:q,version:1,recipes:i,features:a,policies:s};for(let t of[`name`,`description`]){let n=e[t];if(n!==void 0){if(typeof n!=`string`)return J(`The cookbook "${t}" must be a string.`);n.trim()&&(p[t]=n.trim())}}return c&&Object.keys(c).length&&(p.exposure=c),l&&(p.layout=l),u&&(p.theme=u),d&&Object.keys(d).length&&(p.overviews=d),f.length?{ok:!0,cookbook:p,dropped:f}:{ok:!0,cookbook:p}}var Mn=e=>({ok:!1,error:e});function Nn(e,t={}){return jn(e,{...t,overviews:fn})}function Pn(e,t={}){let n;try{n=JSON.parse(e)}catch{return Mn(`This file is not valid JSON.`)}try{return Nn(n,t)}catch{return Mn(`This file is not a valid cookbook.`)}}var Z=`smrt-planner:cookbook-doc:v1`,Fn=`smrt-planner:blueprint:v1`,In=`smrt-planner:cookbook-doc:unreadable`;function Ln(){try{return globalThis.localStorage??null}catch{return null}}function Rn(e){if(!e)return{status:`unavailable`};let t;try{t=e.getItem(Z)}catch{return{status:`unavailable`}}let n=null;try{n=e.getItem(Fn)}catch{}let r=t===null&&n!==null,i=r?n:t;if(i===null)return{status:`empty`};let a=Pn(i,{dropUnknownRecipes:!0});if(a.ok)return r&&Q(e,Z,JSON.stringify(a.cookbook)),{status:`loaded`,cookbook:a.cookbook,previousKept:n!==null,...a.dropped?{dropped:a.dropped}:{}};t=i;let o=Q(e,In,t);return{status:`unreadable`,reason:a.error,keptAside:o}}function Q(e,t,n){if(!e)return!1;try{return e.setItem(t,n),!0}catch{return!1}}function zn(e,t){if(!e)return!1;try{return e.removeItem(t),!0}catch{return!1}}function Bn(e,t){return Q(e,Z,JSON.stringify(t))}function Vn(e,t={}){let n={$schema:q,version:1,...Ae(e)};t.name&&(n.name=t.name),t.description&&(n.description=t.description),t.layout&&(n.layout=t.layout);let r=Cn(t.theme);r&&(n.theme=r);let i=t.overviews??{},a=Object.keys(i).sort();return a.length&&(n.overviews=Object.fromEntries(a.map(e=>[e,i[e]]))),n}var Hn=new Set([`basic`,`advanced`,`hidden`]),Un=new Set([`api`,`mcp`,`cli`]);function Wn(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t+`=`.repeat((4-t.length%4)%4));return new TextDecoder().decode(Uint8Array.from(n,e=>e.charCodeAt(0)))}function Gn(e){let t=new URLSearchParams(e);return t.has(`r`)||t.has(`o`)}function Kn(e){let t={rows:[],narrowed:{}};if(!e)return t;let n;try{n=JSON.parse(Wn(e))}catch{return t}if(!n||typeof n!=`object`)return t;let r=[];for(let[e,t]of Object.entries(n.r??{}))if(t&&typeof t==`object`)for(let[n,i]of Object.entries(t)){if(!i||typeof i!=`object`)continue;let t={objectRef:e,fieldName:n,scopeType:`app`};typeof i.v==`string`&&Hn.has(i.v)&&(t.visibility=i.v),typeof i.l==`string`&&(t.label=i.l),(typeof i.h==`string`||i.h===null)&&(t.help=i.h),(typeof i.d==`string`||i.d===null)&&(t.defaultValue=i.d),typeof i.o==`number`&&Number.isFinite(i.o)&&(t.displayOrder=i.o),typeof i.k==`boolean`&&(t.locked=i.k),r.push(t)}let i={};for(let[e,t]of Object.entries(n.x??{})){if(!Array.isArray(t))continue;let n=t.filter(e=>Un.has(e));n.length&&(i[e]=n)}return{rows:r,narrowed:i}}function qn(e){let t=new URLSearchParams(e),n=(t.get(`r`)??``).split(`,`).filter(Boolean),r=Ee(ke(n,O),O),i=new Set(r.flatMap(e=>O.get(e)?.models??[])),{rows:a,narrowed:o}=Kn(t.get(`o`)??``),s={$schema:q,version:1,recipes:r,features:[],policies:a.filter(e=>i.has(e.objectRef))},c=Object.fromEntries(Object.entries(o).filter(([e])=>i.has(e)));return Object.keys(c).length&&(s.exposure=c),s}var Jn=`smrt-planner:shell`;function $(e){let t=je(e),n=e.policies.some(e=>e.defaultValue!==void 0&&we(e));s(De(e)||n?t.taxRate:void 0),a({pricesIncludeTax:t.pricesIncludeTax,taxRounding:t.taxRounding,currency:t.currency})}var Yn=new class{#e=r();get layout(){return e(this.#e)}set layout(e){i(this.#e,e,!0)}#t=r();get name(){return e(this.#t)}set name(e){i(this.#t,e,!0)}#n=r();get description(){return e(this.#n)}set description(e){i(this.#n,e,!0)}#r=r();get theme(){return e(this.#r)}set theme(e){i(this.#r,e,!0)}#i=r({});get overviews(){return e(this.#i)}set overviews(e){i(this.#i,e)}#a=r(`unknown`);get persist(){return e(this.#a)}set persist(e){i(this.#a,e,!0)}#o=r(!1);get loaded(){return e(this.#o)}set loaded(e){i(this.#o,e,!0)}hostManaged=!1;#s=r(``);get loadNotice(){return e(this.#s)}set loadNotice(e){i(this.#s,e,!0)}saveBlocked=!1;#c=r(!1);get keepLegacyUrl(){return e(this.#c)}set keepLegacyUrl(e){i(this.#c,e,!0)}replacedBeforeLoad=!1;previousKept=!1;storage=null;timer;snapshot(){return Vn(n(D.data),{layout:n(this.layout),theme:n(this.theme),overviews:n(this.overviews),name:this.name,description:this.description})}overview(e){return Object.hasOwn(this.overviews,e)?this.overviews[e]:null}setOverview(e,t){let n=Object.fromEntries(Object.entries(this.overviews).filter(([t])=>t!==e));t&&(n[e]=t),this.overviews=n}setLayout(e){this.layout=y(e)?void 0:e}apply(e){D.load(e),this.layout=e.layout,this.theme=e.theme,this.name=e.name,this.description=e.description,this.overviews={...e.overviews??{}},$(e)}get unavailableNotice(){let e=[...D.unavailableRecipes,...D.unavailableFeatures];if(!e.length)return``;let t=e.length;return`${t} ${t===1?`recipe`:`recipes`} in this cookbook ${t===1?`isn't`:`aren't`} available in this version: ${e.join(`, `)}. They are kept when you save or export.`}removeUnavailable(){D.removeUnavailable(),this.scheduleSave()}setTheme(e){this.theme=Cn(e)}settings(){return je(this.snapshot())}setSettings(e){let t=Te(this.snapshot(),e);D.rows=t.policies.map(e=>({...e})),$(t)}replace(e){this.apply(e),this.loaded||(this.replacedBeforeLoad=!0),this.saveBlocked=!1,this.keepLegacyUrl=!1}reset(){D.clear(),$({policies:[]}),this.layout=void 0,this.theme=void 0,this.name=void 0,this.description=void 0,this.overviews={};try{globalThis.localStorage?.removeItem(Jn)}catch{}this.saveBlocked=!1,this.keepLegacyUrl=!1}importText(e){let t=Pn(e);return t.ok&&this.replace(t.cookbook),t}hydrate(e,t=Ln()){this.storage=t;let n=Rn(t);n.status===`loaded`&&(this.previousKept=n.previousKept),n.status===`loaded`&&!this.replacedBeforeLoad?(this.apply(n.cookbook),n.dropped?.length&&(this.loadNotice=`Some saved page customisations could not be used and were removed: ${n.dropped.join(` `)}`)):n.status===`unreadable`&&(this.saveBlocked=!n.keptAside,this.loadNotice=n.keptAside?`The saved cookbook could not be read (${n.reason}) and was kept aside; starting empty.`:`The saved cookbook could not be read (${n.reason}). Starting empty without overwriting it; import or reset to save again.`);let r=!1;if(Gn(e)&&(n.status===`loaded`&&!Q(t,`smrt-planner:cookbook-doc:backup`,JSON.stringify(n.cookbook))&&(this.saveBlocked=!0),this.apply(qn(e)),r=!0),this.persist=n.status===`unavailable`?`memory`:`unknown`,this.loaded=!0,r){let e=this.save();this.keepLegacyUrl=!e}return r}save(){if(clearTimeout(this.timer),this.timer=void 0,!this.loaded)return!1;if(this.hostManaged)return!0;if(this.saveBlocked)return this.persist=`memory`,!1;let e=Bn(this.storage,this.snapshot());return this.persist=e?`ok`:`memory`,e&&this.previousKept&&(this.previousKept=!zn(this.storage,Fn)),e&&(this.keepLegacyUrl=!1),e}scheduleSave(){this.loaded&&!this.hostManaged&&(clearTimeout(this.timer),this.timer=setTimeout(()=>this.save(),300))}flush(){this.timer!==void 0&&this.save()}};export{nt as A,ut as C,ct as D,P as E,N as M,M as N,lt as O,Qe as P,dt as S,st as T,bn as _,Ln as a,Qt as b,q as c,mn as d,pn as f,wn as g,W as h,Z as i,$e as j,ot as k,gn as l,G as m,Yn as n,Nn as o,_n as p,$ as r,Pn as s,Jn as t,vn as u,an as v,ft as w,I as x,$t as y};
@@ -1 +1 @@
1
- import{$ as e,B as t,Ct as n,Dt as r,Ft as i,G as a,H as o,L as s,O as c,Ot as l,P as u,Pt as d,U as f,W as p,X as m,Y as h,Z as g,_,a as v,b as y,bt as b,ct as x,ft as S,gt as C,ht as w,mt as T,pt as E,st as D,tt as O,v as k,vt as A,wt as j,xt as M,z as N}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{O as P,c as F,ft as I,gt as L,h as R,l as z,m as B,p as ee}from"./rkUL-DlL.js";import{_ as V,i as H,o as U,y as W}from"./gMSmS-_y.js";import{a as te,c as ne,i as re,l as ie,o as ae,p as G,s as oe}from"./DgkBKeKW.js";import{b as K,t as q}from"./U6_OBRq_.js";import{r as J}from"./D_U_DYjx.js";import{a as Y,c as se,d as ce,f as le,i as ue,n as de,o as fe,p as pe,r as X,s as me,u as he}from"./2l76O8yg.js";import{a as ge,c as _e,i as ve,l as ye,n as be,o as xe,r as Se,s as Ce,t as we,u as Te}from"./DveAWx7t.js";function Ee(e){return e.form.kind===`field-map`}function De(e){return e.form.kind===`variant-grid`}function Oe(e,t,n){let r=t.filter(t=>e.includes(t.id));return r.flatMap(e=>(e.forms??[]).filter(e=>e.model===n).map(t=>({recipeId:e.id,form:t,extensions:r.flatMap(e=>(e.extends??[]).filter(e=>e.form===t.id))})))}function ke(e,t){return e.extensions.some(e=>(e.records??[]).some(e=>e.model===t))}function Z(e){return(e.type===`foreignKey`||e.type===`crossPackageRef`)&&typeof e.related==`string`}function Ae(e,t){if(e.type===`boolean`)return`boolean`;if(Z(e))return`relation`;if(e.enum&&e.enum.length>0)return`enum`;if(e.ui?.widget)return e.ui.widget;if(e.type===`json`&&t!==void 0&&(L[t]??[]).includes(e.name))return`address`;if(P(e))return`money`;if(B(e))return`percent`;switch(e.type){case`datetime`:return`datetime`;case`integer`:return`integer`;case`decimal`:return`decimal`;case`json`:return`json`;default:return`text`}}var je=e=>typeof e==`number`&&Number.isFinite(e)?e:0;function Me(e){let t=e.name;if(e.type===`json`)return 99;if(/^(name|title|label|code)$|Number$|^number$/.test(t))return 0;if(t===`reference`&&e.type===`text`)return .5;if(t===`description`&&e.type===`text`)return 5.9;if(Z(e))return/^(customer|vendor|profile)/i.test(t)?1:/^(contract|.*(journal|account))/i.test(t)?7:2;if((e.enum?.length??0)>0&&/(status|state|stage)$/i.test(t))return 3;if(/^(totalAmount|amount|total)$/.test(t))return 4;if(e.type===`datetime`){if(/^start(date|at)?$/i.test(t))return 1.2;if(/^due/i.test(t))return 5;if(/(issue|paid|allocated|^date$)/i.test(t))return 5.2}return 6}function Ne(e,t=6){let n=e.filter(e=>e.type!==`json`),r=new Set(n.slice(0,3)),i=n.filter(e=>r.has(e)||Me(e)<6||[`integer`,`decimal`,`boolean`,`datetime`].includes(e.type)||(e.enum?.length??0)>0||Z(e)).map((e,t)=>({f:e,i:t,rank:Me(e)})).sort((e,t)=>e.rank-t.rank||e.i-t.i).map(e=>e.f),a=n.find(e=>e.name===`totalAmount`);if(a&&n.some(e=>e.name===`amountPaid`)){let e={...a,name:`amountDue`,label:`Amount due`,required:!1,derive:e=>je(e.totalAmount)-je(e.amountPaid)},t=i.findIndex(e=>e.name===`totalAmount`);i.splice(t<0?i.length:t+1,0,e)}let o=n.some(e=>e.name===`allDay`);return i.slice(0,t).map(e=>o&&e.type===`datetime`&&/^(start|end)(date|at)$/i.test(e.name)?{...e,showTime:!0}:e)}function Pe(e,t){return e.derive?e.derive(t):t[e.name]}function Fe(e,t,n){return e.filter(e=>e[t]===n)}function Ie(e){if(e.default!==void 0&&e.default!==null)return e.default;let t=e.enum??[];return t.length>0&&(e.required||/(status|state|stage)$/i.test(e.name))?t.includes(`draft`)?`draft`:t[0]:e.type===`boolean`?!1:e.type===`text`?``:null}function Le(e){let t={};for(let n of e)t[n.name]=Ie(n);return t}function Re(e,t,n){return{...Le(e),[t]:n}}var ze=e=>e==null||typeof e==`string`&&e.trim()===``;function Be(e,t,n=new Set){let r={};for(let i of e)i.required&&i.type!==`boolean`&&!n.has(i.name)&&ze(t[i.name])&&(r[i.name]=`${i.label} is required.`);return r}function Ve(e,t){let n=e.filter(e=>t[e.name]).map(e=>e.label);return n.length===0?``:`Cannot save yet: ${n.join(`, `)} ${n.length===1?`is`:`are`} required.`}function He(e,t,n,r){return G(e,n,(e,t)=>e.related?r.get(R(e.related,t)):void 0,t)??``}function Ue(e){e instanceof HTMLElement&&e.querySelector(`[data-invalid] :is(input, select, textarea, button):not([type="hidden"])`)?.focus()}function Q(e){return{records:[...e.form.records,...e.extensions.flatMap(e=>e.records??[])],fields:[...e.form.fields,...e.extensions.flatMap(e=>e.fields??[])]}}function We(e,t){let{records:n,fields:r}=Q(e);return r.map(e=>({field:e,catalogField:ce(e,n,t),modelId:le(e,n)}))}function Ge(e,t){return Object.fromEntries(We(e,t).map(({field:e,catalogField:t})=>[e.id,he(e,t)]))}function Ke(e){let{records:t}=Q(e),n=t.findIndex(t=>t.model===e.form.model);return n<0?0:n}async function qe(e,t,n,r){let{records:i}=Q(t),a=i[Ke(t)];if(!a)return{};let o=await e.get(n(a.model),r);return Y(e,i,{[a.as]:o},n)}async function Je(e,t,n,r){let{fields:i}=Q(t),a=await qe(e,t,n,r),o=Ge(t,n);return{values:Object.fromEntries(i.map(e=>{let{alias:t,field:n}=me(e.to),r=a[t]?.[n];return[e.id,r===void 0?o[e.id]:r]})),rows:a}}function Ye(e,t,n,r,i={},a={}){let{records:o,fields:s}=Q(e),c=ue(s,n),l=Ke(e),u=new Set;return o.map((e,o)=>{let d=fe(s,e.as,n),f={...pe(e.values,c),...o===l?Object.fromEntries(Object.entries(a).map(([e,t])=>[e,se(t)])):{}},p=t(e.model),m=r===void 0?void 0:i[e.as];try{if(o===l&&r!==void 0){let t=Object.fromEntries(Object.entries(f).filter(([,e])=>de(e)));return{op:`save`,as:e.as,model:p,id:r,values:{...d,...t}}}if(m)return{op:`save`,as:e.as,model:p,id:m.id,values:d};let t=e.match?pe(e.match,c):{},n=Object.values(t).some(e=>de(e)&&!u.has(e.ref))?{}:t,i=Object.keys(n).length>0;return{op:`save`,as:e.as,model:p,...i?{match:n}:{},onCreate:f,values:d}}finally{u.add(e.as)}})}var $=e=>typeof e==`string`&&e!==``?e:void 0;function Xe(e){let t=typeof e==`object`&&e&&!Array.isArray(e)?e:{},n=$(t.country),r=$(t.state);return{...$(t.street1)?{street:t.street1}:{},...$(t.city)?{city:t.city}:{},...r?{province:n===`US`?`US-${r}`:r}:{},...$(t.postalCode)?{postalCode:t.postalCode}:{},...n?{country:n}:{}}}function Ze(e,t){let n=typeof t==`object`&&t&&!Array.isArray(t)?{...t}:{};for(let e of[`street1`,`city`,`state`,`postalCode`,`country`])delete n[e];let r=$(e.province);return{...n,...$(e.street)?{street1:e.street}:{},...$(e.city)?{city:e.city}:{},...r?{state:r.replace(/^US-/,``)}:{},...$(e.postalCode)?{postalCode:e.postalCode}:{},...$(e.country)?{country:e.country}:{}}}function Qe(e){return document.body.appendChild(e),e.showModal(),()=>{e.close(),e.remove()}}function $e(e){let t=[e.status,e.customerType].filter(Boolean).join(` · `);return{id:e.id,label:e.profile.name,...t?{detail:t}:{}}}function et(e){return{id:e.id,label:e.profile.name,...e.status?{detail:e.status}:{}}}function tt(e,t){l(t,!0);let n=v(t,`value`,15,``),i=v(t,`label`,3,`Customer`),a=v(t,`required`,3,!1),o=v(t,`disabled`,3,!1),s=v(t,`createLabel`,3,`New customer`);U(e,{get name(){return t.name},get label(){return i()},get required(){return a()},get disabled(){return o()},get error(){return t.error},get onCreate(){return t.onCreate},get createLabel(){return s()},get onchange(){return t.onchange},search:async e=>(await t.search(e)).map($e),resolve:async e=>{let n=await t.resolve(e);return n?{id:n.id,label:n.profile.name}:null},get value(){return n()},set value(e){n(e)}}),r()}function nt(e,t){l(t,!0);let n=v(t,`value`,15,``),i=v(t,`label`,3,`Vendor`),a=v(t,`required`,3,!1),o=v(t,`disabled`,3,!1),s=v(t,`createLabel`,3,`New vendor`);U(e,{get name(){return t.name},get label(){return i()},get required(){return a()},get disabled(){return o()},get error(){return t.error},get onCreate(){return t.onCreate},get createLabel(){return s()},get onchange(){return t.onchange},search:async e=>(await t.search(e)).map(et),resolve:async e=>{let n=await t.resolve(e);return n?{id:n.id,label:n.profile.name}:null},get value(){return n()},set value(e){n(e)}}),r()}var rt=[{name:`CustomerSelect`,selects:`@happyvertical/smrt-commerce:Customer`,kind:`customer`,component:tt},{name:`VendorSelect`,selects:`@happyvertical/smrt-commerce:Vendor`,kind:`vendor`,component:nt}];function it(e,t=rt){return t.find(t=>t.selects===e)}var at=a(`<label class="plain svelte-1t0u16g"> <input type="text"/></label>`),ot=a(`<dialog class="create svelte-1t0u16g"><!></dialog>`),st=a(`<!> <!>`,1);function ct(a,s){l(s,!0);let d=v(s,`creatable`,3,!0),h=J(),T=n(()=>s.field.related??``),O=n(()=>I(e(T))?.model),j=n(()=>it(e(T))),P=n(()=>d()?Oe(q.ids,K,e(T)).find(Ee):void 0),F=n(()=>e(O)?.name.toLowerCase()??`record`),L=b(C(typeof s.value==`string`?s.value:``));x(()=>{let t=typeof s.value==`string`?s.value:``;t!==e(L)&&A(L,t,!0)});let R=b(!1),z=b(0);function B(){M(z),A(R,!0)}function ee(e){A(R,!1),A(L,e.id,!0),s.onchange(e.id)}function V(e){A(L,e,!0),s.onchange(e===``?null:e)}var H=st(),W=E(H),G=t=>{var n=at(),r=S(n),a=w(r);_(a),i(n),D(()=>{o(r,`${s.label??``} `),k(a,`name`,s.name),a.required=s.required,y(a,e(L))}),m(`input`,a,e=>V(e.currentTarget.value)),f(t,n)},Y=t=>{let r=n(()=>e(j).component);var i=p(),a=E(i);{let t=n(()=>e(P)?B:void 0),i=n(()=>`New ${e(F)}`);u(a,()=>e(r),(n,r)=>{r(n,{get name(){return s.name},get label(){return s.label},get required(){return s.required},search:e=>oe(h,e),resolve:e=>re(h,e),get onCreate(){return e(t)},get createLabel(){return e(i)},onchange:V,get value(){return e(L)},set value(e){A(L,e,!0)}})})}f(t,i)},se=t=>{let r=n(()=>e(j).component);var i=p(),a=E(i);{let t=n(()=>e(P)?B:void 0),i=n(()=>`New ${e(F)}`);u(a,()=>e(r),(n,r)=>{r(n,{get name(){return s.name},get label(){return s.label},get required(){return s.required},search:e=>ie(h,e),resolve:e=>ae(h,e),get onCreate(){return e(t)},get createLabel(){return e(i)},onchange:V,get value(){return e(L)},set value(e){A(L,e,!0)}})})}f(t,i)},ce=t=>{{let r=n(()=>e(P)?B:void 0),i=n(()=>`New ${e(F)}`);U(t,{get name(){return s.name},get label(){return s.label},get required(){return s.required},search:t=>ne(h,e(O),t),resolve:t=>te(h,e(O),t),get onCreate(){return e(r)},get createLabel(){return e(i)},onchange:V,get value(){return e(L)},set value(e){A(L,e,!0)}})}};t(W,t=>{e(O)?e(j)?.kind===`customer`?t(Y,1):e(j)?.kind===`vendor`?t(se,2):t(ce,-1):t(G)});var le=w(W,2),ue=t=>{var n=ot(),r=S(n);N(r,()=>e(z),t=>{wt(t,{get active(){return e(P)},onsaved:ee,oncancel:()=>A(R,!1)})}),i(n),c(n,()=>Qe),D(()=>k(n,`aria-label`,`New ${e(F)}`)),g(`close`,n,()=>A(R,!1)),f(t,n)};t(le,t=>{e(P)&&e(R)&&t(ue)}),f(a,H),r()}h([`input`]);var lt=a(`<div class="percent svelte-n1ol00"><!> <span class="percent-sign svelte-n1ol00" aria-hidden="true">%</span></div>`),ut=a(`<input type="url" class="svelte-n1ol00"/>`),dt=a(`<input type="number" step="1" class="svelte-n1ol00"/>`),ft=a(`<input type="number" step="any" class="svelte-n1ol00"/>`),pt=a(`<textarea rows="3" class="svelte-n1ol00"></textarea>`),mt=a(`<input type="text" class="svelte-n1ol00"/>`),ht=a(`<!> <!>`,1),gt=a(`<p class="field-error svelte-n1ol00" role="alert"> </p>`),_t=a(`<small class="svelte-n1ol00"> </small>`),vt=a(`<div class="field svelte-n1ol00"><!> <!> <!></div>`);function yt(a,s){l(s,!0);let c=v(s,`idPrefix`,3,`field`),u=v(s,`hideRequired`,3,!1),p=v(s,`creatable`,3,!0),h=n(()=>Ae(s.field,s.modelId)),b=n(()=>s.label??ee(s.field.name)),x=n(()=>`${c()}-${s.field.name}`),C=n(()=>s.field.required&&!u()),O=n(()=>s.value===null||s.value===void 0?``:typeof s.value==`object`?JSON.stringify(s.value):String(s.value)),A=n(()=>[...e(C)||(s.field.enum??[]).includes(``)?[]:[{value:``,label:`(none)`}],...(s.field.enum??[]).map(e=>({value:e,label:e===``?`(none)`:z(e)}))]);function M(e){if(e.trim()===``)return null;let t=Number(e);return Number.isFinite(t)?t:null}function N(e){try{return JSON.parse(e)}catch{return e}}let P=e=>e.slice(0,10);var F=vt(),I=S(F),L=t=>{{let r=n(()=>s.value===!0);H(t,{get checked(){return e(r)},onchange:e=>s.onchange(e.currentTarget.checked),get label(){return e(b)}})}},R=t=>{ct(t,{get field(){return s.field},get value(){return s.value},get onchange(){return s.onchange},get label(){return e(b)},get name(){return e(x)},get required(){return e(C)},get creatable(){return p()}})},B=t=>{ge(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},get options(){return e(A)},get value(){return e(O)},onchange:e=>s.onchange(e)})},U=t=>{ve(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},rows:4,get value(){return e(O)},onchange:e=>s.onchange(e)})},te=t=>{Se(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},type:`email`,get value(){return e(O)},onchange:e=>s.onchange(e)})},ne=t=>{xe(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},get value(){return e(O)},onchange:e=>s.onchange(e)})},re=t=>{{let r=n(()=>typeof s.value==`number`?s.value:null);_e(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},currency:`USD`,min:0,get value(){return e(r)},onchange:e=>s.onchange(e)})}},ie=t=>{var r=lt(),a=S(r);{let t=n(()=>we(s.value));Ce(a,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},min:0,step:.01,get value(){return e(t)},onchange:e=>s.onchange(be(e))})}d(2),i(r),f(t,r)},ae=t=>{{let r=n(()=>P(e(O)));ye(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},includeTime:!1,get value(){return e(r)},onchange:e=>s.onchange(e?new Date(`${e}T00:00:00Z`).toISOString():``)})}},G=t=>{{let r=n(()=>Xe(s.value));Te(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},get value(){return e(r)},onchange:e=>s.onchange(Ze(e,s.value))})}},oe=n=>{var r=ht(),i=E(r);W(i,{get for(){return e(x)},get label(){return e(b)},get required(){return e(C)}});var a=w(i,2),o=t=>{V(t,{get id(){return e(x)},get required(){return e(C)},get value(){return e(O)},onchange:e=>s.onchange(e.currentTarget.value)})},c=t=>{var n=ut();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),m(`input`,n,e=>s.onchange(e.currentTarget.value)),f(t,n)},l=t=>{var n=dt();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),g(`focus`,n,e=>e.currentTarget.select()),m(`input`,n,e=>{let t=M(e.currentTarget.value);s.onchange(t===null?null:Math.trunc(t))}),f(t,n)},u=t=>{var n=ft();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),g(`focus`,n,e=>e.currentTarget.select()),m(`input`,n,e=>s.onchange(M(e.currentTarget.value))),f(t,n)},d=t=>{var n=pt();j(n),D(()=>{k(n,`id`,e(x)),y(n,e(O))}),m(`input`,n,e=>s.onchange(N(e.currentTarget.value))),f(t,n)},p=t=>{var n=mt();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),m(`input`,n,e=>s.onchange(e.currentTarget.value)),f(t,n)};t(a,t=>{e(h)===`currency`?t(o):e(h)===`url`?t(c,1):e(h)===`integer`?t(l,2):e(h)===`decimal`?t(u,3):e(h)===`json`?t(d,4):t(p,-1)}),f(n,r)};t(I,t=>{e(h)===`boolean`?t(L):e(h)===`relation`?t(R,1):e(h)===`enum`?t(B,2):e(h)===`textarea`?t(U,3):e(h)===`email`?t(te,4):e(h)===`phone`?t(ne,5):e(h)===`money`?t(re,6):e(h)===`percent`?t(ie,7):e(h)===`datetime`?t(ae,8):e(h)===`address`?t(G,9):t(oe,-1)});var K=w(I,2),q=t=>{var n=gt(),r=T(n,!0);D(()=>{k(n,`id`,`${e(x)}-error`),o(r,s.error)}),f(t,n)};t(K,e=>{s.error&&e(q)});var J=w(K,2),Y=e=>{var t=_t(),n=T(t,!0);D(()=>o(n,s.help)),f(e,t)};t(J,e=>{s.help&&e(Y)}),i(F),D(()=>{k(F,`data-renderer`,e(h)),k(F,`data-invalid`,s.error?``:void 0)}),f(a,F),r()}h([`input`]);var bt=a(`<p>Loading...</p>`),xt=a(`<p class="error svelte-1rp3j7g" role="alert" data-error-summary=""> </p>`),St=a(`<p class="error svelte-1rp3j7g" role="alert"> </p>`),Ct=a(`<form class="planner-form" novalidate=""><h3 class="svelte-1rp3j7g"> </h3> <!> <!> <!> <div class="actions svelte-1rp3j7g"><button type="submit" class="svelte-1rp3j7g">Save</button> <button type="button" class="secondary svelte-1rp3j7g">Cancel</button></div></form>`);function wt(a,c){l(c,!0);let u=J(),d=n(()=>We(c.active,X).filter(({catalogField:e,modelId:t})=>!q.rows.some(n=>n.objectRef===t&&n.fieldName===e.name&&n.visibility===`hidden`))),h=b(C(Ge(c.active,X))),_=b(c.id===void 0),v=b(``),y=b(C({})),x=n(()=>e(d).map(({field:e,catalogField:t})=>({...t,name:e.id,label:e.label,required:e.required??t.required}))),k=n(()=>Ve(e(x),e(y))),j={};async function M(e){let t=await Je(u,c.active,X,e);A(h,t.values,!0),j=t.rows,A(_,!0)}c.id!==void 0&&M(c.id);async function N(t){t.preventDefault();let n=t.currentTarget;if(A(v,``),A(y,Be(e(x),e(h)),!0),Object.keys(e(y)).length>0)await O(),Ue(n);else try{let t=await u.apply(Ye(c.active,X,e(h),c.id,j,c.preset)),n=Q(c.active).records[Ke(c.active)],r=n?t[n.as]:void 0;if(!r)throw Error(`Nothing was saved.`);c.onsaved(r)}catch(e){A(v,e instanceof Error?e.message:`Could not save.`,!0)}}var P=p(),I=E(P),L=e=>{var t=bt();f(e,t)},R=r=>{var a=Ct(),l=S(a),u=T(l),p=w(l,2);s(p,17,()=>e(d),({field:e,catalogField:t,modelId:n})=>e.id,(t,r)=>{let i=()=>e(r).field,a=()=>e(r).catalogField,o=()=>e(r).modelId;{let r=n(()=>({...a(),required:i().required??a().required}));yt(t,{get modelId(){return o()},get field(){return e(r)},get label(){return i().label},get help(){return i().help},get idPrefix(){return c.active.form.id},get error(){return e(y)[i().id]},get value(){return e(h)[i().id]},onchange:t=>{e(h)[i().id]=t,delete e(y)[i().id]}})}});var _=w(p,2),b=t=>{var n=xt(),r=T(n,!0);D(()=>o(r,e(k))),f(t,n)};t(_,t=>{e(k)&&t(b)});var x=w(_,2),C=t=>{var n=St(),r=T(n,!0);D(()=>o(r,e(v))),f(t,n)};t(x,t=>{e(v)&&t(C)});var E=w(x,2),O=w(S(E),2);i(E),i(a),D(e=>o(u,`${c.id===void 0?`New`:`Edit`} ${e??``}`),[()=>F(c.active.form.label,c.noun,c.noun!==void 0)]),g(`submit`,a,N),m(`click`,O,function(...e){c.oncancel?.apply(this,e)}),f(r,a)};t(I,t=>{e(_)?t(R,-1):t(L)}),f(a,P),r()}h([`click`]);export{Le as a,Ne as c,Fe as d,Oe as f,De as h,Re as i,Be as l,Ee as m,yt as n,Pe as o,ke as p,Ue as r,Ve as s,wt as t,He as u};
1
+ import{$ as e,B as t,Ct as n,Dt as r,Ft as i,G as a,H as o,L as s,O as c,Ot as l,P as u,Pt as d,U as f,W as p,X as m,Y as h,Z as g,_,a as v,b as y,bt as b,ct as x,ft as S,gt as C,ht as w,mt as T,pt as E,st as D,tt as O,v as k,vt as A,wt as j,xt as M,z as N}from"./DG3qFFTE.js";import"./xihTtKlq.js";import{O as P,c as F,ft as I,gt as L,h as R,l as z,m as B,p as ee}from"./BG9Gz_25.js";import{_ as V,i as H,o as U,y as W}from"./gMSmS-_y.js";import{a as te,c as ne,i as re,l as ie,o as ae,p as G,s as oe}from"./CyUSxz1P.js";import{b as K,t as q}from"./CtjBwCj8.js";import{r as J}from"./D_U_DYjx.js";import{a as Y,c as se,d as ce,f as le,i as ue,n as de,o as fe,p as pe,r as X,s as me,u as he}from"./C3sRGrYK.js";import{a as ge,c as _e,i as ve,l as ye,n as be,o as xe,r as Se,s as Ce,t as we,u as Te}from"./5ukUzDcw.js";function Ee(e){return e.form.kind===`field-map`}function De(e){return e.form.kind===`variant-grid`}function Oe(e,t,n){let r=t.filter(t=>e.includes(t.id));return r.flatMap(e=>(e.forms??[]).filter(e=>e.model===n).map(t=>({recipeId:e.id,form:t,extensions:r.flatMap(e=>(e.extends??[]).filter(e=>e.form===t.id))})))}function ke(e,t){return e.extensions.some(e=>(e.records??[]).some(e=>e.model===t))}function Z(e){return(e.type===`foreignKey`||e.type===`crossPackageRef`)&&typeof e.related==`string`}function Ae(e,t){if(e.type===`boolean`)return`boolean`;if(Z(e))return`relation`;if(e.enum&&e.enum.length>0)return`enum`;if(e.ui?.widget)return e.ui.widget;if(e.type===`json`&&t!==void 0&&(L[t]??[]).includes(e.name))return`address`;if(P(e))return`money`;if(B(e))return`percent`;switch(e.type){case`datetime`:return`datetime`;case`integer`:return`integer`;case`decimal`:return`decimal`;case`json`:return`json`;default:return`text`}}var je=e=>typeof e==`number`&&Number.isFinite(e)?e:0;function Me(e){let t=e.name;if(e.type===`json`)return 99;if(/^(name|title|label|code)$|Number$|^number$/.test(t))return 0;if(t===`reference`&&e.type===`text`)return .5;if(t===`description`&&e.type===`text`)return 5.9;if(Z(e))return/^(customer|vendor|profile)/i.test(t)?1:/^(contract|.*(journal|account))/i.test(t)?7:2;if((e.enum?.length??0)>0&&/(status|state|stage)$/i.test(t))return 3;if(/^(totalAmount|amount|total)$/.test(t))return 4;if(e.type===`datetime`){if(/^start(date|at)?$/i.test(t))return 1.2;if(/^due/i.test(t))return 5;if(/(issue|paid|allocated|^date$)/i.test(t))return 5.2}return 6}function Ne(e,t=6){let n=e.filter(e=>e.type!==`json`),r=new Set(n.slice(0,3)),i=n.filter(e=>r.has(e)||Me(e)<6||[`integer`,`decimal`,`boolean`,`datetime`].includes(e.type)||(e.enum?.length??0)>0||Z(e)).map((e,t)=>({f:e,i:t,rank:Me(e)})).sort((e,t)=>e.rank-t.rank||e.i-t.i).map(e=>e.f),a=n.find(e=>e.name===`totalAmount`);if(a&&n.some(e=>e.name===`amountPaid`)){let e={...a,name:`amountDue`,label:`Amount due`,required:!1,derive:e=>je(e.totalAmount)-je(e.amountPaid)},t=i.findIndex(e=>e.name===`totalAmount`);i.splice(t<0?i.length:t+1,0,e)}let o=n.some(e=>e.name===`allDay`);return i.slice(0,t).map(e=>o&&e.type===`datetime`&&/^(start|end)(date|at)$/i.test(e.name)?{...e,showTime:!0}:e)}function Pe(e,t){return e.derive?e.derive(t):t[e.name]}function Fe(e,t,n){return e.filter(e=>e[t]===n)}function Ie(e){if(e.default!==void 0&&e.default!==null)return e.default;let t=e.enum??[];return t.length>0&&(e.required||/(status|state|stage)$/i.test(e.name))?t.includes(`draft`)?`draft`:t[0]:e.type===`boolean`?!1:e.type===`text`?``:null}function Le(e){let t={};for(let n of e)t[n.name]=Ie(n);return t}function Re(e,t,n){return{...Le(e),[t]:n}}var ze=e=>e==null||typeof e==`string`&&e.trim()===``;function Be(e,t,n=new Set){let r={};for(let i of e)i.required&&i.type!==`boolean`&&!n.has(i.name)&&ze(t[i.name])&&(r[i.name]=`${i.label} is required.`);return r}function Ve(e,t){let n=e.filter(e=>t[e.name]).map(e=>e.label);return n.length===0?``:`Cannot save yet: ${n.join(`, `)} ${n.length===1?`is`:`are`} required.`}function He(e,t,n,r){return G(e,n,(e,t)=>e.related?r.get(R(e.related,t)):void 0,t)??``}function Ue(e){e instanceof HTMLElement&&e.querySelector(`[data-invalid] :is(input, select, textarea, button):not([type="hidden"])`)?.focus()}function Q(e){return{records:[...e.form.records,...e.extensions.flatMap(e=>e.records??[])],fields:[...e.form.fields,...e.extensions.flatMap(e=>e.fields??[])]}}function We(e,t){let{records:n,fields:r}=Q(e);return r.map(e=>({field:e,catalogField:ce(e,n,t),modelId:le(e,n)}))}function Ge(e,t){return Object.fromEntries(We(e,t).map(({field:e,catalogField:t})=>[e.id,he(e,t)]))}function Ke(e){let{records:t}=Q(e),n=t.findIndex(t=>t.model===e.form.model);return n<0?0:n}async function qe(e,t,n,r){let{records:i}=Q(t),a=i[Ke(t)];if(!a)return{};let o=await e.get(n(a.model),r);return Y(e,i,{[a.as]:o},n)}async function Je(e,t,n,r){let{fields:i}=Q(t),a=await qe(e,t,n,r),o=Ge(t,n);return{values:Object.fromEntries(i.map(e=>{let{alias:t,field:n}=me(e.to),r=a[t]?.[n];return[e.id,r===void 0?o[e.id]:r]})),rows:a}}function Ye(e,t,n,r,i={},a={}){let{records:o,fields:s}=Q(e),c=ue(s,n),l=Ke(e),u=new Set;return o.map((e,o)=>{let d=fe(s,e.as,n),f={...pe(e.values,c),...o===l?Object.fromEntries(Object.entries(a).map(([e,t])=>[e,se(t)])):{}},p=t(e.model),m=r===void 0?void 0:i[e.as];try{if(o===l&&r!==void 0){let t=Object.fromEntries(Object.entries(f).filter(([,e])=>de(e)));return{op:`save`,as:e.as,model:p,id:r,values:{...d,...t}}}if(m)return{op:`save`,as:e.as,model:p,id:m.id,values:d};let t=e.match?pe(e.match,c):{},n=Object.values(t).some(e=>de(e)&&!u.has(e.ref))?{}:t,i=Object.keys(n).length>0;return{op:`save`,as:e.as,model:p,...i?{match:n}:{},onCreate:f,values:d}}finally{u.add(e.as)}})}var $=e=>typeof e==`string`&&e!==``?e:void 0;function Xe(e){let t=typeof e==`object`&&e&&!Array.isArray(e)?e:{},n=$(t.country),r=$(t.state);return{...$(t.street1)?{street:t.street1}:{},...$(t.city)?{city:t.city}:{},...r?{province:n===`US`?`US-${r}`:r}:{},...$(t.postalCode)?{postalCode:t.postalCode}:{},...n?{country:n}:{}}}function Ze(e,t){let n=typeof t==`object`&&t&&!Array.isArray(t)?{...t}:{};for(let e of[`street1`,`city`,`state`,`postalCode`,`country`])delete n[e];let r=$(e.province);return{...n,...$(e.street)?{street1:e.street}:{},...$(e.city)?{city:e.city}:{},...r?{state:r.replace(/^US-/,``)}:{},...$(e.postalCode)?{postalCode:e.postalCode}:{},...$(e.country)?{country:e.country}:{}}}function Qe(e){return document.body.appendChild(e),e.showModal(),()=>{e.close(),e.remove()}}function $e(e){let t=[e.status,e.customerType].filter(Boolean).join(` · `);return{id:e.id,label:e.profile.name,...t?{detail:t}:{}}}function et(e){return{id:e.id,label:e.profile.name,...e.status?{detail:e.status}:{}}}function tt(e,t){l(t,!0);let n=v(t,`value`,15,``),i=v(t,`label`,3,`Customer`),a=v(t,`required`,3,!1),o=v(t,`disabled`,3,!1),s=v(t,`createLabel`,3,`New customer`);U(e,{get name(){return t.name},get label(){return i()},get required(){return a()},get disabled(){return o()},get error(){return t.error},get onCreate(){return t.onCreate},get createLabel(){return s()},get onchange(){return t.onchange},search:async e=>(await t.search(e)).map($e),resolve:async e=>{let n=await t.resolve(e);return n?{id:n.id,label:n.profile.name}:null},get value(){return n()},set value(e){n(e)}}),r()}function nt(e,t){l(t,!0);let n=v(t,`value`,15,``),i=v(t,`label`,3,`Vendor`),a=v(t,`required`,3,!1),o=v(t,`disabled`,3,!1),s=v(t,`createLabel`,3,`New vendor`);U(e,{get name(){return t.name},get label(){return i()},get required(){return a()},get disabled(){return o()},get error(){return t.error},get onCreate(){return t.onCreate},get createLabel(){return s()},get onchange(){return t.onchange},search:async e=>(await t.search(e)).map(et),resolve:async e=>{let n=await t.resolve(e);return n?{id:n.id,label:n.profile.name}:null},get value(){return n()},set value(e){n(e)}}),r()}var rt=[{name:`CustomerSelect`,selects:`@happyvertical/smrt-commerce:Customer`,kind:`customer`,component:tt},{name:`VendorSelect`,selects:`@happyvertical/smrt-commerce:Vendor`,kind:`vendor`,component:nt}];function it(e,t=rt){return t.find(t=>t.selects===e)}var at=a(`<label class="plain svelte-1t0u16g"> <input type="text"/></label>`),ot=a(`<dialog class="create svelte-1t0u16g"><!></dialog>`),st=a(`<!> <!>`,1);function ct(a,s){l(s,!0);let d=v(s,`creatable`,3,!0),h=J(),T=n(()=>s.field.related??``),O=n(()=>I(e(T))?.model),j=n(()=>it(e(T))),P=n(()=>d()?Oe(q.ids,K,e(T)).find(Ee):void 0),F=n(()=>e(O)?.name.toLowerCase()??`record`),L=b(C(typeof s.value==`string`?s.value:``));x(()=>{let t=typeof s.value==`string`?s.value:``;t!==e(L)&&A(L,t,!0)});let R=b(!1),z=b(0);function B(){M(z),A(R,!0)}function ee(e){A(R,!1),A(L,e.id,!0),s.onchange(e.id)}function V(e){A(L,e,!0),s.onchange(e===``?null:e)}var H=st(),W=E(H),G=t=>{var n=at(),r=S(n),a=w(r);_(a),i(n),D(()=>{o(r,`${s.label??``} `),k(a,`name`,s.name),a.required=s.required,y(a,e(L))}),m(`input`,a,e=>V(e.currentTarget.value)),f(t,n)},Y=t=>{let r=n(()=>e(j).component);var i=p(),a=E(i);{let t=n(()=>e(P)?B:void 0),i=n(()=>`New ${e(F)}`);u(a,()=>e(r),(n,r)=>{r(n,{get name(){return s.name},get label(){return s.label},get required(){return s.required},search:e=>oe(h,e),resolve:e=>re(h,e),get onCreate(){return e(t)},get createLabel(){return e(i)},onchange:V,get value(){return e(L)},set value(e){A(L,e,!0)}})})}f(t,i)},se=t=>{let r=n(()=>e(j).component);var i=p(),a=E(i);{let t=n(()=>e(P)?B:void 0),i=n(()=>`New ${e(F)}`);u(a,()=>e(r),(n,r)=>{r(n,{get name(){return s.name},get label(){return s.label},get required(){return s.required},search:e=>ie(h,e),resolve:e=>ae(h,e),get onCreate(){return e(t)},get createLabel(){return e(i)},onchange:V,get value(){return e(L)},set value(e){A(L,e,!0)}})})}f(t,i)},ce=t=>{{let r=n(()=>e(P)?B:void 0),i=n(()=>`New ${e(F)}`);U(t,{get name(){return s.name},get label(){return s.label},get required(){return s.required},search:t=>ne(h,e(O),t),resolve:t=>te(h,e(O),t),get onCreate(){return e(r)},get createLabel(){return e(i)},onchange:V,get value(){return e(L)},set value(e){A(L,e,!0)}})}};t(W,t=>{e(O)?e(j)?.kind===`customer`?t(Y,1):e(j)?.kind===`vendor`?t(se,2):t(ce,-1):t(G)});var le=w(W,2),ue=t=>{var n=ot(),r=S(n);N(r,()=>e(z),t=>{wt(t,{get active(){return e(P)},onsaved:ee,oncancel:()=>A(R,!1)})}),i(n),c(n,()=>Qe),D(()=>k(n,`aria-label`,`New ${e(F)}`)),g(`close`,n,()=>A(R,!1)),f(t,n)};t(le,t=>{e(P)&&e(R)&&t(ue)}),f(a,H),r()}h([`input`]);var lt=a(`<div class="percent svelte-n1ol00"><!> <span class="percent-sign svelte-n1ol00" aria-hidden="true">%</span></div>`),ut=a(`<input type="url" class="svelte-n1ol00"/>`),dt=a(`<input type="number" step="1" class="svelte-n1ol00"/>`),ft=a(`<input type="number" step="any" class="svelte-n1ol00"/>`),pt=a(`<textarea rows="3" class="svelte-n1ol00"></textarea>`),mt=a(`<input type="text" class="svelte-n1ol00"/>`),ht=a(`<!> <!>`,1),gt=a(`<p class="field-error svelte-n1ol00" role="alert"> </p>`),_t=a(`<small class="svelte-n1ol00"> </small>`),vt=a(`<div class="field svelte-n1ol00"><!> <!> <!></div>`);function yt(a,s){l(s,!0);let c=v(s,`idPrefix`,3,`field`),u=v(s,`hideRequired`,3,!1),p=v(s,`creatable`,3,!0),h=n(()=>Ae(s.field,s.modelId)),b=n(()=>s.label??ee(s.field.name)),x=n(()=>`${c()}-${s.field.name}`),C=n(()=>s.field.required&&!u()),O=n(()=>s.value===null||s.value===void 0?``:typeof s.value==`object`?JSON.stringify(s.value):String(s.value)),A=n(()=>[...e(C)||(s.field.enum??[]).includes(``)?[]:[{value:``,label:`(none)`}],...(s.field.enum??[]).map(e=>({value:e,label:e===``?`(none)`:z(e)}))]);function M(e){if(e.trim()===``)return null;let t=Number(e);return Number.isFinite(t)?t:null}function N(e){try{return JSON.parse(e)}catch{return e}}let P=e=>e.slice(0,10);var F=vt(),I=S(F),L=t=>{{let r=n(()=>s.value===!0);H(t,{get checked(){return e(r)},onchange:e=>s.onchange(e.currentTarget.checked),get label(){return e(b)}})}},R=t=>{ct(t,{get field(){return s.field},get value(){return s.value},get onchange(){return s.onchange},get label(){return e(b)},get name(){return e(x)},get required(){return e(C)},get creatable(){return p()}})},B=t=>{ge(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},get options(){return e(A)},get value(){return e(O)},onchange:e=>s.onchange(e)})},U=t=>{ve(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},rows:4,get value(){return e(O)},onchange:e=>s.onchange(e)})},te=t=>{Se(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},type:`email`,get value(){return e(O)},onchange:e=>s.onchange(e)})},ne=t=>{xe(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},get value(){return e(O)},onchange:e=>s.onchange(e)})},re=t=>{{let r=n(()=>typeof s.value==`number`?s.value:null);_e(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},currency:`USD`,min:0,get value(){return e(r)},onchange:e=>s.onchange(e)})}},ie=t=>{var r=lt(),a=S(r);{let t=n(()=>we(s.value));Ce(a,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},min:0,step:.01,get value(){return e(t)},onchange:e=>s.onchange(be(e))})}d(2),i(r),f(t,r)},ae=t=>{{let r=n(()=>P(e(O)));ye(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},includeTime:!1,get value(){return e(r)},onchange:e=>s.onchange(e?new Date(`${e}T00:00:00Z`).toISOString():``)})}},G=t=>{{let r=n(()=>Xe(s.value));Te(t,{get name(){return e(x)},get label(){return e(b)},get required(){return e(C)},get value(){return e(r)},onchange:e=>s.onchange(Ze(e,s.value))})}},oe=n=>{var r=ht(),i=E(r);W(i,{get for(){return e(x)},get label(){return e(b)},get required(){return e(C)}});var a=w(i,2),o=t=>{V(t,{get id(){return e(x)},get required(){return e(C)},get value(){return e(O)},onchange:e=>s.onchange(e.currentTarget.value)})},c=t=>{var n=ut();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),m(`input`,n,e=>s.onchange(e.currentTarget.value)),f(t,n)},l=t=>{var n=dt();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),g(`focus`,n,e=>e.currentTarget.select()),m(`input`,n,e=>{let t=M(e.currentTarget.value);s.onchange(t===null?null:Math.trunc(t))}),f(t,n)},u=t=>{var n=ft();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),g(`focus`,n,e=>e.currentTarget.select()),m(`input`,n,e=>s.onchange(M(e.currentTarget.value))),f(t,n)},d=t=>{var n=pt();j(n),D(()=>{k(n,`id`,e(x)),y(n,e(O))}),m(`input`,n,e=>s.onchange(N(e.currentTarget.value))),f(t,n)},p=t=>{var n=mt();_(n),D(()=>{k(n,`id`,e(x)),n.required=e(C),y(n,e(O))}),m(`input`,n,e=>s.onchange(e.currentTarget.value)),f(t,n)};t(a,t=>{e(h)===`currency`?t(o):e(h)===`url`?t(c,1):e(h)===`integer`?t(l,2):e(h)===`decimal`?t(u,3):e(h)===`json`?t(d,4):t(p,-1)}),f(n,r)};t(I,t=>{e(h)===`boolean`?t(L):e(h)===`relation`?t(R,1):e(h)===`enum`?t(B,2):e(h)===`textarea`?t(U,3):e(h)===`email`?t(te,4):e(h)===`phone`?t(ne,5):e(h)===`money`?t(re,6):e(h)===`percent`?t(ie,7):e(h)===`datetime`?t(ae,8):e(h)===`address`?t(G,9):t(oe,-1)});var K=w(I,2),q=t=>{var n=gt(),r=T(n,!0);D(()=>{k(n,`id`,`${e(x)}-error`),o(r,s.error)}),f(t,n)};t(K,e=>{s.error&&e(q)});var J=w(K,2),Y=e=>{var t=_t(),n=T(t,!0);D(()=>o(n,s.help)),f(e,t)};t(J,e=>{s.help&&e(Y)}),i(F),D(()=>{k(F,`data-renderer`,e(h)),k(F,`data-invalid`,s.error?``:void 0)}),f(a,F),r()}h([`input`]);var bt=a(`<p>Loading...</p>`),xt=a(`<p class="error svelte-1rp3j7g" role="alert" data-error-summary=""> </p>`),St=a(`<p class="error svelte-1rp3j7g" role="alert"> </p>`),Ct=a(`<form class="planner-form" novalidate=""><h3 class="svelte-1rp3j7g"> </h3> <!> <!> <!> <div class="actions svelte-1rp3j7g"><button type="submit" class="svelte-1rp3j7g">Save</button> <button type="button" class="secondary svelte-1rp3j7g">Cancel</button></div></form>`);function wt(a,c){l(c,!0);let u=J(),d=n(()=>We(c.active,X).filter(({catalogField:e,modelId:t})=>!q.rows.some(n=>n.objectRef===t&&n.fieldName===e.name&&n.visibility===`hidden`))),h=b(C(Ge(c.active,X))),_=b(c.id===void 0),v=b(``),y=b(C({})),x=n(()=>e(d).map(({field:e,catalogField:t})=>({...t,name:e.id,label:e.label,required:e.required??t.required}))),k=n(()=>Ve(e(x),e(y))),j={};async function M(e){let t=await Je(u,c.active,X,e);A(h,t.values,!0),j=t.rows,A(_,!0)}c.id!==void 0&&M(c.id);async function N(t){t.preventDefault();let n=t.currentTarget;if(A(v,``),A(y,Be(e(x),e(h)),!0),Object.keys(e(y)).length>0)await O(),Ue(n);else try{let t=await u.apply(Ye(c.active,X,e(h),c.id,j,c.preset)),n=Q(c.active).records[Ke(c.active)],r=n?t[n.as]:void 0;if(!r)throw Error(`Nothing was saved.`);c.onsaved(r)}catch(e){A(v,e instanceof Error?e.message:`Could not save.`,!0)}}var P=p(),I=E(P),L=e=>{var t=bt();f(e,t)},R=r=>{var a=Ct(),l=S(a),u=T(l),p=w(l,2);s(p,17,()=>e(d),({field:e,catalogField:t,modelId:n})=>e.id,(t,r)=>{let i=()=>e(r).field,a=()=>e(r).catalogField,o=()=>e(r).modelId;{let r=n(()=>({...a(),required:i().required??a().required}));yt(t,{get modelId(){return o()},get field(){return e(r)},get label(){return i().label},get help(){return i().help},get idPrefix(){return c.active.form.id},get error(){return e(y)[i().id]},get value(){return e(h)[i().id]},onchange:t=>{e(h)[i().id]=t,delete e(y)[i().id]}})}});var _=w(p,2),b=t=>{var n=xt(),r=T(n,!0);D(()=>o(r,e(k))),f(t,n)};t(_,t=>{e(k)&&t(b)});var x=w(_,2),C=t=>{var n=St(),r=T(n,!0);D(()=>o(r,e(v))),f(t,n)};t(x,t=>{e(v)&&t(C)});var E=w(x,2),O=w(S(E),2);i(E),i(a),D(e=>o(u,`${c.id===void 0?`New`:`Edit`} ${e??``}`),[()=>F(c.active.form.label,c.noun,c.noun!==void 0)]),g(`submit`,a,N),m(`click`,O,function(...e){c.oncancel?.apply(this,e)}),f(r,a)};t(I,t=>{e(_)?t(R,-1):t(L)}),f(a,P),r()}h([`click`]);export{Le as a,Ne as c,Fe as d,Oe as f,De as h,Re as i,Be as l,Ee as m,yt as n,Pe as o,ke as p,Ue as r,Ve as s,wt as t,He as u};
@@ -0,0 +1 @@
1
+ import"./C_3CJO_1.js";
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./D7hhQvDO.js","./C7zBd-pD.js","./CA-A9Ngs.js","./uBIymjUX.js","./BBmlFBgo.js","./COiEfhsA.js","./C5qDLfXy.js","./GdHEbDDH.js","./gMSmS-_y.js","./DG3qFFTE.js","./xihTtKlq.js","./YUSKx8_q.js","./DK8Blf1Y.js","../assets/currency-metadata.ksbBA8-C.css","./M-CuJzQN.js","../assets/SegmentedControl.DMqHG5fn.css","../assets/forms.DXOeP4wZ.css","./Dbjm4OuC.js"])))=>i.map(i=>d[i]);
2
- import{n as e}from"./COiEfhsA.js";import{t}from"./uBIymjUX.js";import{a as n,c as r,l as i,o as a,s as o}from"./DsY7g8iJ.js";import{a as s,i as c,n as l,o as u,r as d,s as f,t as p}from"./C7zBd-pD.js";import{t as m}from"./D7hhQvDO.js";import"./GdHEbDDH.js";import{I as h}from"./BV_A2GBw.js";function g(e){return!e.type||e.type===`webllm`}function _(e){return e.type===`transformers-llm`}async function v(e={}){if(g(e)){let{WebLLMAdapter:n}=await t(async()=>{let{WebLLMAdapter:e}=await import(`./D7hhQvDO.js`);return{WebLLMAdapter:e}},__vite__mapDeps([0,1,2,3]),import.meta.url);return new n(e)}throw _(e)?new f(`transformers-llm`,[`webllm`]):new f(String(e.type),[`webllm`,`transformers-llm`])}function y(e){return!e.type||e.type===`browser-speech`}function b(e){return e.type===`whisper-local`||e.type===`whisper-wasm`||e.type===`moonshine`}function x(e){return e.type===`whisper-cpp`}async function S(e={}){if(y(e)){let{BrowserSpeechSTTAdapter:n}=await t(async()=>{let{BrowserSpeechSTTAdapter:e}=await import(`./BBmlFBgo.js`).then(e=>e.t);return{BrowserSpeechSTTAdapter:e}},__vite__mapDeps([4,5,1]),import.meta.url);return new n(e)}if(x(e)){let{WhisperCppSTTAdapter:n}=await t(async()=>{let{WhisperCppSTTAdapter:e}=await import(`./C5qDLfXy.js`).then(e=>e.t);return{WhisperCppSTTAdapter:e}},__vite__mapDeps([6,5,1,2,3]),import.meta.url);return new n(e)}if(b(e)){let{LocalSpeechSTTAdapter:n}=await t(async()=>{let{LocalSpeechSTTAdapter:e}=await import(`./GdHEbDDH.js`).then(e=>e.t);return{LocalSpeechSTTAdapter:e}},__vite__mapDeps([7,5,8,9,10,11,12,13,14,15,16,1,2,3]),import.meta.url);return new n(e)}throw new f(String(e.type),[`browser-speech`,`whisper-cpp`,`whisper-local`,`whisper-wasm`,`moonshine`])}function C(e={type:`browser-speech`}){let t=null;return()=>(t??=(async()=>{let t=await S(e);return t.getCapabilities().requiresDownload||await t.ensureInitialized(),t})().catch(e=>{throw t=null,e}),t)}function w(e){return!e.type||e.type===`browser-synthesis`}function T(e){return e.type===`transformers`}async function E(e={}){if(w(e)){let{BrowserSynthesisTTSAdapter:n}=await t(async()=>{let{BrowserSynthesisTTSAdapter:e}=await import(`./Dbjm4OuC.js`);return{BrowserSynthesisTTSAdapter:e}},__vite__mapDeps([17,1]),import.meta.url);return new n(e)}throw T(e)?new f(`transformers`,[`browser-synthesis`]):new f(String(e.type),[`browser-synthesis`])}var D=e({BrowserAIError:()=>p,CapabilityNotAvailableError:()=>l,InitializationError:()=>d,ModelLoadError:()=>c,ModelNotDownloadedError:()=>s,PermissionDeniedError:()=>u,RECOMMENDED_MODELS:()=>m,UnsupportedAdapterError:()=>f,WHISPER_LOCAL_DEFAULT_MODEL:()=>WHISPER_LOCAL_DEFAULT_MODEL,WHISPER_LOCAL_DEFAULT_SIZE_BYTES:()=>WHISPER_LOCAL_DEFAULT_SIZE_BYTES,canEnableSmrtMode:()=>n,detectCapabilities:()=>a,getLLM:()=>v,getSTT:()=>S,getTTS:()=>E,hasLLM:()=>o,hasSTT:()=>r,hasTTS:()=>i,probeBrowserSpeech:()=>h});export{C as n,D as t};
2
+ import{n as e}from"./COiEfhsA.js";import{t}from"./uBIymjUX.js";import{c as n,l as r,o as i,s as a,u as o}from"./Bsn3IIve.js";import{a as s,i as c,n as l,o as u,r as d,s as f,t as p}from"./C7zBd-pD.js";import{t as m}from"./D7hhQvDO.js";import"./GdHEbDDH.js";import{z as h}from"./Cr4byQts.js";function g(e){return!e.type||e.type===`webllm`}function _(e){return e.type===`transformers-llm`}async function v(e={}){if(g(e)){let{WebLLMAdapter:n}=await t(async()=>{let{WebLLMAdapter:e}=await import(`./D7hhQvDO.js`);return{WebLLMAdapter:e}},__vite__mapDeps([0,1,2,3]),import.meta.url);return new n(e)}throw _(e)?new f(`transformers-llm`,[`webllm`]):new f(String(e.type),[`webllm`,`transformers-llm`])}function y(e){return!e.type||e.type===`browser-speech`}function b(e){return e.type===`whisper-local`||e.type===`whisper-wasm`||e.type===`moonshine`}function x(e){return e.type===`whisper-cpp`}async function S(e={}){if(y(e)){let{BrowserSpeechSTTAdapter:n}=await t(async()=>{let{BrowserSpeechSTTAdapter:e}=await import(`./BBmlFBgo.js`).then(e=>e.t);return{BrowserSpeechSTTAdapter:e}},__vite__mapDeps([4,5,1]),import.meta.url);return new n(e)}if(x(e)){let{WhisperCppSTTAdapter:n}=await t(async()=>{let{WhisperCppSTTAdapter:e}=await import(`./C5qDLfXy.js`).then(e=>e.t);return{WhisperCppSTTAdapter:e}},__vite__mapDeps([6,5,1,2,3]),import.meta.url);return new n(e)}if(b(e)){let{LocalSpeechSTTAdapter:n}=await t(async()=>{let{LocalSpeechSTTAdapter:e}=await import(`./GdHEbDDH.js`).then(e=>e.t);return{LocalSpeechSTTAdapter:e}},__vite__mapDeps([7,5,8,9,10,11,12,13,14,15,16,1,2,3]),import.meta.url);return new n(e)}throw new f(String(e.type),[`browser-speech`,`whisper-cpp`,`whisper-local`,`whisper-wasm`,`moonshine`])}function C(e={type:`browser-speech`}){let t=null;return()=>(t??=(async()=>{let t=await S(e);return t.getCapabilities().requiresDownload||await t.ensureInitialized(),t})().catch(e=>{throw t=null,e}),t)}function w(e){return!e.type||e.type===`browser-synthesis`}function T(e){return e.type===`transformers`}async function E(e={}){if(w(e)){let{BrowserSynthesisTTSAdapter:n}=await t(async()=>{let{BrowserSynthesisTTSAdapter:e}=await import(`./Dbjm4OuC.js`);return{BrowserSynthesisTTSAdapter:e}},__vite__mapDeps([17,1]),import.meta.url);return new n(e)}throw T(e)?new f(`transformers`,[`browser-synthesis`]):new f(String(e.type),[`browser-synthesis`])}var D=e({BrowserAIError:()=>p,CapabilityNotAvailableError:()=>l,InitializationError:()=>d,ModelLoadError:()=>c,ModelNotDownloadedError:()=>s,PermissionDeniedError:()=>u,RECOMMENDED_MODELS:()=>m,UnsupportedAdapterError:()=>f,WHISPER_LOCAL_DEFAULT_MODEL:()=>WHISPER_LOCAL_DEFAULT_MODEL,WHISPER_LOCAL_DEFAULT_SIZE_BYTES:()=>WHISPER_LOCAL_DEFAULT_SIZE_BYTES,canEnableSmrtMode:()=>i,detectCapabilities:()=>a,getLLM:()=>v,getSTT:()=>S,getTTS:()=>E,hasLLM:()=>n,hasSTT:()=>r,hasTTS:()=>o,probeBrowserSpeech:()=>h});export{C as n,D as t};
@@ -0,0 +1 @@
1
+ import{x as e}from"./CtjBwCj8.js";var t={cookbooks:[{id:`bakery`,name:`Bakery`,icon:`bread`,summary:`Retail and cafe wholesale orders, ingredient stock, batches and suppliers.`,keywords:[`bake`,`baker`,`bakery`,`baking`,`bread`,`pastry`,`cake`,`cookies`,`cafe wholesale`,`coffee shop`,`patisserie`,`sourdough`],settings:{currency:`USD`,paymentTerms:`Net 15`,taxRate:0},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#b45309`,fontFamily:`Georgia`}},recipes:[`commerce.customers`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`commerce.wholesale`,`inventory.stock`,`ledgers.bookkeeping`,`products.ingredients`,`products.simple`],features:[`@happyvertical/smrt-commerce:ProductionOrder`],policies:[{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:ProductionOrder`,fieldName:`channelId`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:ProductionOrder`,fieldName:`expiryDate`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:ProductionOrder`,fieldName:`vendorId`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`}],layout:{version:1,sectionOrder:[`custom:shop`,`custom:wholesale`,`custom:kitchen`,`custom:buying`,`section:accounting`],itemOrder:{"custom:shop":[`item:commerce:Order`,`item:commerce:Customer`],"custom:wholesale":[`item:commerce:WholesaleOrder`,`item:commerce:Invoice`,`item:commerce:Payment`],"custom:kitchen":[`item:products:Product`,`item:products:Product:ingredients`,`item:inventory:StockLevel`,`item:commerce:ProductionOrder`],"custom:buying":[`item:commerce:Vendor`,`item:commerce:PurchaseOrder`]},hidden:[`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Order":`custom:shop`,"item:commerce:Customer":`custom:shop`,"item:commerce:WholesaleOrder":`custom:wholesale`,"item:commerce:Invoice":`custom:wholesale`,"item:commerce:Payment":`custom:wholesale`,"item:products:Product":`custom:kitchen`,"item:inventory:StockLevel":`custom:kitchen`,"item:commerce:ProductionOrder":`custom:kitchen`,"item:commerce:Vendor":`custom:buying`,"item:commerce:PurchaseOrder":`custom:buying`,"item:products:Product:ingredients":`custom:kitchen`},customSections:[{id:`custom:shop`,label:`Shop`},{id:`custom:wholesale`,label:`Wholesale`},{id:`custom:kitchen`,label:`Kitchen`},{id:`custom:buying`,label:`Buying`}],items:{"item:commerce:Order":{label:`Orders`,description:`Orders from your shop and website customers.`},"item:commerce:WholesaleOrder":{label:`Cafe orders`,description:`Standing and one-off orders from cafes and shops.`},"item:inventory:StockLevel":{label:`Stock`,description:`Baked goods and supplies on hand today.`},"item:commerce:ProductionOrder":{label:`Batches`,description:`What you plan to bake, with the amounts and the day.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The mills, dairies and suppliers you buy from.`},"item:products:Product:ingredients":{label:`Ingredients`,description:`Flour, butter, sugar and the rest, with costs and units.`}},sections:{"custom:shop":{icon:`shoppingBag`},"custom:wholesale":{icon:`briefcase`},"custom:kitchen":{icon:`package`},"custom:buying":{icon:`truck`}}}},sectionDescriptions:{"custom:shop":`Sell to customers and keep their details.`,"custom:wholesale":`Orders, invoices and payments from trade customers.`,"custom:kitchen":`Products, ingredients, stock and what you are making.`,"custom:buying":`Suppliers and what you order from them.`}},{id:`mechanic`,name:`Mechanic`,icon:`car`,summary:`Quotes, work orders, parts, appointments and billing for a repair shop.`,keywords:[`mechanic`,`garage`,`auto repair`,`car repair`,`fix cars`,`car`,`vehicle`,`brakes`,`oil change`,`tyres`,`tires`,`servicing`,`repair shop`],settings:{currency:`USD`,paymentTerms:`Due on receipt`,taxRate:.0825,taxRounding:`document`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{preset:`smrt`},recipes:[`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Contract`,fieldName:`taxRoundingScope`,scopeType:`app`,defaultValue:`"document"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.0825`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`creditLimit`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`customerType`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`taxRoundingScope`,scopeType:`app`,defaultValue:`"document"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.0825`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:parts`,`custom:billing`,`custom:schedule`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Estimate`,`item:commerce:Order`,`item:commerce:Customer`],"custom:parts":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`],"custom:schedule":[`item:events:Event`,`item:events:EventType`]},hidden:[`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Estimate":`custom:jobs`,"item:commerce:Order":`custom:jobs`,"item:commerce:Customer":`custom:jobs`,"item:products:Product":`custom:parts`,"item:inventory:StockLevel":`custom:parts`,"item:commerce:Vendor":`custom:parts`,"item:commerce:PurchaseOrder":`custom:parts`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:parts`,label:`Parts`},{id:`custom:billing`,label:`Billing`},{id:`custom:schedule`,label:`Schedule`}],items:{"item:commerce:Estimate":{label:`Quotes`,description:`Quotes for repairs, ready to become work orders once approved.`},"item:commerce:Order":{label:`Work orders`,description:`Every job in the shop, from drop-off to pick-up.`},"item:products:Product":{label:`Parts catalog`,description:`The parts you sell and fit, with prices.`},"item:inventory:StockLevel":{label:`Parts on hand`,description:`Parts on the shelf, so you know what to reorder.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The parts suppliers you buy from, with terms and contacts.`},"item:commerce:PurchaseOrder":{label:`Parts orders`,description:`Parts you have ordered and when they arrive.`},"item:events:Event":{label:`Appointments`,description:`Bookings on the shop calendar, by day and bay.`},"item:events:EventType":{label:`Appointment types`,description:`The kinds of service you book, like an oil change or inspection.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:parts":{icon:`package`},"custom:billing":{icon:`receipt`},"custom:schedule":{icon:`calendar`}}}},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:parts":`Parts, materials and the stock on your shelves.`,"custom:billing":`Invoices and the payments against them.`,"custom:schedule":`Appointments and what is on the calendar.`}},{id:`welder`,name:`Welder`,icon:`flame`,summary:`Quotes, jobs, agreements, material and site visits for a welding business.`,keywords:[`weld`,`welder`,`welding`,`fabrication`,`fabricate`,`metal`,`steel`,`gates`,`railings`,`metalwork`,`boilermaker`],settings:{currency:`USD`,paymentTerms:`50% deposit, balance on completion`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{preset:`studio`},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:material`,`custom:billing`,`custom:schedule`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Order`,`item:commerce:Customer`,`item:commerce:Estimate`,`item:commerce:Agreement`],"custom:material":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`],"custom:schedule":[`item:events:Event`,`item:events:EventType`]},hidden:[`item:commerce:Contract`,`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Customer":`custom:jobs`,"item:commerce:Estimate":`custom:jobs`,"item:commerce:Agreement":`custom:jobs`,"item:products:Product":`custom:material`,"item:inventory:StockLevel":`custom:material`,"item:commerce:Vendor":`custom:material`,"item:commerce:PurchaseOrder":`custom:material`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:commerce:Order":`custom:jobs`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:material`,label:`Material`},{id:`custom:billing`,label:`Billing`},{id:`custom:schedule`,label:`Schedule`}],items:{"item:commerce:Estimate":{label:`Quotes`,description:`Quotes for jobs, ready to turn into orders when accepted.`},"item:products:Product":{label:`Steel & supplies`,description:`Steel, rod, gas and other materials you stock and charge for.`},"item:inventory:StockLevel":{label:`Material on hand`,description:`Material on hand, so you know what to buy before the next job.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The suppliers you buy metal and gas from.`},"item:commerce:PurchaseOrder":{label:`Material orders`,description:`Material you have ordered and when it lands.`},"item:events:Event":{label:`Site visits`,description:`Visits to measure, quote or install on site, by day.`},"item:events:EventType":{label:`Visit types`,description:`The kinds of visit you make, like a quote visit or install.`},"item:commerce:Order":{label:`Work orders`,description:`Every job you have won, from start to final invoice.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:material":{icon:`layers`},"custom:billing":{icon:`receipt`},"custom:schedule":{icon:`calendar`}}}},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:material":`Material, stock and what you have ordered.`,"custom:billing":`Invoices and the payments against them.`,"custom:schedule":`Appointments and what is on the calendar.`}},{id:`yoga-studio`,name:`Yoga studio`,icon:`yoga`,summary:`Classes, class series, members, memberships and a small retail shop.`,keywords:[`yoga`,`yoga studio`,`pilates`,`studio`,`classes`,`class series`,`meditation`,`members`,`memberships`,`instructor`],settings:{currency:`USD`,paymentTerms:`Due on receipt`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#0f766e`,fontFamily:`ui-rounded`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.invoicing`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`creditLimit`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`customerType`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`taxExempt`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`taxId`,scopeType:`app`,visibility:`hidden`}],layout:{version:1,sectionOrder:[`custom:classes`,`custom:members`,`custom:shop`,`custom:billing`,`section:accounting`],itemOrder:{"custom:classes":[`item:events:Event`,`item:events:EventSeries`,`item:events:EventType`],"custom:members":[`item:commerce:Customer`,`item:commerce:Agreement`],"custom:shop":[`item:products:Product`,`item:inventory:StockLevel`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:commerce:Contract`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:events:Event":`custom:classes`,"item:events:EventSeries":`custom:classes`,"item:events:EventType":`custom:classes`,"item:commerce:Customer":`custom:members`,"item:commerce:Agreement":`custom:members`,"item:products:Product":`custom:shop`,"item:inventory:StockLevel":`custom:shop`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:classes`,label:`Classes`},{id:`custom:members`,label:`Members`},{id:`custom:shop`,label:`Shop`},{id:`custom:billing`,label:`Billing`}],items:{"item:events:Event":{label:`Class schedule`,description:`Every class on your timetable, with who's teaching and where.`},"item:events:EventSeries":{label:`Class series`,description:`Weekly classes that repeat, so you set them up once.`},"item:events:EventType":{label:`Class types`,description:`Your styles, like Vinyasa or Yin, with length and price.`},"item:commerce:Customer":{label:`Students`,description:`Your students, with how to reach them and what they have booked.`},"item:commerce:Agreement":{label:`Memberships`,description:`Memberships and class packs, with who holds them and when they renew.`},"item:inventory:StockLevel":{label:`Stock`,description:`Mats, props and retail items on hand.`}},sections:{"custom:classes":{icon:`school`},"custom:members":{icon:`users`},"custom:shop":{icon:`shoppingBag`},"custom:billing":{icon:`receipt`}}}},sectionDescriptions:{"custom:classes":`Classes, sessions and bookings.`,"custom:members":`Members and their memberships.`,"custom:shop":`Sell to customers and keep their details.`,"custom:billing":`Invoices and the payments against them.`}},{id:`landscaping`,name:`Landscaping`,icon:`leaf`,summary:`Quotes, jobs, maintenance contracts, materials and the crew schedule for a lawn and landscape business.`,keywords:[`landscaping`,`landscaper`,`lawn care`,`lawn`,`mowing`,`garden`,`gardener`,`yard work`,`hardscape`,`irrigation`,`tree service`,`snow removal`,`grounds`],settings:{currency:`USD`,paymentTerms:`Net 15`,taxRate:.06},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:schedule":`Appointments and what is on the calendar.`,"custom:yard":`Materials, stock and the suppliers you buy from.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#15803d`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.06`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.06`},{objectRef:`@happyvertical/smrt-commerce:Lease`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:schedule`,`custom:yard`,`custom:billing`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Estimate`,`item:commerce:Order`,`item:commerce:Customer`,`item:commerce:Agreement`],"custom:schedule":[`item:events:Event`,`item:events:EventSeries`,`item:events:EventType`],"custom:yard":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:commerce:Contract`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Estimate":`custom:jobs`,"item:commerce:Order":`custom:jobs`,"item:commerce:Customer":`custom:jobs`,"item:commerce:Agreement":`custom:jobs`,"item:events:Event":`custom:schedule`,"item:events:EventSeries":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:products:Product":`custom:yard`,"item:inventory:StockLevel":`custom:yard`,"item:commerce:Vendor":`custom:yard`,"item:commerce:PurchaseOrder":`custom:yard`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:schedule`,label:`Schedule`},{id:`custom:yard`,label:`Yard`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Estimate":{label:`Quotes`,description:`Quotes for new work, ready to become jobs once approved.`},"item:commerce:Order":{label:`Work orders`,description:`Every job you have won, from the first visit to the final invoice.`},"item:commerce:Agreement":{label:`Maintenance contracts`,description:`Weekly mowing and seasonal programs, with who holds them and when they renew.`},"item:events:Event":{label:`Crew schedule`,description:`Visits on the calendar, by day and crew.`},"item:events:EventSeries":{label:`Recurring visits`,description:`Routes that repeat, like a Tuesday mowing round, set up once.`},"item:events:EventType":{label:`Visit types`,description:`The kinds of visit you make, like a mow, a clean-up or an install.`},"item:products:Product":{label:`Materials`,description:`Mulch, soil, sod, plants and the other things you sell and install.`},"item:inventory:StockLevel":{label:`Materials on hand`,description:`What is in the yard and on the trucks.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The nurseries and stone yards you buy from.`},"item:commerce:PurchaseOrder":{label:`Material orders`,description:`Material you have ordered and when it lands.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:schedule":{icon:`calendar`},"custom:yard":{icon:`package`},"custom:billing":{icon:`receipt`}}}}},{id:`salon`,name:`Hair salon`,icon:`scissors`,summary:`Appointments, clients, services, retail stock and payments at the desk for a salon or barbershop.`,keywords:[`salon`,`hair salon`,`barber`,`barbershop`,`hairdresser`,`stylist`,`haircut`,`hair colour`,`hair color`,`highlights`,`blow-dry`,`nails`,`beauty`,`spa`],settings:{currency:`USD`,paymentTerms:`Due on receipt`,taxRate:.07,pricesIncludeTax:!0},sectionDescriptions:{"custom:appointments":`Bookings and the services behind them.`,"custom:clients":`Clients and what they usually have.`,"custom:checkout":`Sales at the desk and the payments against them.`,"custom:shelf":`Retail, backbar stock and who you buy from.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#9d174d`}},recipes:[`commerce.customers`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Contract`,fieldName:`lineAmountType`,scopeType:`app`,defaultValue:`"inclusive"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.07`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`creditLimit`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`customerType`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`taxExempt`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`taxId`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`lineAmountType`,scopeType:`app`,defaultValue:`"inclusive"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.07`},{objectRef:`@happyvertical/smrt-commerce:Lease`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`}],layout:{version:1,sectionOrder:[`custom:appointments`,`custom:clients`,`custom:checkout`,`custom:shelf`,`section:accounting`],itemOrder:{"custom:appointments":[`item:events:Event`,`item:events:EventType`,`item:events:EventSeries`],"custom:clients":[`item:commerce:Customer`],"custom:checkout":[`item:commerce:Order`,`item:commerce:Payment`,`item:commerce:Invoice`],"custom:shelf":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`]},hidden:[`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:events:Event":`custom:appointments`,"item:events:EventType":`custom:appointments`,"item:events:EventSeries":`custom:appointments`,"item:commerce:Customer":`custom:clients`,"item:commerce:Order":`custom:checkout`,"item:commerce:Payment":`custom:checkout`,"item:commerce:Invoice":`custom:checkout`,"item:products:Product":`custom:shelf`,"item:inventory:StockLevel":`custom:shelf`,"item:commerce:Vendor":`custom:shelf`,"item:commerce:PurchaseOrder":`custom:shelf`},customSections:[{id:`custom:appointments`,label:`Appointments`},{id:`custom:clients`,label:`Clients`},{id:`custom:checkout`,label:`Checkout`},{id:`custom:shelf`,label:`Shelf`}],items:{"item:events:Event":{label:`Bookings`,description:`Every booking in the book, by stylist and chair.`},"item:events:EventType":{label:`Appointment types`,description:`The services you book, like a cut, a colour or a beard trim, with their length.`},"item:events:EventSeries":{label:`Standing appointments`,description:`Regulars who come back every few weeks, set up once.`},"item:commerce:Customer":{label:`Client cards`,description:`Your clients, with how to reach them and what they usually have.`},"item:commerce:Order":{label:`Sales`,description:`Each visit’s ticket: the services done and anything bought at the desk.`},"item:commerce:Payment":{label:`Payments`,description:`Money taken at the desk, by card or cash.`},"item:commerce:Invoice":{label:`Invoices`,description:`Bills for bridal parties, packages and accounts that pay later.`},"item:products:Product":{label:`Services & products`,description:`Your services and the retail you sell, with prices.`},"item:inventory:StockLevel":{label:`Retail stock`,description:`Product on the shelf and at the backbar.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The distributors you buy colour, product and towels from.`},"item:commerce:PurchaseOrder":{label:`Supply orders`,description:`Product you have ordered and when it arrives.`}},sections:{"custom:appointments":{icon:`calendar`},"custom:clients":{icon:`users`},"custom:checkout":{icon:`creditCard`},"custom:shelf":{icon:`shoppingBag`}}}}},{id:`roaster`,name:`Coffee roaster`,icon:`coffee`,summary:`Cafe accounts, online orders, green coffee, roast batches and importers for a small roastery or brewery.`,keywords:[`coffee roaster`,`roaster`,`roastery`,`coffee`,`beans`,`green coffee`,`espresso`,`cafe accounts`,`brewery`,`microbrewery`,`taproom`,`kegs`,`small batch`],settings:{currency:`USD`,paymentTerms:`Net 30`,taxRate:.0725},sectionDescriptions:{"custom:shop":`Sell to customers and keep their details.`,"custom:wholesale":`Orders, invoices and payments from trade customers.`,"custom:roastery":`Coffees, green coffee, stock and what you are roasting.`,"custom:buying":`Suppliers and what you order from them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#7c2d12`,fontFamily:`Georgia`}},recipes:[`commerce.customers`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`commerce.wholesale`,`inventory.stock`,`ledgers.bookkeeping`,`products.ingredients`,`products.simple`],features:[`@happyvertical/smrt-commerce:ProductionOrder`],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.0725`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.0725`},{objectRef:`@happyvertical/smrt-commerce:Lease`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:ProductionOrder`,fieldName:`channelId`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:ProductionOrder`,fieldName:`expiryDate`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:ProductionOrder`,fieldName:`vendorId`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`}],layout:{version:1,sectionOrder:[`custom:shop`,`custom:wholesale`,`custom:roastery`,`custom:buying`,`section:accounting`],itemOrder:{"custom:shop":[`item:commerce:Order`,`item:commerce:Customer`],"custom:wholesale":[`item:commerce:WholesaleOrder`,`item:commerce:Invoice`,`item:commerce:Payment`],"custom:roastery":[`item:products:Product`,`item:products:Product:ingredients`,`item:inventory:StockLevel`,`item:commerce:ProductionOrder`],"custom:buying":[`item:commerce:Vendor`,`item:commerce:PurchaseOrder`]},hidden:[`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Order":`custom:shop`,"item:commerce:Customer":`custom:shop`,"item:commerce:WholesaleOrder":`custom:wholesale`,"item:commerce:Invoice":`custom:wholesale`,"item:commerce:Payment":`custom:wholesale`,"item:products:Product":`custom:roastery`,"item:products:Product:ingredients":`custom:roastery`,"item:inventory:StockLevel":`custom:roastery`,"item:commerce:ProductionOrder":`custom:roastery`,"item:commerce:Vendor":`custom:buying`,"item:commerce:PurchaseOrder":`custom:buying`},customSections:[{id:`custom:shop`,label:`Shop`},{id:`custom:wholesale`,label:`Wholesale`},{id:`custom:roastery`,label:`Roastery`},{id:`custom:buying`,label:`Buying`}],items:{"item:commerce:Order":{label:`Online & retail orders`,description:`Orders from the website and the roastery door.`},"item:commerce:WholesaleOrder":{label:`Cafe orders`,description:`Standing and one-off orders from cafes, bars and grocers.`},"item:products:Product":{label:`Coffees`,description:`Roasted coffees and shop items, with prices.`},"item:products:Product:ingredients":{label:`Green coffee`,description:`Green coffee and packaging, by the bag, with costs.`},"item:inventory:StockLevel":{label:`Stock`,description:`Roasted and green coffee on hand today.`},"item:commerce:ProductionOrder":{label:`Roast batches`,description:`What you plan to roast, with the amounts and the day.`},"item:commerce:Vendor":{label:`Importers & suppliers`,description:`The importers and packaging suppliers you buy from.`},"item:commerce:PurchaseOrder":{label:`Green coffee orders`,description:`Green coffee you have bought and when the container lands.`}},sections:{"custom:shop":{icon:`shoppingBag`},"custom:wholesale":{icon:`briefcase`},"custom:roastery":{icon:`package`},"custom:buying":{icon:`truck`}}}}},{id:`equipment-rental`,name:`Equipment rental`,icon:`forklift`,summary:`Rentals, quotes, the fleet and its availability, pickups and returns, and billing for a hire yard.`,keywords:[`equipment rental`,`rental`,`rentals`,`hire`,`tool hire`,`plant hire`,`party rental`,`excavator`,`scaffolding`,`generators`,`bike rental`,`kayak rental`,`fleet`],settings:{currency:`USD`,paymentTerms:`Deposit on pickup, balance on return`,taxRate:.08,taxRounding:`document`},sectionDescriptions:{"custom:rentals":`Rentals, quotes and the customers they belong to.`,"custom:fleet":`Equipment, availability and who you buy from.`,"custom:schedule":`Appointments and what is on the calendar.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#a16207`}},recipes:[`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.leases`,`commerce.purchases`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`},{objectRef:`@happyvertical/smrt-commerce:Contract`,fieldName:`taxRoundingScope`,scopeType:`app`,defaultValue:`"document"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.08`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`taxRoundingScope`,scopeType:`app`,defaultValue:`"document"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.08`},{objectRef:`@happyvertical/smrt-commerce:Lease`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Deposit on pickup, balance on return"`}],layout:{version:1,sectionOrder:[`custom:rentals`,`custom:fleet`,`custom:schedule`,`custom:billing`,`section:accounting`],itemOrder:{"custom:rentals":[`item:commerce:Lease`,`item:commerce:Estimate`,`item:commerce:Customer`],"custom:fleet":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:schedule":[`item:events:Event`,`item:events:EventType`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Lease":`custom:rentals`,"item:commerce:Estimate":`custom:rentals`,"item:commerce:Customer":`custom:rentals`,"item:products:Product":`custom:fleet`,"item:inventory:StockLevel":`custom:fleet`,"item:commerce:Vendor":`custom:fleet`,"item:commerce:PurchaseOrder":`custom:fleet`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:rentals`,label:`Rentals`},{id:`custom:fleet`,label:`Fleet`},{id:`custom:schedule`,label:`Schedule`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Lease":{label:`Rental contracts`,description:`Every rental out the gate, with the dates and what is due.`},"item:commerce:Estimate":{label:`Quotes`,description:`Quotes for a hire, ready to become a rental when accepted.`},"item:products:Product":{label:`Equipment`,description:`The machines and tools you hire out, with the daily rate.`},"item:inventory:StockLevel":{label:`Availability`,description:`What is in the yard, out on hire or in for service.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The dealers and parts suppliers you buy from.`},"item:commerce:PurchaseOrder":{label:`Equipment & parts orders`,description:`Machines and parts you have ordered and when they arrive.`},"item:events:Event":{label:`Pickups & returns`,description:`Pickups, returns and deliveries on the calendar, by day.`},"item:events:EventType":{label:`Booking types`,description:`The kinds of booking you make, like a pickup, a return or a delivery.`}},sections:{"custom:rentals":{icon:`fileText`},"custom:fleet":{icon:`truck`},"custom:schedule":{icon:`calendar`},"custom:billing":{icon:`receipt`}}}}},{id:`nonprofit`,name:`Non-profit`,icon:`heart`,summary:`Members, memberships, dues and donations, events and the books for a club, society or charity.`,keywords:[`non-profit`,`nonprofit`,`charity`,`club`,`society`,`association`,`members`,`membership dues`,`donations`,`donors`,`fundraiser`,`volunteers`,`community group`],settings:{currency:`USD`,paymentTerms:`Due on receipt`,taxRate:0},sectionDescriptions:{"custom:members":`Members and their memberships.`,"custom:events":`Meetings, fundraisers and volunteer days.`,"custom:giving":`Dues, pledges and the money that comes in.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#1d4ed8`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.invoicing`,`events.calendar`,`ledgers.bookkeeping`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`creditLimit`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`customerType`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`taxExempt`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`taxId`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Lease`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on receipt"`}],layout:{version:1,sectionOrder:[`custom:members`,`custom:events`,`custom:giving`,`section:accounting`],itemOrder:{"custom:members":[`item:commerce:Customer`,`item:commerce:Agreement`],"custom:events":[`item:events:Event`,`item:events:EventSeries`,`item:events:EventType`],"custom:giving":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:commerce:Contract`],moved:{"item:commerce:Customer":`custom:members`,"item:commerce:Agreement":`custom:members`,"item:events:Event":`custom:events`,"item:events:EventSeries":`custom:events`,"item:events:EventType":`custom:events`,"item:commerce:Invoice":`custom:giving`,"item:commerce:Payment":`custom:giving`},customSections:[{id:`custom:members`,label:`Members`},{id:`custom:events`,label:`Events`},{id:`custom:giving`,label:`Giving`}],items:{"item:commerce:Customer":{label:`Members & donors`,description:`Your members and donors, with how to reach them.`},"item:commerce:Agreement":{label:`Memberships`,description:`Annual, family and student memberships, with who holds them and when they renew.`},"item:events:Event":{label:`Event calendar`,description:`Meetings, fundraisers and volunteer days, with who is coming.`},"item:events:EventSeries":{label:`Regular meetings`,description:`Meetings that repeat, like the monthly meetup, set up once.`},"item:events:EventType":{label:`Event types`,description:`The kinds of event you run, like a fundraiser or a clean-up.`},"item:commerce:Invoice":{label:`Dues & pledges`,description:`Dues and pledges you have asked for and which are still owed.`},"item:commerce:Payment":{label:`Donations & payments`,description:`Money that has come in, from dues, gifts and tickets.`}},sections:{"custom:members":{icon:`users`},"custom:events":{icon:`calendar`},"custom:giving":{icon:`creditCard`}}}}},{id:`agency`,name:`Agency`,icon:`pencil`,summary:`Clients, proposals, retainers, projects, time, expenses and invoices for a consulting or design studio.`,keywords:[`agency`,`design agency`,`consulting`,`consultant`,`consultancy`,`studio`,`design studio`,`freelance`,`retainer`,`proposals`,`billable hours`,`timesheets`,`creative`],settings:{currency:`USD`,paymentTerms:`Net 30`,taxRate:0},sectionDescriptions:{"custom:accounts":`Clients, proposals and the contracts you hold with them.`,"custom:work":`Projects, tasks, time and costs.`,"custom:meetings":`Meetings with clients and the studio.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#4338ca`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.vendors`,`events.calendar`,`expenses.tracking`,`ledgers.bookkeeping`,`projects.tracker`,`timesheets.time-entries`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`creditLimit`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`customerType`,scopeType:`app`,visibility:`hidden`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Lease`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:WholesaleOrder`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`}],layout:{version:1,sectionOrder:[`custom:accounts`,`custom:work`,`custom:meetings`,`custom:billing`,`section:accounting`],itemOrder:{"custom:accounts":[`item:commerce:Customer`,`item:commerce:Estimate`,`item:commerce:Agreement`],"custom:work":[`item:projects:Project`,`item:projects:Issue`,`item:timesheets:ServiceTimeEntry`,`item:expenses:Expense`],"custom:meetings":[`item:events:Event`,`item:events:EventType`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`,`item:commerce:Vendor`]},hidden:[`item:commerce:Contract`,`item:projects:Label`,`item:events:EventSeries`],moved:{"item:commerce:Customer":`custom:accounts`,"item:commerce:Estimate":`custom:accounts`,"item:commerce:Agreement":`custom:accounts`,"item:projects:Project":`custom:work`,"item:projects:Issue":`custom:work`,"item:timesheets:ServiceTimeEntry":`custom:work`,"item:expenses:Expense":`custom:work`,"item:events:Event":`custom:meetings`,"item:events:EventType":`custom:meetings`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`,"item:commerce:Vendor":`custom:billing`},customSections:[{id:`custom:accounts`,label:`Clients`},{id:`custom:work`,label:`Work`},{id:`custom:meetings`,label:`Meetings`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Customer":{label:`Client companies`,description:`The companies you work for, with how to reach them.`},"item:commerce:Estimate":{label:`Proposals`,description:`Proposals you have sent, ready to become a contract when accepted.`},"item:commerce:Agreement":{label:`Contracts`,description:`Retainers and statements of work, with the terms and the dates.`},"item:projects:Project":{label:`Projects`,description:`Each engagement, with what it covers and where it stands.`},"item:projects:Issue":{label:`Tasks`,description:`The work inside each project, from to-do to done.`},"item:timesheets:ServiceTimeEntry":{label:`Time entries`,description:`Hours logged by person and project, from draft to approved.`},"item:expenses:Expense":{label:`Expenses`,description:`Costs on a project, with the receipt and whether to bill them on.`},"item:events:Event":{label:`Client meetings`,description:`Kickoffs, reviews and check-ins with clients, by day.`},"item:events:EventType":{label:`Meeting types`,description:`The kinds of meeting you hold, like a kickoff or a review.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The printers, photographers and freelancers you buy from.`}},sections:{"custom:accounts":{icon:`users`},"custom:work":{icon:`briefcase`},"custom:meetings":{icon:`calendar`},"custom:billing":{icon:`receipt`}}}}},{id:`plumber`,name:`Plumber`,icon:`tool`,summary:`Quotes, service calls, parts, appointments and billing for a plumbing business.`,keywords:[`plumber`,`plumbing`,`pipes`,`leak`,`drain`,`blocked drain`,`water heater`,`boiler`,`bathroom`,`faucet`,`toilet`,`sewer`,`emergency call-out`,`gas fitter`],settings:{currency:`USD`,paymentTerms:`Due on completion`,taxRate:.07},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:parts":`Parts, materials and the stock on your shelves.`,"custom:schedule":`Appointments and what is on the calendar.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#0e7490`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on completion"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.07`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Due on completion"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on completion"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on completion"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.07`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Due on completion"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:schedule`,`custom:parts`,`custom:billing`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Order`,`item:commerce:Estimate`,`item:commerce:Customer`,`item:commerce:Agreement`],"custom:schedule":[`item:events:Event`,`item:events:EventType`],"custom:parts":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:commerce:Contract`,`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Order":`custom:jobs`,"item:commerce:Estimate":`custom:jobs`,"item:commerce:Customer":`custom:jobs`,"item:commerce:Agreement":`custom:jobs`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:products:Product":`custom:parts`,"item:inventory:StockLevel":`custom:parts`,"item:commerce:Vendor":`custom:parts`,"item:commerce:PurchaseOrder":`custom:parts`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:schedule`,label:`Schedule`},{id:`custom:parts`,label:`Parts`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Order":{label:`Service calls`,description:`Call-outs and booked jobs, emergencies first, from the first call to the final invoice.`},"item:commerce:Estimate":{label:`Quotes`,description:`Quotes for installs and bigger repairs, ready to book once approved.`},"item:commerce:Agreement":{label:`Service plans`,description:`Yearly water heater and drain service plans, with who holds them and when they renew.`},"item:events:Event":{label:`Appointments`,description:`Calls on the calendar, by day and van.`},"item:events:EventType":{label:`Call types`,description:`The kinds of call you take, like a leak, a blocked drain or a water heater install.`},"item:products:Product":{label:`Parts & fittings`,description:`Valves, fittings, pipe and fixtures you fit and charge for.`},"item:inventory:StockLevel":{label:`Van stock`,description:`What is on each van and in the store, so a call is not a second trip.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The plumbing merchants and wholesalers you buy from.`},"item:commerce:PurchaseOrder":{label:`Parts orders`,description:`Parts you have ordered and when they are ready for pickup.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:schedule":{icon:`calendar`},"custom:parts":{icon:`package`},"custom:billing":{icon:`receipt`}}}}},{id:`electrician`,name:`Electrician`,icon:`bolt`,summary:`Quotes, installs, repairs, materials and billing for an electrical contractor.`,keywords:[`electrician`,`electrical`,`electric`,`wiring`,`rewire`,`panel upgrade`,`breaker`,`lighting`,`outlets`,`ev charger`,`inspection`,`sparky`,`electrical contractor`],settings:{currency:`USD`,paymentTerms:`Net 15`,taxRate:.0625},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:material":`Material, stock and what you have ordered.`,"custom:schedule":`Appointments and what is on the calendar.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#ca8a04`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.0625`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.0625`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 15"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:schedule`,`custom:material`,`custom:billing`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Estimate`,`item:commerce:Order`,`item:commerce:Customer`,`item:commerce:Agreement`],"custom:schedule":[`item:events:Event`,`item:events:EventType`],"custom:material":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:commerce:Contract`,`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Estimate":`custom:jobs`,"item:commerce:Order":`custom:jobs`,"item:commerce:Customer":`custom:jobs`,"item:commerce:Agreement":`custom:jobs`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:products:Product":`custom:material`,"item:inventory:StockLevel":`custom:material`,"item:commerce:Vendor":`custom:material`,"item:commerce:PurchaseOrder":`custom:material`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:schedule`,label:`Schedule`},{id:`custom:material`,label:`Material`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Estimate":{label:`Quotes`,description:`Priced quotes for installs, rewires and upgrades, ready to schedule once accepted.`},"item:commerce:Order":{label:`Work orders`,description:`Installs, repairs and inspections you have won, from rough-in to sign-off.`},"item:commerce:Agreement":{label:`Maintenance contracts`,description:`Planned maintenance and testing for commercial sites, with renewal dates.`},"item:events:Event":{label:`Site visits`,description:`Visits to quote, wire, inspect or test, by day and electrician.`},"item:events:EventType":{label:`Visit types`,description:`The kinds of visit you make, like a panel upgrade, a fault call or an inspection.`},"item:products:Product":{label:`Electrical supplies`,description:`Cable, breakers, devices and fixtures you stock and charge for.`},"item:inventory:StockLevel":{label:`Materials on hand`,description:`Cable and parts in the shop and on the trucks.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The electrical wholesalers and lighting suppliers you buy from.`},"item:commerce:PurchaseOrder":{label:`Material orders`,description:`Material you have ordered and when it lands.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:schedule":{icon:`calendar`},"custom:material":{icon:`layers`},"custom:billing":{icon:`receipt`}}}}},{id:`painter`,name:`Painter`,icon:`brush`,summary:`Estimates, jobs, paint and materials, crew schedule and billing for a painting business.`,keywords:[`painter`,`painting`,`decorator`,`decorating`,`house painting`,`interior painting`,`exterior painting`,`wallpaper`,`drywall repair`,`cabinet painting`,`stain`,`repaint`],settings:{currency:`USD`,paymentTerms:`50% deposit, balance on completion`,taxRate:.06},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:paint":`Paint, sundries and the stock in your store room.`,"custom:schedule":`Appointments and what is on the calendar.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#be185d`}},recipes:[`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.06`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.06`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"50% deposit, balance on completion"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:schedule`,`custom:paint`,`custom:billing`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Estimate`,`item:commerce:Order`,`item:commerce:Customer`],"custom:schedule":[`item:events:Event`,`item:events:EventType`],"custom:paint":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Estimate":`custom:jobs`,"item:commerce:Order":`custom:jobs`,"item:commerce:Customer":`custom:jobs`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:products:Product":`custom:paint`,"item:inventory:StockLevel":`custom:paint`,"item:commerce:Vendor":`custom:paint`,"item:commerce:PurchaseOrder":`custom:paint`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:schedule`,label:`Crew`},{id:`custom:paint`,label:`Paint & supplies`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Estimate":{label:`Estimates`,description:`Room-by-room estimates from the site visit, ready to book once signed.`},"item:commerce:Order":{label:`Projects`,description:`Every painting project you have booked, from prep to the final walkthrough.`},"item:events:Event":{label:`Crew schedule`,description:`Site visits and crew days on the calendar, by job.`},"item:events:EventType":{label:`Visit types`,description:`The kinds of day you book, like an estimate visit, prep or a touch-up.`},"item:products:Product":{label:`Paint & sundries`,description:`Paint, primer, caulk, tape and the other things you use and charge for.`},"item:inventory:StockLevel":{label:`Paint on hand`,description:`Paint and supplies in the store room and on the van.`},"item:commerce:Vendor":{label:`Paint suppliers`,description:`The paint stores and suppliers you buy from, with trade terms.`},"item:commerce:PurchaseOrder":{label:`Supply orders`,description:`Paint and supplies you have ordered and when they are ready.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:schedule":{icon:`calendar`},"custom:paint":{icon:`package`},"custom:billing":{icon:`receipt`}}}}},{id:`roofer`,name:`Roofer`,icon:`home`,summary:`Inspections, quotes, jobs, materials and billing for a roofing contractor.`,keywords:[`roofer`,`roofing`,`roof`,`roof repair`,`reroof`,`shingles`,`gutters`,`flashing`,`leaking roof`,`storm damage`,`flat roof`,`skylight`],settings:{currency:`USD`,paymentTerms:`Net 30`,taxRate:.07},sectionDescriptions:{"custom:jobs":`Work orders and the customers they belong to.`,"custom:material":`Material, stock and what you have ordered.`,"custom:schedule":`Appointments and what is on the calendar.`,"custom:billing":`Invoices and the payments against them.`},document:{$schema:`https://s-m-r-t.dev/schemas/cookbook/v1.json`,version:1,theme:{custom:{primary:`#475569`}},recipes:[`commerce.agreements`,`commerce.customers`,`commerce.estimates`,`commerce.invoicing`,`commerce.purchases`,`commerce.sales`,`commerce.vendors`,`events.calendar`,`inventory.stock`,`ledgers.bookkeeping`,`products.simple`],features:[],policies:[{objectRef:`@happyvertical/smrt-commerce:Agreement`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:ContractLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.07`},{objectRef:`@happyvertical/smrt-commerce:Customer`,fieldName:`paymentTerms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Estimate`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`currency`,scopeType:`app`,defaultValue:`"USD"`},{objectRef:`@happyvertical/smrt-commerce:Invoice`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`},{objectRef:`@happyvertical/smrt-commerce:InvoiceLineItem`,fieldName:`taxRate`,scopeType:`app`,defaultValue:`0.07`},{objectRef:`@happyvertical/smrt-commerce:Order`,fieldName:`terms`,scopeType:`app`,defaultValue:`"Net 30"`}],layout:{version:1,sectionOrder:[`custom:jobs`,`custom:schedule`,`custom:material`,`custom:billing`,`section:accounting`],itemOrder:{"custom:jobs":[`item:commerce:Estimate`,`item:commerce:Order`,`item:commerce:Customer`,`item:commerce:Agreement`],"custom:schedule":[`item:events:Event`,`item:events:EventType`],"custom:material":[`item:products:Product`,`item:inventory:StockLevel`,`item:commerce:Vendor`,`item:commerce:PurchaseOrder`],"custom:billing":[`item:commerce:Invoice`,`item:commerce:Payment`]},hidden:[`item:commerce:Contract`,`item:events:EventSeries`,`item:inventory:InventoryLocation`,`item:inventory:StockMovement`],moved:{"item:commerce:Estimate":`custom:jobs`,"item:commerce:Order":`custom:jobs`,"item:commerce:Customer":`custom:jobs`,"item:commerce:Agreement":`custom:jobs`,"item:events:Event":`custom:schedule`,"item:events:EventType":`custom:schedule`,"item:products:Product":`custom:material`,"item:inventory:StockLevel":`custom:material`,"item:commerce:Vendor":`custom:material`,"item:commerce:PurchaseOrder":`custom:material`,"item:commerce:Invoice":`custom:billing`,"item:commerce:Payment":`custom:billing`},customSections:[{id:`custom:jobs`,label:`Jobs`},{id:`custom:schedule`,label:`Schedule`},{id:`custom:material`,label:`Material`},{id:`custom:billing`,label:`Billing`}],items:{"item:commerce:Estimate":{label:`Quotes`,description:`Quotes written up after an inspection, for repairs and full replacements.`},"item:commerce:Order":{label:`Roofing jobs`,description:`Repairs and re-roofs you have won, from tear-off to final cleanup.`},"item:commerce:Agreement":{label:`Maintenance agreements`,description:`Yearly inspection and gutter programs for homes and buildings, with renewal dates.`},"item:events:Event":{label:`Inspections & visits`,description:`Roof inspections, measure-ups and crew days on the calendar.`},"item:events:EventType":{label:`Visit types`,description:`The kinds of visit you make, like an inspection, a storm check or a tear-off.`},"item:products:Product":{label:`Roofing products`,description:`Shingles, underlayment, flashing and fasteners you install and charge for.`},"item:inventory:StockLevel":{label:`Materials on hand`,description:`Bundles and rolls in the yard and on the trailer.`},"item:commerce:Vendor":{label:`Suppliers`,description:`The roofing distributors and lumber yards you buy from.`},"item:commerce:PurchaseOrder":{label:`Material orders`,description:`Material you have ordered and when it is delivered to site.`}},sections:{"custom:jobs":{icon:`wrench`},"custom:schedule":{icon:`calendar`},"custom:material":{icon:`layers`},"custom:billing":{icon:`receipt`}}}}}]},n=new Intl.Collator(`en`,{sensitivity:`base`,numeric:!0}),r=[...t.cookbooks].sort((e,t)=>n.compare(e.name,t.name));function i(e){return r.find(t=>t.id===e)}function a(t){return t.document.recipes.map(t=>e.get(t)?.label??t)}export{r as n,a as r,i as t};