@absolutejs/absolute 0.20.0-beta.25 → 0.20.0-beta.27

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.
package/README.md CHANGED
@@ -138,7 +138,10 @@ export default defineConfig({
138
138
  },
139
139
  // With @absolutejs/auth + syncSocket(), this provisions the existing
140
140
  // HTTP-only web session and durable IndexedDB transport automatically.
141
- sync: true
141
+ sync: true,
142
+ // Optional: importing pushNotifications enables this automatically.
143
+ // The public key defaults to VAPID_PUBLIC_KEY at build time.
144
+ push: true
142
145
  }
143
146
  });
144
147
  ```
@@ -150,6 +153,14 @@ browser offers it, while online/focus/visibility resume remains the correctness
150
153
  path. Native Capacitor clients continue to use their Bearer and SQLite
151
154
  transport; no web cookie or token is copied into the worker.
152
155
 
156
+ Portable push uses the same `pushNotifications` API in the browser and a
157
+ Capacitor shell. AbsoluteJS generates Web Push registration and subscription
158
+ rotation against the same-origin `/auth/push` route. Configure the trusted
159
+ server once with `auth({ push: { registrar, tenant, topics } })`; Auth derives
160
+ identity, tenant, and authorized topics, while page code never receives APNs,
161
+ FCM, or Web Push credentials. Only the public VAPID key enters browser output;
162
+ keep `VAPID_PRIVATE_KEY` in the server-side Dispatch sender.
163
+
153
164
  `@absolutejs/pwa/client` also exposes `onPwaSyncResult()` and
154
165
  `getLastPwaSyncResult()` (plus the `absolute:pwa-sync-result` DOM event) for
155
166
  application-owned diagnostics. Results contain only success, duration, trigger,
@@ -207,11 +218,26 @@ does not silently replace a running application session.
207
218
  Application code uses one provider-neutral API in web pages and Capacitor apps:
208
219
 
209
220
  ```ts
210
- import { camera, clipboard, haptics, photos, share } from '@absolutejs/devices';
221
+ import {
222
+ camera,
223
+ clipboard,
224
+ haptics,
225
+ keyboard,
226
+ photos,
227
+ share,
228
+ systemBars
229
+ } from '@absolutejs/devices';
211
230
 
212
231
  await clipboard.writeText('Copied everywhere');
213
232
  await share.share({ text: 'Shared everywhere', url: 'https://absolutejs.com' });
214
233
  await haptics.impact('light');
234
+ const removeKeyboard = await keyboard.onChange(({ visible, heightPx }) => {
235
+ document.documentElement.style.setProperty(
236
+ '--keyboard-height',
237
+ visible ? `${heightPx}px` : '0px'
238
+ );
239
+ });
240
+ await systemBars.setAppearance('light', 'status');
215
241
  const permission = await camera.requestPermission();
216
242
  if (permission.state === 'granted') {
217
243
  const capture = await camera.takePhoto();
@@ -228,6 +254,12 @@ edit Swift/Kotlin, or maintain native bootstrap code. Type-only imports and test
228
254
  sources do not provision plugins. `absolute mobile doctor release` rejects a
229
255
  missing or mismatched plugin before release.
230
256
 
257
+ `keyboard` provides portable visibility, CSS-pixel height, dismissal, and
258
+ cleanup-safe change events. `systemBars` controls modern edge-to-edge status and
259
+ navigation bar foreground appearance/visibility through Capacitor 8 core. Its
260
+ `light` and `dark` values name the icon/text foreground. Web appearance uses
261
+ best-effort `color-scheme`; browser chrome visibility reports unsupported.
262
+
231
263
  Camera capture requires an explicit `camera.requestPermission()` call from an
232
264
  intentional user action. `photos.pick()` uses the item-scoped system picker
233
265
  without requesting broad library access. AbsoluteJS generates the required iOS
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-Dk4lqA/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-09Sxpi/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-Dk4lqA/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-09Sxpi/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -48,7 +48,7 @@ var warnMissingStreamingSlotCollector = (primitiveName) => {
48
48
  getWarningController()?.maybeWarn(primitiveName);
49
49
  };
50
50
 
51
- // .angular-partial-tmp-Dk4lqA/src/core/streamingSlotRegistry.ts
51
+ // .angular-partial-tmp-09Sxpi/src/core/streamingSlotRegistry.ts
52
52
  var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
53
53
  var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
54
54
  var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";