Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
22ab62c
wip
jasonvarga Sep 25, 2025
e7d6beb
make non-inertia (blade) pages work
jasonvarga Sep 25, 2025
e7b810f
wangjangle so that addons can register inertia pages ...
jasonvarga Sep 26, 2025
bb5e7a0
Wire up page titles, including fallbacks for blade pages
jasonvarga Sep 26, 2025
cec7835
Move collection show blade view into inertia ...
jasonvarga Sep 26, 2025
e505ca8
Move view site button to inertia
jasonvarga Sep 26, 2025
2792304
DropdownItem will use inertia links
jasonvarga Sep 26, 2025
b507939
Move user dropdown to inertia
jasonvarga Sep 26, 2025
80fd413
Move command palette to inertia
jasonvarga Sep 26, 2025
1d1ec7b
Move global site selector to inertia
jasonvarga Sep 26, 2025
082e857
logo
jasonvarga Sep 26, 2025
439400d
Badges with hrefs use inertia
jasonvarga Sep 26, 2025
a7a9d59
Pro badge to inertia
jasonvarga Sep 26, 2025
cc4f587
Badges with target blank will use regular links
jasonvarga Sep 26, 2025
6ff7733
docs callout is now in vue. blade component uses it.
jasonvarga Sep 26, 2025
bd17b24
collection index inertia page, and ability to define whether architec…
jasonvarga Sep 26, 2025
e20cbe4
Blueprint collection doesnt need to be a file collection - and it cau…
jasonvarga Sep 26, 2025
5b615a7
navigation
jasonvarga Sep 26, 2025
f2f0950
Merge branch 'master' into inertia
jasonvarga Sep 26, 2025
2aea2b3
empty collection page to inertia
jasonvarga Sep 27, 2025
a95b0e3
Move top level app components to global temporarily ...
jasonvarga Sep 27, 2025
a98e286
dashboard and claude-assisted component for rendering blade as vue
jasonvarga Sep 27, 2025
1352dfb
Entry edit/create publish forms to inertia
jasonvarga Sep 29, 2025
7bf48b1
configure sites page to inertia
jasonvarga Sep 29, 2025
d13daca
Wire up breadcrumbs in inertia
jasonvarga Sep 29, 2025
1c512d1
Command Palette uses inertia links
jasonvarga Sep 29, 2025
4e12961
name shouldnt be shown unless set
jasonvarga Sep 30, 2025
f6851ff
Outside pages
jasonvarga Sep 30, 2025
2f05bf9
Nullsafes
jasonvarga Sep 30, 2025
9f59d15
Move 404 to inertia. Remove the outside view - I don't think you can …
jasonvarga Sep 30, 2025
835d81e
Error page ...
jasonvarga Sep 30, 2025
27cbab7
More helpful error. tripped myself up a few times already.
jasonvarga Sep 30, 2025
ce6a086
remove old content-class yield, its an old thing. delete the one unus…
jasonvarga Sep 30, 2025
2049857
remove temp nav
jasonvarga Sep 30, 2025
1ea4976
wire copy to clipboard modal back up
jasonvarga Sep 30, 2025
151ac70
wire appended components back up
jasonvarga Sep 30, 2025
86683dd
portal targets were already working, but make the syntax nicer
jasonvarga Sep 30, 2025
5509398
Clean up nav. toggling etc moved into the nav component. remove unnec…
jasonvarga Oct 1, 2025
7be163e
bring back session expiry component
jasonvarga Oct 1, 2025
db0226b
bring back licensing alerts
jasonvarga Oct 1, 2025
dffd13a
clean up
jasonvarga Oct 1, 2025
416966c
Move/rename/organize layout related components
jasonvarga Oct 1, 2025
5cf6840
On non-inertia pages, the #main element isnt ready until nextTick for…
jasonvarga Oct 1, 2025
5af06fb
Move the stuff added to javascriptcomposer into inertia middleware
jasonvarga Oct 1, 2025
439ca95
dirty state handles inertia
jasonvarga Oct 1, 2025
99448a1
allow nav items with custom blade views (i.e. updates) to continue wo…
jasonvarga Oct 1, 2025
f9823e6
fix/improve nav/breadcrumbs ...
jasonvarga Oct 1, 2025
27d58a4
Always send the nav so it gets updated when you navigate without clic…
jasonvarga Oct 1, 2025
23221f3
make props reactive, with a separate function to allow for destructur…
jasonvarga Oct 1, 2025
1a2aff6
Add isInertia prop and use it to display a "Blade" badge
jasonvarga Oct 1, 2025
a7f53ea
Wire up inertia links in a few more places
jasonvarga Oct 1, 2025
297a0e7
Merge branch 'master' into inertia
jasonvarga Oct 1, 2025
523d781
fix tests and a couple of things
jasonvarga Oct 2, 2025
dc23c73
Merge branch 'master' into inertia
jasonvarga Oct 2, 2025
46ee5eb
Move nav methods inside function so they dont get run until you execu…
jasonvarga Oct 2, 2025
0c18c9f
Don't attempt to render nav when logged out
jasonvarga Oct 2, 2025
2086b97
Make password confirmationation use the 'inside' layout - using the o…
jasonvarga Oct 2, 2025
8501ad5
Render the logout dropdown item as a regular anchor so it does a full…
jasonvarga Oct 2, 2025
05b10a8
fix session expiry component
jasonvarga Oct 2, 2025
b1d0d65
not needed that the nav moved
jasonvarga Oct 2, 2025
b1ef35c
Hook up toggling of nav by clicking the logo
jasonvarga Oct 2, 2025
01fbdbe
avoid double event listeners
jasonvarga Oct 2, 2025
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
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"bacon/bacon-qr-code": "^3.0",
"composer/semver": "^3.4",
"guzzlehttp/guzzle": "^6.3 || ^7.0",
"inertiajs/inertia-laravel": "^2.0",
"james-heinrich/getid3": "^1.9.21",
"laravel/framework": "^11.34 || ^12.0",
"laravel/prompts": "^0.3.0",
Expand Down
42 changes: 42 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
"@floating-ui/dom": "^1.6.0",
"@he-tree/vue": "^2.10.0-beta.2",
"@hoppscotch/vue-toasted": "^0.1.0",
"@inertiajs/vue3": "^2.1.11",
"@internationalized/date": "^3.7.0",
"@shopify/draggable": "^1.0.0-beta.12",
"@tiptap/core": "^3.0.0",
"@tiptap/extensions": "^3.0.0",
"@tiptap/extension-blockquote": "^3.0.0",
"@tiptap/extension-bold": "^3.0.0",
"@tiptap/extension-bullet-list": "^3.0.0",
Expand All @@ -48,6 +48,7 @@
"@tiptap/extension-text-align": "^3.0.0",
"@tiptap/extension-typography": "^3.0.0",
"@tiptap/extension-underline": "^3.0.0",
"@tiptap/extensions": "^3.0.0",
"@tiptap/pm": "^3.0.0",
"@tiptap/vue-3": "^3.0.0",
"alpinejs": "^3.1.1",
Expand Down
1 change: 1 addition & 0 deletions packages/cms/src/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export const {
DatePicker,
DateRangePicker,
Description,
DocsCallout,
DragHandle,
Drawer,
Dropdown,
Expand Down
11 changes: 9 additions & 2 deletions packages/ui/src/Badge.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { computed, useSlots } from 'vue';
import { cva } from 'cva';
import { twMerge } from 'tailwind-merge';
import Icon from './Icon/Icon.vue';
import { Link } from '@inertiajs/vue3';

const props = defineProps({
append: { type: [String, Number, Boolean, null], default: null },
as: { type: String, default: 'div' },
color: { type: String, default: 'default' },
href: { type: String, default: null },
target: { type: String, default: null },
icon: { type: String, default: null },
iconAppend: { type: String, default: null },
pill: { type: Boolean, default: false },
Expand All @@ -21,7 +23,12 @@ const props = defineProps({

const slots = useSlots();
const hasDefaultSlot = !!slots.default;
const tag = computed(() => (props.href ? 'a' : props.as));
const tag = computed(() => {
if (props.href) {
return props.target === '_blank' ? 'a' : Link;
}
return props.as;
});

const badgeClasses = computed(() => {
const classes = cva({
Expand Down Expand Up @@ -71,7 +78,7 @@ const badgeClasses = computed(() => {
</script>

<template>
<component :is="tag" :class="badgeClasses" :href="props.href" data-ui-badge>
<component :is="tag" :class="badgeClasses" :href="props.href" :target="target" data-ui-badge>
<span v-if="props.prepend" class="font-medium border-e border-inherit pe-2">{{ prepend }}</span>
<Icon v-if="icon" :name="icon" />
<slot v-if="hasDefaultSlot" />
Expand Down
8 changes: 7 additions & 1 deletion packages/ui/src/Button/Button.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { computed, useSlots } from 'vue';
import { cva } from 'cva';
import { twMerge } from 'tailwind-merge';
import Icon from '../Icon/Icon.vue';
import { Link } from '@inertiajs/vue3';

const props = defineProps({
as: { type: String, default: 'button' },
Expand All @@ -21,7 +22,12 @@ const props = defineProps({

const slots = useSlots();
const hasDefaultSlot = !!slots.default;
const tag = computed(() => (props.href ? 'a' : props.as));
const tag = computed(() => {
if (props.href) {
return props.target === '_blank' ? 'a' : Link;
}
return props.as;
});
const iconOnly = computed(() => (props.icon && !hasDefaultSlot && !props.text) || props.iconOnly);

const buttonClasses = computed(() => {
Expand Down
11 changes: 9 additions & 2 deletions packages/ui/src/Dropdown/Item.vue
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
<script setup>
import { DropdownMenuItem } from 'reka-ui';
import { useSlots } from 'vue';
import { computed, useSlots } from 'vue';
import Icon from '../Icon/Icon.vue';
import { cva } from 'cva';
import { Link } from '@inertiajs/vue3';

const props = defineProps({
as: { type: String, default: null },
href: { type: String, default: null },
target: { type: String, default: '_self' },
icon: { type: String, default: null },
Expand All @@ -14,6 +16,11 @@ const props = defineProps({

const slots = useSlots();
const hasDefaultSlot = !!slots.default;
const tag = computed(() => {
if (props.as) return props.as;
if (! props.href) return 'div';
return props.target === '_blank' ? 'a' : Link;
});

const classes = cva({
base: 'col-span-2 grid grid-cols-subgrid items-center rounded-lg px-1 py-1.5 text-sm antialiased text-gray-900 dark:text-gray-300 not-data-disabled:cursor-pointer data-disabled:opacity-50 hover:not-data-disabled:bg-gray-100 dark:hover:not-data-disabled:bg-gray-800 outline-hidden',
Expand Down Expand Up @@ -41,7 +48,7 @@ const iconClasses = cva({
<DropdownMenuItem
:class="classes"
data-ui-dropdown-item
:as="href ? 'a' : 'div'"
:as="tag"
:href
:target
>
Expand Down
4 changes: 3 additions & 1 deletion packages/ui/src/Heading.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
import { cva } from 'cva';
import { computed, useSlots } from 'vue';
import Icon from './Icon/Icon.vue';
import { Link } from '@inertiajs/vue3';

const props = defineProps({
href: { type: [String, null], default: null },
target: { type: String, default: null },
icon: { type: [String, null], default: null },
level: { type: [Number, null], default: null },
size: { type: String, default: 'base' },
Expand All @@ -16,7 +18,7 @@ const hasDefaultSlot = !!slots.default;

const tag = computed(() => {
if (props.level) return `h${props.level}`;
if (props.href) return 'a';
if (props.href) return props.target === '_blank' ? 'a' : Link;
return 'div';
});

Expand Down
7 changes: 2 additions & 5 deletions resources/css/core/layout.css
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,12 @@ main {
}
}

.nav-closed main {
@apply ps-0;
}

.nav-closed .nav-main {
@apply -start-46;
}

.nav-closed main {
main.nav-closed {
@apply ps-0;
@apply md:ps-0;
}

Expand Down
92 changes: 0 additions & 92 deletions resources/js/bootstrap/App.vue
Original file line number Diff line number Diff line change
@@ -1,89 +1,10 @@
<script>
import GlobalSiteSelector from '../components/GlobalSiteSelector.vue';
import Login from '../components/login/Login.vue';
import TwoFactorChallenge from '../components/login/TwoFactorChallenge.vue';
import EnableTwoFactorAuthentication from '../components/login/EnableTwoFactorAuthentication.vue';
import BaseEntryCreateForm from '../components/entries/BaseCreateForm.vue';
import BaseTermCreateForm from '../components/terms/BaseCreateForm.vue';
import CreateTermButton from '../components/terms/CreateTermButton.vue';
import FieldsetListing from '../components/fieldsets/Listing.vue';
import FieldsetEditForm from '../components/fieldsets/EditForm.vue';
import BlueprintListing from '../components/blueprints/Listing.vue';
import BlueprintBuilder from '../components/blueprints/Builder.vue';
import FormListing from '../components/forms/Listing.vue';
import FormSubmissionListing from '../components/forms/SubmissionListing.vue';
import GlobalListing from '../components/globals/Listing.vue';
import GlobalPublishForm from '../components/globals/PublishForm.vue';
import UserListing from '../components/users/Listing.vue';
import UserWizard from '../components/users/Wizard.vue';
import RoleListing from '../components/roles/Listing.vue';
import RolePublishForm from '../components/roles/PublishForm.vue';
import UserGroupListing from '../components/user-groups/Listing.vue';
import UserGroupPublishForm from '../components/user-groups/PublishForm.vue';
import CollectionScaffolder from '../components/collections/Scaffolder.vue';
import CollectionView from '../components/collections/View.vue';
import CollectionBlueprintListing from '../components/collections/BlueprintListing.vue';
import SessionExpiry from '../components/SessionExpiry.vue';
import NavigationListing from '../components/navigation/Listing.vue';
import PreferencesEditForm from '../components/preferences/EditForm.vue';
import NavigationView from '../components/navigation/View.vue';
import TaxonomyBlueprintListing from '../components/taxonomies/BlueprintListing.vue';
import Updater from '../components/updater/Updater.vue';
import PortalTargets from '../components/portals/PortalTargets.vue';
import SitesEditForm from '../components/sites/EditForm.vue';
import CommandPalette from '../components/command-palette/CommandPalette.vue';
import ItemActions from '../components/actions/ItemActions.vue';
import BulkActions from '../components/actions/BulkActions.vue';
import LicensingAlert from '../components/LicensingAlert.vue';

import { defineAsyncComponent } from 'vue';
import { ConfigProvider } from 'reka-ui';

export default {
components: {
CommandPalette,
GlobalSiteSelector,
Login,
TwoFactorChallenge,
EnableTwoFactorAuthentication,
BaseEntryCreateForm,
BaseTermCreateForm,
CreateTermButton,
FieldsetListing,
FieldsetEditForm,
BlueprintListing,
BlueprintBuilder,
FormListing,
FormSubmissionListing,
GlobalListing,
GlobalPublishForm,
UserListing,
UserWizard,
RoleListing,
RolePublishForm,
UserGroupListing,
UserGroupPublishForm,
CollectionScaffolder,
CollectionView,
CollectionBlueprintListing,
SessionExpiry,
NavigationListing,
PreferencesEditForm,
NavigationView,
TaxonomyBlueprintListing,
NavBuilder: defineAsyncComponent(() => import('../components/nav/Builder.vue')),
Updater,
PortalTargets,
SitesEditForm,
ConfigProvider,
ItemActions,
BulkActions,
LicensingAlert,
},

data() {
return {
navOpen: false,
appendedComponents: Statamic.$components.components,
copyToClipboardModalUrl: null,
};
Expand All @@ -100,13 +21,6 @@ export default {
},

mounted() {
this.$keys.bind(['command+\\'], (e) => {
e.preventDefault();
this.toggleNav();
});



if (this.$config.get('broadcasting.enabled')) {
this.$echo.start();
}
Expand All @@ -119,8 +33,6 @@ export default {

created() {
const app = this;
const state = localStorage.getItem('statamic.nav') || 'open';
this.navOpen = state === 'open';

Statamic.$callbacks.add('copyToClipboard', async function (url) {
try {
Expand All @@ -140,10 +52,6 @@ export default {
},

methods: {
toggleNav() {
this.navOpen = !this.navOpen;
localStorage.setItem('statamic.nav', this.navOpen ? 'open' : 'closed');
},

fixAutofocus() {
// Fix autofocus issues in Safari and Firefox
Expand Down
1 change: 1 addition & 0 deletions resources/js/bootstrap/cms/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export {
DatePicker,
DateRangePicker,
Description,
DocsCallout,
DragHandle,
Drawer,
Dropdown,
Expand Down
Loading