Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/explore/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ useTelemetry({ payload })
// ---------------------------------------------------------------------------

/** High-signal "spine" node types used as the default 3D filter subset. */
const THREED_DEFAULT_TYPES: NodeType[] = ['tutorial', 'concept', 'mission']
const THREED_DEFAULT_TYPES: NodeType[] = ['tutorial', 'mission']

/** Whether the 3D toggle is visible: flag on AND desktop-only. */
const show3dToggle = computed(() => !!payload.value?.features?.threeD && !isMobile.value)
Expand Down
10 changes: 5 additions & 5 deletions app/explore/src/__tests__/App.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,14 +128,14 @@ describe('App.vue — 2D/3D toggle visibility', () => {
expect(wrapper.findAll('.explore__viewbtn').length).toBe(0)
})

it('case D: clicking 3D button when filters are all-on narrows enabledNodeTypes to THREED_DEFAULT_TYPES (size 3)', async () => {
it('case D: clicking 3D button when filters are all-on narrows enabledNodeTypes to THREED_DEFAULT_TYPES (size 2)', async () => {
_resetFilters()
const { enabledNodeTypes } = useFilters()
const wrapper = await mountApp({ threeD: true, mobile: false })

// Filters should start at all-on
const allOnSize = enabledNodeTypes.value.size
expect(allOnSize).toBeGreaterThan(3)
expect(allOnSize).toBeGreaterThan(2)

// Click the 3D button
const btns = wrapper.findAll('.explore__viewbtn')
Expand All @@ -146,11 +146,11 @@ describe('App.vue — 2D/3D toggle visibility', () => {
await btn3d!.trigger('click')
await nextTick()

// Should have narrowed to tutorial, concept, mission = 3 types
expect(enabledNodeTypes.value.size).toBe(3)
// Should have narrowed to tutorial, mission = 2 types
expect(enabledNodeTypes.value.size).toBe(2)
expect(enabledNodeTypes.value.has('tutorial')).toBe(true)
expect(enabledNodeTypes.value.has('concept')).toBe(true)
expect(enabledNodeTypes.value.has('mission')).toBe(true)
expect(enabledNodeTypes.value.has('concept')).toBe(false)
})

it('case E: 2D→3D→2D round-trip clears pathNodeIds (stale overlay fix)', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,11 @@ single-flight guard, fails to empty maps).
toggle never renders ⇒ 3D chunk never downloads.

**Default filtering (hairball fix):** on first switch to 3D, apply a **default node-type subset**
instead of all 27 filters: **`tutorial + concept + mission`** (high-signal spine), everything else
opt-in via the existing filter dropdown. Kept as a single named constant for easy tuning. The 2D
view's all-on default is unchanged.
instead of all 27 filters: **`tutorial + mission`** (~3,125 nodes, ~50% of the graph; missions
supply the connective tissue since tutorials have no direct tutorial↔tutorial edges — they link
through concepts/missions). Everything else — including `concept` — is opt-in via the existing
filter dropdown. Kept as a single named constant for easy tuning. The 2D view's all-on default is
unchanged.

### §4 — Bundle budget + testing

Expand Down
Loading