@thewhateverapp/tile-sdk 0.2.6 → 0.3.0

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.
@@ -32,6 +32,7 @@ export declare class TileBridge {
32
32
  private handleConfig;
33
33
  private handleResponse;
34
34
  private handleEvent;
35
+ private handleNavigate;
35
36
  private sendToParent;
36
37
  /**
37
38
  * Request to navigate to full page view
@@ -49,6 +50,11 @@ export declare class TileBridge {
49
50
  * Send analytics event
50
51
  */
51
52
  trackEvent(eventName: string, data?: any): void;
53
+ /**
54
+ * Show or hide the attribution badge
55
+ * Useful for mobile devices (no hover) or when tile needs full attention
56
+ */
57
+ setAttributionVisible(visible: boolean): void;
52
58
  /**
53
59
  * Request clipboard write (requires user permission)
54
60
  */
@@ -100,6 +106,7 @@ export declare class TileBridge {
100
106
  private generateId;
101
107
  private isDevelopment;
102
108
  private isPreview;
109
+ private isInIframe;
103
110
  }
104
111
  export declare function getTileBridge(): TileBridge;
105
112
  //# sourceMappingURL=TileBridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;gBAEjB,cAAc,GAAE,MAAkC;IA4B9D,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAmCpB;;OAEG;IACI,cAAc,IAAI,IAAI;IAc7B;;OAEG;IACI,cAAc,IAAI,IAAI;IAO7B;;OAEG;IACI,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,QAAQ,GAAG,OAAkB,GAAG,IAAI;IAOxE;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAOtD;;OAEG;IACU,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B1D;;OAEG;IACU,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D;;OAEG;IACU,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAoBlD;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAWzD;;OAEG;IACU,OAAO,CAAC,OAAO,CAAC,EAAE;QAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IAiChB;;OAEG;IACU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B9D;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC;IAuB3C;;OAEG;IACI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAgBlE;;OAEG;IACI,SAAS,IAAI,UAAU,GAAG,IAAI;IAIrC;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAehD,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,SAAS;CAIlB;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAK1C"}
1
+ {"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;gBAEjB,cAAc,GAAE,MAAkC;IA4B9D,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,YAAY;IAmCpB;;OAEG;IACI,cAAc,IAAI,IAAI;IAsB7B;;OAEG;IACI,cAAc,IAAI,IAAI;IAmB7B;;OAEG;IACI,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,QAAQ,GAAG,OAAkB,GAAG,IAAI;IAOxE;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAOtD;;;OAGG;IACI,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOpD;;OAEG;IACU,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B1D;;OAEG;IACU,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D;;OAEG;IACU,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAoBlD;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAWzD;;OAEG;IACU,OAAO,CAAC,OAAO,CAAC,EAAE;QAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IAiChB;;OAEG;IACU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B9D;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC;IAuB3C;;OAEG;IACI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAgBlE;;OAEG;IACI,SAAS,IAAI,UAAU,GAAG,IAAI;IAIrC;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAehD,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;CAGnB;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAK1C"}
@@ -76,6 +76,9 @@ export class TileBridge {
76
76
  case 'parent:event':
77
77
  this.handleEvent(message);
78
78
  break;
79
+ case 'parent:navigate':
80
+ this.handleNavigate(message.payload);
81
+ break;
79
82
  default:
80
83
  // Handle custom messages
81
84
  this.emitEvent(message.type, message.payload);
@@ -106,6 +109,26 @@ export class TileBridge {
106
109
  handleEvent(message) {
107
110
  this.emitEvent(message.payload?.type, message.payload?.data);
108
111
  }
112
+ handleNavigate(payload) {
113
+ // Parent is telling us to navigate internally using Next.js router
114
+ if (typeof window === 'undefined')
115
+ return;
116
+ const route = payload?.route;
117
+ if (!route)
118
+ return;
119
+ if (this.isDevelopment() || this.isPreview()) {
120
+ console.log('[TileBridge] Received navigate command:', route);
121
+ }
122
+ // Emit navigate event so the app can handle it with Next.js router
123
+ this.emitEvent('navigate', { route });
124
+ // Also try using window.location if Next.js router isn't available
125
+ // This is a fallback, the app should preferably use the 'navigate' event
126
+ if (window.location.pathname !== route) {
127
+ window.history.pushState({}, '', route);
128
+ // Trigger a popstate event to notify the app
129
+ window.dispatchEvent(new PopStateEvent('popstate', { state: {} }));
130
+ }
131
+ }
109
132
  sendToParent(message) {
110
133
  if (typeof window === 'undefined' || !window.parent)
111
134
  return;
@@ -145,21 +168,37 @@ export class TileBridge {
145
168
  ready: this.ready,
146
169
  parentOrigin: this.parentOrigin,
147
170
  currentOrigin: window.location.origin,
171
+ isInIframe: this.isInIframe(),
172
+ });
173
+ }
174
+ // Emit local navigation event for app to handle with Next.js router
175
+ this.emitEvent('navigate', { route: '/page', target: 'page' });
176
+ // Also send to parent if in iframe (for platform integration)
177
+ if (this.isInIframe()) {
178
+ this.sendToParent({
179
+ type: 'tile:navigate',
180
+ payload: { target: 'page' },
148
181
  });
149
182
  }
150
- this.sendToParent({
151
- type: 'tile:navigate',
152
- payload: { target: 'page' },
153
- });
154
183
  }
155
184
  /**
156
185
  * Request to navigate back to tile view (from page)
157
186
  */
158
187
  navigateToTile() {
159
- this.sendToParent({
160
- type: 'tile:navigate',
161
- payload: { target: 'tile' },
162
- });
188
+ if (this.isDevelopment() || this.isPreview()) {
189
+ console.log('[TileBridge] Requesting navigation to tile', {
190
+ isInIframe: this.isInIframe(),
191
+ });
192
+ }
193
+ // Emit local navigation event for app to handle with Next.js router
194
+ this.emitEvent('navigate', { route: '/tile', target: 'tile' });
195
+ // Also send to parent if in iframe (for platform integration)
196
+ if (this.isInIframe()) {
197
+ this.sendToParent({
198
+ type: 'tile:navigate',
199
+ payload: { target: 'tile' },
200
+ });
201
+ }
163
202
  }
164
203
  /**
165
204
  * Request to open a URL (with user confirmation)
@@ -179,6 +218,16 @@ export class TileBridge {
179
218
  payload: { event: eventName, data },
180
219
  });
181
220
  }
221
+ /**
222
+ * Show or hide the attribution badge
223
+ * Useful for mobile devices (no hover) or when tile needs full attention
224
+ */
225
+ setAttributionVisible(visible) {
226
+ this.sendToParent({
227
+ type: 'tile:set-attribution',
228
+ payload: { visible },
229
+ });
230
+ }
182
231
  /**
183
232
  * Request clipboard write (requires user permission)
184
233
  */
@@ -415,6 +464,9 @@ export class TileBridge {
415
464
  return typeof window !== 'undefined' &&
416
465
  window.location.hostname === 'api.thewhatever.app';
417
466
  }
467
+ isInIframe() {
468
+ return typeof window !== 'undefined' && window.self !== window.top;
469
+ }
418
470
  }
419
471
  // Singleton instance
420
472
  let bridgeInstance = null;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { TileProvider } from './react/TileProvider';
2
2
  export { useTile } from './react/useTile';
3
+ export { useTileNavigation } from './react/useTileNavigation';
3
4
  export { TileContainer } from './react/TileContainer';
4
5
  export { withTile } from './react/withTile';
5
6
  export { getTileBridge, TileBridge } from './bridge/TileBridge';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGnE,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGnE,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // React components and hooks
2
2
  export { TileProvider } from './react/TileProvider';
3
3
  export { useTile } from './react/useTile';
4
+ export { useTileNavigation } from './react/useTileNavigation';
4
5
  export { TileContainer } from './react/TileContainer';
5
6
  export { withTile } from './react/withTile';
6
7
  // Bridge for secure communication
@@ -8,6 +8,7 @@ export interface TileContextValue {
8
8
  navigateToTile: () => void;
9
9
  openUrl: (url: string, target?: '_blank' | '_self') => void;
10
10
  trackEvent: (eventName: string, data?: any) => void;
11
+ setAttributionVisible: (visible: boolean) => void;
11
12
  storage: {
12
13
  get: (key: string) => Promise<any>;
13
14
  set: (key: string, value: any) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"TileProvider.d.ts","sourceRoot":"","sources":["../../src/react/TileProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;KACpC,CAAC;CACH;AAED,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAoDrE"}
1
+ {"version":3,"file":"TileProvider.d.ts","sourceRoot":"","sources":["../../src/react/TileProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;KACpC,CAAC;CACH;AAED,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAmDrE"}
@@ -25,6 +25,7 @@ export function TileProvider({ children, fallback }) {
25
25
  navigateToTile: () => bridge.navigateToTile(),
26
26
  openUrl: (url, target) => bridge.openUrl(url, target),
27
27
  trackEvent: (eventName, data) => bridge.trackEvent(eventName, data),
28
+ setAttributionVisible: (visible) => bridge.setAttributionVisible(visible),
28
29
  storage: {
29
30
  get: (key) => bridge.getStorage(key),
30
31
  set: (key, value) => bridge.setStorage(key, value),
@@ -38,9 +39,8 @@ export function TileProvider({ children, fallback }) {
38
39
  getCurrentUser: () => bridge.getCurrentUser(),
39
40
  },
40
41
  };
41
- // Show fallback while loading
42
- if (!isReady && fallback) {
43
- return React.createElement(React.Fragment, null, fallback);
44
- }
45
- return (React.createElement(TileContext.Provider, { value: contextValue }, children));
42
+ // Always render children immediately - don't wait for config
43
+ // This eliminates the delay before animations start
44
+ // Components can check isReady if they need to wait
45
+ return (React.createElement(TileContext.Provider, { value: contextValue }, !isReady && fallback ? fallback : children));
46
46
  }
@@ -0,0 +1,31 @@
1
+ type AppRouterInstance = {
2
+ push: (href: string) => void;
3
+ replace: (href: string) => void;
4
+ back: () => void;
5
+ };
6
+ interface UseTileNavigationProps {
7
+ router: AppRouterInstance;
8
+ pathname: string;
9
+ }
10
+ /**
11
+ * Hook to integrate TileBridge navigation with Next.js App Router
12
+ *
13
+ * This hook listens for navigation events from TileBridge and uses
14
+ * Next.js router to navigate between /tile and /page routes.
15
+ *
16
+ * Usage in app/layout.tsx with Next.js hooks:
17
+ * ```tsx
18
+ * import { useRouter, usePathname } from 'next/navigation';
19
+ * import { useTileNavigation } from '@thewhateverapp/tile-sdk';
20
+ *
21
+ * function NavigationProvider({ children }) {
22
+ * const router = useRouter();
23
+ * const pathname = usePathname();
24
+ * useTileNavigation({ router, pathname });
25
+ * return <>{children}</>;
26
+ * }
27
+ * ```
28
+ */
29
+ export declare function useTileNavigation({ router, pathname }: UseTileNavigationProps): void;
30
+ export {};
31
+ //# sourceMappingURL=useTileNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTileNavigation.d.ts","sourceRoot":"","sources":["../../src/react/useTileNavigation.ts"],"names":[],"mappings":"AAIA,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,UAAU,sBAAsB;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,sBAAsB,QA8B7E"}
@@ -0,0 +1,49 @@
1
+ import { useEffect } from 'react';
2
+ import { getTileBridge } from '../bridge/TileBridge.js';
3
+ /**
4
+ * Hook to integrate TileBridge navigation with Next.js App Router
5
+ *
6
+ * This hook listens for navigation events from TileBridge and uses
7
+ * Next.js router to navigate between /tile and /page routes.
8
+ *
9
+ * Usage in app/layout.tsx with Next.js hooks:
10
+ * ```tsx
11
+ * import { useRouter, usePathname } from 'next/navigation';
12
+ * import { useTileNavigation } from '@thewhateverapp/tile-sdk';
13
+ *
14
+ * function NavigationProvider({ children }) {
15
+ * const router = useRouter();
16
+ * const pathname = usePathname();
17
+ * useTileNavigation({ router, pathname });
18
+ * return <>{children}</>;
19
+ * }
20
+ * ```
21
+ */
22
+ export function useTileNavigation({ router, pathname }) {
23
+ const bridge = getTileBridge();
24
+ useEffect(() => {
25
+ // Listen for navigation events from TileBridge
26
+ const unsubscribe = bridge.on('navigate', (data) => {
27
+ const targetRoute = data.route;
28
+ if (typeof window !== 'undefined') {
29
+ console.log('[useTileNavigation] Navigation event received:', {
30
+ targetRoute,
31
+ currentPathname: pathname,
32
+ target: data.target,
33
+ });
34
+ }
35
+ // Only navigate if we're not already on the target route
36
+ if (pathname !== targetRoute) {
37
+ console.log('[useTileNavigation] Navigating to:', targetRoute);
38
+ router.push(targetRoute);
39
+ }
40
+ else {
41
+ console.log('[useTileNavigation] Already on target route, skipping navigation');
42
+ }
43
+ });
44
+ // Cleanup
45
+ return () => {
46
+ unsubscribe();
47
+ };
48
+ }, [bridge, router, pathname]);
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thewhateverapp/tile-sdk",
3
- "version": "0.2.6",
3
+ "version": "0.3.0",
4
4
  "description": "SDK for building interactive tiles on The Whatever App platform",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",