@prosophia/personal-cv 0.0.3 → 0.0.4

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.
@@ -0,0 +1,540 @@
1
+ // src/schemas/schemas/siteSettings.ts
2
+ import { defineField, defineType } from "sanity";
3
+ var siteSettings_default = defineType({
4
+ name: "siteSettings",
5
+ title: "Site Settings",
6
+ type: "document",
7
+ fields: [
8
+ defineField({
9
+ name: "siteName",
10
+ title: "Site Name",
11
+ type: "string",
12
+ validation: (Rule) => Rule.required()
13
+ }),
14
+ defineField({
15
+ name: "siteTitle",
16
+ title: "Site Title (Browser Tab)",
17
+ type: "string",
18
+ validation: (Rule) => Rule.required()
19
+ }),
20
+ defineField({
21
+ name: "primaryColor",
22
+ title: "Primary Color",
23
+ type: "string",
24
+ description: "Main accent color (hex code, e.g., #000000)",
25
+ validation: (Rule) => Rule.required().regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color")
26
+ }),
27
+ defineField({
28
+ name: "backgroundColor",
29
+ title: "Background Color",
30
+ type: "string",
31
+ description: "Main background color (hex code, e.g., #ffffff)",
32
+ validation: (Rule) => Rule.required().regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color")
33
+ }),
34
+ defineField({
35
+ name: "textColor",
36
+ title: "Text Color",
37
+ type: "string",
38
+ description: "Main text color (hex code, e.g., #111418)",
39
+ validation: (Rule) => Rule.required().regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color")
40
+ }),
41
+ defineField({
42
+ name: "secondaryTextColor",
43
+ title: "Secondary Text Color",
44
+ type: "string",
45
+ description: "Secondary/muted text color (hex code, e.g., #637588)",
46
+ validation: (Rule) => Rule.required().regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color")
47
+ }),
48
+ defineField({
49
+ name: "contactEmail",
50
+ title: "Contact Email",
51
+ type: "string",
52
+ validation: (Rule) => Rule.email()
53
+ }),
54
+ defineField({
55
+ name: "footerText",
56
+ title: "Footer Text",
57
+ type: "string"
58
+ })
59
+ ],
60
+ preview: {
61
+ prepare() {
62
+ return {
63
+ title: "Site Settings"
64
+ };
65
+ }
66
+ }
67
+ });
68
+
69
+ // src/schemas/schemas/about.ts
70
+ import { defineField as defineField2, defineType as defineType2 } from "sanity";
71
+ var about_default = defineType2({
72
+ name: "about",
73
+ title: "About Section",
74
+ type: "document",
75
+ fields: [
76
+ defineField2({
77
+ name: "name",
78
+ title: "Full Name",
79
+ type: "string",
80
+ validation: (Rule) => Rule.required()
81
+ }),
82
+ defineField2({
83
+ name: "greeting",
84
+ title: "Greeting",
85
+ type: "string",
86
+ description: `e.g., "Hello, I'm Jane Doe."`,
87
+ validation: (Rule) => Rule.required()
88
+ }),
89
+ defineField2({
90
+ name: "title",
91
+ title: "Professional Title",
92
+ type: "string",
93
+ description: 'e.g., "PhD Candidate at MIT focusing on Human-Computer Interaction."',
94
+ validation: (Rule) => Rule.required()
95
+ }),
96
+ defineField2({
97
+ name: "bio",
98
+ title: "Bio",
99
+ type: "text",
100
+ description: "A longer description of your research interests and background.",
101
+ validation: (Rule) => Rule.required()
102
+ }),
103
+ defineField2({
104
+ name: "profileImage",
105
+ title: "Profile Image",
106
+ type: "image",
107
+ options: {
108
+ hotspot: true
109
+ }
110
+ }),
111
+ defineField2({
112
+ name: "socialLinks",
113
+ title: "Social Links",
114
+ type: "array",
115
+ of: [
116
+ {
117
+ type: "object",
118
+ fields: [
119
+ defineField2({
120
+ name: "platform",
121
+ title: "Platform",
122
+ type: "string",
123
+ options: {
124
+ list: [
125
+ { title: "Google Scholar", value: "scholar" },
126
+ { title: "LinkedIn", value: "linkedin" },
127
+ { title: "Twitter/X", value: "twitter" },
128
+ { title: "GitHub", value: "github" },
129
+ { title: "ORCID", value: "orcid" },
130
+ { title: "ResearchGate", value: "researchgate" }
131
+ ]
132
+ },
133
+ validation: (Rule) => Rule.required()
134
+ }),
135
+ defineField2({
136
+ name: "url",
137
+ title: "URL",
138
+ type: "url",
139
+ validation: (Rule) => Rule.required()
140
+ })
141
+ ],
142
+ preview: {
143
+ select: {
144
+ title: "platform",
145
+ subtitle: "url"
146
+ }
147
+ }
148
+ }
149
+ ]
150
+ })
151
+ ],
152
+ preview: {
153
+ select: {
154
+ title: "name",
155
+ media: "profileImage"
156
+ }
157
+ }
158
+ });
159
+
160
+ // src/schemas/schemas/project.ts
161
+ import { defineField as defineField3, defineType as defineType3 } from "sanity";
162
+ var project_default = defineType3({
163
+ name: "project",
164
+ title: "Project",
165
+ type: "document",
166
+ fields: [
167
+ defineField3({
168
+ name: "title",
169
+ title: "Title",
170
+ type: "string",
171
+ validation: (Rule) => Rule.required()
172
+ }),
173
+ defineField3({
174
+ name: "slug",
175
+ title: "Slug",
176
+ type: "slug",
177
+ options: {
178
+ source: "title",
179
+ maxLength: 96
180
+ },
181
+ validation: (Rule) => Rule.required()
182
+ }),
183
+ defineField3({
184
+ name: "description",
185
+ title: "Short Description",
186
+ type: "text",
187
+ rows: 3,
188
+ validation: (Rule) => Rule.required()
189
+ }),
190
+ defineField3({
191
+ name: "image",
192
+ title: "Cover Image",
193
+ type: "image",
194
+ options: {
195
+ hotspot: true
196
+ }
197
+ }),
198
+ defineField3({
199
+ name: "imageAlt",
200
+ title: "Image Alt Text",
201
+ type: "string",
202
+ description: "Describe the image for accessibility"
203
+ }),
204
+ defineField3({
205
+ name: "caseStudyUrl",
206
+ title: "Case Study URL",
207
+ type: "url",
208
+ description: "Link to the full case study (optional)"
209
+ }),
210
+ defineField3({
211
+ name: "order",
212
+ title: "Display Order",
213
+ type: "number",
214
+ description: "Lower numbers appear first"
215
+ }),
216
+ defineField3({
217
+ name: "featured",
218
+ title: "Featured",
219
+ type: "boolean",
220
+ description: "Show this project on the homepage",
221
+ initialValue: true
222
+ })
223
+ ],
224
+ orderings: [
225
+ {
226
+ title: "Display Order",
227
+ name: "orderAsc",
228
+ by: [{ field: "order", direction: "asc" }]
229
+ }
230
+ ],
231
+ preview: {
232
+ select: {
233
+ title: "title",
234
+ media: "image"
235
+ }
236
+ }
237
+ });
238
+
239
+ // src/schemas/schemas/publication.ts
240
+ import { defineField as defineField4, defineType as defineType4 } from "sanity";
241
+ var publication_default = defineType4({
242
+ name: "publication",
243
+ title: "Publication",
244
+ type: "document",
245
+ fields: [
246
+ defineField4({
247
+ name: "title",
248
+ title: "Title",
249
+ type: "string",
250
+ validation: (Rule) => Rule.required()
251
+ }),
252
+ defineField4({
253
+ name: "authors",
254
+ title: "Authors",
255
+ type: "string",
256
+ description: 'e.g., "Jane Doe, John Smith, Alice Johnson"',
257
+ validation: (Rule) => Rule.required()
258
+ }),
259
+ defineField4({
260
+ name: "venue",
261
+ title: "Venue/Journal",
262
+ type: "string",
263
+ description: 'e.g., "Proceedings of the CHI Conference on Human Factors in Computing Systems"',
264
+ validation: (Rule) => Rule.required()
265
+ }),
266
+ defineField4({
267
+ name: "year",
268
+ title: "Year",
269
+ type: "number",
270
+ validation: (Rule) => Rule.required().min(1900).max(2100)
271
+ }),
272
+ defineField4({
273
+ name: "pdfUrl",
274
+ title: "PDF URL",
275
+ type: "url"
276
+ }),
277
+ defineField4({
278
+ name: "codeUrl",
279
+ title: "Code URL",
280
+ type: "url"
281
+ }),
282
+ defineField4({
283
+ name: "videoUrl",
284
+ title: "Video URL",
285
+ type: "url"
286
+ }),
287
+ defineField4({
288
+ name: "bibtex",
289
+ title: "BibTeX",
290
+ type: "text",
291
+ rows: 6
292
+ }),
293
+ defineField4({
294
+ name: "order",
295
+ title: "Display Order",
296
+ type: "number",
297
+ description: "Lower numbers appear first (default: sort by year)"
298
+ })
299
+ ],
300
+ orderings: [
301
+ {
302
+ title: "Year (Newest First)",
303
+ name: "yearDesc",
304
+ by: [{ field: "year", direction: "desc" }]
305
+ },
306
+ {
307
+ title: "Display Order",
308
+ name: "orderAsc",
309
+ by: [{ field: "order", direction: "asc" }]
310
+ }
311
+ ],
312
+ preview: {
313
+ select: {
314
+ title: "title",
315
+ subtitle: "year"
316
+ },
317
+ prepare({ title, subtitle }) {
318
+ return {
319
+ title,
320
+ subtitle: subtitle?.toString()
321
+ };
322
+ }
323
+ }
324
+ });
325
+
326
+ // src/schemas/schemas/cvSection.ts
327
+ import { defineField as defineField5, defineType as defineType5 } from "sanity";
328
+ var cvSection_default = defineType5({
329
+ name: "cvSection",
330
+ title: "CV Section",
331
+ type: "document",
332
+ fields: [
333
+ defineField5({
334
+ name: "heading",
335
+ title: "Heading",
336
+ type: "string",
337
+ validation: (Rule) => Rule.required()
338
+ }),
339
+ defineField5({
340
+ name: "description",
341
+ title: "Description",
342
+ type: "text",
343
+ rows: 3
344
+ }),
345
+ defineField5({
346
+ name: "cvFile",
347
+ title: "CV File (PDF)",
348
+ type: "file",
349
+ options: {
350
+ accept: ".pdf"
351
+ }
352
+ }),
353
+ defineField5({
354
+ name: "buttonText",
355
+ title: "Button Text",
356
+ type: "string",
357
+ initialValue: "Download Full CV"
358
+ })
359
+ ],
360
+ preview: {
361
+ prepare() {
362
+ return {
363
+ title: "CV Section"
364
+ };
365
+ }
366
+ }
367
+ });
368
+
369
+ // src/schemas/schemas/navigation.ts
370
+ import { defineField as defineField6, defineType as defineType6 } from "sanity";
371
+ var navigation_default = defineType6({
372
+ name: "navigation",
373
+ title: "Navigation",
374
+ type: "document",
375
+ fields: [
376
+ defineField6({
377
+ name: "links",
378
+ title: "Navigation Links",
379
+ type: "array",
380
+ of: [
381
+ {
382
+ type: "object",
383
+ fields: [
384
+ defineField6({
385
+ name: "label",
386
+ title: "Label",
387
+ type: "string",
388
+ validation: (Rule) => Rule.required()
389
+ }),
390
+ defineField6({
391
+ name: "href",
392
+ title: "Link",
393
+ type: "string",
394
+ description: "e.g., #about, #projects, /some-page",
395
+ validation: (Rule) => Rule.required()
396
+ })
397
+ ],
398
+ preview: {
399
+ select: {
400
+ title: "label",
401
+ subtitle: "href"
402
+ }
403
+ }
404
+ }
405
+ ]
406
+ }),
407
+ defineField6({
408
+ name: "showContactButton",
409
+ title: "Show Contact Button",
410
+ type: "boolean",
411
+ initialValue: true
412
+ }),
413
+ defineField6({
414
+ name: "contactButtonText",
415
+ title: "Contact Button Text",
416
+ type: "string",
417
+ initialValue: "Contact"
418
+ })
419
+ ],
420
+ preview: {
421
+ prepare() {
422
+ return {
423
+ title: "Navigation"
424
+ };
425
+ }
426
+ }
427
+ });
428
+
429
+ // src/schemas/queries.ts
430
+ import { groq } from "next-sanity";
431
+ var siteSettingsQuery = groq`
432
+ *[_type == "siteSettings"][0] {
433
+ siteName,
434
+ siteTitle,
435
+ primaryColor,
436
+ backgroundColor,
437
+ textColor,
438
+ secondaryTextColor,
439
+ contactEmail,
440
+ footerText
441
+ }
442
+ `;
443
+ var navigationQuery = groq`
444
+ *[_type == "navigation"][0] {
445
+ links[] {
446
+ label,
447
+ href
448
+ },
449
+ showContactButton,
450
+ contactButtonText
451
+ }
452
+ `;
453
+ var aboutQuery = groq`
454
+ *[_type == "about"][0] {
455
+ name,
456
+ greeting,
457
+ title,
458
+ bio,
459
+ "profileImageUrl": profileImage.asset->url,
460
+ socialLinks[] {
461
+ platform,
462
+ url
463
+ }
464
+ }
465
+ `;
466
+ var projectsQuery = groq`
467
+ *[_type == "project" && featured == true] | order(order asc) {
468
+ _id,
469
+ title,
470
+ description,
471
+ "imageUrl": image.asset->url,
472
+ imageAlt,
473
+ caseStudyUrl,
474
+ slug
475
+ }
476
+ `;
477
+ var publicationsQuery = groq`
478
+ *[_type == "publication"] | order(year desc, order asc) {
479
+ _id,
480
+ title,
481
+ authors,
482
+ venue,
483
+ year,
484
+ pdfUrl,
485
+ codeUrl,
486
+ videoUrl,
487
+ bibtex
488
+ }
489
+ `;
490
+ var cvSectionQuery = groq`
491
+ *[_type == "cvSection"][0] {
492
+ heading,
493
+ description,
494
+ buttonText,
495
+ "cvFileUrl": cvFile.asset->url
496
+ }
497
+ `;
498
+ var projectBySlugQuery = groq`
499
+ *[_type == "project" && slug.current == $slug][0] {
500
+ _id,
501
+ title,
502
+ description,
503
+ "imageUrl": image.asset->url,
504
+ imageAlt,
505
+ caseStudyUrl,
506
+ slug
507
+ }
508
+ `;
509
+ var allProjectSlugsQuery = groq`
510
+ *[_type == "project" && defined(slug.current)][].slug.current
511
+ `;
512
+
513
+ // src/schemas/index.ts
514
+ var schemas = [
515
+ siteSettings_default,
516
+ about_default,
517
+ project_default,
518
+ publication_default,
519
+ cvSection_default,
520
+ navigation_default
521
+ ];
522
+ var schemaTypes = schemas;
523
+ export {
524
+ about_default as about,
525
+ aboutQuery,
526
+ allProjectSlugsQuery,
527
+ cvSection_default as cvSection,
528
+ cvSectionQuery,
529
+ navigation_default as navigation,
530
+ navigationQuery,
531
+ project_default as project,
532
+ projectBySlugQuery,
533
+ projectsQuery,
534
+ publication_default as publication,
535
+ publicationsQuery,
536
+ schemaTypes,
537
+ schemas,
538
+ siteSettings_default as siteSettings,
539
+ siteSettingsQuery
540
+ };
package/package.json CHANGED
@@ -1,19 +1,23 @@
1
1
  {
2
2
  "name": "@prosophia/personal-cv",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Personal academic CV template for Prosophia",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
7
8
  "exports": {
8
9
  ".": {
10
+ "types": "./dist/index.d.ts",
9
11
  "import": "./dist/index.mjs",
10
12
  "require": "./dist/index.js"
11
13
  },
12
14
  "./schemas": {
15
+ "types": "./dist/schemas/index.d.ts",
13
16
  "import": "./dist/schemas/index.mjs",
14
17
  "require": "./dist/schemas/index.js"
15
18
  },
16
19
  "./layouts": {
20
+ "types": "./dist/layouts/index.d.ts",
17
21
  "import": "./dist/layouts/index.mjs",
18
22
  "require": "./dist/layouts/index.js"
19
23
  },
@@ -26,13 +30,20 @@
26
30
  "lint": "eslint src/"
27
31
  },
28
32
  "peerDependencies": {
33
+ "@portabletext/react": ">=3.0.0",
34
+ "@sanity/image-url": ">=1.0.0",
29
35
  "next": ">=14.0.0",
36
+ "next-sanity": ">=7.0.0",
30
37
  "react": ">=18.0.0",
31
- "react-dom": ">=18.0.0"
38
+ "react-dom": ">=18.0.0",
39
+ "sanity": ">=3.0.0"
32
40
  },
33
41
  "devDependencies": {
42
+ "@sanity/image-url": "^1.0.0",
34
43
  "@types/react": "^18.0.0",
35
44
  "@types/react-dom": "^18.0.0",
45
+ "next-sanity": "^9.0.0",
46
+ "sanity": "^3.0.0",
36
47
  "tsup": "^8.0.0",
37
48
  "typescript": "^5.0.0"
38
49
  },