💄 Optimized navbar
This commit is contained in:
		
							
								
								
									
										57
									
								
								.idea/codeStyles/Project.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								.idea/codeStyles/Project.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <component name="ProjectCodeStyleConfiguration"> | ||||
|   <code_scheme name="Project" version="173"> | ||||
|     <HTMLCodeStyleSettings> | ||||
|       <option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" /> | ||||
|     </HTMLCodeStyleSettings> | ||||
|     <JSCodeStyleSettings version="0"> | ||||
|       <option name="FORCE_SEMICOLON_STYLE" value="true" /> | ||||
|       <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" /> | ||||
|       <option name="FORCE_QUOTE_STYlE" value="true" /> | ||||
|       <option name="ENFORCE_TRAILING_COMMA" value="Remove" /> | ||||
|       <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" /> | ||||
|       <option name="SPACES_WITHIN_IMPORTS" value="true" /> | ||||
|     </JSCodeStyleSettings> | ||||
|     <TypeScriptCodeStyleSettings version="0"> | ||||
|       <option name="FORCE_SEMICOLON_STYLE" value="true" /> | ||||
|       <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" /> | ||||
|       <option name="FORCE_QUOTE_STYlE" value="true" /> | ||||
|       <option name="ENFORCE_TRAILING_COMMA" value="Remove" /> | ||||
|       <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" /> | ||||
|       <option name="SPACES_WITHIN_IMPORTS" value="true" /> | ||||
|     </TypeScriptCodeStyleSettings> | ||||
|     <VueCodeStyleSettings> | ||||
|       <option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" /> | ||||
|       <option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" /> | ||||
|     </VueCodeStyleSettings> | ||||
|     <codeStyleSettings language="HTML"> | ||||
|       <option name="SOFT_MARGINS" value="120" /> | ||||
|       <indentOptions> | ||||
|         <option name="INDENT_SIZE" value="2" /> | ||||
|         <option name="CONTINUATION_INDENT_SIZE" value="2" /> | ||||
|         <option name="TAB_SIZE" value="2" /> | ||||
|       </indentOptions> | ||||
|     </codeStyleSettings> | ||||
|     <codeStyleSettings language="JavaScript"> | ||||
|       <option name="SOFT_MARGINS" value="120" /> | ||||
|       <indentOptions> | ||||
|         <option name="INDENT_SIZE" value="2" /> | ||||
|         <option name="CONTINUATION_INDENT_SIZE" value="2" /> | ||||
|         <option name="TAB_SIZE" value="2" /> | ||||
|       </indentOptions> | ||||
|     </codeStyleSettings> | ||||
|     <codeStyleSettings language="TypeScript"> | ||||
|       <option name="SOFT_MARGINS" value="120" /> | ||||
|       <indentOptions> | ||||
|         <option name="INDENT_SIZE" value="2" /> | ||||
|         <option name="CONTINUATION_INDENT_SIZE" value="2" /> | ||||
|         <option name="TAB_SIZE" value="2" /> | ||||
|       </indentOptions> | ||||
|     </codeStyleSettings> | ||||
|     <codeStyleSettings language="Vue"> | ||||
|       <option name="SOFT_MARGINS" value="120" /> | ||||
|       <indentOptions> | ||||
|         <option name="CONTINUATION_INDENT_SIZE" value="2" /> | ||||
|       </indentOptions> | ||||
|     </codeStyleSettings> | ||||
|   </code_scheme> | ||||
| </component> | ||||
							
								
								
									
										5
									
								
								.idea/codeStyles/codeStyleConfig.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.idea/codeStyles/codeStyleConfig.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <component name="ProjectCodeStyleConfiguration"> | ||||
|   <state> | ||||
|     <option name="USE_PER_PROJECT_SETTINGS" value="true" /> | ||||
|   </state> | ||||
| </component> | ||||
							
								
								
									
										5
									
								
								.prettierrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.prettierrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| { | ||||
|   "tabWidth": 2, | ||||
|   "printWidth": 120, | ||||
|   "singleQuote": false | ||||
| } | ||||
| @@ -4,14 +4,16 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||||
| var __export = (target, all) => { | ||||
|   for (var name in all) | ||||
|     __defProp(target, name, { get: all[name], enumerable: true }); | ||||
|   for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); | ||||
| }; | ||||
| var __copyProps = (to, from, except, desc) => { | ||||
|   if (from && typeof from === "object" || typeof from === "function") { | ||||
|   if ((from && typeof from === "object") || typeof from === "function") { | ||||
|     for (let key of __getOwnPropNames(from)) | ||||
|       if (!__hasOwnProp.call(to, key) && key !== except) | ||||
|         __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||||
|         __defProp(to, key, { | ||||
|           get: () => from[key], | ||||
|           enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable, | ||||
|         }); | ||||
|   } | ||||
|   return to; | ||||
| }; | ||||
| @@ -20,7 +22,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru | ||||
| // keystone.ts | ||||
| var keystone_exports = {}; | ||||
| __export(keystone_exports, { | ||||
|   default: () => keystone_default | ||||
|   default: () => keystone_default, | ||||
| }); | ||||
| module.exports = __toCommonJS(keystone_exports); | ||||
| var import_core8 = require("@keystone-6/core"); | ||||
| @@ -35,24 +37,24 @@ var allowUser = { | ||||
|   operation: { | ||||
|     create: isUser, | ||||
|     update: isUser, | ||||
|     delete: isUser | ||||
|   } | ||||
|     delete: isUser, | ||||
|   }, | ||||
| }; | ||||
| var isEditor = ({ session: session2 }) => session2?.data.isEditor || session2?.data.isAdmin; | ||||
| var allowEditor = { | ||||
|   operation: { | ||||
|     create: isEditor, | ||||
|     update: isEditor, | ||||
|     delete: isEditor | ||||
|   } | ||||
|     delete: isEditor, | ||||
|   }, | ||||
| }; | ||||
| var isAdmin = ({ session: session2 }) => session2?.data.isAdmin; | ||||
| var allowAdmin = { | ||||
|   operation: { | ||||
|     create: isAdmin, | ||||
|     update: isAdmin, | ||||
|     delete: isAdmin | ||||
|   } | ||||
|     delete: isAdmin, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| // schema/assets.ts | ||||
| @@ -64,9 +66,9 @@ var Image = (0, import_core.list)({ | ||||
|     caption: (0, import_fields.text)(), | ||||
|     image: (0, import_fields.image)({ storage: "localImages" }), | ||||
|     createdAt: (0, import_fields.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
| var Asset = (0, import_core.list)({ | ||||
|   access: allowEditor, | ||||
| @@ -77,17 +79,17 @@ var Asset = (0, import_core.list)({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Video", value: "video" }, | ||||
|         { label: "Audio", value: "audio" } | ||||
|         { label: "Audio", value: "audio" }, | ||||
|       ], | ||||
|       defaultValue: "video", | ||||
|       db: { map: "media_type" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" } | ||||
|       ui: { displayMode: "select" }, | ||||
|     }), | ||||
|     createdAt: (0, import_fields.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| // schema/moments.ts | ||||
| @@ -106,10 +108,10 @@ var Moment = (0, import_core2.list)({ | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1] | ||||
|         [1, 2, 1], | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true | ||||
|       dividers: true, | ||||
|     }), | ||||
|     author: (0, import_fields2.relationship)({ | ||||
|       ref: "User.moments", | ||||
| @@ -118,9 +120,9 @@ var Moment = (0, import_core2.list)({ | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true | ||||
|         inlineConnect: true, | ||||
|       }, | ||||
|       many: false | ||||
|       many: false, | ||||
|     }), | ||||
|     categories: (0, import_fields2.relationship)({ | ||||
|       ref: "Category.moments", | ||||
| @@ -131,8 +133,8 @@ var Moment = (0, import_core2.list)({ | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|     tags: (0, import_fields2.relationship)({ | ||||
|       ref: "Tag.moments", | ||||
| @@ -143,13 +145,13 @@ var Moment = (0, import_core2.list)({ | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|     createdAt: (0, import_fields2.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| // schema/categories.ts | ||||
| @@ -160,30 +162,30 @@ var Category = (0, import_core3.list)({ | ||||
|   fields: { | ||||
|     slug: (0, import_fields3.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     name: (0, import_fields3.text)(), | ||||
|     posts: (0, import_fields3.relationship)({ ref: "Post.categories", many: true }), | ||||
|     moments: (0, import_fields3.relationship)({ ref: "Moment.categories", many: true }), | ||||
|     events: (0, import_fields3.relationship)({ ref: "Event.categories", many: true }) | ||||
|   } | ||||
|     events: (0, import_fields3.relationship)({ ref: "Event.categories", many: true }), | ||||
|   }, | ||||
| }); | ||||
| var Tag = (0, import_core3.list)({ | ||||
|   access: allowEditor, | ||||
|   fields: { | ||||
|     slug: (0, import_fields3.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     name: (0, import_fields3.text)(), | ||||
|     posts: (0, import_fields3.relationship)({ ref: "Post.tags", many: true }), | ||||
|     moments: (0, import_fields3.relationship)({ ref: "Moment.tags", many: true }), | ||||
|     events: (0, import_fields3.relationship)({ ref: "Event.tags", many: true }) | ||||
|   } | ||||
|     events: (0, import_fields3.relationship)({ ref: "Event.tags", many: true }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| // schema/projects.ts | ||||
| @@ -194,11 +196,10 @@ var Project = (0, import_core4.list)({ | ||||
|     ...allowAdmin, | ||||
|     filter: { | ||||
|       query: ({ session: session2 }) => { | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) | ||||
|           return true; | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       } | ||||
|     } | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   fields: { | ||||
|     icon: (0, import_fields4.relationship)({ ref: "Image" }), | ||||
| @@ -212,18 +213,18 @@ var Project = (0, import_core4.list)({ | ||||
|         { label: "Pending", value: "pending" }, | ||||
|         { label: "Constructing", value: "constructing" }, | ||||
|         { label: "Published", value: "published" }, | ||||
|         { label: "Abandoned", value: "abandoned" } | ||||
|         { label: "Abandoned", value: "abandoned" }, | ||||
|       ], | ||||
|       defaultValue: "pending", | ||||
|       db: { map: "project_status" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" } | ||||
|       ui: { displayMode: "select" }, | ||||
|     }), | ||||
|     post: (0, import_fields4.relationship)({ ref: "Post" }), | ||||
|     createdAt: (0, import_fields4.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| // schema/posts.ts | ||||
| @@ -235,18 +236,17 @@ var Post = (0, import_core5.list)({ | ||||
|     ...allowEditor, | ||||
|     filter: { | ||||
|       query: ({ session: session2 }) => { | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) | ||||
|           return true; | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       } | ||||
|     } | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   fields: { | ||||
|     slug: (0, import_fields5.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     title: (0, import_fields5.text)({ validation: { isRequired: true } }), | ||||
|     cover: (0, import_fields5.relationship)({ ref: "Image" }), | ||||
| @@ -260,21 +260,21 @@ var Post = (0, import_core5.list)({ | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1] | ||||
|         [1, 2, 1], | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true | ||||
|       dividers: true, | ||||
|     }), | ||||
|     type: (0, import_fields5.select)({ | ||||
|       type: "enum", | ||||
|       options: [ | ||||
|         { label: "Article", value: "article" }, | ||||
|         { label: "Podcast", value: "podcast" } | ||||
|         { label: "Podcast", value: "podcast" }, | ||||
|       ], | ||||
|       defaultValue: "article", | ||||
|       db: { map: "post_type" }, | ||||
|       validation: { isRequired: true }, | ||||
|       ui: { displayMode: "select" } | ||||
|       ui: { displayMode: "select" }, | ||||
|     }), | ||||
|     isPublished: (0, import_fields5.checkbox)(), | ||||
|     author: (0, import_fields5.relationship)({ | ||||
| @@ -284,9 +284,9 @@ var Post = (0, import_core5.list)({ | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true | ||||
|         inlineConnect: true, | ||||
|       }, | ||||
|       many: false | ||||
|       many: false, | ||||
|     }), | ||||
|     categories: (0, import_fields5.relationship)({ | ||||
|       ref: "Category.posts", | ||||
| @@ -297,8 +297,8 @@ var Post = (0, import_core5.list)({ | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|     tags: (0, import_fields5.relationship)({ | ||||
|       ref: "Tag.posts", | ||||
| @@ -309,13 +309,13 @@ var Post = (0, import_core5.list)({ | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|     createdAt: (0, import_fields5.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| // schema/events.ts | ||||
| @@ -327,18 +327,17 @@ var Event = (0, import_core6.list)({ | ||||
|     ...allowEditor, | ||||
|     filter: { | ||||
|       query: ({ session: session2 }) => { | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) | ||||
|           return true; | ||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) return true; | ||||
|         return { isPublished: { equals: true } }; | ||||
|       } | ||||
|     } | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   fields: { | ||||
|     slug: (0, import_fields6.text)({ | ||||
|       validation: { | ||||
|         isRequired: true | ||||
|         isRequired: true, | ||||
|       }, | ||||
|       isIndexed: "unique" | ||||
|       isIndexed: "unique", | ||||
|     }), | ||||
|     title: (0, import_fields6.text)({ validation: { isRequired: true } }), | ||||
|     description: (0, import_fields6.text)(), | ||||
| @@ -349,10 +348,10 @@ var Event = (0, import_core6.list)({ | ||||
|         [1, 1, 1], | ||||
|         [2, 1], | ||||
|         [1, 2], | ||||
|         [1, 2, 1] | ||||
|         [1, 2, 1], | ||||
|       ], | ||||
|       links: true, | ||||
|       dividers: true | ||||
|       dividers: true, | ||||
|     }), | ||||
|     isPublished: (0, import_fields6.checkbox)(), | ||||
|     isHistory: (0, import_fields6.checkbox)(), | ||||
| @@ -363,9 +362,9 @@ var Event = (0, import_core6.list)({ | ||||
|         cardFields: ["name", "email"], | ||||
|         inlineEdit: { fields: ["name", "email"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true | ||||
|         inlineConnect: true, | ||||
|       }, | ||||
|       many: false | ||||
|       many: false, | ||||
|     }), | ||||
|     categories: (0, import_fields6.relationship)({ | ||||
|       ref: "Category.events", | ||||
| @@ -376,8 +375,8 @@ var Event = (0, import_core6.list)({ | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|     tags: (0, import_fields6.relationship)({ | ||||
|       ref: "Tag.events", | ||||
| @@ -388,13 +387,13 @@ var Event = (0, import_core6.list)({ | ||||
|         inlineEdit: { fields: ["name"] }, | ||||
|         linkToItem: true, | ||||
|         inlineConnect: true, | ||||
|         inlineCreate: { fields: ["name"] } | ||||
|       } | ||||
|         inlineCreate: { fields: ["name"] }, | ||||
|       }, | ||||
|     }), | ||||
|     createdAt: (0, import_fields6.timestamp)({ | ||||
|       defaultValue: { kind: "now" } | ||||
|     }) | ||||
|   } | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| // schema/index.ts | ||||
| @@ -405,7 +404,7 @@ var lists = { | ||||
|       name: (0, import_fields7.text)({ validation: { isRequired: true } }), | ||||
|       email: (0, import_fields7.text)({ | ||||
|         validation: { isRequired: true }, | ||||
|         isIndexed: "unique" | ||||
|         isIndexed: "unique", | ||||
|       }), | ||||
|       password: (0, import_fields7.password)({ validation: { isRequired: true } }), | ||||
|       posts: (0, import_fields7.relationship)({ ref: "Post.author", many: true }), | ||||
| @@ -414,9 +413,9 @@ var lists = { | ||||
|       isAdmin: (0, import_fields7.checkbox)(), | ||||
|       isEditor: (0, import_fields7.checkbox)(), | ||||
|       createdAt: (0, import_fields7.timestamp)({ | ||||
|         defaultValue: { kind: "now" } | ||||
|       }) | ||||
|     } | ||||
|         defaultValue: { kind: "now" }, | ||||
|       }), | ||||
|     }, | ||||
|   }), | ||||
|   Image, | ||||
|   Asset, | ||||
| @@ -425,7 +424,7 @@ var lists = { | ||||
|   Project, | ||||
|   Event, | ||||
|   Category, | ||||
|   Tag | ||||
|   Tag, | ||||
| }; | ||||
|  | ||||
| // auth.ts | ||||
| @@ -442,13 +441,13 @@ var { withAuth } = (0, import_auth.createAuth)({ | ||||
|   sessionData: "id name createdAt isAdmin isEditor", | ||||
|   secretField: "password", | ||||
|   initFirstItem: { | ||||
|     fields: ["name", "email", "password", "isAdmin"] | ||||
|   } | ||||
|     fields: ["name", "email", "password", "isAdmin"], | ||||
|   }, | ||||
| }); | ||||
| var sessionMaxAge = 60 * 60 * 24 * 30; | ||||
| var session = (0, import_session.statelessSessions)({ | ||||
|   maxAge: sessionMaxAge, | ||||
|   secret: sessionSecret | ||||
|   secret: sessionSecret, | ||||
| }); | ||||
|  | ||||
| // keystone.ts | ||||
| @@ -458,17 +457,17 @@ var databaseProvider = process.env.DATABASE_PROVIDER ?? "postgresql"; | ||||
| var keystone_default = withAuth( | ||||
|   (0, import_core8.config)({ | ||||
|     ui: { | ||||
|       basePath: "/cms" | ||||
|       basePath: "/cms", | ||||
|     }, | ||||
|     db: { | ||||
|       provider: databaseProvider, | ||||
|       url: databaseUrl | ||||
|       url: databaseUrl, | ||||
|     }, | ||||
|     server: { | ||||
|       cors: { | ||||
|         origin: "*", | ||||
|         methods: "GET,HEAD,PUT,PATCH,POST,DELETE" | ||||
|       } | ||||
|         methods: "GET,HEAD,PUT,PATCH,POST,DELETE", | ||||
|       }, | ||||
|     }, | ||||
|     storage: { | ||||
|       localImages: { | ||||
| @@ -476,13 +475,13 @@ var keystone_default = withAuth( | ||||
|         type: "image", | ||||
|         generateUrl: (path) => `${baseUrl}/images${path}`, | ||||
|         serverRoute: { | ||||
|           path: "/images" | ||||
|           path: "/images", | ||||
|         }, | ||||
|         storagePath: "public/images", | ||||
|       }, | ||||
|         storagePath: "public/images" | ||||
|       } | ||||
|     }, | ||||
|     lists, | ||||
|     session | ||||
|   }) | ||||
|     session, | ||||
|   }), | ||||
| ); | ||||
| //# sourceMappingURL=config.js.map | ||||
|   | ||||
| @@ -6,15 +6,13 @@ import { withAuth, session } from "./auth"; | ||||
| import { DatabaseProvider } from "@keystone-6/core/types"; | ||||
|  | ||||
| const baseUrl = process.env.BASE_URL ?? "http://localhost:3000"; | ||||
| const databaseUrl = | ||||
|   process.env.DATABASE_URL ?? | ||||
|   "postgresql://postgres:password@127.0.0.1:5432/capital"; | ||||
| const databaseUrl = process.env.DATABASE_URL ?? "postgresql://postgres:password@127.0.0.1:5432/capital"; | ||||
| const databaseProvider = process.env.DATABASE_PROVIDER ?? "postgresql"; | ||||
|  | ||||
| export default withAuth( | ||||
|   config({ | ||||
|     ui: { | ||||
|       basePath: "/cms" | ||||
|       basePath: "/cms", | ||||
|     }, | ||||
|     db: { | ||||
|       provider: databaseProvider as DatabaseProvider, | ||||
| @@ -39,5 +37,5 @@ export default withAuth( | ||||
|     }, | ||||
|     lists, | ||||
|     session, | ||||
|   }) | ||||
|   }), | ||||
| ); | ||||
|   | ||||
| @@ -7,8 +7,7 @@ const allowUser: any = { | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| const isEditor = ({ session }: { session: any }) => | ||||
|   session?.data.isEditor || session?.data.isAdmin; | ||||
| const isEditor = ({ session }: { session: any }) => session?.data.isEditor || session?.data.isAdmin; | ||||
| const allowEditor: any = { | ||||
|   operation: { | ||||
|     create: isEditor, | ||||
|   | ||||
| @@ -6,11 +6,29 @@ type User { | ||||
|   name: String | ||||
|   email: String | ||||
|   password: PasswordState | ||||
|   posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!] | ||||
|   posts( | ||||
|     where: PostWhereInput! = {} | ||||
|     orderBy: [PostOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: PostWhereUniqueInput | ||||
|   ): [Post!] | ||||
|   postsCount(where: PostWhereInput! = {}): Int | ||||
|   moments(where: MomentWhereInput! = {}, orderBy: [MomentOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: MomentWhereUniqueInput): [Moment!] | ||||
|   moments( | ||||
|     where: MomentWhereInput! = {} | ||||
|     orderBy: [MomentOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: MomentWhereUniqueInput | ||||
|   ): [Moment!] | ||||
|   momentsCount(where: MomentWhereInput! = {}): Int | ||||
|   events(where: EventWhereInput! = {}, orderBy: [EventOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: EventWhereUniqueInput): [Event!] | ||||
|   events( | ||||
|     where: EventWhereInput! = {} | ||||
|     orderBy: [EventOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: EventWhereUniqueInput | ||||
|   ): [Event!] | ||||
|   eventsCount(where: EventWhereInput! = {}): Int | ||||
|   isAdmin: Boolean | ||||
|   isEditor: Boolean | ||||
| @@ -253,7 +271,9 @@ input ImageFieldInput { | ||||
|   upload: Upload! | ||||
| } | ||||
|  | ||||
| """The `Upload` scalar type represents a file upload.""" | ||||
| """ | ||||
| The `Upload` scalar type represents a file upload. | ||||
| """ | ||||
| scalar Upload | ||||
|  | ||||
| input ImageUpdateArgs { | ||||
| @@ -335,17 +355,41 @@ type Post { | ||||
|   title: String | ||||
|   cover: Image | ||||
|   description: String | ||||
|   assets(where: AssetWhereInput! = {}, orderBy: [AssetOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: AssetWhereUniqueInput): [Asset!] | ||||
|   assets( | ||||
|     where: AssetWhereInput! = {} | ||||
|     orderBy: [AssetOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: AssetWhereUniqueInput | ||||
|   ): [Asset!] | ||||
|   assetsCount(where: AssetWhereInput! = {}): Int | ||||
|   images(where: ImageWhereInput! = {}, orderBy: [ImageOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: ImageWhereUniqueInput): [Image!] | ||||
|   images( | ||||
|     where: ImageWhereInput! = {} | ||||
|     orderBy: [ImageOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: ImageWhereUniqueInput | ||||
|   ): [Image!] | ||||
|   imagesCount(where: ImageWhereInput! = {}): Int | ||||
|   content: Post_content_Document | ||||
|   type: PostTypeType | ||||
|   isPublished: Boolean | ||||
|   author: User | ||||
|   categories(where: CategoryWhereInput! = {}, orderBy: [CategoryOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: CategoryWhereUniqueInput): [Category!] | ||||
|   categories( | ||||
|     where: CategoryWhereInput! = {} | ||||
|     orderBy: [CategoryOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: CategoryWhereUniqueInput | ||||
|   ): [Category!] | ||||
|   categoriesCount(where: CategoryWhereInput! = {}): Int | ||||
|   tags(where: TagWhereInput! = {}, orderBy: [TagOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: TagWhereUniqueInput): [Tag!] | ||||
|   tags( | ||||
|     where: TagWhereInput! = {} | ||||
|     orderBy: [TagOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: TagWhereUniqueInput | ||||
|   ): [Tag!] | ||||
|   tagsCount(where: TagWhereInput! = {}): Int | ||||
|   createdAt: DateTime | ||||
| } | ||||
| @@ -534,13 +578,31 @@ input TagRelateToManyForCreateInput { | ||||
| type Moment { | ||||
|   id: ID! | ||||
|   title: String | ||||
|   images(where: ImageWhereInput! = {}, orderBy: [ImageOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: ImageWhereUniqueInput): [Image!] | ||||
|   images( | ||||
|     where: ImageWhereInput! = {} | ||||
|     orderBy: [ImageOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: ImageWhereUniqueInput | ||||
|   ): [Image!] | ||||
|   imagesCount(where: ImageWhereInput! = {}): Int | ||||
|   content: Moment_content_Document | ||||
|   author: User | ||||
|   categories(where: CategoryWhereInput! = {}, orderBy: [CategoryOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: CategoryWhereUniqueInput): [Category!] | ||||
|   categories( | ||||
|     where: CategoryWhereInput! = {} | ||||
|     orderBy: [CategoryOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: CategoryWhereUniqueInput | ||||
|   ): [Category!] | ||||
|   categoriesCount(where: CategoryWhereInput! = {}): Int | ||||
|   tags(where: TagWhereInput! = {}, orderBy: [TagOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: TagWhereUniqueInput): [Tag!] | ||||
|   tags( | ||||
|     where: TagWhereInput! = {} | ||||
|     orderBy: [TagOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: TagWhereUniqueInput | ||||
|   ): [Tag!] | ||||
|   tagsCount(where: TagWhereInput! = {}): Int | ||||
|   createdAt: DateTime | ||||
| } | ||||
| @@ -699,9 +761,21 @@ type Event { | ||||
|   isPublished: Boolean | ||||
|   isHistory: Boolean | ||||
|   author: User | ||||
|   categories(where: CategoryWhereInput! = {}, orderBy: [CategoryOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: CategoryWhereUniqueInput): [Category!] | ||||
|   categories( | ||||
|     where: CategoryWhereInput! = {} | ||||
|     orderBy: [CategoryOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: CategoryWhereUniqueInput | ||||
|   ): [Category!] | ||||
|   categoriesCount(where: CategoryWhereInput! = {}): Int | ||||
|   tags(where: TagWhereInput! = {}, orderBy: [TagOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: TagWhereUniqueInput): [Tag!] | ||||
|   tags( | ||||
|     where: TagWhereInput! = {} | ||||
|     orderBy: [TagOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: TagWhereUniqueInput | ||||
|   ): [Tag!] | ||||
|   tagsCount(where: TagWhereInput! = {}): Int | ||||
|   createdAt: DateTime | ||||
| } | ||||
| @@ -776,11 +850,29 @@ type Category { | ||||
|   id: ID! | ||||
|   slug: String | ||||
|   name: String | ||||
|   posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!] | ||||
|   posts( | ||||
|     where: PostWhereInput! = {} | ||||
|     orderBy: [PostOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: PostWhereUniqueInput | ||||
|   ): [Post!] | ||||
|   postsCount(where: PostWhereInput! = {}): Int | ||||
|   moments(where: MomentWhereInput! = {}, orderBy: [MomentOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: MomentWhereUniqueInput): [Moment!] | ||||
|   moments( | ||||
|     where: MomentWhereInput! = {} | ||||
|     orderBy: [MomentOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: MomentWhereUniqueInput | ||||
|   ): [Moment!] | ||||
|   momentsCount(where: MomentWhereInput! = {}): Int | ||||
|   events(where: EventWhereInput! = {}, orderBy: [EventOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: EventWhereUniqueInput): [Event!] | ||||
|   events( | ||||
|     where: EventWhereInput! = {} | ||||
|     orderBy: [EventOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: EventWhereUniqueInput | ||||
|   ): [Event!] | ||||
|   eventsCount(where: EventWhereInput! = {}): Int | ||||
| } | ||||
|  | ||||
| @@ -832,11 +924,29 @@ type Tag { | ||||
|   id: ID! | ||||
|   slug: String | ||||
|   name: String | ||||
|   posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!] | ||||
|   posts( | ||||
|     where: PostWhereInput! = {} | ||||
|     orderBy: [PostOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: PostWhereUniqueInput | ||||
|   ): [Post!] | ||||
|   postsCount(where: PostWhereInput! = {}): Int | ||||
|   moments(where: MomentWhereInput! = {}, orderBy: [MomentOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: MomentWhereUniqueInput): [Moment!] | ||||
|   moments( | ||||
|     where: MomentWhereInput! = {} | ||||
|     orderBy: [MomentOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: MomentWhereUniqueInput | ||||
|   ): [Moment!] | ||||
|   momentsCount(where: MomentWhereInput! = {}): Int | ||||
|   events(where: EventWhereInput! = {}, orderBy: [EventOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: EventWhereUniqueInput): [Event!] | ||||
|   events( | ||||
|     where: EventWhereInput! = {} | ||||
|     orderBy: [EventOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: EventWhereUniqueInput | ||||
|   ): [Event!] | ||||
|   eventsCount(where: EventWhereInput! = {}): Int | ||||
| } | ||||
|  | ||||
| @@ -949,7 +1059,9 @@ type Mutation { | ||||
|   createInitialUser(data: CreateInitialUserInput!): UserAuthenticationWithPasswordSuccess! | ||||
| } | ||||
|  | ||||
| union UserAuthenticationWithPasswordResult = UserAuthenticationWithPasswordSuccess | UserAuthenticationWithPasswordFailure | ||||
| union UserAuthenticationWithPasswordResult = | ||||
|   | UserAuthenticationWithPasswordSuccess | ||||
|   | UserAuthenticationWithPasswordFailure | ||||
|  | ||||
| type UserAuthenticationWithPasswordSuccess { | ||||
|   sessionToken: String! | ||||
| @@ -968,31 +1080,85 @@ input CreateInitialUserInput { | ||||
| } | ||||
|  | ||||
| type Query { | ||||
|   users(where: UserWhereInput! = {}, orderBy: [UserOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: UserWhereUniqueInput): [User!] | ||||
|   users( | ||||
|     where: UserWhereInput! = {} | ||||
|     orderBy: [UserOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: UserWhereUniqueInput | ||||
|   ): [User!] | ||||
|   user(where: UserWhereUniqueInput!): User | ||||
|   usersCount(where: UserWhereInput! = {}): Int | ||||
|   images(where: ImageWhereInput! = {}, orderBy: [ImageOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: ImageWhereUniqueInput): [Image!] | ||||
|   images( | ||||
|     where: ImageWhereInput! = {} | ||||
|     orderBy: [ImageOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: ImageWhereUniqueInput | ||||
|   ): [Image!] | ||||
|   image(where: ImageWhereUniqueInput!): Image | ||||
|   imagesCount(where: ImageWhereInput! = {}): Int | ||||
|   assets(where: AssetWhereInput! = {}, orderBy: [AssetOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: AssetWhereUniqueInput): [Asset!] | ||||
|   assets( | ||||
|     where: AssetWhereInput! = {} | ||||
|     orderBy: [AssetOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: AssetWhereUniqueInput | ||||
|   ): [Asset!] | ||||
|   asset(where: AssetWhereUniqueInput!): Asset | ||||
|   assetsCount(where: AssetWhereInput! = {}): Int | ||||
|   posts(where: PostWhereInput! = {}, orderBy: [PostOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PostWhereUniqueInput): [Post!] | ||||
|   posts( | ||||
|     where: PostWhereInput! = {} | ||||
|     orderBy: [PostOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: PostWhereUniqueInput | ||||
|   ): [Post!] | ||||
|   post(where: PostWhereUniqueInput!): Post | ||||
|   postsCount(where: PostWhereInput! = {}): Int | ||||
|   moments(where: MomentWhereInput! = {}, orderBy: [MomentOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: MomentWhereUniqueInput): [Moment!] | ||||
|   moments( | ||||
|     where: MomentWhereInput! = {} | ||||
|     orderBy: [MomentOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: MomentWhereUniqueInput | ||||
|   ): [Moment!] | ||||
|   moment(where: MomentWhereUniqueInput!): Moment | ||||
|   momentsCount(where: MomentWhereInput! = {}): Int | ||||
|   projects(where: ProjectWhereInput! = {}, orderBy: [ProjectOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: ProjectWhereUniqueInput): [Project!] | ||||
|   projects( | ||||
|     where: ProjectWhereInput! = {} | ||||
|     orderBy: [ProjectOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: ProjectWhereUniqueInput | ||||
|   ): [Project!] | ||||
|   project(where: ProjectWhereUniqueInput!): Project | ||||
|   projectsCount(where: ProjectWhereInput! = {}): Int | ||||
|   events(where: EventWhereInput! = {}, orderBy: [EventOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: EventWhereUniqueInput): [Event!] | ||||
|   events( | ||||
|     where: EventWhereInput! = {} | ||||
|     orderBy: [EventOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: EventWhereUniqueInput | ||||
|   ): [Event!] | ||||
|   event(where: EventWhereUniqueInput!): Event | ||||
|   eventsCount(where: EventWhereInput! = {}): Int | ||||
|   categories(where: CategoryWhereInput! = {}, orderBy: [CategoryOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: CategoryWhereUniqueInput): [Category!] | ||||
|   categories( | ||||
|     where: CategoryWhereInput! = {} | ||||
|     orderBy: [CategoryOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: CategoryWhereUniqueInput | ||||
|   ): [Category!] | ||||
|   category(where: CategoryWhereUniqueInput!): Category | ||||
|   categoriesCount(where: CategoryWhereInput! = {}): Int | ||||
|   tags(where: TagWhereInput! = {}, orderBy: [TagOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: TagWhereUniqueInput): [Tag!] | ||||
|   tags( | ||||
|     where: TagWhereInput! = {} | ||||
|     orderBy: [TagOrderByInput!]! = [] | ||||
|     take: Int | ||||
|     skip: Int! = 0 | ||||
|     cursor: TagWhereUniqueInput | ||||
|   ): [Tag!] | ||||
|   tag(where: TagWhereUniqueInput!): Tag | ||||
|   tagsCount(where: TagWhereInput! = {}): Int | ||||
|   keystone: KeystoneMeta! | ||||
|   | ||||
| @@ -1,9 +1,4 @@ | ||||
| import { | ||||
|   checkbox, | ||||
|   relationship, | ||||
|   text, | ||||
|   timestamp, | ||||
| } from "@keystone-6/core/fields"; | ||||
| import { checkbox, relationship, text, timestamp } from "@keystone-6/core/fields"; | ||||
| import { document } from "@keystone-6/fields-document"; | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowEditor } from "../limit"; | ||||
|   | ||||
| @@ -1,12 +1,6 @@ | ||||
| import { list } from "@keystone-6/core"; | ||||
|  | ||||
| import { | ||||
|   text, | ||||
|   relationship, | ||||
|   password, | ||||
|   timestamp, | ||||
|   checkbox, | ||||
| } from "@keystone-6/core/fields"; | ||||
| import { text, relationship, password, timestamp, checkbox } from "@keystone-6/core/fields"; | ||||
|  | ||||
| import { allowAdmin } from "../limit"; | ||||
|  | ||||
|   | ||||
| @@ -67,4 +67,4 @@ export const Moment = list({ | ||||
|       defaultValue: { kind: "now" }, | ||||
|     }), | ||||
|   }, | ||||
|   }) | ||||
| }); | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| import { | ||||
|   checkbox, | ||||
|   relationship, | ||||
|   select, | ||||
|   text, | ||||
|   timestamp, | ||||
| } from "@keystone-6/core/fields"; | ||||
| import { checkbox, relationship, select, text, timestamp } from "@keystone-6/core/fields"; | ||||
| import { document } from "@keystone-6/fields-document"; | ||||
| import { list } from "@keystone-6/core"; | ||||
| import { allowEditor } from "../limit"; | ||||
|   | ||||
| @@ -6,5 +6,5 @@ | ||||
|     "noEmit": true, | ||||
|     "esModuleInterop": true, | ||||
|     "forceConsistentCasingInFileNames": true, | ||||
|   } | ||||
|   }, | ||||
| } | ||||
|   | ||||
| @@ -139,8 +139,7 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 200; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-200.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-200.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|  | ||||
| /* noto-serif-sc-300 - chinese-simplified */ | ||||
| @@ -149,8 +148,7 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 300; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-300.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-300.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|  | ||||
| /* noto-serif-sc-regular - chinese-simplified */ | ||||
| @@ -159,8 +157,7 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 400; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-regular.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|  | ||||
| /* noto-serif-sc-500 - chinese-simplified */ | ||||
| @@ -169,8 +166,7 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 500; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-500.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|  | ||||
| /* noto-serif-sc-600 - chinese-simplified */ | ||||
| @@ -179,8 +175,7 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 600; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-600.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|  | ||||
| /* noto-serif-sc-700 - chinese-simplified */ | ||||
| @@ -189,8 +184,7 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 700; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-700.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|  | ||||
| /* noto-serif-sc-900 - chinese-simplified */ | ||||
| @@ -199,6 +193,5 @@ body { | ||||
|   font-family: "Noto Serif SC"; | ||||
|   font-style: normal; | ||||
|   font-weight: 900; | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-900.woff2") | ||||
|     format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
|   src: url("./noto-serif-sc-v22-chinese-simplified-900.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ | ||||
| } | ||||
|   | ||||
| @@ -1,14 +1,17 @@ | ||||
| --- | ||||
| interface MenuItem { | ||||
|   href: string; | ||||
|   href?: string; | ||||
|   label: string; | ||||
|   children?: MenuItem[]; | ||||
| } | ||||
|  | ||||
| const items: MenuItem[] = [ | ||||
|   { | ||||
|     label: "情报", children: [ | ||||
|       { href: "/posts", label: "记录" }, | ||||
|   { href: "/events", label: "活动" }, | ||||
|   { href: "/projects", label: "企划" }, | ||||
|       { href: "/events", label: "活动" } | ||||
|     ] | ||||
|   } | ||||
| ]; | ||||
| --- | ||||
|  | ||||
| @@ -22,11 +25,13 @@ const items: MenuItem[] = [ | ||||
|           fill="none" | ||||
|           viewBox="0 0 24 24" | ||||
|           stroke="currentColor" | ||||
|           ><path | ||||
|         > | ||||
|           <path | ||||
|             stroke-linecap="round" | ||||
|             stroke-linejoin="round" | ||||
|             stroke-width="2" | ||||
|             d="M4 6h16M4 12h8m-8 6h16"></path></svg | ||||
|             d="M4 6h16M4 12h8m-8 6h16"></path> | ||||
|         </svg | ||||
|         > | ||||
|       </div> | ||||
|       <ul | ||||
| @@ -41,7 +46,7 @@ const items: MenuItem[] = [ | ||||
|                 <ul class="p-2"> | ||||
|                   {item.children?.map((child) => ( | ||||
|                     <li> | ||||
|                       <a href={item.href}>{item.label}</a> | ||||
|                       <a href={child.href}>{child.label}</a> | ||||
|                     </li> | ||||
|                   ))} | ||||
|                 </ul> | ||||
| @@ -61,15 +66,13 @@ const items: MenuItem[] = [ | ||||
|             {item.children ? ( | ||||
|               <details> | ||||
|                 <summary>{item.label}</summary> | ||||
|                 <ul class="p-2"> | ||||
|                 <ul class="p-2"> | ||||
|                   {item.children?.map((child) => ( | ||||
|                     <li> | ||||
|                         <a href={item.href}>{item.label}</a> | ||||
|                       <a href={child.href}>{child.label}</a> | ||||
|                     </li> | ||||
|                   ))} | ||||
|                 </ul> | ||||
|                 </ul> | ||||
|               </details> | ||||
|             ) : ( | ||||
|               <a href={item.href}>{item.label}</a> | ||||
| @@ -87,18 +90,22 @@ const items: MenuItem[] = [ | ||||
|         class="swap-on fill-current w-8 h-8" | ||||
|         xmlns="http://www.w3.org/2000/svg" | ||||
|         viewBox="0 0 24 24" | ||||
|         ><path | ||||
|       > | ||||
|         <path | ||||
|           d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z" | ||||
|         ></path></svg | ||||
|         ></path> | ||||
|       </svg | ||||
|       > | ||||
|  | ||||
|       <svg | ||||
|         class="swap-off fill-current w-8 h-8" | ||||
|         xmlns="http://www.w3.org/2000/svg" | ||||
|         viewBox="0 0 24 24" | ||||
|         ><path | ||||
|       > | ||||
|         <path | ||||
|           d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z" | ||||
|         ></path></svg | ||||
|         ></path> | ||||
|       </svg | ||||
|       > | ||||
|     </label> | ||||
|   </div> | ||||
|   | ||||
| @@ -1,13 +1,7 @@ | ||||
| import { useState, Fragment } from "react"; | ||||
|  | ||||
| export default function Media({ | ||||
|   sources, | ||||
| }: { | ||||
|   sources: { caption: string; url: string; type: string }[]; | ||||
| }) { | ||||
|   const [focus, setFocus] = useState<boolean[]>( | ||||
|     sources.map((_, idx) => idx === 0) | ||||
|   ); | ||||
| export default function Media({ sources }: { sources: { caption: string; url: string; type: string }[] }) { | ||||
|   const [focus, setFocus] = useState<boolean[]>(sources.map((_, idx) => idx === 0)); | ||||
|  | ||||
|   function changeFocus(idx: number) { | ||||
|     setFocus(focus.map((_, idx) => idx === idx)); | ||||
| @@ -26,10 +20,7 @@ export default function Media({ | ||||
|             checked={focus[idx]} | ||||
|             onChange={() => changeFocus(idx)} | ||||
|           /> | ||||
|           <div | ||||
|             role="tabpanel" | ||||
|             className="tab-content bg-base-100 border-base-300 rounded-box" | ||||
|           > | ||||
|           <div role="tabpanel" className="tab-content bg-base-100 border-base-300 rounded-box"> | ||||
|             {item.type === "video" && ( | ||||
|               <video className="mb-0 block w-full h-[360px]" controls> | ||||
|                 <source src={item.url} /> | ||||
|   | ||||
| @@ -1,24 +0,0 @@ | ||||
| --- | ||||
| import PageLayout from "../../layouts/PageLayout.astro"; | ||||
| --- | ||||
|  | ||||
| <PageLayout title="企划"> | ||||
|   <div role="alert" class="alert alert-info"> | ||||
|     <svg | ||||
|       xmlns="http://www.w3.org/2000/svg" | ||||
|       fill="none" | ||||
|       viewBox="0 0 24 24" | ||||
|       class="stroke-current shrink-0 w-6 h-6" | ||||
|       ><path | ||||
|         stroke-linecap="round" | ||||
|         stroke-linejoin="round" | ||||
|         stroke-width="2" | ||||
|         d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" | ||||
|       ></path></svg | ||||
|     > | ||||
|     <div> | ||||
|         <p>暂无可公开企划,若想进一步探索,可以加入我们的 GoatChat!</p> | ||||
|         <a class="link" href="https://matrix.to/#/#plaza:matrix.smartsheep.studio">邀请链接 👈</a> | ||||
|     </div> | ||||
|   </div> | ||||
| </PageLayout> | ||||
| @@ -1,17 +1,14 @@ | ||||
| const defaultCms = "https://smartsheep.studio"; | ||||
|  | ||||
| export async function graphQuery(query: string, variables: any) { | ||||
|   const response = await fetch( | ||||
|     `${process.env.PUBLIC_CMS ?? defaultCms}/api/graphql`, | ||||
|     { | ||||
|   const response = await fetch(`${process.env.PUBLIC_CMS ?? defaultCms}/api/graphql`, { | ||||
|     method: "POST", | ||||
|     headers: { "Content-Type": "application/json" }, | ||||
|     body: JSON.stringify({ | ||||
|       query, | ||||
|       variables, | ||||
|     }), | ||||
|     }, | ||||
|   ); | ||||
|   }); | ||||
|  | ||||
|   return await response.json(); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user