@happyvertical/smrt-planner 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +170 -2
- package/app/404.html +80 -0
- package/app/_app/immutable/assets/0.B5zXkXe_.css +1 -0
- package/app/_app/immutable/assets/10.hpcnxvK1.css +1 -0
- package/app/_app/immutable/assets/11.D7zoXfVV.css +1 -0
- package/app/_app/immutable/assets/12.CPobm1ED.css +1 -0
- package/app/_app/immutable/assets/2.CyaWdRdI.css +1 -0
- package/app/_app/immutable/assets/3.BlPQOes8.css +1 -0
- package/app/_app/immutable/assets/8.2gQeKBp_.css +1 -0
- package/app/_app/immutable/assets/9.HOPT4xtg.css +1 -0
- package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +1 -0
- package/app/_app/immutable/assets/Button.DkP0qkG9.css +1 -0
- package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +1 -0
- package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +1 -0
- package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +1 -0
- package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +1 -0
- package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +1 -0
- package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +1 -0
- package/app/_app/immutable/assets/dist.C5nHBk_O.css +1 -0
- package/app/_app/immutable/assets/feedback.BVKAwFck.css +1 -0
- package/app/_app/immutable/assets/forms.BChZ2RWM.css +1 -0
- package/app/_app/immutable/assets/inter-latin-ext.B_-bZUTo.woff2 +0 -0
- package/app/_app/immutable/assets/inter-latin.8kRkwJBP.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin-ext.Bnd2h4Br.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin.Db4Uuiha.woff2 +0 -0
- package/app/_app/immutable/assets/ort-wasm-simd-threaded.asyncify.CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/assets/percent.LH0z-ozZ.css +1 -0
- package/app/_app/immutable/assets/space-grotesk-latin-ext.wJGaI8U0.woff2 +0 -0
- package/app/_app/immutable/assets/space-grotesk-latin.DPT1xrvW.woff2 +0 -0
- package/app/_app/immutable/assets/store.CGDwHkkF.css +1 -0
- package/app/_app/immutable/assets/ui.B1A1Zl2p.css +1 -0
- package/app/_app/immutable/assets/workspace.BIMkuZDb.css +1 -0
- package/app/_app/immutable/chunks/1okeBSoq.js +1 -0
- package/app/_app/immutable/chunks/2jFBkS1C.js +1 -0
- package/app/_app/immutable/chunks/6P9zxrzU.js +1 -0
- package/app/_app/immutable/chunks/B32EWqI8.js +9 -0
- package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
- package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
- package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
- package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
- package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
- package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
- package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
- package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
- package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/app/_app/immutable/chunks/BnRri03M.js +1 -0
- package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
- package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
- package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
- package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
- package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
- package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
- package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
- package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
- package/app/_app/immutable/chunks/Ci0DUht6.js +34 -0
- package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
- package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
- package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
- package/app/_app/immutable/chunks/CsprTb3f.js +2 -0
- package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
- package/app/_app/immutable/chunks/CygC84VT.js +2 -0
- package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
- package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
- package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
- package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
- package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
- package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
- package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
- package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
- package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
- package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
- package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
- package/app/_app/immutable/chunks/DkR8_Ws6.js +2 -0
- package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
- package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
- package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
- package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
- package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
- package/app/_app/immutable/chunks/WxSPP8QW.js +4 -0
- package/app/_app/immutable/chunks/Xp1g1t4n.js +3 -0
- package/app/_app/immutable/chunks/iET62IRm.js +2 -0
- package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
- package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
- package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
- package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/app/_app/immutable/entry/app.IZIJXhgq.js +2 -0
- package/app/_app/immutable/entry/start.BuaYHD1N.js +1 -0
- package/app/_app/immutable/nodes/0.m_U8WC7E.js +10 -0
- package/app/_app/immutable/nodes/1.Crw8ULhB.js +1 -0
- package/app/_app/immutable/nodes/10.1nQxyH9H.js +4 -0
- package/app/_app/immutable/nodes/11.Cw0JnQF3.js +1 -0
- package/app/_app/immutable/nodes/12.BIocA1aI.js +1 -0
- package/app/_app/immutable/nodes/2.CR5BwGnt.js +17 -0
- package/app/_app/immutable/nodes/3.1B56hgAG.js +1 -0
- package/app/_app/immutable/nodes/4.SSIC7sUh.js +1 -0
- package/app/_app/immutable/nodes/5.DgdwleDQ.js +1 -0
- package/app/_app/immutable/nodes/6.DmD9rqLU.js +1 -0
- package/app/_app/immutable/nodes/7.DdngsBmo.js +1 -0
- package/app/_app/immutable/nodes/8.D2Mszsua.js +3 -0
- package/app/_app/immutable/nodes/9.CLYsywul.js +1 -0
- package/app/_app/immutable/workers/assets/ort-wasm-simd-threaded.asyncify-CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/workers/llm.worker-wfCOG_uk.js +69 -0
- package/app/_app/immutable/workers/local-speech.worker-DWbfmFUk.js +51 -0
- package/app/_app/version.json +1 -0
- package/app/ai/index.html +89 -0
- package/app/blueprint/index.html +87 -0
- package/app/cookbook/index.html +87 -0
- package/app/index.html +103 -0
- package/app/m/ads/AdDeliveryTier/index.html +96 -0
- package/app/m/ads/AdEvent/index.html +96 -0
- package/app/m/ads/AdFormat/index.html +96 -0
- package/app/m/ads/AdGroup/index.html +96 -0
- package/app/m/ads/AdVariation/index.html +96 -0
- package/app/m/analytics/AnalyticsDataStream/index.html +96 -0
- package/app/m/analytics/AnalyticsEvent/index.html +96 -0
- package/app/m/analytics/AnalyticsProperty/index.html +96 -0
- package/app/m/analytics/AnalyticsReport/index.html +96 -0
- package/app/m/approvals/ApprovalEvent/index.html +96 -0
- package/app/m/approvals/ApprovalPolicy/index.html +96 -0
- package/app/m/approvals/ApprovalRequest/index.html +96 -0
- package/app/m/assets/Asset/index.html +96 -0
- package/app/m/assets/AssetAssociation/index.html +97 -0
- package/app/m/assets/AssetMetafield/index.html +96 -0
- package/app/m/assets/AssetStatus/index.html +96 -0
- package/app/m/assets/AssetType/index.html +96 -0
- package/app/m/assets/Folder/index.html +96 -0
- package/app/m/chat/AgentSession/index.html +96 -0
- package/app/m/chat/ChatMessage/index.html +97 -0
- package/app/m/chat/ChatParticipant/index.html +97 -0
- package/app/m/chat/ChatReaction/index.html +96 -0
- package/app/m/chat/ChatRoom/index.html +96 -0
- package/app/m/chat/ChatThread/index.html +97 -0
- package/app/m/chat/VoiceGatewayTurn/index.html +96 -0
- package/app/m/chat/VoiceSession/index.html +96 -0
- package/app/m/commerce/Agreement/index.html +96 -0
- package/app/m/commerce/Cart/index.html +96 -0
- package/app/m/commerce/Contract/index.html +96 -0
- package/app/m/commerce/ContractLineItem/index.html +97 -0
- package/app/m/commerce/Customer/index.html +96 -0
- package/app/m/commerce/Estimate/index.html +96 -0
- package/app/m/commerce/Fulfillment/index.html +96 -0
- package/app/m/commerce/FulfillmentLineItem/index.html +97 -0
- package/app/m/commerce/Invoice/index.html +96 -0
- package/app/m/commerce/InvoiceLineItem/index.html +97 -0
- package/app/m/commerce/Lease/index.html +96 -0
- package/app/m/commerce/LicenseSale/index.html +96 -0
- package/app/m/commerce/Order/index.html +96 -0
- package/app/m/commerce/Payment/index.html +96 -0
- package/app/m/commerce/PaymentAllocation/index.html +97 -0
- package/app/m/commerce/PaymentInstrument/index.html +96 -0
- package/app/m/commerce/PaymentIntent/index.html +96 -0
- package/app/m/commerce/Payout/index.html +96 -0
- package/app/m/commerce/ProductionOrder/index.html +96 -0
- package/app/m/commerce/PurchaseOrder/index.html +96 -0
- package/app/m/commerce/Vendor/index.html +96 -0
- package/app/m/commerce/WholesaleOrder/index.html +96 -0
- package/app/m/content/Content/index.html +96 -0
- package/app/m/content/ContentContribution/index.html +96 -0
- package/app/m/content/ContentContributionAttachment/index.html +96 -0
- package/app/m/content/ContentContributionRevision/index.html +96 -0
- package/app/m/content/ContentContributionType/index.html +96 -0
- package/app/m/content/ContentContributor/index.html +96 -0
- package/app/m/content/ContentCorrection/index.html +96 -0
- package/app/m/content/ContentFeedSource/index.html +96 -0
- package/app/m/content/ContentGovernanceAssignment/index.html +96 -0
- package/app/m/content/ContentGovernancePolicy/index.html +96 -0
- package/app/m/content/ContentGovernanceProfile/index.html +96 -0
- package/app/m/content/ContentReference/index.html +96 -0
- package/app/m/content/ContentReview/index.html +96 -0
- package/app/m/content/ContentVersion/index.html +96 -0
- package/app/m/content/Contents/index.html +96 -0
- package/app/m/events/Event/index.html +96 -0
- package/app/m/events/EventParticipant/index.html +97 -0
- package/app/m/events/EventSeries/index.html +96 -0
- package/app/m/events/EventType/index.html +96 -0
- package/app/m/facts/Fact/index.html +96 -0
- package/app/m/facts/FactContent/index.html +96 -0
- package/app/m/facts/FactEvidence/index.html +96 -0
- package/app/m/facts/FactSource/index.html +96 -0
- package/app/m/facts/FactSubject/index.html +96 -0
- package/app/m/facts/FactTag/index.html +96 -0
- package/app/m/fields/FieldPolicy/index.html +96 -0
- package/app/m/fields/FieldPolicySuggestion/index.html +96 -0
- package/app/m/fields/FieldUsageCounter/index.html +96 -0
- package/app/m/images/Image/index.html +96 -0
- package/app/m/inventory/InventoryLocation/index.html +96 -0
- package/app/m/inventory/StockLevel/index.html +96 -0
- package/app/m/inventory/StockMovement/index.html +96 -0
- package/app/m/ledgers/Account/index.html +96 -0
- package/app/m/ledgers/Journal/index.html +96 -0
- package/app/m/ledgers/JournalEntry/index.html +97 -0
- package/app/m/manufacturing/Assembly/index.html +96 -0
- package/app/m/manufacturing/BillOfMaterials/index.html +96 -0
- package/app/m/manufacturing/BomLine/index.html +96 -0
- package/app/m/manufacturing/Operation/index.html +96 -0
- package/app/m/manufacturing/ProductionRun/index.html +96 -0
- package/app/m/manufacturing/ProductionRunCompletion/index.html +96 -0
- package/app/m/manufacturing/RoutingStep/index.html +96 -0
- package/app/m/marketing/Campaign/index.html +96 -0
- package/app/m/marketing/CampaignChannel/index.html +96 -0
- package/app/m/marketing/CampaignMetricSnapshot/index.html +96 -0
- package/app/m/messages/Account/index.html +96 -0
- package/app/m/messages/Attachment/index.html +96 -0
- package/app/m/messages/Blacklist/index.html +96 -0
- package/app/m/messages/Email/failed-sends/index.html +96 -0
- package/app/m/messages/Email/index.html +96 -0
- package/app/m/messages/Email/mailbox/index.html +96 -0
- package/app/m/messages/EmailAccount/index.html +96 -0
- package/app/m/messages/EmailFolder/index.html +96 -0
- package/app/m/messages/Message/index.html +96 -0
- package/app/m/messages/MessagingEndpoint/index.html +96 -0
- package/app/m/messages/PersonaMessageRoute/index.html +96 -0
- package/app/m/messages/SlackAccount/index.html +96 -0
- package/app/m/messages/SlackMessage/index.html +96 -0
- package/app/m/messages/TelegramAccount/index.html +96 -0
- package/app/m/messages/Tweet/index.html +96 -0
- package/app/m/messages/TwitterAccount/index.html +96 -0
- package/app/m/messages/Whitelist/index.html +96 -0
- package/app/m/messages/ZulipAccount/index.html +96 -0
- package/app/m/places/Place/index.html +96 -0
- package/app/m/places/PlaceType/index.html +96 -0
- package/app/m/preferences/UiPreferenceRecord/index.html +96 -0
- package/app/m/products/Category/index.html +96 -0
- package/app/m/products/Material/index.html +96 -0
- package/app/m/products/Product/index.html +96 -0
- package/app/m/products/Product/ingredients/index.html +96 -0
- package/app/m/products/ProductVariant/index.html +97 -0
- package/app/m/products/Sku/index.html +97 -0
- package/app/m/profiles/ApiKey/index.html +96 -0
- package/app/m/profiles/Bot/index.html +96 -0
- package/app/m/profiles/MagicLinkToken/index.html +96 -0
- package/app/m/profiles/NostrIdentity/index.html +96 -0
- package/app/m/profiles/OidcIdentity/index.html +96 -0
- package/app/m/profiles/Organization/index.html +96 -0
- package/app/m/profiles/Person/index.html +96 -0
- package/app/m/profiles/Profile/index.html +96 -0
- package/app/m/profiles/ProfileMetadata/index.html +96 -0
- package/app/m/profiles/ProfileMetafield/index.html +96 -0
- package/app/m/profiles/ProfileRelationship/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipTerm/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipType/index.html +96 -0
- package/app/m/profiles/ProfileType/index.html +96 -0
- package/app/m/projects/Comment/index.html +97 -0
- package/app/m/projects/Issue/index.html +96 -0
- package/app/m/projects/Label/index.html +96 -0
- package/app/m/projects/Project/index.html +96 -0
- package/app/m/projects/ProjectIntegration/index.html +96 -0
- package/app/m/projects/PullRequest/index.html +96 -0
- package/app/m/projects/Repository/index.html +96 -0
- package/app/m/properties/Property/index.html +96 -0
- package/app/m/properties/Zone/index.html +96 -0
- package/app/m/reports/RuntimeReport/index.html +96 -0
- package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportLock/index.html +96 -0
- package/app/m/reports/SmrtReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportRun/index.html +96 -0
- package/app/m/reports/SmrtReportSchedule/index.html +96 -0
- package/app/m/reports/SmrtReportWatermark/index.html +96 -0
- package/app/m/sales/AttributionException/index.html +96 -0
- package/app/m/sales/AttributionPolicy/index.html +96 -0
- package/app/m/sales/Commission/index.html +96 -0
- package/app/m/sales/CommissionAdjustment/index.html +96 -0
- package/app/m/sales/CommissionPayout/index.html +96 -0
- package/app/m/sales/CommissionPlan/index.html +96 -0
- package/app/m/sales/Earner/index.html +96 -0
- package/app/m/sales/EarnerSourceAttribution/index.html +96 -0
- package/app/m/sales/EarningEvent/index.html +96 -0
- package/app/m/sales/ExecutedAgreement/index.html +96 -0
- package/app/m/sales/Lead/index.html +96 -0
- package/app/m/sales/Opportunity/index.html +96 -0
- package/app/m/sales/OpportunityConversion/index.html +96 -0
- package/app/m/sales/PipelineDefinition/index.html +96 -0
- package/app/m/sales/PipelineStage/index.html +97 -0
- package/app/m/sales/Referral/index.html +96 -0
- package/app/m/sales/ReferralAgreement/index.html +96 -0
- package/app/m/sales/ReferralLink/index.html +96 -0
- package/app/m/sales/ReferralProgram/index.html +96 -0
- package/app/m/sales/ReferralTermSnapshot/index.html +96 -0
- package/app/m/sales/ReferralTouch/index.html +96 -0
- package/app/m/sales/Referrer/index.html +96 -0
- package/app/m/sales/SalesActivity/index.html +96 -0
- package/app/m/sales/SalesRepresentative/index.html +96 -0
- package/app/m/sites/Site/index.html +96 -0
- package/app/m/sites/SiteAgentBinding/index.html +96 -0
- package/app/m/social/OAuthState/index.html +96 -0
- package/app/m/social/SocialAccount/index.html +96 -0
- package/app/m/social/SocialPost/index.html +96 -0
- package/app/m/social/SocialPostAnalyticsSnapshot/index.html +96 -0
- package/app/m/subscriptions/BillingAdjustment/index.html +96 -0
- package/app/m/subscriptions/ClientCharge/index.html +96 -0
- package/app/m/subscriptions/CreditGrant/index.html +96 -0
- package/app/m/subscriptions/PricingRule/index.html +96 -0
- package/app/m/subscriptions/RetailCharge/index.html +96 -0
- package/app/m/subscriptions/SpendingPolicy/index.html +96 -0
- package/app/m/subscriptions/SubscriptionPlan/index.html +96 -0
- package/app/m/subscriptions/TenantSubscription/index.html +96 -0
- package/app/m/subscriptions/TenantUsageMetric/index.html +96 -0
- package/app/m/support/ServiceTimeEntry/index.html +96 -0
- package/app/m/support/SupportAiRun/index.html +96 -0
- package/app/m/support/SupportAvailability/index.html +96 -0
- package/app/m/support/SupportCase/index.html +96 -0
- package/app/m/support/SupportCaseEvent/index.html +96 -0
- package/app/m/support/SupportChannelBinding/index.html +96 -0
- package/app/m/support/SupportCharge/index.html +96 -0
- package/app/m/support/SupportCompensation/index.html +96 -0
- package/app/m/support/SupportCompensationPlan/index.html +96 -0
- package/app/m/support/SupportEscalation/index.html +96 -0
- package/app/m/support/SupportInteraction/index.html +96 -0
- package/app/m/support/SupportPlan/index.html +96 -0
- package/app/m/support/SupportPolicy/index.html +96 -0
- package/app/m/support/SupportQualification/index.html +96 -0
- package/app/m/support/SupportServiceTarget/index.html +96 -0
- package/app/m/support/SupportSpecialist/index.html +96 -0
- package/app/m/support/SupportWorkLink/index.html +96 -0
- package/app/m/tags/Tag/index.html +96 -0
- package/app/m/tags/TagAlias/index.html +96 -0
- package/app/m/timesheets/AttendanceBreak/index.html +96 -0
- package/app/m/timesheets/AttendancePunch/index.html +96 -0
- package/app/m/timesheets/ServiceChargeSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceCompensationSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceTimeEntry/index.html +96 -0
- package/app/m/users/AccessRequest/index.html +96 -0
- package/app/m/users/Group/index.html +96 -0
- package/app/m/users/GroupMember/index.html +96 -0
- package/app/m/users/GroupRole/index.html +96 -0
- package/app/m/users/Membership/index.html +97 -0
- package/app/m/users/MembershipOverride/index.html +96 -0
- package/app/m/users/Permission/index.html +96 -0
- package/app/m/users/ResourceGrant/index.html +96 -0
- package/app/m/users/Role/index.html +96 -0
- package/app/m/users/RolePermission/index.html +96 -0
- package/app/m/users/Session/index.html +96 -0
- package/app/m/users/Tenant/index.html +96 -0
- package/app/m/users/TenantIntegration/index.html +96 -0
- package/app/m/users/TenantPermissionOverride/index.html +96 -0
- package/app/m/users/User/index.html +96 -0
- package/app/m/users/UsersCliAuthRequest/index.html +96 -0
- package/app/m/users/UsersMagicLinkToken/index.html +96 -0
- package/app/m/video/Character/index.html +96 -0
- package/app/m/video/CharacterAsset/index.html +96 -0
- package/app/m/video/CompositeJob/index.html +96 -0
- package/app/m/video/Performer/index.html +96 -0
- package/app/m/video/PerformerAsset/index.html +96 -0
- package/app/m/video/Scene/index.html +96 -0
- package/app/m/video/SceneAsset/index.html +96 -0
- package/app/m/video/VideoComposition/index.html +96 -0
- package/app/m/video/VideoCompositionAsset/index.html +96 -0
- package/app/m/video/VideoSequence/index.html +96 -0
- package/app/m/video/VideoSequenceAsset/index.html +96 -0
- package/app/m/video/VideoShot/index.html +96 -0
- package/app/m/video/VideoShotAsset/index.html +96 -0
- package/app/m/video/VideoShotCharacter/index.html +96 -0
- package/app/m/video/VideoWorkflow/index.html +96 -0
- package/app/m/voice/VoiceOutput/index.html +96 -0
- package/app/m/voice/VoiceProfile/index.html +96 -0
- package/app/m/voice/VoiceSample/index.html +96 -0
- package/app/packages/ads/index.html +92 -0
- package/app/packages/analytics/index.html +92 -0
- package/app/packages/approvals/index.html +92 -0
- package/app/packages/assets/index.html +92 -0
- package/app/packages/chat/index.html +92 -0
- package/app/packages/comments/index.html +92 -0
- package/app/packages/commerce/index.html +92 -0
- package/app/packages/content/index.html +92 -0
- package/app/packages/events/index.html +92 -0
- package/app/packages/expenses/index.html +92 -0
- package/app/packages/facts/index.html +92 -0
- package/app/packages/fields/index.html +92 -0
- package/app/packages/human-resources/index.html +92 -0
- package/app/packages/images/index.html +92 -0
- package/app/packages/index.html +90 -0
- package/app/packages/inventory/index.html +92 -0
- package/app/packages/ledgers/index.html +92 -0
- package/app/packages/manufacturing/index.html +92 -0
- package/app/packages/marketing/index.html +92 -0
- package/app/packages/messages/index.html +92 -0
- package/app/packages/places/index.html +92 -0
- package/app/packages/preferences/index.html +92 -0
- package/app/packages/products/index.html +92 -0
- package/app/packages/profiles/index.html +92 -0
- package/app/packages/projects/index.html +92 -0
- package/app/packages/properties/index.html +92 -0
- package/app/packages/reports/index.html +92 -0
- package/app/packages/sales/index.html +92 -0
- package/app/packages/sites/index.html +92 -0
- package/app/packages/social/index.html +92 -0
- package/app/packages/subscriptions/index.html +92 -0
- package/app/packages/support/index.html +92 -0
- package/app/packages/tags/index.html +92 -0
- package/app/packages/timesheets/index.html +92 -0
- package/app/packages/users/index.html +92 -0
- package/app/packages/video/index.html +92 -0
- package/app/packages/voice/index.html +92 -0
- package/app/recipes/account-access/help/index.html +93 -0
- package/app/recipes/account-access/index.html +95 -0
- package/app/recipes/activity/help/index.html +93 -0
- package/app/recipes/activity/index.html +94 -0
- package/app/recipes/agreements/help/index.html +93 -0
- package/app/recipes/agreements/index.html +96 -0
- package/app/recipes/analytics.reports/help/index.html +93 -0
- package/app/recipes/analytics.reports/index.html +94 -0
- package/app/recipes/assets/help/index.html +93 -0
- package/app/recipes/assets/index.html +95 -0
- package/app/recipes/billing/help/index.html +93 -0
- package/app/recipes/billing/index.html +95 -0
- package/app/recipes/chat.assistant/help/index.html +93 -0
- package/app/recipes/chat.assistant/index.html +94 -0
- package/app/recipes/comments/help/index.html +93 -0
- package/app/recipes/comments/index.html +94 -0
- package/app/recipes/commerce.customers/help/index.html +93 -0
- package/app/recipes/commerce.customers/index.html +94 -0
- package/app/recipes/commerce.estimates/help/index.html +93 -0
- package/app/recipes/commerce.estimates/index.html +94 -0
- package/app/recipes/commerce.purchases/help/index.html +93 -0
- package/app/recipes/commerce.purchases/index.html +94 -0
- package/app/recipes/commerce.sales/help/index.html +93 -0
- package/app/recipes/commerce.sales/index.html +94 -0
- package/app/recipes/commerce.vendors/help/index.html +93 -0
- package/app/recipes/commerce.vendors/index.html +94 -0
- package/app/recipes/commerce.wholesale/help/index.html +93 -0
- package/app/recipes/commerce.wholesale/index.html +94 -0
- package/app/recipes/events.calendar/help/index.html +93 -0
- package/app/recipes/events.calendar/index.html +94 -0
- package/app/recipes/fields.form-customization/help/index.html +93 -0
- package/app/recipes/fields.form-customization/index.html +94 -0
- package/app/recipes/inventory.stock/help/index.html +93 -0
- package/app/recipes/inventory.stock/index.html +94 -0
- package/app/recipes/ledgers.bookkeeping/help/index.html +93 -0
- package/app/recipes/ledgers.bookkeeping/index.html +94 -0
- package/app/recipes/messages/help/index.html +93 -0
- package/app/recipes/messages/index.html +95 -0
- package/app/recipes/products/help/index.html +93 -0
- package/app/recipes/products/index.html +96 -0
- package/app/recipes/projects.tracker/help/index.html +93 -0
- package/app/recipes/projects.tracker/index.html +94 -0
- package/app/recipes/reports.materialized/help/index.html +93 -0
- package/app/recipes/reports.materialized/index.html +94 -0
- package/app/recipes/sales.pipeline/help/index.html +93 -0
- package/app/recipes/sales.pipeline/index.html +94 -0
- package/app/recipes/tags.taxonomy/help/index.html +93 -0
- package/app/recipes/tags.taxonomy/index.html +94 -0
- package/app/recipes/team-collaboration/help/index.html +93 -0
- package/app/recipes/team-collaboration/index.html +94 -0
- package/app/s/custom-billing/index.html +89 -0
- package/app/s/custom-buying/index.html +89 -0
- package/app/s/custom-classes/index.html +89 -0
- package/app/s/custom-jobs/index.html +89 -0
- package/app/s/custom-kitchen/index.html +89 -0
- package/app/s/custom-material/index.html +89 -0
- package/app/s/custom-members/index.html +89 -0
- package/app/s/custom-parts/index.html +89 -0
- package/app/s/custom-schedule/index.html +89 -0
- package/app/s/custom-shop/index.html +89 -0
- package/app/s/custom-wholesale/index.html +89 -0
- package/app/s/section-access-control/index.html +89 -0
- package/app/s/section-account-security/index.html +89 -0
- package/app/s/section-accounting/index.html +89 -0
- package/app/s/section-activity/index.html +89 -0
- package/app/s/section-agreements/index.html +89 -0
- package/app/s/section-analytics/index.html +89 -0
- package/app/s/section-assets/index.html +89 -0
- package/app/s/section-billing/index.html +89 -0
- package/app/s/section-calendar/index.html +89 -0
- package/app/s/section-catalog/index.html +89 -0
- package/app/s/section-chat.assistant/index.html +89 -0
- package/app/s/section-comments/index.html +89 -0
- package/app/s/section-fields.form-customization/index.html +89 -0
- package/app/s/section-messages/index.html +89 -0
- package/app/s/section-more/index.html +89 -0
- package/app/s/section-operations/index.html +89 -0
- package/app/s/section-projects/index.html +89 -0
- package/app/s/section-purchasing/index.html +89 -0
- package/app/s/section-reports.materialized/index.html +89 -0
- package/app/s/section-sales/index.html +89 -0
- package/app/s/section-taxonomy/index.html +89 -0
- package/app/s/section-team/index.html +89 -0
- package/dist/ai/echo-gate.d.ts +13 -0
- package/dist/ai/echo-gate.js +21 -0
- package/dist/ai/icons.d.ts +9 -0
- package/dist/ai/icons.js +9 -0
- package/dist/ai/instance.d.ts +3 -0
- package/dist/ai/instance.js +25 -0
- package/dist/ai/state.svelte.d.ts +130 -0
- package/dist/ai/state.svelte.js +316 -0
- package/dist/ai/status.d.ts +67 -0
- package/dist/ai/status.js +125 -0
- package/dist/assets/smrt-mark.svg +38 -0
- package/dist/assistant/change.d.ts +101 -0
- package/dist/assistant/change.js +209 -0
- package/dist/assistant/engine.d.ts +20 -0
- package/dist/assistant/engine.js +43 -0
- package/dist/assistant/llm.worker.d.ts +1 -0
- package/dist/assistant/llm.worker.js +7 -0
- package/dist/assistant/match.d.ts +59 -0
- package/dist/assistant/match.js +271 -0
- package/dist/assistant/models.d.ts +38 -0
- package/dist/assistant/models.js +57 -0
- package/dist/assistant/offers.svelte.d.ts +36 -0
- package/dist/assistant/offers.svelte.js +59 -0
- package/dist/assistant/prefs.d.ts +14 -0
- package/dist/assistant/prefs.js +32 -0
- package/dist/assistant/prompt.d.ts +23 -0
- package/dist/assistant/prompt.js +163 -0
- package/dist/assistant/session.svelte.d.ts +74 -0
- package/dist/assistant/session.svelte.js +181 -0
- package/dist/assistant/theme-undo.svelte.d.ts +38 -0
- package/dist/assistant/theme-undo.svelte.js +50 -0
- package/dist/assistant/transport.d.ts +73 -0
- package/dist/assistant/transport.js +231 -0
- package/dist/assistant/voice-host.d.ts +10 -0
- package/dist/assistant/voice-host.js +17 -0
- package/dist/assistant/voice.svelte.d.ts +107 -0
- package/dist/assistant/voice.svelte.js +261 -0
- package/dist/catalog/catalog.json +89663 -0
- package/dist/catalog/generate/build.d.ts +33 -0
- package/dist/catalog/generate/build.js +131 -0
- package/dist/catalog/generate/exclusions.d.ts +18 -0
- package/dist/catalog/generate/exclusions.js +33 -0
- package/dist/catalog/generate/extract.d.ts +90 -0
- package/dist/catalog/generate/extract.js +326 -0
- package/dist/catalog/generate/local.d.ts +8 -0
- package/dist/catalog/generate/local.js +45 -0
- package/dist/catalog/generate/recipe-demo.d.ts +11 -0
- package/dist/catalog/generate/recipe-demo.js +29 -0
- package/dist/catalog/generate/recipe-metadata.d.ts +12 -0
- package/dist/catalog/generate/recipe-metadata.js +138 -0
- package/dist/catalog/generate/registry.d.ts +14 -0
- package/dist/catalog/generate/registry.js +83 -0
- package/dist/catalog/index.d.ts +21 -0
- package/dist/catalog/index.js +53 -0
- package/dist/catalog/types.d.ts +141 -0
- package/dist/catalog/types.js +8 -0
- package/dist/components/AiSetup.svelte +528 -0
- package/dist/components/AiSetup.svelte.d.ts +8 -0
- package/dist/components/AiStatusIcons.svelte +86 -0
- package/dist/components/AiStatusIcons.svelte.d.ts +18 -0
- package/dist/components/AppSettings.svelte +100 -0
- package/dist/components/AppSettings.svelte.d.ts +10 -0
- package/dist/components/BrowserAssistant.svelte +318 -0
- package/dist/components/BrowserAssistant.svelte.d.ts +8 -0
- package/dist/components/ChildRecords.svelte +331 -0
- package/dist/components/ChildRecords.svelte.d.ts +15 -0
- package/dist/components/ConnectTools.svelte +145 -0
- package/dist/components/ConnectTools.svelte.d.ts +8 -0
- package/dist/components/CookbooksPanel.svelte +308 -0
- package/dist/components/CookbooksPanel.svelte.d.ts +3 -0
- package/dist/components/ExportPanel.svelte +217 -0
- package/dist/components/ExportPanel.svelte.d.ts +3 -0
- package/dist/components/FeatureCard.svelte +197 -0
- package/dist/components/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/FeaturesPanel.svelte +155 -0
- package/dist/components/FeaturesPanel.svelte.d.ts +3 -0
- package/dist/components/FieldInput.svelte +307 -0
- package/dist/components/FieldInput.svelte.d.ts +24 -0
- package/dist/components/FieldMapForm.svelte +173 -0
- package/dist/components/FieldMapForm.svelte.d.ts +18 -0
- package/dist/components/FormWorkspace.svelte +274 -0
- package/dist/components/FormWorkspace.svelte.d.ts +19 -0
- package/dist/components/HelpView.svelte +129 -0
- package/dist/components/HelpView.svelte.d.ts +12 -0
- package/dist/components/ModelOptions.svelte +239 -0
- package/dist/components/ModelOptions.svelte.d.ts +12 -0
- package/dist/components/ModelPage.svelte +295 -0
- package/dist/components/ModelPage.svelte.d.ts +9 -0
- package/dist/components/ModelWorkspace.svelte +488 -0
- package/dist/components/ModelWorkspace.svelte.d.ts +32 -0
- package/dist/components/PlannerEditBridge.svelte +36 -0
- package/dist/components/PlannerEditBridge.svelte.d.ts +3 -0
- package/dist/components/PlannerPalette.svelte +38 -0
- package/dist/components/PlannerPalette.svelte.d.ts +18 -0
- package/dist/components/RecipeCards.svelte +145 -0
- package/dist/components/RecipeCards.svelte.d.ts +3 -0
- package/dist/components/RecipeHelp.svelte +54 -0
- package/dist/components/RecipeHelp.svelte.d.ts +9 -0
- package/dist/components/RecipeOptions.svelte +160 -0
- package/dist/components/RecipeOptions.svelte.d.ts +9 -0
- package/dist/components/RecordFeatures.svelte +240 -0
- package/dist/components/RecordFeatures.svelte.d.ts +3 -0
- package/dist/components/RelationField.svelte +175 -0
- package/dist/components/RelationField.svelte.d.ts +16 -0
- package/dist/components/SectionActions.svelte +91 -0
- package/dist/components/SectionActions.svelte.d.ts +12 -0
- package/dist/components/SectionIcons.svelte +98 -0
- package/dist/components/SectionIcons.svelte.d.ts +15 -0
- package/dist/components/SectionOverview.svelte +65 -0
- package/dist/components/SectionOverview.svelte.d.ts +14 -0
- package/dist/components/SectionPage.svelte +230 -0
- package/dist/components/SectionPage.svelte.d.ts +7 -0
- package/dist/components/SettingsPanel.svelte +60 -0
- package/dist/components/SettingsPanel.svelte.d.ts +7 -0
- package/dist/components/ThemeBridge.svelte +56 -0
- package/dist/components/ThemeBridge.svelte.d.ts +3 -0
- package/dist/components/ThemeSection.svelte +167 -0
- package/dist/components/ThemeSection.svelte.d.ts +11 -0
- package/dist/components/VariantGridForm.svelte +309 -0
- package/dist/components/VariantGridForm.svelte.d.ts +12 -0
- package/dist/components/VoiceTyping.svelte +108 -0
- package/dist/components/VoiceTyping.svelte.d.ts +7 -0
- package/dist/cookbook/assemble.d.ts +16 -0
- package/dist/cookbook/assemble.js +29 -0
- package/dist/cookbook/file.d.ts +7 -0
- package/dist/cookbook/file.js +25 -0
- package/dist/cookbook/legacy.d.ts +9 -0
- package/dist/cookbook/legacy.js +87 -0
- package/dist/cookbook/migrate.d.ts +22 -0
- package/dist/cookbook/migrate.js +106 -0
- package/dist/cookbook/parse.d.ts +16 -0
- package/dist/cookbook/parse.js +246 -0
- package/dist/cookbook/storage.d.ts +45 -0
- package/dist/cookbook/storage.js +98 -0
- package/dist/cookbook/store.svelte.d.ts +94 -0
- package/dist/cookbook/store.svelte.js +231 -0
- package/dist/cookbook/types.d.ts +76 -0
- package/dist/cookbook/types.js +11 -0
- package/dist/cookbook/validate.d.ts +14 -0
- package/dist/cookbook/validate.js +29 -0
- package/dist/core/app.d.ts +37 -0
- package/dist/core/app.js +119 -0
- package/dist/core/catalog.d.ts +19 -0
- package/dist/core/catalog.js +9 -0
- package/dist/core/headless.d.ts +52 -0
- package/dist/core/headless.js +39 -0
- package/dist/core/index.d.ts +28 -0
- package/dist/core/index.js +28 -0
- package/dist/core/prompt.d.ts +38 -0
- package/dist/core/prompt.js +95 -0
- package/dist/core/reply.d.ts +60 -0
- package/dist/core/reply.js +89 -0
- package/dist/core/request.d.ts +15 -0
- package/dist/core/request.js +55 -0
- package/dist/data/children.d.ts +20 -0
- package/dist/data/children.js +80 -0
- package/dist/data/columns.d.ts +56 -0
- package/dist/data/columns.js +150 -0
- package/dist/data/context.d.ts +8 -0
- package/dist/data/context.js +19 -0
- package/dist/data/derived.d.ts +79 -0
- package/dist/data/derived.js +139 -0
- package/dist/data/display.d.ts +23 -0
- package/dist/data/display.js +84 -0
- package/dist/data/fakes.d.ts +52 -0
- package/dist/data/fakes.js +443 -0
- package/dist/data/format.d.ts +48 -0
- package/dist/data/format.js +121 -0
- package/dist/data/labels.d.ts +45 -0
- package/dist/data/labels.js +179 -0
- package/dist/data/packs.d.ts +95 -0
- package/dist/data/packs.js +830 -0
- package/dist/data/payments.d.ts +17 -0
- package/dist/data/payments.js +60 -0
- package/dist/data/planner-source.d.ts +7 -0
- package/dist/data/planner-source.js +32 -0
- package/dist/data/source.d.ts +119 -0
- package/dist/data/source.js +432 -0
- package/dist/features/catalogue.d.ts +96 -0
- package/dist/features/catalogue.js +225 -0
- package/dist/features/demo.d.ts +36 -0
- package/dist/features/demo.js +66 -0
- package/dist/features/palette.d.ts +39 -0
- package/dist/features/palette.js +53 -0
- package/dist/fields/address.d.ts +23 -0
- package/dist/fields/address.js +39 -0
- package/dist/fields/invalid.d.ts +2 -0
- package/dist/fields/invalid.js +8 -0
- package/dist/fields/modal.d.ts +7 -0
- package/dist/fields/modal.js +14 -0
- package/dist/fields/percent.d.ts +8 -0
- package/dist/fields/percent.js +16 -0
- package/dist/fields/renderer.d.ts +17 -0
- package/dist/fields/renderer.js +43 -0
- package/dist/forms/active.d.ts +16 -0
- package/dist/forms/active.js +24 -0
- package/dist/forms/fieldMap.d.ts +44 -0
- package/dist/forms/fieldMap.js +134 -0
- package/dist/forms/shared.d.ts +41 -0
- package/dist/forms/shared.js +138 -0
- package/dist/forms/stock.d.ts +28 -0
- package/dist/forms/stock.js +104 -0
- package/dist/forms/variantGrid.d.ts +83 -0
- package/dist/forms/variantGrid.js +283 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/inference/byo.svelte.d.ts +90 -0
- package/dist/inference/byo.svelte.js +295 -0
- package/dist/inference/config.d.ts +77 -0
- package/dist/inference/config.js +205 -0
- package/dist/inference/host.d.ts +40 -0
- package/dist/inference/host.js +57 -0
- package/dist/inference/openai.d.ts +59 -0
- package/dist/inference/openai.js +207 -0
- package/dist/inference/presets.d.ts +5 -0
- package/dist/inference/presets.js +46 -0
- package/dist/kitchen/client.d.ts +39 -0
- package/dist/kitchen/client.js +115 -0
- package/dist/kitchen/fragment.d.ts +30 -0
- package/dist/kitchen/fragment.js +49 -0
- package/dist/kitchen/state.svelte.d.ts +26 -0
- package/dist/kitchen/state.svelte.js +45 -0
- package/dist/library/apply.d.ts +17 -0
- package/dist/library/apply.js +32 -0
- package/dist/library/document.d.ts +12 -0
- package/dist/library/document.js +27 -0
- package/dist/library/icons.d.ts +6 -0
- package/dist/library/icons.js +26 -0
- package/dist/library/index.d.ts +8 -0
- package/dist/library/index.js +12 -0
- package/dist/library/library.json +788 -0
- package/dist/library/menu.d.ts +18 -0
- package/dist/library/menu.js +72 -0
- package/dist/library/state.svelte.d.ts +10 -0
- package/dist/library/state.svelte.js +28 -0
- package/dist/library/types.d.ts +57 -0
- package/dist/library/types.js +1 -0
- package/dist/overviews/definitions.d.ts +24 -0
- package/dist/overviews/definitions.js +97 -0
- package/dist/overviews/page.d.ts +21 -0
- package/dist/overviews/page.js +36 -0
- package/dist/overviews/registry.d.ts +44 -0
- package/dist/overviews/registry.js +191 -0
- package/dist/overviews/validate.d.ts +32 -0
- package/dist/overviews/validate.js +91 -0
- package/dist/planner/Planner.svelte +204 -0
- package/dist/planner/Planner.svelte.d.ts +4 -0
- package/dist/planner/app.svelte.d.ts +6 -0
- package/dist/planner/app.svelte.js +23 -0
- package/dist/planner/assistant.d.ts +46 -0
- package/dist/planner/assistant.js +122 -0
- package/dist/planner/commands/adapter.d.ts +121 -0
- package/dist/planner/commands/adapter.js +597 -0
- package/dist/planner/commands/catalog.d.ts +19 -0
- package/dist/planner/commands/catalog.js +54 -0
- package/dist/planner/commands/controller.svelte.d.ts +13 -0
- package/dist/planner/commands/controller.svelte.js +77 -0
- package/dist/planner/commands/index.d.ts +15 -0
- package/dist/planner/commands/index.js +15 -0
- package/dist/planner/commands/schemas.d.ts +25 -0
- package/dist/planner/commands/schemas.js +67 -0
- package/dist/planner/commands/slices.d.ts +18 -0
- package/dist/planner/commands/slices.js +49 -0
- package/dist/planner/commands/types.d.ts +80 -0
- package/dist/planner/commands/types.js +18 -0
- package/dist/planner/create.d.ts +4 -0
- package/dist/planner/create.js +22 -0
- package/dist/planner/instance.d.ts +15 -0
- package/dist/planner/instance.js +22 -0
- package/dist/planner/query.d.ts +16 -0
- package/dist/planner/query.js +28 -0
- package/dist/planner/selection.d.ts +15 -0
- package/dist/planner/selection.js +38 -0
- package/dist/planner/selection.svelte.d.ts +29 -0
- package/dist/planner/selection.svelte.js +54 -0
- package/dist/planner/tab.svelte.d.ts +11 -0
- package/dist/planner/tab.svelte.js +22 -0
- package/dist/planner/types.d.ts +41 -0
- package/dist/planner/types.js +1 -0
- package/dist/recipes/cards.d.ts +55 -0
- package/dist/recipes/cards.js +80 -0
- package/dist/recipes/features.d.ts +53 -0
- package/dist/recipes/features.js +97 -0
- package/dist/recipes/help/descriptions.json +373 -0
- package/dist/recipes/help.d.ts +121 -0
- package/dist/recipes/help.js +262 -0
- package/dist/recipes/index.d.ts +65 -0
- package/dist/recipes/index.js +95 -0
- package/dist/recipes/merge.d.ts +26 -0
- package/dist/recipes/merge.js +21 -0
- package/dist/recipes/overlay.json +409 -0
- package/dist/recipes/plan-data.d.ts +41 -0
- package/dist/recipes/plan-data.js +97 -0
- package/dist/recipes/plumbing.d.ts +70 -0
- package/dist/recipes/plumbing.js +185 -0
- package/dist/recipes/policy.d.ts +118 -0
- package/dist/recipes/policy.js +268 -0
- package/dist/recipes/resolve.d.ts +19 -0
- package/dist/recipes/resolve.js +65 -0
- package/dist/recipes/scope.d.ts +25 -0
- package/dist/recipes/scope.js +31 -0
- package/dist/recipes/sections.d.ts +49 -0
- package/dist/recipes/sections.js +84 -0
- package/dist/recipes/state.svelte.d.ts +67 -0
- package/dist/recipes/state.svelte.js +112 -0
- package/dist/recipes/types.d.ts +322 -0
- package/dist/recipes/types.js +8 -0
- package/dist/sections/entries.d.ts +30 -0
- package/dist/sections/entries.js +57 -0
- package/dist/sections/info.d.ts +16 -0
- package/dist/sections/info.js +39 -0
- package/dist/sections/path.d.ts +12 -0
- package/dist/sections/path.js +18 -0
- package/dist/settings/app-settings.d.ts +44 -0
- package/dist/settings/app-settings.js +138 -0
- package/dist/settings/currencies.d.ts +2 -0
- package/dist/settings/currencies.js +8 -0
- package/dist/theme/runtime.d.ts +14 -0
- package/dist/theme/runtime.js +27 -0
- package/dist/theme/theme.d.ts +47 -0
- package/dist/theme/theme.js +122 -0
- package/dist/upstream/CustomerSelect.svelte +60 -0
- package/dist/upstream/CustomerSelect.svelte.d.ts +17 -0
- package/dist/upstream/VendorSelect.svelte +60 -0
- package/dist/upstream/VendorSelect.svelte.d.ts +17 -0
- package/dist/upstream/overlay.d.ts +10 -0
- package/dist/upstream/overlay.js +49 -0
- package/dist/upstream/partySelect.d.ts +8 -0
- package/dist/upstream/partySelect.js +21 -0
- package/dist/upstream/partyTypes.d.ts +64 -0
- package/dist/upstream/partyTypes.js +8 -0
- package/dist/upstream/relations.d.ts +2 -0
- package/dist/upstream/relations.js +24 -0
- package/dist/upstream/selects.d.ts +26 -0
- package/dist/upstream/selects.js +20 -0
- package/dist/upstream/widgets.d.ts +20 -0
- package/dist/upstream/widgets.js +30 -0
- package/package.json +81 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CatalogModel } from '../catalog/types.ts';
|
|
2
|
+
import { type RowScope } from '../recipes/scope.ts';
|
|
3
|
+
import type { Recipe } from '../recipes/types.ts';
|
|
4
|
+
/** What a navigation entry (a layout item id) points at in the app. */
|
|
5
|
+
export interface SectionEntry {
|
|
6
|
+
/** The layout item id, `item:<package>:<Model>[:<key>]`. */
|
|
7
|
+
id: string;
|
|
8
|
+
model: CatalogModel;
|
|
9
|
+
/** In-app path of the entry's page, without the app query. */
|
|
10
|
+
path: string;
|
|
11
|
+
/** The entry's declared noun for New, if the recipe gave one. */
|
|
12
|
+
noun?: string;
|
|
13
|
+
/** The slice of rows the entry lists, if it is a filtered view. */
|
|
14
|
+
scope?: RowScope;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Every navigation entry the added recipes and features produce, by layout
|
|
18
|
+
* item id. Counting and New use it to turn a menu row back into a model; the
|
|
19
|
+
* scope is the same one the entry's own page lists, so a count matches it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function entryIndex(added: readonly Recipe[], features: readonly string[]): Map<string, SectionEntry>;
|
|
22
|
+
/**
|
|
23
|
+
* The Options and Help groups behind a set of entries: the group (or recipe)
|
|
24
|
+
* of each added recipe that has one of them in its nav, in recipe order. A
|
|
25
|
+
* section can hold several, e.g. Sales: Customers and Sales.
|
|
26
|
+
*/
|
|
27
|
+
export declare function optionGroups(entryIds: readonly string[], added: readonly Recipe[]): {
|
|
28
|
+
id: string;
|
|
29
|
+
label: string;
|
|
30
|
+
}[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getModel } from "../catalog/index.js";
|
|
2
|
+
import { featureNavItems } from "../recipes/features.js";
|
|
3
|
+
import { navItemId, navPath, recipeNav } from "../recipes/index.js";
|
|
4
|
+
import { pageScope } from "../recipes/scope.js";
|
|
5
|
+
import { sectionId } from "../recipes/sections.js";
|
|
6
|
+
/**
|
|
7
|
+
* Every navigation entry the added recipes and features produce, by layout
|
|
8
|
+
* item id. Counting and New use it to turn a menu row back into a model; the
|
|
9
|
+
* scope is the same one the entry's own page lists, so a count matches it.
|
|
10
|
+
*/
|
|
11
|
+
export function entryIndex(added, features) {
|
|
12
|
+
const nav = added.flatMap((recipe) => recipeNav(recipe));
|
|
13
|
+
const index = new Map();
|
|
14
|
+
for (const entry of nav) {
|
|
15
|
+
const id = navItemId(entry.packageId, entry.model.name, entry.key);
|
|
16
|
+
if (index.has(id))
|
|
17
|
+
continue;
|
|
18
|
+
const scope = pageScope(entry.model.id, entry.key, nav);
|
|
19
|
+
index.set(id, {
|
|
20
|
+
id,
|
|
21
|
+
model: entry.model,
|
|
22
|
+
path: navPath(entry),
|
|
23
|
+
...(entry.noun ? { noun: entry.noun } : {}),
|
|
24
|
+
...(scope ? { scope } : {}),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
for (const item of featureNavItems(features)) {
|
|
28
|
+
if (index.has(item.id))
|
|
29
|
+
continue;
|
|
30
|
+
const model = getModel(item.packageId, item.modelName);
|
|
31
|
+
if (!model)
|
|
32
|
+
continue;
|
|
33
|
+
index.set(item.id, {
|
|
34
|
+
id: item.id,
|
|
35
|
+
model,
|
|
36
|
+
path: navPath({ packageId: item.packageId, model }),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return index;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The Options and Help groups behind a set of entries: the group (or recipe)
|
|
43
|
+
* of each added recipe that has one of them in its nav, in recipe order. A
|
|
44
|
+
* section can hold several, e.g. Sales: Customers and Sales.
|
|
45
|
+
*/
|
|
46
|
+
export function optionGroups(entryIds, added) {
|
|
47
|
+
const wanted = new Set(entryIds);
|
|
48
|
+
const groups = [];
|
|
49
|
+
for (const recipe of added) {
|
|
50
|
+
const has = recipeNav(recipe).some((entry) => wanted.has(navItemId(entry.packageId, entry.model.name, entry.key)));
|
|
51
|
+
const id = sectionId(recipe);
|
|
52
|
+
if (has && !groups.some((group) => group.id === id)) {
|
|
53
|
+
groups.push({ id, label: recipe.group?.label ?? recipe.label });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return groups;
|
|
57
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** The icon of a section the visitor made, or one the host knows nothing of. */
|
|
2
|
+
export declare const DEFAULT_SECTION_ICON = "folder";
|
|
3
|
+
/** What the app suggests for a navigation section: its icon and its blurb. */
|
|
4
|
+
export interface SectionInfo {
|
|
5
|
+
icon?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The suggested icon and description of a layout section id. A recipe's
|
|
10
|
+
* section carries both in the recipe data (the group summary stands in for a
|
|
11
|
+
* missing description); the More section is the app's own; a cookbook's custom
|
|
12
|
+
* sections have a description in the cookbook, and an icon in its layout.
|
|
13
|
+
*/
|
|
14
|
+
export declare function sectionInfo(id: string): SectionInfo;
|
|
15
|
+
/** The title of a section page: its label once the layout has resolved, never the raw id. */
|
|
16
|
+
export declare function sectionTitle(heading: string | null | undefined): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { libraryCookbooks } from "../library/index.js";
|
|
2
|
+
import { FEATURE_SECTION } from "../recipes/features.js";
|
|
3
|
+
import { buildNavSections, recipes } from "../recipes/index.js";
|
|
4
|
+
/** The icon of a section the visitor made, or one the host knows nothing of. */
|
|
5
|
+
export const DEFAULT_SECTION_ICON = 'folder';
|
|
6
|
+
const NAV_SECTIONS = new Map(buildNavSections(recipes).map((section) => [section.id, section]));
|
|
7
|
+
/** `custom:` descriptions come with the cookbooks; ids are shared by name. */
|
|
8
|
+
const CUSTOM_DESCRIPTIONS = new Map(libraryCookbooks.flatMap((cookbook) => Object.entries(cookbook.sectionDescriptions ?? {})));
|
|
9
|
+
/**
|
|
10
|
+
* The suggested icon and description of a layout section id. A recipe's
|
|
11
|
+
* section carries both in the recipe data (the group summary stands in for a
|
|
12
|
+
* missing description); the More section is the app's own; a cookbook's custom
|
|
13
|
+
* sections have a description in the cookbook, and an icon in its layout.
|
|
14
|
+
*/
|
|
15
|
+
export function sectionInfo(id) {
|
|
16
|
+
if (id === `section:${FEATURE_SECTION.id}`) {
|
|
17
|
+
return {
|
|
18
|
+
icon: FEATURE_SECTION.icon,
|
|
19
|
+
description: FEATURE_SECTION.description,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (id.startsWith('section:')) {
|
|
23
|
+
const section = NAV_SECTIONS.get(id.slice('section:'.length));
|
|
24
|
+
if (!section)
|
|
25
|
+
return {};
|
|
26
|
+
const summary = section.recipes.find((r) => r.group?.summary)?.group
|
|
27
|
+
?.summary;
|
|
28
|
+
return {
|
|
29
|
+
icon: section.icon,
|
|
30
|
+
description: section.description ?? summary,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const description = CUSTOM_DESCRIPTIONS.get(id);
|
|
34
|
+
return description ? { description } : {};
|
|
35
|
+
}
|
|
36
|
+
/** The title of a section page: its label once the layout has resolved, never the raw id. */
|
|
37
|
+
export function sectionTitle(heading) {
|
|
38
|
+
return heading?.trim() || 'Planner';
|
|
39
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A section's page lives at `/s/<slug>/`. The slug is the layout id with its
|
|
3
|
+
* `kind:` prefix turned into `kind-` (`section:sales` -> `section-sales`,
|
|
4
|
+
* `custom:shop-2` -> `custom-shop-2`), so no path segment holds a colon. Only
|
|
5
|
+
* the first hyphen is the prefix; the kinds (`section`, `custom`, `package`)
|
|
6
|
+
* never contain one.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sectionSlug(id: string): string;
|
|
9
|
+
/** The layout id a slug names; the inverse of {@link sectionSlug}. */
|
|
10
|
+
export declare function sectionIdFromSlug(slug: string): string;
|
|
11
|
+
/** In-app path of a section's page, without the app query. */
|
|
12
|
+
export declare function sectionPath(id: string): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A section's page lives at `/s/<slug>/`. The slug is the layout id with its
|
|
3
|
+
* `kind:` prefix turned into `kind-` (`section:sales` -> `section-sales`,
|
|
4
|
+
* `custom:shop-2` -> `custom-shop-2`), so no path segment holds a colon. Only
|
|
5
|
+
* the first hyphen is the prefix; the kinds (`section`, `custom`, `package`)
|
|
6
|
+
* never contain one.
|
|
7
|
+
*/
|
|
8
|
+
export function sectionSlug(id) {
|
|
9
|
+
return id.replace(':', '-');
|
|
10
|
+
}
|
|
11
|
+
/** The layout id a slug names; the inverse of {@link sectionSlug}. */
|
|
12
|
+
export function sectionIdFromSlug(slug) {
|
|
13
|
+
return slug.replace('-', ':');
|
|
14
|
+
}
|
|
15
|
+
/** In-app path of a section's page, without the app query. */
|
|
16
|
+
export function sectionPath(id) {
|
|
17
|
+
return `/s/${sectionSlug(id)}/`;
|
|
18
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Cookbook } from '../cookbook/types.ts';
|
|
2
|
+
import { type FieldPolicyRow } from '../recipes/policy.ts';
|
|
3
|
+
/**
|
|
4
|
+
* App settings: the few defaults that belong to the visitor's app, not to a
|
|
5
|
+
* cookbook. They have no field of their own in the cookbook; they are the
|
|
6
|
+
* same app-scope `defaultValue` policy rows a cookbook writes, kept in one
|
|
7
|
+
* place so the Settings tab, the cookbook preview and the cookbooks agree on
|
|
8
|
+
* which fields each setting covers.
|
|
9
|
+
*/
|
|
10
|
+
export interface AppSettings {
|
|
11
|
+
/** ISO 4217 code. */
|
|
12
|
+
currency: string;
|
|
13
|
+
/** Default tax rate as a fraction (0.0825 is 8.25%). */
|
|
14
|
+
taxRate: number;
|
|
15
|
+
/** Default payment terms; empty means unset. */
|
|
16
|
+
paymentTerms: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_SETTINGS: Readonly<AppSettings>;
|
|
19
|
+
/** Which model fields each setting is the default of (the single source). */
|
|
20
|
+
export declare const SETTING_TARGETS: Readonly<Record<keyof AppSettings, readonly {
|
|
21
|
+
model: string;
|
|
22
|
+
field: string;
|
|
23
|
+
}[]>>;
|
|
24
|
+
/**
|
|
25
|
+
* A setting's row on a model no added recipe covers yet. Kept (by the store's
|
|
26
|
+
* pruning and the import check) so a recipe added later starts with the
|
|
27
|
+
* app's settings, and so removing every recipe never loses them.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isSettingRow(row: FieldPolicyRow): boolean;
|
|
30
|
+
/** The app's settings: the first stored row of each, else the defaults. */
|
|
31
|
+
export declare function readSettings(cookbook: Pick<Cookbook, 'policies'>): AppSettings;
|
|
32
|
+
/** Does the cookbook state a tax rate (a row), rather than leave the default? */
|
|
33
|
+
export declare function hasTaxRateRow(cookbook: Pick<Cookbook, 'policies'>): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* A copy of the cookbook with the settings written as policy rows. A row is
|
|
36
|
+
* written for every model a setting covers (covered or not, so a recipe
|
|
37
|
+
* added later picks it up) and only where the value
|
|
38
|
+
* differs from what the model starts as; otherwise any row for it is removed,
|
|
39
|
+
* so an unset or default setting leaves no rows. Other keys on a row
|
|
40
|
+
* (visibility, label, ...) are kept.
|
|
41
|
+
*/
|
|
42
|
+
export declare function writeSettings(cookbook: Cookbook, settings: AppSettings): Cookbook;
|
|
43
|
+
/** Starting values for a cookbook's editor: what it sets, else the defaults. */
|
|
44
|
+
export declare function settingsOfCookbook(settings: Partial<AppSettings> | undefined): AppSettings;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { getModelByQualifiedName } from "../catalog/index.js";
|
|
2
|
+
import { recipesById } from "../recipes/index.js";
|
|
3
|
+
import { resolveFields } from "../recipes/policy.js";
|
|
4
|
+
export const DEFAULT_SETTINGS = {
|
|
5
|
+
currency: 'USD',
|
|
6
|
+
taxRate: 0,
|
|
7
|
+
paymentTerms: '',
|
|
8
|
+
};
|
|
9
|
+
const C = '@happyvertical/smrt-commerce:';
|
|
10
|
+
/** Which model fields each setting is the default of (the single source). */
|
|
11
|
+
export const SETTING_TARGETS = {
|
|
12
|
+
currency: [
|
|
13
|
+
'Order',
|
|
14
|
+
'PurchaseOrder',
|
|
15
|
+
'WholesaleOrder',
|
|
16
|
+
'Estimate',
|
|
17
|
+
'Invoice',
|
|
18
|
+
'Agreement',
|
|
19
|
+
].map((model) => ({ model: `${C}${model}`, field: 'currency' })),
|
|
20
|
+
taxRate: ['InvoiceLineItem', 'ContractLineItem'].map((model) => ({
|
|
21
|
+
model: `${C}${model}`,
|
|
22
|
+
field: 'taxRate',
|
|
23
|
+
})),
|
|
24
|
+
paymentTerms: [
|
|
25
|
+
...['Order', 'WholesaleOrder', 'Estimate', 'Invoice', 'Agreement'].map((model) => ({ model: `${C}${model}`, field: 'terms' })),
|
|
26
|
+
{ model: `${C}Customer`, field: 'paymentTerms' },
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* A setting's row on a model no added recipe covers yet. Kept (by the store's
|
|
31
|
+
* pruning and the import check) so a recipe added later starts with the
|
|
32
|
+
* app's settings, and so removing every recipe never loses them.
|
|
33
|
+
*/
|
|
34
|
+
export function isSettingRow(row) {
|
|
35
|
+
return Object.values(SETTING_TARGETS).some((targets) => targets.some((t) => t.model === row.objectRef && t.field === row.fieldName));
|
|
36
|
+
}
|
|
37
|
+
const KEYS = Object.keys(SETTING_TARGETS);
|
|
38
|
+
function rowValue(row) {
|
|
39
|
+
if (row?.defaultValue === undefined || row.defaultValue === null) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(row.defaultValue);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function findRow(policies, model, field) {
|
|
50
|
+
return policies.find((r) => r.scopeType === 'app' && r.objectRef === model && r.fieldName === field);
|
|
51
|
+
}
|
|
52
|
+
/** The app's settings: the first stored row of each, else the defaults. */
|
|
53
|
+
export function readSettings(cookbook) {
|
|
54
|
+
const out = { ...DEFAULT_SETTINGS };
|
|
55
|
+
const first = (key, type) => {
|
|
56
|
+
for (const { model, field } of SETTING_TARGETS[key]) {
|
|
57
|
+
const value = rowValue(findRow(cookbook.policies, model, field));
|
|
58
|
+
if (typeof value === type)
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
};
|
|
63
|
+
const currency = first('currency', 'string');
|
|
64
|
+
const taxRate = first('taxRate', 'number');
|
|
65
|
+
const paymentTerms = first('paymentTerms', 'string');
|
|
66
|
+
if (typeof currency === 'string')
|
|
67
|
+
out.currency = currency;
|
|
68
|
+
if (typeof taxRate === 'number')
|
|
69
|
+
out.taxRate = taxRate;
|
|
70
|
+
if (typeof paymentTerms === 'string')
|
|
71
|
+
out.paymentTerms = paymentTerms;
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
/** Does the cookbook state a tax rate (a row), rather than leave the default? */
|
|
75
|
+
export function hasTaxRateRow(cookbook) {
|
|
76
|
+
return SETTING_TARGETS.taxRate.some(({ model, field }) => typeof rowValue(findRow(cookbook.policies, model, field)) === 'number');
|
|
77
|
+
}
|
|
78
|
+
/** What a model's field starts as before any app-scope row (catalog + recipe hints). */
|
|
79
|
+
function seedDefault(cookbook, modelId, field) {
|
|
80
|
+
const model = getModelByQualifiedName(modelId)?.model;
|
|
81
|
+
if (!model)
|
|
82
|
+
return undefined;
|
|
83
|
+
const hints = cookbook.recipes
|
|
84
|
+
.map((id) => recipesById.get(id)?.options?.[modelId])
|
|
85
|
+
.find(Boolean);
|
|
86
|
+
const entry = resolveFields(model, hints, []).find((r) => r.field.name === field);
|
|
87
|
+
return entry?.hasDefault ? entry.default : undefined;
|
|
88
|
+
}
|
|
89
|
+
const isUnset = (v) => v === undefined || v === null || v === '';
|
|
90
|
+
/**
|
|
91
|
+
* A copy of the cookbook with the settings written as policy rows. A row is
|
|
92
|
+
* written for every model a setting covers (covered or not, so a recipe
|
|
93
|
+
* added later picks it up) and only where the value
|
|
94
|
+
* differs from what the model starts as; otherwise any row for it is removed,
|
|
95
|
+
* so an unset or default setting leaves no rows. Other keys on a row
|
|
96
|
+
* (visibility, label, ...) are kept.
|
|
97
|
+
*/
|
|
98
|
+
export function writeSettings(cookbook, settings) {
|
|
99
|
+
let policies = cookbook.policies.map((row) => ({ ...row }));
|
|
100
|
+
for (const key of KEYS) {
|
|
101
|
+
const raw = settings[key];
|
|
102
|
+
const value = key === 'paymentTerms'
|
|
103
|
+
? String(raw).trim()
|
|
104
|
+
: key === 'currency'
|
|
105
|
+
? String(raw).trim().toUpperCase()
|
|
106
|
+
: raw;
|
|
107
|
+
for (const { model, field } of SETTING_TARGETS[key]) {
|
|
108
|
+
const seed = seedDefault(cookbook, model, field);
|
|
109
|
+
const wanted = !isUnset(value) &&
|
|
110
|
+
!(isUnset(seed) ? false : seed === value) &&
|
|
111
|
+
!(isUnset(seed) && key === 'taxRate' && value === 0);
|
|
112
|
+
const existing = findRow(policies, model, field);
|
|
113
|
+
if (wanted) {
|
|
114
|
+
const encoded = JSON.stringify(value);
|
|
115
|
+
if (existing)
|
|
116
|
+
existing.defaultValue = encoded;
|
|
117
|
+
else
|
|
118
|
+
policies.push({
|
|
119
|
+
objectRef: model,
|
|
120
|
+
fieldName: field,
|
|
121
|
+
scopeType: 'app',
|
|
122
|
+
defaultValue: encoded,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
else if (existing) {
|
|
126
|
+
delete existing.defaultValue;
|
|
127
|
+
if (Object.keys(existing).length <= 3) {
|
|
128
|
+
policies = policies.filter((r) => r !== existing);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return { ...cookbook, policies };
|
|
134
|
+
}
|
|
135
|
+
/** Starting values for a cookbook's editor: what it sets, else the defaults. */
|
|
136
|
+
export function settingsOfCookbook(settings) {
|
|
137
|
+
return { ...DEFAULT_SETTINGS, ...settings };
|
|
138
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Circulating ISO 4217 currency codes (no funds, metals or retired codes). */
|
|
2
|
+
export const CURRENCY_CODES = new Set(('AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD ' +
|
|
3
|
+
'CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD ' +
|
|
4
|
+
'GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT ' +
|
|
5
|
+
'LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR ' +
|
|
6
|
+
'NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP ' +
|
|
7
|
+
'STN SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XOF XPF ' +
|
|
8
|
+
'YER ZAR ZMW ZWG').split(' '));
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ColorSchemeSetting, type ThemeSetting } from './theme.ts';
|
|
2
|
+
/** What `ThemeProvider` is told: a preset id (built-in or registered) and a scheme. */
|
|
3
|
+
export interface ResolvedTheme {
|
|
4
|
+
preset: string;
|
|
5
|
+
colorScheme: ColorSchemeSetting;
|
|
6
|
+
}
|
|
7
|
+
/** The brand theme's id: unique per colour and font, since a registered id never changes. */
|
|
8
|
+
export declare function brandThemeId(primary: string, fontFamily?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* The preset id and scheme a theme means, registering its brand theme through
|
|
11
|
+
* `createThemeFromColor` first. Registered ids are never reused for another
|
|
12
|
+
* colour, because `ThemeProvider` looks a theme up once per preset id.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveTheme(theme: ThemeSetting | undefined): ResolvedTheme;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createThemeFromColor, registerTheme, } from '@happyvertical/smrt-ui/themes';
|
|
2
|
+
import { DEFAULT_COLOR_SCHEME, DEFAULT_PRESET, THEME_FONTS, } from "./theme.js";
|
|
3
|
+
const registered = new Set();
|
|
4
|
+
/** The brand theme's id: unique per colour and font, since a registered id never changes. */
|
|
5
|
+
export function brandThemeId(primary, fontFamily) {
|
|
6
|
+
return `planner-brand-${primary.slice(1)}${fontFamily ? `-${fontFamily.toLowerCase().replace(/[^a-z0-9]/g, '')}` : ''}`;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The preset id and scheme a theme means, registering its brand theme through
|
|
10
|
+
* `createThemeFromColor` first. Registered ids are never reused for another
|
|
11
|
+
* colour, because `ThemeProvider` looks a theme up once per preset id.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveTheme(theme) {
|
|
14
|
+
const colorScheme = theme?.colorScheme ?? DEFAULT_COLOR_SCHEME;
|
|
15
|
+
const custom = theme?.custom;
|
|
16
|
+
if (!custom)
|
|
17
|
+
return { preset: theme?.preset ?? DEFAULT_PRESET, colorScheme };
|
|
18
|
+
const id = brandThemeId(custom.primary, custom.fontFamily);
|
|
19
|
+
if (!registered.has(id)) {
|
|
20
|
+
const font = custom.fontFamily ? THEME_FONTS[custom.fontFamily] : undefined;
|
|
21
|
+
registerTheme(createThemeFromColor(custom.primary, id, 'Brand colour', {
|
|
22
|
+
...(font ? { fontFamily: font } : {}),
|
|
23
|
+
}));
|
|
24
|
+
registered.add(id);
|
|
25
|
+
}
|
|
26
|
+
return { preset: id, colorScheme };
|
|
27
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The app's look, kept in the app document (smrt#3604): a built-in smrt-ui
|
|
3
|
+
* preset, a light/dark/system choice and optionally a brand colour that
|
|
4
|
+
* `createThemeFromColor` expands into a full theme. Tokens only, never CSS.
|
|
5
|
+
* Absent means the default (the `smrt` preset, following the system scheme).
|
|
6
|
+
*/
|
|
7
|
+
export type ColorSchemeSetting = 'light' | 'dark' | 'system';
|
|
8
|
+
export interface CustomTheme {
|
|
9
|
+
/** `#rrggbb`, lowercase. */
|
|
10
|
+
primary: string;
|
|
11
|
+
/** A key of `THEME_FONTS`. */
|
|
12
|
+
fontFamily?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ThemeSetting {
|
|
15
|
+
/** A built-in smrt-ui preset; the default when absent. */
|
|
16
|
+
preset?: string;
|
|
17
|
+
colorScheme?: ColorSchemeSetting;
|
|
18
|
+
/** A brand colour theme; wins over `preset` while present. */
|
|
19
|
+
custom?: CustomTheme;
|
|
20
|
+
}
|
|
21
|
+
/** smrt-ui's built-in presets (its Node-safe `themes/presets` subpath). */
|
|
22
|
+
export declare const THEME_PRESETS: readonly string[];
|
|
23
|
+
export declare const DEFAULT_PRESET = "smrt";
|
|
24
|
+
export declare const DEFAULT_COLOR_SCHEME: ColorSchemeSetting;
|
|
25
|
+
export declare const COLOR_SCHEMES: readonly ColorSchemeSetting[];
|
|
26
|
+
/** The fonts a theme may name, each with its CSS stack. A fixed list, never free text. */
|
|
27
|
+
export declare const THEME_FONTS: Readonly<Record<string, string>>;
|
|
28
|
+
/** `#rgb` or `#rrggbb` (with or without `#`) as lowercase `#rrggbb`; else null. */
|
|
29
|
+
export declare function normalizeHex(value: unknown): string | null;
|
|
30
|
+
export type ThemeParse = {
|
|
31
|
+
ok: true;
|
|
32
|
+
theme: ThemeSetting | undefined;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
error: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Check a `theme` value from a file. Strict: a bad preset, colour, font or
|
|
39
|
+
* scheme is an error, not silently dropped. An empty object reads as absent.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseTheme(value: unknown): ThemeParse;
|
|
42
|
+
/** Same theme? Absent and `{}` are the same (the default). */
|
|
43
|
+
export declare function themeEquals(a: ThemeSetting | undefined, b: ThemeSetting | undefined): boolean;
|
|
44
|
+
/** Drop defaults so an unchanged theme stays absent from the document. */
|
|
45
|
+
export declare function compactTheme(theme: ThemeSetting | undefined): ThemeSetting | undefined;
|
|
46
|
+
/** A short phrase for the chat and the Settings tab, e.g. "Glass, dark". */
|
|
47
|
+
export declare function describeTheme(theme: ThemeSetting | undefined): string;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { availablePresets } from '@happyvertical/smrt-ui/themes/presets';
|
|
2
|
+
/** smrt-ui's built-in presets (its Node-safe `themes/presets` subpath). */
|
|
3
|
+
export const THEME_PRESETS = availablePresets;
|
|
4
|
+
export const DEFAULT_PRESET = 'smrt';
|
|
5
|
+
export const DEFAULT_COLOR_SCHEME = 'system';
|
|
6
|
+
export const COLOR_SCHEMES = [
|
|
7
|
+
'light',
|
|
8
|
+
'dark',
|
|
9
|
+
'system',
|
|
10
|
+
];
|
|
11
|
+
/** The fonts a theme may name, each with its CSS stack. A fixed list, never free text. */
|
|
12
|
+
export const THEME_FONTS = {
|
|
13
|
+
'system-ui': 'system-ui, -apple-system, "Segoe UI", sans-serif',
|
|
14
|
+
Inter: 'Inter, system-ui, sans-serif',
|
|
15
|
+
Georgia: 'Georgia, "Times New Roman", serif',
|
|
16
|
+
'ui-rounded': 'ui-rounded, "SF Pro Rounded", system-ui, sans-serif',
|
|
17
|
+
'ui-monospace': 'ui-monospace, "SF Mono", Menlo, monospace',
|
|
18
|
+
};
|
|
19
|
+
const HEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
20
|
+
/** `#rgb` or `#rrggbb` (with or without `#`) as lowercase `#rrggbb`; else null. */
|
|
21
|
+
export function normalizeHex(value) {
|
|
22
|
+
if (typeof value !== 'string')
|
|
23
|
+
return null;
|
|
24
|
+
const match = HEX.exec(value.trim());
|
|
25
|
+
if (!match)
|
|
26
|
+
return null;
|
|
27
|
+
let digits = match[1].toLowerCase();
|
|
28
|
+
if (digits.length === 3) {
|
|
29
|
+
digits = [...digits].map((d) => d + d).join('');
|
|
30
|
+
}
|
|
31
|
+
return `#${digits}`;
|
|
32
|
+
}
|
|
33
|
+
const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
34
|
+
/**
|
|
35
|
+
* Check a `theme` value from a file. Strict: a bad preset, colour, font or
|
|
36
|
+
* scheme is an error, not silently dropped. An empty object reads as absent.
|
|
37
|
+
*/
|
|
38
|
+
export function parseTheme(value) {
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
return { ok: true, theme: undefined };
|
|
41
|
+
if (!isObject(value)) {
|
|
42
|
+
return { ok: false, error: 'The cookbook "theme" must be an object.' };
|
|
43
|
+
}
|
|
44
|
+
const theme = {};
|
|
45
|
+
if (value.preset !== undefined) {
|
|
46
|
+
if (typeof value.preset !== 'string' ||
|
|
47
|
+
!THEME_PRESETS.includes(value.preset)) {
|
|
48
|
+
return {
|
|
49
|
+
ok: false,
|
|
50
|
+
error: `The theme preset must be one of ${THEME_PRESETS.join(', ')}.`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
theme.preset = value.preset;
|
|
54
|
+
}
|
|
55
|
+
if (value.colorScheme !== undefined) {
|
|
56
|
+
if (!COLOR_SCHEMES.includes(value.colorScheme)) {
|
|
57
|
+
return {
|
|
58
|
+
ok: false,
|
|
59
|
+
error: 'The theme colorScheme must be light, dark or system.',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
theme.colorScheme = value.colorScheme;
|
|
63
|
+
}
|
|
64
|
+
if (value.custom !== undefined) {
|
|
65
|
+
if (!isObject(value.custom)) {
|
|
66
|
+
return { ok: false, error: 'The theme "custom" must be an object.' };
|
|
67
|
+
}
|
|
68
|
+
const primary = normalizeHex(value.custom.primary);
|
|
69
|
+
if (!primary) {
|
|
70
|
+
return {
|
|
71
|
+
ok: false,
|
|
72
|
+
error: 'The theme custom primary must be a hex colour like #c2410c.',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const custom = { primary };
|
|
76
|
+
if (value.custom.fontFamily !== undefined) {
|
|
77
|
+
const font = value.custom.fontFamily;
|
|
78
|
+
if (typeof font !== 'string' || !Object.hasOwn(THEME_FONTS, font)) {
|
|
79
|
+
return {
|
|
80
|
+
ok: false,
|
|
81
|
+
error: `The theme font must be one of ${Object.keys(THEME_FONTS).join(', ')}.`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
custom.fontFamily = font;
|
|
85
|
+
}
|
|
86
|
+
theme.custom = custom;
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, theme: Object.keys(theme).length ? theme : undefined };
|
|
89
|
+
}
|
|
90
|
+
/** Same theme? Absent and `{}` are the same (the default). */
|
|
91
|
+
export function themeEquals(a, b) {
|
|
92
|
+
return JSON.stringify(canonical(a)) === JSON.stringify(canonical(b));
|
|
93
|
+
}
|
|
94
|
+
function canonical(theme) {
|
|
95
|
+
return {
|
|
96
|
+
preset: theme?.preset ?? DEFAULT_PRESET,
|
|
97
|
+
colorScheme: theme?.colorScheme ?? DEFAULT_COLOR_SCHEME,
|
|
98
|
+
primary: theme?.custom?.primary ?? null,
|
|
99
|
+
font: theme?.custom ? (theme.custom.fontFamily ?? null) : null,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** Drop defaults so an unchanged theme stays absent from the document. */
|
|
103
|
+
export function compactTheme(theme) {
|
|
104
|
+
if (!theme)
|
|
105
|
+
return undefined;
|
|
106
|
+
const out = {};
|
|
107
|
+
if (theme.preset)
|
|
108
|
+
out.preset = theme.preset;
|
|
109
|
+
if (theme.colorScheme)
|
|
110
|
+
out.colorScheme = theme.colorScheme;
|
|
111
|
+
if (theme.custom)
|
|
112
|
+
out.custom = { ...theme.custom };
|
|
113
|
+
return Object.keys(out).length ? out : undefined;
|
|
114
|
+
}
|
|
115
|
+
/** A short phrase for the chat and the Settings tab, e.g. "Glass, dark". */
|
|
116
|
+
export function describeTheme(theme) {
|
|
117
|
+
const scheme = theme?.colorScheme ?? DEFAULT_COLOR_SCHEME;
|
|
118
|
+
const base = theme?.custom
|
|
119
|
+
? `brand colour ${theme.custom.primary}`
|
|
120
|
+
: (theme?.preset ?? DEFAULT_PRESET);
|
|
121
|
+
return scheme === 'system' ? base : `${base}, ${scheme}`;
|
|
122
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
STAND-IN for `CustomerSelect` of `@happyvertical/smrt-commerce/svelte`
|
|
3
|
+
(happyvertical/smrt#3602). Presentation-only: data comes from the caller's
|
|
4
|
+
`search(query)` and `resolve(id)`, which return the commerce party DTO
|
|
5
|
+
(`CustomerDisplayData`, whose `profile.name` is the label). Shows the
|
|
6
|
+
profile name plus status and type, with an optional "New customer" action.
|
|
7
|
+
Registered in `selects.ts` as the selector for
|
|
8
|
+
`@happyvertical/smrt-commerce:Customer`. When #3602 ships, import the
|
|
9
|
+
published component and delete this file.
|
|
10
|
+
-->
|
|
11
|
+
<script lang="ts">
|
|
12
|
+
import { RelationInput } from '@happyvertical/smrt-svelte/forms';
|
|
13
|
+
import { customerOption } from './partySelect.js';
|
|
14
|
+
import type { CustomerDisplayData } from './partyTypes.js';
|
|
15
|
+
|
|
16
|
+
interface CustomerSelectProps {
|
|
17
|
+
value?: string;
|
|
18
|
+
name: string;
|
|
19
|
+
label?: string;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
error?: string;
|
|
23
|
+
search: (query: string) => Promise<CustomerDisplayData[]>;
|
|
24
|
+
resolve: (id: string) => Promise<CustomerDisplayData | null>;
|
|
25
|
+
onCreate?: () => void;
|
|
26
|
+
createLabel?: string;
|
|
27
|
+
onchange?: (id: string) => void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let {
|
|
31
|
+
value = $bindable(''),
|
|
32
|
+
name,
|
|
33
|
+
label = 'Customer',
|
|
34
|
+
required = false,
|
|
35
|
+
disabled = false,
|
|
36
|
+
error,
|
|
37
|
+
search,
|
|
38
|
+
resolve,
|
|
39
|
+
onCreate,
|
|
40
|
+
createLabel = 'New customer',
|
|
41
|
+
onchange,
|
|
42
|
+
}: CustomerSelectProps = $props();
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<RelationInput
|
|
46
|
+
bind:value
|
|
47
|
+
{name}
|
|
48
|
+
{label}
|
|
49
|
+
{required}
|
|
50
|
+
{disabled}
|
|
51
|
+
{error}
|
|
52
|
+
{onCreate}
|
|
53
|
+
{createLabel}
|
|
54
|
+
{onchange}
|
|
55
|
+
search={async (query) => (await search(query)).map(customerOption)}
|
|
56
|
+
resolve={async (id) => {
|
|
57
|
+
const found = await resolve(id);
|
|
58
|
+
return found ? { id: found.id, label: found.profile.name } : null;
|
|
59
|
+
}}
|
|
60
|
+
/>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CustomerDisplayData } from './partyTypes.ts';
|
|
2
|
+
interface CustomerSelectProps {
|
|
3
|
+
value?: string;
|
|
4
|
+
name: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
search: (query: string) => Promise<CustomerDisplayData[]>;
|
|
10
|
+
resolve: (id: string) => Promise<CustomerDisplayData | null>;
|
|
11
|
+
onCreate?: () => void;
|
|
12
|
+
createLabel?: string;
|
|
13
|
+
onchange?: (id: string) => void;
|
|
14
|
+
}
|
|
15
|
+
declare const CustomerSelect: import("svelte").Component<CustomerSelectProps, {}, "value">;
|
|
16
|
+
type CustomerSelect = ReturnType<typeof CustomerSelect>;
|
|
17
|
+
export default CustomerSelect;
|