sunpeak 0.10.7 → 0.12.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.
Files changed (121) hide show
  1. package/README.md +117 -20
  2. package/bin/commands/build.mjs +1 -11
  3. package/bin/commands/deploy.mjs +7 -1
  4. package/bin/commands/dev.mjs +175 -12
  5. package/bin/commands/new.mjs +211 -0
  6. package/bin/commands/pull.mjs +1 -1
  7. package/bin/commands/push.mjs +36 -13
  8. package/bin/lib/patterns.mjs +25 -0
  9. package/bin/sunpeak.js +15 -232
  10. package/dist/chatgpt/index.cjs +1 -1
  11. package/dist/chatgpt/index.js +1 -1
  12. package/dist/index.cjs +1 -1
  13. package/dist/index.js +2 -2
  14. package/dist/mcp/entry.cjs +1 -1
  15. package/dist/mcp/entry.js +1 -1
  16. package/dist/mcp/favicon.d.ts +2 -0
  17. package/dist/mcp/index.cjs +3 -1
  18. package/dist/mcp/index.cjs.map +1 -1
  19. package/dist/mcp/index.d.ts +1 -0
  20. package/dist/mcp/index.js +3 -1
  21. package/dist/{server-BLKltt88.js → server-BI9Y531R.js} +31 -3
  22. package/dist/{server-BLKltt88.js.map → server-BI9Y531R.js.map} +1 -1
  23. package/dist/{server-D_oRdZjX.cjs → server-CcLDAGBE.cjs} +31 -3
  24. package/dist/{server-D_oRdZjX.cjs.map → server-CcLDAGBE.cjs.map} +1 -1
  25. package/dist/{simulator-url-B6DZi3vV.cjs → simulator-url-CYMOGoB1.cjs} +5 -5
  26. package/dist/{simulator-url-B6DZi3vV.cjs.map → simulator-url-CYMOGoB1.cjs.map} +1 -1
  27. package/dist/{simulator-url-izFV6mji.js → simulator-url-DG79-dU3.js} +4 -4
  28. package/dist/{simulator-url-izFV6mji.js.map → simulator-url-DG79-dU3.js.map} +1 -1
  29. package/package.json +1 -1
  30. package/template/.sunpeak/dev.tsx +4 -4
  31. package/template/README.md +25 -27
  32. package/template/_gitignore +4 -0
  33. package/template/dist/albums/albums.json +1 -1
  34. package/template/dist/carousel/carousel.json +1 -1
  35. package/template/dist/map/map.json +1 -1
  36. package/template/dist/review/review.json +1 -1
  37. package/template/index.html +0 -1
  38. package/template/node_modules/.vite/deps/_metadata.json +22 -22
  39. package/template/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  40. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Avatar.js +96 -0
  41. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Avatar.js.map +7 -0
  42. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Button.js +625 -0
  43. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Button.js.map +7 -0
  44. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Checkbox.js +33 -0
  45. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Checkbox.js.map +7 -0
  46. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Icon.js +1498 -0
  47. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Icon.js.map +7 -0
  48. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Input.js +13 -0
  49. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Input.js.map +7 -0
  50. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_SegmentedControl.js +103 -0
  51. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_SegmentedControl.js.map +7 -0
  52. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Select.js +3680 -0
  53. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Select.js.map +7 -0
  54. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Textarea.js +95 -0
  55. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_components_Textarea.js.map +7 -0
  56. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_theme.js +45 -0
  57. package/template/node_modules/.vite-mcp/deps_temp_992accd8/@openai_apps-sdk-ui_theme.js.map +7 -0
  58. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-2UDYPUBJ.js +15201 -0
  59. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-2UDYPUBJ.js.map +7 -0
  60. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-6QVG4F2X.js +93 -0
  61. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-6QVG4F2X.js.map +7 -0
  62. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-BUOVMFCD.js +1004 -0
  63. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-BUOVMFCD.js.map +7 -0
  64. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-CNYJBM5F.js +21 -0
  65. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-CNYJBM5F.js.map +7 -0
  66. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-EGRHWZRV.js +1 -0
  67. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-EGRHWZRV.js.map +7 -0
  68. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-ILHRZGIS.js +46 -0
  69. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-ILHRZGIS.js.map +7 -0
  70. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-JAGHY6H6.js +231 -0
  71. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-JAGHY6H6.js.map +7 -0
  72. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-JGVISENQ.js +292 -0
  73. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-JGVISENQ.js.map +7 -0
  74. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-P5LK4A7U.js +112 -0
  75. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-P5LK4A7U.js.map +7 -0
  76. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-QPJAV452.js +13 -0
  77. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-QPJAV452.js.map +7 -0
  78. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-RYYR2YMB.js +111 -0
  79. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-RYYR2YMB.js.map +7 -0
  80. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-UM3ZGDFR.js +4480 -0
  81. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-UM3ZGDFR.js.map +7 -0
  82. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-XZTIOEPG.js +280 -0
  83. package/template/node_modules/.vite-mcp/deps_temp_992accd8/chunk-XZTIOEPG.js.map +7 -0
  84. package/template/node_modules/.vite-mcp/deps_temp_992accd8/clsx.js +10 -0
  85. package/template/node_modules/.vite-mcp/deps_temp_992accd8/clsx.js.map +7 -0
  86. package/template/node_modules/.vite-mcp/deps_temp_992accd8/embla-carousel-react.js +1712 -0
  87. package/template/node_modules/.vite-mcp/deps_temp_992accd8/embla-carousel-react.js.map +7 -0
  88. package/template/node_modules/.vite-mcp/deps_temp_992accd8/embla-carousel-wheel-gestures.js +589 -0
  89. package/template/node_modules/.vite-mcp/deps_temp_992accd8/embla-carousel-wheel-gestures.js.map +7 -0
  90. package/template/node_modules/.vite-mcp/deps_temp_992accd8/mapbox-gl.js +32835 -0
  91. package/template/node_modules/.vite-mcp/deps_temp_992accd8/mapbox-gl.js.map +7 -0
  92. package/template/node_modules/.vite-mcp/deps_temp_992accd8/package.json +3 -0
  93. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react-dom.js +7 -0
  94. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react-dom.js.map +7 -0
  95. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react-dom_client.js +20217 -0
  96. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react-dom_client.js.map +7 -0
  97. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react.js +6 -0
  98. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react.js.map +7 -0
  99. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react_jsx-dev-runtime.js +278 -0
  100. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react_jsx-dev-runtime.js.map +7 -0
  101. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react_jsx-runtime.js +7 -0
  102. package/template/node_modules/.vite-mcp/deps_temp_992accd8/react_jsx-runtime.js.map +7 -0
  103. package/template/node_modules/.vite-mcp/deps_temp_992accd8/tailwind-merge.js +3095 -0
  104. package/template/node_modules/.vite-mcp/deps_temp_992accd8/tailwind-merge.js.map +7 -0
  105. package/template/package.json +0 -1
  106. package/template/vitest.config.ts +1 -1
  107. package/bin/commands/mcp.mjs +0 -244
  108. package/template/public/favicon.ico +0 -0
  109. package/template/src/resources/albums/albums-show-simulation.json +0 -131
  110. package/template/src/resources/carousel/carousel-show-simulation.json +0 -68
  111. package/template/src/resources/map/map-show-simulation.json +0 -123
  112. package/template/src/resources/review/review-diff-simulation.json +0 -80
  113. package/template/src/resources/review/review-post-simulation.json +0 -56
  114. package/template/src/resources/review/review-purchase-simulation.json +0 -88
  115. /package/template/{src/test → tests}/setup.ts +0 -0
  116. /package/template/{dist → tests/simulations}/albums/albums-show-simulation.json +0 -0
  117. /package/template/{dist → tests/simulations}/carousel/carousel-show-simulation.json +0 -0
  118. /package/template/{dist → tests/simulations}/map/map-show-simulation.json +0 -0
  119. /package/template/{dist → tests/simulations}/review/review-diff-simulation.json +0 -0
  120. /package/template/{dist → tests/simulations}/review/review-post-simulation.json +0 -0
  121. /package/template/{dist → tests/simulations}/review/review-purchase-simulation.json +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sunpeak",
3
- "version": "0.10.7",
3
+ "version": "0.12.1",
4
4
  "description": "The ChatGPT App framework. Quickstart, build, & test your ChatGPT App locally!",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -4,9 +4,9 @@
4
4
  * This file bootstraps the ChatGPT simulator for development
5
5
  *
6
6
  * Auto-discovers simulations and resources by file naming convention:
7
- * - resources/{resource}/{resource}-{scenario}-simulation.json (e.g., resources/albums/albums-show-simulation.json)
8
- * - resources/{resource}/{resource}-resource.json
9
- * - resources/{resource}/{Resource}Resource component (PascalCase)
7
+ * - tests/simulations/{resource}/{resource}-{scenario}-simulation.json
8
+ * - src/resources/{resource}/{resource}-resource.json
9
+ * - src/resources/{resource}/{Resource}Resource component (PascalCase)
10
10
  */
11
11
  import { StrictMode } from 'react';
12
12
  import { createRoot } from 'react-dom/client';
@@ -16,7 +16,7 @@ import '../src/styles/globals.css';
16
16
 
17
17
  // Build simulations from discovered files
18
18
  const simulations = buildDevSimulations({
19
- simulationModules: import.meta.glob('../src/resources/*/*-simulation.json', { eager: true }),
19
+ simulationModules: import.meta.glob('../tests/simulations/*/*-simulation.json', { eager: true }),
20
20
  resourceModules: import.meta.glob('../src/resources/*/*-resource.json', { eager: true }),
21
21
  resourceComponents: resourceComponents as Record<string, React.ComponentType>,
22
22
  });
@@ -1,6 +1,6 @@
1
1
  # sunpeak-app
2
2
 
3
- A ChatGPT App UI built with [sunpeak](https://github.com/Sunpeak-AI/sunpeak).
3
+ A ChatGPT App built with [sunpeak](https://github.com/Sunpeak-AI/sunpeak).
4
4
 
5
5
  For an initial overview of your new app and a detailed API reference, refer to the [documentation](https://docs.sunpeak.ai/template/project-structure).
6
6
 
@@ -19,9 +19,8 @@ That's it! Edit the resource files in [./src/resources/](./src/resources/) to bu
19
19
  # Core commands:
20
20
  pnpm test # Run tests with Vitest.
21
21
  pnpm test:e2e # Run end-to-end tests with Playwright.
22
- sunpeak dev # Start development server.
22
+ sunpeak dev # Start dev server + MCP endpoint.
23
23
  sunpeak build # Build all resources for production.
24
- sunpeak mcp # Start MCP server for ChatGPT testing with mock data.
25
24
 
26
25
  # sunpeak repository (think ECR for ChatGPT Apps):
27
26
  sunpeak login # Authenticate with the sunpeak repository.
@@ -33,23 +32,28 @@ The template includes a minimal test setup with Vitest. You can add additional t
33
32
 
34
33
  ## Project Structure
35
34
 
36
- - `src/resources/` - Directory containing all your MCP Resources (ChatGPT App UIs).
37
- - Each resource is a subdirectory containing all files for that resource.
38
- - Example: `src/resources/albums/` contains:
39
- - `albums-resource.tsx` - The React component.
40
- - `albums-resource.json` - Resource metadata (name, title, description, etc.).
41
- - `albums-resource.test.tsx` - Unit tests for the resource.
42
- - `albums-show-simulation.json` - Simulation data for testing.
43
- - `components/` - UI components used by the resource.
44
- - `tests/e2e/` - Directory containing end-to-end Playwright tests for each resource. Uses the ChatGPTSimulator to test your resources render properly with any state (tool calls, saved state, dark mode, pip display mode, etc.).
35
+ Using a Review page as an example, sunpeak projects look like:
36
+
37
+ ```bash
38
+ my-app/
39
+ ├── src/resources/
40
+ │ └── review/
41
+ │ ├── review-resource.tsx # Review UI component.
42
+ │ └── review-resource.json # Review UI MCP metadata.
43
+ ├── tests/simulations/
44
+ │ └── review/
45
+ │ ├── review-{scenario1}-simulation.json # Mock state for testing.
46
+ │ └── review-{scenario2}-simulation.json # Mock state for testing.
47
+ └── package.json
48
+ ```
45
49
 
46
50
  ## Testing in ChatGPT
47
51
 
48
- Test your app directly in ChatGPT using the built-in MCP server:
52
+ Test your app directly in ChatGPT using the built-in MCP endpoint (starts automatically with `sunpeak dev`):
49
53
 
50
54
  ```bash
51
- # Start the MCP server (rebuilds and restarts on file changes).
52
- sunpeak mcp
55
+ # Start the dev server + MCP endpoint.
56
+ sunpeak dev
53
57
 
54
58
  # In another terminal, run a tunnel. For example:
55
59
  ngrok http 6766
@@ -59,8 +63,6 @@ You can then connect to the tunnel forwarding URL at the `/mcp` path from ChatGP
59
63
 
60
64
  Once your app is connected, send the name of the app and a tool, like `/sunpeak show review`, to ChatGPT.
61
65
 
62
- When you make changes to the UI, refresh your app in ChatGPT after the MCP server has finished rebuilding your app: `User > Settings > Apps & Connectors > My App > Refresh`
63
-
64
66
  ## Build & Deploy
65
67
 
66
68
  Build your app for production:
@@ -74,15 +76,11 @@ This creates optimized builds in `dist/`, organized by resource:
74
76
  ```bash
75
77
  dist/
76
78
  ├── albums/
77
- │ ├── albums.js # Built resource component.
78
- ├── albums.json # Resource metadata.
79
- │ └── albums-show-simulation.json # Resource mock data for testing.
79
+ │ ├── albums.js # Built resource component.
80
+ └── albums.json # Resource metadata.
80
81
  ├── review/
81
82
  │ ├── review.js
82
- ├── review.json
83
- │ ├── review-diff-simulation.json
84
- │ ├── review-post-simulation.json
85
- │ └── review-purchase-simulation.json
83
+ └── review.json
86
84
  └── ...
87
85
  ```
88
86
 
@@ -90,7 +88,6 @@ Each resource folder contains:
90
88
 
91
89
  - **`.js` file**: Self-contained bundle with CSS inlined
92
90
  - **`.json` file**: Resource metadata with unique `uri` for cache-busting
93
- - **`*-simulation.json` files**: All affiliated simulation files for the resource. These are not needed for the production runtime, but are used in the sunpeak repository for testing.
94
91
 
95
92
  Host these files and reference them as resources in your production MCP server.
96
93
  Use the sunpeak resource repository for built-in resource hosting.
@@ -104,11 +101,12 @@ src/resources/NAME/
104
101
  ├── NAME-resource.tsx # React component (required)
105
102
  ├── NAME-resource.json # Resource metadata (required)
106
103
  ├── NAME-resource.test.tsx # Unit tests (optional)
107
- ├── NAME-SCENARIO-simulation.json # Simulation data (optional)
108
104
  └── components/ # UI components (optional)
109
105
  ```
110
106
 
111
- Only the resource files (`.tsx` and `.json`) are required to generate a production build and ship a UI. Create the simulation file if you want to preview your resource in `sunpeak dev` or `sunpeak mcp`.
107
+ Only the resource files (`.tsx` and `.json`) are required to generate a production build and ship a UI.
108
+
109
+ Create the simulation file(s) in `tests/simulations/` if you want to preview your resource in `sunpeak dev`.
112
110
 
113
111
  ## Resources
114
112
 
@@ -45,3 +45,7 @@ CLAUDE.md
45
45
  .temp
46
46
  .tmp
47
47
  tmp
48
+
49
+ # Vite cache
50
+ node_modules/.vite
51
+ node_modules/.vite-mcp
@@ -12,5 +12,5 @@
12
12
  ]
13
13
  }
14
14
  },
15
- "uri": "ui://albums-mkhk2bj6"
15
+ "uri": "ui://albums-mkk7xzee"
16
16
  }
@@ -12,5 +12,5 @@
12
12
  ]
13
13
  }
14
14
  },
15
- "uri": "ui://carousel-mkhk2bj6"
15
+ "uri": "ui://carousel-mkk7xzee"
16
16
  }
@@ -18,5 +18,5 @@
18
18
  ]
19
19
  }
20
20
  },
21
- "uri": "ui://map-mkhk2bj6"
21
+ "uri": "ui://map-mkk7xzee"
22
22
  }
@@ -12,5 +12,5 @@
12
12
  ]
13
13
  }
14
14
  },
15
- "uri": "ui://review-mkhk2bj6"
15
+ "uri": "ui://review-mkk7xzee"
16
16
  }
@@ -4,7 +4,6 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Sunpeak - ChatGPT App framework</title>
7
- <link rel="icon" type="image/x-icon" href="/favicon.ico" />
8
7
  <!-- Establish CSS layer order BEFORE any JS-injected CSS modules -->
9
8
  <style>@layer properties, theme, base, components, utilities;</style>
10
9
  </head>
@@ -1,121 +1,121 @@
1
1
  {
2
- "hash": "44587b56",
3
- "configHash": "f56e5903",
2
+ "hash": "4a7f9e31",
3
+ "configHash": "b26b5701",
4
4
  "lockfileHash": "9d20b726",
5
- "browserHash": "5011344d",
5
+ "browserHash": "0def6af7",
6
6
  "optimized": {
7
7
  "react": {
8
8
  "src": "../../../../node_modules/.pnpm/react@19.2.3/node_modules/react/index.js",
9
9
  "file": "react.js",
10
- "fileHash": "4158ad30",
10
+ "fileHash": "f00482ce",
11
11
  "needsInterop": true
12
12
  },
13
13
  "react-dom": {
14
14
  "src": "../../../../node_modules/.pnpm/react-dom@19.2.3_react@19.2.3/node_modules/react-dom/index.js",
15
15
  "file": "react-dom.js",
16
- "fileHash": "eceb9ce1",
16
+ "fileHash": "1569e6b6",
17
17
  "needsInterop": true
18
18
  },
19
19
  "react/jsx-dev-runtime": {
20
20
  "src": "../../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-dev-runtime.js",
21
21
  "file": "react_jsx-dev-runtime.js",
22
- "fileHash": "7a7f1ddd",
22
+ "fileHash": "0115028c",
23
23
  "needsInterop": true
24
24
  },
25
25
  "react/jsx-runtime": {
26
26
  "src": "../../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js",
27
27
  "file": "react_jsx-runtime.js",
28
- "fileHash": "346c243c",
28
+ "fileHash": "feb11853",
29
29
  "needsInterop": true
30
30
  },
31
31
  "@openai/apps-sdk-ui/components/Avatar": {
32
32
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Avatar/index.js",
33
33
  "file": "@openai_apps-sdk-ui_components_Avatar.js",
34
- "fileHash": "4e36254d",
34
+ "fileHash": "7bda9dc6",
35
35
  "needsInterop": false
36
36
  },
37
37
  "@openai/apps-sdk-ui/components/Button": {
38
38
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Button/index.js",
39
39
  "file": "@openai_apps-sdk-ui_components_Button.js",
40
- "fileHash": "0ba30b65",
40
+ "fileHash": "ed76f323",
41
41
  "needsInterop": false
42
42
  },
43
43
  "@openai/apps-sdk-ui/components/Checkbox": {
44
44
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.8__@types+react@19._10810175a7ab45acace17e46639bb69b/node_modules/@openai/apps-sdk-ui/dist/es/components/Checkbox/index.js",
45
45
  "file": "@openai_apps-sdk-ui_components_Checkbox.js",
46
- "fileHash": "c0e24dfb",
46
+ "fileHash": "ab0a037f",
47
47
  "needsInterop": false
48
48
  },
49
49
  "@openai/apps-sdk-ui/components/Icon": {
50
50
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Icon/index.js",
51
51
  "file": "@openai_apps-sdk-ui_components_Icon.js",
52
- "fileHash": "c5c6ed08",
52
+ "fileHash": "b6eb2e05",
53
53
  "needsInterop": false
54
54
  },
55
55
  "@openai/apps-sdk-ui/components/Input": {
56
56
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.8__@types+react@19._10810175a7ab45acace17e46639bb69b/node_modules/@openai/apps-sdk-ui/dist/es/components/Input/index.js",
57
57
  "file": "@openai_apps-sdk-ui_components_Input.js",
58
- "fileHash": "a8f4808e",
58
+ "fileHash": "5d518848",
59
59
  "needsInterop": false
60
60
  },
61
61
  "@openai/apps-sdk-ui/components/SegmentedControl": {
62
62
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.8__@types+react@19._10810175a7ab45acace17e46639bb69b/node_modules/@openai/apps-sdk-ui/dist/es/components/SegmentedControl/index.js",
63
63
  "file": "@openai_apps-sdk-ui_components_SegmentedControl.js",
64
- "fileHash": "d5c8173c",
64
+ "fileHash": "2ee50bba",
65
65
  "needsInterop": false
66
66
  },
67
67
  "@openai/apps-sdk-ui/components/Select": {
68
68
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.8__@types+react@19._10810175a7ab45acace17e46639bb69b/node_modules/@openai/apps-sdk-ui/dist/es/components/Select/index.js",
69
69
  "file": "@openai_apps-sdk-ui_components_Select.js",
70
- "fileHash": "4240ac61",
70
+ "fileHash": "22a1dcf3",
71
71
  "needsInterop": false
72
72
  },
73
73
  "@openai/apps-sdk-ui/components/Textarea": {
74
74
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.8__@types+react@19._10810175a7ab45acace17e46639bb69b/node_modules/@openai/apps-sdk-ui/dist/es/components/Textarea/index.js",
75
75
  "file": "@openai_apps-sdk-ui_components_Textarea.js",
76
- "fileHash": "fb143e76",
76
+ "fileHash": "aa2d33e1",
77
77
  "needsInterop": false
78
78
  },
79
79
  "@openai/apps-sdk-ui/theme": {
80
80
  "src": "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.8__@types+react@19._10810175a7ab45acace17e46639bb69b/node_modules/@openai/apps-sdk-ui/dist/es/lib/theme.js",
81
81
  "file": "@openai_apps-sdk-ui_theme.js",
82
- "fileHash": "d63096a5",
82
+ "fileHash": "5781d4bb",
83
83
  "needsInterop": false
84
84
  },
85
85
  "clsx": {
86
86
  "src": "../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs",
87
87
  "file": "clsx.js",
88
- "fileHash": "f58131a9",
88
+ "fileHash": "c87a7748",
89
89
  "needsInterop": false
90
90
  },
91
91
  "embla-carousel-react": {
92
92
  "src": "../../../../node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.3/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.js",
93
93
  "file": "embla-carousel-react.js",
94
- "fileHash": "a3f7e176",
94
+ "fileHash": "54c2792d",
95
95
  "needsInterop": false
96
96
  },
97
97
  "embla-carousel-wheel-gestures": {
98
98
  "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",
99
99
  "file": "embla-carousel-wheel-gestures.js",
100
- "fileHash": "5d368aee",
100
+ "fileHash": "fa9d042d",
101
101
  "needsInterop": false
102
102
  },
103
103
  "mapbox-gl": {
104
104
  "src": "../../../../node_modules/.pnpm/mapbox-gl@3.17.0/node_modules/mapbox-gl/dist/mapbox-gl.js",
105
105
  "file": "mapbox-gl.js",
106
- "fileHash": "8d8a5e1a",
106
+ "fileHash": "e9ae0a8d",
107
107
  "needsInterop": true
108
108
  },
109
109
  "react-dom/client": {
110
110
  "src": "../../../../node_modules/.pnpm/react-dom@19.2.3_react@19.2.3/node_modules/react-dom/client.js",
111
111
  "file": "react-dom_client.js",
112
- "fileHash": "1170d116",
112
+ "fileHash": "517db7cd",
113
113
  "needsInterop": true
114
114
  },
115
115
  "tailwind-merge": {
116
116
  "src": "../../../../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs",
117
117
  "file": "tailwind-merge.js",
118
- "fileHash": "fdab5cd1",
118
+ "fileHash": "9c4aa4b1",
119
119
  "needsInterop": false
120
120
  }
121
121
  },
@@ -1 +1 @@
1
- {"version":"4.0.16","results":[[":src/resources/albums/components/albums.test.tsx",{"duration":410.5030049999998,"failed":false}],[":src/resources/carousel/carousel-resource.test.tsx",{"duration":310.719329,"failed":false}],[":src/resources/review/review-resource.test.tsx",{"duration":598.5615620000003,"failed":false}],[":src/resources/map/components/map-view.test.tsx",{"duration":96.15135400000008,"failed":false}],[":src/resources/map/components/place-inspector.test.tsx",{"duration":460.02958199999966,"failed":false}],[":src/resources/albums/components/fullscreen-viewer.test.tsx",{"duration":273.1299219999996,"failed":false}],[":src/resources/map/components/place-list.test.tsx",{"duration":143.12914500000034,"failed":false}],[":src/resources/map/components/place-card.test.tsx",{"duration":351.79216799999995,"failed":false}],[":src/resources/map/components/place-carousel.test.tsx",{"duration":449.5401650000001,"failed":false}],[":src/resources/albums/components/album-carousel.test.tsx",{"duration":70.63576599999988,"failed":false}],[":src/resources/carousel/components/carousel.test.tsx",{"duration":105.63132599999994,"failed":false}],[":src/resources/map/map-resource.test.tsx",{"duration":294.368154,"failed":false}],[":src/resources/albums/albums-resource.test.tsx",{"duration":253.63618599999995,"failed":false}],[":src/resources/albums/components/film-strip.test.tsx",{"duration":482.764449,"failed":false}],[":src/resources/albums/components/album-card.test.tsx",{"duration":269.0116419999997,"failed":false}],[":src/resources/carousel/components/card.test.tsx",{"duration":102.7438790000001,"failed":false}]]}
1
+ {"version":"4.0.16","results":[[":src/resources/review/review-resource.test.tsx",{"duration":549.1222579999999,"failed":false}],[":src/resources/albums/components/albums.test.tsx",{"duration":350.93041600000015,"failed":false}],[":src/resources/carousel/carousel-resource.test.tsx",{"duration":251.43985999999995,"failed":false}],[":src/resources/map/components/map-view.test.tsx",{"duration":87.90785099999994,"failed":false}],[":src/resources/map/components/place-inspector.test.tsx",{"duration":476.03139400000055,"failed":false}],[":src/resources/albums/components/fullscreen-viewer.test.tsx",{"duration":285.097933,"failed":false}],[":src/resources/map/components/place-list.test.tsx",{"duration":136.47718200000008,"failed":false}],[":src/resources/map/components/place-card.test.tsx",{"duration":380.20156,"failed":false}],[":src/resources/map/components/place-carousel.test.tsx",{"duration":452.68627800000013,"failed":false}],[":src/resources/albums/components/album-carousel.test.tsx",{"duration":101.4541720000002,"failed":false}],[":src/resources/carousel/components/carousel.test.tsx",{"duration":77.42705000000001,"failed":false}],[":src/resources/map/map-resource.test.tsx",{"duration":281.73994100000004,"failed":false}],[":src/resources/albums/albums-resource.test.tsx",{"duration":265.21104400000013,"failed":false}],[":src/resources/albums/components/film-strip.test.tsx",{"duration":430.75007900000014,"failed":false}],[":src/resources/albums/components/album-card.test.tsx",{"duration":305.5718360000001,"failed":false}],[":src/resources/carousel/components/card.test.tsx",{"duration":76.69553300000007,"failed":false}]]}
@@ -0,0 +1,96 @@
1
+ import {
2
+ toCssVariables
3
+ } from "./chunk-RYYR2YMB.js";
4
+ import {
5
+ clsx_default
6
+ } from "./chunk-CNYJBM5F.js";
7
+ import {
8
+ require_jsx_runtime
9
+ } from "./chunk-JGVISENQ.js";
10
+ import {
11
+ require_react
12
+ } from "./chunk-BUOVMFCD.js";
13
+ import {
14
+ __toESM
15
+ } from "./chunk-ILHRZGIS.js";
16
+
17
+ // ../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Avatar/Avatar.js
18
+ var import_jsx_runtime = __toESM(require_jsx_runtime());
19
+ var import_react = __toESM(require_react());
20
+ var import_react2 = __toESM(require_react());
21
+ import s from "/home/runner/work/sunpeak/sunpeak/node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Avatar/Avatar.module.css";
22
+ var Avatar = (props) => {
23
+ const validImageUrl = validateImageUrl(props.imageUrl);
24
+ return (0, import_react.createElement)(AvatarInner, { ...props, imageUrl: validImageUrl, key: validImageUrl });
25
+ };
26
+ var AvatarInner = (props) => {
27
+ const {
28
+ className,
29
+ size,
30
+ overflowCount,
31
+ name,
32
+ color = "secondary",
33
+ variant = "soft",
34
+ imageUrl,
35
+ Icon,
36
+ // asChild support
37
+ ...restProps
38
+ } = props;
39
+ const [imageStatus, setImageStatus] = (0, import_react2.useState)();
40
+ const isInteractive = !!(restProps.onPointerDown || restProps.onClick);
41
+ const TagName = isInteractive ? "button" : "span";
42
+ return (0, import_jsx_runtime.jsx)(TagName, { className: clsx_default(s.Avatar, className), style: toCssVariables({
43
+ "avatar-size": size
44
+ }), role: isInteractive ? void 0 : "presentation", "data-color": color, "data-variant": variant, type: isInteractive ? "button" : void 0, ...restProps, children: (() => {
45
+ if (imageUrl && imageStatus !== "error") {
46
+ return (0, import_jsx_runtime.jsx)(AvatarImage, { status: imageStatus, url: imageUrl, onError: () => setImageStatus("error"), onLoad: () => setImageStatus("loaded") });
47
+ }
48
+ if (Icon) {
49
+ return (0, import_jsx_runtime.jsx)(Icon, { className: s.AvatarIcon });
50
+ }
51
+ return overflowCount ? (0, import_jsx_runtime.jsx)(AvatarOverflowCount, { count: overflowCount }) : (0, import_jsx_runtime.jsx)(AvatarInitial, { name });
52
+ })() });
53
+ };
54
+ var validateImageUrl = (imageUrl) => {
55
+ if (!imageUrl) {
56
+ return;
57
+ }
58
+ if (imageUrl.includes("gravatar.com") && imageUrl.includes("cdn.auth0.com")) {
59
+ return;
60
+ }
61
+ return imageUrl;
62
+ };
63
+ var AvatarImage = ({ url, status, onLoad, onError }) => {
64
+ return (0, import_jsx_runtime.jsx)("span", { className: s.AvatarImageContainer, children: (0, import_jsx_runtime.jsx)("img", { src: url, className: s.AvatarImage, "data-loaded": status === "loaded" ? "" : void 0, onLoad, onError, alt: "", role: "presentation" }) });
65
+ };
66
+ var AvatarInitial = ({ name = "" }) => {
67
+ const firstInitial = (0, import_react2.useMemo)(() => name.charAt(0).toUpperCase(), [name]);
68
+ return (0, import_jsx_runtime.jsx)("span", { className: s.AvatarInitial, children: firstInitial });
69
+ };
70
+ var AvatarOverflowCount = ({ count }) => {
71
+ const formattedCount = (0, import_react2.useMemo)(() => {
72
+ return new Intl.NumberFormat("en", {
73
+ notation: "compact",
74
+ compactDisplay: "short",
75
+ maximumFractionDigits: 0
76
+ }).format(count).toLocaleLowerCase();
77
+ }, [count]);
78
+ return (0, import_jsx_runtime.jsxs)("span", { className: s.AvatarOverflowCount, "data-letter-count": formattedCount.length, children: [(0, import_jsx_runtime.jsx)("span", { className: s.AvatarOverflowCountSymbol, children: "+" }), formattedCount] });
79
+ };
80
+
81
+ // ../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Avatar/AvatarGroup.js
82
+ var import_jsx_runtime2 = __toESM(require_jsx_runtime());
83
+ var import_react3 = __toESM(require_react());
84
+ import s2 from "/home/runner/work/sunpeak/sunpeak/node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/dist/es/components/Avatar/AvatarGroup.module.css";
85
+ var AvatarGroup = ({ className, stack = "start", size, children }) => {
86
+ const childrenArray = import_react3.Children.toArray(children);
87
+ const maybeReversedChildren = stack === "start" ? childrenArray.slice().reverse() : childrenArray;
88
+ return (0, import_jsx_runtime2.jsx)("div", { className: clsx_default(s2.Group, className), "data-stack": stack, style: toCssVariables({
89
+ "avatar-size": size
90
+ }), children: maybeReversedChildren.map((child) => (0, import_react3.isValidElement)(child) ? (0, import_react3.cloneElement)(child) : child) });
91
+ };
92
+ export {
93
+ Avatar,
94
+ AvatarGroup
95
+ };
96
+ //# sourceMappingURL=@openai_apps-sdk-ui_components_Avatar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/src/components/Avatar/Avatar.tsx", "../../../../node_modules/.pnpm/@openai+apps-sdk-ui@0.2.1_@types+react-dom@19.2.3_@types+react@19.2.7__@types+react@19._90324f97b7190ccfdbe40a9e8bef3385/node_modules/@openai/apps-sdk-ui/src/components/Avatar/AvatarGroup.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useMemo, useState } from \"react\"\nimport { toCssVariables } from \"../../lib/helpers\"\nimport { type SemanticColors, type Variants } from \"../../types\"\nimport s from \"./Avatar.module.css\"\n\ntype ImageStatus = undefined | \"error\" | \"loaded\"\n\nexport type AvatarProps = {\n /** Class name applied to the avatar */\n className?: string\n /** Size of the avatar's width & height, in pixels. */\n size?: number\n /** Display a formatted count of overflow objects. */\n overflowCount?: number\n /** Name used to display initials from */\n name?: string\n /**\n * Color used for the avatar\n * @default secondary\n */\n color?: SemanticColors<\"primary\" | \"secondary\" | \"success\" | \"info\" | \"discovery\" | \"danger\">\n /**\n * Style variant of the avatar\n * @default soft\n */\n variant?: Variants<\"soft\" | \"solid\">\n /** URL of the image to display as the avatar */\n imageUrl?: string\n /** Icon to render in the avatar circle */\n Icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>\n /** Optional click handler, which also enables semantic interactions */\n onClick?: () => void\n /** Optional pointer handler, which also enables semantic interactions */\n onPointerDown?: () => void\n}\n\nexport const Avatar = (props: AvatarProps) => {\n // Validate the image url before sending to the component\n const validImageUrl = validateImageUrl(props.imageUrl)\n\n // Keying off of imageUrl allows us to refresh imageStatus automatically through React rendering\n return <AvatarInner {...props} imageUrl={validImageUrl} key={validImageUrl} />\n}\n\nexport const AvatarInner = (props: AvatarProps) => {\n const {\n className,\n size,\n overflowCount,\n name,\n color = \"secondary\",\n variant = \"soft\",\n imageUrl,\n Icon,\n // asChild support\n ...restProps\n } = props\n const [imageStatus, setImageStatus] = useState<ImageStatus>()\n const isInteractive = !!(restProps.onPointerDown || restProps.onClick)\n const TagName = isInteractive ? \"button\" : \"span\"\n\n return (\n <TagName\n className={clsx(s.Avatar, className)}\n style={toCssVariables({\n \"avatar-size\": size,\n })}\n role={isInteractive ? undefined : \"presentation\"}\n data-color={color}\n data-variant={variant}\n type={isInteractive ? \"button\" : undefined}\n {...restProps}\n >\n {(() => {\n if (imageUrl && imageStatus !== \"error\") {\n return (\n <AvatarImage\n status={imageStatus}\n url={imageUrl}\n onError={() => setImageStatus(\"error\")}\n onLoad={() => setImageStatus(\"loaded\")}\n />\n )\n }\n if (Icon) {\n return <Icon className={s.AvatarIcon} />\n }\n return overflowCount ? (\n <AvatarOverflowCount count={overflowCount} />\n ) : (\n <AvatarInitial name={name} />\n )\n })()}\n </TagName>\n )\n}\n\nconst validateImageUrl = (imageUrl?: string): string | undefined => {\n if (!imageUrl) {\n return\n }\n\n // Avoid specific pattern of images from gravatar.com, which use a pair of initials, instead of a single initial.\n if (imageUrl.includes(\"gravatar.com\") && imageUrl.includes(\"cdn.auth0.com\")) {\n return\n }\n\n return imageUrl\n}\n\nconst AvatarImage = ({\n url,\n status,\n onLoad,\n onError,\n}: {\n url: string\n status: ImageStatus\n onLoad: () => void\n onError: () => void\n}) => {\n return (\n <span className={s.AvatarImageContainer}>\n <img\n src={url}\n className={s.AvatarImage}\n data-loaded={status === \"loaded\" ? \"\" : undefined}\n onLoad={onLoad}\n onError={onError}\n alt=\"\"\n role=\"presentation\"\n />\n </span>\n )\n}\n\nconst AvatarInitial = ({ name = \"\" }: { name?: string }) => {\n const firstInitial = useMemo(() => name.charAt(0).toUpperCase(), [name])\n\n return <span className={s.AvatarInitial}>{firstInitial}</span>\n}\n\nconst AvatarOverflowCount = ({ count }: { count: number }) => {\n const formattedCount = useMemo<string>(() => {\n return new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n compactDisplay: \"short\",\n maximumFractionDigits: 0,\n })\n .format(count)\n .toLocaleLowerCase()\n }, [count])\n\n return (\n <span className={s.AvatarOverflowCount} data-letter-count={formattedCount.length}>\n <span className={s.AvatarOverflowCountSymbol}>+</span>\n {formattedCount}\n </span>\n )\n}\n", "import clsx from \"clsx\"\nimport { Children, cloneElement, isValidElement, type ReactNode } from \"react\"\nimport { toCssVariables } from \"../../lib/helpers\"\nimport s from \"./AvatarGroup.module.css\"\n\nexport type AvatarGroupProps = {\n /** Class name passed to the group container */\n className?: string\n /**\n * Determines stacking layer order\n * @default start\n */\n stack?: \"start\" | \"end\"\n /** Size all avatars in the group, in pixels. */\n size?: number\n children: ReactNode\n}\n\nexport const AvatarGroup = ({ className, stack = \"start\", size, children }: AvatarGroupProps) => {\n const childrenArray = Children.toArray(children)\n // Conditionally reverse the array depending on desired stacking priority\n const maybeReversedChildren = stack === \"start\" ? childrenArray.slice().reverse() : childrenArray\n\n return (\n <div\n className={clsx(s.Group, className)}\n data-stack={stack}\n style={toCssVariables({\n \"avatar-size\": size,\n })}\n >\n {maybeReversedChildren.map((child) => (isValidElement(child) ? cloneElement(child) : child))}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "_createElement", "_jsx", "_jsxs", "import_react", "s", "_jsx"]
7
+ }