sunpeak 0.5.36 → 0.5.39

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.
@@ -2,11 +2,11 @@ import {
2
2
  Button,
3
3
  ButtonLink,
4
4
  CopyButton
5
- } from "./chunk-675LFNY2.js";
6
- import "./chunk-QPJAV452.js";
7
- import "./chunk-XB525PXG.js";
5
+ } from "./chunk-EVJ3DVH5.js";
8
6
  import "./chunk-YOJ6QPGS.js";
9
7
  import "./chunk-BAG6OO6S.js";
8
+ import "./chunk-XB525PXG.js";
9
+ import "./chunk-QPJAV452.js";
10
10
  import "./chunk-EGRHWZRV.js";
11
11
  import "./chunk-CNYJBM5F.js";
12
12
  import "./chunk-PTVT3RFX.js";
@@ -1,7 +1,3 @@
1
- import {
2
- dist_exports4 as dist_exports
3
- } from "./chunk-SGWD4VEU.js";
4
- import "./chunk-KFGKZMLK.js";
5
1
  import {
6
2
  useResizeObserver
7
3
  } from "./chunk-YOJ6QPGS.js";
@@ -9,6 +5,10 @@ import {
9
5
  handlePressableMouseEnter,
10
6
  waitForAnimationFrame
11
7
  } from "./chunk-BAG6OO6S.js";
8
+ import {
9
+ dist_exports4 as dist_exports
10
+ } from "./chunk-SGWD4VEU.js";
11
+ import "./chunk-KFGKZMLK.js";
12
12
  import "./chunk-EGRHWZRV.js";
13
13
  import {
14
14
  clsx_default
@@ -1,14 +1,23 @@
1
- import {
2
- Input
3
- } from "./chunk-CQ3GYAYB.js";
4
1
  import {
5
2
  Button,
6
3
  LoadingIndicator,
7
4
  TransitionGroup
8
- } from "./chunk-675LFNY2.js";
5
+ } from "./chunk-EVJ3DVH5.js";
9
6
  import {
10
- o
11
- } from "./chunk-QPJAV452.js";
7
+ useTimeout
8
+ } from "./chunk-YOJ6QPGS.js";
9
+ import {
10
+ handlePressableMouseEnter,
11
+ preventDefaultHandler,
12
+ toCssVariables,
13
+ waitForAnimationFrame
14
+ } from "./chunk-BAG6OO6S.js";
15
+ import {
16
+ dist_exports,
17
+ dist_exports3 as dist_exports2,
18
+ dist_exports5 as dist_exports3
19
+ } from "./chunk-SGWD4VEU.js";
20
+ import "./chunk-KFGKZMLK.js";
12
21
  import {
13
22
  Check_default,
14
23
  ChevronDownVector_default,
@@ -18,20 +27,11 @@ import {
18
27
  X_default
19
28
  } from "./chunk-XB525PXG.js";
20
29
  import {
21
- dist_exports,
22
- dist_exports3 as dist_exports2,
23
- dist_exports5 as dist_exports3
24
- } from "./chunk-SGWD4VEU.js";
25
- import "./chunk-KFGKZMLK.js";
26
- import {
27
- useTimeout
28
- } from "./chunk-YOJ6QPGS.js";
30
+ Input
31
+ } from "./chunk-CQ3GYAYB.js";
29
32
  import {
30
- handlePressableMouseEnter,
31
- preventDefaultHandler,
32
- toCssVariables,
33
- waitForAnimationFrame
34
- } from "./chunk-BAG6OO6S.js";
33
+ o
34
+ } from "./chunk-QPJAV452.js";
35
35
  import "./chunk-EGRHWZRV.js";
36
36
  import {
37
37
  clsx_default
@@ -1,9 +1,9 @@
1
- import {
2
- o
3
- } from "./chunk-QPJAV452.js";
4
1
  import {
5
2
  toCssVariables
6
3
  } from "./chunk-BAG6OO6S.js";
4
+ import {
5
+ o
6
+ } from "./chunk-QPJAV452.js";
7
7
  import "./chunk-EGRHWZRV.js";
8
8
  import {
9
9
  clsx_default
@@ -7,118 +7,115 @@
7
7
  "react": {
8
8
  "src": "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react/index.js",
9
9
  "file": "react.js",
10
- "fileHash": "e328b168",
10
+ "fileHash": "1fcc4295",
11
11
  "needsInterop": true
12
12
  },
13
13
  "react-dom": {
14
14
  "src": "../../../../node_modules/.pnpm/react-dom@19.2.0_react@19.2.0/node_modules/react-dom/index.js",
15
15
  "file": "react-dom.js",
16
- "fileHash": "24da7214",
16
+ "fileHash": "a3591f16",
17
17
  "needsInterop": true
18
18
  },
19
19
  "react/jsx-dev-runtime": {
20
20
  "src": "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react/jsx-dev-runtime.js",
21
21
  "file": "react_jsx-dev-runtime.js",
22
- "fileHash": "a22ed365",
22
+ "fileHash": "94686c0a",
23
23
  "needsInterop": true
24
24
  },
25
25
  "react/jsx-runtime": {
26
26
  "src": "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react/jsx-runtime.js",
27
27
  "file": "react_jsx-runtime.js",
28
- "fileHash": "995b8d9a",
28
+ "fileHash": "1e5db247",
29
29
  "needsInterop": true
30
30
  },
31
31
  "@openai/apps-sdk-ui/components/Button": {
32
32
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/Button/index.js",
33
33
  "file": "@openai_apps-sdk-ui_components_Button.js",
34
- "fileHash": "46265110",
34
+ "fileHash": "d6d133fa",
35
35
  "needsInterop": false
36
36
  },
37
37
  "@openai/apps-sdk-ui/components/Checkbox": {
38
38
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/Checkbox/index.js",
39
39
  "file": "@openai_apps-sdk-ui_components_Checkbox.js",
40
- "fileHash": "df3f5c67",
40
+ "fileHash": "ce84b869",
41
41
  "needsInterop": false
42
42
  },
43
43
  "@openai/apps-sdk-ui/components/Icon": {
44
44
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/Icon/index.js",
45
45
  "file": "@openai_apps-sdk-ui_components_Icon.js",
46
- "fileHash": "baa257c2",
46
+ "fileHash": "060967f2",
47
47
  "needsInterop": false
48
48
  },
49
49
  "@openai/apps-sdk-ui/components/Input": {
50
50
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/Input/index.js",
51
51
  "file": "@openai_apps-sdk-ui_components_Input.js",
52
- "fileHash": "b09a0706",
52
+ "fileHash": "a6e2b3d5",
53
53
  "needsInterop": false
54
54
  },
55
55
  "@openai/apps-sdk-ui/components/SegmentedControl": {
56
56
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/SegmentedControl/index.js",
57
57
  "file": "@openai_apps-sdk-ui_components_SegmentedControl.js",
58
- "fileHash": "30f3b4fa",
58
+ "fileHash": "a5b2ba7d",
59
59
  "needsInterop": false
60
60
  },
61
61
  "@openai/apps-sdk-ui/components/Select": {
62
62
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/Select/index.js",
63
63
  "file": "@openai_apps-sdk-ui_components_Select.js",
64
- "fileHash": "c07720fa",
64
+ "fileHash": "681ae142",
65
65
  "needsInterop": false
66
66
  },
67
67
  "@openai/apps-sdk-ui/components/Textarea": {
68
68
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/components/Textarea/index.js",
69
69
  "file": "@openai_apps-sdk-ui_components_Textarea.js",
70
- "fileHash": "4d8a8d87",
70
+ "fileHash": "8085e72e",
71
71
  "needsInterop": false
72
72
  },
73
73
  "@openai/apps-sdk-ui/theme": {
74
74
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.0_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._60630c8dcc43ec213b3e346c9e26579b/node_modules/@openai/apps-sdk-ui/dist/es/lib/theme.js",
75
75
  "file": "@openai_apps-sdk-ui_theme.js",
76
- "fileHash": "9e5b445c",
76
+ "fileHash": "dcd36bbb",
77
77
  "needsInterop": false
78
78
  },
79
79
  "clsx": {
80
80
  "src": "../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs",
81
81
  "file": "clsx.js",
82
- "fileHash": "8c4d2ac1",
82
+ "fileHash": "a4d88c05",
83
83
  "needsInterop": false
84
84
  },
85
85
  "embla-carousel-react": {
86
86
  "src": "../../../../node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.0/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.js",
87
87
  "file": "embla-carousel-react.js",
88
- "fileHash": "3b8004d6",
88
+ "fileHash": "1c3b430c",
89
89
  "needsInterop": false
90
90
  },
91
91
  "embla-carousel-wheel-gestures": {
92
92
  "src": "../../../../node_modules/.pnpm/embla-carousel-wheel-gestures@8.1.0_embla-carousel@8.6.0/node_modules/embla-carousel-wheel-gestures/dist/embla-carousel-wheel-gestures.esm.js",
93
93
  "file": "embla-carousel-wheel-gestures.js",
94
- "fileHash": "8678cd8b",
94
+ "fileHash": "b4318164",
95
95
  "needsInterop": false
96
96
  },
97
97
  "react-dom/client": {
98
98
  "src": "../../../../node_modules/.pnpm/react-dom@19.2.0_react@19.2.0/node_modules/react-dom/client.js",
99
99
  "file": "react-dom_client.js",
100
- "fileHash": "df32aaf4",
100
+ "fileHash": "e6bdfdfa",
101
101
  "needsInterop": true
102
102
  },
103
103
  "tailwind-merge": {
104
104
  "src": "../../../../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs",
105
105
  "file": "tailwind-merge.js",
106
- "fileHash": "11ec8e32",
106
+ "fileHash": "4eb4287f",
107
107
  "needsInterop": false
108
108
  }
109
109
  },
110
110
  "chunks": {
111
- "chunk-CQ3GYAYB": {
112
- "file": "chunk-CQ3GYAYB.js"
113
- },
114
- "chunk-675LFNY2": {
115
- "file": "chunk-675LFNY2.js"
111
+ "chunk-EVJ3DVH5": {
112
+ "file": "chunk-EVJ3DVH5.js"
116
113
  },
117
- "chunk-QPJAV452": {
118
- "file": "chunk-QPJAV452.js"
114
+ "chunk-YOJ6QPGS": {
115
+ "file": "chunk-YOJ6QPGS.js"
119
116
  },
120
- "chunk-XB525PXG": {
121
- "file": "chunk-XB525PXG.js"
117
+ "chunk-BAG6OO6S": {
118
+ "file": "chunk-BAG6OO6S.js"
122
119
  },
123
120
  "chunk-SGWD4VEU": {
124
121
  "file": "chunk-SGWD4VEU.js"
@@ -126,11 +123,14 @@
126
123
  "chunk-KFGKZMLK": {
127
124
  "file": "chunk-KFGKZMLK.js"
128
125
  },
129
- "chunk-YOJ6QPGS": {
130
- "file": "chunk-YOJ6QPGS.js"
126
+ "chunk-XB525PXG": {
127
+ "file": "chunk-XB525PXG.js"
131
128
  },
132
- "chunk-BAG6OO6S": {
133
- "file": "chunk-BAG6OO6S.js"
129
+ "chunk-CQ3GYAYB": {
130
+ "file": "chunk-CQ3GYAYB.js"
131
+ },
132
+ "chunk-QPJAV452": {
133
+ "file": "chunk-QPJAV452.js"
134
134
  },
135
135
  "chunk-EGRHWZRV": {
136
136
  "file": "chunk-EGRHWZRV.js"
@@ -1,10 +1,3 @@
1
- import {
2
- o
3
- } from "./chunk-QPJAV452.js";
4
- import {
5
- Check_default,
6
- Copy_default
7
- } from "./chunk-XB525PXG.js";
8
1
  import {
9
2
  useTimeout
10
3
  } from "./chunk-YOJ6QPGS.js";
@@ -19,6 +12,13 @@ import {
19
12
  toTransformProperty,
20
13
  waitForAnimationFrame
21
14
  } from "./chunk-BAG6OO6S.js";
15
+ import {
16
+ Check_default,
17
+ Copy_default
18
+ } from "./chunk-XB525PXG.js";
19
+ import {
20
+ o
21
+ } from "./chunk-QPJAV452.js";
22
22
  import {
23
23
  clsx_default
24
24
  } from "./chunk-CNYJBM5F.js";
@@ -625,4 +625,4 @@ export {
625
625
  ButtonLink,
626
626
  CopyButton
627
627
  };
628
- //# sourceMappingURL=chunk-675LFNY2.js.map
628
+ //# sourceMappingURL=chunk-EVJ3DVH5.js.map
@@ -1 +1 @@
1
- {"version":"4.0.13","results":[[":src/components/resources/carousel-resource.test.tsx",{"duration":288.1622299999999,"failed":false}],[":src/components/album/albums.test.tsx",{"duration":326.12392699999987,"failed":false}],[":src/components/album/fullscreen-viewer.test.tsx",{"duration":260.0158970000002,"failed":false}],[":src/components/carousel/carousel.test.tsx",{"duration":69.38757799999985,"failed":false}],[":src/components/resources/counter-resource.test.tsx",{"duration":335.9426239999998,"failed":false}],[":src/components/resources/albums-resource.test.tsx",{"duration":287.460425,"failed":false}],[":src/components/album/film-strip.test.tsx",{"duration":444.058082,"failed":false}],[":src/components/album/album-card.test.tsx",{"duration":340.6524770000001,"failed":false}],[":src/components/card/card.test.tsx",{"duration":59.76885399999992,"failed":false}]]}
1
+ {"version":"4.0.13","results":[[":src/components/album/fullscreen-viewer.test.tsx",{"duration":258.46369799999957,"failed":false}],[":src/components/resources/carousel-resource.test.tsx",{"duration":245.01015499999994,"failed":false}],[":src/components/album/albums.test.tsx",{"duration":330.82841299999995,"failed":false}],[":src/components/carousel/carousel.test.tsx",{"duration":62.86271500000021,"failed":false}],[":src/components/resources/counter-resource.test.tsx",{"duration":310.1445560000002,"failed":false}],[":src/components/resources/albums-resource.test.tsx",{"duration":264.3613190000001,"failed":false}],[":src/components/album/film-strip.test.tsx",{"duration":469.90154299999995,"failed":false}],[":src/components/album/album-card.test.tsx",{"duration":360.1429190000001,"failed":false}],[":src/components/card/card.test.tsx",{"duration":55.29722700000002,"failed":false}]]}
@@ -14,41 +14,103 @@ export const FullscreenViewer = React.forwardRef<HTMLDivElement, FullscreenViewe
14
14
  const maxHeight = useMaxHeight();
15
15
  const safeArea = useSafeArea();
16
16
  const [selectedIndex, setSelectedIndex] = React.useState(0);
17
+ const [width, setWidth] = React.useState(0);
18
+ const containerRef = React.useRef<HTMLDivElement>(null);
17
19
 
18
20
  React.useEffect(() => {
19
21
  setSelectedIndex(0);
20
22
  }, [album?.id]);
21
23
 
24
+ // Measure component width to determine mobile vs desktop layout
25
+ React.useEffect(() => {
26
+ const element = containerRef.current;
27
+ if (!element) return;
28
+
29
+ const updateWidth = () => {
30
+ setWidth(element.getBoundingClientRect().width);
31
+ };
32
+
33
+ updateWidth();
34
+
35
+ const resizeObserver = new ResizeObserver(updateWidth);
36
+ resizeObserver.observe(element);
37
+
38
+ return () => {
39
+ resizeObserver.disconnect();
40
+ };
41
+ }, []);
42
+
43
+ // Combine refs
44
+ React.useImperativeHandle(ref, () => containerRef.current!);
45
+
22
46
  const selectedPhoto = album?.photos?.[selectedIndex];
47
+ const isMobile = width > 0 && width < 768;
23
48
 
24
49
  return (
25
50
  <div
26
- ref={ref}
51
+ ref={containerRef}
27
52
  className={cn('relative w-full h-full bg-surface', className)}
28
53
  style={{
29
54
  maxHeight: maxHeight ?? undefined,
30
55
  height: maxHeight ?? undefined,
56
+ ['--safe-top' as string]: `${safeArea?.insets.top ?? 0}px`,
57
+ ['--safe-bottom' as string]: `${safeArea?.insets.bottom ?? 0}px`,
58
+ ['--safe-left' as string]: `${safeArea?.insets.left ?? 0}px`,
59
+ ['--safe-right' as string]: `${safeArea?.insets.right ?? 0}px`,
31
60
  }}
32
61
  >
33
- <div className="absolute inset-0 flex flex-row overflow-hidden">
34
- {/* Film strip */}
35
- <div
36
- className="hidden md:block absolute pointer-events-none z-10 left-0 top-0 bottom-0 w-40"
37
- style={{
38
- paddingLeft: `${safeArea?.insets.left ?? 0}px`,
39
- }}
40
- >
41
- <FilmStrip album={album} selectedIndex={selectedIndex} onSelect={setSelectedIndex} />
42
- </div>
62
+ <div
63
+ className={cn(
64
+ 'absolute inset-0 flex overflow-hidden',
65
+ isMobile ? 'flex-col' : 'flex-row'
66
+ )}
67
+ >
68
+ {/* Album header - mobile only */}
69
+ {isMobile && (
70
+ <div
71
+ className="z-10 border-b border-subtle bg-surface/95 backdrop-blur-sm"
72
+ style={{
73
+ paddingTop: `calc(0.75rem + var(--safe-top))`,
74
+ paddingBottom: '0.75rem',
75
+ paddingLeft: `calc(1rem + var(--safe-left))`,
76
+ paddingRight: `calc(1rem + var(--safe-right))`,
77
+ }}
78
+ >
79
+ <h2 className="text-base font-semibold text-primary">{album.title}</h2>
80
+ <p className="text-sm text-secondary">
81
+ {selectedIndex + 1} / {album.photos.length}
82
+ </p>
83
+ </div>
84
+ )}
85
+
86
+ {/* Film strip - desktop only */}
87
+ {!isMobile && (
88
+ <div
89
+ className="absolute pointer-events-none z-10 left-0 top-0 bottom-0 w-40"
90
+ style={{
91
+ paddingLeft: `var(--safe-left)`,
92
+ }}
93
+ >
94
+ <FilmStrip album={album} selectedIndex={selectedIndex} onSelect={setSelectedIndex} />
95
+ </div>
96
+ )}
43
97
 
44
98
  {/* Main photo */}
45
99
  <div
46
- className="flex-1 min-w-0 px-40 py-10 relative flex items-center justify-center"
100
+ className="flex-1 min-w-0 relative flex items-center justify-center"
47
101
  style={{
48
- paddingTop: `calc(2.5rem + ${safeArea?.insets.top ?? 0}px)`,
49
- paddingBottom: `calc(2.5rem + ${safeArea?.insets.bottom ?? 0}px)`,
50
- paddingLeft: `calc(10rem + ${safeArea?.insets.left ?? 0}px)`,
51
- paddingRight: `calc(10rem + ${safeArea?.insets.right ?? 0}px)`,
102
+ paddingTop: isMobile
103
+ ? `calc(1rem + var(--safe-top))`
104
+ : `calc(2.5rem + var(--safe-top))`,
105
+ paddingBottom: isMobile
106
+ ? `calc(1rem + var(--safe-bottom))`
107
+ : `calc(2.5rem + var(--safe-bottom))`,
108
+ paddingLeft: isMobile
109
+ ? `calc(1rem + var(--safe-left))`
110
+ : `calc(10rem + var(--safe-left))`,
111
+ paddingRight: isMobile
112
+ ? `calc(1rem + var(--safe-right))`
113
+ : `calc(10rem + var(--safe-right))`,
52
114
  }}
53
115
  >
54
116
  <div className="relative w-full h-full">