@meith/theme-raidframe 0.33.2 → 0.33.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meith/theme-raidframe",
3
- "version": "0.33.2",
3
+ "version": "0.33.4",
4
4
  "description": "A gaming theme for Meith — guild, raid and match boards — built on the default theme's slots.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -20,9 +20,9 @@
20
20
  "access": "public"
21
21
  },
22
22
  "dependencies": {
23
- "@meith/theme-default": "^0.33.2",
24
- "@meith/theme-kit": "^0.33.2",
25
- "@meith/ui": "^0.33.2"
23
+ "@meith/theme-default": "^0.33.4",
24
+ "@meith/theme-kit": "^0.33.4",
25
+ "@meith/ui": "^0.33.4"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "react": "^19.2.0"
@@ -18,6 +18,14 @@ export function BoardIndex({
18
18
  <div className="flex flex-col gap-4 empty:hidden">{regions.announcements}</div>
19
19
  )}
20
20
 
21
+ {markAllReadAction !== null && (
22
+ <form action={markAllReadAction} method="post" className="self-end">
23
+ <button type="submit" className={BUTTON}>
24
+ {c('markAllRead')}
25
+ </button>
26
+ </form>
27
+ )}
28
+
21
29
  <div className="flex flex-col gap-4 lg:flex-row lg:items-start">
22
30
  <div className="flex min-w-0 flex-1 flex-col gap-4">{regions.categories}</div>
23
31
 
@@ -29,14 +37,6 @@ export function BoardIndex({
29
37
  </div>
30
38
 
31
39
  {regions.plugins}
32
-
33
- {markAllReadAction !== null && (
34
- <form action={markAllReadAction} method="post">
35
- <button type="submit" className={BUTTON}>
36
- {c('markAllRead')}
37
- </button>
38
- </form>
39
- )}
40
40
  </div>
41
41
  )
42
42
  }
@@ -116,6 +116,23 @@ function MobileNavItem({ item }: { item: HeaderModel['navigation'][number] }) {
116
116
  )
117
117
  }
118
118
 
119
+ function MenuGlyph() {
120
+ return (
121
+ <svg
122
+ aria-hidden="true"
123
+ viewBox="0 0 20 20"
124
+ className="size-5"
125
+ fill="none"
126
+ stroke="currentColor"
127
+ strokeWidth="1.75"
128
+ strokeLinecap="round"
129
+ >
130
+ <path className="group-open/menu:hidden" d="M3 5.5h14M3 10h14M3 14.5h14" />
131
+ <path className="hidden group-open/menu:block" d="m5 5 10 10M15 5 5 15" />
132
+ </svg>
133
+ )
134
+ }
135
+
119
136
  export function Header({
120
137
  boardTitle,
121
138
  homeHref,
@@ -127,7 +144,7 @@ export function Header({
127
144
  const c = (key: string) => fromSlotCopy(copy, `raidframe.header.${key}`)
128
145
 
129
146
  return (
130
- <header>
147
+ <header className="relative">
131
148
  <div className="flex flex-wrap items-center justify-between gap-x-4 gap-y-3 border-b border-border bg-surface px-4 py-3">
132
149
  <a href={homeHref} className="group inline-flex items-center gap-3 hover:text-primary">
133
150
  <span
@@ -136,13 +153,38 @@ export function Header({
136
153
  />
137
154
  <BoardMark boardTitle={boardTitle} logo={logo} />
138
155
  </a>
139
- {children}
156
+ <div className="flex min-w-0 items-center gap-3">
157
+ {children}
158
+ {navigation.length > 0 && (
159
+ <nav aria-label={c('sectionsAriaLabel')} data-nav-view="mobile" className="lg:hidden">
160
+ <details data-nav-disclosure className="group/menu">
161
+ <summary
162
+ className={`border border-border bg-card text-foreground hover:border-primary/60 hover:text-primary group-open/menu:border-primary group-open/menu:text-primary flex size-10 cursor-default list-none items-center justify-center select-none [&::-webkit-details-marker]:hidden [&::marker]:content-none`}
163
+ >
164
+ <MenuGlyph />
165
+ <span className="sr-only">{c('sectionsAriaLabel')}</span>
166
+ </summary>
167
+
168
+ <div className="absolute inset-x-0 top-full z-30 max-h-[calc(100dvh-4rem)] overflow-y-auto border-b border-border bg-card shadow-elevation">
169
+ <ul className="flex flex-col gap-0.5 px-4 py-2">
170
+ {navigation.map((item) => (
171
+ <MobileNavItem key={item.href} item={item} />
172
+ ))}
173
+ </ul>
174
+ </div>
175
+ </details>
176
+ </nav>
177
+ )}
178
+ </div>
140
179
  </div>
141
180
 
142
181
  <div className={RULE} aria-hidden="true" />
143
182
 
144
183
  {navigation.length > 0 && (
145
- <nav aria-label={c('sectionsAriaLabel')} className="border-b border-border bg-card/60">
184
+ <nav
185
+ aria-label={c('sectionsAriaLabel')}
186
+ className="hidden border-b border-border bg-card/60 lg:block"
187
+ >
146
188
  <div data-nav-view="desktop" className="hidden flex-wrap lg:flex">
147
189
  {navigation.map((item) => (
148
190
  <span key={item.href} className="group relative">
@@ -157,20 +199,6 @@ export function Header({
157
199
  </span>
158
200
  ))}
159
201
  </div>
160
-
161
- <div data-nav-view="mobile" className="px-4 py-1 lg:hidden">
162
- <details data-nav-disclosure className="group">
163
- <summary className="flex min-h-11 cursor-default list-none items-center gap-2 font-mono text-[0.6875rem] font-semibold tracking-[0.14em] text-foreground uppercase select-none [&::-webkit-details-marker]:hidden [&::marker]:content-none">
164
- <Chevron className="size-3 shrink-0 transition-transform group-open:rotate-90" />
165
- {c('sectionsAriaLabel')}
166
- </summary>
167
- <ul className="flex flex-col gap-0.5 pb-2">
168
- {navigation.map((item) => (
169
- <MobileNavItem key={item.href} item={item} />
170
- ))}
171
- </ul>
172
- </details>
173
- </div>
174
202
  </nav>
175
203
  )}
176
204
  </header>
@@ -13,11 +13,15 @@ export function PanelShell({ panel, links, linksLabel, regions, children }: Pane
13
13
  {regions.nav}
14
14
 
15
15
  {links.length > 0 && (
16
- <nav aria-label={linksLabel} className="border-t border-border pt-3">
17
- <ul className="flex flex-col gap-1">
16
+ <nav aria-label={linksLabel} className="border border-border bg-card">
17
+ <p className={`${MICRO} border-b border-border px-3 py-2`}>{linksLabel}</p>
18
+ <ul className="flex flex-col p-1">
18
19
  {links.map((link) => (
19
20
  <li key={link.href}>
20
- <a href={link.href} className={`${MICRO} block hover:text-primary`}>
21
+ <a
22
+ href={link.href}
23
+ className="block px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-surface hover:text-primary"
24
+ >
21
25
  {link.label}
22
26
  </a>
23
27
  </li>
@@ -162,7 +162,7 @@ export function PostBit({ post, select, regions, copy }: PostBitSlotModel & { co
162
162
  </dl>
163
163
  </div>
164
164
 
165
- <div className="min-w-0">
165
+ <div className="flex min-w-0 flex-col">
166
166
  <div className="flex items-center justify-between gap-2 border-b border-border bg-card px-3 py-1.5">
167
167
  <Stamp at={post.postedAt} className={`${MICRO} normal-case`} />
168
168
  <a
@@ -227,7 +227,7 @@ export function PostBit({ post, select, regions, copy }: PostBitSlotModel & { co
227
227
  )}
228
228
 
229
229
  {regions.actions !== null && (
230
- <div className="border-t border-border bg-surface/60 px-3 py-1.5 empty:hidden">
230
+ <div className="mt-auto border-t border-border bg-surface/60 px-3 py-1.5 empty:hidden">
231
231
  {regions.actions}
232
232
  </div>
233
233
  )}
package/src/theme.ts CHANGED
@@ -73,7 +73,7 @@ import { WhoIsOnline } from './slots/who-is-online'
73
73
  export const raidframeTheme = defineTheme({
74
74
  key: 'raidframe',
75
75
  title: 'Raidframe',
76
- version: '0.33.2',
76
+ version: '0.33.4',
77
77
  extends: defaultTheme,
78
78
  slots: {
79
79
  Shell,