doccupine 0.0.75 → 0.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/structures.js +4 -0
- package/dist/templates/components/MDXComponents.d.ts +1 -1
- package/dist/templates/components/MDXComponents.js +3 -0
- package/dist/templates/components/layout/ColorSwatch.d.ts +1 -0
- package/dist/templates/components/layout/ColorSwatch.js +95 -0
- package/dist/templates/components/layout/SharedStyles.d.ts +1 -1
- package/dist/templates/components/layout/SharedStyles.js +1 -1
- package/dist/templates/mdx/color-swatches.mdx.d.ts +1 -0
- package/dist/templates/mdx/color-swatches.mdx.js +75 -0
- package/dist/templates/mdx/components.mdx.d.ts +1 -1
- package/dist/templates/mdx/components.mdx.js +3 -0
- package/package.json +1 -1
package/dist/lib/structures.js
CHANGED
|
@@ -27,6 +27,7 @@ import { calloutTemplate } from "../templates/components/layout/Callout.js";
|
|
|
27
27
|
import { cardTemplate } from "../templates/components/layout/Card.js";
|
|
28
28
|
import { cherryThemeProviderTemplate } from "../templates/components/layout/CherryThemeProvider.js";
|
|
29
29
|
import { clientThemeProviderTemplate } from "../templates/components/layout/ClientThemeProvider.js";
|
|
30
|
+
import { colorSwatchTemplate } from "../templates/components/layout/ColorSwatch.js";
|
|
30
31
|
import { codeTemplate } from "../templates/components/layout/Code.js";
|
|
31
32
|
import { columnsTemplate } from "../templates/components/layout/Columns.js";
|
|
32
33
|
import { demoThemeTemplate } from "../templates/components/layout/DemoTheme.js";
|
|
@@ -66,6 +67,7 @@ import { buttonsMdxTemplate } from "../templates/mdx/buttons.mdx.js";
|
|
|
66
67
|
import { calloutsMdxTemplate } from "../templates/mdx/callouts.mdx.js";
|
|
67
68
|
import { cardsMdxTemplate } from "../templates/mdx/cards.mdx.js";
|
|
68
69
|
import { codeMdxTemplate } from "../templates/mdx/code.mdx.js";
|
|
70
|
+
import { colorSwatchesMdxTemplate } from "../templates/mdx/color-swatches.mdx.js";
|
|
69
71
|
import { columnsMdxTemplate } from "../templates/mdx/columns.mdx.js";
|
|
70
72
|
import { commandsMdxTemplate } from "../templates/mdx/commands.mdx.js";
|
|
71
73
|
import { componentsMdxTemplate } from "../templates/mdx/components.mdx.js";
|
|
@@ -146,6 +148,7 @@ export const appStructure = {
|
|
|
146
148
|
"components/layout/Card.tsx": cardTemplate,
|
|
147
149
|
"components/layout/CherryThemeProvider.tsx": cherryThemeProviderTemplate,
|
|
148
150
|
"components/layout/ClientThemeProvider.tsx": clientThemeProviderTemplate,
|
|
151
|
+
"components/layout/ColorSwatch.tsx": colorSwatchTemplate,
|
|
149
152
|
"components/layout/Code.tsx": codeTemplate,
|
|
150
153
|
"components/layout/Columns.tsx": columnsTemplate,
|
|
151
154
|
"components/layout/DemoTheme.tsx": demoThemeTemplate,
|
|
@@ -174,6 +177,7 @@ export const startingDocsStructure = {
|
|
|
174
177
|
"callouts.mdx": calloutsMdxTemplate,
|
|
175
178
|
"cards.mdx": cardsMdxTemplate,
|
|
176
179
|
"code.mdx": codeMdxTemplate,
|
|
180
|
+
"color-swatches.mdx": colorSwatchesMdxTemplate,
|
|
177
181
|
"columns.mdx": columnsMdxTemplate,
|
|
178
182
|
"commands.mdx": commandsMdxTemplate,
|
|
179
183
|
"components.mdx": componentsMdxTemplate,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const mdxComponentsTemplate = "import React from \"react\";\nimport Link from \"next/link\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MDXComponents = Record<string, React.ComponentType<any>>;\nimport { Space } from \"cherry-styled-components\";\nimport { Code as CodeBlock } from \"@/components/layout/Code\";\nimport { Card } from \"@/components/layout/Card\";\nimport { Accordion } from \"@/components/layout/Accordion\";\nimport { Tabs, TabContent } from \"@/components/layout/Tabs\";\nimport { Callout } from \"@/components/layout/Callout\";\nimport { Icon } from \"@/components/layout/Icon\";\nimport { Columns } from \"@/components/layout/Columns\";\nimport { Field } from \"@/components/layout/Field\";\nimport { Update } from \"@/components/layout/Update\";\nimport { Steps, Step } from \"@/components/layout/Steps\";\nimport { Button } from \"@/components/layout/Button\";\nimport { DemoTheme } from \"@/components/layout/DemoTheme\";\n\ninterface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n children?: React.ReactNode;\n}\n\ninterface PreProps extends React.HTMLAttributes<HTMLPreElement> {\n children?: React.ReactNode;\n}\n\nfunction extractAllTextFromChildren(children: React.ReactNode): string {\n if (children == null) return \"\";\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (typeof children === \"boolean\") return \"\";\n if (Array.isArray(children))\n return children.map(extractAllTextFromChildren).join(\"\");\n if (React.isValidElement(children)) {\n const element = children as React.ReactElement<{\n children?: React.ReactNode;\n }>;\n return extractAllTextFromChildren(element.props.children);\n }\n return \"\";\n}\n\nfunction generateId(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .trim();\n}\n\n// Map <pre><code class=\"language-xyz\"> to our <Code /> component\nfunction Pre(props: PreProps) {\n const child = React.Children.only(props.children) as React.ReactElement<{\n className?: string;\n children?: React.ReactNode;\n }> | null;\n if (child && child.type === \"code\") {\n const className = child.props.className || \"\";\n const match = /language-(\\w+)/.exec(className);\n const language = match ? match[1] : undefined;\n const code = extractAllTextFromChildren(child.props.children).replace(\n /\\n$/,\n \"\",\n );\n if (language) {\n return (\n <CodeBlock className={className} code={code} language={language} />\n );\n }\n }\n return <pre {...props} />;\n}\n\nexport function useMDXComponents(components: MDXComponents): MDXComponents {\n return {\n // Headings with auto-generated ids for TOC and deep links\n h1: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h1 id={id} {...props}>\n {children}\n </h1>\n );\n },\n h2: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h2 id={id} {...props}>\n {children}\n </h2>\n );\n },\n h3: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h3 id={id} {...props}>\n {children}\n </h3>\n );\n },\n h4: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h4 id={id} {...props}>\n {children}\n </h4>\n );\n },\n h5: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h5 id={id} {...props}>\n {children}\n </h5>\n );\n },\n h6: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h6 id={id} {...props}>\n {children}\n </h6>\n );\n },\n\n // Links - use Next.js Link for internal paths\n a: ({\n href,\n children,\n ...props\n }: React.AnchorHTMLAttributes<HTMLAnchorElement>) => {\n if (href && href.startsWith(\"/\")) {\n return (\n <Link href={href} {...props}>\n {children}\n </Link>\n );\n }\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...props}>\n {children}\n </a>\n );\n },\n\n // Tables - wrap in a div for responsive overflow\n table: (props: React.TableHTMLAttributes<HTMLTableElement>) => (\n <div className=\"table-wrapper\">\n <table {...props} />\n </div>\n ),\n\n // Code blocks\n pre: Pre,\n\n // Expose your custom components for MDX usage\n Card,\n Accordion,\n Tabs,\n TabContent,\n Callout,\n Icon,\n Columns,\n Field,\n Update,\n Steps,\n Step,\n Button,\n DemoTheme,\n Space,\n ...components,\n };\n}\n";
|
|
1
|
+
export declare const mdxComponentsTemplate = "import React from \"react\";\nimport Link from \"next/link\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MDXComponents = Record<string, React.ComponentType<any>>;\nimport { Space } from \"cherry-styled-components\";\nimport { Code as CodeBlock } from \"@/components/layout/Code\";\nimport { Card } from \"@/components/layout/Card\";\nimport { Accordion } from \"@/components/layout/Accordion\";\nimport { Tabs, TabContent } from \"@/components/layout/Tabs\";\nimport { Callout } from \"@/components/layout/Callout\";\nimport { Icon } from \"@/components/layout/Icon\";\nimport { Columns } from \"@/components/layout/Columns\";\nimport { Field } from \"@/components/layout/Field\";\nimport { Update } from \"@/components/layout/Update\";\nimport { Steps, Step } from \"@/components/layout/Steps\";\nimport { Button } from \"@/components/layout/Button\";\nimport { ColorSwatch, ColorSwatchGroup } from \"@/components/layout/ColorSwatch\";\nimport { DemoTheme } from \"@/components/layout/DemoTheme\";\n\ninterface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n children?: React.ReactNode;\n}\n\ninterface PreProps extends React.HTMLAttributes<HTMLPreElement> {\n children?: React.ReactNode;\n}\n\nfunction extractAllTextFromChildren(children: React.ReactNode): string {\n if (children == null) return \"\";\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (typeof children === \"boolean\") return \"\";\n if (Array.isArray(children))\n return children.map(extractAllTextFromChildren).join(\"\");\n if (React.isValidElement(children)) {\n const element = children as React.ReactElement<{\n children?: React.ReactNode;\n }>;\n return extractAllTextFromChildren(element.props.children);\n }\n return \"\";\n}\n\nfunction generateId(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .trim();\n}\n\n// Map <pre><code class=\"language-xyz\"> to our <Code /> component\nfunction Pre(props: PreProps) {\n const child = React.Children.only(props.children) as React.ReactElement<{\n className?: string;\n children?: React.ReactNode;\n }> | null;\n if (child && child.type === \"code\") {\n const className = child.props.className || \"\";\n const match = /language-(\\w+)/.exec(className);\n const language = match ? match[1] : undefined;\n const code = extractAllTextFromChildren(child.props.children).replace(\n /\\n$/,\n \"\",\n );\n if (language) {\n return (\n <CodeBlock className={className} code={code} language={language} />\n );\n }\n }\n return <pre {...props} />;\n}\n\nexport function useMDXComponents(components: MDXComponents): MDXComponents {\n return {\n // Headings with auto-generated ids for TOC and deep links\n h1: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h1 id={id} {...props}>\n {children}\n </h1>\n );\n },\n h2: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h2 id={id} {...props}>\n {children}\n </h2>\n );\n },\n h3: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h3 id={id} {...props}>\n {children}\n </h3>\n );\n },\n h4: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h4 id={id} {...props}>\n {children}\n </h4>\n );\n },\n h5: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h5 id={id} {...props}>\n {children}\n </h5>\n );\n },\n h6: ({ children, ...props }: HeadingProps) => {\n const id = generateId(extractAllTextFromChildren(children));\n return (\n <h6 id={id} {...props}>\n {children}\n </h6>\n );\n },\n\n // Links - use Next.js Link for internal paths\n a: ({\n href,\n children,\n ...props\n }: React.AnchorHTMLAttributes<HTMLAnchorElement>) => {\n if (href && href.startsWith(\"/\")) {\n return (\n <Link href={href} {...props}>\n {children}\n </Link>\n );\n }\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...props}>\n {children}\n </a>\n );\n },\n\n // Tables - wrap in a div for responsive overflow\n table: (props: React.TableHTMLAttributes<HTMLTableElement>) => (\n <div className=\"table-wrapper\">\n <table {...props} />\n </div>\n ),\n\n // Code blocks\n pre: Pre,\n\n // Expose your custom components for MDX usage\n Card,\n Accordion,\n Tabs,\n TabContent,\n Callout,\n Icon,\n Columns,\n Field,\n Update,\n Steps,\n Step,\n Button,\n ColorSwatch,\n ColorSwatchGroup,\n DemoTheme,\n Space,\n ...components,\n };\n}\n";
|
|
@@ -15,6 +15,7 @@ import { Field } from "@/components/layout/Field";
|
|
|
15
15
|
import { Update } from "@/components/layout/Update";
|
|
16
16
|
import { Steps, Step } from "@/components/layout/Steps";
|
|
17
17
|
import { Button } from "@/components/layout/Button";
|
|
18
|
+
import { ColorSwatch, ColorSwatchGroup } from "@/components/layout/ColorSwatch";
|
|
18
19
|
import { DemoTheme } from "@/components/layout/DemoTheme";
|
|
19
20
|
|
|
20
21
|
interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {
|
|
@@ -167,6 +168,8 @@ export function useMDXComponents(components: MDXComponents): MDXComponents {
|
|
|
167
168
|
Steps,
|
|
168
169
|
Step,
|
|
169
170
|
Button,
|
|
171
|
+
ColorSwatch,
|
|
172
|
+
ColorSwatchGroup,
|
|
170
173
|
DemoTheme,
|
|
171
174
|
Space,
|
|
172
175
|
...components,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const colorSwatchTemplate = "\"use client\";\nimport styled from \"styled-components\";\nimport { styledText, Theme } from \"cherry-styled-components\";\nimport { mq } from \"@/app/theme\";\n\nconst StyledSwatchGroup = styled.div<{ theme: Theme }>`\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: ${({ theme }) => theme.spacing.gridGap.xs};\n\n ${mq(\"md\")} {\n grid-template-columns: repeat(3, 1fr);\n }\n`;\n\nconst StyledSwatch = styled.div<{ theme: Theme }>`\n border: solid 1px ${({ theme }) => theme.colors.grayLight};\n border-radius: ${({ theme }) => theme.spacing.radius.lg};\n overflow: hidden;\n`;\n\nconst StyledColor = styled.div<{\n theme: Theme;\n $color: string;\n $lightText: boolean;\n}>`\n background: ${({ $color }) => $color};\n height: 80px;\n display: flex;\n align-items: flex-end;\n padding: 8px 12px;\n color: ${({ $lightText }) => ($lightText ? \"#FFFFFF\" : \"#000000\")};\n font-size: 12px;\n font-family: monospace;\n opacity: 0.8;\n border-bottom: solid 1px ${({ theme }) => theme.colors.grayLight};\n`;\n\nconst StyledLabel = styled.div<{ theme: Theme }>`\n padding: 10px 12px;\n background: ${({ theme }) => theme.colors.light};\n ${({ theme }) => styledText(theme)};\n font-size: 13px;\n color: ${({ theme }) => theme.colors.grayDark};\n\n code {\n color: ${({ theme }) => theme.colors.dark};\n font-weight: 600;\n font-size: 13px;\n }\n`;\n\nfunction luminance(hex: string): number {\n const rgb = hex\n .replace(\"#\", \"\")\n .match(/.{2}/g)!\n .map((c) => parseInt(c, 16) / 255);\n\n const [r, g, b] = rgb.map((c) =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4),\n );\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\ninterface ColorSwatchProps {\n token: string;\n value: string;\n}\n\nfunction ColorSwatch({ token, value }: ColorSwatchProps) {\n const useLightText = luminance(value) < 0.4;\n\n return (\n <StyledSwatch>\n <StyledColor $color={value} $lightText={useLightText}>\n {value}\n </StyledColor>\n <StyledLabel>\n <code className=\"token\">{token}</code>\n </StyledLabel>\n </StyledSwatch>\n );\n}\n\ninterface ColorSwatchGroupProps {\n children: React.ReactNode;\n}\n\nfunction ColorSwatchGroup({ children }: ColorSwatchGroupProps) {\n return <StyledSwatchGroup>{children}</StyledSwatchGroup>;\n}\n\nexport { ColorSwatch, ColorSwatchGroup };\n";
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export const colorSwatchTemplate = `"use client";
|
|
2
|
+
import styled from "styled-components";
|
|
3
|
+
import { styledText, Theme } from "cherry-styled-components";
|
|
4
|
+
import { mq } from "@/app/theme";
|
|
5
|
+
|
|
6
|
+
const StyledSwatchGroup = styled.div<{ theme: Theme }>\`
|
|
7
|
+
display: grid;
|
|
8
|
+
grid-template-columns: repeat(2, 1fr);
|
|
9
|
+
gap: \${({ theme }) => theme.spacing.gridGap.xs};
|
|
10
|
+
|
|
11
|
+
\${mq("md")} {
|
|
12
|
+
grid-template-columns: repeat(3, 1fr);
|
|
13
|
+
}
|
|
14
|
+
\`;
|
|
15
|
+
|
|
16
|
+
const StyledSwatch = styled.div<{ theme: Theme }>\`
|
|
17
|
+
border: solid 1px \${({ theme }) => theme.colors.grayLight};
|
|
18
|
+
border-radius: \${({ theme }) => theme.spacing.radius.lg};
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
\`;
|
|
21
|
+
|
|
22
|
+
const StyledColor = styled.div<{
|
|
23
|
+
theme: Theme;
|
|
24
|
+
$color: string;
|
|
25
|
+
$lightText: boolean;
|
|
26
|
+
}>\`
|
|
27
|
+
background: \${({ $color }) => $color};
|
|
28
|
+
height: 80px;
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: flex-end;
|
|
31
|
+
padding: 8px 12px;
|
|
32
|
+
color: \${({ $lightText }) => ($lightText ? "#FFFFFF" : "#000000")};
|
|
33
|
+
font-size: 12px;
|
|
34
|
+
font-family: monospace;
|
|
35
|
+
opacity: 0.8;
|
|
36
|
+
border-bottom: solid 1px \${({ theme }) => theme.colors.grayLight};
|
|
37
|
+
\`;
|
|
38
|
+
|
|
39
|
+
const StyledLabel = styled.div<{ theme: Theme }>\`
|
|
40
|
+
padding: 10px 12px;
|
|
41
|
+
background: \${({ theme }) => theme.colors.light};
|
|
42
|
+
\${({ theme }) => styledText(theme)};
|
|
43
|
+
font-size: 13px;
|
|
44
|
+
color: \${({ theme }) => theme.colors.grayDark};
|
|
45
|
+
|
|
46
|
+
code {
|
|
47
|
+
color: \${({ theme }) => theme.colors.dark};
|
|
48
|
+
font-weight: 600;
|
|
49
|
+
font-size: 13px;
|
|
50
|
+
}
|
|
51
|
+
\`;
|
|
52
|
+
|
|
53
|
+
function luminance(hex: string): number {
|
|
54
|
+
const rgb = hex
|
|
55
|
+
.replace("#", "")
|
|
56
|
+
.match(/.{2}/g)!
|
|
57
|
+
.map((c) => parseInt(c, 16) / 255);
|
|
58
|
+
|
|
59
|
+
const [r, g, b] = rgb.map((c) =>
|
|
60
|
+
c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4),
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface ColorSwatchProps {
|
|
67
|
+
token: string;
|
|
68
|
+
value: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function ColorSwatch({ token, value }: ColorSwatchProps) {
|
|
72
|
+
const useLightText = luminance(value) < 0.4;
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<StyledSwatch>
|
|
76
|
+
<StyledColor $color={value} $lightText={useLightText}>
|
|
77
|
+
{value}
|
|
78
|
+
</StyledColor>
|
|
79
|
+
<StyledLabel>
|
|
80
|
+
<code className="token">{token}</code>
|
|
81
|
+
</StyledLabel>
|
|
82
|
+
</StyledSwatch>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface ColorSwatchGroupProps {
|
|
87
|
+
children: React.ReactNode;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function ColorSwatchGroup({ children }: ColorSwatchGroupProps) {
|
|
91
|
+
return <StyledSwatchGroup>{children}</StyledSwatchGroup>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export { ColorSwatch, ColorSwatchGroup };
|
|
95
|
+
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const sharedStyledTemplate = "\"use client\";\nimport { mq, styledSmall, styledText, Theme } from \"cherry-styled-components\";\nimport styled, { css } from \"styled-components\";\n\nexport const interactiveStyles = css<{ theme: Theme }>`\n transition: all 0.3s ease;\n border: solid 1px transparent;\n box-shadow: 0 0 0 0px ${({ theme }) => theme.colors.primary};\n\n &:hover {\n border-color: ${({ theme }) => theme.colors.primary};\n }\n\n &:focus {\n border-color: ${({ theme }) => theme.colors.primary};\n box-shadow: 0 0 0 4px ${({ theme }) => theme.colors.primaryLight};\n }\n\n &:active {\n box-shadow: 0 0 0 2px ${({ theme }) => theme.colors.primaryLight};\n }\n`;\n\nexport const styledAnchor = css<{ theme: Theme }>`\n & a:not([class]) {\n color: inherit;\n transition: all 0.3s ease;\n text-decoration: none;\n box-shadow: 0 2px 0 0 ${({ theme }) => theme.colors.primary};\n\n &:hover {\n color: ${({ theme }) =>\n theme.isDark ? theme.colors.primaryLight : theme.colors.primaryDark};\n box-shadow: 0 1px 0 0 ${({ theme }) => theme.colors.primary};\n }\n }\n`;\n\nexport const stylesLists = css<{ theme: Theme }>`\n & ul,\n & ol {\n & li {\n & > .code-wrapper {\n margin: 10px 0;\n }\n }\n }\n\n & ul {\n list-style: none;\n padding: 0;\n margin: 0;\n\n & li {\n text-indent: 0;\n display: block;\n position: relative;\n padding: 0 0 0 15px;\n margin: 0;\n ${({ theme }) => styledText(theme)};\n min-height: 23px;\n\n ${mq(\"lg\")} {\n min-height: 27px;\n }\n\n &::before {\n content: \"\";\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${({ theme }) => theme.colors.primary};\n position: absolute;\n top: 8px;\n left: 2px;\n\n ${mq(\"lg\")} {\n top: 10px;\n }\n }\n }\n }\n\n & ol {\n padding: 0;\n margin: 0;\n\n & ul {\n padding-left: 15px;\n }\n\n & > li {\n position: relative;\n padding: 0;\n counter-increment: item;\n margin: 0;\n ${({ theme }) => styledText(theme)};\n\n &::before {\n content: counter(item) \".\";\n display: inline-block;\n margin: 0 4px 0 0;\n font-weight: 700;\n color: ${({ theme }) => theme.colors.primary};\n min-width: max-content;\n }\n }\n }\n`;\n\nexport const styledTable = css<{ theme: Theme }>`\n & .table-wrapper {\n overflow-x: auto;\n width: 100%;\n }\n\n & table {\n margin: 0;\n padding: 0;\n border-collapse: collapse;\n width: 100%;\n text-align: left;\n\n & tr {\n margin: 0;\n padding: 0;\n }\n\n & th {\n border-bottom: solid 1px ${({ theme }) => theme.colors.grayLight};\n padding: 10px 10px 10px 0;\n ${({ theme }) => styledSmall(theme)};\n font-weight: 600;\n color: ${({ theme }) => theme.colors.dark};\n }\n\n & td {\n border-bottom: solid 1px ${({ theme }) => theme.colors.grayLight};\n padding: 10px 10px 10px 0;\n color: ${({ theme }) => theme.colors.grayDark};\n ${({ theme }) => styledSmall(theme)};\n }\n }\n`;\n\nexport const StyledSmallButton = styled.button<{ theme: Theme }>`\n ${interactiveStyles};\n background: transparent;\n border: solid 1px ${({ theme }) => theme.colors.grayLight};\n color: ${({ theme }) => theme.colors.primary};\n border-radius: ${({ theme }) => theme.spacing.radius.xs};\n padding: 6px 8px;\n font-size: 12px;\n font-family: inherit;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-right: -6px;\n\n & svg.lucide {\n color: inherit;\n }\n`;\n";
|
|
1
|
+
export declare const sharedStyledTemplate = "\"use client\";\nimport { mq, styledSmall, styledText, Theme } from \"cherry-styled-components\";\nimport styled, { css } from \"styled-components\";\n\nexport const interactiveStyles = css<{ theme: Theme }>`\n transition: all 0.3s ease;\n border: solid 1px transparent;\n box-shadow: 0 0 0 0px ${({ theme }) => theme.colors.primary};\n\n &:hover {\n border-color: ${({ theme }) => theme.colors.primary};\n }\n\n &:focus {\n border-color: ${({ theme }) => theme.colors.primary};\n box-shadow: 0 0 0 4px ${({ theme }) => theme.colors.primaryLight};\n }\n\n &:active {\n box-shadow: 0 0 0 2px ${({ theme }) => theme.colors.primaryLight};\n }\n`;\n\nexport const styledAnchor = css<{ theme: Theme }>`\n & a:not([class]):not(:has(img)) {\n color: inherit;\n transition: all 0.3s ease;\n text-decoration: none;\n box-shadow: 0 2px 0 0 ${({ theme }) => theme.colors.primary};\n\n &:hover {\n color: ${({ theme }) =>\n theme.isDark ? theme.colors.primaryLight : theme.colors.primaryDark};\n box-shadow: 0 1px 0 0 ${({ theme }) => theme.colors.primary};\n }\n }\n`;\n\nexport const stylesLists = css<{ theme: Theme }>`\n & ul,\n & ol {\n & li {\n & > .code-wrapper {\n margin: 10px 0;\n }\n }\n }\n\n & ul {\n list-style: none;\n padding: 0;\n margin: 0;\n\n & li {\n text-indent: 0;\n display: block;\n position: relative;\n padding: 0 0 0 15px;\n margin: 0;\n ${({ theme }) => styledText(theme)};\n min-height: 23px;\n\n ${mq(\"lg\")} {\n min-height: 27px;\n }\n\n &::before {\n content: \"\";\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${({ theme }) => theme.colors.primary};\n position: absolute;\n top: 8px;\n left: 2px;\n\n ${mq(\"lg\")} {\n top: 10px;\n }\n }\n }\n }\n\n & ol {\n padding: 0;\n margin: 0;\n\n & ul {\n padding-left: 15px;\n }\n\n & > li {\n position: relative;\n padding: 0;\n counter-increment: item;\n margin: 0;\n ${({ theme }) => styledText(theme)};\n\n &::before {\n content: counter(item) \".\";\n display: inline-block;\n margin: 0 4px 0 0;\n font-weight: 700;\n color: ${({ theme }) => theme.colors.primary};\n min-width: max-content;\n }\n }\n }\n`;\n\nexport const styledTable = css<{ theme: Theme }>`\n & .table-wrapper {\n overflow-x: auto;\n width: 100%;\n }\n\n & table {\n margin: 0;\n padding: 0;\n border-collapse: collapse;\n width: 100%;\n text-align: left;\n\n & tr {\n margin: 0;\n padding: 0;\n }\n\n & th {\n border-bottom: solid 1px ${({ theme }) => theme.colors.grayLight};\n padding: 10px 10px 10px 0;\n ${({ theme }) => styledSmall(theme)};\n font-weight: 600;\n color: ${({ theme }) => theme.colors.dark};\n }\n\n & td {\n border-bottom: solid 1px ${({ theme }) => theme.colors.grayLight};\n padding: 10px 10px 10px 0;\n color: ${({ theme }) => theme.colors.grayDark};\n ${({ theme }) => styledSmall(theme)};\n }\n }\n`;\n\nexport const StyledSmallButton = styled.button<{ theme: Theme }>`\n ${interactiveStyles};\n background: transparent;\n border: solid 1px ${({ theme }) => theme.colors.grayLight};\n color: ${({ theme }) => theme.colors.primary};\n border-radius: ${({ theme }) => theme.spacing.radius.xs};\n padding: 6px 8px;\n font-size: 12px;\n font-family: inherit;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-right: -6px;\n\n & svg.lucide {\n color: inherit;\n }\n`;\n";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const colorSwatchesMdxTemplate = "---\ntitle: \"Color Swatches\"\ndescription: \"Display color palettes with labeled swatches to document your theme colors.\"\ndate: \"2026-02-19\"\ncategory: \"Components\"\ncategoryOrder: 1\norder: 8\n---\n# Color Swatches\nDisplay color palettes with labeled swatches to document your theme colors.\n\nThe `ColorSwatch` component renders a visual preview of a color alongside its token name, and `ColorSwatchGroup` arranges multiple swatches in a responsive grid.\n\n## Usage\nYou can use the ColorSwatch components directly within your MDX files without any import:\n\n~~~mdx\n<ColorSwatchGroup>\n <ColorSwatch token=\"primary\" value=\"#6366F1\" />\n <ColorSwatch token=\"secondary\" value=\"#EC4899\" />\n <ColorSwatch token=\"success\" value=\"#10B981\" />\n <ColorSwatch token=\"warning\" value=\"#F59E0B\" />\n <ColorSwatch token=\"danger\" value=\"#EF4444\" />\n <ColorSwatch token=\"info\" value=\"#3B82F6\" />\n</ColorSwatchGroup>\n~~~\n\n<ColorSwatchGroup>\n <ColorSwatch token=\"primary\" value=\"#6366F1\" />\n <ColorSwatch token=\"secondary\" value=\"#EC4899\" />\n <ColorSwatch token=\"success\" value=\"#10B981\" />\n <ColorSwatch token=\"warning\" value=\"#F59E0B\" />\n <ColorSwatch token=\"danger\" value=\"#EF4444\" />\n <ColorSwatch token=\"info\" value=\"#3B82F6\" />\n</ColorSwatchGroup>\n\n## Dark Colors\n\nText color automatically adapts based on the background luminance, so dark swatches display white text:\n\n~~~mdx\n<ColorSwatchGroup>\n <ColorSwatch token=\"dark\" value=\"#1E1E2E\" />\n <ColorSwatch token=\"grayDark\" value=\"#374151\" />\n <ColorSwatch token=\"gray\" value=\"#6B7280\" />\n <ColorSwatch token=\"grayLight\" value=\"#D1D5DB\" />\n <ColorSwatch token=\"light\" value=\"#F9FAFB\" />\n <ColorSwatch token=\"white\" value=\"#FFFFFF\" />\n</ColorSwatchGroup>\n~~~\n\n<ColorSwatchGroup>\n <ColorSwatch token=\"dark\" value=\"#1E1E2E\" />\n <ColorSwatch token=\"grayDark\" value=\"#374151\" />\n <ColorSwatch token=\"gray\" value=\"#6B7280\" />\n <ColorSwatch token=\"grayLight\" value=\"#D1D5DB\" />\n <ColorSwatch token=\"light\" value=\"#F9FAFB\" />\n <ColorSwatch token=\"white\" value=\"#FFFFFF\" />\n</ColorSwatchGroup>\n\n## ColorSwatch Properties\n\n<Field value=\"token\" type=\"string\" required>\n The name or label displayed below the color preview (e.g. a design token name).\n</Field>\n\n<Field value=\"value\" type=\"string\" required>\n A hex color value (e.g. `#6366F1`). Displayed inside the color preview and used as the background.\n</Field>\n\n## ColorSwatchGroup Properties\n\n<Field value=\"children\" type=\"node\" required>\n One or more `ColorSwatch` components to display in a responsive grid.\n</Field>";
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export const colorSwatchesMdxTemplate = `---
|
|
2
|
+
title: "Color Swatches"
|
|
3
|
+
description: "Display color palettes with labeled swatches to document your theme colors."
|
|
4
|
+
date: "2026-02-19"
|
|
5
|
+
category: "Components"
|
|
6
|
+
categoryOrder: 1
|
|
7
|
+
order: 8
|
|
8
|
+
---
|
|
9
|
+
# Color Swatches
|
|
10
|
+
Display color palettes with labeled swatches to document your theme colors.
|
|
11
|
+
|
|
12
|
+
The \`ColorSwatch\` component renders a visual preview of a color alongside its token name, and \`ColorSwatchGroup\` arranges multiple swatches in a responsive grid.
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
You can use the ColorSwatch components directly within your MDX files without any import:
|
|
16
|
+
|
|
17
|
+
~~~mdx
|
|
18
|
+
<ColorSwatchGroup>
|
|
19
|
+
<ColorSwatch token="primary" value="#6366F1" />
|
|
20
|
+
<ColorSwatch token="secondary" value="#EC4899" />
|
|
21
|
+
<ColorSwatch token="success" value="#10B981" />
|
|
22
|
+
<ColorSwatch token="warning" value="#F59E0B" />
|
|
23
|
+
<ColorSwatch token="danger" value="#EF4444" />
|
|
24
|
+
<ColorSwatch token="info" value="#3B82F6" />
|
|
25
|
+
</ColorSwatchGroup>
|
|
26
|
+
~~~
|
|
27
|
+
|
|
28
|
+
<ColorSwatchGroup>
|
|
29
|
+
<ColorSwatch token="primary" value="#6366F1" />
|
|
30
|
+
<ColorSwatch token="secondary" value="#EC4899" />
|
|
31
|
+
<ColorSwatch token="success" value="#10B981" />
|
|
32
|
+
<ColorSwatch token="warning" value="#F59E0B" />
|
|
33
|
+
<ColorSwatch token="danger" value="#EF4444" />
|
|
34
|
+
<ColorSwatch token="info" value="#3B82F6" />
|
|
35
|
+
</ColorSwatchGroup>
|
|
36
|
+
|
|
37
|
+
## Dark Colors
|
|
38
|
+
|
|
39
|
+
Text color automatically adapts based on the background luminance, so dark swatches display white text:
|
|
40
|
+
|
|
41
|
+
~~~mdx
|
|
42
|
+
<ColorSwatchGroup>
|
|
43
|
+
<ColorSwatch token="dark" value="#1E1E2E" />
|
|
44
|
+
<ColorSwatch token="grayDark" value="#374151" />
|
|
45
|
+
<ColorSwatch token="gray" value="#6B7280" />
|
|
46
|
+
<ColorSwatch token="grayLight" value="#D1D5DB" />
|
|
47
|
+
<ColorSwatch token="light" value="#F9FAFB" />
|
|
48
|
+
<ColorSwatch token="white" value="#FFFFFF" />
|
|
49
|
+
</ColorSwatchGroup>
|
|
50
|
+
~~~
|
|
51
|
+
|
|
52
|
+
<ColorSwatchGroup>
|
|
53
|
+
<ColorSwatch token="dark" value="#1E1E2E" />
|
|
54
|
+
<ColorSwatch token="grayDark" value="#374151" />
|
|
55
|
+
<ColorSwatch token="gray" value="#6B7280" />
|
|
56
|
+
<ColorSwatch token="grayLight" value="#D1D5DB" />
|
|
57
|
+
<ColorSwatch token="light" value="#F9FAFB" />
|
|
58
|
+
<ColorSwatch token="white" value="#FFFFFF" />
|
|
59
|
+
</ColorSwatchGroup>
|
|
60
|
+
|
|
61
|
+
## ColorSwatch Properties
|
|
62
|
+
|
|
63
|
+
<Field value="token" type="string" required>
|
|
64
|
+
The name or label displayed below the color preview (e.g. a design token name).
|
|
65
|
+
</Field>
|
|
66
|
+
|
|
67
|
+
<Field value="value" type="string" required>
|
|
68
|
+
A hex color value (e.g. \`#6366F1\`). Displayed inside the color preview and used as the background.
|
|
69
|
+
</Field>
|
|
70
|
+
|
|
71
|
+
## ColorSwatchGroup Properties
|
|
72
|
+
|
|
73
|
+
<Field value="children" type="node" required>
|
|
74
|
+
One or more \`ColorSwatch\` components to display in a responsive grid.
|
|
75
|
+
</Field>`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const componentsMdxTemplate = "---\ntitle: \"Components\"\ndescription: \"Explore the full library of built-in components available in your documentation pages.\"\ndate: \"2026-02-19\"\ncategory: \"Components\"\ncategoryOrder: 1\norder: 0\n---\n# Components\n\nDoccupine includes a rich set of built-in components you can use directly in your MDX files - no imports needed. Browse the full library below.\n\n<Columns cols={3}>\n <Card title=\"Headers and Text\" icon=\"heading\" href=\"/headers-and-text\">\n Headings, paragraphs, bold, italic, links, and other text formatting.\n </Card>\n <Card title=\"Lists and Tables\" icon=\"list\" href=\"/lists-and-tables\">\n Ordered lists, unordered lists, and data tables.\n </Card>\n <Card title=\"Code\" icon=\"code\" href=\"/code\">\n Inline code, fenced code blocks, and syntax highlighting.\n </Card>\n <Card title=\"Accordion\" icon=\"chevrons-down\" href=\"/accordion\">\n Collapsible sections for organizing lengthy content.\n </Card>\n <Card title=\"Tabs\" icon=\"panel-top\" href=\"/tabs\">\n Tabbed interfaces for grouping related content.\n </Card>\n <Card title=\"Cards\" icon=\"square\" href=\"/cards\">\n Visual containers for content, icons, and links.\n </Card>\n <Card title=\"Buttons\" icon=\"mouse-pointer-click\" href=\"/buttons\">\n Action components with variants, sizes, and icons.\n </Card>\n <Card title=\"Callouts\" icon=\"megaphone\" href=\"/callouts\">\n Highlighted blocks for tips, warnings, and important notes.\n </Card>\n <Card title=\"Images and Embeds\" icon=\"image\" href=\"/images-and-embeds\">\n Images, videos, and embedded content.\n </Card>\n <Card title=\"Icons\" icon=\"smile\" href=\"/icons\">\n Lucide icons you can use anywhere in your docs.\n </Card>\n <Card title=\"Fields\" icon=\"text-cursor-input\" href=\"/fields\">\n Property and parameter documentation blocks.\n </Card>\n <Card title=\"Update\" icon=\"bell\" href=\"/update\">\n Changelog and update announcement blocks.\n </Card>\n <Card title=\"Columns\" icon=\"columns-3\" href=\"/columns\">\n Grid layouts for arranging cards and content side by side.\n </Card>\n <Card title=\"Steps\" icon=\"footprints\" href=\"/steps\">\n Numbered step-by-step guides and walkthroughs.\n </Card>\n</Columns>";
|
|
1
|
+
export declare const componentsMdxTemplate = "---\ntitle: \"Components\"\ndescription: \"Explore the full library of built-in components available in your documentation pages.\"\ndate: \"2026-02-19\"\ncategory: \"Components\"\ncategoryOrder: 1\norder: 0\n---\n# Components\n\nDoccupine includes a rich set of built-in components you can use directly in your MDX files - no imports needed. Browse the full library below.\n\n<Columns cols={3}>\n <Card title=\"Headers and Text\" icon=\"heading\" href=\"/headers-and-text\">\n Headings, paragraphs, bold, italic, links, and other text formatting.\n </Card>\n <Card title=\"Lists and Tables\" icon=\"list\" href=\"/lists-and-tables\">\n Ordered lists, unordered lists, and data tables.\n </Card>\n <Card title=\"Code\" icon=\"code\" href=\"/code\">\n Inline code, fenced code blocks, and syntax highlighting.\n </Card>\n <Card title=\"Accordion\" icon=\"chevrons-down\" href=\"/accordion\">\n Collapsible sections for organizing lengthy content.\n </Card>\n <Card title=\"Tabs\" icon=\"panel-top\" href=\"/tabs\">\n Tabbed interfaces for grouping related content.\n </Card>\n <Card title=\"Cards\" icon=\"square\" href=\"/cards\">\n Visual containers for content, icons, and links.\n </Card>\n <Card title=\"Buttons\" icon=\"mouse-pointer-click\" href=\"/buttons\">\n Action components with variants, sizes, and icons.\n </Card>\n <Card title=\"Callouts\" icon=\"megaphone\" href=\"/callouts\">\n Highlighted blocks for tips, warnings, and important notes.\n </Card>\n <Card title=\"Images and Embeds\" icon=\"image\" href=\"/images-and-embeds\">\n Images, videos, and embedded content.\n </Card>\n <Card title=\"Icons\" icon=\"smile\" href=\"/icons\">\n Lucide icons you can use anywhere in your docs.\n </Card>\n <Card title=\"Fields\" icon=\"text-cursor-input\" href=\"/fields\">\n Property and parameter documentation blocks.\n </Card>\n <Card title=\"Update\" icon=\"bell\" href=\"/update\">\n Changelog and update announcement blocks.\n </Card>\n <Card title=\"Columns\" icon=\"columns-3\" href=\"/columns\">\n Grid layouts for arranging cards and content side by side.\n </Card>\n <Card title=\"Steps\" icon=\"footprints\" href=\"/steps\">\n Numbered step-by-step guides and walkthroughs.\n </Card>\n <Card title=\"Color Swatches\" icon=\"palette\" href=\"/color-swatches\">\n Visual color palette swatches to document your theme colors.\n </Card>\n</Columns>";
|
|
@@ -53,4 +53,7 @@ Doccupine includes a rich set of built-in components you can use directly in you
|
|
|
53
53
|
<Card title="Steps" icon="footprints" href="/steps">
|
|
54
54
|
Numbered step-by-step guides and walkthroughs.
|
|
55
55
|
</Card>
|
|
56
|
+
<Card title="Color Swatches" icon="palette" href="/color-swatches">
|
|
57
|
+
Visual color palette swatches to document your theme colors.
|
|
58
|
+
</Card>
|
|
56
59
|
</Columns>`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "doccupine",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.77",
|
|
4
4
|
"description": "Free and open-source documentation platform. Write MDX, get a production-ready site with AI chat, built-in components, and an MCP server - in one command.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|