{"children":[{"children":[{"children":[],"kind":"view-node","props":{"label":"Unread","value":0},"tag":"Stat"},{"children":[],"kind":"view-node","props":{"label":"Read","value":0},"tag":"Stat"},{"children":[],"kind":"view-node","props":{"label":"Dismissed","value":0},"tag":"Stat"},{"children":["Source ledger: push_adapter=local-inbox; pending=0"],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"title":"Inbox status"},"tag":"Container"},{"children":[{"children":[{"children":["Fires a canned push notification to the local peer. Enroll a browser subscription first via Notification.PushSubscribe to see the webpush provider stub log a real send; without one, the response carries a `no push subscriptions enrolled` diagnostic so you can verify the wire."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"label":"Enable push notifications on this device"},"tag":"EnablePush"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Push","label":"Send Test Push"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"connection":"Notification.VapidPublicKey","label":"Fetch VAPID public key"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=push → webpush provider","title":"Test web push"},"tag":"Card"},{"children":[{"children":["Sends a channel=email notification rendered through the canonical email template (inline-CSS, table-wrapped HTML + plain-text fallback). Recipient = CRE8_DEMO_EMAIL env var (default demo@cre8.local). Real send requires PROVIDER_SENDGRID_API_KEY + PROVIDER_SENDGRID_FROM_EMAIL; otherwise messaging's mock provider absorbs the send so you can still verify the round-trip in logs."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Email","label":"Send Test Email"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=email → email_template → sendgrid","title":"Test email"},"tag":"Card"},{"children":[{"children":["Sends a channel=sms notification rendered through the canonical SMS template (≤2 segments, source-app prefix + body, ellipsis on overflow). Recipient = CRE8_DEMO_SMS_TO env var in E.164 (default +15555550100, the RFC-reserved test line). Real send requires PROVIDER_TWILIO_ACCOUNT_SID + PROVIDER_TWILIO_AUTH_TOKEN + PROVIDER_TWILIO_FROM_NUMBER; otherwise messaging's mock provider absorbs the send so you can still verify the round-trip in logs."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Sms","label":"Send Test SMS"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=sms → sms_template → twilio","title":"Test SMS"},"tag":"Card"},{"children":[{"children":["Places an outbound Twilio call. When the call connects, Twilio fetches /messaging/twiml/{call_id} and we reply with TwiML <Say>+<Hangup> driving the static voice message. Recipient = CRE8_DEMO_VOICE_TO env var in E.164 (default +15555550100, the RFC-reserved test line). Real delivery requires PROVIDER_TWILIO_ACCOUNT_SID + PROVIDER_TWILIO_AUTH_TOKEN + PROVIDER_TWILIO_FROM_NUMBER + CRE8_MESSAGING_BASE_URL set to a publicly-reachable URL Twilio can hit. Set CRE8_MESSAGING_DETECT_VOICEMAIL=true to opt into machine detection and the voicemail-leave branch."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Voice","label":"Place Test Call"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=voice → twilio Calls.create → TwiML callback","title":"Test voice call"},"tag":"Card"}],"kind":"view-node","props":{"title":"Demo round-trips"},"tag":"Container"},{"children":[{"children":[{"children":["Nothing in Unread right now."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"unread","title":"Unread"},"tag":"Tab"},{"children":[{"children":["Nothing in Read right now."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"read","title":"Read"},"tag":"Tab"},{"children":[{"children":["Nothing in Dismissed right now."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"dismissed","title":"Dismissed"},"tag":"Tab"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"label":"channels: inbox","tone":"neutral"},"tag":"Badge"},{"children":[],"kind":"view-node","props":{"label":"any priority","tone":"muted"},"tag":"Badge"}],"kind":"view-node","props":{"title":"Routing"},"tag":"Container"},{"children":[],"kind":"view-node","props":{"body":{"subscription_id":"sub-9ade897f1ffed162"},"connection":"Notification.Unsubscribe","label":"Unsubscribe"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"(no source filter)","title":"ballot.published"},"tag":"Card"},{"children":[{"children":["Topic is the only required field. Channels is a comma-separated list (e.g. `inbox,push,email`); defaults to `inbox` when blank. source_app / source_id narrow the subscription to a specific publisher or item. priority_floor accepts `low|normal|high|urgent`."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Subscribe","form_fields":[{"label":"Topic (e.g. ballot.published)","name":"topic"},{"label":"Channels (comma-separated, optional)","name":"channels_csv"},{"label":"Source app filter (optional)","name":"source_app"},{"label":"Source id filter (optional)","name":"source_id"},{"label":"Priority floor (optional)","name":"priority_floor"}],"label":"Subscribe"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"Receive notifications whenever any app publishes on this topic","title":"Subscribe to a new topic"},"tag":"Card"}],"kind":"view-node","props":{"id":"subscriptions","title":"Subscriptions (1)"},"tag":"Tab"}],"kind":"view-node","props":{"default":"unread","id":"notification-inbox-tabs"},"tag":"Tabs"},{"children":[{"children":[{"children":["Notification.notification.inbox SSR payload is live-ready."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"payload-live-content-notification-notification-inbox","title":"Live Payload"},"tag":"Card"}],"kind":"view-node","props":{"id":"payload-live-notification-notification-inbox","patchTarget":"#payload-live-content-notification-notification-inbox","pollIntervalMs":8000,"refreshHref":"/view/payload/patch?app=Notification&view=notification.inbox","streamUrl":"/view/payload/patch?app=Notification&view=notification.inbox","transport":"http","transportStatus":true},"tag":"LiveSlot"}],"data":{"children":[{"children":[{"children":[],"kind":"view-node","props":{"label":"Unread","value":0},"tag":"Stat"},{"children":[],"kind":"view-node","props":{"label":"Read","value":0},"tag":"Stat"},{"children":[],"kind":"view-node","props":{"label":"Dismissed","value":0},"tag":"Stat"},{"children":["Source ledger: push_adapter=local-inbox; pending=0"],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"title":"Inbox status"},"tag":"Container"},{"children":[{"children":[{"children":["Fires a canned push notification to the local peer. Enroll a browser subscription first via Notification.PushSubscribe to see the webpush provider stub log a real send; without one, the response carries a `no push subscriptions enrolled` diagnostic so you can verify the wire."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"label":"Enable push notifications on this device"},"tag":"EnablePush"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Push","label":"Send Test Push"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"connection":"Notification.VapidPublicKey","label":"Fetch VAPID public key"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=push → webpush provider","title":"Test web push"},"tag":"Card"},{"children":[{"children":["Sends a channel=email notification rendered through the canonical email template (inline-CSS, table-wrapped HTML + plain-text fallback). Recipient = CRE8_DEMO_EMAIL env var (default demo@cre8.local). Real send requires PROVIDER_SENDGRID_API_KEY + PROVIDER_SENDGRID_FROM_EMAIL; otherwise messaging's mock provider absorbs the send so you can still verify the round-trip in logs."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Email","label":"Send Test Email"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=email → email_template → sendgrid","title":"Test email"},"tag":"Card"},{"children":[{"children":["Sends a channel=sms notification rendered through the canonical SMS template (≤2 segments, source-app prefix + body, ellipsis on overflow). Recipient = CRE8_DEMO_SMS_TO env var in E.164 (default +15555550100, the RFC-reserved test line). Real send requires PROVIDER_TWILIO_ACCOUNT_SID + PROVIDER_TWILIO_AUTH_TOKEN + PROVIDER_TWILIO_FROM_NUMBER; otherwise messaging's mock provider absorbs the send so you can still verify the round-trip in logs."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Sms","label":"Send Test SMS"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=sms → sms_template → twilio","title":"Test SMS"},"tag":"Card"},{"children":[{"children":["Places an outbound Twilio call. When the call connects, Twilio fetches /messaging/twiml/{call_id} and we reply with TwiML <Say>+<Hangup> driving the static voice message. Recipient = CRE8_DEMO_VOICE_TO env var in E.164 (default +15555550100, the RFC-reserved test line). Real delivery requires PROVIDER_TWILIO_ACCOUNT_SID + PROVIDER_TWILIO_AUTH_TOKEN + PROVIDER_TWILIO_FROM_NUMBER + CRE8_MESSAGING_BASE_URL set to a publicly-reachable URL Twilio can hit. Set CRE8_MESSAGING_DETECT_VOICEMAIL=true to opt into machine detection and the voicemail-leave branch."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Demo.Voice","label":"Place Test Call"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"channel=voice → twilio Calls.create → TwiML callback","title":"Test voice call"},"tag":"Card"}],"kind":"view-node","props":{"title":"Demo round-trips"},"tag":"Container"},{"children":[{"children":[{"children":["Nothing in Unread right now."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"unread","title":"Unread"},"tag":"Tab"},{"children":[{"children":["Nothing in Read right now."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"read","title":"Read"},"tag":"Tab"},{"children":[{"children":["Nothing in Dismissed right now."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"dismissed","title":"Dismissed"},"tag":"Tab"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"label":"channels: inbox","tone":"neutral"},"tag":"Badge"},{"children":[],"kind":"view-node","props":{"label":"any priority","tone":"muted"},"tag":"Badge"}],"kind":"view-node","props":{"title":"Routing"},"tag":"Container"},{"children":[],"kind":"view-node","props":{"body":{"subscription_id":"sub-9ade897f1ffed162"},"connection":"Notification.Unsubscribe","label":"Unsubscribe"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"(no source filter)","title":"ballot.published"},"tag":"Card"},{"children":[{"children":["Topic is the only required field. Channels is a comma-separated list (e.g. `inbox,push,email`); defaults to `inbox` when blank. source_app / source_id narrow the subscription to a specific publisher or item. priority_floor accepts `low|normal|high|urgent`."],"kind":"view-node","props":{},"tag":"Text"},{"children":[],"kind":"view-node","props":{"connection":"Notification.Subscribe","form_fields":[{"label":"Topic (e.g. ballot.published)","name":"topic"},{"label":"Channels (comma-separated, optional)","name":"channels_csv"},{"label":"Source app filter (optional)","name":"source_app"},{"label":"Source id filter (optional)","name":"source_id"},{"label":"Priority floor (optional)","name":"priority_floor"}],"label":"Subscribe"},"tag":"Action"}],"kind":"view-node","props":{"subtitle":"Receive notifications whenever any app publishes on this topic","title":"Subscribe to a new topic"},"tag":"Card"}],"kind":"view-node","props":{"id":"subscriptions","title":"Subscriptions (1)"},"tag":"Tab"}],"kind":"view-node","props":{"default":"unread","id":"notification-inbox-tabs"},"tag":"Tabs"},{"children":[{"children":[{"children":["Notification.notification.inbox SSR payload is live-ready."],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"id":"payload-live-content-notification-notification-inbox","title":"Live Payload"},"tag":"Card"}],"kind":"view-node","props":{"id":"payload-live-notification-notification-inbox","patchTarget":"#payload-live-content-notification-notification-inbox","pollIntervalMs":8000,"refreshHref":"/view/payload/patch?app=Notification&view=notification.inbox","streamUrl":"/view/payload/patch?app=Notification&view=notification.inbox","transport":"http","transportStatus":true},"tag":"LiveSlot"}],"kind":"view-node","ok":true,"props":{"id":"inbox","subtitle":"Grouped by status. Each card carries source-app actions inline.","title":"Notification Inbox"},"tag":"Page"},"kind":"view-node","ok":true,"props":{"id":"inbox","subtitle":"Grouped by status. Each card carries source-app actions inline.","title":"Notification Inbox"},"tag":"Page"}