Skip to content

Comments

feat: add NightlySurveyPopover component for feature surveys#9083

Merged
christian-byrne merged 1 commit intomainfrom
feat/survey-popover
Feb 23, 2026
Merged

feat: add NightlySurveyPopover component for feature surveys#9083
christian-byrne merged 1 commit intomainfrom
feat/survey-popover

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Feb 22, 2026

Summary

Adds NightlySurveyPopover component that displays a Typeform survey to eligible nightly users after a configurable delay.

Changes

  • What: Vue component that uses useSurveyEligibility to show/hide a survey popover with accept, dismiss, and opt-out actions. Loads Typeform embed script dynamically with HTTPS and deduplication.

Review Focus

  • Typeform script injection security (HTTPS-only, load-once guard, typeformId alphanumeric validation)
  • Timeout lifecycle (clears pending timeout when eligibility changes)

Part of Nightly Survey System

This is part 4 of a stacked PR chain:

  1. ✅ feat/feature-usage-tracker - useFeatureUsageTracker (merged in feat: add composable to determine if user is eligible for nightly survey(s) #8189)
  2. ✅ feat/survey-eligibility - useSurveyEligibility (feat: add composable to determine if user is eligible for nightly survey(s) #8189, merged)
  3. ✅ feat/survey-config - surveyRegistry.ts (feat: add survey registry for feature survey configurations #8355, merged)
  4. feat/survey-popover - NightlySurveyPopover.vue (this PR)
  5. feat/survey-integration - NightlySurveyController.vue (feat: integrate nightly survey system into app #8480)

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested review from a team as code owners February 22, 2026 06:45
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 22, 2026
@dosubot
Copy link

dosubot bot commented Feb 22, 2026

Related Documentation

Checked 0 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 02/22/2026, 06:58:20 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

🎭 Playwright: ✅ 531 passed, 0 failed · 2 flaky

📊 Browser Reports
  • chromium: View Report (✅ 518 / ❌ 0 / ⚠️ 2 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 22, 2026

📝 Walkthrough

Walkthrough

Adds nightly survey localization strings, a Vue component that displays a delayed Typeform-based survey popover with eligibility and opt-out handling, and tests validating visibility, interactions, and config-driven behavior.

Changes

Cohort / File(s) Summary
Survey Localization
src/locales/en/main.json
Added top-level nightlySurvey object with fields: title, description, accept, notNow, dontAskAgain, and loadError.
Survey Component & Tests
src/platform/surveys/NightlySurveyPopover.vue, src/platform/surveys/NightlySurveyPopover.test.ts
New Vue 3 SFC implementing a delayed popover using useSurveyEligibility, dynamic Typeform script loading with error handling, events (shown, dismissed, optedOut), and a comprehensive test suite covering eligibility, timing, interactions, and config flags.

Sequence Diagram

sequenceDiagram
    participant User
    participant Popover as NightlySurveyPopover<br/>(Component)
    participant Eligibility as useSurveyEligibility<br/>(Hook)
    participant i18n as i18n<br/>(Localization)
    participant Typeform as Typeform<br/>(External Script)

    User->>Popover: Mount component
    Popover->>Eligibility: Check eligibility & get delay
    Eligibility-->>Popover: eligible, delay, optOut status
    rect rgba(100, 150, 255, 0.5)
        Note over Popover: Wait configured delay before showing
    end
    Popover->>i18n: Request localized strings
    i18n-->>Popover: Return title/description/labels
    Popover->>User: Show popover (emit 'shown')
    User->>Popover: Click Accept / Not Now / Don't Ask Again
    rect rgba(200, 150, 100, 0.5)
        Popover->>Typeform: Load embed script (on Accept)
        Typeform-->>Popover: Script loaded or error
    end
    Popover-->>User: Emit 'dismissed' or 'optedOut' and hide
    Popover->>Popover: Cleanup timers on unmount
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A tiny survey hops near,
With a gentle delay and a hopeful cheer,
"Share a thought?" it softly sings,
Typeform opens, feedback brings,
Puff of whiskers—thanks for ears!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly describes the main change: adding a NightlySurveyPopover component for feature surveys, which aligns with the primary objective of the PR.
Description check ✅ Passed The description covers the summary, core changes, and review focus, but is missing the standard template structure (Review Focus is present but could be more detailed about critical design decisions).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/survey-popover

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

📦 Bundle: 4.37 MB gzip 🔴 +333 B

Details

Summary

  • Raw size: 20.5 MB baseline 20.5 MB — 🔴 +308 B
  • Gzip: 4.37 MB baseline 4.37 MB — 🔴 +333 B
  • Brotli: 3.37 MB baseline 3.37 MB — 🔴 +312 B
  • Bundles: 223 current • 223 baseline • 109 added / 109 removed

Category Glance
Other 🔴 +308 B (7.6 MB) · Vendor & Third-Party ⚪ 0 B (8.83 MB) · Data & Services ⚪ 0 B (2.51 MB) · Graph Workspace ⚪ 0 B (951 kB) · Panels & Settings ⚪ 0 B (436 kB) · Views & Navigation ⚪ 0 B (68.8 kB) · + 5 more

App Entry Points — 21.6 kB (baseline 21.6 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DuQd4asA.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -7.02 kB 🟢 -6.09 kB
assets/index-Uh7W1RGJ.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +7.03 kB 🔴 +6.11 kB

Status: 1 added / 1 removed

Graph Workspace — 951 kB (baseline 951 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Dkhdm4KW.js (new) 951 kB 🔴 +951 kB 🔴 +204 kB 🔴 +155 kB
assets/GraphView-Hv7cWIZ5.js (removed) 951 kB 🟢 -951 kB 🟢 -204 kB 🟢 -155 kB

Status: 1 added / 1 removed

Views & Navigation — 68.8 kB (baseline 68.8 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CJPN0X-f.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.83 kB
assets/CloudSurveyView-gJcoWaDq.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.83 kB
assets/CloudLoginView-B-SPyj_c.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.57 kB
assets/CloudLoginView-CpLLSl6S.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.58 kB
assets/UserCheckView-CAdfaDUZ.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.22 kB 🟢 -1.94 kB
assets/UserCheckView-De2BwNWf.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-CMUjHd-Q.js (removed) 7.41 kB 🟢 -7.41 kB 🟢 -2.32 kB 🟢 -2.04 kB
assets/CloudSignupView-mclcKOW5.js (new) 7.41 kB 🔴 +7.41 kB 🔴 +2.32 kB 🔴 +2.05 kB
assets/CloudLayoutView-Buq9n-_2.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.83 kB
assets/CloudLayoutView-Dk9-JFZx.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.83 kB
assets/CloudForgotPasswordView-D_0w4S-j.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.73 kB
assets/CloudForgotPasswordView-wjEbpY9B.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudAuthTimeoutView-BeAqwfes.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudAuthTimeoutView-Cqu_N-L3.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-f580Z910.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-Wi3G2p-p.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/UserSelectView-DSftLmdS.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/UserSelectView-yb-i0L7E.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/CloudSorryContactSupportView-Bi8IsTTh.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-vBPh8yaQ.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 436 kB (baseline 436 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-DeTyz2uS.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.65 kB
assets/SecretsPanel-ReP3dE3D.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.66 kB
assets/LegacyCreditsPanel-Bn5J-zh8.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.57 kB 🔴 +4.89 kB
assets/LegacyCreditsPanel-D6FVuv6R.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.57 kB 🟢 -4.89 kB
assets/SubscriptionPanel-_hSXY7Qw.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.74 kB 🔴 +4.18 kB
assets/SubscriptionPanel-61RDxsFY.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.73 kB 🟢 -4.16 kB
assets/KeybindingPanel-CphSOtyN.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.57 kB 🟢 -3.17 kB
assets/KeybindingPanel-DIRhNTiz.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.58 kB 🔴 +3.18 kB
assets/AboutPanel-BTI3Z1Ev.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.47 kB
assets/AboutPanel-CmgDH_JF.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.46 kB
assets/ExtensionPanel-BxWCxWpH.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/ExtensionPanel-DCD8txiP.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.35 kB
assets/ServerConfigPanel-DR2NWtVe.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.13 kB 🟢 -1.93 kB
assets/ServerConfigPanel-gRh-cpoA.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.13 kB 🔴 +1.91 kB
assets/UserPanel-CApadsWG.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/UserPanel-CLgcLeBC.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +2 kB 🔴 +1.75 kB
assets/cloudRemoteConfig-BicvIEsp.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +709 B 🔴 +612 B
assets/cloudRemoteConfig-Dij_P6ix.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -707 B 🟢 -614 B
assets/refreshRemoteConfig-Ba-ll7ct.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +518 B 🔴 +464 B
assets/refreshRemoteConfig-BOhzzVej.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -521 B 🟢 -460 B
assets/config-QxkqTZy6.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-3cK4vYSX.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-AqJa7Oe1.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BOcWl0Qp.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BodhSOuG.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCD8qxmc.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CVDNuOXV.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DLodCRRz.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DLqeCT09.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DP-OgTXN.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRIXyZ_Z.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-IRk9rDbu.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

User & Accounts — 16 kB (baseline 16 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BRdPVKuh.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -991 B
assets/auth-DTP6r9mB.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +994 B
assets/SignUpForm-C2WWHcqD.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/SignUpForm-DXWBldN2.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/UpdatePasswordContent-DB5I_8vh.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +950 B
assets/UpdatePasswordContent-DxgxYZp1.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -947 B
assets/firebaseAuthStore-DSPwlHE_.js (new) 790 B 🔴 +790 B 🔴 +390 B 🔴 +347 B
assets/firebaseAuthStore-v_D0Kt6U.js (removed) 790 B 🟢 -790 B 🟢 -387 B 🟢 -347 B
assets/auth-C9LxblUO.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +194 B
assets/auth-CMg_Ev8P.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -197 B
assets/PasswordFields-koUYSkkX.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-BRX_wv6S.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 738 B (baseline 738 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CGLuT0Hw.js (removed) 738 B 🟢 -738 B 🟢 -374 B 🟢 -330 B
assets/useSubscriptionDialog-CoNC5kH4.js (new) 738 B 🔴 +738 B 🔴 +381 B 🔴 +328 B

Status: 1 added / 1 removed

UI Components — 47 kB (baseline 47 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-BewVzjYO.js (new) 9.85 kB 🔴 +9.85 kB 🔴 +3.4 kB 🔴 +3.01 kB
assets/useTerminalTabs-J6NpnXZH.js (removed) 9.85 kB 🟢 -9.85 kB 🟢 -3.4 kB 🟢 -3.01 kB
assets/ComfyQueueButton-B44u36Nw.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/ComfyQueueButton-DRbvkrYF.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.22 kB
assets/SubscribeButton-CirDRuW9.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +887 B
assets/SubscribeButton-Dkk7Vemq.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -886 B
assets/cloudFeedbackTopbarButton-BaG6N3YI.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -855 B 🟢 -768 B
assets/cloudFeedbackTopbarButton-DsIbYX0j.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +858 B 🔴 +767 B
assets/ComfyQueueButton-D2LHWdS4.js (removed) 795 B 🟢 -795 B 🟢 -393 B 🟢 -350 B
assets/ComfyQueueButton-rfeE64t6.js (new) 795 B 🔴 +795 B 🔴 +396 B 🔴 +357 B
assets/Button-DcjgQBBu.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-lmHOydPu.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-Cu92TP21.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-D7H0v_Kw.js 5.94 kB 5.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-0OM2g_KN.js 7.45 kB 7.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-DkTACzmk.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DRxh3QrM.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.51 MB (baseline 2.51 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-ClU_Pn_n.js (removed) 1.73 MB 🟢 -1.73 MB 🟢 -386 kB 🟢 -292 kB
assets/dialogService-dTJW-rNQ.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +386 kB 🔴 +292 kB
assets/api-B8uViK7A.js (new) 653 kB 🔴 +653 kB 🔴 +147 kB 🔴 +118 kB
assets/api-YoVYxoMv.js (removed) 653 kB 🟢 -653 kB 🟢 -147 kB 🟢 -118 kB
assets/load3dService-CuaYnYdp.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-qooO_Qks.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/systemStatsStore-9He4jxzj.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +4.42 kB 🔴 +3.88 kB
assets/systemStatsStore-B7brXJhE.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -4.42 kB 🟢 -3.89 kB
assets/releaseStore-B9YZPqij.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-VeDXVcIF.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/keybindingService-7BSiMs6-.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/keybindingService-CHTOI_or.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/bootstrapStore-BgzbODjf.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -872 B 🟢 -788 B
assets/bootstrapStore-CM_8qVMn.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +871 B 🔴 +790 B
assets/userStore-DeRRWOjY.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -634 B
assets/userStore-DyW01Dk7.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +638 B
assets/audioService-CPHuWix5.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +851 B 🔴 +725 B
assets/audioService-CzN0Pg3B.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -848 B 🟢 -725 B
assets/releaseStore-Bs4AbfGg.js (removed) 762 B 🟢 -762 B 🟢 -382 B 🟢 -342 B
assets/releaseStore-BYTAJPxl.js (new) 762 B 🔴 +762 B 🔴 +384 B 🔴 +341 B
assets/settingStore-BDgOLCBs.js (removed) 746 B 🟢 -746 B 🟢 -387 B 🟢 -343 B
assets/settingStore-BOq_niUF.js (new) 746 B 🔴 +746 B 🔴 +388 B 🔴 +342 B
assets/workflowDraftStore-D72EN0bW.js (removed) 738 B 🟢 -738 B 🟢 -374 B 🟢 -336 B
assets/workflowDraftStore-FwjfVFlB.js (new) 738 B 🔴 +738 B 🔴 +381 B 🔴 +337 B
assets/dialogService-CDYUbQIH.js (removed) 727 B 🟢 -727 B 🟢 -366 B 🟢 -328 B
assets/dialogService-DdxOsKP_.js (new) 727 B 🔴 +727 B 🔴 +369 B 🔴 +329 B
assets/serverConfigStore-B17wcfZ1.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

Utilities & Hooks — 58.3 kB (baseline 58.3 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-40zfW-M2.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-BBbLvYXH.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer--bJ7rmFP.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useLoad3dViewer-DzQrCESn.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useFeatureFlags-B5oUPSpT.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/useFeatureFlags-pXcbAD73.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.23 kB 🟢 -1.05 kB
assets/useWorkspaceUI-BosTaJZc.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +702 B
assets/useWorkspaceUI-C3F1LCQr.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -702 B
assets/useSubscriptionCredits-1eFNLXFZ.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +901 B
assets/useSubscriptionCredits-gIk8Ato9.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.03 kB 🟢 -901 B
assets/subscriptionCheckoutUtil-B-JF4ypp.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +954 B
assets/subscriptionCheckoutUtil-i5hDzPcx.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -958 B
assets/useExternalLink-Bll1Pq7u.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -772 B 🟢 -676 B
assets/useExternalLink-DfwXZ7TZ.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +773 B 🔴 +679 B
assets/useErrorHandling-Crbwgcnh.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -628 B 🟢 -534 B
assets/useErrorHandling-DySrvLgf.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +629 B 🔴 +533 B
assets/useWorkspaceSwitch-B9Ck7BES.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +544 B 🔴 +483 B
assets/useWorkspaceSwitch-hUqnjdsA.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -541 B 🟢 -488 B
assets/useLoad3d-Bb2Bol9g.js (new) 861 B 🔴 +861 B 🔴 +427 B 🔴 +383 B
assets/useLoad3d-brctmv_0.js (removed) 861 B 🟢 -861 B 🟢 -425 B 🟢 -380 B
assets/audioUtils-CyWw41Br.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -402 B
assets/audioUtils-DBXfCfXo.js (new) 858 B 🔴 +858 B 🔴 +501 B 🔴 +422 B
assets/useLoad3dViewer-D50ZzA-u.js (removed) 840 B 🟢 -840 B 🟢 -409 B 🟢 -373 B
assets/useLoad3dViewer-DKpaMoku.js (new) 840 B 🔴 +840 B 🔴 +412 B 🔴 +372 B
assets/useCurrentUser-BfTbdOm_.js (new) 724 B 🔴 +724 B 🔴 +375 B 🔴 +327 B
assets/useCurrentUser-f2dW-sTO.js (removed) 724 B 🟢 -724 B 🟢 -369 B 🟢 -328 B
assets/_plugin-vue_export-helper-CY4XIWDa.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-m-0Os8lq.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BQSmRN2Q.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

Vendor & Third-Party — 8.83 MB (baseline 8.83 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-BzNZEmD_.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Ca9moc73.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CWMIYdD2.js 379 kB 379 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CHaNo_rA.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-B4hGe0IQ.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-vkxZGffR.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.6 MB (baseline 7.6 MB) • 🔴 +308 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-obFT_eNC.js (new) 518 kB 🔴 +518 kB 🔴 +99.4 kB 🔴 +77.4 kB
assets/i18n-BnmlFAM4.js (removed) 518 kB 🟢 -518 kB 🟢 -99.3 kB 🟢 -77.3 kB
assets/core-02CeZA2O.js (new) 72.8 kB 🔴 +72.8 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/core-DCKgszgT.js (removed) 72.8 kB 🟢 -72.8 kB 🟢 -18.8 kB 🟢 -16.1 kB
assets/groupNode-CU2wLRVS.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.6 kB 🔴 +15.5 kB
assets/groupNode-S7mkle1h.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.6 kB 🟢 -15.5 kB
assets/WidgetSelect-_jdxBTcR.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-Ts2vqVY7.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-CHBeJmJB.js (new) 45.8 kB 🔴 +45.8 kB 🔴 +8.56 kB 🔴 +7.4 kB
assets/SubscriptionRequiredDialogContentWorkspace-D8fKqQkE.js (removed) 45.8 kB 🟢 -45.8 kB 🟢 -8.56 kB 🟢 -7.43 kB
assets/Load3DControls-P4jKd_-Q.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-p9MwuguZ.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.64 kB
assets/WorkspacePanelContent-B--5hAZ4.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.39 kB
assets/WorkspacePanelContent-BzOyGpUS.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.38 kB
assets/SubscriptionRequiredDialogContent-DfvLFoCW.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.56 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-U3FW9br3.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.56 kB 🟢 -5.77 kB
assets/Load3dViewerContent-CEU-V_sM.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/Load3dViewerContent-hLCzmQSh.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/WidgetImageCrop-BbUltsa6.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.85 kB
assets/WidgetImageCrop-DsHuWD5h.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.84 kB
assets/SubscriptionPanelContentWorkspace-BIeuqPDq.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/SubscriptionPanelContentWorkspace-CTEIdxbR.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/CurrentUserPopoverWorkspace-CluO1Bi0.js (removed) 19.8 kB 🟢 -19.8 kB 🟢 -4.86 kB 🟢 -4.33 kB
assets/CurrentUserPopoverWorkspace-DSlxPpqF.js (new) 19.8 kB 🔴 +19.8 kB 🔴 +4.86 kB 🔴 +4.33 kB
assets/SignInContent-DE91Xakx.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.78 kB 🟢 -4.19 kB
assets/SignInContent-DkthJpSs.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.79 kB 🔴 +4.2 kB
assets/WidgetInputNumber-Bk4W0fWR.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.71 kB 🔴 +4.18 kB
assets/WidgetInputNumber-CL7hJuoC.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.71 kB 🟢 -4.18 kB
assets/WidgetRecordAudio-Bhnj-m5V.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.94 kB 🔴 +4.43 kB
assets/WidgetRecordAudio-DJqkC6Ad.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.94 kB 🟢 -4.42 kB
assets/Load3D-CJ7k54vm.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/Load3D-fGNSe_HS.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/load3d-BKvPI-Et.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.2 kB 🔴 +3.65 kB
assets/load3d-Di5I5i0f.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/AudioPreviewPlayer-BjOgmyzJ.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.2 kB 🟢 -2.85 kB
assets/AudioPreviewPlayer-GRtE6LUv.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.19 kB 🔴 +2.87 kB
assets/changeTracker-Bc54rHph.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.55 kB
assets/changeTracker-Kp3R6q0v.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/nodeTemplates-DW5-kLWu.js (removed) 9.3 kB 🟢 -9.3 kB 🟢 -3.25 kB 🟢 -2.86 kB
assets/nodeTemplates-hJO7XBHx.js (new) 9.3 kB 🔴 +9.3 kB 🔴 +3.26 kB 🔴 +2.87 kB
assets/InviteMemberDialogContent-B4EhR6bS.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2 kB
assets/InviteMemberDialogContent-DsICk4Re.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +2.01 kB
assets/Load3DConfiguration-BGRVX5lg.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/Load3DConfiguration-DPyjhxow.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-Dr2Ig00d.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/CreateWorkspaceDialogContent-DVXLFZbo.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/EditWorkspaceDialogContent-Bd-BpcSv.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-CtSPvVAQ.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.94 kB 🟢 -1.7 kB
assets/ValueControlPopover-DHnxD_Yh.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.58 kB
assets/ValueControlPopover-XnLbwGPA.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.59 kB
assets/Preview3d-BoPiBJ8O.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/Preview3d-CNOR3dHV.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/CancelSubscriptionDialogContent-DwWAFNbq.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CancelSubscriptionDialogContent-m2xv4IGL.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/DeleteWorkspaceDialogContent-BxiImtGk.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-CZuJZx4P.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/WidgetWithControl-_RBEeA8k.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.78 kB 🔴 +1.6 kB
assets/WidgetWithControl-DcRwRABB.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.78 kB 🟢 -1.6 kB
assets/LeaveWorkspaceDialogContent-CZr4d_2l.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.38 kB
assets/LeaveWorkspaceDialogContent-DTO2IVTm.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.38 kB
assets/RemoveMemberDialogContent-BIdEdErs.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/RemoveMemberDialogContent-XOFxKQdw.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/RevokeInviteDialogContent-C3IyUMuK.js (new) 3.96 kB 🔴 +3.96 kB 🔴 +1.54 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-XXNJABu8.js (removed) 3.96 kB 🟢 -3.96 kB 🟢 -1.54 kB 🟢 -1.36 kB
assets/InviteMemberUpsellDialogContent-BaZ6nBnn.js (removed) 3.83 kB 🟢 -3.83 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/InviteMemberUpsellDialogContent-BPb0MlqK.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.41 kB 🔴 +1.23 kB
assets/saveMesh-B1OUOeiO.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.46 kB 🟢 -1.29 kB
assets/saveMesh-BYgN3zFt.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/cloudSessionCookie-BfZahqm3.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.09 kB 🔴 +985 B
assets/cloudSessionCookie-E2MlV_F8.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.09 kB 🟢 -987 B
assets/GlobalToast-BwgigSFJ.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.06 kB
assets/GlobalToast-DsZ6JREh.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.07 kB
assets/ApiNodesSignInContent-DEEcY2uw.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +958 B
assets/ApiNodesSignInContent-DoDpFrqq.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -955 B
assets/SubscribeToRun-C1YaN0qY.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +875 B
assets/SubscribeToRun-D52bIFp1.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -874 B
assets/CloudRunButtonWrapper-Cd6LgPiW.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -785 B 🟢 -717 B
assets/CloudRunButtonWrapper-LIoHRpnE.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +788 B 🔴 +716 B
assets/signInSchema-CvViy6Q8.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +564 B 🔴 +513 B
assets/signInSchema-DKaRYNlG.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -564 B 🟢 -518 B
assets/cloudBadges-BIMQ3QzW.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -704 B 🟢 -610 B
assets/cloudBadges-DvvjshuJ.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +708 B 🔴 +617 B
assets/cloudSubscription-C-1I2HuW.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -657 B 🟢 -569 B
assets/cloudSubscription-CIHdQF5a.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +661 B 🔴 +576 B
assets/Load3D-CC42liTg.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -497 B 🟢 -446 B
assets/Load3D-CoyPdkL4.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +497 B 🔴 +446 B
assets/nightlyBadges-B8VZ2LQN.js (removed) 1 kB 🟢 -1 kB 🟢 -533 B 🟢 -478 B
assets/nightlyBadges-Dloyus_s.js (new) 1 kB 🔴 +1 kB 🔴 +536 B 🔴 +475 B
assets/Load3dViewerContent-CroX4fJO.js (new) 995 B 🔴 +995 B 🔴 +468 B 🔴 +419 B
assets/Load3dViewerContent-DVTGuGvt.js (removed) 995 B 🟢 -995 B 🟢 -467 B 🟢 -412 B
assets/SubscriptionPanelContentWorkspace-DTgmqRZ1.js (new) 932 B 🔴 +932 B 🔴 +438 B 🔴 +380 B
assets/SubscriptionPanelContentWorkspace-kckX_NGR.js (removed) 932 B 🟢 -932 B 🟢 -438 B 🟢 -383 B
assets/graphHasMissingNodes-_-KaWlWh.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +323 B
assets/graphHasMissingNodes-Drg-2sTk.js (removed) 761 B 🟢 -761 B 🟢 -372 B 🟢 -322 B
assets/changeTracker-C48hhDoU.js (removed) 759 B 🟢 -759 B 🟢 -384 B 🟢 -338 B
assets/changeTracker-DI6IH30C.js (new) 759 B 🔴 +759 B 🔴 +387 B 🔴 +337 B
assets/WidgetLegacy-0YIXH134.js (removed) 747 B 🟢 -747 B 🟢 -384 B 🟢 -336 B
assets/WidgetLegacy-D22OWOlK.js (new) 747 B 🔴 +747 B 🔴 +386 B 🔴 +336 B
assets/WidgetInputNumber-Bwpvu8pF.js (new) 469 B 🔴 +469 B 🔴 +264 B 🔴 +228 B
assets/WidgetInputNumber-ggak8qZa.js (removed) 469 B 🟢 -469 B 🟢 -263 B 🟢 -228 B
assets/i18n-CcNGzwbS.js (removed) 199 B 🟢 -199 B 🟢 -159 B 🟢 -140 B
assets/i18n-D9rWRFki.js (new) 199 B 🔴 +199 B 🔴 +159 B 🔴 +139 B
assets/AnimationControls-BuN89WBW.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-sbUO3_hD.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-DhnNuB-i.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CKD9vwNi.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BIWmUVEc.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BOt38VCw.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C0NcxRH3.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C2xuXGb5.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CmiKIQwc.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DMwP8S5e.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwBt3HhT.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-JX559A2n.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-n_2KJWcD.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-OO-8nFm9.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-wq2Y-YKn.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-BIWjk1ar.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BA2V8d-C.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BccLgA47.js 168 kB 168 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C-ZfUqj4.js 194 kB 194 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C1DJg0HU.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CjFsXT_Y.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNIsXuKE.js 147 kB 147 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CqcSAz7B.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DDxNg4P1.js 174 kB 174 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DQHvUyvV.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dr-RBucI.js 122 kB 122 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Gap3UP2p.js 142 kB 142 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-D3QRJ6eZ.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-vXuump5i.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-XsW6Reb5.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-Crhpst_D.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-DLkC3BlW.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-Dxvkupp8.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-2U4KtUml.js 360 kB 360 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-5rcOJVex.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BTBSP0IQ.js 480 kB 480 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BZEpP7w6.js 383 kB 383 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C-Tw-7I_.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C76rbmLh.js 441 kB 441 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CxxD1ymF.js 395 kB 395 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DciNsuYe.js 392 kB 392 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-G7wcMpUD.js 356 kB 356 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-nGdg-hIO.js 388 kB 388 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-xiPSrG6S.js 440 kB 440 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-BFioAN8e.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DeIFnh1k.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-bibvA8E3.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DdhXSGsd.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-1EXhnvTZ.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-vVfixIxQ.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DTUjK0ZE.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BPh1lTyF.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-xcXafMSV.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-tDqjft7_.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-cmpN9z2D.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BaSczjNZ.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-BV2GfN2g.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-Cu2WRFHM.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-1Fl4ror4.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-DbQVdecX.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-COB1L9Pj.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-GA6E8XqZ.js 3.96 kB 3.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-VrAZFEEv.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BtuQMzwn.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 51 added / 51 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/platform/surveys/NightlySurveyPopover.vue (2)

35-38: Consider hiding Typeform widget when typeformId validation fails.

When the typeformId fails alphanumeric validation, returning an empty string still sets data-tf-widget="" in the DOM. This could cause the Typeform SDK to behave unexpectedly or display an error. Consider also setting typeformError to true or using a separate flag to hide the Typeform widget entirely when the ID is invalid.

♻️ Proposed approach
 const typeformId = computed(() => {
   const id = config.typeformId
-  return /^[A-Za-z0-9]+$/.test(id) ? id : ''
+  return /^[A-Za-z0-9]+$/.test(id) ? id : null
+})
+
+const hasValidTypeformId = computed(() => typeformId.value !== null)

Then in the template, use v-show="isVisible && !typeformError && hasValidTypeformId" on the Typeform div.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/platform/surveys/NightlySurveyPopover.vue` around lines 35 - 38, The
computed typeformId currently returns an empty string on invalid input but still
renders data-tf-widget="", so update the logic to expose a validity flag and set
an error state: keep the computed typeformId for the sanitized value, add a new
boolean computed or ref named hasValidTypeformId that returns
/^[A-Za-z0-9]+$/.test(config.typeformId), and set or toggle a typeformError ref
to true when invalid; then update the template to hide the widget by using
v-show="isVisible && !typeformError && hasValidTypeformId" on the Typeform div
(referencing typeformId, hasValidTypeformId, and typeformError).

132-138: Simplify v-show condition – isVisible check is redundant.

The parent container already uses v-if="isVisible" (line 107), so the isVisible in the v-show condition here is always true when this element is rendered.

♻️ Proposed simplification
       <div
-        v-show="isVisible && !typeformError"
+        v-show="!typeformError"
         ref="typeformRef"
         data-tf-auto-resize
         :data-tf-widget="typeformId"
         class="min-h-[300px]"
       />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/platform/surveys/NightlySurveyPopover.vue` around lines 132 - 138, The
v-show on the Typeform container redundantly checks isVisible because the parent
already uses v-if="isVisible"; update the element that currently has
v-show="isVisible && !typeformError" (the div with ref="typeformRef" and
:data-tf-widget="typeformId") to only check the error state (e.g.,
v-show="!typeformError") so it relies on the parent for visibility and only
controls rendering for typeformError.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/platform/surveys/NightlySurveyPopover.test.ts`:
- Around line 150-156: The test uses optional chaining when clicking the opt-out
button which can hide a missing-button failure; before calling
optOutButton.trigger('click') assert the button exists (e.g.,
expect(optOutButton).toBeTruthy() or expect(optOutButton).not.toBeUndefined())
so the test fails if selector fails—locate the variables around
wrapper.findAll('button') and optOutButton and add an explicit existence
assertion immediately before invoking optOutButton.trigger('click'), then
proceed to trigger and assert wrapper.emitted('optedOut').

---

Nitpick comments:
In `@src/platform/surveys/NightlySurveyPopover.vue`:
- Around line 35-38: The computed typeformId currently returns an empty string
on invalid input but still renders data-tf-widget="", so update the logic to
expose a validity flag and set an error state: keep the computed typeformId for
the sanitized value, add a new boolean computed or ref named hasValidTypeformId
that returns /^[A-Za-z0-9]+$/.test(config.typeformId), and set or toggle a
typeformError ref to true when invalid; then update the template to hide the
widget by using v-show="isVisible && !typeformError && hasValidTypeformId" on
the Typeform div (referencing typeformId, hasValidTypeformId, and
typeformError).
- Around line 132-138: The v-show on the Typeform container redundantly checks
isVisible because the parent already uses v-if="isVisible"; update the element
that currently has v-show="isVisible && !typeformError" (the div with
ref="typeformRef" and :data-tf-widget="typeformId") to only check the error
state (e.g., v-show="!typeformError") so it relies on the parent for visibility
and only controls rendering for typeformError.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/platform/surveys/NightlySurveyPopover.vue (1)

134-140: Redundant isVisible check in v-show condition.

This <div> is already inside a parent v-if="isVisible", so checking isVisible again in v-show is unnecessary.

♻️ Suggested simplification
         <div
-          v-show="isVisible && !typeformError && isValidTypeformId"
+          v-show="!typeformError && isValidTypeformId"
           ref="typeformRef"
           data-tf-auto-resize
           :data-tf-widget="typeformId"
           class="min-h-[300px]"
         />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/platform/surveys/NightlySurveyPopover.vue` around lines 134 - 140, The
v-show on the Typeform container redundantly checks isVisible even though the
element is already wrapped by a parent v-if="isVisible"; update the v-show
expression on the <div ref="typeformRef" :data-tf-widget="typeformId" ...> to
remove isVisible so it becomes v-show="!typeformError && isValidTypeformId",
keeping the same data-tf-auto-resize and class attributes unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/platform/surveys/NightlySurveyPopover.vue`:
- Around line 134-140: The v-show on the Typeform container redundantly checks
isVisible even though the element is already wrapped by a parent
v-if="isVisible"; update the v-show expression on the <div ref="typeformRef"
:data-tf-widget="typeformId" ...> to remove isVisible so it becomes
v-show="!typeformError && isValidTypeformId", keeping the same
data-tf-auto-resize and class attributes unchanged.

@christian-byrne christian-byrne merged commit 8998d92 into main Feb 23, 2026
29 checks passed
@christian-byrne christian-byrne deleted the feat/survey-popover branch February 23, 2026 04:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants