diff --git a/composer.json b/composer.json index 89d507a3c0a..ffe4868bac7 100644 --- a/composer.json +++ b/composer.json @@ -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", diff --git a/package-lock.json b/package-lock.json index 36b3ffdf204..387bb951f6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "@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", @@ -931,6 +932,32 @@ "vue": "^3.2.37" } }, + "node_modules/@inertiajs/core": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.1.11.tgz", + "integrity": "sha512-TF1UE1UjNRGyxJZGYe5IwDZwgyTvviE2XoJRHOS4SjS8kVzIqeBb3disIkLiJqshRNSNP8syggOro4TLtVubvA==", + "license": "MIT", + "dependencies": { + "@types/lodash-es": "^4.17.12", + "axios": "^1.12.0", + "lodash-es": "^4.17.21", + "qs": "^6.9.0" + } + }, + "node_modules/@inertiajs/vue3": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-2.1.11.tgz", + "integrity": "sha512-9+ny7uaPwMeLMl01GOoNFmC4ssCZ/RPH8AeyAwMVdfIEnUaXVqWwf8epHeLdc/wH17hWYWlSTxAOLdSUbjvaDQ==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "2.1.11", + "@types/lodash-es": "^4.17.12", + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/@internationalized/date": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.2.tgz", @@ -2385,6 +2412,21 @@ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/markdown-it": { "version": "14.1.2", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", diff --git a/package.json b/package.json index 1799edc634e..3be1c17cd89 100644 --- a/package.json +++ b/package.json @@ -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", @@ -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", diff --git a/packages/cms/src/ui.js b/packages/cms/src/ui.js index 0c2027636a5..ccfd97c71ad 100644 --- a/packages/cms/src/ui.js +++ b/packages/cms/src/ui.js @@ -25,6 +25,7 @@ export const { DatePicker, DateRangePicker, Description, + DocsCallout, DragHandle, Drawer, Dropdown, diff --git a/packages/ui/src/Badge.vue b/packages/ui/src/Badge.vue index 8c426f9a80d..83c853f4783 100644 --- a/packages/ui/src/Badge.vue +++ b/packages/ui/src/Badge.vue @@ -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 }, @@ -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({ @@ -71,7 +78,7 @@ const badgeClasses = computed(() => {