template.tsx
1 import React from "react"; 2 import { slugify } from "../../util"; 3 4 const AdmonitionTemplate = { 5 name: "Admonition", 6 ui: { 7 defaultItem: { 8 type: "note", 9 title: "Note", 10 }, 11 itemProps: (item) => { 12 return { label: item?.title }; 13 }, 14 }, 15 fields: [ 16 { 17 name: "type", 18 label: "Type", 19 type: "string", 20 options: [ 21 { 22 label: "Note", 23 value: "note", 24 }, 25 { 26 label: "Tip", 27 value: "tip", 28 }, 29 { 30 label: "Info", 31 value: "info", 32 }, 33 { 34 label: "Caution", 35 value: "caution", 36 }, 37 { 38 label: "Danger", 39 value: "danger", 40 }, 41 ], 42 }, 43 { 44 name: "title", 45 label: "Title", 46 type: "string", 47 isTitle: true, 48 required: true, 49 }, 50 { 51 name: "children", 52 label: "Content", 53 type: "rich-text", 54 }, 55 ], 56 }; 57 58 const DetailsTemplate = { 59 name: "Details", 60 fields: [ 61 { 62 name: "summary", 63 label: "Summary", 64 type: "string", 65 isTitle: true, 66 required: true, 67 }, 68 { 69 name: "children", 70 label: "Details", 71 type: "rich-text", 72 }, 73 ], 74 }; 75 76 const CodeBlockTemplate = { 77 name: "CodeBlock", 78 label: "Code Block", 79 fields: [ 80 { 81 name: "title", 82 label: "Filename", 83 type: "string", 84 }, 85 { 86 name: "language", 87 label: "Language", 88 type: "string", 89 }, 90 { 91 name: "children", 92 label: "Code", 93 type: "rich-text", 94 required: true, 95 }, 96 ], 97 }; 98 99 const TabsTemplate = { 100 name: "Tabs", 101 fields: [ 102 { 103 name: "children", 104 label: "Tabs", 105 type: "rich-text", 106 templates: [ 107 { 108 name: "TabItem", 109 label: "Tab", 110 ui: { 111 defaultItem: { 112 label: "Tab", 113 value: "tab", 114 }, 115 }, 116 fields: [ 117 { 118 name: "label", 119 label: "Label", 120 type: "string", 121 isTitle: true, 122 required: true, 123 }, 124 { 125 name: "value", 126 type: "string", 127 ui: { 128 component: ({ input, tinaForm }) => { 129 React.useEffect(() => { 130 input.onChange(slugify(tinaForm.values.label)); 131 }, [JSON.stringify(tinaForm.values)]); 132 133 return ( 134 <input 135 type="text" 136 id={input.name} 137 className="hidden" 138 {...input} 139 /> 140 ); 141 }, 142 }, 143 }, 144 { 145 name: "children", 146 label: "Content", 147 type: "string", 148 ui: { 149 component: "textarea", 150 }, 151 }, 152 ], 153 }, 154 ], 155 }, 156 ], 157 }; 158 159 const DocCardListTemplate = { 160 name: "DocCardList", 161 label: "Doc Card List", 162 fields: [ 163 { 164 name: "title", 165 label: "Title", 166 type: "string", 167 }, 168 ], 169 }; 170 171 export const MDXTemplates = [ 172 AdmonitionTemplate, 173 DetailsTemplate, 174 CodeBlockTemplate, 175 TabsTemplate, 176 DocCardListTemplate, 177 ];