mirror of
https://github.com/JOYCEQL/magic-resume.git
synced 2026-06-02 07:43:34 +02:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 583e65a21d | |||
| c87d861cd6 |
@@ -1,6 +1,58 @@
|
||||
# Changelog
|
||||
|
||||
|
||||
## v2.0.4
|
||||
|
||||
[compare changes](https://github.com/JOYCEQL/magic-resume/compare/v2.0.3...main)
|
||||
|
||||
### 🚀 Enhancements
|
||||
|
||||
- Font copyright ([4ecf99d](https://github.com/JOYCEQL/magic-resume/commit/4ecf99d))
|
||||
- Add rich text link functionality ([b6f01d9](https://github.com/JOYCEQL/magic-resume/commit/b6f01d9))
|
||||
- Implement template snapshot ([0ec010e](https://github.com/JOYCEQL/magic-resume/commit/0ec010e))
|
||||
- Introduce pre-generated template snapshots ([fd76ba1](https://github.com/JOYCEQL/magic-resume/commit/fd76ba1))
|
||||
- Add custom instructions feature to AIPolishDialog ([9d1d6c4](https://github.com/JOYCEQL/magic-resume/commit/9d1d6c4))
|
||||
- Redesign theme color selection in side panel ([78ccc3e](https://github.com/JOYCEQL/magic-resume/commit/78ccc3e))
|
||||
- Add faq ([1d936e4](https://github.com/JOYCEQL/magic-resume/commit/1d936e4))
|
||||
- Add new 'Editorial' resume template ([107a9d8](https://github.com/JOYCEQL/magic-resume/commit/107a9d8))
|
||||
- Add backup configuration status ([9e35a5e](https://github.com/JOYCEQL/magic-resume/commit/9e35a5e))
|
||||
- Implement debounced file sync ([52d65ec](https://github.com/JOYCEQL/magic-resume/commit/52d65ec))
|
||||
- Add custom link labels for projects and support custom field display labels ([3f3e9a6](https://github.com/JOYCEQL/magic-resume/commit/3f3e9a6))
|
||||
- Add clickable links for custom fields in BaseInfo sections ([475d9e2](https://github.com/JOYCEQL/magic-resume/commit/475d9e2))
|
||||
|
||||
### 🔥 Performance
|
||||
|
||||
- Font-weight render ([d6e723d](https://github.com/JOYCEQL/magic-resume/commit/d6e723d))
|
||||
|
||||
### 🩹 Fixes
|
||||
|
||||
- Font export ([b5468f6](https://github.com/JOYCEQL/magic-resume/commit/b5468f6))
|
||||
- Wechat.jpg ([6a74d8a](https://github.com/JOYCEQL/magic-resume/commit/6a74d8a))
|
||||
- Remove trailing empty paragraphs after lists in rich text content ([7111b3f](https://github.com/JOYCEQL/magic-resume/commit/7111b3f))
|
||||
- Center align base info fields across templates and clean up layout code formatting ([c87d861](https://github.com/JOYCEQL/magic-resume/commit/c87d861))
|
||||
|
||||
### 💅 Refactors
|
||||
|
||||
- Upgrade Tiptap to v3 and replace legacy list classes with native CSS styling ([99b4ae2](https://github.com/JOYCEQL/magic-resume/commit/99b4ae2))
|
||||
|
||||
### 📖 Documentation
|
||||
|
||||
- Update license ([757030e](https://github.com/JOYCEQL/magic-resume/commit/757030e))
|
||||
- Readme.md ([b0f7827](https://github.com/JOYCEQL/magic-resume/commit/b0f7827))
|
||||
- Update wechat ([70389bf](https://github.com/JOYCEQL/magic-resume/commit/70389bf))
|
||||
- Update readme.md ([f1f05da](https://github.com/JOYCEQL/magic-resume/commit/f1f05da))
|
||||
- Update wechat ([042bb72](https://github.com/JOYCEQL/magic-resume/commit/042bb72))
|
||||
|
||||
### 🎨 Styles
|
||||
|
||||
- Education preview ([8d4aa02](https://github.com/JOYCEQL/magic-resume/commit/8d4aa02))
|
||||
|
||||
### ❤️ Contributors
|
||||
|
||||
- JOYCEQL <1449239013@qq.com>
|
||||
- Siyue ([@JOYCEQL](https://github.com/JOYCEQL))
|
||||
- Hanle <hanle200391@163.com>
|
||||
|
||||
## v2.0.3
|
||||
|
||||
[compare changes](https://github.com/JOYCEQL/magic-resume/compare/v2.0.2...main)
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "magic-resume",
|
||||
"version": "2.0.3",
|
||||
"version": "2.0.4",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"packageManager": "pnpm@10.3.0",
|
||||
|
||||
@@ -87,17 +87,17 @@ const AlignSelector: React.FC<AlignSelectorProps> = ({ value, onChange }) => {
|
||||
>
|
||||
{/* Icon wrapper to control size */}
|
||||
<div className="w-10 h-10 flex items-center justify-center">
|
||||
{React.cloneElement(layout.icon as React.ReactElement, {
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
className: "fill-current"
|
||||
})}
|
||||
{React.cloneElement(layout.icon as React.ReactElement, {
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
className: "fill-current"
|
||||
})}
|
||||
</div>
|
||||
{/* <span className="text-[10px] mt-2 font-medium opacity-80">
|
||||
{layout.tooltip}
|
||||
</span> */}
|
||||
|
||||
{value === layout.value && (
|
||||
|
||||
{value === layout.value && (
|
||||
<div className="absolute inset-0 rounded-xl ring-2 ring-primary ring-offset-2 ring-offset-background opacity-0 animate-in fade-in zoom-in-95 duration-200 fill-mode-forwards" />
|
||||
)}
|
||||
</button>
|
||||
|
||||
@@ -61,7 +61,7 @@ const BaseInfo = ({ basic = {} as BasicInfo, globalSettings, template }: BaseInf
|
||||
const layoutStyles = {
|
||||
left: { container: "flex items-center justify-between gap-6", leftContent: "flex items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-left min-w-0" },
|
||||
right: { container: "flex items-center justify-between gap-6 flex-row-reverse", leftContent: "flex justify-end items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-right min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-start items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-center items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
};
|
||||
|
||||
const styles = layoutStyles[layout as keyof typeof layoutStyles] || layoutStyles.left;
|
||||
|
||||
@@ -63,7 +63,7 @@ const BaseInfo = ({ basic = {} as BasicInfo, globalSettings, template }: BaseInf
|
||||
const layoutStyles = {
|
||||
left: { container: "flex items-center justify-between gap-6", leftContent: "flex items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-left min-w-0" },
|
||||
right: { container: "flex items-center justify-between gap-6 flex-row-reverse", leftContent: "flex justify-end items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-right min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-start items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-center items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
};
|
||||
|
||||
const styles = layoutStyles[layout as keyof typeof layoutStyles] || layoutStyles.left;
|
||||
|
||||
@@ -109,7 +109,7 @@ const BaseInfo: React.FC<BaseInfoProps> = ({ basic, globalSettings }) => {
|
||||
</div>
|
||||
)}
|
||||
|
||||
<motion.div layout="position" className="flex flex-wrap items-center justify-end gap-x-6 gap-y-2 uppercase tracking-[0.05em] text-gray-500 mt-1 w-[80%] flex-shrink-0" style={{ fontSize: `${globalSettings?.baseFontSize || 14}px` }}>
|
||||
<motion.div layout="position" className="flex flex-wrap items-center justify-end gap-x-6 gap-y-2 uppercase tracking-[0.05em] text-gray-500 w-[80%] flex-shrink-0" style={{ fontSize: `${globalSettings?.baseFontSize || 14}px` }}>
|
||||
{allFields.map((item) => {
|
||||
const customFieldHref =
|
||||
item.custom && "href" in item && typeof item.href === "string"
|
||||
@@ -117,42 +117,43 @@ const BaseInfo: React.FC<BaseInfoProps> = ({ basic, globalSettings }) => {
|
||||
: null;
|
||||
|
||||
return (
|
||||
<div key={item.key} className="flex items-center gap-2 overflow-hidden">
|
||||
{globalSettings?.useIconMode && (
|
||||
<span className="text-gray-400 shrink-0">
|
||||
{getIcon(item.custom ? (item as any).icon : basic.icons?.[item.key as keyof typeof basic.icons])}
|
||||
</span>
|
||||
)}
|
||||
<div className="truncate min-w-0">
|
||||
{item.key === "email" ? (
|
||||
<a href={`mailto:${item.value}`} className="hover:text-black transition-colors truncate block">
|
||||
{globalSettings?.useIconMode ? "" : `${t(`basicPanel.basicFields.${item.key}`)}: `}
|
||||
{item.value}
|
||||
</a>
|
||||
) : item.key === "website" || item.key === "github" ? (
|
||||
<a href={item.value.startsWith("http") ? item.value : `https://${item.value}`} className="hover:text-black transition-colors truncate block">
|
||||
{globalSettings?.useIconMode ? "" : `${item.label}: `}
|
||||
{item.value.replace(/^https?:\/\//, "")}
|
||||
</a>
|
||||
) : customFieldHref ? (
|
||||
<a href={customFieldHref} target="_blank" rel="noopener noreferrer" className="hover:text-black transition-colors truncate block underline">
|
||||
{item.value}
|
||||
</a>
|
||||
) : (
|
||||
<span className="truncate block">
|
||||
{globalSettings?.useIconMode
|
||||
? ""
|
||||
: item.custom
|
||||
? shouldShowCustomFieldLabelPrefix(item)
|
||||
? `${item.label}: `
|
||||
: ""
|
||||
: `${t(`basicPanel.basicFields.${item.key}`)}: `}
|
||||
{item.value}
|
||||
<div key={item.key} className="flex items-center gap-2 overflow-hidden">
|
||||
{globalSettings?.useIconMode && (
|
||||
<span className="text-gray-400 shrink-0">
|
||||
{getIcon(item.custom ? (item as any).icon : basic.icons?.[item.key as keyof typeof basic.icons])}
|
||||
</span>
|
||||
)}
|
||||
<div className="truncate min-w-0">
|
||||
{item.key === "email" ? (
|
||||
<a href={`mailto:${item.value}`} className="hover:text-black transition-colors truncate block">
|
||||
{globalSettings?.useIconMode ? "" : `${t(`basicPanel.basicFields.${item.key}`)}: `}
|
||||
{item.value}
|
||||
</a>
|
||||
) : item.key === "website" || item.key === "github" ? (
|
||||
<a href={item.value.startsWith("http") ? item.value : `https://${item.value}`} className="hover:text-black transition-colors truncate block">
|
||||
{globalSettings?.useIconMode ? "" : `${item.label}: `}
|
||||
{item.value.replace(/^https?:\/\//, "")}
|
||||
</a>
|
||||
) : customFieldHref ? (
|
||||
<a href={customFieldHref} target="_blank" rel="noopener noreferrer" className="hover:text-black transition-colors truncate block underline">
|
||||
{item.value}
|
||||
</a>
|
||||
) : (
|
||||
<span className="truncate block">
|
||||
{globalSettings?.useIconMode
|
||||
? ""
|
||||
: item.custom
|
||||
? shouldShowCustomFieldLabelPrefix(item)
|
||||
? `${item.label}: `
|
||||
: ""
|
||||
: `${t(`basicPanel.basicFields.${item.key}`)}: `}
|
||||
{item.value}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)})}
|
||||
)
|
||||
})}
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -61,7 +61,7 @@ const BaseInfo = ({ basic = {} as BasicInfo, globalSettings, template }: BaseInf
|
||||
const layoutStyles = {
|
||||
left: { container: "flex items-center justify-between gap-6", leftContent: "flex items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-left min-w-0" },
|
||||
right: { container: "flex items-center justify-between gap-6 flex-row-reverse", leftContent: "flex justify-end items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-right min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-start items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-center items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
};
|
||||
|
||||
const styles = layoutStyles[layout as keyof typeof layoutStyles] || layoutStyles.left;
|
||||
|
||||
@@ -61,7 +61,7 @@ const BaseInfo = ({ basic = {} as BasicInfo, globalSettings, template }: BaseInf
|
||||
const layoutStyles = {
|
||||
left: { container: "flex items-center justify-between gap-6", leftContent: "flex items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-left min-w-0" },
|
||||
right: { container: "flex items-center justify-between gap-6 flex-row-reverse", leftContent: "flex justify-end items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-right min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-start items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-center items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
};
|
||||
|
||||
const styles = layoutStyles[layout as keyof typeof layoutStyles] || layoutStyles.left;
|
||||
|
||||
@@ -61,7 +61,7 @@ const BaseInfo = ({ basic = {} as BasicInfo, globalSettings, template }: BaseInf
|
||||
const layoutStyles = {
|
||||
left: { container: "flex items-center justify-between gap-6", leftContent: "flex items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-left min-w-0" },
|
||||
right: { container: "flex items-center justify-between gap-6 flex-row-reverse", leftContent: "flex justify-end items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-right min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-start items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-center items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
};
|
||||
|
||||
const styles = layoutStyles[layout as keyof typeof layoutStyles] || layoutStyles.left;
|
||||
|
||||
@@ -61,7 +61,7 @@ const BaseInfo = ({ basic = {} as BasicInfo, globalSettings, template }: BaseInf
|
||||
const layoutStyles = {
|
||||
left: { container: "flex items-center justify-between gap-6", leftContent: "flex items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-left min-w-0" },
|
||||
right: { container: "flex items-center justify-between gap-6 flex-row-reverse", leftContent: "flex justify-end items-center gap-6 flex-1 min-w-0", fields: "grid grid-cols-2 gap-x-8 gap-y-2 justify-start shrink-0", nameTitle: "text-right min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-start items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
center: { container: "flex flex-col items-center gap-3", leftContent: "flex flex-col items-center gap-4", fields: "w-full flex justify-center items-center flex-wrap gap-3", nameTitle: "text-center min-w-0" },
|
||||
};
|
||||
|
||||
const styles = layoutStyles[layout as keyof typeof layoutStyles] || layoutStyles.left;
|
||||
|
||||
Reference in New Issue
Block a user