handzon-core 0.8.3 → 0.8.5
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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "handzon-core",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "Core framework for Handzon — layouts, components, content + AI libs, and server runtime (handlers, DB, auth, migration runner) consumed by Handzon scaffolds.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -33,17 +33,19 @@ const {
|
|
|
33
33
|
---
|
|
34
34
|
<header class="hz-nav">
|
|
35
35
|
<div class="hz-nav-inner">
|
|
36
|
-
{
|
|
37
|
-
|
|
36
|
+
<a href="/" class="hz-nav-brand" aria-label={`${siteName} home`}>
|
|
37
|
+
{logoUrl && (
|
|
38
38
|
<img
|
|
39
39
|
src={logoUrl}
|
|
40
|
-
alt=
|
|
40
|
+
alt=""
|
|
41
|
+
aria-hidden="true"
|
|
41
42
|
class="hz-nav-logo"
|
|
42
43
|
width={logoWidth}
|
|
43
44
|
height={logoHeight}
|
|
44
45
|
/>
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
)}
|
|
47
|
+
<span class="hz-nav-name">{siteName}</span>
|
|
48
|
+
</a>
|
|
47
49
|
<div class="hz-nav-actions">
|
|
48
50
|
<UserMenu />
|
|
49
51
|
</div>
|
|
@@ -77,8 +79,11 @@ const {
|
|
|
77
79
|
.hz-nav-brand {
|
|
78
80
|
display: inline-flex;
|
|
79
81
|
align-items: center;
|
|
80
|
-
|
|
82
|
+
gap: 0.45rem;
|
|
83
|
+
line-height: 1;
|
|
81
84
|
opacity: 0.92;
|
|
85
|
+
color: var(--color-fg);
|
|
86
|
+
text-decoration: none;
|
|
82
87
|
transition: opacity 0.12s ease;
|
|
83
88
|
}
|
|
84
89
|
.hz-nav-brand:hover { opacity: 1; }
|
|
@@ -86,6 +91,18 @@ const {
|
|
|
86
91
|
display: block;
|
|
87
92
|
height: 1.4rem;
|
|
88
93
|
width: auto;
|
|
94
|
+
flex-shrink: 0;
|
|
95
|
+
}
|
|
96
|
+
/* Matches the Hero headline's font choice so the wordmark reads as
|
|
97
|
+
the same brand across the homepage hero and every-other-page nav.
|
|
98
|
+
Smaller, no display tracking — this is a chrome label, not a
|
|
99
|
+
headline. */
|
|
100
|
+
.hz-nav-name {
|
|
101
|
+
font-family: var(--font-display, var(--font-sans));
|
|
102
|
+
font-weight: var(--font-weight-display, 700);
|
|
103
|
+
font-size: 1.05rem;
|
|
104
|
+
letter-spacing: var(--tracking-display, -0.02em);
|
|
105
|
+
white-space: nowrap;
|
|
89
106
|
}
|
|
90
107
|
.hz-nav-actions {
|
|
91
108
|
display: flex;
|
|
@@ -98,6 +98,27 @@ export default function UserMenu() {
|
|
|
98
98
|
<span className="um-name" title={fullLabel}>
|
|
99
99
|
{displayName}
|
|
100
100
|
</span>
|
|
101
|
+
<a
|
|
102
|
+
className="um-btn um-btn-icon"
|
|
103
|
+
href="/settings/tokens"
|
|
104
|
+
title="Access tokens for editor MCP"
|
|
105
|
+
>
|
|
106
|
+
<svg
|
|
107
|
+
viewBox="0 0 24 24"
|
|
108
|
+
width="14"
|
|
109
|
+
height="14"
|
|
110
|
+
fill="none"
|
|
111
|
+
stroke="currentColor"
|
|
112
|
+
strokeWidth="2"
|
|
113
|
+
strokeLinecap="round"
|
|
114
|
+
strokeLinejoin="round"
|
|
115
|
+
aria-hidden="true"
|
|
116
|
+
>
|
|
117
|
+
<circle cx="7.5" cy="15.5" r="4.5" />
|
|
118
|
+
<path d="M11 12L20 3l1.5 1.5L20 6l1.5 1.5L19 9l-1.5-1.5L16 9" />
|
|
119
|
+
</svg>
|
|
120
|
+
<span className="sr-only">Access tokens</span>
|
|
121
|
+
</a>
|
|
101
122
|
<form method="post" action="/api/auth/signout">
|
|
102
123
|
<input type="hidden" name="csrfToken" value={csrfToken} />
|
|
103
124
|
<input type="hidden" name="callbackUrl" value={callbackUrl} />
|
|
@@ -64,11 +64,31 @@
|
|
|
64
64
|
.quiz-opt.is-correct {
|
|
65
65
|
background: color-mix(in oklab, var(--color-success) 18%, var(--color-surface));
|
|
66
66
|
}
|
|
67
|
-
.quiz-opt.is-correct .quiz-opt-toggle {
|
|
67
|
+
.quiz-opt.is-correct .quiz-opt-toggle {
|
|
68
|
+
border-color: var(--color-success);
|
|
69
|
+
background: var(--color-success);
|
|
70
|
+
color: var(--color-bg);
|
|
71
|
+
display: inline-grid;
|
|
72
|
+
place-items: center;
|
|
73
|
+
}
|
|
68
74
|
.quiz-opt.is-wrong {
|
|
69
75
|
background: color-mix(in oklab, var(--color-danger) 16%, var(--color-surface));
|
|
70
76
|
}
|
|
71
|
-
.quiz-opt.is-wrong .quiz-opt-toggle {
|
|
77
|
+
.quiz-opt.is-wrong .quiz-opt-toggle {
|
|
78
|
+
border-color: var(--color-danger);
|
|
79
|
+
background: var(--color-danger);
|
|
80
|
+
color: var(--color-bg);
|
|
81
|
+
display: inline-grid;
|
|
82
|
+
place-items: center;
|
|
83
|
+
}
|
|
84
|
+
/* Graded options swap the accent-filled `::after` for the Lucide
|
|
85
|
+
<Check>/<X> icon injected by Quiz.tsx — without this, the purple
|
|
86
|
+
accent rectangle covers the icon and you see a purple dot inside
|
|
87
|
+
the green/red box. */
|
|
88
|
+
.quiz-opt.is-correct .quiz-opt-toggle::after,
|
|
89
|
+
.quiz-opt.is-wrong .quiz-opt-toggle::after {
|
|
90
|
+
display: none;
|
|
91
|
+
}
|
|
72
92
|
.quiz-marker {
|
|
73
93
|
display: inline-grid;
|
|
74
94
|
place-items: center;
|