sunpeak 0.14.3 → 0.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +34 -30
  2. package/bin/commands/build.mjs +2 -1
  3. package/bin/commands/dev.mjs +72 -2
  4. package/dist/chatgpt/{conversation.d.ts → chatgpt-conversation.d.ts} +1 -1
  5. package/dist/chatgpt/chatgpt-host.d.ts +1 -0
  6. package/dist/chatgpt/globals.css +618 -6156
  7. package/dist/chatgpt/index.cjs +11 -8
  8. package/dist/chatgpt/index.cjs.map +1 -1
  9. package/dist/chatgpt/index.d.ts +10 -32
  10. package/dist/chatgpt/index.js +15 -12
  11. package/dist/chatgpt/index.js.map +1 -1
  12. package/dist/claude/claude-conversation.d.ts +23 -0
  13. package/dist/claude/claude-host.d.ts +1 -0
  14. package/dist/claude/index.cjs +5 -0
  15. package/dist/claude/index.cjs.map +1 -0
  16. package/dist/claude/index.d.ts +1 -0
  17. package/dist/claude/index.js +5 -0
  18. package/dist/claude/index.js.map +1 -0
  19. package/dist/{discovery-COZUnY6a.js → discovery-DzV3HLXs.js} +5 -5
  20. package/dist/{discovery-COZUnY6a.js.map → discovery-DzV3HLXs.js.map} +1 -1
  21. package/dist/hooks/index.d.ts +4 -0
  22. package/dist/hooks/use-app-tools.d.ts +44 -0
  23. package/dist/hooks/use-update-model-context.d.ts +29 -0
  24. package/dist/index-B0dxRJvS.cjs +42 -0
  25. package/dist/index-B0dxRJvS.cjs.map +1 -0
  26. package/dist/index-Ce_5ZIdJ.js +512 -0
  27. package/dist/index-Ce_5ZIdJ.js.map +1 -0
  28. package/dist/index-Cngntkp2.cjs +527 -0
  29. package/dist/index-Cngntkp2.cjs.map +1 -0
  30. package/dist/index-CutQgPzR.js +43 -0
  31. package/dist/index-CutQgPzR.js.map +1 -0
  32. package/dist/index.cjs +1705 -1647
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.ts +2 -1
  35. package/dist/index.js +2732 -2675
  36. package/dist/index.js.map +1 -1
  37. package/dist/lib/default-style-variables.d.ts +2 -0
  38. package/dist/lib/discovery-cli.js +1 -1
  39. package/dist/mcp/index.cjs +86 -27
  40. package/dist/mcp/index.cjs.map +1 -1
  41. package/dist/mcp/index.d.ts +3 -1
  42. package/dist/mcp/index.js +85 -26
  43. package/dist/mcp/index.js.map +1 -1
  44. package/dist/mcp/server.d.ts +4 -3
  45. package/dist/mcp/types.d.ts +11 -0
  46. package/dist/platform/chatgpt/index.cjs +1 -1
  47. package/dist/platform/chatgpt/index.js +1 -1
  48. package/dist/platform/index.cjs +3 -0
  49. package/dist/platform/index.cjs.map +1 -1
  50. package/dist/platform/index.d.ts +3 -1
  51. package/dist/platform/index.js +3 -0
  52. package/dist/platform/index.js.map +1 -1
  53. package/dist/{protocol-BQCnIrc9.js → protocol-DFbsCx7E.js} +29 -29
  54. package/dist/{protocol-BQCnIrc9.js.map → protocol-DFbsCx7E.js.map} +1 -1
  55. package/dist/simulator/host-styles.d.ts +5 -0
  56. package/dist/simulator/hosts.d.ts +73 -0
  57. package/dist/{chatgpt → simulator}/iframe-resource.d.ts +27 -3
  58. package/dist/simulator/index.cjs +39 -0
  59. package/dist/simulator/index.cjs.map +1 -0
  60. package/dist/simulator/index.d.ts +18 -0
  61. package/dist/simulator/index.js +39 -0
  62. package/dist/simulator/index.js.map +1 -0
  63. package/dist/{chatgpt → simulator}/mcp-app-host.d.ts +8 -1
  64. package/dist/simulator/mock-openai-runtime.d.ts +20 -0
  65. package/dist/{chatgpt → simulator}/simulator-url.d.ts +8 -1
  66. package/dist/simulator/simulator.d.ts +12 -0
  67. package/dist/{chatgpt → simulator}/theme-provider.d.ts +3 -1
  68. package/dist/simulator/use-simulator-state.d.ts +91 -0
  69. package/dist/simulator-CxrtnguM.js +8764 -0
  70. package/dist/simulator-CxrtnguM.js.map +1 -0
  71. package/dist/simulator-DcfQBRXE.cjs +8779 -0
  72. package/dist/simulator-DcfQBRXE.cjs.map +1 -0
  73. package/dist/simulator-url-CuLqtnSS.js +48 -0
  74. package/dist/simulator-url-CuLqtnSS.js.map +1 -0
  75. package/dist/simulator-url-rgg_KYOg.cjs +47 -0
  76. package/dist/simulator-url-rgg_KYOg.cjs.map +1 -0
  77. package/dist/style.css +558 -6143
  78. package/dist/types/runtime.d.ts +1 -1
  79. package/dist/{use-app-D7kRAPSG.cjs → use-app-BnoSPiUT.cjs} +2 -1
  80. package/dist/{use-app-D7kRAPSG.cjs.map → use-app-BnoSPiUT.cjs.map} +1 -1
  81. package/dist/{use-app-Dvr4LKs2.js → use-app-D_TeaMFG.js} +4 -3
  82. package/dist/{use-app-Dvr4LKs2.js.map → use-app-D_TeaMFG.js.map} +1 -1
  83. package/package.json +18 -3
  84. package/template/.sunpeak/dev.tsx +4 -4
  85. package/template/.sunpeak/resource-loader.html +1 -1
  86. package/template/README.md +1 -1
  87. package/template/node_modules/.bin/nodemon +2 -2
  88. package/template/node_modules/.bin/playwright +2 -2
  89. package/template/node_modules/.bin/sunpeak +2 -2
  90. package/template/node_modules/.bin/tsc +2 -2
  91. package/template/node_modules/.bin/tsserver +2 -2
  92. package/template/node_modules/.bin/tsx +2 -2
  93. package/template/node_modules/.bin/vite +2 -2
  94. package/template/src/components/avatar.tsx +4 -1
  95. package/template/src/components/button.tsx +17 -20
  96. package/template/src/resources/albums/albums-resource.tsx +2 -3
  97. package/template/src/resources/albums/components/album-card.tsx +4 -2
  98. package/template/src/resources/albums/components/film-strip.test.tsx +2 -2
  99. package/template/src/resources/albums/components/film-strip.tsx +2 -2
  100. package/template/src/resources/albums/components/fullscreen-viewer.tsx +7 -5
  101. package/template/src/resources/carousel/carousel-resource.tsx +2 -3
  102. package/template/src/resources/carousel/components/card.test.tsx +3 -2
  103. package/template/src/resources/carousel/components/card.tsx +8 -4
  104. package/template/src/resources/map/components/map-view.tsx +1 -1
  105. package/template/src/resources/map/components/map.tsx +1 -1
  106. package/template/src/resources/map/components/place-card.tsx +8 -4
  107. package/template/src/resources/map/components/place-carousel.tsx +1 -1
  108. package/template/src/resources/map/components/place-inspector.tsx +15 -7
  109. package/template/src/resources/map/components/place-list.tsx +7 -4
  110. package/template/src/resources/map/map-resource.tsx +0 -2
  111. package/template/src/resources/review/review-resource.tsx +61 -27
  112. package/template/tests/e2e/albums.spec.ts +118 -102
  113. package/template/tests/e2e/carousel.spec.ts +103 -100
  114. package/template/tests/e2e/map.spec.ts +220 -181
  115. package/template/tests/e2e/review.spec.ts +224 -198
  116. package/dist/_commonjsHelpers-Bc2YnDe1.cjs +0 -8
  117. package/dist/_commonjsHelpers-Bc2YnDe1.cjs.map +0 -1
  118. package/dist/_commonjsHelpers-DWwsNxpa.js +0 -9
  119. package/dist/_commonjsHelpers-DWwsNxpa.js.map +0 -1
  120. package/dist/index-CJ3jfcjj.js +0 -15131
  121. package/dist/index-CJ3jfcjj.js.map +0 -1
  122. package/dist/index-Cdeg96So.cjs +0 -15147
  123. package/dist/index-Cdeg96So.cjs.map +0 -1
  124. /package/dist/{chatgpt → simulator}/simple-sidebar.d.ts +0 -0
  125. /package/dist/{chatgpt/chatgpt-simulator-types.d.ts → simulator/simulator-types.d.ts} +0 -0
@@ -0,0 +1,48 @@
1
+ function createSimulatorUrl(params, basePath = "/") {
2
+ const searchParams = new URLSearchParams();
3
+ if (params.simulation !== void 0) {
4
+ searchParams.set("simulation", params.simulation);
5
+ }
6
+ if (params.host !== void 0) {
7
+ searchParams.set("host", params.host);
8
+ }
9
+ if (params.theme !== void 0) {
10
+ searchParams.set("theme", params.theme);
11
+ }
12
+ if (params.displayMode !== void 0) {
13
+ searchParams.set("displayMode", params.displayMode);
14
+ }
15
+ if (params.locale !== void 0) {
16
+ searchParams.set("locale", params.locale);
17
+ }
18
+ if (params.maxHeight !== void 0) {
19
+ searchParams.set("maxHeight", String(params.maxHeight));
20
+ }
21
+ if (params.deviceType !== void 0) {
22
+ searchParams.set("deviceType", params.deviceType);
23
+ }
24
+ if (params.hover !== void 0) {
25
+ searchParams.set("hover", String(params.hover));
26
+ }
27
+ if (params.touch !== void 0) {
28
+ searchParams.set("touch", String(params.touch));
29
+ }
30
+ if (params.safeAreaTop !== void 0) {
31
+ searchParams.set("safeAreaTop", String(params.safeAreaTop));
32
+ }
33
+ if (params.safeAreaBottom !== void 0) {
34
+ searchParams.set("safeAreaBottom", String(params.safeAreaBottom));
35
+ }
36
+ if (params.safeAreaLeft !== void 0) {
37
+ searchParams.set("safeAreaLeft", String(params.safeAreaLeft));
38
+ }
39
+ if (params.safeAreaRight !== void 0) {
40
+ searchParams.set("safeAreaRight", String(params.safeAreaRight));
41
+ }
42
+ const queryString = searchParams.toString();
43
+ return queryString ? `${basePath}?${queryString}` : basePath;
44
+ }
45
+ export {
46
+ createSimulatorUrl as c
47
+ };
48
+ //# sourceMappingURL=simulator-url-CuLqtnSS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator-url-CuLqtnSS.js","sources":["../src/simulator/simulator-url.ts"],"sourcesContent":["import type { Theme, DisplayMode, DeviceType } from '../types/runtime';\n\n/**\n * Strongly-typed URL parameters for the Simulator.\n *\n * Use with `createSimulatorUrl()` to generate type-safe URL paths for e2e tests.\n *\n * @example\n * ```ts\n * import { createSimulatorUrl } from 'sunpeak/chatgpt';\n *\n * // In e2e tests:\n * await page.goto(createSimulatorUrl({\n * simulation: 'albums-show',\n * theme: 'dark',\n * displayMode: 'fullscreen',\n * host: 'claude',\n * }));\n * ```\n */\nexport interface SimulatorUrlParams {\n /**\n * The simulation name to load (e.g., 'albums-show', 'review-diff').\n * Corresponds to the simulation JSON filename without the '-simulation.json' suffix.\n */\n simulation?: string;\n\n /**\n * The host shell to use (e.g., 'chatgpt', 'claude').\n * Switches conversation chrome, theming, and reported host info/capabilities.\n * @default 'chatgpt'\n */\n host?: string;\n\n /**\n * The color theme for the simulator.\n * @default 'dark'\n */\n theme?: Theme;\n\n /**\n * The display mode for the widget.\n * - 'inline': Embedded in the conversation\n * - 'pip': Picture-in-picture mode with max height\n * - 'fullscreen': Full screen overlay\n * @default 'inline'\n */\n displayMode?: DisplayMode;\n\n /**\n * The locale for the simulator (e.g., 'en-US', 'ja-JP').\n * @default 'en-US'\n */\n locale?: string;\n\n /**\n * Maximum height in pixels for PiP mode.\n * Only applicable when displayMode is 'pip'.\n */\n maxHeight?: number;\n\n /**\n * The device type to simulate.\n * Affects default hover/touch capabilities.\n */\n deviceType?: DeviceType;\n\n /**\n * Whether the device supports hover interactions.\n * @default true for desktop, false for mobile/tablet\n */\n hover?: boolean;\n\n /**\n * Whether the device supports touch interactions.\n * @default false for desktop, true for mobile/tablet\n */\n touch?: boolean;\n\n /**\n * Safe area inset from the top of the screen (in pixels).\n * Used for devices with notches or status bars.\n */\n safeAreaTop?: number;\n\n /**\n * Safe area inset from the bottom of the screen (in pixels).\n * Used for devices with home indicators.\n */\n safeAreaBottom?: number;\n\n /**\n * Safe area inset from the left of the screen (in pixels).\n */\n safeAreaLeft?: number;\n\n /**\n * Safe area inset from the right of the screen (in pixels).\n */\n safeAreaRight?: number;\n}\n\n/**\n * Creates a URL path with query parameters for the ChatGPT Simulator.\n *\n * @param params - The simulator parameters to encode\n * @param basePath - The base path for the URL (default: '/')\n * @returns A URL path string with encoded query parameters\n *\n * @example\n * ```ts\n * // Basic usage\n * createSimulatorUrl({ simulation: 'albums-show', theme: 'light' })\n * // Returns: '/?simulation=albums-show&theme=light'\n *\n * // With display mode\n * createSimulatorUrl({\n * simulation: 'review-diff',\n * theme: 'dark',\n * displayMode: 'fullscreen',\n * })\n * // Returns: '/?simulation=review-diff&theme=dark&displayMode=fullscreen'\n *\n * // With device simulation\n * createSimulatorUrl({\n * simulation: 'map-show',\n * deviceType: 'mobile',\n * touch: true,\n * hover: false,\n * })\n * // Returns: '/?simulation=map-show&deviceType=mobile&touch=true&hover=false'\n *\n * // With safe area insets (for notch simulation)\n * createSimulatorUrl({\n * simulation: 'carousel-show',\n * safeAreaTop: 44,\n * safeAreaBottom: 34,\n * })\n * // Returns: '/?simulation=carousel-show&safeAreaTop=44&safeAreaBottom=34'\n * ```\n */\nexport function createSimulatorUrl(params: SimulatorUrlParams, basePath = '/'): string {\n const searchParams = new URLSearchParams();\n\n // Add each defined parameter\n if (params.simulation !== undefined) {\n searchParams.set('simulation', params.simulation);\n }\n if (params.host !== undefined) {\n searchParams.set('host', params.host);\n }\n if (params.theme !== undefined) {\n searchParams.set('theme', params.theme);\n }\n if (params.displayMode !== undefined) {\n searchParams.set('displayMode', params.displayMode);\n }\n if (params.locale !== undefined) {\n searchParams.set('locale', params.locale);\n }\n if (params.maxHeight !== undefined) {\n searchParams.set('maxHeight', String(params.maxHeight));\n }\n if (params.deviceType !== undefined) {\n searchParams.set('deviceType', params.deviceType);\n }\n if (params.hover !== undefined) {\n searchParams.set('hover', String(params.hover));\n }\n if (params.touch !== undefined) {\n searchParams.set('touch', String(params.touch));\n }\n if (params.safeAreaTop !== undefined) {\n searchParams.set('safeAreaTop', String(params.safeAreaTop));\n }\n if (params.safeAreaBottom !== undefined) {\n searchParams.set('safeAreaBottom', String(params.safeAreaBottom));\n }\n if (params.safeAreaLeft !== undefined) {\n searchParams.set('safeAreaLeft', String(params.safeAreaLeft));\n }\n if (params.safeAreaRight !== undefined) {\n searchParams.set('safeAreaRight', String(params.safeAreaRight));\n }\n const queryString = searchParams.toString();\n return queryString ? `${basePath}?${queryString}` : basePath;\n}\n"],"names":[],"mappings":"AA6IO,SAAS,mBAAmB,QAA4B,WAAW,KAAa;AACrF,QAAM,eAAe,IAAI,gBAAA;AAGzB,MAAI,OAAO,eAAe,QAAW;AACnC,iBAAa,IAAI,cAAc,OAAO,UAAU;AAAA,EAClD;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,iBAAa,IAAI,QAAQ,OAAO,IAAI;AAAA,EACtC;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,IAAI,SAAS,OAAO,KAAK;AAAA,EACxC;AACA,MAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAa,IAAI,eAAe,OAAO,WAAW;AAAA,EACpD;AACA,MAAI,OAAO,WAAW,QAAW;AAC/B,iBAAa,IAAI,UAAU,OAAO,MAAM;AAAA,EAC1C;AACA,MAAI,OAAO,cAAc,QAAW;AAClC,iBAAa,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAAA,EACxD;AACA,MAAI,OAAO,eAAe,QAAW;AACnC,iBAAa,IAAI,cAAc,OAAO,UAAU;AAAA,EAClD;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAa,IAAI,eAAe,OAAO,OAAO,WAAW,CAAC;AAAA,EAC5D;AACA,MAAI,OAAO,mBAAmB,QAAW;AACvC,iBAAa,IAAI,kBAAkB,OAAO,OAAO,cAAc,CAAC;AAAA,EAClE;AACA,MAAI,OAAO,iBAAiB,QAAW;AACrC,iBAAa,IAAI,gBAAgB,OAAO,OAAO,YAAY,CAAC;AAAA,EAC9D;AACA,MAAI,OAAO,kBAAkB,QAAW;AACtC,iBAAa,IAAI,iBAAiB,OAAO,OAAO,aAAa,CAAC;AAAA,EAChE;AACA,QAAM,cAAc,aAAa,SAAA;AACjC,SAAO,cAAc,GAAG,QAAQ,IAAI,WAAW,KAAK;AACtD;"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ function createSimulatorUrl(params, basePath = "/") {
3
+ const searchParams = new URLSearchParams();
4
+ if (params.simulation !== void 0) {
5
+ searchParams.set("simulation", params.simulation);
6
+ }
7
+ if (params.host !== void 0) {
8
+ searchParams.set("host", params.host);
9
+ }
10
+ if (params.theme !== void 0) {
11
+ searchParams.set("theme", params.theme);
12
+ }
13
+ if (params.displayMode !== void 0) {
14
+ searchParams.set("displayMode", params.displayMode);
15
+ }
16
+ if (params.locale !== void 0) {
17
+ searchParams.set("locale", params.locale);
18
+ }
19
+ if (params.maxHeight !== void 0) {
20
+ searchParams.set("maxHeight", String(params.maxHeight));
21
+ }
22
+ if (params.deviceType !== void 0) {
23
+ searchParams.set("deviceType", params.deviceType);
24
+ }
25
+ if (params.hover !== void 0) {
26
+ searchParams.set("hover", String(params.hover));
27
+ }
28
+ if (params.touch !== void 0) {
29
+ searchParams.set("touch", String(params.touch));
30
+ }
31
+ if (params.safeAreaTop !== void 0) {
32
+ searchParams.set("safeAreaTop", String(params.safeAreaTop));
33
+ }
34
+ if (params.safeAreaBottom !== void 0) {
35
+ searchParams.set("safeAreaBottom", String(params.safeAreaBottom));
36
+ }
37
+ if (params.safeAreaLeft !== void 0) {
38
+ searchParams.set("safeAreaLeft", String(params.safeAreaLeft));
39
+ }
40
+ if (params.safeAreaRight !== void 0) {
41
+ searchParams.set("safeAreaRight", String(params.safeAreaRight));
42
+ }
43
+ const queryString = searchParams.toString();
44
+ return queryString ? `${basePath}?${queryString}` : basePath;
45
+ }
46
+ exports.createSimulatorUrl = createSimulatorUrl;
47
+ //# sourceMappingURL=simulator-url-rgg_KYOg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator-url-rgg_KYOg.cjs","sources":["../src/simulator/simulator-url.ts"],"sourcesContent":["import type { Theme, DisplayMode, DeviceType } from '../types/runtime';\n\n/**\n * Strongly-typed URL parameters for the Simulator.\n *\n * Use with `createSimulatorUrl()` to generate type-safe URL paths for e2e tests.\n *\n * @example\n * ```ts\n * import { createSimulatorUrl } from 'sunpeak/chatgpt';\n *\n * // In e2e tests:\n * await page.goto(createSimulatorUrl({\n * simulation: 'albums-show',\n * theme: 'dark',\n * displayMode: 'fullscreen',\n * host: 'claude',\n * }));\n * ```\n */\nexport interface SimulatorUrlParams {\n /**\n * The simulation name to load (e.g., 'albums-show', 'review-diff').\n * Corresponds to the simulation JSON filename without the '-simulation.json' suffix.\n */\n simulation?: string;\n\n /**\n * The host shell to use (e.g., 'chatgpt', 'claude').\n * Switches conversation chrome, theming, and reported host info/capabilities.\n * @default 'chatgpt'\n */\n host?: string;\n\n /**\n * The color theme for the simulator.\n * @default 'dark'\n */\n theme?: Theme;\n\n /**\n * The display mode for the widget.\n * - 'inline': Embedded in the conversation\n * - 'pip': Picture-in-picture mode with max height\n * - 'fullscreen': Full screen overlay\n * @default 'inline'\n */\n displayMode?: DisplayMode;\n\n /**\n * The locale for the simulator (e.g., 'en-US', 'ja-JP').\n * @default 'en-US'\n */\n locale?: string;\n\n /**\n * Maximum height in pixels for PiP mode.\n * Only applicable when displayMode is 'pip'.\n */\n maxHeight?: number;\n\n /**\n * The device type to simulate.\n * Affects default hover/touch capabilities.\n */\n deviceType?: DeviceType;\n\n /**\n * Whether the device supports hover interactions.\n * @default true for desktop, false for mobile/tablet\n */\n hover?: boolean;\n\n /**\n * Whether the device supports touch interactions.\n * @default false for desktop, true for mobile/tablet\n */\n touch?: boolean;\n\n /**\n * Safe area inset from the top of the screen (in pixels).\n * Used for devices with notches or status bars.\n */\n safeAreaTop?: number;\n\n /**\n * Safe area inset from the bottom of the screen (in pixels).\n * Used for devices with home indicators.\n */\n safeAreaBottom?: number;\n\n /**\n * Safe area inset from the left of the screen (in pixels).\n */\n safeAreaLeft?: number;\n\n /**\n * Safe area inset from the right of the screen (in pixels).\n */\n safeAreaRight?: number;\n}\n\n/**\n * Creates a URL path with query parameters for the ChatGPT Simulator.\n *\n * @param params - The simulator parameters to encode\n * @param basePath - The base path for the URL (default: '/')\n * @returns A URL path string with encoded query parameters\n *\n * @example\n * ```ts\n * // Basic usage\n * createSimulatorUrl({ simulation: 'albums-show', theme: 'light' })\n * // Returns: '/?simulation=albums-show&theme=light'\n *\n * // With display mode\n * createSimulatorUrl({\n * simulation: 'review-diff',\n * theme: 'dark',\n * displayMode: 'fullscreen',\n * })\n * // Returns: '/?simulation=review-diff&theme=dark&displayMode=fullscreen'\n *\n * // With device simulation\n * createSimulatorUrl({\n * simulation: 'map-show',\n * deviceType: 'mobile',\n * touch: true,\n * hover: false,\n * })\n * // Returns: '/?simulation=map-show&deviceType=mobile&touch=true&hover=false'\n *\n * // With safe area insets (for notch simulation)\n * createSimulatorUrl({\n * simulation: 'carousel-show',\n * safeAreaTop: 44,\n * safeAreaBottom: 34,\n * })\n * // Returns: '/?simulation=carousel-show&safeAreaTop=44&safeAreaBottom=34'\n * ```\n */\nexport function createSimulatorUrl(params: SimulatorUrlParams, basePath = '/'): string {\n const searchParams = new URLSearchParams();\n\n // Add each defined parameter\n if (params.simulation !== undefined) {\n searchParams.set('simulation', params.simulation);\n }\n if (params.host !== undefined) {\n searchParams.set('host', params.host);\n }\n if (params.theme !== undefined) {\n searchParams.set('theme', params.theme);\n }\n if (params.displayMode !== undefined) {\n searchParams.set('displayMode', params.displayMode);\n }\n if (params.locale !== undefined) {\n searchParams.set('locale', params.locale);\n }\n if (params.maxHeight !== undefined) {\n searchParams.set('maxHeight', String(params.maxHeight));\n }\n if (params.deviceType !== undefined) {\n searchParams.set('deviceType', params.deviceType);\n }\n if (params.hover !== undefined) {\n searchParams.set('hover', String(params.hover));\n }\n if (params.touch !== undefined) {\n searchParams.set('touch', String(params.touch));\n }\n if (params.safeAreaTop !== undefined) {\n searchParams.set('safeAreaTop', String(params.safeAreaTop));\n }\n if (params.safeAreaBottom !== undefined) {\n searchParams.set('safeAreaBottom', String(params.safeAreaBottom));\n }\n if (params.safeAreaLeft !== undefined) {\n searchParams.set('safeAreaLeft', String(params.safeAreaLeft));\n }\n if (params.safeAreaRight !== undefined) {\n searchParams.set('safeAreaRight', String(params.safeAreaRight));\n }\n const queryString = searchParams.toString();\n return queryString ? `${basePath}?${queryString}` : basePath;\n}\n"],"names":[],"mappings":";AA6IO,SAAS,mBAAmB,QAA4B,WAAW,KAAa;AACrF,QAAM,eAAe,IAAI,gBAAA;AAGzB,MAAI,OAAO,eAAe,QAAW;AACnC,iBAAa,IAAI,cAAc,OAAO,UAAU;AAAA,EAClD;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,iBAAa,IAAI,QAAQ,OAAO,IAAI;AAAA,EACtC;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,IAAI,SAAS,OAAO,KAAK;AAAA,EACxC;AACA,MAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAa,IAAI,eAAe,OAAO,WAAW;AAAA,EACpD;AACA,MAAI,OAAO,WAAW,QAAW;AAC/B,iBAAa,IAAI,UAAU,OAAO,MAAM;AAAA,EAC1C;AACA,MAAI,OAAO,cAAc,QAAW;AAClC,iBAAa,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAAA,EACxD;AACA,MAAI,OAAO,eAAe,QAAW;AACnC,iBAAa,IAAI,cAAc,OAAO,UAAU;AAAA,EAClD;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAa,IAAI,eAAe,OAAO,OAAO,WAAW,CAAC;AAAA,EAC5D;AACA,MAAI,OAAO,mBAAmB,QAAW;AACvC,iBAAa,IAAI,kBAAkB,OAAO,OAAO,cAAc,CAAC;AAAA,EAClE;AACA,MAAI,OAAO,iBAAiB,QAAW;AACrC,iBAAa,IAAI,gBAAgB,OAAO,OAAO,YAAY,CAAC;AAAA,EAC9D;AACA,MAAI,OAAO,kBAAkB,QAAW;AACtC,iBAAa,IAAI,iBAAiB,OAAO,OAAO,aAAa,CAAC;AAAA,EAChE;AACA,QAAM,cAAc,aAAa,SAAA;AACjC,SAAO,cAAc,GAAG,QAAQ,IAAI,WAAW,KAAK;AACtD;;"}