diff --git a/README.md b/README.md
index 58be1fa1..72a45f78 100644
--- a/README.md
+++ b/README.md
@@ -1,62 +1,25 @@

-
欢迎使用im.dev
-
这里有最新的技术资讯、最好的开发教程,我们的目标是打造最优秀的开发者社区👩🏽💻
+
欢迎来到im.dev
+
我们的目标是打造世界上最好的开发者社区
Made with ❤️ by developers for developers
## 🗞 im.dev
-- 官方域名:https://im.dev (im.dev = I'm dev = 我是开发)
-- 国际域名:https://codecc.com (code see see)
+#### website
+- https://im.dev
-im.dev是一个开源社区,为开发者提供最新、最好的技术资讯和文章,同时支持通过chrome浏览器插件的方式来使用,只要打开新的标签页,就能看到最新的技术资讯。
-im.dev会从世界各大技术网站上收集优秀的文章,进行集中呈现,因此im.dev不是一个传统的博客平台,更类似一个技术分享社区,例如:只要你的网站积分达到了要求,就可以成为im.dev的编辑,将你喜欢的文章推荐分享给更多的用户。
-
-作为一个用户,你可以阅读、收藏、自定义喜好、评论和点赞等。作为一个编辑,你可以录入外部的文章链接,这篇文章将得到用户的评判,好的评判可以帮你获取积分和奖励,差的评判会影响你的积分,甚至编辑身份。
-
-在im.dev,我们最关心的:
-* 🌟 **跨平台**: 支持多个平台上使用,网页、谷歌浏览器插件、手机app
-* ♾ **质量**: 现在滥竽充数的技术文章太多了,有些是过时信息,有些是毫无营养的垃圾,有些甚至包含了技术上的谬误,因此内容质量是最重要的,这也是我们为啥采用分享和推荐的方式,只有优秀的精品才能在im.dev被分享,被推荐
-* 🧵 **开源**: im.dev是完全开源的,我们相信最好的开发者社区永远是广大开发者一起参与打造的,你的地盘,你说了算,因此欢迎大家参与到im.dev中来,亲自打造你想要的开发者社区!
-
-
-## 📯 设计理念
-我们作为开发者,会花费大量时间寻找有价值的文章和博客,这些时间往往都被浪费了,本来时间就有限再加上时间的浪费,导致大多数人很难跟得上开发技术日新月异的发展速度。
-
-因此im.dev想到了一个办法:那就是让一部分人分享他们看过的优秀内容,同时引入一套评价机制,确保分享出来的都是真正的精品。最终,分享者收获荣誉和奖励,普通用户节约了时间、收获了内容。
-
-* 👨💻 推送最新的技术内容
-* ⏳ 帮用户节省时间
-* 📰 通过评价机制留下精品内容
-
-
-## 🗂 技术剖析
-
-下面是我们在im.dev中用到的技术栈
-* 🎨 **Web端** Typescript + React + Next.js + Antd
-* 🌳 **服务器端** Go + Mysql
-* 🔍 **站内搜索** Algolia
-* 🚨 **移动APP** Flutter
-
-为了方便扩展和社区贡献,在im.dev中大量使用了插件的形式,例如用户可以打造自己的个性化主页,编辑可以设置个性化的文章展示等。
-
-## 🙌 想要参与到im.dev中来吗?
-
-我们欢迎所有类型的贡献,例如:
-* 🤔 功能建议和反馈
-* 🐛 申请成为编辑
-* 📖 文档改进
-* 👨💻 代码贡献
-
-在参与贡献之前,请花些时间阅读我们的[贡献者指南](docs/contributing.md)。
-
-
-## 🎩 核心开发者
-
-来看看我们的核心开发者,喜欢的话可以给他们个follow👋:
-* [@sunface](https://github.com/sunface)
+im.dev是专门为开发者打造的技术社区,针对目前市场上的博客平台/开发社区存在的问题,im.dev解决了以下核心痛点:
+1. 支持多种登录方式,默认使用github直接登录,无需繁琐的手机/邮箱认证
+2. 开源版本可以直接在公司、组织内部搭建使用,功能强大
+3. Github实时备份, 用户可以关联自己的个人仓库,im.dev会自动将你创作的内容进行同步
+4. 支持多种类型的创作形式:博文、系列文章、书籍等
+5. 原生markdown编辑器,同时提供了各种小组件,帮助你拥有更加强大的创作表现能力
+6. 打造自己的个性化博客主页
+7. 帮助创作者盈利
+8. 社区功能不再固化,用户可以亲自参与到im.dev的开源开发中,或者在线提出建议
## 📑 License
diff --git a/src/utils/config.ts b/configs/config.ts
similarity index 82%
rename from src/utils/config.ts
rename to configs/config.ts
index 67fa8924..bd10d98c 100644
--- a/src/utils/config.ts
+++ b/configs/config.ts
@@ -1,6 +1,7 @@
-import { requestApi } from "./axios/request"
+import { requestApi } from "../src/utils/axios/request"
export let config = {
+ appName: "im.dev",
commonMaxlen: 255,
posts: {
titleMaxLen: 128,
diff --git a/layouts/nav/nav.tsx b/layouts/nav/nav.tsx
index bf5aa698..b2ff91e8 100644
--- a/layouts/nav/nav.tsx
+++ b/layouts/nav/nav.tsx
@@ -65,8 +65,8 @@ function HeaderContent() {
-
- {navLinks.map(link => {link.title})}
+
+ {navLinks.map(link => {link.title})}
@@ -76,7 +76,7 @@ function HeaderContent() {
align="center"
color={useColorModeValue("gray.500", "gray.400")}
>
-
+ {/* */}
}
/>
diff --git a/layouts/nav/vertical-nav.tsx b/layouts/nav/vertical-nav.tsx
index 0866808d..6b88320a 100644
--- a/layouts/nav/vertical-nav.tsx
+++ b/layouts/nav/vertical-nav.tsx
@@ -115,7 +115,7 @@ import { getSvgIcon } from "components/svg-icon"
/> */}
-
+ {/* */}
>
)
}
diff --git a/layouts/page-container1.tsx b/layouts/page-container1.tsx
index fe47742e..218af42d 100644
--- a/layouts/page-container1.tsx
+++ b/layouts/page-container1.tsx
@@ -34,8 +34,6 @@ type PageContainerProps = PropsOf & {
function PageContainer1(props: PageContainerProps) {
const { children ,nav, ...rest} = props
useHeadingFocusOnRouteChange()
- const [isSmallScreen] = useMediaQuery("(max-width: 768px)")
- const header = isSmallScreen ? :
return (
<>
- {header}
-
+
+
+
{children}
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 2192aaea..e127d5a0 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -8,7 +8,7 @@ import theme from "theme"
import FontFace from "src/components/font-face"
import { getSeo } from "utils/seo"
import GAScript from "analytics/ga-script"
-import {initUIConfig} from 'src/utils/config'
+import {initUIConfig} from 'configs/config'
Router.events.on("routeChangeComplete", (url) => {
trackPageview(url)
diff --git a/pages/admin/tag/[id].tsx b/pages/admin/tag/[id].tsx
index 9e736de2..28c0cae2 100644
--- a/pages/admin/tag/[id].tsx
+++ b/pages/admin/tag/[id].tsx
@@ -6,7 +6,7 @@ import { EditMode } from 'src/types/editor';
import { MarkdownRender } from 'components/markdown-editor/render';
import { requestApi } from 'utils/axios/request';
import { useRouter } from 'next/router';
-import { config } from 'utils/config';
+import { config } from 'configs/config';
import { cloneDeep } from 'lodash';
import { FaMoon, FaSun } from 'react-icons/fa';
import Link from 'next/link';
diff --git a/pages/admin/tags.tsx b/pages/admin/tags.tsx
index 9320d707..5e496ccd 100644
--- a/pages/admin/tags.tsx
+++ b/pages/admin/tags.tsx
@@ -6,7 +6,7 @@ import Sidebar from "layouts/sidebar/sidebar"
import React, { useEffect, useState } from "react"
import {adminLinks} from "src/data/links"
import { requestApi } from "utils/axios/request"
-import TagCard from "components/posts/tag-edit-card"
+import TagCard from "components/tags/tag-card"
import { Post } from "src/types/posts"
import { useRouter } from "next/router"
import Link from "next/link"
diff --git a/pages/editor/post/[id].tsx b/pages/editor/post/[id].tsx
index 27130b69..0e3c0d1d 100644
--- a/pages/editor/post/[id].tsx
+++ b/pages/editor/post/[id].tsx
@@ -8,7 +8,7 @@ import { MarkdownRender } from 'components/markdown-editor/render';
import { Post } from 'src/types/posts';
import { requestApi } from 'utils/axios/request';
import { useRouter } from 'next/router';
-import { config } from 'utils/config';
+import { config } from 'configs/config';
import { cloneDeep } from 'lodash';
import Card from 'components/card';
diff --git a/pages/editor/posts.tsx b/pages/editor/posts.tsx
index 1a768218..bc030a77 100644
--- a/pages/editor/posts.tsx
+++ b/pages/editor/posts.tsx
@@ -8,7 +8,7 @@ import {editorLinks} from "src/data/links"
import { requestApi } from "utils/axios/request"
import { useDisclosure } from "@chakra-ui/react"
import { Field, Form, Formik } from "formik"
-import { config } from "utils/config"
+import { config } from "configs/config"
import TextPostCard from "components/posts/text-post-card"
import { Post } from "src/types/posts"
import { FaExternalLinkAlt, FaRegEdit } from "react-icons/fa"
diff --git a/pages/index.tsx b/pages/index.tsx
index daafabce..83ea1ab8 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -13,14 +13,15 @@ import PostCard from "components/posts/post-card"
import Posts from "components/posts/posts"
import SimplePostCard from "components/posts/simple-post-card"
import SEO from "components/seo"
+import { getSvgIcon } from "components/svg-icon"
import siteConfig from "configs/site-config"
import PageContainer1 from "layouts/page-container1"
import React, { useEffect, useState } from "react"
-import { PostFilter } from "src/types/posts"
+import { PostFilter } from "src/types/posts"
import { requestApi } from "utils/axios/request"
const HomePage = () => {
- const [posts,setPosts] = useState([])
+ const [posts, setPosts] = useState([])
const [filter, setFilter] = useState(PostFilter.Best)
const initData = async () => {
const res = await requestApi.get(`/home/posts/${filter}`)
@@ -29,7 +30,7 @@ const HomePage = () => {
useEffect(() => {
initData()
- },[filter])
+ }, [filter])
return (
<>
@@ -43,9 +44,9 @@ const HomePage = () => {
-
-
-
+
+
+
+
+
+
+
+
)
}
\ No newline at end of file
diff --git a/pages/settings/profile.tsx b/pages/settings/profile.tsx
index 20ea49b1..d5a0b34c 100644
--- a/pages/settings/profile.tsx
+++ b/pages/settings/profile.tsx
@@ -6,7 +6,7 @@ import Sidebar from "layouts/sidebar/sidebar"
import React, { useEffect, useState } from "react"
import { adminLinks, settingLinks } from "src/data/links"
import { requestApi } from "utils/axios/request"
-import TagCard from "components/posts/tag-edit-card"
+import TagCard from "components/tags/tag-card"
import { Post } from "src/types/posts"
import { useRouter } from "next/router"
import Link from "next/link"
@@ -15,7 +15,7 @@ import { Tag } from "src/types/tag"
import { route } from "next/dist/next-server/server/router"
import { Field, Form, Formik } from "formik"
import useSession from "hooks/use-session"
-import { config } from "utils/config"
+import { config } from "configs/config"
import Tags from "components/tags/tags"
var validator = require('validator');
diff --git a/pages/tags/[name].tsx b/pages/tags/[name].tsx
index ff8c738a..c68d8f03 100644
--- a/pages/tags/[name].tsx
+++ b/pages/tags/[name].tsx
@@ -50,8 +50,8 @@ const UserPage = () => {
-
-
+
+
{tag.title}
diff --git a/pages/tags/index.tsx b/pages/tags/index.tsx
index f1d40462..2d1bc701 100644
--- a/pages/tags/index.tsx
+++ b/pages/tags/index.tsx
@@ -1,25 +1,106 @@
-import { chakra, HStack, VStack } from "@chakra-ui/react"
+import {
+ chakra, Flex, Heading, HStack, Text, VStack, Menu,
+ MenuButton,
+ MenuList,
+ MenuItem,
+ IconButton,
+ Divider
+} from "@chakra-ui/react"
import SEO from "components/seo"
import siteConfig from "configs/site-config"
import PageContainer1 from "layouts/page-container1"
-import React from "react"
-import {HomeSidebar} from 'pages/index'
-
-const TagsPage = () => (
- <>
-
-
-
-
-
-
-
-
- >
-)
+import React, { useEffect, useState } from "react"
+import { HomeSidebar } from 'pages/index'
+import Card from "components/card"
+import { config } from "configs/config"
+import { getSvgIcon } from "components/svg-icon"
+import { Tag } from "src/types/tag"
+import { requestApi } from "utils/axios/request"
+import TagCard from 'src/components/tags/tag-card'
+
+const tagsFilter = [{
+ name: 'Popular',
+ desc: 'Extremely active tags in terms of posts in the last 7 days.'
+},
+{
+ name: "Recently Added",
+ desc: "Tags that are recently added, sorted from newest to oldest."
+},
+{
+ name: "Most Followers",
+ desc: "Tags with the maximum number of followers and posts all time.",
+},
+{
+ name: "New Proposals",
+ desc: "Follow these tags to cast your vote. We periodically approve tags based on community interest."
+}
+]
+
+const TagsPage = () => {
+ const [filter, setFilter] = useState(tagsFilter[0])
+ const [tags, setTags]: [Tag[], any] = useState([])
+ const getTags = () => {
+ requestApi.get(`/tags`).then((res) => setTags(res.data)).catch(_ => setTags([]))
+ }
+
+ useEffect(() => {
+ getTags()
+ }, [filter])
+
+ return (
+ <>
+
+
+
+
+
+
+ Tags On {config.appName}
+ Join communities on {config.appName}. Follow tags that interest you.
+
+
+
+
+
+
+ {filter.name}
+ {filter.desc}
+ List updated daily at midnight PST.
+
+
+
+
+
+
+ {tags.map(t => )}
+
+
+
+
+
+
+ >
+ )
+}
export default TagsPage
diff --git a/server/internal/tags/tags.go b/server/internal/tags/tags.go
index 8670fe5b..9418f757 100644
--- a/server/internal/tags/tags.go
+++ b/server/internal/tags/tags.go
@@ -69,7 +69,7 @@ func SubmitTag(tag *models.Tag) *e.Error {
func GetTags() (models.Tags, *e.Error) {
tags := make(models.Tags, 0)
- rows, err := db.Conn.Query("SELECT id,creator,title,name,icon,cover,created,updated from tags")
+ rows, err := db.Conn.Query("SELECT id,creator,title,md,name,icon,cover,created,updated from tags")
if err != nil {
if err == sql.ErrNoRows {
return tags, nil
@@ -79,13 +79,18 @@ func GetTags() (models.Tags, *e.Error) {
}
for rows.Next() {
+ var rawMd []byte
tag := &models.Tag{}
- err := rows.Scan(&tag.ID, &tag.Creator, &tag.Title, &tag.Name, &tag.Icon, &tag.Cover, &tag.Created, &tag.Updated)
+ err := rows.Scan(&tag.ID, &tag.Creator, &tag.Title, &rawMd, &tag.Name, &tag.Icon, &tag.Cover, &tag.Created, &tag.Updated)
if err != nil {
logger.Warn("scan tags error", "error", err)
continue
}
+ md, _ := utils.Uncompress(rawMd)
+ tag.Md = string(md)
+
+ tag.SetCover()
tags = append(tags, tag)
db.Conn.QueryRow("SELECT count(*) FROM tag_post WHERE tag_id=?", tag.ID).Scan(&tag.PostCount)
@@ -125,5 +130,6 @@ func GetTag(id int64, name string) (*models.Tag, *e.Error) {
db.Conn.QueryRow("SELECT count(*) FROM tag_post WHERE tag_id=?", tag.ID).Scan(&tag.PostCount)
+ tag.SetCover()
return tag, nil
}
diff --git a/server/internal/ui_config.go b/server/internal/ui_config.go
index b2b645c5..6acf76db 100644
--- a/server/internal/ui_config.go
+++ b/server/internal/ui_config.go
@@ -9,6 +9,7 @@ import (
)
type UIConfig struct {
+ AppName string `json:"appName"`
CommonMaxLen int `json:"commonMaxlen"`
Posts *PostsConfig `json:"posts"`
User *UserConfig `json:"user"`
@@ -29,6 +30,7 @@ type UserConfig struct {
// 在后台页面配置,存储到mysql中
func GetUIConfig(c *gin.Context) {
conf := &UIConfig{
+ AppName: config.Data.Common.AppName,
CommonMaxLen: 255,
Posts: &PostsConfig{
TitleMaxLen: config.Data.Posts.TitleMaxLen,
diff --git a/server/pkg/config/config.go b/server/pkg/config/config.go
index 07584186..f2e13020 100644
--- a/server/pkg/config/config.go
+++ b/server/pkg/config/config.go
@@ -15,6 +15,7 @@ type Config struct {
Version string
LogLevel string `yaml:"log_level"`
IsProd bool `yaml:"is_prod"`
+ AppName string `yaml:"app_name"`
}
User struct {
diff --git a/server/pkg/models/defaut_images.go b/server/pkg/models/defaut_images.go
new file mode 100644
index 00000000..2e74d85a
--- /dev/null
+++ b/server/pkg/models/defaut_images.go
@@ -0,0 +1,7 @@
+package models
+
+const DefaultTagCover = "https://cdn.hashnode.com/res/hashnode/image/upload/v1605308227907/y6yl3YLT4.png?w=1600&h=320&fit=crop&crop=entropy&auto=compress&auto=compress"
+
+//users
+const DefaultAvatar = "https://cdn.hashnode.com/res/hashnode/image/upload/v1600792675173/rY-APy9Fc.png?auto=compress"
+const DefaultCover = "https://cdn.hashnode.com/res/hashnode/image/upload/v1604243390177/JstCbDgbK.jpeg?w=1600&fit=crop&crop=entropy&auto=compress"
diff --git a/server/pkg/models/tag.go b/server/pkg/models/tag.go
index 61ec34bb..7691297c 100644
--- a/server/pkg/models/tag.go
+++ b/server/pkg/models/tag.go
@@ -15,6 +15,12 @@ type Tag struct {
Updated time.Time `json:"updated"`
}
+func (t *Tag) SetCover() {
+ if t.Cover == "" {
+ t.Cover = DefaultTagCover
+ }
+}
+
type Tags []*Tag
func (t Tags) Len() int { return len(t) }
diff --git a/server/pkg/models/user.go b/server/pkg/models/user.go
index 43952032..04cfe82e 100644
--- a/server/pkg/models/user.go
+++ b/server/pkg/models/user.go
@@ -34,9 +34,6 @@ type User struct {
Created time.Time `json:"created"`
}
-const DefaultAvatar = "https://cdn.hashnode.com/res/hashnode/image/upload/v1600792675173/rY-APy9Fc.png?auto=compress"
-const DefaultCover = "https://cdn.hashnode.com/res/hashnode/image/upload/v1604243390177/JstCbDgbK.jpeg?w=1600&fit=crop&crop=entropy&auto=compress"
-
func (user *User) Query(id int64, username string, email string) error {
err := db.Conn.QueryRow(`SELECT id,username,role,nickname,email,avatar,last_seen_at,created FROM user WHERE id=? or username=? or email=?`,
id, username, email).Scan(&user.ID, &user.Username, &user.Role, &user.Nickname, &user.Email, &user.Avatar, &user.LastSeenAt, &user.Created)
diff --git a/src/components/markdown-editor/editor.tsx b/src/components/markdown-editor/editor.tsx
index c3bb7c02..feac5c5c 100644
--- a/src/components/markdown-editor/editor.tsx
+++ b/src/components/markdown-editor/editor.tsx
@@ -23,7 +23,6 @@ type Props = PropsOf & {
export function MarkdownEditor(props: Props) {
- const bg = useColorModeValue(userCustomTheme.hoverBg.light,userCustomTheme.hoverBg.dark)
const [at,setAt] = useState('')
const [atUsers,setAtUsers]:[User[],any] = useState([])
@@ -142,7 +141,7 @@ export function MarkdownEditor(props: Props) {
{
atUsers.map(user =>
- selectAtUser(user)} _hover={{bg: bg}}>
+ selectAtUser(user)} className="hover-bg">
{user.nickname !== '' && {user.nickname}}
diff --git a/src/components/markdown-editor/render.tsx b/src/components/markdown-editor/render.tsx
index 99a7925c..88b96896 100644
--- a/src/components/markdown-editor/render.tsx
+++ b/src/components/markdown-editor/render.tsx
@@ -6,7 +6,7 @@ import { chakra,PropsOf} from '@chakra-ui/react';
import WebsiteLink from 'components/website-link';
import { cloneDeep, find, findIndex } from 'lodash';
import { isUsernameChar } from 'utils/user';
-import { config } from 'utils/config';
+import { config } from 'configs/config';
type Props = PropsOf & {
diff --git a/src/components/posts/posts.tsx b/src/components/posts/posts.tsx
index 8a5557e7..57a2ed8f 100644
--- a/src/components/posts/posts.tsx
+++ b/src/components/posts/posts.tsx
@@ -19,8 +19,8 @@ export const Posts = (props: Props) => {
return (
<>
- {posts.map(post =>
-
+ {posts.map((post,i) =>
+
)}
diff --git a/src/components/posts/tag-edit-card.tsx b/src/components/posts/tag-edit-card.tsx
deleted file mode 100644
index 371732b4..00000000
--- a/src/components/posts/tag-edit-card.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import React from "react"
-import {chakra, Heading, Image, Text, HStack,Button, Flex,PropsOf,Link} from "@chakra-ui/react"
-import { Tag } from "src/types/tag"
-import { ReserveUrls } from "src/data/reserve-urls"
-import NextLink from "next/link"
-
-type Props = PropsOf & {
- tag: Tag
- showActions: boolean
- onEdit?: any
- onDelete?: any
-}
-
-
-export const TagCard= (props:Props) =>{
- const {tag,showActions,onEdit,onDelete, ...rest} = props
-
- return (
-
-
-
-
- {tag.title}
-
-
- {props.showActions &&
-
-
- }
-
- )
-}
-
-export default TagCard
diff --git a/src/components/posts/tag-list-card.tsx b/src/components/posts/tag-list-card.tsx
index 9c4d4bda..3d81effc 100644
--- a/src/components/posts/tag-list-card.tsx
+++ b/src/components/posts/tag-list-card.tsx
@@ -9,7 +9,7 @@ interface Props {
}
-export const TagCard= (props:Props) =>{
+export const TagListCard= (props:Props) =>{
const {tag} = props
return (
@@ -25,4 +25,4 @@ export const TagCard= (props:Props) =>{
)
}
-export default TagCard
+export default TagListCard
diff --git a/src/components/svg-icon.tsx b/src/components/svg-icon.tsx
index f15e57c7..2e9871e5 100644
--- a/src/components/svg-icon.tsx
+++ b/src/components/svg-icon.tsx
@@ -1,6 +1,9 @@
export function getSvgIcon(name,height="1.4rem") {
let svg
switch (name) {
+ case "hot":
+ svg =
+ break
case "home":
svg =
break
@@ -16,6 +19,12 @@ export function getSvgIcon(name,height="1.4rem") {
case "explore":
svg =
break
+ case "feature":
+ svg =
+ break
+ case "recent":
+ svg =
+ break
default:
break;
}
diff --git a/src/components/tags/tag-card.tsx b/src/components/tags/tag-card.tsx
new file mode 100644
index 00000000..0fb7746a
--- /dev/null
+++ b/src/components/tags/tag-card.tsx
@@ -0,0 +1,40 @@
+import React from "react"
+import {chakra, Heading, Image, Text, HStack,Button, Flex,PropsOf, Box, Tooltip, Tag as ChakraTag, useColorModeValue} from "@chakra-ui/react"
+import { Tag } from "src/types/tag"
+import { ReserveUrls } from "src/data/reserve-urls"
+import NextLink from "next/link"
+import userCustomTheme from "theme/user-custom"
+
+type Props = PropsOf & {
+ tag: Tag
+ showActions?: boolean
+ onEdit?: any
+ onDelete?: any
+}
+
+
+export const TagCard= (props:Props) =>{
+ const {tag,showActions=false,onEdit,onDelete} = props
+ return (
+
+
+
+
+
+ {tag.title}
+ {tag.md}
+
+
+
+ {showActions ?
+
+
+
+ :
+ {tag.postCount} posts
+ }
+
+ )
+}
+
+export default TagCard
diff --git a/src/components/tags/tag-input.tsx b/src/components/tags/tag-input.tsx
index eee46fc6..35f992ab 100644
--- a/src/components/tags/tag-input.tsx
+++ b/src/components/tags/tag-input.tsx
@@ -4,7 +4,7 @@ import { Tag } from "src/types/tag"
import { requestApi } from "utils/axios/request"
import { cloneDeep, findIndex } from "lodash"
import TagCard from 'src/components/posts/tag-list-card'
-import { config } from "utils/config"
+import { config } from "configs/config"
interface Props {
options: Tag[]
selected: Tag[]
diff --git a/src/components/website-link.tsx b/src/components/website-link.tsx
index be429372..6c73bc31 100644
--- a/src/components/website-link.tsx
+++ b/src/components/website-link.tsx
@@ -26,7 +26,7 @@ export const WebsiteLink = ({type, url,...rest}: Props) => {
break;
}
return (
-
+
{icon0}
{title}
diff --git a/theme.ts b/theme.ts
index f6cbe238..f2e700e0 100644
--- a/theme.ts
+++ b/theme.ts
@@ -3,6 +3,7 @@ import { mode } from "@chakra-ui/theme-tools"
import markdownEditor from 'theme/markdown-editor'
import markdownRender from 'theme/markdown-render'
import layerStyles from 'theme/layer-styles'
+import userCustomTheme from "theme/user-custom"
const customTheme = extendTheme({
config: {
@@ -22,6 +23,18 @@ const customTheme = extendTheme({
},
styles: {
global: (props) => ({
+ '.hover-bg:hover': {
+ background: mode(userCustomTheme.hoverBg.light,userCustomTheme.hoverBg.dark )(props),
+ borderRadius: '6px'
+ },
+ '.bordered' : {
+ border: `1px solid ${mode(userCustomTheme.borderColor.light,userCustomTheme.borderColor.dark )(props)}`,
+ borderRadius: '6px'
+ },
+ '.shadowed': {
+ boxShadow: 'rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px',
+ borderRadius: '6px'
+ },
body: {
background: mode("white","gray.800" )(props),
color: mode("gray.700", "whiteAlpha.900")(props),