@markuxt/markuxt 0.1.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.
Files changed (94) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +168 -0
  3. package/app.config.d.ts +33 -0
  4. package/nuxt.config.ts +170 -0
  5. package/package.json +43 -0
  6. package/src/components/AppFooter.vue +225 -0
  7. package/src/components/AppHeader.vue +342 -0
  8. package/src/components/Hero.vue +438 -0
  9. package/src/components/Icon.vue +131 -0
  10. package/src/components/LanguageSwitcher.vue +71 -0
  11. package/src/components/MemberCard.vue +198 -0
  12. package/src/components/MembersGrid.vue +129 -0
  13. package/src/components/MermaidDiagram.vue +99 -0
  14. package/src/components/NewsCard.vue +119 -0
  15. package/src/components/PublicationCard.vue +245 -0
  16. package/src/components/SectionTitle.vue +75 -0
  17. package/src/components/content/ProseImg.vue +29 -0
  18. package/src/components/content/ProsePre.vue +58 -0
  19. package/src/components/content/ProseVideo.vue +45 -0
  20. package/src/composables/resolveContentImage.ts +35 -0
  21. package/src/content-transformers/binary-assets.ts +20 -0
  22. package/src/error.vue +58 -0
  23. package/src/layouts/default.vue +37 -0
  24. package/src/middleware/navigation-guard.ts +22 -0
  25. package/src/pages/index.vue +232 -0
  26. package/src/pages/members/[...slug].vue +542 -0
  27. package/src/pages/members/index.vue +147 -0
  28. package/src/pages/news/[...slug].vue +280 -0
  29. package/src/pages/news/index.vue +102 -0
  30. package/src/pages/positions/[...slug].vue +425 -0
  31. package/src/pages/positions/index.vue +266 -0
  32. package/src/pages/projects/[...slug].vue +441 -0
  33. package/src/pages/projects/index.vue +499 -0
  34. package/src/pages/publications/[...slug].vue +435 -0
  35. package/src/pages/publications/index.vue +145 -0
  36. package/src/plugins/mathml-components.ts +33 -0
  37. package/src/plugins/suppress-warnings.ts +40 -0
  38. package/src/public/_markuxt/components/AppFooter.vue +225 -0
  39. package/src/public/_markuxt/components/AppHeader.vue +342 -0
  40. package/src/public/_markuxt/components/Hero.vue +430 -0
  41. package/src/public/_markuxt/components/Icon.vue +131 -0
  42. package/src/public/_markuxt/components/LanguageSwitcher.vue +71 -0
  43. package/src/public/_markuxt/components/MemberCard.vue +198 -0
  44. package/src/public/_markuxt/components/MembersGrid.vue +129 -0
  45. package/src/public/_markuxt/components/MermaidDiagram.vue +99 -0
  46. package/src/public/_markuxt/components/NewsCard.vue +119 -0
  47. package/src/public/_markuxt/components/PublicationCard.vue +245 -0
  48. package/src/public/_markuxt/components/SectionTitle.vue +75 -0
  49. package/src/public/_markuxt/components/content/ProseImg.vue +29 -0
  50. package/src/public/_markuxt/components/content/ProsePre.vue +58 -0
  51. package/src/public/_markuxt/components/content/ProseVideo.vue +45 -0
  52. package/src/public/_markuxt/composables/resolveContentImage.ts +35 -0
  53. package/src/public/_markuxt/content-transformers/binary-assets.ts +20 -0
  54. package/src/public/_markuxt/error.vue +58 -0
  55. package/src/public/_markuxt/layouts/default.vue +37 -0
  56. package/src/public/_markuxt/middleware/navigation-guard.ts +22 -0
  57. package/src/public/_markuxt/pages/index.vue +232 -0
  58. package/src/public/_markuxt/pages/members/[...slug].vue +542 -0
  59. package/src/public/_markuxt/pages/members/index.vue +147 -0
  60. package/src/public/_markuxt/pages/news/[...slug].vue +280 -0
  61. package/src/public/_markuxt/pages/news/index.vue +102 -0
  62. package/src/public/_markuxt/pages/positions/[...slug].vue +425 -0
  63. package/src/public/_markuxt/pages/positions/index.vue +266 -0
  64. package/src/public/_markuxt/pages/projects/[...slug].vue +441 -0
  65. package/src/public/_markuxt/pages/projects/index.vue +499 -0
  66. package/src/public/_markuxt/pages/publications/[...slug].vue +435 -0
  67. package/src/public/_markuxt/pages/publications/index.vue +145 -0
  68. package/src/public/_markuxt/plugins/mathml-components.ts +33 -0
  69. package/src/public/_markuxt/plugins/suppress-warnings.ts +40 -0
  70. package/src/public/_markuxt/server/plugins/content-locale.ts +47 -0
  71. package/src/public/_markuxt/server/plugins/fix-content-anchors.ts +63 -0
  72. package/src/public/_markuxt/styles/_animations.css +99 -0
  73. package/src/public/_markuxt/styles/_base.css +31 -0
  74. package/src/public/_markuxt/styles/_code.css +109 -0
  75. package/src/public/_markuxt/styles/_components.css +109 -0
  76. package/src/public/_markuxt/styles/_layout.css +220 -0
  77. package/src/public/_markuxt/styles/_markdown.css +52 -0
  78. package/src/public/_markuxt/styles/_tokens.css +62 -0
  79. package/src/public/_markuxt/styles/_typography.css +144 -0
  80. package/src/public/_markuxt/styles/_utilities.css +110 -0
  81. package/src/public/_markuxt/styles/main.css +784 -0
  82. package/src/public/images/logo.png +0 -0
  83. package/src/server/plugins/content-locale.ts +47 -0
  84. package/src/server/plugins/fix-content-anchors.ts +63 -0
  85. package/src/styles/_animations.css +99 -0
  86. package/src/styles/_base.css +31 -0
  87. package/src/styles/_code.css +109 -0
  88. package/src/styles/_components.css +109 -0
  89. package/src/styles/_layout.css +220 -0
  90. package/src/styles/_markdown.css +52 -0
  91. package/src/styles/_tokens.css +62 -0
  92. package/src/styles/_typography.css +144 -0
  93. package/src/styles/_utilities.css +110 -0
  94. package/src/styles/main.css +784 -0
@@ -0,0 +1,52 @@
1
+ /* ============================================
2
+ Markdown Tables (data tables, prominent borders)
3
+ ============================================ */
4
+
5
+ /* Markdown pipe tables always render a <thead>; raw-HTML layout tables (e.g.
6
+ the media-gallery image grid) do not, so :has(thead) styles only real data
7
+ tables and leaves layout tables borderless. */
8
+ table:has(thead) {
9
+ width: 100%;
10
+ border-collapse: collapse;
11
+ margin: var(--spacing-lg) 0;
12
+ border: 2px solid var(--color-text);
13
+ font-size: 0.9375rem;
14
+ }
15
+
16
+ table:has(thead) th,
17
+ table:has(thead) td {
18
+ border: 1px solid var(--color-text);
19
+ padding: var(--spacing-sm) var(--spacing-md);
20
+ text-align: left;
21
+ vertical-align: top;
22
+ }
23
+
24
+ table:has(thead) thead th {
25
+ background: var(--color-bg);
26
+ font-family: var(--font-display);
27
+ font-weight: 700;
28
+ color: var(--color-primary);
29
+ }
30
+
31
+ table:has(thead) tbody tr:nth-child(even) {
32
+ background: #f8fafc;
33
+ }
34
+
35
+ /* ============================================
36
+ KaTeX Math (rehype-katex output)
37
+ ============================================ */
38
+
39
+ /* Display math ($$...$$) can be wider than the column; allow it to scroll
40
+ horizontally instead of overflowing the layout. */
41
+ .katex-display {
42
+ overflow-x: auto;
43
+ overflow-y: hidden;
44
+ padding: var(--spacing-sm) 0;
45
+ margin: var(--spacing-md) 0;
46
+ }
47
+
48
+ /* Keep inline math from inflating line-height */
49
+ .katex {
50
+ font-size: 1.05em;
51
+ line-height: normal;
52
+ }
@@ -0,0 +1,62 @@
1
+ /* CSS Custom Properties - Design System */
2
+ :root {
3
+ /* Colors */
4
+ --color-primary: #0a2540;
5
+ --color-primary-light: #1a3a5c;
6
+ --color-accent: #00d9ff;
7
+ --color-accent-hover: #00b8d9;
8
+ --color-secondary: #009bc1;
9
+ --color-secondary-light: #4db8d1;
10
+ --color-bg: #f8fafc;
11
+ --color-bg-alt: #ffffff;
12
+ --color-text: #0f172a;
13
+ --color-text-muted: #64748b;
14
+ --color-border: #e2e8f0;
15
+
16
+ /* Typography */
17
+ --font-display: 'Fraunces', serif;
18
+ --font-body: 'DM Sans', sans-serif;
19
+
20
+ /* Spacing */
21
+ --spacing-xs: 0.25rem;
22
+ --spacing-sm: 0.5rem;
23
+ --spacing-md: 1rem;
24
+ --spacing-lg: 1.5rem;
25
+ --spacing-xl: 2rem;
26
+ --spacing-2xl: 3rem;
27
+ --spacing-3xl: 4rem;
28
+ --spacing-4xl: 6rem;
29
+
30
+ /* Border Radius */
31
+ --radius-sm: 0.25rem;
32
+ --radius-md: 0.5rem;
33
+ --radius-lg: 0.75rem;
34
+ --radius-xl: 1rem;
35
+ --radius-2xl: 1.5rem; /* added: used by multiple pages (positions, projects, news) */
36
+ --radius-full: 9999px;
37
+
38
+ /* Shadows */
39
+ --shadow-sm: 0 1px 2px rgb(0 0 0 / 0.05);
40
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
41
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
42
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
43
+
44
+ /* Transitions */
45
+ --transition-fast: 150ms ease;
46
+ --transition-base: 250ms ease;
47
+ --transition-slow: 350ms ease;
48
+
49
+ /* ============================================
50
+ Responsive Breakpoints
51
+ ============================================ */
52
+ --breakpoint-sm: 480px; /* Small mobile */
53
+ --breakpoint-md: 768px; /* Tablet */
54
+ --breakpoint-lg: 1024px; /* Desktop */
55
+
56
+ /* ============================================
57
+ Layout Variables
58
+ ============================================ */
59
+ --header-height: 80px;
60
+ --card-min-width: 280px;
61
+ --touch-target-size: 44px;
62
+ }
@@ -0,0 +1,144 @@
1
+ /* ============================================
2
+ Typography
3
+ ============================================ */
4
+
5
+ h1,
6
+ h2,
7
+ h3,
8
+ h4,
9
+ h5,
10
+ h6 {
11
+ font-family: var(--font-display);
12
+ font-weight: 700;
13
+ line-height: 1.2;
14
+ color: var(--color-primary);
15
+ margin-bottom: var(--spacing-md);
16
+ scroll-margin-top: calc(var(--header-height) + var(--spacing-lg));
17
+ }
18
+
19
+ h1 {
20
+ font-size: clamp(2.5rem, 5vw, 4rem);
21
+ font-weight: 800;
22
+ letter-spacing: -0.02em;
23
+ }
24
+
25
+ h2 {
26
+ font-size: clamp(2rem, 4vw, 2.5rem);
27
+ font-weight: 700;
28
+ letter-spacing: -0.01em;
29
+ }
30
+
31
+ h3 {
32
+ font-size: clamp(1.5rem, 3vw, 1.875rem);
33
+ font-weight: 600;
34
+ }
35
+
36
+ h4 {
37
+ font-size: 1.25rem;
38
+ font-weight: 600;
39
+ }
40
+
41
+ p {
42
+ margin-bottom: var(--spacing-md);
43
+ }
44
+
45
+ /* Lists */
46
+ ul {
47
+ margin-bottom: var(--spacing-md);
48
+ padding-left: 0;
49
+ list-style: none !important;
50
+ }
51
+
52
+ ol {
53
+ margin-bottom: var(--spacing-md);
54
+ padding-left: 0;
55
+ list-style: none !important;
56
+ counter-reset: item;
57
+ }
58
+
59
+ li {
60
+ margin-bottom: var(--spacing-xs);
61
+ position: relative;
62
+ padding-left: 1.5rem;
63
+ }
64
+
65
+ ul > li::before {
66
+ content: '•' !important;
67
+ position: absolute !important;
68
+ left: 0 !important;
69
+ color: var(--color-secondary) !important;
70
+ }
71
+
72
+ ol > li::before {
73
+ content: counter(item) '.' !important;
74
+ counter-increment: item !important;
75
+ position: absolute !important;
76
+ left: 0 !important;
77
+ color: var(--color-secondary) !important;
78
+ font-weight: 600 !important;
79
+ }
80
+
81
+ /* Ensure ol li doesn't get ul's bullet */
82
+ ol li::before {
83
+ content: counter(item) '.' !important;
84
+ }
85
+
86
+ /* Task lists (GitHub-style checkboxes): the global `ul > li::before` bullet
87
+ and `li` indent don't apply here — the checkbox is the marker. Suppress the
88
+ blue dot and vertically center the box with its label line via flex. */
89
+ .task-list-item {
90
+ display: flex;
91
+ align-items: center;
92
+ padding-left: 0;
93
+ list-style: none;
94
+ }
95
+
96
+ .task-list-item::before {
97
+ content: none !important;
98
+ }
99
+
100
+ /* Custom checkbox: replace the native control (which is disabled/read-only for
101
+ markdown task lists) with a box that matches the design system. Flex-center
102
+ so the checkmark sits in the middle of the box on both axes. */
103
+ .task-list-item input[type='checkbox'] {
104
+ appearance: none;
105
+ -webkit-appearance: none;
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ flex-shrink: 0;
110
+ width: 1.05em;
111
+ height: 1.05em;
112
+ margin: 0 var(--spacing-sm) 0 0;
113
+ background: var(--color-bg-alt);
114
+ border: 2px solid var(--color-border);
115
+ border-radius: var(--radius-sm);
116
+ cursor: default;
117
+ transition: all var(--transition-fast);
118
+ }
119
+
120
+ /* Checked: accent fill + a CSS-drawn checkmark */
121
+ .task-list-item input[type='checkbox']:checked {
122
+ background: var(--color-secondary);
123
+ border-color: var(--color-secondary);
124
+ }
125
+
126
+ .task-list-item input[type='checkbox']:checked::after {
127
+ content: '';
128
+ width: 0.3em;
129
+ height: 0.55em;
130
+ margin-top: -0.1em;
131
+ border: solid #fff;
132
+ border-width: 0 0.16em 0.16em 0;
133
+ transform: rotate(45deg);
134
+ }
135
+
136
+ a {
137
+ color: var(--color-secondary);
138
+ text-decoration: none;
139
+ transition: color var(--transition-fast);
140
+ }
141
+
142
+ a:hover {
143
+ color: var(--color-accent);
144
+ }
@@ -0,0 +1,110 @@
1
+ /* ============================================
2
+ Utility Classes
3
+ ============================================ */
4
+
5
+ .sr-only {
6
+ position: absolute;
7
+ width: 1px;
8
+ height: 1px;
9
+ padding: 0;
10
+ margin: -1px;
11
+ overflow: hidden;
12
+ clip: rect(0, 0, 0, 0);
13
+ white-space: nowrap;
14
+ border: 0;
15
+ }
16
+
17
+ .text-center {
18
+ text-align: center;
19
+ }
20
+ .text-left {
21
+ text-align: left;
22
+ }
23
+ .text-right {
24
+ text-align: right;
25
+ }
26
+
27
+ .mt-sm {
28
+ margin-top: var(--spacing-sm);
29
+ }
30
+ .mt-md {
31
+ margin-top: var(--spacing-md);
32
+ }
33
+ .mt-lg {
34
+ margin-top: var(--spacing-lg);
35
+ }
36
+ .mt-xl {
37
+ margin-top: var(--spacing-xl);
38
+ }
39
+
40
+ .mb-sm {
41
+ margin-bottom: var(--spacing-sm);
42
+ }
43
+ .mb-md {
44
+ margin-bottom: var(--spacing-md);
45
+ }
46
+ .mb-lg {
47
+ margin-bottom: var(--spacing-lg);
48
+ }
49
+ .mb-xl {
50
+ margin-bottom: var(--spacing-xl);
51
+ }
52
+
53
+ /* ============================================
54
+ Responsive Breakpoints
55
+ Mobile-first approach using CSS custom properties
56
+
57
+ Usage:
58
+ @media (min-width: var(--breakpoint-md)) { ... }
59
+ ============================================ */
60
+
61
+ /* Small Mobile (below 480px) - default styles apply */
62
+
63
+ /* Tablet (768px and up) */
64
+ @media (min-width: 768px) {
65
+ .section {
66
+ padding-top: var(--spacing-2xl);
67
+ padding-bottom: var(--spacing-2xl);
68
+ }
69
+
70
+ .container,
71
+ .container-narrow {
72
+ padding-left: var(--spacing-md);
73
+ padding-right: var(--spacing-md);
74
+ }
75
+ }
76
+
77
+ /* Desktop (1024px and up) */
78
+ @media (min-width: 1024px) {
79
+ .section {
80
+ padding-top: var(--spacing-3xl);
81
+ padding-bottom: var(--spacing-3xl);
82
+ }
83
+ }
84
+
85
+ /* ============================================
86
+ Reduced Motion - Accessibility
87
+ Respects user's preference for reduced motion
88
+ ============================================ */
89
+ @media (prefers-reduced-motion: reduce) {
90
+ *,
91
+ *::before,
92
+ *::after {
93
+ animation-duration: 0.01ms !important;
94
+ animation-iteration-count: 1 !important;
95
+ transition-duration: 0.01ms !important;
96
+ }
97
+
98
+ .carousel__track,
99
+ .hero__shape,
100
+ .about-shape,
101
+ .floating {
102
+ animation: none !important;
103
+ }
104
+
105
+ .btn:hover,
106
+ .card:hover,
107
+ .member-card:hover {
108
+ transform: none !important;
109
+ }
110
+ }