diff --git a/components/WeaponHovercard/index.scss b/components/WeaponHovercard/index.scss
new file mode 100644
index 00000000..4e540a09
--- /dev/null
+++ b/components/WeaponHovercard/index.scss
@@ -0,0 +1,41 @@
+.Weapon.Hovercard {
+ .skills {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ padding-right: $unit * 2;
+
+ .axSkill {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+
+ &.primary img {
+ height: 64px;
+ width: 64px;
+ }
+
+ &.secondary {
+ gap: $unit * 1.5;
+
+ img {
+ height: 36px;
+ width: 36px;
+ }
+ }
+
+ span {
+ font-size: $font-small;
+ font-weight: $medium;
+ text-align: center;
+ }
+ }
+ }
+
+ .weaponKeys {
+ display: flex;
+ flex-direction: column;
+ font-size: $normal;
+ gap: $unit / 2;
+ }
+}
\ No newline at end of file
diff --git a/components/WeaponHovercard/index.tsx b/components/WeaponHovercard/index.tsx
new file mode 100644
index 00000000..6126438a
--- /dev/null
+++ b/components/WeaponHovercard/index.tsx
@@ -0,0 +1,161 @@
+import React from 'react'
+import * as HoverCard from '@radix-ui/react-hover-card'
+
+import WeaponLabelIcon from '~components/WeaponLabelIcon'
+import UncapIndicator from '~components/UncapIndicator'
+
+import { axData } from '~utils/axData'
+
+import './index.scss'
+import { keys } from 'lodash'
+
+interface Props {
+ gridWeapon: GridWeapon
+ children: React.ReactNode
+}
+
+interface KeyNames {
+ [key: string]: {
+ en: string,
+ jp: string
+ }
+}
+
+const WeaponHovercard = (props: Props) => {
+ const Element = ['null', 'wind', 'fire', 'water', 'earth', 'dark', 'light']
+ const Proficiency = ['none', 'sword', 'dagger', 'axe', 'spear', 'bow', 'staff', 'fist', 'harp', 'gun', 'katana']
+ const WeaponKeyNames: KeyNames = {
+ '2': {
+ en: 'Pendulum',
+ jp: ''
+ },
+ '3': {
+ en: 'Teluma',
+ jp: ''
+ },
+ '17': {
+ en: 'Gauph Key',
+ jp: ''
+ },
+ '22': {
+ en: 'Emblem',
+ jp: ''
+ }
+ }
+
+ const tintElement = (props.gridWeapon.object.element == 0 && props.gridWeapon.element) ? Element[props.gridWeapon.element] : Element[props.gridWeapon.object.element]
+ const wikiUrl = `https://gbf.wiki/${props.gridWeapon.object.name.en.replaceAll(' ', '_')}`
+
+ const createPrimaryAxSkillString = () => {
+ const primaryAxSkills = axData[props.gridWeapon.object.ax - 1]
+
+ if (props.gridWeapon.ax) {
+ const simpleAxSkill = props.gridWeapon.ax[0]
+ const axSkill = primaryAxSkills.find(skill => skill.id == simpleAxSkill.modifier)
+
+ return `${axSkill?.name.en} +${simpleAxSkill.strength}${ (axSkill?.suffix) ? axSkill.suffix : '' }`
+ }
+
+ return ''
+ }
+
+ const createSecondaryAxSkillString = () => {
+ const primaryAxSkills = axData[props.gridWeapon.object.ax - 1]
+
+ if (props.gridWeapon.ax) {
+ const primarySimpleAxSkill = props.gridWeapon.ax[0]
+ const secondarySimpleAxSkill = props.gridWeapon.ax[1]
+
+ const primaryAxSkill = primaryAxSkills.find(skill => skill.id == primarySimpleAxSkill.modifier)
+
+ if (primaryAxSkill && primaryAxSkill.secondary) {
+ const secondaryAxSkill = primaryAxSkill.secondary.find(skill => skill.id == secondarySimpleAxSkill.modifier)
+ return `${secondaryAxSkill?.name.en} +${secondarySimpleAxSkill.strength}${ (secondaryAxSkill?.suffix) ? secondaryAxSkill.suffix : '' }`
+ }
+ }
+
+ return ''
+ }
+
+ function weaponImage() {
+ const weapon = props.gridWeapon.object
+
+ if (props.gridWeapon.object.element == 0 && props.gridWeapon.element)
+ return `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-grid/${weapon.granblue_id}_${props.gridWeapon.element}.jpg`
+ else
+ return `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-grid/${weapon.granblue_id}.jpg`
+ }
+
+ const keysSection = (
+ { WeaponKeyNames[props.gridWeapon.object.series].en }s
: ''
+ }
+
+ { (props.gridWeapon.weapon_keys) ?
+ Array.from(Array(props.gridWeapon.weapon_keys.length)).map((x, i) => {
+ return (
+ AX Skills
+
+ {createPrimaryAxSkillString()}
+
+ {createSecondaryAxSkillString()}
+
{ props.gridWeapon.object.name.en }
+
+