From 081ffcc4a41694f2573f68a1598943c79ab46bcb Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Wed, 30 Oct 2024 16:45:14 +0530 Subject: [PATCH 1/8] fix : update exports in tailwind.config.js file --- dashboard/tailwind.config.js | 134 +++++++++++++++++------------------ 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/dashboard/tailwind.config.js b/dashboard/tailwind.config.js index 0122a7d..0071e42 100644 --- a/dashboard/tailwind.config.js +++ b/dashboard/tailwind.config.js @@ -1,76 +1,74 @@ /** @type {import('tailwindcss').Config} */ -module.exports = { - darkMode: ["class"], - content: [ - './pages/**/*.{ts,tsx}', - './components/**/*.{ts,tsx}', - './app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}', - ], - theme: { - container: { - center: true, - padding: "2rem", - screens: { - "2xl": "1400px", - }, +export const darkMode = ["class"]; +export const content = [ + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', +]; +export const theme = { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", }, - extend: { - colors: { - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", - primary: { - DEFAULT: "hsl(var(--primary))", - foreground: "hsl(var(--primary-foreground))", - }, - secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", - }, - destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", - }, - muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", - }, - accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", - }, - popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", - }, - card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", - }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", }, - keyframes: { - "accordion-down": { - from: { height: 0 }, - to: { height: "var(--radix-accordion-content-height)" }, - }, - "accordion-up": { - from: { height: "var(--radix-accordion-content-height)" }, - to: { height: 0 }, - }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", }, - animation: { - "accordion-down": "accordion-down 0.2s ease-out", - "accordion-up": "accordion-up 0.2s ease-out", + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", }, }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, }, - plugins: [require("tailwindcss-animate")], -} \ No newline at end of file +}; +export const plugins = [import ("tailwindcss-animate")]; \ No newline at end of file From 97c451ba08f3c0d44928505f09d28c20176a0eeb Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Mon, 6 Jan 2025 11:16:29 +0530 Subject: [PATCH 2/8] chore:description field added --- commit/commit/doctype/commit_docs/commit_docs.json | 8 +++++++- dashboard/src/types/commit/CommitDocs.ts | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/commit/commit/doctype/commit_docs/commit_docs.json b/commit/commit/doctype/commit_docs/commit_docs.json index 8a3bdd8..4bb7f43 100644 --- a/commit/commit/doctype/commit_docs/commit_docs.json +++ b/commit/commit/doctype/commit_docs/commit_docs.json @@ -10,6 +10,7 @@ "route", "published", "company_name", + "description", "section_break_camv", "sidebar", "logo_section", @@ -160,11 +161,16 @@ "fieldname": "company_name", "fieldtype": "Data", "label": "Company Name" + }, + { + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Description" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-11-09 12:53:12.416589", + "modified": "2024-12-07 22:34:40.239467", "modified_by": "Administrator", "module": "commit", "name": "Commit Docs", diff --git a/dashboard/src/types/commit/CommitDocs.ts b/dashboard/src/types/commit/CommitDocs.ts index cbc2466..a1bbd40 100644 --- a/dashboard/src/types/commit/CommitDocs.ts +++ b/dashboard/src/types/commit/CommitDocs.ts @@ -45,4 +45,5 @@ export interface CommitDocs{ telegram?: string /** Footer : Table - Commit Docs Footer Item */ footer?: CommitDocsFooterItem[] + description?: string } \ No newline at end of file From 7aff1f06bc16306a0bc8e01fbcc4877aa4abb49f Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Mon, 6 Jan 2025 11:16:51 +0530 Subject: [PATCH 3/8] chore:typography font added --- dashboard/package.json | 1 + dashboard/src/index.css | 2 ++ dashboard/tailwind.config.js | 18 +++++++++++---- dashboard/yarn.lock | 44 +++++++++++++++++++++++++++++++++--- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index 61d44f1..6cde835 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -35,6 +35,7 @@ "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", "@radix-ui/react-tooltip": "^1.0.6", + "@tailwindcss/typography": "^0.5.15", "@tanstack/react-table": "^8.9.3", "@uiw/react-md-editor": "^4.0.4", "cal-sans": "^1.0.1", diff --git a/dashboard/src/index.css b/dashboard/src/index.css index ad472c1..51e370a 100644 --- a/dashboard/src/index.css +++ b/dashboard/src/index.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=Parkinsans:wght@300..800&display=swap'); + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/dashboard/tailwind.config.js b/dashboard/tailwind.config.js index 0071e42..9bdc4be 100644 --- a/dashboard/tailwind.config.js +++ b/dashboard/tailwind.config.js @@ -1,10 +1,12 @@ +import { keyframes } from "framer-motion"; + /** @type {import('tailwindcss').Config} */ export const darkMode = ["class"]; export const content = [ - './pages/**/*.{ts,tsx}', - './components/**/*.{ts,tsx}', - './app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}', + "./pages/**/*.{ts,tsx}", + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}", ]; export const theme = { container: { @@ -15,6 +17,9 @@ export const theme = { }, }, extend: { + fontFamily: { + title_font: ["Parkinsans", "sans-serif"], + }, colors: { border: "hsl(var(--border))", input: "hsl(var(--input))", @@ -71,4 +76,7 @@ export const theme = { }, }, }; -export const plugins = [import ("tailwindcss-animate")]; \ No newline at end of file +export const plugins = [ + import("tailwindcss-animate"), + import("@tailwindcss/typography"), +]; diff --git a/dashboard/yarn.lock b/dashboard/yarn.lock index 97c26b7..621fa4d 100644 --- a/dashboard/yarn.lock +++ b/dashboard/yarn.lock @@ -1413,6 +1413,16 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== +"@tailwindcss/typography@^0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.15.tgz#007ab9870c86082a1c76e5b3feda9392c7c8d648" + integrity sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" + "@tanstack/react-table@^8.9.3": version "8.17.3" resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.17.3.tgz#4e10b4cf5355a40d6d72a83d3f4b3ecd32f56bf4" @@ -3406,6 +3416,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -4688,6 +4703,14 @@ postcss-nested@^6.0.1: dependencies: postcss-selector-parser "^6.0.11" +postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-selector-parser@^6.0.11: version "6.0.16" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" @@ -5264,8 +5287,16 @@ stdin-discarder@^0.1.0: dependencies: bl "^5.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5298,7 +5329,14 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== From 7e0e471edf0ba6cd805116d0e6e1150f1ffabbad Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Mon, 6 Jan 2025 11:17:22 +0530 Subject: [PATCH 4/8] feat:docs landing page --- dashboard/public/man_doodle.png | Bin 0 -> 23260 bytes dashboard/src/App.tsx | 2 + .../docs/LandingPage/DocsLandingPage.tsx | 56 +++++++ .../features/docs/LandingPage/DocsList.tsx | 60 +++++++ .../features/docs/LandingPage/HeroSection.tsx | 34 ++++ .../docs/LandingPage/ShootingStars.tsx | 154 ++++++++++++++++++ 6 files changed, 306 insertions(+) create mode 100644 dashboard/public/man_doodle.png create mode 100644 dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx create mode 100644 dashboard/src/pages/features/docs/LandingPage/DocsList.tsx create mode 100644 dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx create mode 100644 dashboard/src/pages/features/docs/LandingPage/ShootingStars.tsx diff --git a/dashboard/public/man_doodle.png b/dashboard/public/man_doodle.png new file mode 100644 index 0000000000000000000000000000000000000000..058d74b1517df9e1e245aaf46be7e4c9496b5733 GIT binary patch literal 23260 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 literal 0 HcmV?d00001 diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx index fe5e6f1..658087b 100644 --- a/dashboard/src/App.tsx +++ b/dashboard/src/App.tsx @@ -7,6 +7,7 @@ import { AppAPIViewerContainer } from './pages/features/api_viewer/AppAPIViewer' import { CreateERD } from './pages/features/erd/meta/CreateERDForMeta' import ViewDocs from './pages/features/docs/ViewDocs' import { PageNotFound } from './components/common/PageNotFound/PageNotFound' +import DocsLandingPage from './pages/features/docs/LandingPage/DocsLandingPage' function App() { @@ -39,6 +40,7 @@ function App() { } /> } /> } /> + } /> } /> {/* */} diff --git a/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx b/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx new file mode 100644 index 0000000..98e03b4 --- /dev/null +++ b/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx @@ -0,0 +1,56 @@ +import { ErrorBanner } from "@/components/common/ErrorBanner/ErrorBanner"; +import { CommitDocs } from "@/types/commit/CommitDocs"; +import { useFrappeGetDocList } from "frappe-react-sdk"; +import { FullPageLoader } from "@/components/common/FullPageLoader/FullPageLoader"; +import { ShootingStars } from "./ShootingStars"; +import HeroSection from "./HeroSection"; +import DocsList from "./DocsList"; + +const DocsLandingPage = () => { + const { data, error, isLoading } = useFrappeGetDocList( + "Commit Docs", + { + fields: ["*"], + } + ); + + if (error) { + return ; + } + + if (isLoading) { + return ; + } + if (data) { + return ( +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+ ); + } + + return null; +}; + +export default DocsLandingPage; diff --git a/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx b/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx new file mode 100644 index 0000000..a9c075b --- /dev/null +++ b/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx @@ -0,0 +1,60 @@ +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" +import { Button } from "@/components/ui/button"; +import { CommitDocs } from "@/types/commit/CommitDocs" +import { useMemo } from "react" +import { MdArrowOutward } from "react-icons/md"; +import { useNavigate } from "react-router-dom"; + +const DocsList = ({ data }: { data: CommitDocs[] }) => { + return ( +
+ {data.map((item, idx) => ( + + ))} +
+ ) +} + +export default DocsList + +const DocCard = ({ data }: { data: CommitDocs }) => { + + const appNameInitials = useMemo(() => { + return data.header[0].toUpperCase() + }, [data]) + + const navigate = useNavigate() + + return ( +
+
+
+ + + + {appNameInitials} + + +
+ {data.header} +
+ +
+ {data.published == 1 &&
+
+
} +
+
+ {data.description} +
+ +
+ ) +} \ No newline at end of file diff --git a/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx b/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx new file mode 100644 index 0000000..4516ef7 --- /dev/null +++ b/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx @@ -0,0 +1,34 @@ + +import ManDoodle from "../../../../../public/man_doodle.png" +import { Button } from "@/components/ui/button"; + +const HeroSection = () => { + return ( +
+
+
+
+ Documentation is now Lemon Sqeezy +
+
+ Meet Commit Docs, built with Frappe Framework, it is the modern standard for public-facing documentation. Beautiful out of the box, easy to maintain, and Open Source ✨. +
+
+ +
+
+
+ ManDoodle. +
+
+
+ ) +} + +export default HeroSection \ No newline at end of file diff --git a/dashboard/src/pages/features/docs/LandingPage/ShootingStars.tsx b/dashboard/src/pages/features/docs/LandingPage/ShootingStars.tsx new file mode 100644 index 0000000..18a6c8e --- /dev/null +++ b/dashboard/src/pages/features/docs/LandingPage/ShootingStars.tsx @@ -0,0 +1,154 @@ +import { cn } from "@/lib/utils"; +import React, { useEffect, useState, useRef } from "react"; + +interface ShootingStar { + id: number; + x: number; + y: number; + angle: number; + scale: number; + speed: number; + distance: number; +} + +interface ShootingStarsProps { + minSpeed?: number; + maxSpeed?: number; + minDelay?: number; + maxDelay?: number; + starColor?: string; + trailColor?: string; + starWidth?: number; + starHeight?: number; + className?: string; + maxStars?: number; +} + +const getRandomStartPoint = () => { + const side = Math.floor(Math.random() * 4); + const offset = Math.random() * window.innerWidth; + + switch (side) { + case 0: + return { x: offset, y: 0, angle: 45 }; + case 1: + return { x: window.innerWidth, y: offset, angle: 135 }; + case 2: + return { x: offset, y: window.innerHeight, angle: 225 }; + case 3: + return { x: 0, y: offset, angle: 315 }; + default: + return { x: 0, y: 0, angle: 45 }; + } +}; + +export const ShootingStars: React.FC = ({ + minSpeed = 10, + maxSpeed = 30, + minDelay = 1200, + maxDelay = 4200, + starColor = "#9E00FF", + trailColor = "#2EB9DF", + starWidth = 10, + starHeight = 1, + className, + maxStars = 5, // Maximum stars on the screen +}) => { + const [stars, setStars] = useState([]); + const svgRef = useRef(null); + + useEffect(() => { + const createStar = () => { + if (stars.length >= maxStars) return; // Ensure we don't exceed maxStars + + const { x, y, angle } = getRandomStartPoint(); + const newStar: ShootingStar = { + id: Date.now() + Math.random(), // Unique ID + x, + y, + angle, + scale: 1, + speed: Math.random() * (maxSpeed - minSpeed) + minSpeed, + distance: 0, + }; + + setStars((prevStars) => [...prevStars, newStar]); + + const randomDelay = Math.random() * (maxDelay - minDelay) + minDelay; + setTimeout(createStar, randomDelay); + }; + + const timeoutId = setTimeout(createStar, minDelay); + + return () => clearTimeout(timeoutId); + }, [stars.length, minSpeed, maxSpeed, minDelay, maxDelay, maxStars]); + + useEffect(() => { + const moveStars = () => { + setStars((prevStars) => + prevStars + .map((star) => { + const newX = + star.x + star.speed * Math.cos((star.angle * Math.PI) / 180); + const newY = + star.y + star.speed * Math.sin((star.angle * Math.PI) / 180); + const newDistance = star.distance + star.speed; + const newScale = 1 + newDistance / 100; + + // Remove stars that go out of bounds + if ( + newX < -50 || + newX > window.innerWidth + 50 || + newY < -50 || + newY > window.innerHeight + 50 + ) { + return null; + } + + return { + ...star, + x: newX, + y: newY, + distance: newDistance, + scale: newScale, + }; + }) + .filter((star) => star !== null) as ShootingStar[] // Remove null values + ); + + requestAnimationFrame(moveStars); + }; + + const animationFrame = requestAnimationFrame(moveStars); + return () => cancelAnimationFrame(animationFrame); + }, []); + + return ( + + {stars.map((star) => ( + + ))} + + + + + + + + ); +}; From ddb1709ba5720d8dc590c48153846bac3a7029b2 Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Mon, 6 Jan 2025 11:17:37 +0530 Subject: [PATCH 5/8] fix:API path char length --- dashboard/src/components/features/api_viewer/APIDetails.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/src/components/features/api_viewer/APIDetails.tsx b/dashboard/src/components/features/api_viewer/APIDetails.tsx index 3245c83..abcbf2d 100644 --- a/dashboard/src/components/features/api_viewer/APIDetails.tsx +++ b/dashboard/src/components/features/api_viewer/APIDetails.tsx @@ -84,7 +84,7 @@ export const APIDetails = ({ project_branch, endpointData, selectedEndpoint, set
Endpoint :
-
{data?.api_path}
+
{data?.api_path}
{viewerType === 'app' && From 6a8bbaae321095bede365010afae572f1cff80bc Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Tue, 7 Jan 2025 15:20:50 +0530 Subject: [PATCH 6/8] chore : update padding of DocsList and HeroSection. --- .../src/pages/features/docs/LandingPage/DocsLandingPage.tsx | 4 ++-- dashboard/src/pages/features/docs/LandingPage/DocsList.tsx | 4 ++-- dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx b/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx index 98e03b4..328c79a 100644 --- a/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx +++ b/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx @@ -41,8 +41,8 @@ const DocsLandingPage = () => {
-
-
+
+
diff --git a/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx b/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx index a9c075b..a8e53d5 100644 --- a/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx +++ b/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx @@ -7,7 +7,7 @@ import { useNavigate } from "react-router-dom"; const DocsList = ({ data }: { data: CommitDocs[] }) => { return ( -
+
{data.map((item, idx) => ( ))} @@ -26,7 +26,7 @@ const DocCard = ({ data }: { data: CommitDocs }) => { const navigate = useNavigate() return ( -
+
diff --git a/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx b/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx index 4516ef7..db1d566 100644 --- a/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx +++ b/dashboard/src/pages/features/docs/LandingPage/HeroSection.tsx @@ -5,7 +5,7 @@ import { Button } from "@/components/ui/button"; const HeroSection = () => { return (
-
+
Documentation is now Lemon Sqeezy From 08e1b9e9889e31627462b5acd5fb28a1eec1360d Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Tue, 7 Jan 2025 15:27:36 +0530 Subject: [PATCH 7/8] chore : change button to anchor tag. --- .../src/pages/features/docs/LandingPage/DocsList.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx b/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx index a8e53d5..f43ea73 100644 --- a/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx +++ b/dashboard/src/pages/features/docs/LandingPage/DocsList.tsx @@ -38,14 +38,13 @@ const DocCard = ({ data }: { data: CommitDocs }) => {
{data.header}
- +
{data.published == 1 &&
From 8617388b27a56ad2c1d1ca6db59b065084c2432b Mon Sep 17 00:00:00 2001 From: pardeshi-aditya Date: Tue, 7 Jan 2025 15:28:17 +0530 Subject: [PATCH 8/8] chore : fetch only the fields that are used. --- .../src/pages/features/docs/LandingPage/DocsLandingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx b/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx index 328c79a..6f88c38 100644 --- a/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx +++ b/dashboard/src/pages/features/docs/LandingPage/DocsLandingPage.tsx @@ -10,7 +10,7 @@ const DocsLandingPage = () => { const { data, error, isLoading } = useFrappeGetDocList( "Commit Docs", { - fields: ["*"], + fields: ["header", "light_mode_logo", "route", "published", "description"], } );