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",
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
- {logoUrl && (
37
- <a href="/" class="hz-nav-brand" aria-label={`${siteName} home`}>
36
+ <a href="/" class="hz-nav-brand" aria-label={`${siteName} home`}>
37
+ {logoUrl && (
38
38
  <img
39
39
  src={logoUrl}
40
- alt={siteName}
40
+ alt=""
41
+ aria-hidden="true"
41
42
  class="hz-nav-logo"
42
43
  width={logoWidth}
43
44
  height={logoHeight}
44
45
  />
45
- </a>
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
- line-height: 0;
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 { border-color: var(--color-success); background: var(--color-success); color: var(--color-bg); }
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 { border-color: var(--color-danger); background: var(--color-danger); color: var(--color-bg); }
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;