@prosophia/lab-techy 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,1278 @@
1
+ // src/schemas/schemas/objects/link.ts
2
+ import { defineType, defineField } from "sanity";
3
+ var link_default = defineType({
4
+ name: "link",
5
+ title: "Link",
6
+ type: "object",
7
+ fields: [
8
+ defineField({
9
+ name: "label",
10
+ title: "Label",
11
+ type: "string",
12
+ validation: (Rule) => Rule.required()
13
+ }),
14
+ defineField({
15
+ name: "url",
16
+ title: "URL",
17
+ type: "url",
18
+ validation: (Rule) => Rule.required().uri({ allowRelative: true })
19
+ })
20
+ ],
21
+ preview: {
22
+ select: { title: "label", subtitle: "url" }
23
+ }
24
+ });
25
+
26
+ // src/schemas/schemas/objects/socialLink.ts
27
+ import { defineType as defineType2, defineField as defineField2 } from "sanity";
28
+ var socialLink_default = defineType2({
29
+ name: "socialLink",
30
+ title: "Social Link",
31
+ type: "object",
32
+ fields: [
33
+ defineField2({
34
+ name: "platform",
35
+ title: "Platform",
36
+ type: "string",
37
+ options: {
38
+ list: [
39
+ { title: "Twitter/X", value: "twitter" },
40
+ { title: "LinkedIn", value: "linkedin" },
41
+ { title: "GitHub", value: "github" },
42
+ { title: "Google Scholar", value: "scholar" },
43
+ { title: "ORCID", value: "orcid" },
44
+ { title: "Personal Website", value: "website" },
45
+ { title: "Email", value: "email" },
46
+ { title: "YouTube", value: "youtube" },
47
+ { title: "Instagram", value: "instagram" }
48
+ ]
49
+ },
50
+ validation: (Rule) => Rule.required()
51
+ }),
52
+ defineField2({
53
+ name: "url",
54
+ title: "URL",
55
+ type: "url",
56
+ validation: (Rule) => Rule.required()
57
+ })
58
+ ],
59
+ preview: {
60
+ select: { title: "platform", subtitle: "url" }
61
+ }
62
+ });
63
+
64
+ // src/schemas/schemas/objects/stat.ts
65
+ import { defineType as defineType3, defineField as defineField3 } from "sanity";
66
+ var stat_default = defineType3({
67
+ name: "stat",
68
+ title: "Statistic",
69
+ type: "object",
70
+ fields: [
71
+ defineField3({
72
+ name: "value",
73
+ title: "Value",
74
+ type: "string",
75
+ description: 'e.g., "120+", "15", "$2M"',
76
+ validation: (Rule) => Rule.required()
77
+ }),
78
+ defineField3({
79
+ name: "label",
80
+ title: "Label",
81
+ type: "string",
82
+ description: 'e.g., "Published Papers", "Active Grants"',
83
+ validation: (Rule) => Rule.required()
84
+ })
85
+ ],
86
+ preview: {
87
+ select: { title: "value", subtitle: "label" }
88
+ }
89
+ });
90
+
91
+ // src/schemas/schemas/objects/researchArea.ts
92
+ import { defineType as defineType4, defineField as defineField4 } from "sanity";
93
+ var researchArea_default = defineType4({
94
+ name: "researchArea",
95
+ title: "Research Area",
96
+ type: "object",
97
+ fields: [
98
+ defineField4({
99
+ name: "icon",
100
+ title: "Material Icon Name",
101
+ type: "string",
102
+ description: 'Material Symbols icon name (e.g., "visibility", "precision_manufacturing", "chat")',
103
+ validation: (Rule) => Rule.required()
104
+ }),
105
+ defineField4({
106
+ name: "title",
107
+ title: "Title",
108
+ type: "string",
109
+ validation: (Rule) => Rule.required()
110
+ }),
111
+ defineField4({
112
+ name: "description",
113
+ title: "Description",
114
+ type: "text",
115
+ rows: 3,
116
+ validation: (Rule) => Rule.required().max(300)
117
+ })
118
+ ],
119
+ preview: {
120
+ select: { title: "title", subtitle: "description" }
121
+ }
122
+ });
123
+
124
+ // src/schemas/schemas/objects/ctaButton.ts
125
+ import { defineType as defineType5, defineField as defineField5 } from "sanity";
126
+ var ctaButton_default = defineType5({
127
+ name: "ctaButton",
128
+ title: "CTA Button",
129
+ type: "object",
130
+ fields: [
131
+ defineField5({
132
+ name: "label",
133
+ title: "Button Label",
134
+ type: "string",
135
+ validation: (Rule) => Rule.required()
136
+ }),
137
+ defineField5({
138
+ name: "href",
139
+ title: "Link URL",
140
+ type: "string",
141
+ description: "Internal path (e.g., /publications) or external URL",
142
+ validation: (Rule) => Rule.required()
143
+ }),
144
+ defineField5({
145
+ name: "variant",
146
+ title: "Button Style",
147
+ type: "string",
148
+ options: {
149
+ list: [
150
+ { title: "Primary (Filled)", value: "primary" },
151
+ { title: "Secondary (Outline)", value: "secondary" }
152
+ ],
153
+ layout: "radio"
154
+ },
155
+ initialValue: "primary"
156
+ })
157
+ ],
158
+ preview: {
159
+ select: { title: "label", subtitle: "href" }
160
+ }
161
+ });
162
+
163
+ // src/schemas/schemas/objects/portableText.ts
164
+ import { defineType as defineType6, defineArrayMember } from "sanity";
165
+ var portableText_default = defineType6({
166
+ name: "portableText",
167
+ title: "Rich Text",
168
+ type: "array",
169
+ of: [
170
+ defineArrayMember({
171
+ type: "block",
172
+ styles: [
173
+ { title: "Normal", value: "normal" },
174
+ { title: "Heading 2", value: "h2" },
175
+ { title: "Heading 3", value: "h3" },
176
+ { title: "Quote", value: "blockquote" }
177
+ ],
178
+ lists: [
179
+ { title: "Bullet", value: "bullet" },
180
+ { title: "Numbered", value: "number" }
181
+ ],
182
+ marks: {
183
+ decorators: [
184
+ { title: "Bold", value: "strong" },
185
+ { title: "Italic", value: "em" },
186
+ { title: "Code", value: "code" }
187
+ ],
188
+ annotations: [
189
+ {
190
+ name: "link",
191
+ type: "object",
192
+ title: "Link",
193
+ fields: [
194
+ {
195
+ name: "href",
196
+ type: "url",
197
+ title: "URL"
198
+ }
199
+ ]
200
+ }
201
+ ]
202
+ }
203
+ }),
204
+ defineArrayMember({
205
+ type: "image",
206
+ options: { hotspot: true },
207
+ fields: [
208
+ {
209
+ name: "caption",
210
+ type: "string",
211
+ title: "Caption"
212
+ },
213
+ {
214
+ name: "alt",
215
+ type: "string",
216
+ title: "Alt Text"
217
+ }
218
+ ]
219
+ }),
220
+ defineArrayMember({
221
+ name: "note",
222
+ title: "Note Block",
223
+ type: "object",
224
+ fields: [
225
+ { name: "title", type: "string", title: "Note Title" },
226
+ { name: "text", type: "text", title: "Note Content" }
227
+ ],
228
+ preview: {
229
+ select: { title: "title" },
230
+ prepare: ({ title }) => ({ title: `Note: ${title || "Untitled"}` })
231
+ }
232
+ })
233
+ ]
234
+ });
235
+
236
+ // src/schemas/schemas/documents/publication.ts
237
+ import { defineType as defineType7, defineField as defineField6 } from "sanity";
238
+ var publication_default = defineType7({
239
+ name: "publication",
240
+ title: "Publication",
241
+ type: "document",
242
+ icon: () => "\u{1F4C4}",
243
+ groups: [
244
+ { name: "content", title: "Content", default: true },
245
+ { name: "metadata", title: "Metadata" },
246
+ { name: "links", title: "Links" }
247
+ ],
248
+ fields: [
249
+ defineField6({
250
+ name: "title",
251
+ title: "Paper Title",
252
+ type: "string",
253
+ group: "content",
254
+ validation: (Rule) => Rule.required()
255
+ }),
256
+ defineField6({
257
+ name: "authors",
258
+ title: "Authors",
259
+ type: "array",
260
+ of: [{ type: "string" }],
261
+ group: "content",
262
+ description: "List authors in order. First author will be highlighted.",
263
+ validation: (Rule) => Rule.required().min(1)
264
+ }),
265
+ defineField6({
266
+ name: "abstract",
267
+ title: "Abstract",
268
+ type: "text",
269
+ group: "content",
270
+ rows: 6
271
+ }),
272
+ defineField6({
273
+ name: "venue",
274
+ title: "Venue",
275
+ type: "string",
276
+ group: "metadata",
277
+ description: 'Conference, journal, or workshop name (e.g., "CVPR 2024", "Nature Machine Intelligence")',
278
+ validation: (Rule) => Rule.required()
279
+ }),
280
+ defineField6({
281
+ name: "venueType",
282
+ title: "Venue Type",
283
+ type: "string",
284
+ group: "metadata",
285
+ options: {
286
+ list: [
287
+ { title: "Conference", value: "conference" },
288
+ { title: "Journal", value: "journal" },
289
+ { title: "Workshop", value: "workshop" }
290
+ ],
291
+ layout: "radio"
292
+ },
293
+ validation: (Rule) => Rule.required()
294
+ }),
295
+ defineField6({
296
+ name: "venueColor",
297
+ title: "Badge Color",
298
+ type: "string",
299
+ group: "metadata",
300
+ options: {
301
+ list: [
302
+ { title: "Blue", value: "blue" },
303
+ { title: "Purple", value: "purple" },
304
+ { title: "Amber", value: "amber" },
305
+ { title: "Rose", value: "rose" },
306
+ { title: "Green", value: "green" }
307
+ ]
308
+ },
309
+ initialValue: "blue"
310
+ }),
311
+ defineField6({
312
+ name: "year",
313
+ title: "Publication Year",
314
+ type: "number",
315
+ group: "metadata",
316
+ validation: (Rule) => Rule.required().min(1990).max(2100)
317
+ }),
318
+ defineField6({
319
+ name: "oral",
320
+ title: "Oral Presentation",
321
+ type: "boolean",
322
+ group: "metadata",
323
+ description: "Check if this was an oral/spotlight presentation",
324
+ initialValue: false
325
+ }),
326
+ defineField6({
327
+ name: "links",
328
+ title: "Resource Links",
329
+ type: "array",
330
+ group: "links",
331
+ of: [
332
+ {
333
+ type: "object",
334
+ fields: [
335
+ {
336
+ name: "label",
337
+ title: "Label",
338
+ type: "string",
339
+ options: {
340
+ list: ["PDF", "Code", "BibTeX", "Dataset", "Project Page", "Video", "Slides", "arXiv"]
341
+ }
342
+ },
343
+ { name: "url", title: "URL", type: "url" }
344
+ ],
345
+ preview: {
346
+ select: { title: "label", subtitle: "url" }
347
+ }
348
+ }
349
+ ]
350
+ })
351
+ ],
352
+ preview: {
353
+ select: {
354
+ title: "title",
355
+ venue: "venue",
356
+ year: "year"
357
+ },
358
+ prepare: ({ title, venue, year }) => ({
359
+ title,
360
+ subtitle: `${venue} (${year})`
361
+ })
362
+ },
363
+ orderings: [
364
+ {
365
+ title: "Year, New First",
366
+ name: "yearDesc",
367
+ by: [{ field: "year", direction: "desc" }]
368
+ }
369
+ ]
370
+ });
371
+
372
+ // src/schemas/schemas/documents/teamMember.ts
373
+ import { defineType as defineType8, defineField as defineField7 } from "sanity";
374
+ var teamMember_default = defineType8({
375
+ name: "teamMember",
376
+ title: "Team Member",
377
+ type: "document",
378
+ icon: () => "\u{1F464}",
379
+ groups: [
380
+ { name: "basic", title: "Basic Info", default: true },
381
+ { name: "details", title: "Details" },
382
+ { name: "alumni", title: "Alumni Info" },
383
+ { name: "social", title: "Links" }
384
+ ],
385
+ fields: [
386
+ defineField7({
387
+ name: "name",
388
+ title: "Full Name",
389
+ type: "string",
390
+ group: "basic",
391
+ validation: (Rule) => Rule.required()
392
+ }),
393
+ defineField7({
394
+ name: "role",
395
+ title: "Role/Title",
396
+ type: "string",
397
+ group: "basic",
398
+ description: 'e.g., "PhD Candidate", "Postdoctoral Researcher", "Principal Investigator"',
399
+ validation: (Rule) => Rule.required()
400
+ }),
401
+ defineField7({
402
+ name: "category",
403
+ title: "Category",
404
+ type: "string",
405
+ group: "basic",
406
+ options: {
407
+ list: [
408
+ { title: "Principal Investigator", value: "pi" },
409
+ { title: "Postdoc", value: "postdoc" },
410
+ { title: "PhD Student", value: "phd" },
411
+ { title: "Masters Student", value: "masters" },
412
+ { title: "Undergraduate", value: "undergrad" },
413
+ { title: "Research Staff", value: "staff" },
414
+ { title: "Alumni", value: "alumni" }
415
+ ]
416
+ },
417
+ validation: (Rule) => Rule.required()
418
+ }),
419
+ defineField7({
420
+ name: "image",
421
+ title: "Profile Photo",
422
+ type: "image",
423
+ group: "basic",
424
+ options: {
425
+ hotspot: true
426
+ },
427
+ fields: [
428
+ {
429
+ name: "alt",
430
+ type: "string",
431
+ title: "Alt Text"
432
+ }
433
+ ]
434
+ }),
435
+ defineField7({
436
+ name: "bio",
437
+ title: "Short Biography",
438
+ type: "text",
439
+ group: "details",
440
+ rows: 4,
441
+ description: "Brief description or research focus (for team cards)"
442
+ }),
443
+ defineField7({
444
+ name: "extendedBio",
445
+ title: "Extended Biography",
446
+ type: "portableText",
447
+ group: "details",
448
+ description: "Full biography (for PI profile section)"
449
+ }),
450
+ defineField7({
451
+ name: "isAlumni",
452
+ title: "Alumni Status",
453
+ type: "boolean",
454
+ group: "alumni",
455
+ initialValue: false
456
+ }),
457
+ defineField7({
458
+ name: "graduationYear",
459
+ title: "Graduation Year",
460
+ type: "number",
461
+ group: "alumni",
462
+ hidden: ({ document }) => !document?.isAlumni
463
+ }),
464
+ defineField7({
465
+ name: "currentPosition",
466
+ title: "Current Position",
467
+ type: "string",
468
+ group: "alumni",
469
+ description: 'e.g., "Data Scientist at DeepMind"',
470
+ hidden: ({ document }) => !document?.isAlumni
471
+ }),
472
+ defineField7({
473
+ name: "socialLinks",
474
+ title: "Social & Academic Links",
475
+ type: "array",
476
+ group: "social",
477
+ of: [{ type: "socialLink" }]
478
+ }),
479
+ defineField7({
480
+ name: "email",
481
+ title: "Email",
482
+ type: "email",
483
+ group: "social"
484
+ }),
485
+ defineField7({
486
+ name: "order",
487
+ title: "Display Order",
488
+ type: "number",
489
+ group: "basic",
490
+ description: "Lower numbers appear first within category"
491
+ })
492
+ ],
493
+ preview: {
494
+ select: {
495
+ title: "name",
496
+ subtitle: "role",
497
+ media: "image"
498
+ }
499
+ },
500
+ orderings: [
501
+ {
502
+ title: "Display Order",
503
+ name: "orderAsc",
504
+ by: [
505
+ { field: "order", direction: "asc" },
506
+ { field: "name", direction: "asc" }
507
+ ]
508
+ }
509
+ ]
510
+ });
511
+
512
+ // src/schemas/schemas/documents/newsArticle.ts
513
+ import { defineType as defineType9, defineField as defineField8 } from "sanity";
514
+ var newsArticle_default = defineType9({
515
+ name: "newsArticle",
516
+ title: "News Article",
517
+ type: "document",
518
+ icon: () => "\u{1F4F0}",
519
+ groups: [
520
+ { name: "content", title: "Content", default: true },
521
+ { name: "metadata", title: "Metadata" },
522
+ { name: "seo", title: "SEO" }
523
+ ],
524
+ fields: [
525
+ defineField8({
526
+ name: "title",
527
+ title: "Title",
528
+ type: "string",
529
+ group: "content",
530
+ validation: (Rule) => Rule.required().max(100)
531
+ }),
532
+ defineField8({
533
+ name: "slug",
534
+ title: "Slug",
535
+ type: "slug",
536
+ group: "content",
537
+ options: {
538
+ source: "title",
539
+ maxLength: 96
540
+ },
541
+ validation: (Rule) => Rule.required()
542
+ }),
543
+ defineField8({
544
+ name: "excerpt",
545
+ title: "Excerpt",
546
+ type: "text",
547
+ group: "content",
548
+ rows: 3,
549
+ description: "Brief summary for article cards (max 200 characters)",
550
+ validation: (Rule) => Rule.required().max(300)
551
+ }),
552
+ defineField8({
553
+ name: "image",
554
+ title: "Featured Image",
555
+ type: "image",
556
+ group: "content",
557
+ options: { hotspot: true },
558
+ fields: [
559
+ { name: "alt", type: "string", title: "Alt Text" },
560
+ { name: "caption", type: "string", title: "Caption" }
561
+ ],
562
+ validation: (Rule) => Rule.required()
563
+ }),
564
+ defineField8({
565
+ name: "content",
566
+ title: "Article Content",
567
+ type: "portableText",
568
+ group: "content"
569
+ }),
570
+ defineField8({
571
+ name: "date",
572
+ title: "Publication Date",
573
+ type: "date",
574
+ group: "metadata",
575
+ validation: (Rule) => Rule.required()
576
+ }),
577
+ defineField8({
578
+ name: "author",
579
+ title: "Author",
580
+ type: "reference",
581
+ group: "metadata",
582
+ to: [{ type: "teamMember" }]
583
+ }),
584
+ defineField8({
585
+ name: "tags",
586
+ title: "Tags",
587
+ type: "array",
588
+ group: "metadata",
589
+ of: [{ type: "string" }],
590
+ options: {
591
+ layout: "tags"
592
+ }
593
+ }),
594
+ defineField8({
595
+ name: "filterCategory",
596
+ title: "Filter Category",
597
+ type: "string",
598
+ group: "metadata",
599
+ options: {
600
+ list: [
601
+ { title: "Publications", value: "publications" },
602
+ { title: "Grants", value: "grants" },
603
+ { title: "Events", value: "events" },
604
+ { title: "General", value: "general" }
605
+ ]
606
+ },
607
+ validation: (Rule) => Rule.required()
608
+ }),
609
+ defineField8({
610
+ name: "displayCategory",
611
+ title: "Display Category Label",
612
+ type: "string",
613
+ group: "metadata",
614
+ description: 'Category shown on card (e.g., "Featured News", "Publications", "Team")'
615
+ }),
616
+ defineField8({
617
+ name: "featured",
618
+ title: "Featured Article",
619
+ type: "boolean",
620
+ group: "metadata",
621
+ description: "Show as featured hero article on news page",
622
+ initialValue: false
623
+ }),
624
+ defineField8({
625
+ name: "readTime",
626
+ title: "Read Time",
627
+ type: "string",
628
+ group: "metadata",
629
+ description: 'e.g., "6 min read"'
630
+ })
631
+ ],
632
+ preview: {
633
+ select: {
634
+ title: "title",
635
+ date: "date",
636
+ media: "image",
637
+ featured: "featured"
638
+ },
639
+ prepare: ({ title, date, media, featured }) => ({
640
+ title: featured ? `\u2B50 ${title}` : title,
641
+ subtitle: date,
642
+ media
643
+ })
644
+ },
645
+ orderings: [
646
+ {
647
+ title: "Date, New First",
648
+ name: "dateDesc",
649
+ by: [{ field: "date", direction: "desc" }]
650
+ }
651
+ ]
652
+ });
653
+
654
+ // src/schemas/schemas/documents/galleryItem.ts
655
+ import { defineType as defineType10, defineField as defineField9 } from "sanity";
656
+ var galleryItem_default = defineType10({
657
+ name: "galleryItem",
658
+ title: "Gallery Item",
659
+ type: "document",
660
+ icon: () => "\u{1F5BC}\uFE0F",
661
+ fields: [
662
+ defineField9({
663
+ name: "title",
664
+ title: "Title",
665
+ type: "string",
666
+ validation: (Rule) => Rule.required()
667
+ }),
668
+ defineField9({
669
+ name: "description",
670
+ title: "Description",
671
+ type: "text",
672
+ rows: 2,
673
+ validation: (Rule) => Rule.required().max(200)
674
+ }),
675
+ defineField9({
676
+ name: "category",
677
+ title: "Category",
678
+ type: "string",
679
+ options: {
680
+ list: [
681
+ { title: "Facility", value: "Facility" },
682
+ { title: "Equipment", value: "Equipment" },
683
+ { title: "Team", value: "Team" },
684
+ { title: "Infrastructure", value: "Infrastructure" },
685
+ { title: "Events", value: "Events" },
686
+ { title: "Research", value: "Research" }
687
+ ]
688
+ },
689
+ validation: (Rule) => Rule.required()
690
+ }),
691
+ defineField9({
692
+ name: "categoryColor",
693
+ title: "Category Badge Color",
694
+ type: "string",
695
+ options: {
696
+ list: [
697
+ { title: "Blue", value: "blue" },
698
+ { title: "Purple", value: "purple" },
699
+ { title: "Emerald", value: "emerald" }
700
+ ]
701
+ },
702
+ initialValue: "blue"
703
+ }),
704
+ defineField9({
705
+ name: "image",
706
+ title: "Image",
707
+ type: "image",
708
+ options: { hotspot: true },
709
+ fields: [
710
+ { name: "alt", type: "string", title: "Alt Text" }
711
+ ],
712
+ validation: (Rule) => Rule.required()
713
+ }),
714
+ defineField9({
715
+ name: "featured",
716
+ title: "Featured (Large)",
717
+ type: "boolean",
718
+ description: "Display as large featured item in grid",
719
+ initialValue: false
720
+ }),
721
+ defineField9({
722
+ name: "wide",
723
+ title: "Wide Layout",
724
+ type: "boolean",
725
+ description: "Span two columns",
726
+ initialValue: false
727
+ }),
728
+ defineField9({
729
+ name: "tall",
730
+ title: "Tall Layout",
731
+ type: "boolean",
732
+ description: "Span two rows",
733
+ initialValue: false
734
+ }),
735
+ defineField9({
736
+ name: "order",
737
+ title: "Display Order",
738
+ type: "number",
739
+ description: "Lower numbers appear first"
740
+ })
741
+ ],
742
+ preview: {
743
+ select: {
744
+ title: "title",
745
+ subtitle: "category",
746
+ media: "image"
747
+ }
748
+ },
749
+ orderings: [
750
+ {
751
+ title: "Order",
752
+ name: "orderAsc",
753
+ by: [{ field: "order", direction: "asc" }]
754
+ }
755
+ ]
756
+ });
757
+
758
+ // src/schemas/schemas/documents/researchProject.ts
759
+ import { defineType as defineType11, defineField as defineField10 } from "sanity";
760
+ var researchProject_default = defineType11({
761
+ name: "researchProject",
762
+ title: "Research Project",
763
+ type: "document",
764
+ icon: () => "\u{1F52C}",
765
+ groups: [
766
+ { name: "content", title: "Content", default: true },
767
+ { name: "metadata", title: "Metadata" },
768
+ { name: "relations", title: "Related Items" }
769
+ ],
770
+ fields: [
771
+ defineField10({
772
+ name: "title",
773
+ title: "Project Title",
774
+ type: "string",
775
+ group: "content",
776
+ validation: (Rule) => Rule.required()
777
+ }),
778
+ defineField10({
779
+ name: "slug",
780
+ title: "Slug",
781
+ type: "slug",
782
+ group: "content",
783
+ options: { source: "title", maxLength: 96 },
784
+ validation: (Rule) => Rule.required()
785
+ }),
786
+ defineField10({
787
+ name: "description",
788
+ title: "Short Description",
789
+ type: "text",
790
+ group: "content",
791
+ rows: 3,
792
+ validation: (Rule) => Rule.required().max(400)
793
+ }),
794
+ defineField10({
795
+ name: "fullDescription",
796
+ title: "Full Description",
797
+ type: "portableText",
798
+ group: "content"
799
+ }),
800
+ defineField10({
801
+ name: "image",
802
+ title: "Project Image",
803
+ type: "image",
804
+ group: "content",
805
+ options: { hotspot: true },
806
+ fields: [{ name: "alt", type: "string", title: "Alt Text" }]
807
+ }),
808
+ defineField10({
809
+ name: "status",
810
+ title: "Project Status",
811
+ type: "string",
812
+ group: "metadata",
813
+ options: {
814
+ list: [
815
+ { title: "Active", value: "active" },
816
+ { title: "Completed", value: "completed" },
817
+ { title: "On Hold", value: "onhold" }
818
+ ],
819
+ layout: "radio"
820
+ },
821
+ initialValue: "active"
822
+ }),
823
+ defineField10({
824
+ name: "startDate",
825
+ title: "Start Date",
826
+ type: "date",
827
+ group: "metadata"
828
+ }),
829
+ defineField10({
830
+ name: "endDate",
831
+ title: "End Date",
832
+ type: "date",
833
+ group: "metadata"
834
+ }),
835
+ defineField10({
836
+ name: "tags",
837
+ title: "Tags",
838
+ type: "array",
839
+ group: "metadata",
840
+ of: [{ type: "string" }],
841
+ options: { layout: "tags" }
842
+ }),
843
+ defineField10({
844
+ name: "teamMembers",
845
+ title: "Team Members",
846
+ type: "array",
847
+ group: "relations",
848
+ of: [{ type: "reference", to: [{ type: "teamMember" }] }]
849
+ }),
850
+ defineField10({
851
+ name: "publications",
852
+ title: "Related Publications",
853
+ type: "array",
854
+ group: "relations",
855
+ of: [{ type: "reference", to: [{ type: "publication" }] }]
856
+ }),
857
+ defineField10({
858
+ name: "externalLinks",
859
+ title: "External Links",
860
+ type: "array",
861
+ group: "relations",
862
+ of: [{ type: "link" }]
863
+ }),
864
+ defineField10({
865
+ name: "order",
866
+ title: "Display Order",
867
+ type: "number",
868
+ group: "metadata",
869
+ description: "Lower numbers appear first"
870
+ })
871
+ ],
872
+ preview: {
873
+ select: {
874
+ title: "title",
875
+ status: "status",
876
+ media: "image"
877
+ },
878
+ prepare: ({ title, status, media }) => ({
879
+ title,
880
+ subtitle: status ? status.charAt(0).toUpperCase() + status.slice(1) : "Unknown",
881
+ media
882
+ })
883
+ },
884
+ orderings: [
885
+ {
886
+ title: "Display Order",
887
+ name: "orderAsc",
888
+ by: [{ field: "order", direction: "asc" }]
889
+ },
890
+ {
891
+ title: "Start Date, New First",
892
+ name: "startDateDesc",
893
+ by: [{ field: "startDate", direction: "desc" }]
894
+ }
895
+ ]
896
+ });
897
+
898
+ // src/schemas/schemas/documents/event.ts
899
+ import { defineType as defineType12, defineField as defineField11 } from "sanity";
900
+ var event_default = defineType12({
901
+ name: "event",
902
+ title: "Event",
903
+ type: "document",
904
+ icon: () => "\u{1F4C5}",
905
+ fields: [
906
+ defineField11({
907
+ name: "title",
908
+ title: "Event Title",
909
+ type: "string",
910
+ validation: (Rule) => Rule.required()
911
+ }),
912
+ defineField11({
913
+ name: "slug",
914
+ title: "Slug",
915
+ type: "slug",
916
+ options: { source: "title", maxLength: 96 },
917
+ validation: (Rule) => Rule.required()
918
+ }),
919
+ defineField11({
920
+ name: "description",
921
+ title: "Description",
922
+ type: "portableText"
923
+ }),
924
+ defineField11({
925
+ name: "excerpt",
926
+ title: "Short Excerpt",
927
+ type: "text",
928
+ rows: 2,
929
+ description: "Brief description for event cards"
930
+ }),
931
+ defineField11({
932
+ name: "date",
933
+ title: "Start Date & Time",
934
+ type: "datetime",
935
+ validation: (Rule) => Rule.required()
936
+ }),
937
+ defineField11({
938
+ name: "endDate",
939
+ title: "End Date & Time",
940
+ type: "datetime"
941
+ }),
942
+ defineField11({
943
+ name: "location",
944
+ title: "Location",
945
+ type: "string",
946
+ description: 'Physical location or "Virtual"'
947
+ }),
948
+ defineField11({
949
+ name: "type",
950
+ title: "Event Type",
951
+ type: "string",
952
+ options: {
953
+ list: [
954
+ { title: "Seminar", value: "seminar" },
955
+ { title: "Conference", value: "conference" },
956
+ { title: "Workshop", value: "workshop" },
957
+ { title: "Social", value: "social" },
958
+ { title: "Open House", value: "openhouse" },
959
+ { title: "Defense", value: "defense" },
960
+ { title: "Lecture", value: "lecture" }
961
+ ]
962
+ }
963
+ }),
964
+ defineField11({
965
+ name: "image",
966
+ title: "Event Image",
967
+ type: "image",
968
+ options: { hotspot: true },
969
+ fields: [{ name: "alt", type: "string", title: "Alt Text" }]
970
+ }),
971
+ defineField11({
972
+ name: "registrationUrl",
973
+ title: "Registration URL",
974
+ type: "url",
975
+ description: "Link to registration form or event page"
976
+ }),
977
+ defineField11({
978
+ name: "speakers",
979
+ title: "Speakers",
980
+ type: "array",
981
+ of: [{ type: "reference", to: [{ type: "teamMember" }] }]
982
+ }),
983
+ defineField11({
984
+ name: "externalSpeakers",
985
+ title: "External Speakers",
986
+ type: "array",
987
+ of: [{
988
+ type: "object",
989
+ fields: [
990
+ { name: "name", type: "string", title: "Name" },
991
+ { name: "affiliation", type: "string", title: "Affiliation" }
992
+ ],
993
+ preview: {
994
+ select: { title: "name", subtitle: "affiliation" }
995
+ }
996
+ }]
997
+ })
998
+ ],
999
+ preview: {
1000
+ select: {
1001
+ title: "title",
1002
+ date: "date",
1003
+ type: "type",
1004
+ media: "image"
1005
+ },
1006
+ prepare: ({ title, date, type, media }) => ({
1007
+ title,
1008
+ subtitle: `${type || "Event"} - ${date ? new Date(date).toLocaleDateString() : "TBD"}`,
1009
+ media
1010
+ })
1011
+ },
1012
+ orderings: [
1013
+ {
1014
+ title: "Date, Upcoming First",
1015
+ name: "dateAsc",
1016
+ by: [{ field: "date", direction: "asc" }]
1017
+ },
1018
+ {
1019
+ title: "Date, Recent First",
1020
+ name: "dateDesc",
1021
+ by: [{ field: "date", direction: "desc" }]
1022
+ }
1023
+ ]
1024
+ });
1025
+
1026
+ // src/schemas/schemas/singletons/siteSettings.ts
1027
+ import { defineType as defineType13, defineField as defineField12 } from "sanity";
1028
+ var siteSettings_default = defineType13({
1029
+ name: "siteSettings",
1030
+ title: "Site Settings",
1031
+ type: "document",
1032
+ icon: () => "\u2699\uFE0F",
1033
+ groups: [
1034
+ { name: "general", title: "General", default: true },
1035
+ { name: "hero", title: "Homepage Hero" },
1036
+ { name: "stats", title: "Statistics" },
1037
+ { name: "research", title: "Research Areas" },
1038
+ { name: "contact", title: "Contact Info" },
1039
+ { name: "navigation", title: "Navigation" },
1040
+ { name: "theme", title: "Theme" },
1041
+ { name: "footer", title: "Footer" }
1042
+ ],
1043
+ fields: [
1044
+ // General
1045
+ defineField12({
1046
+ name: "labName",
1047
+ title: "Lab Name",
1048
+ type: "string",
1049
+ group: "general",
1050
+ initialValue: "Prosophia Research Lab"
1051
+ }),
1052
+ defineField12({
1053
+ name: "tagline",
1054
+ title: "Tagline",
1055
+ type: "string",
1056
+ group: "general"
1057
+ }),
1058
+ defineField12({
1059
+ name: "logo",
1060
+ title: "Logo",
1061
+ type: "image",
1062
+ group: "general",
1063
+ options: { hotspot: true }
1064
+ }),
1065
+ defineField12({
1066
+ name: "favicon",
1067
+ title: "Favicon",
1068
+ type: "image",
1069
+ group: "general"
1070
+ }),
1071
+ defineField12({
1072
+ name: "siteDescription",
1073
+ title: "Site Description (SEO)",
1074
+ type: "text",
1075
+ group: "general",
1076
+ rows: 2,
1077
+ description: "Used for search engine results"
1078
+ }),
1079
+ // Hero Section
1080
+ defineField12({
1081
+ name: "heroTitle",
1082
+ title: "Hero Title",
1083
+ type: "string",
1084
+ group: "hero",
1085
+ description: "Main headline on homepage"
1086
+ }),
1087
+ defineField12({
1088
+ name: "heroHighlight",
1089
+ title: "Highlighted Text in Title",
1090
+ type: "string",
1091
+ group: "hero",
1092
+ description: "Text that appears highlighted/colored in the title"
1093
+ }),
1094
+ defineField12({
1095
+ name: "heroSubtitle",
1096
+ title: "Hero Subtitle",
1097
+ type: "text",
1098
+ group: "hero",
1099
+ rows: 2
1100
+ }),
1101
+ defineField12({
1102
+ name: "heroButtons",
1103
+ title: "Hero CTA Buttons",
1104
+ type: "array",
1105
+ group: "hero",
1106
+ of: [{ type: "ctaButton" }],
1107
+ validation: (Rule) => Rule.max(2)
1108
+ }),
1109
+ defineField12({
1110
+ name: "heroImage",
1111
+ title: "Hero Background Image",
1112
+ type: "image",
1113
+ group: "hero",
1114
+ options: { hotspot: true }
1115
+ }),
1116
+ // Stats
1117
+ defineField12({
1118
+ name: "stats",
1119
+ title: "Statistics",
1120
+ type: "array",
1121
+ group: "stats",
1122
+ of: [{ type: "stat" }],
1123
+ validation: (Rule) => Rule.max(6),
1124
+ description: 'Key metrics displayed on homepage (e.g., "120+ Papers")'
1125
+ }),
1126
+ // Research Areas
1127
+ defineField12({
1128
+ name: "researchAreas",
1129
+ title: "Research Areas",
1130
+ type: "array",
1131
+ group: "research",
1132
+ of: [{ type: "researchArea" }],
1133
+ description: "Main research focus areas shown on homepage"
1134
+ }),
1135
+ // Contact
1136
+ defineField12({
1137
+ name: "email",
1138
+ title: "General Email",
1139
+ type: "email",
1140
+ group: "contact"
1141
+ }),
1142
+ defineField12({
1143
+ name: "phone",
1144
+ title: "Phone Number",
1145
+ type: "string",
1146
+ group: "contact"
1147
+ }),
1148
+ defineField12({
1149
+ name: "address",
1150
+ title: "Address",
1151
+ type: "text",
1152
+ group: "contact",
1153
+ rows: 3
1154
+ }),
1155
+ defineField12({
1156
+ name: "mapImage",
1157
+ title: "Map Image",
1158
+ type: "image",
1159
+ group: "contact",
1160
+ description: "Static map image for contact page"
1161
+ }),
1162
+ defineField12({
1163
+ name: "socialLinks",
1164
+ title: "Social Media Links",
1165
+ type: "array",
1166
+ group: "contact",
1167
+ of: [{ type: "socialLink" }]
1168
+ }),
1169
+ // Navigation
1170
+ defineField12({
1171
+ name: "mainNavigation",
1172
+ title: "Main Navigation Items",
1173
+ type: "array",
1174
+ group: "navigation",
1175
+ of: [
1176
+ {
1177
+ type: "object",
1178
+ fields: [
1179
+ { name: "label", type: "string", title: "Label" },
1180
+ { name: "href", type: "string", title: "Path (e.g., /publications)" }
1181
+ ],
1182
+ preview: {
1183
+ select: { title: "label", subtitle: "href" }
1184
+ }
1185
+ }
1186
+ ]
1187
+ }),
1188
+ // Theme
1189
+ defineField12({
1190
+ name: "primaryColor",
1191
+ title: "Primary Color",
1192
+ type: "color",
1193
+ group: "theme",
1194
+ description: "Main accent color (default: gold #D4A012)"
1195
+ }),
1196
+ defineField12({
1197
+ name: "primaryDarkColor",
1198
+ title: "Primary Dark Color",
1199
+ type: "color",
1200
+ group: "theme",
1201
+ description: "Darker shade for hover states"
1202
+ }),
1203
+ defineField12({
1204
+ name: "fontFamily",
1205
+ title: "Primary Font",
1206
+ type: "string",
1207
+ group: "theme",
1208
+ options: {
1209
+ list: [
1210
+ { title: "Inter", value: "Inter" },
1211
+ { title: "Roboto", value: "Roboto" },
1212
+ { title: "Open Sans", value: "Open Sans" },
1213
+ { title: "Lato", value: "Lato" },
1214
+ { title: "Poppins", value: "Poppins" }
1215
+ ]
1216
+ },
1217
+ initialValue: "Inter"
1218
+ }),
1219
+ // Footer
1220
+ defineField12({
1221
+ name: "footerText",
1222
+ title: "Footer Copyright Text",
1223
+ type: "string",
1224
+ group: "footer",
1225
+ description: 'e.g., "\xA9 2024 Research Lab. All rights reserved."'
1226
+ }),
1227
+ defineField12({
1228
+ name: "footerLinks",
1229
+ title: "Footer Links",
1230
+ type: "array",
1231
+ group: "footer",
1232
+ of: [{ type: "link" }]
1233
+ })
1234
+ ],
1235
+ preview: {
1236
+ prepare: () => ({
1237
+ title: "Site Settings",
1238
+ subtitle: "Global site configuration"
1239
+ })
1240
+ }
1241
+ });
1242
+
1243
+ // src/schemas/schemas/index.ts
1244
+ var schemaTypes = [
1245
+ // Objects (must come first as they're referenced by documents)
1246
+ link_default,
1247
+ socialLink_default,
1248
+ stat_default,
1249
+ researchArea_default,
1250
+ ctaButton_default,
1251
+ portableText_default,
1252
+ // Documents
1253
+ publication_default,
1254
+ teamMember_default,
1255
+ newsArticle_default,
1256
+ galleryItem_default,
1257
+ researchProject_default,
1258
+ event_default,
1259
+ // Singletons
1260
+ siteSettings_default
1261
+ ];
1262
+ export {
1263
+ ctaButton_default as ctaButton,
1264
+ event_default as event,
1265
+ galleryItem_default as galleryItem,
1266
+ link_default as link,
1267
+ newsArticle_default as newsArticle,
1268
+ portableText_default as portableText,
1269
+ publication_default as publication,
1270
+ researchArea_default as researchArea,
1271
+ researchProject_default as researchProject,
1272
+ schemaTypes,
1273
+ schemaTypes as schemas,
1274
+ siteSettings_default as siteSettings,
1275
+ socialLink_default as socialLink,
1276
+ stat_default as stat,
1277
+ teamMember_default as teamMember
1278
+ };