@happyvertical/smrt-planner 0.0.2 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -8
- package/app/404.html +42 -49
- package/app/_app/immutable/assets/0.DUow1OzM.css +1 -0
- package/app/_app/immutable/assets/10.CdYxvH4G.css +1 -0
- package/app/_app/immutable/assets/11.nOT5Z4Fv.css +1 -0
- package/app/_app/immutable/assets/12.F7A7zP4J.css +1 -0
- package/app/_app/immutable/assets/13.JoySu8W5.css +1 -0
- package/app/_app/immutable/assets/14.nsp62-4b.css +1 -0
- package/app/_app/immutable/assets/2.CbPiqdz5.css +1 -0
- package/app/_app/immutable/assets/3.D518dbB5.css +1 -0
- package/app/_app/immutable/assets/4.B3vt1gMJ.css +1 -0
- package/app/_app/immutable/assets/AiSetup.4fXjMpTZ.css +1 -0
- package/app/_app/immutable/assets/AppShell.DOvXbUZo.css +1 -0
- package/app/_app/immutable/assets/ConnectTools.DTleL8YA.css +1 -0
- package/app/_app/immutable/assets/FieldMapForm.C8SZ3t4N.css +1 -0
- package/app/_app/immutable/assets/ModelPage.DbXvPbHE.css +1 -0
- package/app/_app/immutable/assets/SectionActions.BE1CPmxk.css +1 -0
- package/app/_app/immutable/assets/SectionIcons.BGFcFuOf.css +1 -0
- package/app/_app/immutable/assets/SegmentedControl.BkyuoCEJ.css +1 -0
- package/app/_app/immutable/assets/app.eM0k786r.css +1 -0
- package/app/_app/immutable/assets/currency-metadata.DDyu8_ub.css +1 -0
- package/app/_app/immutable/assets/data.bGq43K60.css +1 -0
- package/app/_app/immutable/assets/feedback.xBpOq9ef.css +1 -0
- package/app/_app/immutable/assets/forms.B3_bbIMe.css +1 -0
- package/app/_app/immutable/assets/labels.BiuUjqHs.css +1 -0
- package/app/_app/immutable/assets/percent.DbwvwMhf.css +1 -0
- package/app/_app/immutable/assets/state.CJipYvSU.css +1 -0
- package/app/_app/immutable/assets/webmcp-ui-context.BnR-DUfO.css +1 -0
- package/app/_app/immutable/assets/workspace.B5Xq-5pJ.css +1 -0
- package/app/_app/immutable/chunks/1ElZWh_R.js +10 -0
- package/app/_app/immutable/chunks/B-CpwO-j.js +1 -0
- package/app/_app/immutable/chunks/{BnRri03M.js → B7KB-rhH.js} +1 -1
- package/app/_app/immutable/chunks/BUhghcIm.js +1 -0
- package/app/_app/immutable/chunks/BV3NwM01.js +1 -0
- package/app/_app/immutable/chunks/BZVZZ6VY.js +1 -0
- package/app/_app/immutable/chunks/Ba1g71Sq.js +1 -0
- package/app/_app/immutable/chunks/BeJD7_hy.js +1 -0
- package/app/_app/immutable/chunks/BiO_bqNH.js +2 -0
- package/app/_app/immutable/chunks/{DkR8_Ws6.js → BqBuCJB_.js} +2 -2
- package/app/_app/immutable/chunks/BsJoBmTA.js +1 -0
- package/app/_app/immutable/chunks/Bxbz6_Mb.js +1 -0
- package/app/_app/immutable/chunks/Bz5uCkjV.js +2 -0
- package/app/_app/immutable/chunks/BzMfoxBk.js +1 -0
- package/app/_app/immutable/chunks/CF6zSg_o.js +2 -0
- package/app/_app/immutable/chunks/CFL0B6dk.js +1 -0
- package/app/_app/immutable/chunks/CRu55ZTy.js +4 -0
- package/app/_app/immutable/chunks/{CyUMm_Wp.js → Cv2EcCr0.js} +1 -1
- package/app/_app/immutable/chunks/D-3Ri0zJ.js +1 -0
- package/app/_app/immutable/chunks/{BWPhGFHl.js → D0FW0z6R.js} +1 -1
- package/app/_app/immutable/chunks/D7d5GssF.js +1 -0
- package/app/_app/immutable/chunks/DCsSRJsN.js +1 -0
- package/app/_app/immutable/chunks/DGqV6_5v.js +1 -0
- package/app/_app/immutable/chunks/DNSRTkf6.js +11 -0
- package/app/_app/immutable/chunks/DQNX_XPY.js +1 -0
- package/app/_app/immutable/chunks/DSyIMN4M.js +1 -0
- package/app/_app/immutable/chunks/DUTtmM1Y.js +1 -0
- package/app/_app/immutable/chunks/DYuawOB3.js +980 -0
- package/app/_app/immutable/chunks/DfCLzLZc.js +1 -0
- package/app/_app/immutable/chunks/Dh5fne6n.js +1 -0
- package/app/_app/immutable/chunks/LruoUXGC.js +1 -0
- package/app/_app/immutable/chunks/ZLqixH7j.js +9 -0
- package/app/_app/immutable/chunks/_pYwB_Eb.js +4 -0
- package/app/_app/immutable/chunks/aoU3lIZI.js +1 -0
- package/app/_app/immutable/chunks/c57ZlocB.js +24 -0
- package/app/_app/immutable/chunks/h8ppmjOm.js +1 -0
- package/app/_app/immutable/chunks/jhcy_jeO.js +1 -0
- package/app/_app/immutable/chunks/vNEnXNLV.js +3 -0
- package/app/_app/immutable/chunks/vwntRvfV.js +1 -0
- package/app/_app/immutable/entry/app.D5LoTsNA.js +2 -0
- package/app/_app/immutable/entry/start.Sb_s0NGC.js +1 -0
- package/app/_app/immutable/nodes/0.Cuo9-RQc.js +9 -0
- package/app/_app/immutable/nodes/1.BW8Ar5T3.js +1 -0
- package/app/_app/immutable/nodes/10.CpLYjN7r.js +3 -0
- package/app/_app/immutable/nodes/11.BMPKD4M3.js +1 -0
- package/app/_app/immutable/nodes/12.WYpy0AHE.js +4 -0
- package/app/_app/immutable/nodes/13.BYo05X9B.js +1 -0
- package/app/_app/immutable/nodes/14.DN0MT3KB.js +1 -0
- package/app/_app/immutable/nodes/2.DM6k_pqu.js +24 -0
- package/app/_app/immutable/nodes/3.YgEwJ-vF.js +1 -0
- package/app/_app/immutable/nodes/4.A3Y6Lax0.js +1 -0
- package/app/_app/immutable/nodes/5.D9Vd85hG.js +1 -0
- package/app/_app/immutable/nodes/6.C5c56bSW.js +1 -0
- package/app/_app/immutable/nodes/7.CDBMbYlD.js +1 -0
- package/app/_app/immutable/nodes/8.8olDkDou.js +1 -0
- package/app/_app/immutable/nodes/9.CWgx__8Z.js +1 -0
- package/app/_app/version.json +1 -1
- package/app/advanced-styles/index.html +84 -0
- package/app/ai/index.html +60 -52
- package/app/blueprint/index.html +46 -53
- package/app/cookbook/index.html +46 -53
- package/app/index.html +92 -64
- package/app/m/ads/AdDeliveryTier/index.html +52 -59
- package/app/m/ads/AdEvent/index.html +52 -59
- package/app/m/ads/AdFormat/index.html +52 -59
- package/app/m/ads/AdGroup/index.html +52 -59
- package/app/m/ads/AdVariation/index.html +52 -59
- package/app/m/analytics/AnalyticsDataStream/index.html +52 -59
- package/app/m/analytics/AnalyticsEvent/index.html +52 -59
- package/app/m/analytics/AnalyticsProperty/index.html +52 -59
- package/app/m/analytics/AnalyticsReport/index.html +52 -59
- package/app/m/approvals/ApprovalEvent/index.html +52 -59
- package/app/m/approvals/ApprovalPolicy/index.html +52 -59
- package/app/m/approvals/ApprovalRequest/index.html +52 -59
- package/app/m/assets/Asset/attachments/index.html +91 -0
- package/app/m/assets/Asset/index.html +52 -59
- package/app/m/assets/AssetAssociation/index.html +53 -60
- package/app/m/assets/AssetMetafield/index.html +52 -59
- package/app/m/assets/AssetStatus/index.html +52 -59
- package/app/m/assets/AssetType/index.html +52 -59
- package/app/m/assets/Folder/index.html +52 -59
- package/app/m/chat/AgentSession/index.html +52 -59
- package/app/m/chat/ChatMessage/index.html +53 -60
- package/app/m/chat/ChatParticipant/index.html +53 -60
- package/app/m/chat/ChatReaction/index.html +52 -59
- package/app/m/chat/ChatRoom/index.html +52 -59
- package/app/m/chat/ChatThread/index.html +53 -60
- package/app/m/chat/VoiceGatewayTurn/index.html +52 -59
- package/app/m/chat/VoiceSession/index.html +52 -59
- package/app/m/commerce/Agreement/index.html +52 -59
- package/app/m/commerce/Cart/index.html +52 -59
- package/app/m/commerce/Contract/index.html +52 -59
- package/app/m/commerce/ContractLineItem/index.html +53 -60
- package/app/m/commerce/Customer/index.html +52 -59
- package/app/m/commerce/DocumentTax/index.html +89 -0
- package/app/m/commerce/Estimate/index.html +52 -59
- package/app/m/commerce/Fulfillment/index.html +52 -59
- package/app/m/commerce/FulfillmentLineItem/index.html +53 -60
- package/app/m/commerce/Invoice/index.html +52 -59
- package/app/m/commerce/InvoiceLineItem/index.html +53 -60
- package/app/m/commerce/Lease/index.html +52 -59
- package/app/m/commerce/LicenseSale/index.html +52 -59
- package/app/m/commerce/Order/index.html +52 -59
- package/app/m/commerce/Payment/index.html +52 -59
- package/app/m/commerce/PaymentAllocation/index.html +53 -60
- package/app/m/commerce/PaymentInstrument/index.html +52 -59
- package/app/m/commerce/PaymentIntent/index.html +52 -59
- package/app/m/commerce/Payout/index.html +52 -59
- package/app/m/commerce/ProductionOrder/index.html +52 -59
- package/app/m/commerce/PurchaseContract/index.html +89 -0
- package/app/m/commerce/PurchaseOrder/index.html +52 -59
- package/app/m/commerce/SalesContract/index.html +89 -0
- package/app/m/commerce/SupplierQuote/index.html +89 -0
- package/app/m/commerce/TaxCode/index.html +89 -0
- package/app/m/commerce/TaxComponent/index.html +89 -0
- package/app/m/commerce/TaxSettings/index.html +89 -0
- package/app/m/commerce/TaxSummaryReport/index.html +89 -0
- package/app/m/commerce/Vendor/index.html +52 -59
- package/app/m/commerce/WholesaleOrder/index.html +52 -59
- package/app/m/content/Content/index.html +52 -59
- package/app/m/content/ContentContribution/index.html +52 -59
- package/app/m/content/ContentContributionAttachment/index.html +52 -59
- package/app/m/content/ContentContributionRevision/index.html +52 -59
- package/app/m/content/ContentContributionType/index.html +52 -59
- package/app/m/content/ContentContributor/index.html +52 -59
- package/app/m/content/ContentCorrection/index.html +52 -59
- package/app/m/content/ContentFeedSource/index.html +52 -59
- package/app/m/content/ContentGovernanceAssignment/index.html +52 -59
- package/app/m/content/ContentGovernancePolicy/index.html +52 -59
- package/app/m/content/ContentGovernanceProfile/index.html +52 -59
- package/app/m/content/ContentReference/index.html +52 -59
- package/app/m/content/ContentReview/index.html +52 -59
- package/app/m/content/ContentVersion/index.html +52 -59
- package/app/m/events/Event/index.html +52 -59
- package/app/m/events/EventParticipant/index.html +53 -60
- package/app/m/events/EventSeries/index.html +52 -59
- package/app/m/events/EventType/index.html +52 -59
- package/app/m/expenses/Expense/index.html +89 -0
- package/app/m/facts/Fact/index.html +52 -59
- package/app/m/facts/FactContent/index.html +52 -59
- package/app/m/facts/FactEvidence/index.html +52 -59
- package/app/m/facts/FactSource/index.html +52 -59
- package/app/m/facts/FactSubject/index.html +52 -59
- package/app/m/facts/FactTag/index.html +52 -59
- package/app/m/fields/FieldPolicy/index.html +52 -59
- package/app/m/fields/FieldPolicySuggestion/index.html +52 -59
- package/app/m/fields/FieldUsageCounter/index.html +52 -59
- package/app/m/images/Image/index.html +52 -59
- package/app/m/inventory/InventoryLocation/index.html +52 -59
- package/app/m/inventory/StockLevel/index.html +52 -59
- package/app/m/inventory/StockMovement/index.html +52 -59
- package/app/m/ledgers/Account/index.html +52 -59
- package/app/m/ledgers/Journal/index.html +52 -59
- package/app/m/ledgers/JournalEntry/index.html +53 -60
- package/app/m/manufacturing/Assembly/index.html +52 -59
- package/app/m/manufacturing/BillOfMaterials/index.html +52 -59
- package/app/m/manufacturing/BomLine/index.html +52 -59
- package/app/m/manufacturing/Operation/index.html +52 -59
- package/app/m/manufacturing/ProductionRun/index.html +52 -59
- package/app/m/manufacturing/ProductionRunCompletion/index.html +52 -59
- package/app/m/manufacturing/RoutingStep/index.html +52 -59
- package/app/m/marketing/Campaign/index.html +52 -59
- package/app/m/marketing/CampaignChannel/index.html +52 -59
- package/app/m/marketing/CampaignMetricSnapshot/index.html +52 -59
- package/app/m/messages/Account/index.html +52 -59
- package/app/m/messages/Attachment/index.html +52 -59
- package/app/m/messages/Blacklist/index.html +52 -59
- package/app/m/messages/Email/failed-sends/index.html +54 -59
- package/app/m/messages/Email/index.html +52 -59
- package/app/m/messages/Email/mailbox/index.html +54 -59
- package/app/m/messages/EmailAccount/index.html +52 -59
- package/app/m/messages/EmailAttachment/index.html +89 -0
- package/app/m/messages/EmailFolder/index.html +52 -59
- package/app/m/messages/Message/index.html +52 -59
- package/app/m/messages/MessagingEndpoint/index.html +52 -59
- package/app/m/messages/PersonaMessageRoute/index.html +52 -59
- package/app/m/messages/SlackAccount/index.html +52 -59
- package/app/m/messages/SlackMessage/index.html +52 -59
- package/app/m/messages/TelegramAccount/index.html +52 -59
- package/app/m/messages/Tweet/index.html +52 -59
- package/app/m/messages/TwitterAccount/index.html +52 -59
- package/app/m/messages/Whitelist/index.html +52 -59
- package/app/m/messages/ZulipAccount/index.html +52 -59
- package/app/m/places/Place/index.html +52 -59
- package/app/m/places/PlaceType/index.html +52 -59
- package/app/m/products/Category/index.html +52 -59
- package/app/m/products/Material/index.html +52 -59
- package/app/m/products/Product/index.html +52 -59
- package/app/m/products/Product/ingredients/index.html +54 -59
- package/app/m/products/ProductVariant/index.html +53 -60
- package/app/m/products/Sku/index.html +53 -60
- package/app/m/profiles/ApiKey/index.html +52 -59
- package/app/m/profiles/Bot/index.html +52 -59
- package/app/m/profiles/MagicLinkToken/index.html +52 -59
- package/app/m/profiles/NostrIdentity/index.html +52 -59
- package/app/m/profiles/OidcIdentity/index.html +52 -59
- package/app/m/profiles/Organization/index.html +52 -59
- package/app/m/profiles/Person/index.html +52 -59
- package/app/m/profiles/Profile/index.html +52 -59
- package/app/m/profiles/ProfileMetadata/index.html +52 -59
- package/app/m/profiles/ProfileMetafield/index.html +52 -59
- package/app/m/profiles/ProfileRelationship/index.html +52 -59
- package/app/m/profiles/ProfileRelationshipTerm/index.html +52 -59
- package/app/m/profiles/ProfileRelationshipType/index.html +52 -59
- package/app/m/profiles/ProfileType/index.html +52 -59
- package/app/m/projects/Comment/index.html +53 -60
- package/app/m/projects/Issue/index.html +52 -59
- package/app/m/projects/Label/index.html +52 -59
- package/app/m/projects/Project/index.html +52 -59
- package/app/m/projects/ProjectIntegration/index.html +52 -59
- package/app/m/projects/PullRequest/index.html +52 -59
- package/app/m/projects/Repository/index.html +52 -59
- package/app/m/properties/Property/index.html +52 -59
- package/app/m/properties/Zone/index.html +52 -59
- package/app/m/reports/RuntimeReport/index.html +52 -59
- package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +52 -59
- package/app/m/reports/SmrtReportLock/index.html +52 -59
- package/app/m/reports/SmrtReportRefreshTask/index.html +52 -59
- package/app/m/reports/SmrtReportRun/index.html +52 -59
- package/app/m/reports/SmrtReportSchedule/index.html +52 -59
- package/app/m/reports/SmrtReportWatermark/index.html +52 -59
- package/app/m/sales/AttributionException/index.html +52 -59
- package/app/m/sales/AttributionPolicy/index.html +52 -59
- package/app/m/sales/Commission/index.html +52 -59
- package/app/m/sales/CommissionAdjustment/index.html +52 -59
- package/app/m/sales/CommissionPayout/index.html +52 -59
- package/app/m/sales/CommissionPlan/index.html +52 -59
- package/app/m/sales/Earner/index.html +52 -59
- package/app/m/sales/EarnerSourceAttribution/index.html +52 -59
- package/app/m/sales/EarningEvent/index.html +52 -59
- package/app/m/sales/ExecutedAgreement/index.html +52 -59
- package/app/m/sales/Lead/index.html +52 -59
- package/app/m/sales/Opportunity/index.html +52 -59
- package/app/m/sales/OpportunityConversion/index.html +52 -59
- package/app/m/sales/PipelineDefinition/index.html +52 -59
- package/app/m/sales/PipelineStage/index.html +53 -60
- package/app/m/sales/Referral/index.html +52 -59
- package/app/m/sales/ReferralAgreement/index.html +52 -59
- package/app/m/sales/ReferralLink/index.html +52 -59
- package/app/m/sales/ReferralProgram/index.html +52 -59
- package/app/m/sales/ReferralTermSnapshot/index.html +52 -59
- package/app/m/sales/ReferralTouch/index.html +52 -59
- package/app/m/sales/Referrer/index.html +52 -59
- package/app/m/sales/SalesActivity/index.html +52 -59
- package/app/m/sales/SalesRepresentative/index.html +52 -59
- package/app/m/sites/Site/index.html +52 -59
- package/app/m/sites/SiteAgentBinding/index.html +52 -59
- package/app/m/social/OAuthState/index.html +52 -59
- package/app/m/social/SocialAccount/index.html +52 -59
- package/app/m/social/SocialPost/index.html +52 -59
- package/app/m/social/SocialPostAnalyticsSnapshot/index.html +52 -59
- package/app/m/subscriptions/BillingAdjustment/index.html +52 -59
- package/app/m/subscriptions/ClientCharge/index.html +52 -59
- package/app/m/subscriptions/CreditGrant/index.html +52 -59
- package/app/m/subscriptions/PricingRule/index.html +52 -59
- package/app/m/subscriptions/RetailCharge/index.html +52 -59
- package/app/m/subscriptions/SpendingPolicy/index.html +52 -59
- package/app/m/subscriptions/SubscriptionPlan/index.html +52 -59
- package/app/m/subscriptions/TenantSubscription/index.html +52 -59
- package/app/m/subscriptions/TenantUsageMetric/index.html +52 -59
- package/app/m/support/ServiceTimeEntry/index.html +52 -59
- package/app/m/support/SupportAiRun/index.html +52 -59
- package/app/m/support/SupportAvailability/index.html +52 -59
- package/app/m/support/SupportCase/index.html +52 -59
- package/app/m/support/SupportCaseEvent/index.html +52 -59
- package/app/m/support/SupportChannelBinding/index.html +52 -59
- package/app/m/support/SupportCharge/index.html +52 -59
- package/app/m/support/SupportCompensation/index.html +52 -59
- package/app/m/support/SupportCompensationPlan/index.html +52 -59
- package/app/m/support/SupportEscalation/index.html +52 -59
- package/app/m/support/SupportInteraction/index.html +52 -59
- package/app/m/support/SupportPlan/index.html +52 -59
- package/app/m/support/SupportPolicy/index.html +52 -59
- package/app/m/support/SupportQualification/index.html +52 -59
- package/app/m/support/SupportServiceTarget/index.html +52 -59
- package/app/m/support/SupportSpecialist/index.html +52 -59
- package/app/m/support/SupportWorkLink/index.html +52 -59
- package/app/m/tags/Tag/index.html +52 -59
- package/app/m/tags/TagAlias/index.html +52 -59
- package/app/m/timesheets/AttendanceBreak/index.html +52 -59
- package/app/m/timesheets/AttendancePunch/index.html +52 -59
- package/app/m/timesheets/AttendanceSegment/index.html +89 -0
- package/app/m/timesheets/ServiceChargeSnapshot/index.html +52 -59
- package/app/m/timesheets/ServiceCompensationSnapshot/index.html +52 -59
- package/app/m/timesheets/ServiceTimeEntry/index.html +52 -59
- package/app/m/users/Group/index.html +52 -59
- package/app/m/users/GroupMember/index.html +52 -59
- package/app/m/users/GroupRole/index.html +52 -59
- package/app/m/users/Membership/index.html +53 -60
- package/app/m/users/MembershipOverride/index.html +52 -59
- package/app/m/users/Permission/index.html +52 -59
- package/app/m/users/Role/index.html +52 -59
- package/app/m/users/RolePermission/index.html +52 -59
- package/app/m/users/Session/index.html +52 -59
- package/app/m/users/Tenant/index.html +52 -59
- package/app/m/users/TenantIntegration/index.html +52 -59
- package/app/m/users/TenantPermissionOverride/index.html +52 -59
- package/app/m/users/User/index.html +52 -59
- package/app/m/video/Character/index.html +52 -59
- package/app/m/video/CharacterAsset/index.html +52 -59
- package/app/m/video/CompositeJob/index.html +52 -59
- package/app/m/video/Performer/index.html +52 -59
- package/app/m/video/PerformerAsset/index.html +52 -59
- package/app/m/video/Scene/index.html +52 -59
- package/app/m/video/SceneAsset/index.html +52 -59
- package/app/m/video/VideoComposition/index.html +52 -59
- package/app/m/video/VideoCompositionAsset/index.html +52 -59
- package/app/m/video/VideoSequence/index.html +52 -59
- package/app/m/video/VideoSequenceAsset/index.html +52 -59
- package/app/m/video/VideoShot/index.html +52 -59
- package/app/m/video/VideoShotAsset/index.html +52 -59
- package/app/m/video/VideoShotCharacter/index.html +52 -59
- package/app/m/video/VideoWorkflow/index.html +52 -59
- package/app/m/voice/VoiceOutput/index.html +52 -59
- package/app/m/voice/VoiceProfile/index.html +52 -59
- package/app/m/voice/VoiceSample/index.html +52 -59
- package/app/packages/ads/index.html +50 -57
- package/app/packages/analytics/index.html +50 -57
- package/app/packages/approvals/index.html +50 -57
- package/app/packages/assets/index.html +50 -57
- package/app/packages/chat/index.html +50 -57
- package/app/packages/comments/index.html +50 -57
- package/app/packages/commerce/index.html +50 -57
- package/app/packages/content/index.html +50 -57
- package/app/packages/events/index.html +50 -57
- package/app/packages/expenses/index.html +50 -57
- package/app/packages/facts/index.html +50 -57
- package/app/packages/fields/index.html +50 -57
- package/app/packages/human-resources/index.html +50 -57
- package/app/packages/images/index.html +50 -57
- package/app/packages/index.html +49 -55
- package/app/packages/ingestion/index.html +85 -0
- package/app/packages/inventory/index.html +50 -57
- package/app/packages/ledgers/index.html +50 -57
- package/app/packages/manufacturing/index.html +50 -57
- package/app/packages/marketing/index.html +50 -57
- package/app/packages/messages/index.html +50 -57
- package/app/packages/places/index.html +50 -57
- package/app/packages/preferences/index.html +50 -57
- package/app/packages/products/index.html +50 -57
- package/app/packages/profiles/index.html +50 -57
- package/app/packages/projects/index.html +50 -57
- package/app/packages/properties/index.html +50 -57
- package/app/packages/reports/index.html +50 -57
- package/app/packages/sales/index.html +50 -57
- package/app/packages/sites/index.html +50 -57
- package/app/packages/social/index.html +50 -57
- package/app/packages/subscriptions/index.html +50 -57
- package/app/packages/support/index.html +50 -57
- package/app/packages/tags/index.html +50 -57
- package/app/packages/timesheets/index.html +50 -57
- package/app/packages/users/index.html +50 -57
- package/app/packages/video/index.html +50 -57
- package/app/packages/voice/index.html +50 -57
- package/app/packages/webhooks/index.html +85 -0
- package/app/recipes/account-access/help/index.html +52 -57
- package/app/recipes/account-access/index.html +57 -59
- package/app/recipes/activity/help/index.html +52 -57
- package/app/recipes/activity/index.html +57 -59
- package/app/recipes/agreements/help/index.html +52 -57
- package/app/recipes/agreements/index.html +57 -59
- package/app/recipes/analytics.reports/help/index.html +52 -57
- package/app/recipes/analytics.reports/index.html +57 -59
- package/app/recipes/assets/help/index.html +52 -57
- package/app/recipes/assets/index.html +57 -59
- package/app/recipes/billing/help/index.html +52 -57
- package/app/recipes/billing/index.html +57 -59
- package/app/recipes/chat.assistant/help/index.html +52 -57
- package/app/recipes/chat.assistant/index.html +57 -59
- package/app/recipes/comments/help/index.html +52 -57
- package/app/recipes/comments/index.html +57 -59
- package/app/recipes/commerce.customers/help/index.html +52 -57
- package/app/recipes/commerce.customers/index.html +57 -59
- package/app/recipes/commerce.estimates/help/index.html +52 -57
- package/app/recipes/commerce.estimates/index.html +57 -59
- package/app/recipes/commerce.purchases/help/index.html +52 -57
- package/app/recipes/commerce.purchases/index.html +57 -59
- package/app/recipes/commerce.sales/help/index.html +52 -57
- package/app/recipes/commerce.sales/index.html +57 -59
- package/app/recipes/commerce.vendors/help/index.html +52 -57
- package/app/recipes/commerce.vendors/index.html +57 -59
- package/app/recipes/commerce.wholesale/help/index.html +52 -57
- package/app/recipes/commerce.wholesale/index.html +57 -59
- package/app/recipes/events.calendar/help/index.html +52 -57
- package/app/recipes/events.calendar/index.html +57 -59
- package/app/recipes/expenses.tracking/help/index.html +88 -0
- package/app/recipes/expenses.tracking/index.html +92 -0
- package/app/recipes/fields.form-customization/help/index.html +52 -57
- package/app/recipes/fields.form-customization/index.html +57 -59
- package/app/recipes/ingestion/help/index.html +88 -0
- package/app/recipes/ingestion/index.html +93 -0
- package/app/recipes/integrations/help/index.html +88 -0
- package/app/recipes/integrations/index.html +92 -0
- package/app/recipes/inventory.stock/help/index.html +52 -57
- package/app/recipes/inventory.stock/index.html +57 -59
- package/app/recipes/ledgers.bookkeeping/help/index.html +52 -57
- package/app/recipes/ledgers.bookkeeping/index.html +57 -59
- package/app/recipes/messages/help/index.html +52 -57
- package/app/recipes/messages/index.html +57 -59
- package/app/recipes/products/help/index.html +52 -57
- package/app/recipes/products/index.html +57 -59
- package/app/recipes/projects.tracker/help/index.html +52 -57
- package/app/recipes/projects.tracker/index.html +57 -59
- package/app/recipes/reports.materialized/help/index.html +52 -57
- package/app/recipes/reports.materialized/index.html +57 -59
- package/app/recipes/reports.runtime/help/index.html +88 -0
- package/app/recipes/reports.runtime/index.html +92 -0
- package/app/recipes/sales.pipeline/help/index.html +52 -57
- package/app/recipes/sales.pipeline/index.html +57 -59
- package/app/recipes/tags.taxonomy/help/index.html +52 -57
- package/app/recipes/tags.taxonomy/index.html +57 -59
- package/app/recipes/team-collaboration/help/index.html +52 -57
- package/app/recipes/team-collaboration/index.html +57 -59
- package/app/recipes/timesheets.time-entries/help/index.html +88 -0
- package/app/recipes/timesheets.time-entries/index.html +92 -0
- package/app/s/custom-accounts/index.html +82 -0
- package/app/s/custom-appointments/index.html +82 -0
- package/app/s/custom-billing/index.html +47 -54
- package/app/s/custom-buying/index.html +47 -54
- package/app/s/custom-checkout/index.html +82 -0
- package/app/s/custom-classes/index.html +47 -54
- package/app/s/custom-clients/index.html +82 -0
- package/app/s/custom-events/index.html +82 -0
- package/app/s/custom-fleet/index.html +82 -0
- package/app/s/custom-giving/index.html +82 -0
- package/app/s/custom-jobs/index.html +47 -54
- package/app/s/custom-kitchen/index.html +47 -54
- package/app/s/custom-material/index.html +47 -54
- package/app/s/custom-meetings/index.html +82 -0
- package/app/s/custom-members/index.html +47 -54
- package/app/s/custom-parts/index.html +47 -54
- package/app/s/custom-rentals/index.html +82 -0
- package/app/s/custom-roastery/index.html +82 -0
- package/app/s/custom-schedule/index.html +47 -54
- package/app/s/custom-shelf/index.html +82 -0
- package/app/s/custom-shop/index.html +47 -54
- package/app/s/custom-wholesale/index.html +47 -54
- package/app/s/custom-work/index.html +82 -0
- package/app/s/custom-yard/index.html +82 -0
- package/app/s/section-access-control/index.html +47 -54
- package/app/s/section-account-security/index.html +47 -54
- package/app/s/section-accounting/index.html +47 -54
- package/app/s/section-activity/index.html +47 -54
- package/app/s/section-agreements/index.html +47 -54
- package/app/s/section-analytics/index.html +47 -54
- package/app/s/section-assets/index.html +47 -54
- package/app/s/section-billing/index.html +47 -54
- package/app/s/section-calendar/index.html +47 -54
- package/app/s/section-catalog/index.html +47 -54
- package/app/s/section-chat.assistant/index.html +47 -54
- package/app/s/section-comments/index.html +47 -54
- package/app/s/section-fields.form-customization/index.html +47 -54
- package/app/s/section-ingestion/index.html +82 -0
- package/app/s/section-integrations/index.html +82 -0
- package/app/s/section-messages/index.html +47 -54
- package/app/s/section-more/index.html +47 -54
- package/app/s/section-operations/index.html +47 -54
- package/app/s/section-projects/index.html +47 -54
- package/app/s/section-purchasing/index.html +47 -54
- package/app/s/section-reports.materialized/index.html +47 -54
- package/app/s/section-reports.runtime/index.html +82 -0
- package/app/s/section-sales/index.html +47 -54
- package/app/s/section-taxonomy/index.html +47 -54
- package/app/s/section-team/index.html +47 -54
- package/app/s/section-work/index.html +82 -0
- package/dist/ai/state.svelte.d.ts +13 -0
- package/dist/ai/state.svelte.js +33 -0
- package/dist/assistant/change.d.ts +14 -3
- package/dist/assistant/change.js +26 -3
- package/dist/assistant/engine.js +5 -1
- package/dist/assistant/prompt.js +7 -3
- package/dist/catalog/catalog.json +11263 -14455
- package/dist/catalog/generate/exclusions.d.ts +2 -0
- package/dist/catalog/generate/exclusions.js +14 -0
- package/dist/catalog/generate/extract.js +28 -7
- package/dist/catalog/types.d.ts +7 -0
- package/dist/components/AdvancedStyles.svelte +138 -0
- package/dist/components/AdvancedStyles.svelte.d.ts +6 -0
- package/dist/components/AiModelsPage.svelte +40 -0
- package/dist/components/AiModelsPage.svelte.d.ts +7 -0
- package/dist/components/AiSetup.svelte +9 -6
- package/dist/components/AiStatusIcons.svelte +8 -5
- package/dist/components/AppSettings.svelte +105 -1
- package/dist/components/BrowserAssistant.svelte +16 -17
- package/dist/components/BrowserAssistant.svelte.d.ts +2 -0
- package/dist/components/ChildRecords.svelte +61 -14
- package/dist/components/ChildRecords.svelte.d.ts +1 -0
- package/dist/components/ConnectTools.svelte +5 -2
- package/dist/components/CookbooksPanel.svelte +56 -33
- package/dist/components/CopyButton.svelte +65 -0
- package/dist/components/CopyButton.svelte.d.ts +24 -0
- package/dist/components/ExportPanel.svelte +292 -57
- package/dist/components/ExportPanel.svelte.d.ts +10 -1
- package/dist/components/FeatureCard.svelte +21 -10
- package/dist/components/FeaturesPanel.svelte +4 -1
- package/dist/components/FieldInput.svelte +6 -3
- package/dist/components/FieldMapForm.svelte +6 -10
- package/dist/components/FieldMapForm.svelte.d.ts +1 -0
- package/dist/components/FormWorkspace.svelte +80 -9
- package/dist/components/FormWorkspace.svelte.d.ts +1 -0
- package/dist/components/HeaderIconLink.svelte +86 -0
- package/dist/components/HeaderIconLink.svelte.d.ts +14 -0
- package/dist/components/HelpView.svelte +3 -0
- package/dist/components/ModelOptions.svelte +13 -2
- package/dist/components/ModelPage.svelte +33 -5
- package/dist/components/ModelPage.svelte.d.ts +4 -0
- package/dist/components/ModelWorkspace.svelte +148 -50
- package/dist/components/ModelWorkspace.svelte.d.ts +4 -0
- package/dist/components/PackagePage.svelte +96 -0
- package/dist/components/PackagePage.svelte.d.ts +9 -0
- package/dist/components/ProductMedia.svelte +95 -0
- package/dist/components/ProductMedia.svelte.d.ts +10 -0
- package/dist/components/RecipeCards.svelte +13 -1
- package/dist/components/RecipeHelp.svelte +3 -0
- package/dist/components/RecipeOptions.svelte +13 -1
- package/dist/components/RecordFeatures.svelte +22 -8
- package/dist/components/RecordView.svelte +354 -0
- package/dist/components/RecordView.svelte.d.ts +14 -0
- package/dist/components/RelationField.svelte +5 -2
- package/dist/components/SectionActions.svelte +8 -5
- package/dist/components/SectionHeading.svelte +63 -0
- package/dist/components/SectionHeading.svelte.d.ts +11 -0
- package/dist/components/SectionIcons.svelte +15 -3
- package/dist/components/SectionOverview.svelte +33 -3
- package/dist/components/SectionOverview.svelte.d.ts +4 -0
- package/dist/components/SectionPage.svelte +25 -165
- package/dist/components/SectionView.svelte +172 -0
- package/dist/components/SectionView.svelte.d.ts +18 -0
- package/dist/components/SettingsPanel.svelte +3 -9
- package/dist/components/SettingsPanel.svelte.d.ts +1 -5
- package/dist/components/ThemeBridge.svelte +80 -4
- package/dist/components/ThemeBridge.svelte.d.ts +5 -1
- package/dist/components/ThemeSection.svelte +208 -117
- package/dist/components/ThemeSection.svelte.d.ts +3 -7
- package/dist/components/VariantGridForm.svelte +9 -13
- package/dist/components/VariantGridForm.svelte.d.ts +1 -0
- package/dist/components/VoiceTyping.svelte +3 -0
- package/dist/cookbook/describe.d.ts +29 -0
- package/dist/cookbook/describe.js +164 -0
- package/dist/cookbook/file.d.ts +6 -0
- package/dist/cookbook/file.js +18 -4
- package/dist/cookbook/prompt.d.ts +49 -0
- package/dist/cookbook/prompt.js +96 -0
- package/dist/cookbook/store.svelte.d.ts +13 -0
- package/dist/cookbook/store.svelte.js +36 -8
- package/dist/core/prompt.js +10 -1
- package/dist/core/reply.d.ts +6 -1
- package/dist/data/children.d.ts +50 -6
- package/dist/data/children.js +146 -16
- package/dist/data/derived.d.ts +37 -29
- package/dist/data/derived.js +49 -30
- package/dist/data/display.d.ts +21 -8
- package/dist/data/display.js +74 -11
- package/dist/data/fakes.d.ts +48 -9
- package/dist/data/fakes.js +146 -22
- package/dist/data/labels.d.ts +7 -2
- package/dist/data/labels.js +12 -2
- package/dist/data/list-sort.d.ts +8 -0
- package/dist/data/list-sort.js +45 -0
- package/dist/data/money.d.ts +225 -0
- package/dist/data/money.js +411 -0
- package/dist/data/packs.d.ts +13 -0
- package/dist/data/packs.js +1224 -0
- package/dist/data/planner-source.js +120 -3
- package/dist/data/source.d.ts +13 -2
- package/dist/data/source.js +274 -40
- package/dist/features/palette.d.ts +2 -0
- package/dist/features/palette.js +1 -1
- package/dist/forms/stock.d.ts +1 -1
- package/dist/forms/stock.js +3 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.js +6 -1
- package/dist/kitchen/LiveKitchenBridge.svelte +73 -0
- package/dist/kitchen/LiveKitchenBridge.svelte.d.ts +8 -0
- package/dist/kitchen/live.d.ts +7 -0
- package/dist/kitchen/live.js +51 -0
- package/dist/library/icons.js +34 -0
- package/dist/library/library.json +1546 -15
- package/dist/library/pending.json +5 -0
- package/dist/library/types.d.ts +4 -0
- package/dist/motion/tokens.d.ts +6 -0
- package/dist/motion/tokens.js +32 -0
- package/dist/motion/view-transition.d.ts +13 -0
- package/dist/motion/view-transition.js +17 -0
- package/dist/overviews/definitions.d.ts +41 -2
- package/dist/overviews/definitions.js +111 -4
- package/dist/overviews/models.d.ts +10 -0
- package/dist/overviews/models.js +19 -0
- package/dist/overviews/registry.d.ts +92 -5
- package/dist/overviews/registry.js +468 -58
- package/dist/overviews/validate.js +2 -2
- package/dist/planner/Planner.svelte +374 -166
- package/dist/planner/PlannerControls.svelte +255 -0
- package/dist/planner/PlannerControls.svelte.d.ts +17 -0
- package/dist/planner/PlannerLifecycle.svelte +73 -0
- package/dist/planner/PlannerLifecycle.svelte.d.ts +9 -0
- package/dist/planner/app.svelte.d.ts +12 -2
- package/dist/planner/app.svelte.js +13 -3
- package/dist/planner/assistant.js +20 -2
- package/dist/planner/commands/adapter.js +9 -2
- package/dist/planner/commands/types.d.ts +1 -1
- package/dist/planner/commands/types.js +1 -0
- package/dist/planner/header-icons.d.ts +12 -0
- package/dist/planner/header-icons.js +12 -0
- package/dist/planner/host/HostPlanner.svelte +70 -0
- package/dist/planner/host/HostPlanner.svelte.d.ts +17 -0
- package/dist/planner/host/session.svelte.d.ts +28 -0
- package/dist/planner/host/session.svelte.js +186 -0
- package/dist/planner/routes.d.ts +49 -0
- package/dist/planner/routes.js +64 -0
- package/dist/planner/shell.d.ts +40 -0
- package/dist/planner/shell.js +56 -0
- package/dist/planner/tab.svelte.d.ts +6 -3
- package/dist/planner/tab.svelte.js +11 -4
- package/dist/planner/title.d.ts +15 -0
- package/dist/planner/title.js +21 -0
- package/dist/planner/title.svelte.d.ts +6 -0
- package/dist/planner/title.svelte.js +11 -0
- package/dist/planner/types.d.ts +39 -7
- package/dist/products/media.d.ts +20 -0
- package/dist/products/media.js +65 -0
- package/dist/recipes/help/descriptions.json +1 -3
- package/dist/recipes/index.d.ts +2 -0
- package/dist/recipes/index.js +6 -0
- package/dist/recipes/plumbing.d.ts +35 -1
- package/dist/recipes/plumbing.js +74 -0
- package/dist/screens/definition.d.ts +35 -0
- package/dist/screens/definition.js +132 -0
- package/dist/screens/relations.d.ts +17 -0
- package/dist/screens/relations.js +98 -0
- package/dist/screens/totals.d.ts +37 -0
- package/dist/screens/totals.js +65 -0
- package/dist/sections/info.d.ts +1 -1
- package/dist/sections/info.js +2 -2
- package/dist/settings/app-settings.d.ts +17 -1
- package/dist/settings/app-settings.js +40 -3
- package/dist/smrt-version.d.ts +2 -0
- package/dist/smrt-version.js +4 -0
- package/dist/styles/planner-forms.css +53 -0
- package/dist/styles/planner-lists.css +43 -0
- package/dist/theme/css-highlight.d.ts +6 -0
- package/dist/theme/css-highlight.js +34 -0
- package/dist/theme/custom-css.svelte.d.ts +34 -0
- package/dist/theme/custom-css.svelte.js +246 -0
- package/dist/theme/runtime.js +25 -5
- package/dist/theme/theme.d.ts +26 -3
- package/dist/theme/theme.js +70 -2
- package/dist/upstream/overlay.d.ts +14 -5
- package/dist/upstream/overlay.js +20 -2
- package/package.json +12 -6
- package/app/_app/immutable/assets/0.B5zXkXe_.css +0 -1
- package/app/_app/immutable/assets/10.hpcnxvK1.css +0 -1
- package/app/_app/immutable/assets/11.D7zoXfVV.css +0 -1
- package/app/_app/immutable/assets/12.CPobm1ED.css +0 -1
- package/app/_app/immutable/assets/2.CyaWdRdI.css +0 -1
- package/app/_app/immutable/assets/3.BlPQOes8.css +0 -1
- package/app/_app/immutable/assets/8.2gQeKBp_.css +0 -1
- package/app/_app/immutable/assets/9.HOPT4xtg.css +0 -1
- package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +0 -1
- package/app/_app/immutable/assets/Button.DkP0qkG9.css +0 -1
- package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +0 -1
- package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +0 -1
- package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +0 -1
- package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +0 -1
- package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +0 -1
- package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +0 -1
- package/app/_app/immutable/assets/dist.C5nHBk_O.css +0 -1
- package/app/_app/immutable/assets/feedback.BVKAwFck.css +0 -1
- package/app/_app/immutable/assets/forms.BChZ2RWM.css +0 -1
- package/app/_app/immutable/assets/percent.LH0z-ozZ.css +0 -1
- package/app/_app/immutable/assets/store.CGDwHkkF.css +0 -1
- package/app/_app/immutable/assets/ui.B1A1Zl2p.css +0 -1
- package/app/_app/immutable/assets/workspace.BIMkuZDb.css +0 -1
- package/app/_app/immutable/chunks/1okeBSoq.js +0 -1
- package/app/_app/immutable/chunks/2jFBkS1C.js +0 -1
- package/app/_app/immutable/chunks/6P9zxrzU.js +0 -1
- package/app/_app/immutable/chunks/B32EWqI8.js +0 -9
- package/app/_app/immutable/chunks/B4Kevpe0.js +0 -1
- package/app/_app/immutable/chunks/BKwRT_1p.js +0 -1
- package/app/_app/immutable/chunks/BS4h9ES-.js +0 -1
- package/app/_app/immutable/chunks/CMhpRMKg.js +0 -1
- package/app/_app/immutable/chunks/CPRHZZeW.js +0 -1
- package/app/_app/immutable/chunks/CRQ1Pmzr.js +0 -1
- package/app/_app/immutable/chunks/CWtfVMDz.js +0 -1
- package/app/_app/immutable/chunks/Chyo8rdT.js +0 -3
- package/app/_app/immutable/chunks/Ci0DUht6.js +0 -34
- package/app/_app/immutable/chunks/CmmuWmp6.js +0 -2
- package/app/_app/immutable/chunks/CrFNLK0f.js +0 -1
- package/app/_app/immutable/chunks/CsprTb3f.js +0 -2
- package/app/_app/immutable/chunks/CygC84VT.js +0 -2
- package/app/_app/immutable/chunks/D0VgZnk1.js +0 -1
- package/app/_app/immutable/chunks/DD7gpKb2.js +0 -1
- package/app/_app/immutable/chunks/DNRgqfTx.js +0 -1
- package/app/_app/immutable/chunks/DVRKjN-E.js +0 -1
- package/app/_app/immutable/chunks/D_J_XtJy.js +0 -846
- package/app/_app/immutable/chunks/Dp9GVO-9.js +0 -1
- package/app/_app/immutable/chunks/DqcD-WtP.js +0 -1
- package/app/_app/immutable/chunks/QukgIHDX.js +0 -1
- package/app/_app/immutable/chunks/WxSPP8QW.js +0 -4
- package/app/_app/immutable/chunks/Xp1g1t4n.js +0 -3
- package/app/_app/immutable/chunks/leQCwW2d.js +0 -1
- package/app/_app/immutable/chunks/p6bgzXiY.js +0 -1
- package/app/_app/immutable/entry/app.IZIJXhgq.js +0 -2
- package/app/_app/immutable/entry/start.BuaYHD1N.js +0 -1
- package/app/_app/immutable/nodes/0.m_U8WC7E.js +0 -10
- package/app/_app/immutable/nodes/1.Crw8ULhB.js +0 -1
- package/app/_app/immutable/nodes/10.1nQxyH9H.js +0 -4
- package/app/_app/immutable/nodes/11.Cw0JnQF3.js +0 -1
- package/app/_app/immutable/nodes/12.BIocA1aI.js +0 -1
- package/app/_app/immutable/nodes/2.CR5BwGnt.js +0 -17
- package/app/_app/immutable/nodes/3.1B56hgAG.js +0 -1
- package/app/_app/immutable/nodes/4.SSIC7sUh.js +0 -1
- package/app/_app/immutable/nodes/5.DgdwleDQ.js +0 -1
- package/app/_app/immutable/nodes/6.DmD9rqLU.js +0 -1
- package/app/_app/immutable/nodes/7.DdngsBmo.js +0 -1
- package/app/_app/immutable/nodes/8.D2Mszsua.js +0 -3
- package/app/_app/immutable/nodes/9.CLYsywul.js +0 -1
- package/app/m/content/Contents/index.html +0 -96
- package/app/m/preferences/UiPreferenceRecord/index.html +0 -96
- package/app/m/users/AccessRequest/index.html +0 -96
- package/app/m/users/ResourceGrant/index.html +0 -96
- package/app/m/users/UsersCliAuthRequest/index.html +0 -96
- package/app/m/users/UsersMagicLinkToken/index.html +0 -96
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Provider, tryGetAppStateContext } from '@happyvertical/smrt-svelte';
|
|
3
|
+
import {
|
|
4
|
+
ShellLayoutController,
|
|
5
|
+
ShellLayoutEditor,
|
|
6
|
+
useShellLayout,
|
|
7
|
+
} from '@happyvertical/smrt-svelte/workspace';
|
|
8
|
+
import { Tabs } from '@happyvertical/smrt-ui';
|
|
9
|
+
import { onMount, untrack } from 'svelte';
|
|
10
|
+
import CookbooksPanel from '../components/CookbooksPanel.svelte';
|
|
11
|
+
import ExportPanel from '../components/ExportPanel.svelte';
|
|
12
|
+
import FeaturesPanel from '../components/FeaturesPanel.svelte';
|
|
13
|
+
import RecipeCards from '../components/RecipeCards.svelte';
|
|
14
|
+
import SettingsPanel from '../components/SettingsPanel.svelte';
|
|
15
|
+
import ThemeSection from '../components/ThemeSection.svelte';
|
|
16
|
+
import { cookbookStore } from '../cookbook/store.svelte.js';
|
|
17
|
+
import { provideDataSource, tryUseDataSource } from '../data/context.js';
|
|
18
|
+
import { createPlannerDataSource } from '../data/planner-source.js';
|
|
19
|
+
import { cookbookNavGroups } from '../library/menu.js';
|
|
20
|
+
import { recipeState } from '../recipes/state.svelte.js';
|
|
21
|
+
import { PLANNER_TAB_IDS, type PlannerTabId } from './commands/index.js';
|
|
22
|
+
import { plannerController } from './instance.js';
|
|
23
|
+
import PlannerLifecycle from './PlannerLifecycle.svelte';
|
|
24
|
+
import { plannerTab } from './tab.svelte.js';
|
|
25
|
+
import type { PlannerProps } from './types.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The planner's customization controls alone (Cookbooks, Recipes, Theme,
|
|
29
|
+
* Settings, Export as tabs), for a host that owns the surrounding shell; the
|
|
30
|
+
* complete `Planner` mounts the same inside its own shell.
|
|
31
|
+
*/
|
|
32
|
+
interface PlannerControlsProps extends PlannerProps {
|
|
33
|
+
/**
|
|
34
|
+
* `true` when the complete `Planner` renders these: its own lifecycle
|
|
35
|
+
* already configured the controller, persistence and inference, so the
|
|
36
|
+
* controls do not mount a second one.
|
|
37
|
+
*/
|
|
38
|
+
managedByParent?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const DEFAULT_TABS: PlannerTabId[] = [
|
|
42
|
+
'cookbooks',
|
|
43
|
+
'recipes',
|
|
44
|
+
'theme',
|
|
45
|
+
'settings',
|
|
46
|
+
'export',
|
|
47
|
+
];
|
|
48
|
+
const UNLISTED_TABS: PlannerTabId[] = ['features', 'layout'];
|
|
49
|
+
|
|
50
|
+
let {
|
|
51
|
+
controller = plannerController,
|
|
52
|
+
basePath,
|
|
53
|
+
inference,
|
|
54
|
+
layout = 'own',
|
|
55
|
+
persistence = 'self',
|
|
56
|
+
themeControls = false,
|
|
57
|
+
advancedStylesHref,
|
|
58
|
+
tabs = DEFAULT_TABS,
|
|
59
|
+
onready,
|
|
60
|
+
managedByParent = false,
|
|
61
|
+
}: PlannerControlsProps = $props();
|
|
62
|
+
|
|
63
|
+
// Generated views and the Cookbooks tab read sample records from a data
|
|
64
|
+
// source: use the host's, else make the planner's own.
|
|
65
|
+
if (!tryUseDataSource()) provideDataSource(createPlannerDataSource());
|
|
66
|
+
|
|
67
|
+
// smrt-svelte's inputs read the app state. Inside a host's own provider (or
|
|
68
|
+
// the static app's AppShell) use that; otherwise the planner brings one.
|
|
69
|
+
const hasAppState = tryGetAppStateContext() !== null;
|
|
70
|
+
|
|
71
|
+
const labels: Record<PlannerTabId, string> = {
|
|
72
|
+
cookbooks: 'Cookbooks',
|
|
73
|
+
recipes: 'Recipes',
|
|
74
|
+
features: 'Features',
|
|
75
|
+
layout: 'Layout',
|
|
76
|
+
theme: 'Theme',
|
|
77
|
+
settings: 'Settings',
|
|
78
|
+
export: 'Export',
|
|
79
|
+
};
|
|
80
|
+
const shown = $derived(tabs.filter((id) => PLANNER_TAB_IDS.includes(id)));
|
|
81
|
+
// Features and Layout left the default tab strip but stay reachable from
|
|
82
|
+
// their links, the command palette and focus commands.
|
|
83
|
+
const reachable = $derived<readonly PlannerTabId[]>(
|
|
84
|
+
tabs === DEFAULT_TABS ? [...shown, ...UNLISTED_TABS] : shown,
|
|
85
|
+
);
|
|
86
|
+
const items = $derived(shown.map((id) => ({ id, label: labels[id] })));
|
|
87
|
+
const active = $derived(
|
|
88
|
+
reachable.includes(plannerTab.active)
|
|
89
|
+
? plannerTab.active
|
|
90
|
+
: (shown[0] ?? 'recipes'),
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// The headless layout controller: the menu the cookbook generates, edited
|
|
94
|
+
// through the cookbook store, with no AppShell around.
|
|
95
|
+
// Fixed at mount: the two editors are different objects.
|
|
96
|
+
const layoutMode = untrack(() => layout);
|
|
97
|
+
const ownLayout =
|
|
98
|
+
layoutMode === 'own'
|
|
99
|
+
? new ShellLayoutController({
|
|
100
|
+
nav: () => [],
|
|
101
|
+
groups: () =>
|
|
102
|
+
cookbookNavGroups({
|
|
103
|
+
recipes: recipeState.ids,
|
|
104
|
+
features: recipeState.features,
|
|
105
|
+
}),
|
|
106
|
+
panels: () => undefined,
|
|
107
|
+
layout: () => cookbookStore.layout,
|
|
108
|
+
editable: () => true,
|
|
109
|
+
commit: (next) => cookbookStore.setLayout(next),
|
|
110
|
+
})
|
|
111
|
+
: null;
|
|
112
|
+
const shellLayout = layoutMode === 'shell' ? useShellLayout() : null;
|
|
113
|
+
|
|
114
|
+
const select = (id: string) => {
|
|
115
|
+
const tab = PLANNER_TAB_IDS.find((t) => t === id);
|
|
116
|
+
if (tab) plannerTab.active = tab;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// The controller's focus -> the tab on screen, and back, each only on a
|
|
120
|
+
// difference, so a foreign controller and the app's own both stay in step.
|
|
121
|
+
onMount(() => {
|
|
122
|
+
const stop = controller.subscribe((snapshot) => {
|
|
123
|
+
const tab = snapshot.focus.tab;
|
|
124
|
+
if (tab && tab !== plannerTab.active) plannerTab.active = tab;
|
|
125
|
+
});
|
|
126
|
+
return stop;
|
|
127
|
+
});
|
|
128
|
+
$effect(() => {
|
|
129
|
+
const tab = plannerTab.active;
|
|
130
|
+
untrack(() => {
|
|
131
|
+
if (controller.snapshot().focus.tab !== tab) {
|
|
132
|
+
controller.run({ name: 'focus', input: { tab } });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
</script>
|
|
137
|
+
|
|
138
|
+
{#if !managedByParent}
|
|
139
|
+
<PlannerLifecycle {controller} {basePath} {inference} {persistence} {onready} />
|
|
140
|
+
{/if}
|
|
141
|
+
|
|
142
|
+
{#snippet view()}
|
|
143
|
+
<div class="planner">
|
|
144
|
+
<Tabs tabs={items} {active} onchange={select} aria-label="Planner">
|
|
145
|
+
{#if reachable.includes('cookbooks')}
|
|
146
|
+
<div hidden={active !== 'cookbooks'}><CookbooksPanel /></div>
|
|
147
|
+
{/if}
|
|
148
|
+
{#if reachable.includes('recipes')}
|
|
149
|
+
<div hidden={active !== 'recipes'}><RecipeCards /></div>
|
|
150
|
+
{/if}
|
|
151
|
+
{#if reachable.includes('features')}
|
|
152
|
+
<div hidden={active !== 'features'}><FeaturesPanel /></div>
|
|
153
|
+
{/if}
|
|
154
|
+
{#if reachable.includes('layout')}
|
|
155
|
+
<div hidden={active !== 'layout'} class="pane">
|
|
156
|
+
<p class="meta">
|
|
157
|
+
Reorder, move or hide navigation entries and choose which panels show.
|
|
158
|
+
The layout is saved with the cookbook.
|
|
159
|
+
</p>
|
|
160
|
+
<ShellLayoutEditor controller={ownLayout ?? shellLayout ?? undefined} />
|
|
161
|
+
</div>
|
|
162
|
+
{/if}
|
|
163
|
+
{#if reachable.includes('theme')}
|
|
164
|
+
<div hidden={active !== 'theme'}><ThemeSection provider={themeControls} {advancedStylesHref} /></div>
|
|
165
|
+
{/if}
|
|
166
|
+
{#if reachable.includes('settings')}
|
|
167
|
+
<div hidden={active !== 'settings'}><SettingsPanel /></div>
|
|
168
|
+
{/if}
|
|
169
|
+
{#if reachable.includes('export')}
|
|
170
|
+
<div hidden={active !== 'export'}><ExportPanel /></div>
|
|
171
|
+
{/if}
|
|
172
|
+
</Tabs>
|
|
173
|
+
</div>
|
|
174
|
+
{/snippet}
|
|
175
|
+
|
|
176
|
+
{#if hasAppState}
|
|
177
|
+
{@render view()}
|
|
178
|
+
{:else}
|
|
179
|
+
<Provider>{@render view()}</Provider>
|
|
180
|
+
{/if}
|
|
181
|
+
|
|
182
|
+
<style>
|
|
183
|
+
@layer smrt.reset, smrt.structure, smrt.theme;
|
|
184
|
+
@layer smrt.theme {
|
|
185
|
+
.planner :global(.tab-panel) {
|
|
186
|
+
padding-top: var(--smrt-spacing-4);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* The strip persists across configure-page route changes; the panel below
|
|
190
|
+
crossfades with the content. smrt-ui's Tabs owns the classes (`tabs-nav`
|
|
191
|
+
for button tabs, `tabs-links` for link tabs; one strip per Tabs). Named
|
|
192
|
+
only while a transition runs, as in Planner.svelte. */
|
|
193
|
+
:global([data-smrt-view-transition]) .planner :global(.tabs-nav),
|
|
194
|
+
:global([data-smrt-view-transition]) .planner :global(.tabs-links) {
|
|
195
|
+
view-transition-name: planner-tabs;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* Phones: smrt-ui's Tabs strip scrolls sideways but shows no sign of it,
|
|
199
|
+
so the last tab (Export) is easy to miss. Tabs snap into place, and where
|
|
200
|
+
scroll-driven animations exist a fade at the trailing edge says more
|
|
201
|
+
follow, lifting as the strip reaches its end (an inactive timeline, a
|
|
202
|
+
strip that fits, leaves the fade at its initial 0). The real home for
|
|
203
|
+
this is smrt-ui's Tabs. */
|
|
204
|
+
.planner :global(.smrt-tabs__nav) {
|
|
205
|
+
scroll-snap-type: x proximity;
|
|
206
|
+
overscroll-behavior-x: contain;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.planner :global(.smrt-tabs__tab-button) {
|
|
210
|
+
scroll-snap-align: start;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
@property --planner-tabs-fade {
|
|
214
|
+
syntax: '<length>';
|
|
215
|
+
inherits: false;
|
|
216
|
+
initial-value: 0rem;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
@supports (animation-timeline: scroll()) {
|
|
220
|
+
.planner :global(.smrt-tabs__nav) {
|
|
221
|
+
mask-image: linear-gradient(
|
|
222
|
+
to right,
|
|
223
|
+
black calc(100% - var(--planner-tabs-fade)),
|
|
224
|
+
transparent
|
|
225
|
+
);
|
|
226
|
+
animation: planner-tabs-fade linear both;
|
|
227
|
+
animation-timeline: scroll(self inline);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
@keyframes planner-tabs-fade {
|
|
231
|
+
from {
|
|
232
|
+
--planner-tabs-fade: 3rem;
|
|
233
|
+
}
|
|
234
|
+
to {
|
|
235
|
+
--planner-tabs-fade: 0rem;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.pane {
|
|
241
|
+
display: grid;
|
|
242
|
+
gap: var(--smrt-spacing-3);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* `display: grid` would otherwise override the inactive pane's `hidden`. */
|
|
246
|
+
.pane[hidden] {
|
|
247
|
+
display: none;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.meta {
|
|
251
|
+
margin: 0;
|
|
252
|
+
color: var(--smrt-color-on-surface-variant);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PlannerProps } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The planner's customization controls alone (Cookbooks, Recipes, Theme,
|
|
4
|
+
* Settings, Export as tabs), for a host that owns the surrounding shell; the
|
|
5
|
+
* complete `Planner` mounts the same inside its own shell.
|
|
6
|
+
*/
|
|
7
|
+
interface PlannerControlsProps extends PlannerProps {
|
|
8
|
+
/**
|
|
9
|
+
* `true` when the complete `Planner` renders these: its own lifecycle
|
|
10
|
+
* already configured the controller, persistence and inference, so the
|
|
11
|
+
* controls do not mount a second one.
|
|
12
|
+
*/
|
|
13
|
+
managedByParent?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare const PlannerControls: import("svelte").Component<PlannerControlsProps, {}, "">;
|
|
16
|
+
type PlannerControls = ReturnType<typeof PlannerControls>;
|
|
17
|
+
export default PlannerControls;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
import { aiState } from '../ai/instance.js';
|
|
4
|
+
import { browserStorage } from '../cookbook/storage.js';
|
|
5
|
+
import { cookbookStore } from '../cookbook/store.svelte.js';
|
|
6
|
+
import { provideDataSource, tryUseDataSource } from '../data/context.js';
|
|
7
|
+
import { createPlannerDataSource } from '../data/planner-source.js';
|
|
8
|
+
import { configFromProp } from '../inference/config.js';
|
|
9
|
+
import { libraryState } from '../library/state.svelte.js';
|
|
10
|
+
import { recipeState } from '../recipes/state.svelte.js';
|
|
11
|
+
import { type LinkMode, setBasePath } from './app.svelte.js';
|
|
12
|
+
import { createPlannerAssistant } from './assistant.js';
|
|
13
|
+
import { plannerController, plannerRuntime } from './instance.js';
|
|
14
|
+
import type { PlannerProps } from './types.js';
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
controller = plannerController,
|
|
18
|
+
basePath,
|
|
19
|
+
inference,
|
|
20
|
+
persistence = 'self',
|
|
21
|
+
onready,
|
|
22
|
+
links = 'path',
|
|
23
|
+
}: Pick<
|
|
24
|
+
PlannerProps,
|
|
25
|
+
'controller' | 'basePath' | 'inference' | 'persistence' | 'onready'
|
|
26
|
+
> & {
|
|
27
|
+
/** `'hash'` in the complete `Planner`, whose pages are fragment routes. */
|
|
28
|
+
links?: LinkMode;
|
|
29
|
+
} = $props();
|
|
30
|
+
|
|
31
|
+
const dataSource =
|
|
32
|
+
tryUseDataSource() ?? provideDataSource(createPlannerDataSource());
|
|
33
|
+
|
|
34
|
+
$effect.pre(() => {
|
|
35
|
+
if (basePath !== undefined || links !== 'path') {
|
|
36
|
+
setBasePath(basePath ?? '', links);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
onMount(() => {
|
|
41
|
+
const previous = plannerRuntime.onReplaced;
|
|
42
|
+
plannerRuntime.onReplaced = () => dataSource.reset?.();
|
|
43
|
+
if (persistence === 'self' && !cookbookStore.loaded) {
|
|
44
|
+
libraryState.load();
|
|
45
|
+
cookbookStore.hydrate('', browserStorage());
|
|
46
|
+
}
|
|
47
|
+
const assistant = inference
|
|
48
|
+
? createPlannerAssistant(controller, inference)
|
|
49
|
+
: undefined;
|
|
50
|
+
// The complete Planner's own dock and AI models page read `aiState`, the
|
|
51
|
+
// store the static app configures from `planner.config.json`; a mount
|
|
52
|
+
// configures it from the prop instead (the prop wins, as documented).
|
|
53
|
+
if (inference) {
|
|
54
|
+
if ('chat' in inference) aiState.useChat(inference.chat, 'Host model');
|
|
55
|
+
else aiState.configure(configFromProp(inference));
|
|
56
|
+
aiState.hydrate(
|
|
57
|
+
recipeState.ids.length > 0 || recipeState.features.length > 0,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
onready?.({ controller, ...(assistant ? { assistant } : {}) });
|
|
61
|
+
return () => {
|
|
62
|
+
plannerRuntime.onReplaced = previous;
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
$effect(() => {
|
|
67
|
+
if (persistence !== 'self') return;
|
|
68
|
+
void JSON.stringify(cookbookStore.snapshot());
|
|
69
|
+
cookbookStore.scheduleSave();
|
|
70
|
+
});
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<svelte:window onpagehide={() => persistence === 'self' && cookbookStore.flush()} />
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type LinkMode } from './app.svelte.ts';
|
|
2
|
+
import type { PlannerProps } from './types.ts';
|
|
3
|
+
type $$ComponentProps = Pick<PlannerProps, 'controller' | 'basePath' | 'inference' | 'persistence' | 'onready'> & {
|
|
4
|
+
/** `'hash'` in the complete `Planner`, whose pages are fragment routes. */
|
|
5
|
+
links?: LinkMode;
|
|
6
|
+
};
|
|
7
|
+
declare const PlannerLifecycle: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type PlannerLifecycle = ReturnType<typeof PlannerLifecycle>;
|
|
9
|
+
export default PlannerLifecycle;
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* How in-app links are written. The static app serves `/m/...` pages under
|
|
3
|
+
* `basePath`; the mounted `Planner` routes by URL fragment (`#/m/...`) and
|
|
4
|
+
* serves nothing from the host's paths, so its links are hashes and carry no
|
|
5
|
+
* query (the mount keeps its selection in memory).
|
|
6
|
+
*/
|
|
7
|
+
export type LinkMode = 'path' | 'hash';
|
|
8
|
+
export declare function setBasePath(path: string, links?: LinkMode): void;
|
|
2
9
|
export declare function getBasePath(): string;
|
|
3
10
|
/** The query string carrying the shareable URL state (the package selection). */
|
|
4
11
|
export declare function appQuery(): string;
|
|
5
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* An in-app path (`/m/commerce/Order/`) as a link: under the base path with
|
|
14
|
+
* the current app state, or, in a mounted `Planner`, as its fragment route.
|
|
15
|
+
*/
|
|
6
16
|
export declare function appHref(path: string): string;
|
|
@@ -7,8 +7,10 @@ import { selection } from "./selection.svelte.js";
|
|
|
7
7
|
* `$app/paths`, so the planner needs no SvelteKit router to build its links.
|
|
8
8
|
*/
|
|
9
9
|
let basePath = '';
|
|
10
|
-
|
|
10
|
+
let linkMode = 'path';
|
|
11
|
+
export function setBasePath(path, links = 'path') {
|
|
11
12
|
basePath = path.replace(/\/+$/, '');
|
|
13
|
+
linkMode = links;
|
|
12
14
|
}
|
|
13
15
|
export function getBasePath() {
|
|
14
16
|
return basePath;
|
|
@@ -17,7 +19,15 @@ export function getBasePath() {
|
|
|
17
19
|
export function appQuery() {
|
|
18
20
|
return composeQuery({ packages: selection.ids });
|
|
19
21
|
}
|
|
20
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* An in-app path (`/m/commerce/Order/`) as a link: under the base path with
|
|
24
|
+
* the current app state, or, in a mounted `Planner`, as its fragment route.
|
|
25
|
+
*/
|
|
21
26
|
export function appHref(path) {
|
|
22
|
-
|
|
27
|
+
if (linkMode === 'hash')
|
|
28
|
+
return `#${path}`;
|
|
29
|
+
const query = appQuery();
|
|
30
|
+
// A path may carry its own query ("View all": `?customerId=<id>`).
|
|
31
|
+
const joined = query && path.includes('?') ? `${path}&${query.slice(1)}` : path + query;
|
|
32
|
+
return `${basePath}${joined}`;
|
|
23
33
|
}
|
|
@@ -18,11 +18,13 @@ function recipeStoreOf(controller) {
|
|
|
18
18
|
function settingsStoreOf(controller) {
|
|
19
19
|
return {
|
|
20
20
|
read: () => {
|
|
21
|
-
const { currency, taxRate, paymentTerms } = controller.snapshot().settings;
|
|
21
|
+
const { currency, taxRate, paymentTerms, pricesIncludeTax, taxRounding } = controller.snapshot().settings;
|
|
22
22
|
return {
|
|
23
23
|
currency,
|
|
24
24
|
taxRate: Number((taxRate / 100).toFixed(6)),
|
|
25
25
|
paymentTerms,
|
|
26
|
+
pricesIncludeTax,
|
|
27
|
+
taxRounding,
|
|
26
28
|
};
|
|
27
29
|
},
|
|
28
30
|
write: (settings) => {
|
|
@@ -34,6 +36,8 @@ function settingsStoreOf(controller) {
|
|
|
34
36
|
...(settings.paymentTerms
|
|
35
37
|
? { paymentTerms: settings.paymentTerms }
|
|
36
38
|
: {}),
|
|
39
|
+
pricesIncludeTax: settings.pricesIncludeTax,
|
|
40
|
+
taxRounding: settings.taxRounding,
|
|
37
41
|
},
|
|
38
42
|
});
|
|
39
43
|
},
|
|
@@ -42,7 +46,8 @@ function settingsStoreOf(controller) {
|
|
|
42
46
|
function themeStoreOf(controller) {
|
|
43
47
|
return {
|
|
44
48
|
read: () => {
|
|
45
|
-
const
|
|
49
|
+
const snapshot = controller.snapshot().theme;
|
|
50
|
+
const { preset, primary, colorScheme } = snapshot;
|
|
46
51
|
const theme = {};
|
|
47
52
|
if (preset)
|
|
48
53
|
theme.preset = preset;
|
|
@@ -51,6 +56,16 @@ function themeStoreOf(controller) {
|
|
|
51
56
|
if (colorScheme !== 'system') {
|
|
52
57
|
theme.colorScheme = colorScheme;
|
|
53
58
|
}
|
|
59
|
+
if (snapshot.borderRadius) {
|
|
60
|
+
theme.borderRadius =
|
|
61
|
+
snapshot.borderRadius;
|
|
62
|
+
}
|
|
63
|
+
if (snapshot.density) {
|
|
64
|
+
theme.density = snapshot.density;
|
|
65
|
+
}
|
|
66
|
+
if (snapshot.contrast) {
|
|
67
|
+
theme.contrast = snapshot.contrast;
|
|
68
|
+
}
|
|
54
69
|
return Object.keys(theme).length ? theme : undefined;
|
|
55
70
|
},
|
|
56
71
|
write: (theme) => {
|
|
@@ -65,6 +80,9 @@ function themeStoreOf(controller) {
|
|
|
65
80
|
...(theme.preset ? { preset: theme.preset } : {}),
|
|
66
81
|
...(theme.custom ? { primary: theme.custom.primary } : {}),
|
|
67
82
|
...(theme.colorScheme ? { colorScheme: theme.colorScheme } : {}),
|
|
83
|
+
...(theme.borderRadius ? { borderRadius: theme.borderRadius } : {}),
|
|
84
|
+
...(theme.density ? { density: theme.density } : {}),
|
|
85
|
+
...(theme.contrast ? { contrast: theme.contrast } : {}),
|
|
68
86
|
},
|
|
69
87
|
});
|
|
70
88
|
},
|
|
@@ -410,8 +410,9 @@ export function createPlannerAdapter(config) {
|
|
|
410
410
|
}
|
|
411
411
|
/**
|
|
412
412
|
* Applying a library cookbook that sets no theme keeps the person's own look
|
|
413
|
-
* (as the Cookbooks tab does): the preset, brand colour
|
|
414
|
-
* (the font is not carried
|
|
413
|
+
* (as the Cookbooks tab does): the preset, brand colour, colour scheme,
|
|
414
|
+
* corner radius, density and contrast (the font is not carried). Returns
|
|
415
|
+
* the patch.
|
|
415
416
|
*/
|
|
416
417
|
function themeToKeep(raw) {
|
|
417
418
|
const input = raw.input;
|
|
@@ -430,6 +431,12 @@ export function createPlannerAdapter(config) {
|
|
|
430
431
|
patch.primary = theme.custom.primary;
|
|
431
432
|
if (theme.colorScheme)
|
|
432
433
|
patch.colorScheme = theme.colorScheme;
|
|
434
|
+
if (theme.borderRadius)
|
|
435
|
+
patch.borderRadius = theme.borderRadius;
|
|
436
|
+
if (theme.density)
|
|
437
|
+
patch.density = theme.density;
|
|
438
|
+
if (theme.contrast)
|
|
439
|
+
patch.contrast = theme.contrast;
|
|
433
440
|
return Object.keys(patch).length ? patch : undefined;
|
|
434
441
|
}
|
|
435
442
|
function runKeepingTheme(raw, runOptions, patch) {
|
|
@@ -2,7 +2,7 @@ import type { CommandError as EngineCommandError, CommandInputs as EngineCommand
|
|
|
2
2
|
export { COOKBOOK_COMMANDS_VERSION as PLANNER_COMMANDS_VERSION } from '@happyvertical/smrt-core/cookbook/engine';
|
|
3
3
|
export type { ExportData, RecipeChanges, RunOptions };
|
|
4
4
|
/** The planner's tabs, in order. Navigation only; never part of the cookbook. */
|
|
5
|
-
export declare const PLANNER_TAB_IDS: readonly ["cookbooks", "recipes", "features", "layout", "settings", "export"];
|
|
5
|
+
export declare const PLANNER_TAB_IDS: readonly ["cookbooks", "recipes", "features", "layout", "theme", "settings", "export"];
|
|
6
6
|
export type PlannerTabId = (typeof PLANNER_TAB_IDS)[number];
|
|
7
7
|
/** Input of each command, keyed by the command's (tool) name. */
|
|
8
8
|
export interface CommandInputs extends EngineCommandInputs {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The planner's header controls, as SVG paths for smrt-ui's `Icon` (a filled
|
|
3
|
+
* path in a 24x24 box, the same language as the shell's own icons).
|
|
4
|
+
*
|
|
5
|
+
* The chef's hat (a toque: three lobes over a crown and a band) is an
|
|
6
|
+
* original drawing, so no outside licence applies; neither smrt-ui's presets
|
|
7
|
+
* nor smrt-svelte's `SHELL_ICON_PATHS` have one. The export control uses
|
|
8
|
+
* smrt-ui's `download` preset by name (`EXPORT_ICON`).
|
|
9
|
+
*/
|
|
10
|
+
export declare const CHEF_HAT_ICON = "M4 9.5a3.5 3.5 0 1 1 7 0a3.5 3.5 0 1 1-7 0zM13 9.5a3.5 3.5 0 1 1 7 0a3.5 3.5 0 1 1-7 0zM8 7a4 4 0 1 1 8 0a4 4 0 1 1-8 0zM6 9.5h12V15H6zM7 16.5h10a1 1 0 0 1 1 1V19a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-1.5a1 1 0 0 1 1-1z";
|
|
11
|
+
/** smrt-ui's preset icon for the export control. */
|
|
12
|
+
export declare const EXPORT_ICON = "download";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The planner's header controls, as SVG paths for smrt-ui's `Icon` (a filled
|
|
3
|
+
* path in a 24x24 box, the same language as the shell's own icons).
|
|
4
|
+
*
|
|
5
|
+
* The chef's hat (a toque: three lobes over a crown and a band) is an
|
|
6
|
+
* original drawing, so no outside licence applies; neither smrt-ui's presets
|
|
7
|
+
* nor smrt-svelte's `SHELL_ICON_PATHS` have one. The export control uses
|
|
8
|
+
* smrt-ui's `download` preset by name (`EXPORT_ICON`).
|
|
9
|
+
*/
|
|
10
|
+
export const CHEF_HAT_ICON = 'M4 9.5a3.5 3.5 0 1 1 7 0a3.5 3.5 0 1 1-7 0zM13 9.5a3.5 3.5 0 1 1 7 0a3.5 3.5 0 1 1-7 0zM8 7a4 4 0 1 1 8 0a4 4 0 1 1-8 0zM6 9.5h12V15H6zM7 16.5h10a1 1 0 0 1 1 1V19a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-1.5a1 1 0 0 1 1-1z';
|
|
11
|
+
/** smrt-ui's preset icon for the export control. */
|
|
12
|
+
export const EXPORT_ICON = 'download';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
import Planner from '../Planner.svelte';
|
|
4
|
+
import {
|
|
5
|
+
type CallKitchenTool,
|
|
6
|
+
createHostSession,
|
|
7
|
+
type HostPlan,
|
|
8
|
+
type HostSession,
|
|
9
|
+
} from './session.svelte.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The planner inside a Kitchen host (an MCP app or widget): the complete
|
|
13
|
+
* `Planner` over a host session that reads and writes the plan through the
|
|
14
|
+
* host's tools, reconnecting while the page is visible.
|
|
15
|
+
*/
|
|
16
|
+
interface HostPlannerProps {
|
|
17
|
+
/** Calls one of the host's Kitchen tools by name with its arguments. */
|
|
18
|
+
callTool: CallKitchenTool;
|
|
19
|
+
/** A plan the host already holds, received before the first connection. */
|
|
20
|
+
initial?: HostPlan;
|
|
21
|
+
/** Called once the session is mounted, with the session to drive it. */
|
|
22
|
+
onready?: (session: HostSession) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let { callTool, initial, onready }: HostPlannerProps = $props();
|
|
26
|
+
const session = createHostSession((name, args) => callTool(name, args));
|
|
27
|
+
onMount(() => {
|
|
28
|
+
const stop = session.mount();
|
|
29
|
+
if (initial) session.receive(initial);
|
|
30
|
+
const refresh = setInterval(() => {
|
|
31
|
+
const id = session.current?.planId ?? session.pendingPlanId;
|
|
32
|
+
if (
|
|
33
|
+
id &&
|
|
34
|
+
!session.busy &&
|
|
35
|
+
!session.retryable &&
|
|
36
|
+
document.visibilityState === 'visible'
|
|
37
|
+
) {
|
|
38
|
+
void session.connect(id);
|
|
39
|
+
}
|
|
40
|
+
}, 1500);
|
|
41
|
+
try {
|
|
42
|
+
onready?.(session);
|
|
43
|
+
} catch (cause) {
|
|
44
|
+
session.reportError(cause);
|
|
45
|
+
}
|
|
46
|
+
return () => {
|
|
47
|
+
clearInterval(refresh);
|
|
48
|
+
stop();
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
</script>
|
|
52
|
+
{#if session.error}<p role="alert">{session.error}</p>{/if}
|
|
53
|
+
{#if session.preservedDraft}
|
|
54
|
+
<details><summary>Preserved edit</summary><textarea readonly value={JSON.stringify(session.preservedDraft, null, 2)} aria-label="Preserved cookbook edit"></textarea></details>
|
|
55
|
+
<button type="button" onclick={() => session.dismissPreservedDraft()}>Dismiss preserved edit</button>
|
|
56
|
+
{/if}
|
|
57
|
+
{#if session.retryable}
|
|
58
|
+
<button disabled={session.busy} onclick={() => session.retry()}>Retry same edit</button>
|
|
59
|
+
{/if}
|
|
60
|
+
{#if session.current}
|
|
61
|
+
<fieldset disabled={session.locked} aria-busy={session.busy}>
|
|
62
|
+
<Planner persistence="host" themeControls={true} />
|
|
63
|
+
</fieldset>
|
|
64
|
+
{:else}<p role="status">Waiting for a Kitchen plan…</p>{/if}
|
|
65
|
+
<style>
|
|
66
|
+
@layer smrt.reset, smrt.structure, smrt.theme;
|
|
67
|
+
@layer smrt.theme {
|
|
68
|
+
fieldset { border: 0; padding: 0; min-width: 0; } textarea { width: 100%; min-height: 12rem; }
|
|
69
|
+
}
|
|
70
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type CallKitchenTool, type HostPlan, type HostSession } from './session.svelte.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The planner inside a Kitchen host (an MCP app or widget): the complete
|
|
4
|
+
* `Planner` over a host session that reads and writes the plan through the
|
|
5
|
+
* host's tools, reconnecting while the page is visible.
|
|
6
|
+
*/
|
|
7
|
+
interface HostPlannerProps {
|
|
8
|
+
/** Calls one of the host's Kitchen tools by name with its arguments. */
|
|
9
|
+
callTool: CallKitchenTool;
|
|
10
|
+
/** A plan the host already holds, received before the first connection. */
|
|
11
|
+
initial?: HostPlan;
|
|
12
|
+
/** Called once the session is mounted, with the session to drive it. */
|
|
13
|
+
onready?: (session: HostSession) => void;
|
|
14
|
+
}
|
|
15
|
+
declare const HostPlanner: import("svelte").Component<HostPlannerProps, {}, "">;
|
|
16
|
+
type HostPlanner = ReturnType<typeof HostPlanner>;
|
|
17
|
+
export default HostPlanner;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PlanSnapshot } from '@happyvertical/smrt-core/cookbook/engine';
|
|
2
|
+
import type { Cookbook } from '../../cookbook/types.ts';
|
|
3
|
+
export interface HostPlan {
|
|
4
|
+
planId: string;
|
|
5
|
+
snapshot: PlanSnapshot;
|
|
6
|
+
cookbook: Cookbook;
|
|
7
|
+
}
|
|
8
|
+
export type CallKitchenTool = (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
9
|
+
/** One authoritative Kitchen plan projected into the stores the existing panels read. */
|
|
10
|
+
export declare function createHostSession(callTool: CallKitchenTool): {
|
|
11
|
+
readonly current: HostPlan | null;
|
|
12
|
+
readonly busy: boolean;
|
|
13
|
+
readonly error: string;
|
|
14
|
+
readonly pendingPlanId: string | null;
|
|
15
|
+
readonly draft: Cookbook | null;
|
|
16
|
+
readonly preservedDraft: Cookbook | null;
|
|
17
|
+
dismissPreservedDraft(): void;
|
|
18
|
+
readonly retryable: boolean;
|
|
19
|
+
/** Edits wait while a request is unresolved or a preserved draft is unacknowledged. */
|
|
20
|
+
readonly locked: boolean;
|
|
21
|
+
refresh: (value: unknown) => void;
|
|
22
|
+
reportError(cause: unknown): void;
|
|
23
|
+
receive(value: unknown): void;
|
|
24
|
+
connect(planId: string): Promise<void>;
|
|
25
|
+
retry: () => Promise<void>;
|
|
26
|
+
mount(): () => void;
|
|
27
|
+
};
|
|
28
|
+
export type HostSession = ReturnType<typeof createHostSession>;
|