@lockerverse/react 0.2.117 → 0.2.120-dev.1

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.
@@ -5,16 +5,24 @@
5
5
  --lockerverse-border: rgb(255 255 255 / 18%);
6
6
  --lockerverse-accent: #83baa1;
7
7
  --lockerverse-accent-contrast: #07130d;
8
+ --lockerverse-surface: #101213;
9
+ --lockerverse-popover: #1b1e1f;
8
10
  --lockerverse-font-family: ui-sans-serif, system-ui, sans-serif;
9
11
  box-sizing: border-box;
10
12
  width: 100%;
11
- padding: clamp(8px, 3%, 28px);
13
+ padding: 0;
12
14
  container-type: inline-size;
13
15
  font: 14px / 1.5 var(--lockerverse-font-family);
14
16
  color: var(--lockerverse-text);
15
17
  background: transparent;
16
18
  }
17
19
 
20
+ .lockerverse-public-events__layout {
21
+ display: grid;
22
+ grid-template-columns: minmax(160px, 184px) minmax(0, 1fr);
23
+ column-gap: 24px;
24
+ }
25
+
18
26
  .lockerverse-public-events[data-lockerverse-theme="light"] {
19
27
  --lockerverse-bg: #fff;
20
28
  --lockerverse-text: #171919;
@@ -22,6 +30,8 @@
22
30
  --lockerverse-border: rgb(23 25 25 / 18%);
23
31
  --lockerverse-accent: #2d7052;
24
32
  --lockerverse-accent-contrast: #fff;
33
+ --lockerverse-surface: #fff;
34
+ --lockerverse-popover: #fff;
25
35
  }
26
36
 
27
37
  .lockerverse-public-events *,
@@ -38,6 +48,7 @@
38
48
  }
39
49
 
40
50
  .lockerverse-public-events h2 {
51
+ grid-column: 1 / -1;
41
52
  margin-bottom: 28px;
42
53
  font-size: 24px;
43
54
  font-weight: 600;
@@ -46,8 +57,8 @@
46
57
  }
47
58
 
48
59
  .lockerverse-public-events h4 {
49
- margin-top: 5px;
50
- font-size: 20px;
60
+ margin-top: 6px;
61
+ font-size: 18px;
51
62
  font-weight: 650;
52
63
  line-height: 1.25;
53
64
  overflow-wrap: anywhere;
@@ -57,31 +68,58 @@
57
68
  margin-top: 0;
58
69
  }
59
70
 
71
+ .lockerverse-public-events button {
72
+ min-height: 44px;
73
+ padding: 8px 12px;
74
+ margin-top: 12px;
75
+ font: inherit;
76
+ color: var(--lockerverse-text);
77
+ cursor: pointer;
78
+ background: transparent;
79
+ border: 1px solid var(--lockerverse-border);
80
+ }
81
+
60
82
  .lockerverse-public-events__tabs {
61
83
  display: flex;
62
- gap: 24px;
63
- margin-bottom: 24px;
64
- border-bottom: 1px solid var(--lockerverse-border);
84
+ flex-direction: column;
85
+ grid-column: 1;
86
+ gap: 6px;
87
+ align-self: start;
88
+ }
89
+
90
+ .lockerverse-public-events__layout > section {
91
+ grid-column: 2;
92
+ min-width: 0;
65
93
  }
66
94
 
67
95
  .lockerverse-public-events .lockerverse-public-events__tab {
96
+ display: flex;
97
+ gap: 10px;
98
+ align-items: center;
68
99
  min-height: 44px;
69
- padding: 0 0 10px;
100
+ padding: 9px 12px;
70
101
  margin: 0;
71
102
  font-weight: 600;
72
103
  color: var(--lockerverse-muted);
104
+ text-align: left;
73
105
  border: 0;
74
- border-bottom: 2px solid transparent;
106
+ border-radius: 10px;
75
107
  }
76
108
 
77
109
  .lockerverse-public-events
78
110
  .lockerverse-public-events__tab[aria-pressed="true"] {
79
111
  color: var(--lockerverse-text);
80
- border-bottom-color: var(--lockerverse-accent);
112
+ background: var(--lockerverse-surface);
113
+ }
114
+
115
+ .lockerverse-public-events
116
+ .lockerverse-public-events__tab[aria-pressed="true"]
117
+ svg {
118
+ color: var(--lockerverse-accent);
81
119
  }
82
120
 
83
121
  .lockerverse-public-events__group + .lockerverse-public-events__group {
84
- margin-top: 32px;
122
+ margin-top: 14px;
85
123
  }
86
124
 
87
125
  .lockerverse-public-events .lockerverse-public-events__group-title {
@@ -103,26 +141,30 @@
103
141
 
104
142
  .lockerverse-public-events__item {
105
143
  scroll-margin-top: 24px;
144
+ background: var(--lockerverse-surface);
106
145
  border: 1px solid var(--lockerverse-border);
107
- border-radius: 12px;
146
+ border-radius: 10px;
108
147
  }
109
148
 
110
- .lockerverse-public-events__row {
111
- display: grid;
112
- grid-template-columns: 76px minmax(0, 1fr) auto;
113
- gap: 16px;
114
- align-items: start;
115
- padding: 14px;
149
+ .lockerverse-public-events__item:has(.lockerverse-public-events__share-menu) {
150
+ position: relative;
151
+ z-index: 2;
116
152
  }
117
153
 
118
- .lockerverse-public-events__row--with-image {
119
- grid-template-columns: 154px minmax(0, 1fr) auto;
154
+ .lockerverse-public-events__row {
155
+ display: grid;
156
+ grid-template-columns: 136px minmax(0, 1fr);
157
+ gap: 4px 16px;
158
+ align-items: center;
159
+ min-height: 142px;
160
+ padding: 16px;
120
161
  }
121
162
 
122
163
  .lockerverse-public-events__image {
123
164
  display: block;
165
+ grid-row: 1 / span 2;
124
166
  width: 100%;
125
- height: 124px;
167
+ height: 108px;
126
168
  object-fit: cover;
127
169
  border-radius: 7px;
128
170
  }
@@ -130,10 +172,11 @@
130
172
  .lockerverse-public-events__date {
131
173
  display: flex;
132
174
  flex-direction: column;
175
+ grid-row: 1 / span 2;
133
176
  align-items: center;
134
177
  justify-content: center;
135
- width: 76px;
136
- height: 76px;
178
+ width: 136px;
179
+ height: 108px;
137
180
  line-height: 1;
138
181
  border: 1px solid var(--lockerverse-border);
139
182
  border-radius: 7px;
@@ -164,6 +207,7 @@
164
207
  .lockerverse-public-events__content {
165
208
  display: flex;
166
209
  flex-direction: column;
210
+ grid-column: 2;
167
211
  align-items: flex-start;
168
212
  min-width: 0;
169
213
  }
@@ -180,6 +224,12 @@
180
224
  letter-spacing: 0.04em;
181
225
  }
182
226
 
227
+ .lockerverse-public-events__meta .lockerverse-public-events__time {
228
+ font-weight: 500;
229
+ color: var(--lockerverse-muted);
230
+ letter-spacing: 0;
231
+ }
232
+
183
233
  .lockerverse-public-events__live {
184
234
  padding: 2px 7px;
185
235
  color: var(--lockerverse-bg);
@@ -187,14 +237,14 @@
187
237
  border-radius: 999px;
188
238
  }
189
239
 
190
- .lockerverse-public-events .lockerverse-public-events__time,
191
240
  .lockerverse-public-events .lockerverse-public-events__place {
192
- margin-top: 5px;
241
+ margin-top: 6px;
193
242
  color: var(--lockerverse-muted);
194
243
  }
195
244
 
196
245
  .lockerverse-public-events .lockerverse-public-events__description {
197
- margin-top: 10px;
246
+ margin-top: 6px;
247
+ color: var(--lockerverse-muted);
198
248
  overflow-wrap: anywhere;
199
249
  white-space: pre-line;
200
250
  }
@@ -217,11 +267,14 @@
217
267
  }
218
268
 
219
269
  .lockerverse-public-events__actions {
270
+ position: relative;
220
271
  display: flex;
221
- flex-direction: column;
222
- gap: 6px;
223
- align-items: stretch;
224
- min-width: 125px;
272
+ grid-row: 2;
273
+ grid-column: 2;
274
+ gap: 8px;
275
+ align-items: center;
276
+ justify-content: flex-end;
277
+ min-width: 0;
225
278
  }
226
279
 
227
280
  .lockerverse-public-events .lockerverse-public-events__link {
@@ -229,8 +282,8 @@
229
282
  gap: 8px;
230
283
  align-items: center;
231
284
  justify-content: center;
232
- min-height: 44px;
233
- padding: 8px 14px;
285
+ min-height: 34px;
286
+ padding: 6px 12px;
234
287
  margin: 0;
235
288
  font-weight: 600;
236
289
  color: var(--lockerverse-accent-contrast);
@@ -246,50 +299,87 @@
246
299
 
247
300
  .lockerverse-public-events .lockerverse-public-events__share {
248
301
  display: inline-flex;
249
- gap: 8px;
250
302
  align-items: center;
251
303
  justify-content: center;
252
- min-height: 44px;
253
- padding: 8px 10px;
304
+ min-width: 36px;
305
+ min-height: 36px;
306
+ padding: 0;
254
307
  margin: 0;
255
- font-weight: 600;
256
308
  color: var(--lockerverse-muted);
257
- border: 1px solid transparent;
258
- border-radius: 8px;
309
+ border: 0;
310
+ border-radius: 6px;
259
311
  }
260
312
 
261
- @container (max-width: 700px) {
262
- .lockerverse-public-events__row,
263
- .lockerverse-public-events__row--with-image {
264
- grid-template-columns: 76px minmax(0, 1fr);
265
- }
313
+ .lockerverse-public-events .lockerverse-public-events__share:hover {
314
+ color: var(--lockerverse-accent);
315
+ }
266
316
 
267
- .lockerverse-public-events__row--with-image {
268
- grid-template-columns: 112px minmax(0, 1fr);
269
- }
317
+ .lockerverse-public-events__copied {
318
+ font-size: 12px;
319
+ color: var(--lockerverse-accent);
320
+ }
270
321
 
271
- .lockerverse-public-events__image {
272
- height: 112px;
273
- }
322
+ .lockerverse-public-events__share-menu {
323
+ position: absolute;
324
+ top: calc(100% + 6px);
325
+ right: 0;
326
+ z-index: 3;
327
+ display: flex;
328
+ flex-wrap: wrap;
329
+ gap: 2px;
330
+ align-items: center;
331
+ min-inline-size: 0;
332
+ width: max-content;
333
+ max-width: min(300px, 80vw);
334
+ padding: 6px;
335
+ margin: 0;
336
+ background: var(--lockerverse-popover);
337
+ border: 1px solid var(--lockerverse-border);
338
+ border-radius: 8px;
339
+ box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
340
+ }
274
341
 
275
- .lockerverse-public-events__actions {
276
- flex-direction: row;
277
- flex-wrap: wrap;
278
- grid-column: 2;
279
- min-width: 0;
280
- }
342
+ .lockerverse-public-events__share-menu[data-above="true"] {
343
+ top: auto;
344
+ bottom: calc(100% + 6px);
281
345
  }
282
346
 
283
- .lockerverse-public-events .lockerverse-public-events__share:hover {
347
+ .lockerverse-public-events__visually-hidden {
348
+ position: absolute;
349
+ width: 1px;
350
+ height: 1px;
351
+ overflow: hidden;
352
+ white-space: nowrap;
353
+ clip: rect(0, 0, 0, 0);
354
+ }
355
+
356
+ .lockerverse-public-events .lockerverse-public-events__share-menu button,
357
+ .lockerverse-public-events .lockerverse-public-events__share-menu a {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ justify-content: center;
361
+ width: 38px;
362
+ min-height: 38px;
363
+ padding: 0;
364
+ margin: 0;
365
+ font-size: 18px;
284
366
  color: var(--lockerverse-text);
285
- border-color: var(--lockerverse-border);
367
+ text-decoration: none;
368
+ border: 0;
369
+ border-radius: 6px;
370
+ }
371
+
372
+ .lockerverse-public-events .lockerverse-public-events__share-menu button:hover,
373
+ .lockerverse-public-events .lockerverse-public-events__share-menu a:hover {
374
+ color: var(--lockerverse-accent);
375
+ background: var(--lockerverse-surface);
286
376
  }
287
377
 
288
378
  .lockerverse-public-events__copy-link {
289
379
  display: grid;
290
380
  gap: 5px;
291
381
  width: 100%;
292
- margin-top: 12px;
382
+ margin-top: 6px;
293
383
  font-size: 12px;
294
384
  color: var(--lockerverse-muted);
295
385
  }
@@ -310,17 +400,6 @@
310
400
  outline-offset: 4px;
311
401
  }
312
402
 
313
- .lockerverse-public-events button {
314
- min-height: 44px;
315
- padding: 8px 12px;
316
- margin-top: 12px;
317
- font: inherit;
318
- color: var(--lockerverse-text);
319
- cursor: pointer;
320
- background: transparent;
321
- border: 1px solid var(--lockerverse-border);
322
- }
323
-
324
403
  .lockerverse-public-events__empty {
325
404
  padding: 24px 0;
326
405
  color: var(--lockerverse-muted);
@@ -332,33 +411,70 @@
332
411
  border-radius: 8px;
333
412
  }
334
413
 
335
- @container (max-width: 500px) {
414
+ @container (max-width: 760px) {
415
+ .lockerverse-public-events__layout {
416
+ grid-template-columns: minmax(0, 1fr);
417
+ row-gap: 16px;
418
+ }
419
+
420
+ .lockerverse-public-events__tabs,
421
+ .lockerverse-public-events__layout > section {
422
+ grid-column: 1;
423
+ }
424
+
425
+ .lockerverse-public-events__tabs {
426
+ flex-direction: row;
427
+ flex-wrap: wrap;
428
+ gap: 4px;
429
+ border-bottom: 1px solid var(--lockerverse-border);
430
+ }
431
+
432
+ .lockerverse-public-events .lockerverse-public-events__tab {
433
+ padding: 8px 10px;
434
+ border-radius: 8px 8px 0 0;
435
+ }
436
+ }
437
+
438
+ @container (max-width: 540px) {
336
439
  .lockerverse-public-events__row {
337
- grid-template-columns: 72px minmax(0, 1fr);
338
- gap: 12px;
440
+ grid-template-columns: 96px minmax(0, 1fr);
441
+ gap: 6px 12px;
339
442
  padding: 12px;
340
443
  }
341
444
 
342
- .lockerverse-public-events__row--with-image {
445
+ .lockerverse-public-events__image,
446
+ .lockerverse-public-events__date {
447
+ width: 96px;
448
+ height: 96px;
449
+ }
450
+
451
+ .lockerverse-public-events h4 {
452
+ font-size: 16px;
453
+ }
454
+ }
455
+
456
+ @container (max-width: 380px) {
457
+ .lockerverse-public-events__row {
343
458
  grid-template-columns: minmax(0, 1fr);
344
459
  }
345
460
 
346
461
  .lockerverse-public-events__image {
462
+ grid-row: 1;
463
+ width: 100%;
347
464
  height: auto;
348
465
  aspect-ratio: 16 / 9;
349
466
  }
350
467
 
351
468
  .lockerverse-public-events__date {
352
- width: 72px;
353
- height: 72px;
469
+ grid-row: 1;
354
470
  }
355
471
 
356
- .lockerverse-public-events__day {
357
- font-size: 27px;
472
+ .lockerverse-public-events__content,
473
+ .lockerverse-public-events__actions {
474
+ grid-column: 1;
358
475
  }
359
476
 
360
- .lockerverse-public-events__row--with-image
361
- .lockerverse-public-events__actions {
362
- grid-column: 1;
477
+ .lockerverse-public-events__actions {
478
+ grid-row: 3;
363
479
  }
364
480
  }
@@ -1 +1 @@
1
- {"version":3,"file":"public-events.d.ts","names":[],"sources":["../src/use-lockerverse-public-events.ts","../src/lockerverse-public-events.tsx"],"mappings":";;;KAUY;EACV,QAAQ;EACR,QAAQ;EACR;EACA,OAAO;EACP;;;iBAIc,2BACd,SAAS,uCACR;;;KCdS;EACV,QAAQ;;EAER;EACA;EACA;;EAEA;EACA,QAAQ;EACR,QAAQ;EACR;;;iBA8Pc,0BACd,QACA,OACA,aACA,cACA,UACA,OACA,OACA,aACC,+CAA4B,IAAA"}
1
+ {"version":3,"file":"public-events.d.ts","names":[],"sources":["../src/use-lockerverse-public-events.ts","../src/lockerverse-public-events.tsx"],"mappings":";;;KAUY;EACV,QAAQ;EACR,QAAQ;EACR;EACA,OAAO;EACP;;;iBAIc,2BACd,SAAS,uCACR;;;KCPS;EACV,QAAQ;;EAER;EACA;EACA;;EAEA;EACA,QAAQ;EACR,QAAQ;EACR;;;iBAkWc,0BACd,QACA,OACA,aACA,cACA,UACA,OACA,OACA,aACC,+CAA4B,IAAA"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./immutable-resource-identity.js";import{t}from"./accent-contrast.js";import{Share2 as n}from"lucide-react";import{useCallback as r,useEffect as i,useId as a,useRef as o,useState as s}from"react";import{Fragment as c,jsx as l,jsxs as u}from"react/jsx-runtime";import{createLockerversePublicEventsClient as d}from"@lockerverse/sdk/public-events";function f(e,t){return new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:t,year:`numeric`}).format(new Date(e))}function p(e,t){return new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:t,timeZoneName:`short`}).format(new Date(e))}function m(e){if(!e)return null;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`?t.toString():null}catch{return null}}function h(e,t){let n=m(e.link);if(n)return n;let r=new URL(window.location.href);return t?r.searchParams.set(`lockerverseEvents`,`past`):r.searchParams.delete(`lockerverseEvents`),r.searchParams.delete(`lockerverseEventOffset`),r.hash=`event-${e.id}`,r.toString()}function g(e){let n=e?.[`--lockerverse-accent`];if(!n||e?.[`--lockerverse-accent-contrast`]!==void 0)return e;let r=t(n);return r?{...e,"--lockerverse-accent-contrast":r}:e}function _({active:e,imageUrl:t,startAt:n,startDateLabel:r}){return t||e?u(`div`,{className:`lockerverse-public-events__meta`,children:[t?l(`time`,{dateTime:n,children:r}):null,e?l(`span`,{className:`lockerverse-public-events__live`,children:`Live now`}):null]}):null}function v({item:e,timeZone:t,active:r,past:i=!1}){let[a,o]=s(!1),[d,g]=s(!1),[v,y]=s(null),b=new Date(e.startAt),x=new Intl.DateTimeFormat(`en-US`,{month:`short`,timeZone:t}).format(b),S=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,timeZone:t}).format(b),C=new Intl.DateTimeFormat(`en-US`,{timeZone:t,year:`numeric`}).format(b),w=f(e.startAt,t),T=w===f(e.endAt,t)?p(e.endAt,t):`${f(e.endAt,t)} at ${p(e.endAt,t)}`,E=m(e.link),D=m(e.imageUrl),O=(e.description?.length??0)>130;async function k(){let t=h(e,i);if(navigator.share)try{await navigator.share({title:e.name,url:t});return}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return}try{await navigator.clipboard.writeText(t),g(!0)}catch{y(t)}}return l(`li`,{className:`lockerverse-public-events__item`,id:`event-${e.id}`,children:u(`article`,{className:[`lockerverse-public-events__row`,D?`lockerverse-public-events__row--with-image`:``].filter(Boolean).join(` `),children:[D?l(`img`,{alt:``,className:`lockerverse-public-events__image`,height:124,loading:`lazy`,src:D,width:154}):u(`time`,{className:`lockerverse-public-events__date`,dateTime:e.startAt,children:[l(`span`,{className:`lockerverse-public-events__month`,children:x}),l(`span`,{className:`lockerverse-public-events__day`,children:S}),l(`span`,{className:`lockerverse-public-events__year`,children:C})]}),u(`div`,{className:`lockerverse-public-events__content`,children:[l(_,{active:r,imageUrl:D,startAt:e.startAt,startDateLabel:w}),l(`h4`,{children:e.name}),u(`p`,{className:`lockerverse-public-events__time`,children:[l(`time`,{dateTime:e.startAt,children:p(e.startAt,t)}),l(`span`,{"aria-hidden":`true`,children:` — `}),l(`time`,{dateTime:e.endAt,children:T})]}),e.location?l(`p`,{className:`lockerverse-public-events__place`,children:e.location}):null,e.description?u(c,{children:[l(`p`,{className:[`lockerverse-public-events__description`,O&&!a?`lockerverse-public-events__description--clamped`:``].filter(Boolean).join(` `),children:e.description}),O?l(`button`,{"aria-expanded":a,className:`lockerverse-public-events__more`,onClick:()=>o(!a),type:`button`,children:a?`Show less`:`Read more`}):null]}):null,v?u(`label`,{className:`lockerverse-public-events__copy-link`,children:[`Copy event link`,l(`input`,{onFocus:e=>e.currentTarget.select(),readOnly:!0,value:v})]}):null]}),u(`div`,{className:`lockerverse-public-events__actions`,children:[E?u(`a`,{className:`lockerverse-public-events__link`,href:E,rel:`noopener noreferrer`,target:`_blank`,children:[`View event `,l(`span`,{"aria-hidden":`true`,children:`↗`})]}):null,u(`button`,{"aria-label":`Share ${e.name}`,className:`lockerverse-public-events__share`,onClick:k,type:`button`,children:[l(n,{"aria-hidden":`true`,size:16,strokeWidth:1.8}),d?`Link copied`:`Share`]})]})]})})}function y({events:e,title:t=`Events`,showHeading:n=!0,emptyMessage:o=`No events yet.`,timeZone:c=`America/New_York`,theme:d=`dark`,style:f,className:p}){let[m,h]=s(()=>Date.now()),[_,y]=s(`current`),[b,x]=s([]),[S,C]=s(0),[w,T]=s(!1),[E,D]=s(!1),[O,k]=s(!1),[A,j]=s(null),[M,N]=s(null),P=a(),F=r(async(t,n=!1)=>{k(!0),j(null);try{let r=await e.client.listPast({offset:t});x(e=>n?r.events:[...e,...r.events]),C(t+r.events.length),T(r.hasMore),D(!0)}catch(e){j(e instanceof Error?e.message:`Unable to load past events.`)}finally{k(!1)}},[e.client]);i(()=>{let e=window.setInterval(()=>h(Date.now()),6e4);return()=>window.clearInterval(e)},[]),i(()=>{let e=new URL(window.location.href);e.searchParams.get(`lockerverseEvents`)===`past`&&(y(`past`),N(e.hash.slice(1)),F(0,!0))},[F]),i(()=>{let e=window.location.hash.slice(1);if(!e.startsWith(`event-`))return;if(_===`current`){document.getElementById(e)?.scrollIntoView({block:`center`});return}if(!M||O||!E)return;let t=document.getElementById(M);t?(t.scrollIntoView({block:`center`}),N(null)):w?F(S):N(null)},[e.events,F,w,E,O,S,M,_]);function I(){y(`past`),!(E||O)&&F(0,!0)}let L=e.events||[],R=L.filter(e=>new Date(e.startAt).getTime()<=m&&new Date(e.endAt).getTime()>m),z=L.filter(e=>new Date(e.startAt).getTime()>m);return u(`section`,{"aria-busy":_===`past`?O:e.loading,"aria-label":t,className:[`lockerverse-public-events`,p].filter(Boolean).join(` `),"data-lockerverse-theme":d,style:g(f),children:[n?l(`h2`,{children:t}):null,u(`nav`,{"aria-label":`Event views`,className:`lockerverse-public-events__tabs`,children:[l(`button`,{"aria-controls":`${P}-current-panel`,"aria-pressed":_===`current`,className:`lockerverse-public-events__tab`,id:`${P}-current-tab`,onClick:()=>y(`current`),type:`button`,children:`Upcoming Events`}),l(`button`,{"aria-controls":`${P}-past-panel`,"aria-pressed":_===`past`,className:`lockerverse-public-events__tab`,id:`${P}-past-tab`,onClick:I,type:`button`,children:`Past Events`})]}),u(`section`,{"aria-labelledby":`${P}-current-tab`,hidden:_!==`current`,id:`${P}-current-panel`,children:[e.loading&&!e.events?l(`p`,{role:`status`,children:`Loading events…`}):null,e.error?u(`div`,{role:`alert`,children:[l(`p`,{children:e.error.message}),l(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,e.events&&R.length===0&&z.length===0?l(`p`,{className:`lockerverse-public-events__empty`,children:o}):null,R.length>0?l(`div`,{className:`lockerverse-public-events__group`,children:l(`ol`,{className:`lockerverse-public-events__list`,children:R.map(e=>l(v,{active:!0,item:e,timeZone:c},e.id))})}):null,z.length>0?u(`div`,{className:`lockerverse-public-events__group`,children:[l(`h3`,{className:`lockerverse-public-events__group-title`,children:`Upcoming`}),l(`ol`,{className:`lockerverse-public-events__list`,children:z.map(e=>l(v,{active:!1,item:e,timeZone:c},e.id))})]}):null]}),u(`section`,{"aria-labelledby":`${P}-past-tab`,hidden:_!==`past`,id:`${P}-past-panel`,children:[A?u(`div`,{role:`alert`,children:[l(`p`,{children:A}),l(`button`,{onClick:()=>F(E?S:0,!E),type:`button`,children:`Try again`})]}):null,O&&!E?l(`p`,{role:`status`,children:`Loading past events…`}):null,E&&b.length===0?l(`p`,{className:`lockerverse-public-events__empty`,children:`No past events yet.`}):null,b.length>0?l(`ol`,{className:`lockerverse-public-events__list`,children:b.map(e=>l(v,{active:!1,item:e,past:!0,timeZone:c},e.id))}):null,w?l(`button`,{className:`lockerverse-public-events__load-more`,disabled:O,onClick:()=>F(S),type:`button`,children:O?`Loading…`:`Load more past events`}):null]})]})}function b(t){e(`public events`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:``});let n=o(t.onError);n.current=t.onError;let[a]=s(()=>d({...t,onError:e=>n.current?.(e)})),[c,l]=s(0),[u,f]=s({error:null,events:null,loading:!0});i(()=>{let e=!0;return a.list().then(t=>{e&&f({error:null,events:t,loading:!1})},t=>{e&&f(e=>({...e,error:t,loading:!1}))}),()=>{e=!1}},[a,c]);let p=r(()=>{f(e=>({...e,error:null,loading:!0})),l(e=>e+1)},[]);return{...u,client:a,refresh:p}}export{y as LockerversePublicEvents,b as useLockerversePublicEvents};
1
+ import{t as e}from"./immutable-resource-identity.js";import{t}from"./accent-contrast.js";import{CalendarDays as n,CalendarX2 as r,Copy as i,Facebook as a,Mail as o,Share2 as s}from"lucide-react";import{useCallback as c,useEffect as l,useId as u,useRef as d,useState as f}from"react";import{Fragment as p,jsx as m,jsxs as h}from"react/jsx-runtime";import{createLockerversePublicEventsClient as g}from"@lockerverse/sdk/public-events";function _(e,t){return new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:t,year:`numeric`}).format(new Date(e))}function v(e,t){return new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:t,timeZoneName:`short`}).format(new Date(e))}function y(e){if(!e)return null;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`?t.toString():null}catch{return null}}function b(e,t){let n=y(e.link);if(n)return n;let r=new URL(window.location.href);return t?r.searchParams.set(`lockerverseEvents`,`past`):r.searchParams.delete(`lockerverseEvents`),r.searchParams.delete(`lockerverseEventOffset`),r.hash=`event-${e.id}`,r.toString()}function x(e){let n=e?.[`--lockerverse-accent`];if(!n||e?.[`--lockerverse-accent-contrast`]!==void 0)return e;let r=t(n);return r?{...e,"--lockerverse-accent-contrast":r}:e}function S(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t);try{return t.select(),document.execCommand(`copy`)}catch{return!1}finally{t.remove()}}function C({item:e,past:t}){let[n,r]=f(!1),[c,u]=f(null),[p,g]=f(null),[_,v]=f(!1),x=d(null),C=d(null),w=y(e.link),T=e=>e instanceof Node&&x.current?.contains(e);l(()=>{if(!p)return;let e=e=>{T(e.target)||g(null)},t=e=>{e.key===`Escape`&&(g(null),x.current?.contains(document.activeElement)&&C.current?.focus())},n=e=>{T(e.target)||g(null)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),document.addEventListener(`focusin`,n),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t),document.removeEventListener(`focusin`,n)}},[p]);async function E(){if(p)try{await navigator.clipboard.writeText(p),r(!0),g(null),C.current?.focus()}catch{S(p)?(r(!0),g(null),C.current?.focus()):u(p)}}return h(`div`,{className:`lockerverse-public-events__actions`,ref:x,children:[w?h(`a`,{className:`lockerverse-public-events__link`,href:w,rel:`noopener noreferrer`,target:`_blank`,children:[`View event `,m(`span`,{"aria-hidden":`true`,children:`↗`})]}):null,m(`button`,{"aria-expanded":p!==null,"aria-label":`Share ${e.name}`,className:`lockerverse-public-events__share`,onClick:()=>{!p&&C.current&&v(window.innerHeight-C.current.getBoundingClientRect().bottom<72),g(p?null:b(e,t)),r(!1),u(null)},ref:C,title:`Share ${e.name}`,type:`button`,children:m(s,{"aria-hidden":`true`,size:16,strokeWidth:1.8})}),n?m(`span`,{className:`lockerverse-public-events__copied`,role:`status`,children:`Link copied`}):null,p?h(`fieldset`,{className:`lockerverse-public-events__share-menu`,"data-above":_,children:[h(`legend`,{className:`lockerverse-public-events__visually-hidden`,children:[`Share `,e.name]}),m(`button`,{"aria-label":`Copy event link`,onClick:E,title:`Copy link`,type:`button`,children:m(i,{"aria-hidden":`true`,size:18})}),m(`a`,{"aria-label":`Share by email`,href:`mailto:?subject=${encodeURIComponent(e.name)}&body=${encodeURIComponent(p)}`,title:`Email`,children:m(o,{"aria-hidden":`true`,size:18})}),m(`a`,{"aria-label":`Share on Facebook`,href:`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(p)}`,rel:`noopener noreferrer`,target:`_blank`,title:`Facebook`,children:m(a,{"aria-hidden":`true`,size:18})}),m(`a`,{"aria-label":`Share on X`,href:`https://twitter.com/intent/tweet?url=${encodeURIComponent(p)}&text=${encodeURIComponent(e.name)}`,rel:`noopener noreferrer`,target:`_blank`,title:`X`,children:m(`span`,{children:`𝕏`})}),c?h(`label`,{className:`lockerverse-public-events__copy-link`,children:[`Select and copy this event link`,m(`input`,{autoFocus:!0,onFocus:e=>e.currentTarget.select(),readOnly:!0,value:c})]}):null]}):null]})}function w({item:e,timeZone:t,active:n,past:r=!1}){let[i,a]=f(!1),o=new Date(e.startAt),s=new Intl.DateTimeFormat(`en-US`,{month:`short`,timeZone:t}).format(o),c=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,timeZone:t}).format(o),l=new Intl.DateTimeFormat(`en-US`,{timeZone:t,year:`numeric`}).format(o),u=_(e.startAt,t),d=u===_(e.endAt,t)?v(e.endAt,t):`${_(e.endAt,t)} at ${v(e.endAt,t)}`,g=y(e.imageUrl),b=(e.description?.length??0)>130;return m(`li`,{className:`lockerverse-public-events__item`,id:`event-${e.id}`,children:h(`article`,{className:`lockerverse-public-events__row`,children:[g?m(`img`,{alt:``,className:`lockerverse-public-events__image`,height:124,loading:`lazy`,src:g,width:154}):h(`time`,{className:`lockerverse-public-events__date`,dateTime:e.startAt,children:[m(`span`,{className:`lockerverse-public-events__month`,children:s}),m(`span`,{className:`lockerverse-public-events__day`,children:c}),m(`span`,{className:`lockerverse-public-events__year`,children:l})]}),h(`div`,{className:`lockerverse-public-events__content`,children:[h(`div`,{className:`lockerverse-public-events__meta`,children:[g?m(`time`,{dateTime:e.startAt,children:u}):null,h(`span`,{className:`lockerverse-public-events__time`,children:[m(`time`,{dateTime:e.startAt,children:v(e.startAt,t)}),m(`span`,{"aria-hidden":`true`,children:` – `}),m(`time`,{dateTime:e.endAt,children:d})]}),n?m(`span`,{className:`lockerverse-public-events__live`,children:`Live now`}):null]}),m(`h4`,{children:e.name}),e.location?m(`p`,{className:`lockerverse-public-events__place`,children:e.location}):null,e.description?h(p,{children:[m(`p`,{className:[`lockerverse-public-events__description`,b&&!i?`lockerverse-public-events__description--clamped`:``].filter(Boolean).join(` `),children:e.description}),b?m(`button`,{"aria-expanded":i,className:`lockerverse-public-events__more`,onClick:()=>a(!i),type:`button`,children:i?`Show less`:`Read more`}):null]}):null]}),m(C,{item:e,past:r})]})})}function T({events:e,title:t=`Events`,showHeading:i=!0,emptyMessage:a=`No events yet.`,timeZone:o=`America/New_York`,theme:s=`dark`,style:d,className:p}){let[g,_]=f(()=>Date.now()),[v,y]=f(`current`),[b,S]=f([]),[C,T]=f(0),[E,D]=f(!1),[O,k]=f(!1),[A,j]=f(!1),[M,N]=f(null),[P,F]=f(null),I=u(),L=c(async(t,n=!1)=>{j(!0),N(null);try{let r=await e.client.listPast({offset:t});S(e=>n?r.events:[...e,...r.events]),T(t+r.events.length),D(r.hasMore),k(!0)}catch(e){N(e instanceof Error?e.message:`Unable to load past events.`)}finally{j(!1)}},[e.client]);l(()=>{let e=window.setInterval(()=>_(Date.now()),6e4);return()=>window.clearInterval(e)},[]),l(()=>{let e=new URL(window.location.href);e.searchParams.get(`lockerverseEvents`)===`past`&&(y(`past`),F(e.hash.slice(1)),L(0,!0))},[L]),l(()=>{let e=window.location.hash.slice(1);if(!e.startsWith(`event-`))return;if(v===`current`){document.getElementById(e)?.scrollIntoView({block:`center`});return}if(!P||A||!O)return;let t=document.getElementById(P);t?(t.scrollIntoView({block:`center`}),F(null)):E?L(C):F(null)},[e.events,L,E,O,A,C,P,v]);function R(){y(`past`),!(O||A)&&L(0,!0)}let z=e.events||[],B=z.filter(e=>new Date(e.startAt).getTime()<=g&&new Date(e.endAt).getTime()>g),V=z.filter(e=>new Date(e.startAt).getTime()>g);return m(`section`,{"aria-busy":v===`past`?A:e.loading,"aria-label":t,className:[`lockerverse-public-events`,p].filter(Boolean).join(` `),"data-lockerverse-theme":s,style:x(d),children:h(`div`,{className:`lockerverse-public-events__layout`,children:[i?m(`h2`,{children:t}):null,h(`nav`,{"aria-label":`Event views`,className:`lockerverse-public-events__tabs`,children:[h(`button`,{"aria-controls":`${I}-current-panel`,"aria-pressed":v===`current`,className:`lockerverse-public-events__tab`,id:`${I}-current-tab`,onClick:()=>y(`current`),type:`button`,children:[m(n,{"aria-hidden":`true`,size:18}),`Upcoming Events`]}),h(`button`,{"aria-controls":`${I}-past-panel`,"aria-pressed":v===`past`,className:`lockerverse-public-events__tab`,id:`${I}-past-tab`,onClick:R,type:`button`,children:[m(r,{"aria-hidden":`true`,size:18}),`Past Events`]})]}),h(`section`,{"aria-labelledby":`${I}-current-tab`,hidden:v!==`current`,id:`${I}-current-panel`,children:[e.loading&&!e.events?m(`p`,{role:`status`,children:`Loading events…`}):null,e.error?h(`div`,{role:`alert`,children:[m(`p`,{children:e.error.message}),m(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,e.events&&B.length===0&&V.length===0?m(`p`,{className:`lockerverse-public-events__empty`,children:a}):null,B.length>0?m(`div`,{className:`lockerverse-public-events__group`,children:m(`ol`,{className:`lockerverse-public-events__list`,children:B.map(e=>m(w,{active:!0,item:e,timeZone:o},e.id))})}):null,V.length>0?m(`div`,{className:`lockerverse-public-events__group`,children:m(`ol`,{className:`lockerverse-public-events__list`,children:V.map(e=>m(w,{active:!1,item:e,timeZone:o},e.id))})}):null]}),h(`section`,{"aria-labelledby":`${I}-past-tab`,hidden:v!==`past`,id:`${I}-past-panel`,children:[M?h(`div`,{role:`alert`,children:[m(`p`,{children:M}),m(`button`,{onClick:()=>L(O?C:0,!O),type:`button`,children:`Try again`})]}):null,A&&!O?m(`p`,{role:`status`,children:`Loading past events…`}):null,O&&b.length===0?m(`p`,{className:`lockerverse-public-events__empty`,children:`No past events yet.`}):null,b.length>0?m(`ol`,{className:`lockerverse-public-events__list`,children:b.map(e=>m(w,{active:!1,item:e,past:!0,timeZone:o},e.id))}):null,E?m(`button`,{className:`lockerverse-public-events__load-more`,disabled:A,onClick:()=>L(C),type:`button`,children:A?`Loading…`:`Load more past events`}):null]})]})})}function E(t){e(`public events`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:``});let n=d(t.onError);n.current=t.onError;let[r]=f(()=>g({...t,onError:e=>n.current?.(e)})),[i,a]=f(0),[o,s]=f({error:null,events:null,loading:!0});l(()=>{let e=!0;return r.list().then(t=>{e&&s({error:null,events:t,loading:!1})},t=>{e&&s(e=>({...e,error:t,loading:!1}))}),()=>{e=!1}},[r,i]);let u=c(()=>{s(e=>({...e,error:null,loading:!0})),a(e=>e+1)},[]);return{...o,client:r,refresh:u}}export{T as LockerversePublicEvents,E as useLockerversePublicEvents};
2
2
  //# sourceMappingURL=public-events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-events.js","names":[],"sources":["../src/lockerverse-public-events.tsx","../src/use-lockerverse-public-events.ts"],"sourcesContent":["import type { LockerversePublicEvent } from \"@lockerverse/sdk/public-events\";\nimport { Share2 } from \"lucide-react\";\nimport { useCallback, useEffect, useId, useState } from \"react\";\nimport { getAccentContrast } from \"./accent-contrast.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport type { UseLockerversePublicEventsResult } from \"./use-lockerverse-public-events.ts\";\n\nexport type LockerversePublicEventsProps = {\n events: UseLockerversePublicEventsResult;\n /** The visible heading. Defaults to Events. */\n title?: string;\n showHeading?: boolean;\n emptyMessage?: string;\n /** Used to show dates and times. Defaults to America/New_York. */\n timeZone?: string;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n};\n\nfunction formatDate(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone,\n year: \"numeric\",\n }).format(new Date(value));\n}\n\nfunction formatTime(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n timeZoneName: \"short\",\n }).format(new Date(value));\n}\n\nfunction getLink(value: string | null) {\n if (!value) {\n return null;\n }\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\"\n ? url.toString()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getShareUrl(item: LockerversePublicEvent, past: boolean) {\n const link = getLink(item.link);\n if (link) {\n return link;\n }\n const url = new URL(window.location.href);\n if (past) {\n url.searchParams.set(\"lockerverseEvents\", \"past\");\n } else {\n url.searchParams.delete(\"lockerverseEvents\");\n }\n url.searchParams.delete(\"lockerverseEventOffset\");\n url.hash = `event-${item.id}`;\n return url.toString();\n}\n\nfunction withAccentContrast(style?: LockerverseStyle) {\n const accent = style?.[\"--lockerverse-accent\"];\n if (!accent || style?.[\"--lockerverse-accent-contrast\"] !== undefined) {\n return style;\n }\n const contrast = getAccentContrast(accent);\n return contrast\n ? { ...style, \"--lockerverse-accent-contrast\": contrast }\n : style;\n}\n\nfunction EventDateMeta({\n active,\n imageUrl,\n startAt,\n startDateLabel,\n}: {\n active: boolean;\n imageUrl: string | null;\n startAt: string;\n startDateLabel: string;\n}) {\n if (!(imageUrl || active)) {\n return null;\n }\n\n return (\n <div className=\"lockerverse-public-events__meta\">\n {imageUrl ? <time dateTime={startAt}>{startDateLabel}</time> : null}\n {active ? (\n <span className=\"lockerverse-public-events__live\">Live now</span>\n ) : null}\n </div>\n );\n}\n\nfunction PublicEventRow({\n item,\n timeZone,\n active,\n past = false,\n}: {\n item: LockerversePublicEvent;\n timeZone: string;\n active: boolean;\n past?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n const [manualShareUrl, setManualShareUrl] = useState<string | null>(null);\n const start = new Date(item.startAt);\n const month = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone,\n }).format(start);\n const day = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n timeZone,\n }).format(start);\n const year = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n }).format(start);\n const startDateLabel = formatDate(item.startAt, timeZone);\n const sameDay = startDateLabel === formatDate(item.endAt, timeZone);\n const endLabel = sameDay\n ? formatTime(item.endAt, timeZone)\n : `${formatDate(item.endAt, timeZone)} at ${formatTime(item.endAt, timeZone)}`;\n const link = getLink(item.link);\n const imageUrl = getLink(item.imageUrl);\n const canExpand = (item.description?.length ?? 0) > 130;\n\n async function shareEvent() {\n const url = getShareUrl(item, past);\n if (navigator.share) {\n try {\n await navigator.share({ title: item.name, url });\n return;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return;\n }\n }\n }\n try {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n } catch {\n setManualShareUrl(url);\n }\n }\n\n return (\n <li className=\"lockerverse-public-events__item\" id={`event-${item.id}`}>\n <article\n className={[\n \"lockerverse-public-events__row\",\n imageUrl ? \"lockerverse-public-events__row--with-image\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {imageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-public-events__image\"\n height={124}\n loading=\"lazy\"\n src={imageUrl}\n width={154}\n />\n ) : (\n <time\n className=\"lockerverse-public-events__date\"\n dateTime={item.startAt}\n >\n <span className=\"lockerverse-public-events__month\">{month}</span>\n <span className=\"lockerverse-public-events__day\">{day}</span>\n <span className=\"lockerverse-public-events__year\">{year}</span>\n </time>\n )}\n <div className=\"lockerverse-public-events__content\">\n <EventDateMeta\n active={active}\n imageUrl={imageUrl}\n startAt={item.startAt}\n startDateLabel={startDateLabel}\n />\n <h4>{item.name}</h4>\n <p className=\"lockerverse-public-events__time\">\n <time dateTime={item.startAt}>\n {formatTime(item.startAt, timeZone)}\n </time>\n <span aria-hidden=\"true\"> — </span>\n <time dateTime={item.endAt}>{endLabel}</time>\n </p>\n {item.location ? (\n <p className=\"lockerverse-public-events__place\">{item.location}</p>\n ) : null}\n {item.description ? (\n <>\n <p\n className={[\n \"lockerverse-public-events__description\",\n canExpand && !expanded\n ? \"lockerverse-public-events__description--clamped\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.description}\n </p>\n {canExpand ? (\n <button\n aria-expanded={expanded}\n className=\"lockerverse-public-events__more\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </>\n ) : null}\n {manualShareUrl ? (\n <label className=\"lockerverse-public-events__copy-link\">\n Copy event link\n <input\n onFocus={(event) => event.currentTarget.select()}\n readOnly\n value={manualShareUrl}\n />\n </label>\n ) : null}\n </div>\n <div className=\"lockerverse-public-events__actions\">\n {link ? (\n <a\n className=\"lockerverse-public-events__link\"\n href={link}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n View event <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n <button\n aria-label={`Share ${item.name}`}\n className=\"lockerverse-public-events__share\"\n onClick={shareEvent}\n type=\"button\"\n >\n <Share2 aria-hidden=\"true\" size={16} strokeWidth={1.8} />\n {copied ? \"Link copied\" : \"Share\"}\n </button>\n </div>\n </article>\n </li>\n );\n}\n\n/** Optional public list that can be embedded in any React site. */\nexport function LockerversePublicEvents({\n events,\n title = \"Events\",\n showHeading = true,\n emptyMessage = \"No events yet.\",\n timeZone = \"America/New_York\",\n theme = \"dark\",\n style,\n className,\n}: LockerversePublicEventsProps) {\n const [now, setNow] = useState(() => Date.now());\n const [view, setView] = useState<\"current\" | \"past\">(\"current\");\n const [pastEvents, setPastEvents] = useState<LockerversePublicEvent[]>([]);\n const [pastOffset, setPastOffset] = useState(0);\n const [pastHasMore, setPastHasMore] = useState(false);\n const [pastLoaded, setPastLoaded] = useState(false);\n const [pastLoading, setPastLoading] = useState(false);\n const [pastError, setPastError] = useState<string | null>(null);\n const [pastTarget, setPastTarget] = useState<string | null>(null);\n const tabId = useId();\n\n const loadPast = useCallback(\n async (offset: number, reset = false) => {\n setPastLoading(true);\n setPastError(null);\n try {\n const page = await events.client.listPast({ offset });\n setPastEvents((current) =>\n reset ? page.events : [...current, ...page.events]\n );\n setPastOffset(offset + page.events.length);\n setPastHasMore(page.hasMore);\n setPastLoaded(true);\n } catch (error) {\n setPastError(\n error instanceof Error ? error.message : \"Unable to load past events.\"\n );\n } finally {\n setPastLoading(false);\n }\n },\n [events.client]\n );\n\n useEffect(() => {\n const interval = window.setInterval(() => setNow(Date.now()), 60_000);\n return () => window.clearInterval(interval);\n }, []);\n\n useEffect(() => {\n const url = new URL(window.location.href);\n if (url.searchParams.get(\"lockerverseEvents\") !== \"past\") {\n return;\n }\n setView(\"past\");\n setPastTarget(url.hash.slice(1));\n loadPast(0, true);\n }, [loadPast]);\n\n useEffect(() => {\n const hash = window.location.hash.slice(1);\n if (!hash.startsWith(\"event-\")) {\n return;\n }\n if (view === \"current\") {\n document.getElementById(hash)?.scrollIntoView({ block: \"center\" });\n return;\n }\n if (!pastTarget || pastLoading || !pastLoaded) {\n return;\n }\n const target = document.getElementById(pastTarget);\n if (target) {\n target.scrollIntoView({ block: \"center\" });\n setPastTarget(null);\n } else if (pastHasMore) {\n loadPast(pastOffset);\n } else {\n setPastTarget(null);\n }\n }, [\n events.events,\n loadPast,\n pastHasMore,\n pastLoaded,\n pastLoading,\n pastOffset,\n pastTarget,\n view,\n ]);\n\n function openPast() {\n setView(\"past\");\n if (pastLoaded || pastLoading) {\n return;\n }\n loadPast(0, true);\n }\n\n const availableEvents = events.events || [];\n const activeEvents = availableEvents.filter(\n (item) =>\n new Date(item.startAt).getTime() <= now &&\n new Date(item.endAt).getTime() > now\n );\n const upcomingEvents = availableEvents.filter(\n (item) => new Date(item.startAt).getTime() > now\n );\n\n return (\n <section\n aria-busy={view === \"past\" ? pastLoading : events.loading}\n aria-label={title}\n className={[\"lockerverse-public-events\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={withAccentContrast(style)}\n >\n {showHeading ? <h2>{title}</h2> : null}\n <nav aria-label=\"Event views\" className=\"lockerverse-public-events__tabs\">\n <button\n aria-controls={`${tabId}-current-panel`}\n aria-pressed={view === \"current\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-current-tab`}\n onClick={() => setView(\"current\")}\n type=\"button\"\n >\n Upcoming Events\n </button>\n <button\n aria-controls={`${tabId}-past-panel`}\n aria-pressed={view === \"past\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-past-tab`}\n onClick={openPast}\n type=\"button\"\n >\n Past Events\n </button>\n </nav>\n <section\n aria-labelledby={`${tabId}-current-tab`}\n hidden={view !== \"current\"}\n id={`${tabId}-current-panel`}\n >\n {events.loading && !events.events ? (\n <p role=\"status\">Loading events…</p>\n ) : null}\n {events.error ? (\n <div role=\"alert\">\n <p>{events.error.message}</p>\n <button onClick={events.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {events.events &&\n activeEvents.length === 0 &&\n upcomingEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">{emptyMessage}</p>\n ) : null}\n {activeEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <ol className=\"lockerverse-public-events__list\">\n {activeEvents.map((item) => (\n <PublicEventRow\n active\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n {upcomingEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <h3 className=\"lockerverse-public-events__group-title\">Upcoming</h3>\n <ol className=\"lockerverse-public-events__list\">\n {upcomingEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n </section>\n <section\n aria-labelledby={`${tabId}-past-tab`}\n hidden={view !== \"past\"}\n id={`${tabId}-past-panel`}\n >\n {pastError ? (\n <div role=\"alert\">\n <p>{pastError}</p>\n <button\n onClick={() => loadPast(pastLoaded ? pastOffset : 0, !pastLoaded)}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n ) : null}\n {pastLoading && !pastLoaded ? (\n <p role=\"status\">Loading past events…</p>\n ) : null}\n {pastLoaded && pastEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">\n No past events yet.\n </p>\n ) : null}\n {pastEvents.length > 0 ? (\n <ol className=\"lockerverse-public-events__list\">\n {pastEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n past\n timeZone={timeZone}\n />\n ))}\n </ol>\n ) : null}\n {pastHasMore ? (\n <button\n className=\"lockerverse-public-events__load-more\"\n disabled={pastLoading}\n onClick={() => loadPast(pastOffset)}\n type=\"button\"\n >\n {pastLoading ? \"Loading…\" : \"Load more past events\"}\n </button>\n ) : null}\n </section>\n </section>\n );\n}\n","import {\n type CreateLockerversePublicEventsOptions,\n createLockerversePublicEventsClient,\n type LockerversePublicEvent,\n type LockerversePublicEventsClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/public-events\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerversePublicEventsResult = {\n client: LockerversePublicEventsClient;\n events: LockerversePublicEvent[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load the public events list for one community. */\nexport function useLockerversePublicEvents(\n options: CreateLockerversePublicEventsOptions\n): UseLockerversePublicEventsResult {\n useImmutableResourceIdentity(\"public events\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerversePublicEventsClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerversePublicEventsResult, \"events\" | \"loading\" | \"error\">\n >({ error: null, events: null, loading: true });\n\n useEffect(() => {\n let active = true;\n client.list().then(\n (events) => {\n if (active) {\n setState({ error: null, events, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"4WAoBA,SAAS,EAAW,EAAe,EAAkB,CACnD,OAAO,IAAI,KAAK,eAAe,QAAS,CACtC,IAAK,UACL,MAAO,QACP,WACA,KAAM,SACR,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAK,CAAC,CAC3B,CAEA,SAAS,EAAW,EAAe,EAAkB,CACnD,OAAO,IAAI,KAAK,eAAe,QAAS,CACtC,KAAM,UACN,OAAQ,UACR,WACA,aAAc,OAChB,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAK,CAAC,CAC3B,CAEA,SAAS,EAAQ,EAAsB,CACrC,GAAI,CAAC,EACH,OAAO,KAET,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,CAAK,EACzB,OAAO,EAAI,WAAa,UAAY,EAAI,WAAa,QACjD,EAAI,SAAS,EACb,IACN,MAAQ,CACN,OAAO,IACT,CACF,CAEA,SAAS,EAAY,EAA8B,EAAe,CAChE,IAAM,EAAO,EAAQ,EAAK,IAAI,EAC9B,GAAI,EACF,OAAO,EAET,IAAM,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAQxC,OAPI,EACF,EAAI,aAAa,IAAI,oBAAqB,MAAM,EAEhD,EAAI,aAAa,OAAO,mBAAmB,EAE7C,EAAI,aAAa,OAAO,wBAAwB,EAChD,EAAI,KAAO,SAAS,EAAK,KAClB,EAAI,SAAS,CACtB,CAEA,SAAS,EAAmB,EAA0B,CACpD,IAAM,EAAS,IAAQ,wBACvB,GAAI,CAAC,GAAU,IAAQ,mCAAqC,IAAA,GAC1D,OAAO,EAET,IAAM,EAAW,EAAkB,CAAM,EACzC,OAAO,EACH,CAAE,GAAG,EAAO,gCAAiC,CAAS,EACtD,CACN,CAEA,SAAS,EAAc,CACrB,SACA,WACA,UACA,kBAMC,CAKD,OAJM,GAAY,EAKhB,EAAC,MAAD,CAAK,UAAU,kCAAf,SAAA,CACG,EAAW,EAAC,OAAD,CAAM,SAAU,EAAU,SAAA,CAAqB,CAAA,EAAI,KAC9D,EACC,EAAC,OAAD,CAAM,UAAU,kCAAkC,SAAA,UAAc,CAAA,EAC9D,IACD,IATE,IAWX,CAEA,SAAS,EAAe,CACtB,OACA,WACA,SACA,OAAO,IAMN,CACD,GAAM,CAAC,EAAU,GAAe,EAAS,EAAK,EACxC,CAAC,EAAQ,GAAa,EAAS,EAAK,EACpC,CAAC,EAAgB,GAAqB,EAAwB,IAAI,EAClE,EAAQ,IAAI,KAAK,EAAK,OAAO,EAC7B,EAAQ,IAAI,KAAK,eAAe,QAAS,CAC7C,MAAO,QACP,UACF,CAAC,CAAC,CAAC,OAAO,CAAK,EACT,EAAM,IAAI,KAAK,eAAe,QAAS,CAC3C,IAAK,UACL,UACF,CAAC,CAAC,CAAC,OAAO,CAAK,EACT,EAAO,IAAI,KAAK,eAAe,QAAS,CAC5C,WACA,KAAM,SACR,CAAC,CAAC,CAAC,OAAO,CAAK,EACT,EAAiB,EAAW,EAAK,QAAS,CAAQ,EAElD,EADU,IAAmB,EAAW,EAAK,MAAO,CAAQ,EAE9D,EAAW,EAAK,MAAO,CAAQ,EAC/B,GAAG,EAAW,EAAK,MAAO,CAAQ,EAAE,MAAM,EAAW,EAAK,MAAO,CAAQ,IACvE,EAAO,EAAQ,EAAK,IAAI,EACxB,EAAW,EAAQ,EAAK,QAAQ,EAChC,GAAa,EAAK,aAAa,QAAU,GAAK,IAEpD,eAAe,GAAa,CAC1B,IAAM,EAAM,EAAY,EAAM,CAAI,EAClC,GAAI,UAAU,MACZ,GAAI,CACF,MAAM,UAAU,MAAM,CAAE,MAAO,EAAK,KAAM,KAAI,CAAC,EAC/C,MACF,OAAS,EAAO,CACd,GAAI,aAAiB,cAAgB,EAAM,OAAS,aAClD,MAEJ,CAEF,GAAI,CACF,MAAM,UAAU,UAAU,UAAU,CAAG,EACvC,EAAU,EAAI,CAChB,MAAQ,CACN,EAAkB,CAAG,CACvB,CACF,CAEA,OACE,EAAC,KAAD,CAAI,UAAU,kCAAkC,GAAI,SAAS,EAAK,KAChE,SAAA,EAAC,UAAD,CACE,UAAW,CACT,iCACA,EAAW,6CAA+C,EAC5D,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EANb,SAAA,CAQG,EACC,EAAC,MAAD,CACE,IAAI,GACJ,UAAU,mCACV,OAAQ,IACR,QAAQ,OACR,IAAK,EACL,MAAO,GACR,CAAA,EAED,EAAC,OAAD,CACE,UAAU,kCACV,SAAU,EAAK,QAFjB,SAAA,CAIE,EAAC,OAAD,CAAM,UAAU,mCAAoC,SAAA,CAAY,CAAA,EAChE,EAAC,OAAD,CAAM,UAAU,iCAAkC,SAAA,CAAU,CAAA,EAC5D,EAAC,OAAD,CAAM,UAAU,kCAAmC,SAAA,CAAW,CAAA,CAC1D,IAER,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,EAAD,CACU,SACE,WACV,QAAS,EAAK,QACE,gBACjB,CAAA,EACD,EAAC,KAAD,CAAA,SAAK,EAAK,IAAS,CAAA,EACnB,EAAC,IAAD,CAAG,UAAU,kCAAb,SAAA,CACE,EAAC,OAAD,CAAM,SAAU,EAAK,QAClB,SAAA,EAAW,EAAK,QAAS,CAAQ,CAC9B,CAAA,EACN,EAAC,OAAD,CAAM,cAAY,OAAO,SAAA,KAAS,CAAA,EAClC,EAAC,OAAD,CAAM,SAAU,EAAK,MAAQ,SAAA,CAAe,CAAA,CAC3C,IACF,EAAK,SACJ,EAAC,IAAD,CAAG,UAAU,mCAAoC,SAAA,EAAK,QAAY,CAAA,EAChE,KACH,EAAK,YACJ,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,IAAD,CACE,UAAW,CACT,yCACA,GAAa,CAAC,EACV,kDACA,EACN,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EAEV,SAAA,EAAK,WACL,CAAA,EACF,EACC,EAAC,SAAD,CACE,gBAAe,EACf,UAAU,kCACV,YAAe,EAAY,CAAC,CAAQ,EACpC,KAAK,SAEJ,SAAA,EAAW,YAAc,WACpB,CAAA,EACN,IACJ,CAAA,CAAA,EACA,KACH,EACC,EAAC,QAAD,CAAO,UAAU,uCAAjB,SAAA,CAAwD,kBAEtD,EAAC,QAAD,CACE,QAAU,GAAU,EAAM,cAAc,OAAO,EAC/C,SAAA,GACA,MAAO,CACR,CAAA,CACI,CACL,CAAA,EAAA,IACD,IACL,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACG,EACC,EAAC,IAAD,CACE,UAAU,kCACV,KAAM,EACN,IAAI,sBACJ,OAAO,SAJT,SAAA,CAKC,cACY,EAAC,OAAD,CAAM,cAAY,OAAO,SAAA,GAAO,CAAA,CAC1C,CACD,CAAA,EAAA,KACJ,EAAC,SAAD,CACE,aAAY,SAAS,EAAK,OAC1B,UAAU,mCACV,QAAS,EACT,KAAK,SAJP,SAAA,CAME,EAAC,EAAD,CAAQ,cAAY,OAAO,KAAM,GAAI,YAAa,GAAM,CAAA,EACvD,EAAS,cAAgB,OACpB,CACL,CAAA,CAAA,GACE,GACP,CAAA,CAER,CAGA,SAAgB,EAAwB,CACtC,SACA,QAAQ,SACR,cAAc,GACd,eAAe,iBACf,WAAW,mBACX,QAAQ,OACR,QACA,aAC+B,CAC/B,GAAM,CAAC,EAAK,GAAU,MAAe,KAAK,IAAI,CAAC,EACzC,CAAC,EAAM,GAAW,EAA6B,SAAS,EACxD,CAAC,EAAY,GAAiB,EAAmC,CAAC,CAAC,EACnE,CAAC,EAAY,GAAiB,EAAS,CAAC,EACxC,CAAC,EAAa,GAAkB,EAAS,EAAK,EAC9C,CAAC,EAAY,GAAiB,EAAS,EAAK,EAC5C,CAAC,EAAa,GAAkB,EAAS,EAAK,EAC9C,CAAC,EAAW,GAAgB,EAAwB,IAAI,EACxD,CAAC,EAAY,GAAiB,EAAwB,IAAI,EAC1D,EAAQ,EAAM,EAEd,EAAW,EACf,MAAO,EAAgB,EAAQ,KAAU,CACvC,EAAe,EAAI,EACnB,EAAa,IAAI,EACjB,GAAI,CACF,IAAM,EAAO,MAAM,EAAO,OAAO,SAAS,CAAE,QAAO,CAAC,EACpD,EAAe,GACb,EAAQ,EAAK,OAAS,CAAC,GAAG,EAAS,GAAG,EAAK,MAAM,CACnD,EACA,EAAc,EAAS,EAAK,OAAO,MAAM,EACzC,EAAe,EAAK,OAAO,EAC3B,EAAc,EAAI,CACpB,OAAS,EAAO,CACd,EACE,aAAiB,MAAQ,EAAM,QAAU,6BAC3C,CACF,QAAU,CACR,EAAe,EAAK,CACtB,CACF,EACA,CAAC,EAAO,MAAM,CAChB,EAEA,MAAgB,CACd,IAAM,EAAW,OAAO,gBAAkB,EAAO,KAAK,IAAI,CAAC,EAAG,GAAM,EACpE,UAAa,OAAO,cAAc,CAAQ,CAC5C,EAAG,CAAC,CAAC,EAEL,MAAgB,CACd,IAAM,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACpC,EAAI,aAAa,IAAI,mBAAmB,IAAM,SAGlD,EAAQ,MAAM,EACd,EAAc,EAAI,KAAK,MAAM,CAAC,CAAC,EAC/B,EAAS,EAAG,EAAI,EAClB,EAAG,CAAC,CAAQ,CAAC,EAEb,MAAgB,CACd,IAAM,EAAO,OAAO,SAAS,KAAK,MAAM,CAAC,EACzC,GAAI,CAAC,EAAK,WAAW,QAAQ,EAC3B,OAEF,GAAI,IAAS,UAAW,CACtB,SAAS,eAAe,CAAI,CAAC,EAAE,eAAe,CAAE,MAAO,QAAS,CAAC,EACjE,MACF,CACA,GAAI,CAAC,GAAc,GAAe,CAAC,EACjC,OAEF,IAAM,EAAS,SAAS,eAAe,CAAU,EAC7C,GACF,EAAO,eAAe,CAAE,MAAO,QAAS,CAAC,EACzC,EAAc,IAAI,GACT,EACT,EAAS,CAAU,EAEnB,EAAc,IAAI,CAEtB,EAAG,CACD,EAAO,OACP,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EAED,SAAS,GAAW,CAClB,EAAQ,MAAM,EACV,KAAc,IAGlB,EAAS,EAAG,EAAI,CAClB,CAEA,IAAM,EAAkB,EAAO,QAAU,CAAC,EACpC,EAAe,EAAgB,OAClC,GACC,IAAI,KAAK,EAAK,OAAO,CAAC,CAAC,QAAQ,GAAK,GACpC,IAAI,KAAK,EAAK,KAAK,CAAC,CAAC,QAAQ,EAAI,CACrC,EACM,EAAiB,EAAgB,OACpC,GAAS,IAAI,KAAK,EAAK,OAAO,CAAC,CAAC,QAAQ,EAAI,CAC/C,EAEA,OACE,EAAC,UAAD,CACE,YAAW,IAAS,OAAS,EAAc,EAAO,QAClD,aAAY,EACZ,UAAW,CAAC,4BAA6B,CAAS,CAAC,CAChD,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EACX,yBAAwB,EACxB,MAAO,EAAmB,CAAK,EAPjC,SAAA,CASG,EAAc,EAAC,KAAD,CAAA,SAAK,CAAU,CAAA,EAAI,KAClC,EAAC,MAAD,CAAK,aAAW,cAAc,UAAU,kCAAxC,SAAA,CACE,EAAC,SAAD,CACE,gBAAe,GAAG,EAAM,gBACxB,eAAc,IAAS,UACvB,UAAU,iCACV,GAAI,GAAG,EAAM,cACb,YAAe,EAAQ,SAAS,EAChC,KAAK,SACN,SAAA,iBAEO,CAAA,EACR,EAAC,SAAD,CACE,gBAAe,GAAG,EAAM,aACxB,eAAc,IAAS,OACvB,UAAU,iCACV,GAAI,GAAG,EAAM,WACb,QAAS,EACT,KAAK,SACN,SAAA,aAEO,CAAA,CACL,IACL,EAAC,UAAD,CACE,kBAAiB,GAAG,EAAM,cAC1B,OAAQ,IAAS,UACjB,GAAI,GAAG,EAAM,gBAHf,SAAA,CAKG,EAAO,SAAW,CAAC,EAAO,OACzB,EAAC,IAAD,CAAG,KAAK,SAAS,SAAA,iBAAkB,CAAA,EACjC,KACH,EAAO,MACN,EAAC,MAAD,CAAK,KAAK,QAAV,SAAA,CACE,EAAC,IAAD,CAAA,SAAI,EAAO,MAAM,OAAW,CAAA,EAC5B,EAAC,SAAD,CAAQ,QAAS,EAAO,QAAS,KAAK,SAAS,SAAA,WAEvC,CAAA,CACL,CACH,CAAA,EAAA,KACH,EAAO,QACR,EAAa,SAAW,GACxB,EAAe,SAAW,EACxB,EAAC,IAAD,CAAG,UAAU,mCAAoC,SAAA,CAAgB,CAAA,EAC/D,KACH,EAAa,OAAS,EACrB,EAAC,MAAD,CAAK,UAAU,mCACb,SAAA,EAAC,KAAD,CAAI,UAAU,kCACX,SAAA,EAAa,IAAK,GACjB,EAAC,EAAD,CACE,OAAA,GACM,OAEI,UACX,EAFM,EAAK,EAEX,CACF,CACC,CAAA,CACD,CAAA,EACH,KACH,EAAe,OAAS,EACvB,EAAC,MAAD,CAAK,UAAU,mCAAf,SAAA,CACE,EAAC,KAAD,CAAI,UAAU,yCAAyC,SAAA,UAAY,CAAA,EACnE,EAAC,KAAD,CAAI,UAAU,kCACX,SAAA,EAAe,IAAK,GACnB,EAAC,EAAD,CACE,OAAQ,GACF,OAEI,UACX,EAFM,EAAK,EAEX,CACF,CACC,CAAA,CACD,CACH,CAAA,EAAA,IACG,IACT,EAAC,UAAD,CACE,kBAAiB,GAAG,EAAM,WAC1B,OAAQ,IAAS,OACjB,GAAI,GAAG,EAAM,aAHf,SAAA,CAKG,EACC,EAAC,MAAD,CAAK,KAAK,QAAV,SAAA,CACE,EAAC,IAAD,CAAA,SAAI,CAAa,CAAA,EACjB,EAAC,SAAD,CACE,YAAe,EAAS,EAAa,EAAa,EAAG,CAAC,CAAU,EAChE,KAAK,SACN,SAAA,WAEO,CAAA,CACL,CACH,CAAA,EAAA,KACH,GAAe,CAAC,EACf,EAAC,IAAD,CAAG,KAAK,SAAS,SAAA,sBAAuB,CAAA,EACtC,KACH,GAAc,EAAW,SAAW,EACnC,EAAC,IAAD,CAAG,UAAU,mCAAmC,SAAA,qBAE7C,CAAA,EACD,KACH,EAAW,OAAS,EACnB,EAAC,KAAD,CAAI,UAAU,kCACX,SAAA,EAAW,IAAK,GACf,EAAC,EAAD,CACE,OAAQ,GACF,OAEN,KAAA,GACU,UACX,EAHM,EAAK,EAGX,CACF,CACC,CAAA,EACF,KACH,EACC,EAAC,SAAD,CACE,UAAU,uCACV,SAAU,EACV,YAAe,EAAS,CAAU,EAClC,KAAK,SAEJ,SAAA,EAAc,WAAa,uBACtB,CAAA,EACN,IACG,GACF,GAEb,CC/eA,SAAgB,EACd,EACkC,CAClC,EAA6B,gBAAiB,CAC5C,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,KAAM,EACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAAoC,CAClC,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAExB,CAAE,MAAO,KAAM,OAAQ,KAAM,QAAS,EAAK,CAAC,EAE9C,MAAgB,CACd,IAAI,EAAS,GAab,OAZA,EAAO,KAAK,CAAC,CAAC,KACX,GAAW,CACN,GACF,EAAS,CAAE,MAAO,KAAM,SAAQ,QAAS,EAAM,CAAC,CAEpD,EACC,GAA+B,CAC1B,GACF,EAAU,IAAa,CAAE,GAAG,EAAS,QAAO,QAAS,EAAM,EAAE,CAEjE,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EAErB,IAAM,EAAU,MAAkB,CAChC,EAAU,IAAa,CAAE,GAAG,EAAS,MAAO,KAAM,QAAS,EAAK,EAAE,EAClE,EAAa,GAAY,EAAU,CAAC,CACtC,EAAG,CAAC,CAAC,EAEL,MAAO,CAAE,GAAG,EAAO,SAAQ,SAAQ,CACrC"}
1
+ {"version":3,"file":"public-events.js","names":[],"sources":["../src/lockerverse-public-events.tsx","../src/use-lockerverse-public-events.ts"],"sourcesContent":["import type { LockerversePublicEvent } from \"@lockerverse/sdk/public-events\";\nimport {\n CalendarDays,\n CalendarX2,\n Copy,\n Facebook,\n Mail,\n Share2,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { getAccentContrast } from \"./accent-contrast.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport type { UseLockerversePublicEventsResult } from \"./use-lockerverse-public-events.ts\";\n\nexport type LockerversePublicEventsProps = {\n events: UseLockerversePublicEventsResult;\n /** The visible heading. Defaults to Events. */\n title?: string;\n showHeading?: boolean;\n emptyMessage?: string;\n /** Used to show dates and times. Defaults to America/New_York. */\n timeZone?: string;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n};\n\nfunction formatDate(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone,\n year: \"numeric\",\n }).format(new Date(value));\n}\n\nfunction formatTime(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n timeZoneName: \"short\",\n }).format(new Date(value));\n}\n\nfunction getLink(value: string | null) {\n if (!value) {\n return null;\n }\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\"\n ? url.toString()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getShareUrl(item: LockerversePublicEvent, past: boolean) {\n const link = getLink(item.link);\n if (link) {\n return link;\n }\n const url = new URL(window.location.href);\n if (past) {\n url.searchParams.set(\"lockerverseEvents\", \"past\");\n } else {\n url.searchParams.delete(\"lockerverseEvents\");\n }\n url.searchParams.delete(\"lockerverseEventOffset\");\n url.hash = `event-${item.id}`;\n return url.toString();\n}\n\nfunction withAccentContrast(style?: LockerverseStyle) {\n const accent = style?.[\"--lockerverse-accent\"];\n if (!accent || style?.[\"--lockerverse-accent-contrast\"] !== undefined) {\n return style;\n }\n const contrast = getAccentContrast(accent);\n return contrast\n ? { ...style, \"--lockerverse-accent-contrast\": contrast }\n : style;\n}\n\nfunction copyWithExecCommand(value: string) {\n const input = document.createElement(\"textarea\");\n input.value = value;\n input.setAttribute(\"readonly\", \"\");\n input.style.position = \"fixed\";\n input.style.opacity = \"0\";\n document.body.appendChild(input);\n try {\n input.select();\n return document.execCommand(\"copy\");\n } catch {\n return false;\n } finally {\n input.remove();\n }\n}\n\nfunction EventActions({\n item,\n past,\n}: {\n item: LockerversePublicEvent;\n past: boolean;\n}) {\n const [copied, setCopied] = useState(false);\n const [manualShareUrl, setManualShareUrl] = useState<string | null>(null);\n const [shareUrl, setShareUrl] = useState<string | null>(null);\n const [shareMenuAbove, setShareMenuAbove] = useState(false);\n const shareActionsRef = useRef<HTMLDivElement>(null);\n const shareTriggerRef = useRef<HTMLButtonElement>(null);\n const link = getLink(item.link);\n const isWithinShareActions = (target: EventTarget | null) =>\n target instanceof Node && shareActionsRef.current?.contains(target);\n\n useEffect(() => {\n if (!shareUrl) {\n return;\n }\n const closeOnOutsideClick = (event: PointerEvent) => {\n if (!isWithinShareActions(event.target)) {\n setShareUrl(null);\n }\n };\n const closeOnEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setShareUrl(null);\n if (shareActionsRef.current?.contains(document.activeElement)) {\n shareTriggerRef.current?.focus();\n }\n }\n };\n const closeOnFocusOutside = (event: FocusEvent) => {\n if (!isWithinShareActions(event.target)) {\n setShareUrl(null);\n }\n };\n document.addEventListener(\"pointerdown\", closeOnOutsideClick);\n document.addEventListener(\"keydown\", closeOnEscape);\n document.addEventListener(\"focusin\", closeOnFocusOutside);\n return () => {\n document.removeEventListener(\"pointerdown\", closeOnOutsideClick);\n document.removeEventListener(\"keydown\", closeOnEscape);\n document.removeEventListener(\"focusin\", closeOnFocusOutside);\n };\n }, [shareUrl]);\n\n async function copyEventLink() {\n if (!shareUrl) {\n return;\n }\n try {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n setShareUrl(null);\n shareTriggerRef.current?.focus();\n } catch {\n if (copyWithExecCommand(shareUrl)) {\n setCopied(true);\n setShareUrl(null);\n shareTriggerRef.current?.focus();\n } else {\n setManualShareUrl(shareUrl);\n }\n }\n }\n\n return (\n <div className=\"lockerverse-public-events__actions\" ref={shareActionsRef}>\n {link ? (\n <a\n className=\"lockerverse-public-events__link\"\n href={link}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n View event <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n <button\n aria-expanded={shareUrl !== null}\n aria-label={`Share ${item.name}`}\n className=\"lockerverse-public-events__share\"\n onClick={() => {\n if (!shareUrl && shareTriggerRef.current) {\n setShareMenuAbove(\n window.innerHeight -\n shareTriggerRef.current.getBoundingClientRect().bottom <\n 72\n );\n }\n setShareUrl(shareUrl ? null : getShareUrl(item, past));\n setCopied(false);\n setManualShareUrl(null);\n }}\n ref={shareTriggerRef}\n title={`Share ${item.name}`}\n type=\"button\"\n >\n <Share2 aria-hidden=\"true\" size={16} strokeWidth={1.8} />\n </button>\n {copied ? (\n <span className=\"lockerverse-public-events__copied\" role=\"status\">\n Link copied\n </span>\n ) : null}\n {shareUrl ? (\n <fieldset\n className=\"lockerverse-public-events__share-menu\"\n data-above={shareMenuAbove}\n >\n <legend className=\"lockerverse-public-events__visually-hidden\">\n Share {item.name}\n </legend>\n <button\n aria-label=\"Copy event link\"\n onClick={copyEventLink}\n title=\"Copy link\"\n type=\"button\"\n >\n <Copy aria-hidden=\"true\" size={18} />\n </button>\n <a\n aria-label=\"Share by email\"\n href={`mailto:?subject=${encodeURIComponent(item.name)}&body=${encodeURIComponent(shareUrl)}`}\n title=\"Email\"\n >\n <Mail aria-hidden=\"true\" size={18} />\n </a>\n <a\n aria-label=\"Share on Facebook\"\n href={`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(shareUrl)}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n title=\"Facebook\"\n >\n <Facebook aria-hidden=\"true\" size={18} />\n </a>\n <a\n aria-label=\"Share on X\"\n href={`https://twitter.com/intent/tweet?url=${encodeURIComponent(shareUrl)}&text=${encodeURIComponent(item.name)}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n title=\"X\"\n >\n <span>𝕏</span>\n </a>\n {manualShareUrl ? (\n <label className=\"lockerverse-public-events__copy-link\">\n Select and copy this event link\n <input\n autoFocus\n onFocus={(event) => event.currentTarget.select()}\n readOnly\n value={manualShareUrl}\n />\n </label>\n ) : null}\n </fieldset>\n ) : null}\n </div>\n );\n}\n\nfunction PublicEventRow({\n item,\n timeZone,\n active,\n past = false,\n}: {\n item: LockerversePublicEvent;\n timeZone: string;\n active: boolean;\n past?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const start = new Date(item.startAt);\n const month = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone,\n }).format(start);\n const day = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n timeZone,\n }).format(start);\n const year = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n }).format(start);\n const startDateLabel = formatDate(item.startAt, timeZone);\n const sameDay = startDateLabel === formatDate(item.endAt, timeZone);\n const endLabel = sameDay\n ? formatTime(item.endAt, timeZone)\n : `${formatDate(item.endAt, timeZone)} at ${formatTime(item.endAt, timeZone)}`;\n const imageUrl = getLink(item.imageUrl);\n const canExpand = (item.description?.length ?? 0) > 130;\n\n return (\n <li className=\"lockerverse-public-events__item\" id={`event-${item.id}`}>\n <article className=\"lockerverse-public-events__row\">\n {imageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-public-events__image\"\n height={124}\n loading=\"lazy\"\n src={imageUrl}\n width={154}\n />\n ) : (\n <time\n className=\"lockerverse-public-events__date\"\n dateTime={item.startAt}\n >\n <span className=\"lockerverse-public-events__month\">{month}</span>\n <span className=\"lockerverse-public-events__day\">{day}</span>\n <span className=\"lockerverse-public-events__year\">{year}</span>\n </time>\n )}\n <div className=\"lockerverse-public-events__content\">\n <div className=\"lockerverse-public-events__meta\">\n {imageUrl ? (\n <time dateTime={item.startAt}>{startDateLabel}</time>\n ) : null}\n <span className=\"lockerverse-public-events__time\">\n <time dateTime={item.startAt}>\n {formatTime(item.startAt, timeZone)}\n </time>\n <span aria-hidden=\"true\"> – </span>\n <time dateTime={item.endAt}>{endLabel}</time>\n </span>\n {active ? (\n <span className=\"lockerverse-public-events__live\">Live now</span>\n ) : null}\n </div>\n <h4>{item.name}</h4>\n {item.location ? (\n <p className=\"lockerverse-public-events__place\">{item.location}</p>\n ) : null}\n {item.description ? (\n <>\n <p\n className={[\n \"lockerverse-public-events__description\",\n canExpand && !expanded\n ? \"lockerverse-public-events__description--clamped\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.description}\n </p>\n {canExpand ? (\n <button\n aria-expanded={expanded}\n className=\"lockerverse-public-events__more\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </>\n ) : null}\n </div>\n <EventActions item={item} past={past} />\n </article>\n </li>\n );\n}\n\n/** Optional public list that can be embedded in any React site. */\nexport function LockerversePublicEvents({\n events,\n title = \"Events\",\n showHeading = true,\n emptyMessage = \"No events yet.\",\n timeZone = \"America/New_York\",\n theme = \"dark\",\n style,\n className,\n}: LockerversePublicEventsProps) {\n const [now, setNow] = useState(() => Date.now());\n const [view, setView] = useState<\"current\" | \"past\">(\"current\");\n const [pastEvents, setPastEvents] = useState<LockerversePublicEvent[]>([]);\n const [pastOffset, setPastOffset] = useState(0);\n const [pastHasMore, setPastHasMore] = useState(false);\n const [pastLoaded, setPastLoaded] = useState(false);\n const [pastLoading, setPastLoading] = useState(false);\n const [pastError, setPastError] = useState<string | null>(null);\n const [pastTarget, setPastTarget] = useState<string | null>(null);\n const tabId = useId();\n\n const loadPast = useCallback(\n async (offset: number, reset = false) => {\n setPastLoading(true);\n setPastError(null);\n try {\n const page = await events.client.listPast({ offset });\n setPastEvents((current) =>\n reset ? page.events : [...current, ...page.events]\n );\n setPastOffset(offset + page.events.length);\n setPastHasMore(page.hasMore);\n setPastLoaded(true);\n } catch (error) {\n setPastError(\n error instanceof Error ? error.message : \"Unable to load past events.\"\n );\n } finally {\n setPastLoading(false);\n }\n },\n [events.client]\n );\n\n useEffect(() => {\n const interval = window.setInterval(() => setNow(Date.now()), 60_000);\n return () => window.clearInterval(interval);\n }, []);\n\n useEffect(() => {\n const url = new URL(window.location.href);\n if (url.searchParams.get(\"lockerverseEvents\") !== \"past\") {\n return;\n }\n setView(\"past\");\n setPastTarget(url.hash.slice(1));\n loadPast(0, true);\n }, [loadPast]);\n\n useEffect(() => {\n const hash = window.location.hash.slice(1);\n if (!hash.startsWith(\"event-\")) {\n return;\n }\n if (view === \"current\") {\n document.getElementById(hash)?.scrollIntoView({ block: \"center\" });\n return;\n }\n if (!pastTarget || pastLoading || !pastLoaded) {\n return;\n }\n const target = document.getElementById(pastTarget);\n if (target) {\n target.scrollIntoView({ block: \"center\" });\n setPastTarget(null);\n } else if (pastHasMore) {\n loadPast(pastOffset);\n } else {\n setPastTarget(null);\n }\n }, [\n events.events,\n loadPast,\n pastHasMore,\n pastLoaded,\n pastLoading,\n pastOffset,\n pastTarget,\n view,\n ]);\n\n function openPast() {\n setView(\"past\");\n if (pastLoaded || pastLoading) {\n return;\n }\n loadPast(0, true);\n }\n\n const availableEvents = events.events || [];\n const activeEvents = availableEvents.filter(\n (item) =>\n new Date(item.startAt).getTime() <= now &&\n new Date(item.endAt).getTime() > now\n );\n const upcomingEvents = availableEvents.filter(\n (item) => new Date(item.startAt).getTime() > now\n );\n\n return (\n <section\n aria-busy={view === \"past\" ? pastLoading : events.loading}\n aria-label={title}\n className={[\"lockerverse-public-events\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={withAccentContrast(style)}\n >\n <div className=\"lockerverse-public-events__layout\">\n {showHeading ? <h2>{title}</h2> : null}\n <nav\n aria-label=\"Event views\"\n className=\"lockerverse-public-events__tabs\"\n >\n <button\n aria-controls={`${tabId}-current-panel`}\n aria-pressed={view === \"current\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-current-tab`}\n onClick={() => setView(\"current\")}\n type=\"button\"\n >\n <CalendarDays aria-hidden=\"true\" size={18} />\n Upcoming Events\n </button>\n <button\n aria-controls={`${tabId}-past-panel`}\n aria-pressed={view === \"past\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-past-tab`}\n onClick={openPast}\n type=\"button\"\n >\n <CalendarX2 aria-hidden=\"true\" size={18} />\n Past Events\n </button>\n </nav>\n <section\n aria-labelledby={`${tabId}-current-tab`}\n hidden={view !== \"current\"}\n id={`${tabId}-current-panel`}\n >\n {events.loading && !events.events ? (\n <p role=\"status\">Loading events…</p>\n ) : null}\n {events.error ? (\n <div role=\"alert\">\n <p>{events.error.message}</p>\n <button onClick={events.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {events.events &&\n activeEvents.length === 0 &&\n upcomingEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">{emptyMessage}</p>\n ) : null}\n {activeEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <ol className=\"lockerverse-public-events__list\">\n {activeEvents.map((item) => (\n <PublicEventRow\n active\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n {upcomingEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <ol className=\"lockerverse-public-events__list\">\n {upcomingEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n </section>\n <section\n aria-labelledby={`${tabId}-past-tab`}\n hidden={view !== \"past\"}\n id={`${tabId}-past-panel`}\n >\n {pastError ? (\n <div role=\"alert\">\n <p>{pastError}</p>\n <button\n onClick={() =>\n loadPast(pastLoaded ? pastOffset : 0, !pastLoaded)\n }\n type=\"button\"\n >\n Try again\n </button>\n </div>\n ) : null}\n {pastLoading && !pastLoaded ? (\n <p role=\"status\">Loading past events…</p>\n ) : null}\n {pastLoaded && pastEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">\n No past events yet.\n </p>\n ) : null}\n {pastEvents.length > 0 ? (\n <ol className=\"lockerverse-public-events__list\">\n {pastEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n past\n timeZone={timeZone}\n />\n ))}\n </ol>\n ) : null}\n {pastHasMore ? (\n <button\n className=\"lockerverse-public-events__load-more\"\n disabled={pastLoading}\n onClick={() => loadPast(pastOffset)}\n type=\"button\"\n >\n {pastLoading ? \"Loading…\" : \"Load more past events\"}\n </button>\n ) : null}\n </section>\n </div>\n </section>\n );\n}\n","import {\n type CreateLockerversePublicEventsOptions,\n createLockerversePublicEventsClient,\n type LockerversePublicEvent,\n type LockerversePublicEventsClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/public-events\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerversePublicEventsResult = {\n client: LockerversePublicEventsClient;\n events: LockerversePublicEvent[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load the public events list for one community. */\nexport function useLockerversePublicEvents(\n options: CreateLockerversePublicEventsOptions\n): UseLockerversePublicEventsResult {\n useImmutableResourceIdentity(\"public events\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerversePublicEventsClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerversePublicEventsResult, \"events\" | \"loading\" | \"error\">\n >({ error: null, events: null, loading: true });\n\n useEffect(() => {\n let active = true;\n client.list().then(\n (events) => {\n if (active) {\n setState({ error: null, events, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/react",
3
- "version": "0.2.117",
3
+ "version": "0.2.120-dev.1",
4
4
  "description": "Tree-shakable React payment and signup UI for Lockerverse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -117,7 +117,7 @@
117
117
  "embla-carousel-react": "8.6.0",
118
118
  "lucide-react": "0.536.0",
119
119
  "valibot": "1.4.2",
120
- "@lockerverse/sdk": "0.2.117"
120
+ "@lockerverse/sdk": "0.2.120-dev.1"
121
121
  },
122
122
  "devDependencies": {
123
123
  "@size-limit/file": "13.0.3",