Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9afbba9
Move all the sidebars to the left
rmccue Apr 9, 2026
bf2d97a
Pass site description to frontend
rmccue Apr 9, 2026
a1a236b
Display category list in the sidebar
rmccue Apr 9, 2026
3dd69b3
Add sidebar posts/pages
rmccue Apr 10, 2026
e6cd849
Move new post to standalone screen
rmccue Apr 10, 2026
b0fe0b7
Merge branch 'main' into design-refresh
rmccue Sep 2, 2026
1ae9023
Fix up linting
rmccue Sep 2, 2026
8f56ee3
Build H2 Next with Node 24
joehoyle Sep 2, 2026
464bf2e
Require authentication for previews
rmccue Sep 2, 2026
6884720
Merge branch 'main' into next
joehoyle Sep 2, 2026
6057d39
Merge branch 'main' into next
joehoyle Sep 2, 2026
a701f9a
Add new super overlay to replace super menu
rmccue Sep 29, 2026
55ce668
Switch super overlay buttons to standard
rmccue Oct 1, 2026
358c57b
Use the brand colour when super overlay is open
rmccue Oct 1, 2026
2843975
Tweak the super search styles
rmccue Oct 1, 2026
13a55f4
Make it clearer what the blocks actually do
rmccue Oct 2, 2026
5c46caa
Fix nitpick
rmccue Oct 2, 2026
cbcf171
Update search to new schema
rmccue Oct 2, 2026
580a36a
Label posts and pages differently
rmccue Oct 2, 2026
7ca785a
Add ability to manage notifications from sidebar
rmccue Oct 5, 2026
6378fcd
Add none option for notifications
rmccue Oct 5, 2026
ce138e7
Reorder "none" to the top
rmccue Oct 5, 2026
0665bd4
Make profile maps optional in H2 Next
willmot Oct 8, 2026
9e2136b
Merge pull request #665 from humanmade/codex/h2-next-optional-profile…
joehoyle Oct 8, 2026
7b5f2f7
Return to stream after publishing a post
joehoyle Oct 8, 2026
5bc9118
Skip unsaved-content warning after publishing
joehoyle Oct 8, 2026
fccd76e
Refresh the stream after publishing a post
joehoyle Oct 8, 2026
7293788
Fix publish navigation guard
joehoyle Oct 8, 2026
60210ad
Merge pull request #663 from humanmade/next-universal-search
joehoyle Oct 11, 2026
0a3ad24
Switch notification settings into Redux
rmccue Oct 13, 2026
3576834
Merge pull request #664 from humanmade/next-manage-notifs
joehoyle Oct 13, 2026
3d8bbb2
Merge branch 'main' into next
rmccue Oct 13, 2026
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
16 changes: 9 additions & 7 deletions .build-script
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
#!/bin/bash

set -e
set -euo pipefail

if [ -d "$HOME/.nvm" ]; then
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

NODE_VERSION=`nvm current`
NODE_VERSION="$( nvm current )"

nvm install v12
nvm use v12
nvm install
nvm use
fi

npm ci
# iltorb is not compatible with current Node releases and is not required for
# the webpack build.
npm ci --ignore-scripts
npm run build

# clean-up
rm -rf node_modules

if command -v nvm; then
nvm use $NODE_VERSION
if command -v nvm && [[ "$NODE_VERSION" != "none" && "$NODE_VERSION" != "N/A" ]]; then
nvm use "$NODE_VERSION"
fi
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v12
v24
3 changes: 3 additions & 0 deletions .storybook/preview-head.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
},
preload: {},
features: {},
has: {
notifications: false,
},
};
window.wpApiSettings = {};
</script>
Expand Down
7 changes: 6 additions & 1 deletion inc/namespace.php
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ function get_script_data() {
'asset_url' => get_theme_file_uri( 'build/' ),
'site' => [
'name' => get_bloginfo( 'name' ),
'description' => get_bloginfo( 'description' ),
'url' => site_url(),
'home' => home_url(),
'api' => rest_url(),
Expand All @@ -376,6 +377,9 @@ function get_script_data() {
'emoji' => apply_filters( 'h2.custom_emoji', [] ),
],
'features' => [],
'has' => [
'notifications' => defined( 'FALCON_PATH' ),
],
'plugins' => [
'reactions' => \class_exists( 'H2\\Reactions\\Reaction' ),
],
Expand All @@ -402,7 +406,7 @@ function get_script_data() {
}
}

return $data;
return apply_filters( 'h2.script_data', $data );
}

/**
Expand Down Expand Up @@ -536,6 +540,7 @@ function register_rest_routes() {
'methods' => 'POST',
'callback' => __NAMESPACE__ . '\\render_preview',
'permission_callback' => function () {
// Anyone who can comment or write can preview.
return is_user_logged_in();
},
'args' => [
Expand Down
9 changes: 2 additions & 7 deletions src/App.css
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,21 @@
}

.Outer {
margin: 0 auto;
display: flex;
max-width: 1200px;
/* display: flex; */
}

.Inner {
flex-direction: column;
width: 65%;
max-width: 800px;
/* width: 65%; */
}

@media ( min-width: 800px ) {
.App > .Outer > aside {
position: sticky;
top: 0;
height: 100vh;
margin-left: 5%;
overflow: hidden;
overflow-y: scroll;
width: 30%;
flex-shrink: 0;
}
}
Expand Down
96 changes: 75 additions & 21 deletions src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ import WritePost from './components/Post/Write';
import Profile from './components/Profile';
import SessionExpiredWarning from './components/SessionExpiredWarning';
import Sidebar from './components/Sidebar';
import CategoriesSidebar from './components/Sidebar/Categories';
import CommentsSidebar from './components/Sidebar/Comments';
import SuperMenu from './components/SuperMenu';
import PagesSidebar from './components/Sidebar/Pages';
import PostsSidebar from './components/Sidebar/Posts';
import SuperOverlay from './components/Super';
import { RenderPlugins } from './plugins';
import { posts } from './types';

import './App.css';

Expand All @@ -33,6 +37,7 @@ class App extends Component {
isShowingWritePost: false,
showChanges: false,
};
this.headerRef = React.createRef();
}
onLogOut() {
window.location.href = '/wp-login.php?action=logout';
Expand Down Expand Up @@ -68,6 +73,19 @@ class App extends Component {
}
}

onToggleSuper = () => {
if ( this.props.showingSuper ) {
this.props.onHideSuperSidebar();
} else {
this.props.onShowSuperSidebar();
}
}

onShowChanges = () => {
this.setState( { showChanges: true } );
this.props.onHideSuperSidebar();
}

onClickWritePost() {
this.setState( { isShowingWritePost: true } );
}
Expand All @@ -80,9 +98,10 @@ class App extends Component {
this.props.history.push( string ? `/search/${ encodeURIComponent( string ) }` : '/' );
}

onDidCreatePost( post ) {
onDidCreatePost() {
this.setState( { isShowingWritePost: false } );
this.props.history.push( post.link.replace( /^(?:\/\/|[^/]+)*\//, '/' ) );
this.props.history.push( '/' );
this.props.onRefreshPostStream();
}

renderSidebar() {
Expand Down Expand Up @@ -111,6 +130,27 @@ class App extends Component {
/>
);

case 'categories':
return (
<CategoriesSidebar
onClose={ this.props.onDismissSidebar }
/>
);

case 'pages':
return (
<PagesSidebar
onClose={ this.props.onDismissSidebar }
/>
);

case 'posts':
return (
<PostsSidebar
onClose={ this.props.onDismissSidebar }
/>
);

default:
return <Sidebar />;
}
Expand All @@ -120,24 +160,29 @@ class App extends Component {
return (
<div className="App">
<OverlayContainer />
<SuperMenu
visible={ this.props.showingSuper }
onClose={ this.props.onHideSuperSidebar }
onSearch={ search => this.onSearch( search ) }
onShowChanges={ () => {
this.setState( { showChanges: true } );
this.props.onHideSuperSidebar();
} }
/>
<Header
onLogOut={ () => this.onLogOut() }
onWritePost={ () => this.onClickWritePost() }
onSearch={ search => this.onSearch( search ) }
onShowSuper={ this.props.onShowSuperSidebar }
/>
{ /* Keep the header above the overlay, so its search input stays usable. */ }
<div
ref={ this.headerRef }
className={ this.props.showingSuper ? 'relative z-30' : undefined }
>
<Header
superActive={ this.props.showingSuper }
onLogOut={ () => this.onLogOut() }
onWritePost={ () => this.onClickWritePost() }
onSearch={ search => this.onSearch( search ) }
onShowSuper={ this.onToggleSuper }
/>
</div>
{ this.props.showingSuper && (
<SuperOverlay
headerRef={ this.headerRef }
onShowChanges={ this.onShowChanges }
/>
) }
<SessionExpiredWarning />
<div className="Outer">
<div className="Inner">
<div className="Outer grid grid-cols-[min(30%,360px)_auto] gap-12">
{ this.renderSidebar() }
<div className="Inner max-w-200">
{ this.state.isShowingWritePost ? (
<WritePost
onDidCreatePost={ post => this.onDidCreatePost( post ) }
Expand All @@ -146,6 +191,15 @@ class App extends Component {
) : null }

<Switch>
<Route
path="/write"
exact
render={ () => (
<WritePost
onDidCreatePost={ post => this.onDidCreatePost( post ) }
/>
) }
/>
<Route
path="/author/:authorSlug/:hasPage(page)?/:page(\d+)?"
exact
Expand Down Expand Up @@ -183,7 +237,6 @@ class App extends Component {
/>
</Switch>
</div>
{ this.renderSidebar() }
</div>
{ this.state.showChanges ? (
<Changes
Expand Down Expand Up @@ -211,6 +264,7 @@ const mapDispatchToProps = dispatch => {
onDismissSidebar: () => dispatch( hideSidebar() ),
onHideSuperSidebar: () => dispatch( hideSuperSidebar() ),
onShowSuperSidebar: () => dispatch( showSuperSidebar() ),
onRefreshPostStream: () => dispatch( posts.fetchArchive( '' ) ),
};
};

Expand Down
2 changes: 1 addition & 1 deletion src/_print.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
.Sidebar-Container,
.Header,
.Overlay,
.SuperMenu,
.Super,
.Post__actions,
.Post-Summary-actions button,
.Post-Summary-people,
Expand Down
19 changes: 19 additions & 0 deletions src/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ export const REGISTER_PLUGIN = 'REGISTER_PLUGIN';
export const SHOW_META_SIDEBAR = 'SHOW_META_SIDEBAR';
export const SHOW_SIDEBAR_PROFILE = 'SHOW_SIDEBAR_PROFILE';
export const SHOW_SIDEBAR_COMMENTS = 'SHOW_SIDEBAR_COMMENTS';
export const SHOW_SIDEBAR_CATEGORIES = 'SHOW_SIDEBAR_CATEGORIES';
export const SHOW_SIDEBAR_PAGES = 'SHOW_SIDEBAR_PAGES';
export const SHOW_SIDEBAR_POSTS = 'SHOW_SIDEBAR_POSTS';
export const HIDE_SIDEBAR = 'HIDE_SIDEBAR';
export const SHOW_SUPER_SIDEBAR = 'SHOW_SUPER_SIDEBAR';
export const HIDE_SUPER_SIDEBAR = 'HIDE_SUPER_SIDEBAR';
export const SET_SUPER_SEARCH = 'SET_SUPER_SEARCH';
export const ENABLE_BETA_FEATURE = 'ENABLE_BETA_FEATURE';
export const DISABLE_BETA_FEATURE = 'DISABLE_BETA_FEATURE';
export const SET_DEFAULT_POST_VIEW = 'SET_DEFAULT_POST_VIEW';
Expand All @@ -25,13 +29,28 @@ export const showSidebarComments = id => {
};
};

export const showSidebarCategories = () => ( { type: SHOW_SIDEBAR_CATEGORIES } );
export const showSidebarPages = () => ( { type: SHOW_SIDEBAR_PAGES } );
export const showSidebarPosts = () => ( { type: SHOW_SIDEBAR_POSTS } );

export const hideSidebar = () => ( { type: HIDE_SIDEBAR } );

export const showMetaSidebar = () => ( { type: SHOW_META_SIDEBAR } );

export const showSuperSidebar = () => ( { type: SHOW_SUPER_SIDEBAR } );
export const hideSuperSidebar = () => ( { type: HIDE_SUPER_SIDEBAR } );

/**
* Set the term for network-wide search in the super overlay.
*
* @param {string} search Search term.
* @returns {object} Action.
*/
export const setSuperSearch = search => ( {
type: SET_SUPER_SEARCH,
search,
} );

export const enableBetaFeature = feature => ( {
type: ENABLE_BETA_FEATURE,
feature,
Expand Down
15 changes: 15 additions & 0 deletions src/changelog.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,21 @@ export const changes = [
</React.Fragment>
),
},
{
date: '2026-09-03',
title: 'Switch Sites & Search the Network',
content: () => (
<React.Fragment>
<p>The button in the top left now opens an overview of
every site on your network, so you can jump between
them with a single click.</p>
<p>While it's open, the search bar searches posts and
comments across all of your sites at once. Narrow the
results down by site, type or date, and sort them by
relevance or by date.</p>
</React.Fragment>
),
},
];

export function getChanges( lastView ) {
Expand Down
Loading
Loading