@proveanything/smartlinks 2.0.24 → 2.0.26

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.
@@ -1,6 +1,6 @@
1
1
  # Smartlinks API Summary
2
2
 
3
- Version: 2.0.24 | Generated: 2026-09-27T07:52:03.418Z
3
+ Version: 2.0.26 | Generated: 2026-09-28T11:34:04.010Z
4
4
 
5
5
  This is a concise summary of all available API functions and types.
6
6
 
@@ -2293,11 +2293,9 @@ interface PublicViewParams {
2293
2293
  interface PublicView {
2294
2294
  id: string;
2295
2295
  title: string;
2296
- kind: PublicViewKind;
2297
2296
  route?: string;
2298
2297
  set?: Record<string, string>;
2299
2298
  params?: PublicViewParams;
2300
- default?: boolean;
2301
2299
  }
2302
2300
  ```
2303
2301
 
@@ -2373,8 +2371,6 @@ interface GetCollectionWidgetsOptions {
2373
2371
 
2374
2372
  **AppFunctionAuthority** = `'caller' | 'collection'`
2375
2373
 
2376
- **PublicViewKind** = `'contextual' | 'standalone'`
2377
-
2378
2374
  ### appObjects
2379
2375
 
2380
2376
  **PaginatedResponse<T>** (interface)
@@ -334,22 +334,23 @@ See the [Deep Link Discovery guide](deep-link-discovery.md) for the full dual-so
334
334
 
335
335
  #### `publicViews`
336
336
 
337
- Declares the app's **public views** — the soft-routed entries over your single public bundle
338
- (`index.html` → HashRouter): the contextual page, a display board, a kiosk/TV screen, etc. Without
339
- this, those routes/modes are invisible to the platform and the Dev Hub. Each view is a `route` + fixed
340
- `set` params + caller `params` + a `kind`; the `default` **contextual** view is the tag-tap target.
341
- It's delivery-agnostic — the same view renders as a **page** (standalone, self-CSS, hash-routed, embed
342
- in an iframe or open directly) or, for a contextual view, as a **component** (`PublicContainer`).
343
- Not a separate build. (Distinct from `linkable`, which is deep-link discovery.)
337
+ Declares the app's **public views** — **standalone, external screens** served over your single public
338
+ bundle (`index.html` → HashRouter): a display board, a kiosk/TV screen, a dashboard, a public share
339
+ page. Without this, those routes/modes are invisible to the platform and the Dev Hub. Each view is a
340
+ `route` + fixed `set` params + caller `params`.
341
+
342
+ > **Public views are NOT portal.** They are completely external and independent. Their only input is
343
+ > **URL parameters** (often a `collectionId`, as a plain param). They expect **no** portal wrapper, **no**
344
+ > host-managed auth/session, and **no** physical-twin context (no QR/NFC/tag scan). They open at a URL
345
+ > and stand alone. For the two **portal** surfaces — where the app renders *inside* portal, and the
346
+ > entry points portal menus link to — see below.
344
347
 
345
348
  ```json
346
349
  "publicViews": [
347
- { "id": "page", "title": "Product page", "kind": "contextual", "route": "/", "default": true,
348
- "params": { "required": ["collectionId"], "optional": ["productId", "proofId"] } },
349
- { "id": "board", "title": "Display board", "kind": "standalone", "route": "/preview",
350
- "params": { "required": ["collectionId", "appId", "pageId"], "optional": ["orientation"] } },
351
- { "id": "tv", "title": "TV / big screen", "kind": "standalone", "route": "/",
352
- "set": { "tvMode": "true" }, "params": { "required": ["collectionId", "voteId"] } }
350
+ { "id": "board", "title": "Display board", "route": "/display",
351
+ "params": { "required": ["collectionId"], "optional": ["orientation"] } },
352
+ { "id": "tv", "title": "TV / big screen", "route": "/", "set": { "tvMode": "true" },
353
+ "params": { "required": ["collectionId", "voteId"] } }
353
354
  ]
354
355
  ```
355
356
 
@@ -357,14 +358,21 @@ Not a separate build. (Distinct from `linkable`, which is deep-link discovery.)
357
358
  |-------|------|----------|-------------|
358
359
  | `id` | string | ✅ | Stable id, unique within the app |
359
360
  | `title` | string | ✅ | Human label (Dev Hub dropdown, platform pickers) |
360
- | `kind` | `"contextual"` \| `"standalone"` | ✅ | Context-aware (tag-tap) vs full-screen, non-contextual |
361
361
  | `route` | string | ❌ | Hash route within the public bundle (defaults to `"/"`) |
362
362
  | `set` | object | ❌ | Query params this view PINS (e.g. `{ "tvMode": "true" }`), merged under caller params |
363
- | `params` | `{ required?: string[]; optional?: string[] }` | ❌ | The params the caller supplies |
364
- | `default` | boolean | ❌ | The default contextual view — the tag-tap target (at most one) |
363
+ | `params` | `{ required?: string[]; optional?: string[] }` | ❌ | The params the caller supplies via the URL |
364
+
365
+ Read the URL params with **`SL.readContext()`** (merges hash → search) instead of hand-rolling it.
366
+
367
+ ##### Public views vs the two portal surfaces
368
+
369
+ An app can have any combination of three setup styles. Only public views are external:
365
370
 
366
- Read context the same way in every delivery with **`SL.readContext(props?)`** (merges props → hash →
367
- search), instead of hand-rolling the `containerProps || hash || search` chain.
371
+ | Style | Declared by | Lives | Context |
372
+ |-------|-------------|-------|---------|
373
+ | **Portal components** — where the app renders inside portal (collection / product / batch / variant / proof) | module registry `components.*` (set at publish) | Inside portal | Physical twin (QR/NFC scan) |
374
+ | **Portal deep links** — the entry points portal menus/tabs/side-menus link to (e.g. list view vs calendar view) | `linkable` / `DeepLinkEntry` | Inside portal | Portal (menu picks the entry) |
375
+ | **Public views** — standalone external screens | `publicViews` (this block) | Outside portal | URL params only |
368
376
 
369
377
  #### `records`
370
378
 
package/dist/openapi.yaml CHANGED
@@ -18480,8 +18480,6 @@ components:
18480
18480
  type: string
18481
18481
  title:
18482
18482
  type: string
18483
- kind:
18484
- $ref: "#/components/schemas/PublicViewKind"
18485
18483
  route:
18486
18484
  type: string
18487
18485
  set:
@@ -18490,12 +18488,9 @@ components:
18490
18488
  type: string
18491
18489
  params:
18492
18490
  $ref: "#/components/schemas/PublicViewParams"
18493
- default:
18494
- type: boolean
18495
18491
  required:
18496
18492
  - id
18497
18493
  - title
18498
- - kind
18499
18494
  AppManifest:
18500
18495
  type: object
18501
18496
  properties:
@@ -18635,11 +18630,6 @@ components:
18635
18630
  enum:
18636
18631
  - caller
18637
18632
  - collection
18638
- PublicViewKind:
18639
- type: string
18640
- enum:
18641
- - contextual
18642
- - standalone
18643
18633
  PaginatedResponse:
18644
18634
  type: object
18645
18635
  properties:
@@ -485,40 +485,42 @@ export interface AppAdminConfig {
485
485
  * Setup, import, tunable, and metrics configuration lives in a separate
486
486
  * `app.admin.json` file. Use the `admin` field to locate and fetch it.
487
487
  */
488
- /** A public view's kind: context-aware (tag-tap) vs a full-screen, non-contextual screen. */
489
- export type PublicViewKind = 'contextual' | 'standalone';
490
488
  /** The caller-supplied params a public view expects. */
491
489
  export interface PublicViewParams {
492
490
  /** Params the view REQUIRES to render (e.g. `['collectionId','pageId']`). */
493
491
  required?: string[];
494
- /** Params the view can use if present (e.g. `['productId','proofId','orientation']`). */
492
+ /** Params the view can use if present (e.g. `['orientation','theme']`). */
495
493
  optional?: string[];
496
494
  }
497
495
  /**
498
- * A declared PUBLIC VIEW of the app — one soft-routed entry over the single public bundle
499
- * (`index.html` → HashRouter), so the platform + Dev Hub can enumerate and target it instead of
500
- * guessing at undeclared hash routes. A view is `route` + fixed params (`set`) + caller `params` +
501
- * a `kind`. It is a DELIVERY-agnostic description: the same view renders as a `page` (standalone
502
- * HTML, hash-routed, its own CSS — embed in an iframe or open directly) or, for a `contextual` view,
503
- * as a `component` (PublicContainer, props context). NOT a separate build. See
504
- * docs/design/public-views.md. (Distinct from `linkable`/DeepLinkEntry, which is deep-link
505
- * discovery; publicViews is the top-level public-entry taxonomy used for preview + tag-tap routing.)
496
+ * A declared PUBLIC VIEW of the app — a STANDALONE, freeform screen served over the app's single
497
+ * public bundle (`index.html` → HashRouter), enumerable/targetable by the platform + Dev Hub instead
498
+ * of guessing at undeclared hash routes. A view is `route` + fixed params (`set`) + caller `params`.
499
+ *
500
+ * PUBLIC VIEWS ARE NOT PORTAL. They are completely external, independent pages — display boards,
501
+ * projector/kiosk screens, dashboards, public share pages. Their ONLY input is URL parameters (often a
502
+ * `collectionId`, as a plain param). They expect NO portal wrapper, NO host-managed auth/session, and
503
+ * NO physical-twin context (no QR/NFC/tag scan). They open at a URL and stand alone.
504
+ *
505
+ * This is distinct from the two PORTAL-side surfaces, which are declared elsewhere and are context-fed
506
+ * by the physical twin the portal resolves:
507
+ * - WHERE the app renders inside portal (collection/product/batch/variant/proof) → the module
508
+ * registry `components.*` (see prove docs/design/module-registry-fields.md).
509
+ * - The different entry points portal MENUS/TABS/SIDE-MENUS link to (e.g. one app with a list view
510
+ * and a calendar view) → `linkable`/DeepLinkEntry below.
511
+ * See docs/design/public-views.md.
506
512
  */
507
513
  export interface PublicView {
508
514
  /** Stable id, unique within the app. */
509
515
  id: string;
510
516
  /** Human label (Dev Hub dropdown, platform pickers). */
511
517
  title: string;
512
- /** `contextual` (context-aware, tag-tap target) or `standalone` (full-screen display/kiosk). */
513
- kind: PublicViewKind;
514
518
  /** Hash route within the public bundle. Defaults to `/`. */
515
519
  route?: string;
516
520
  /** Query params this view PINS (e.g. `{ tvMode: 'true' }`), merged under the caller's params. */
517
521
  set?: Record<string, string>;
518
- /** The params the caller supplies. */
522
+ /** The params the caller supplies via the URL. */
519
523
  params?: PublicViewParams;
520
- /** The default `contextual` view — the tag-tap target. At most one view sets this. */
521
- default?: boolean;
522
524
  }
523
525
  export interface AppManifest {
524
526
  $schema?: string;
@@ -601,19 +603,22 @@ export interface AppManifest {
601
603
  components: AppContainerComponent[];
602
604
  };
603
605
  /**
604
- * Static deep-linkable states built into this app.
605
- * These are fixed routes that exist regardless of content — declared once at build time.
606
- * Dynamic content entries (e.g. CMS pages) are stored separately in `appConfig.linkable`.
607
- * Consumers should merge both sources to get the full set of navigable states.
606
+ * PORTAL deep-linkable states built into this app — the entry points the portal's menu system
607
+ * (bottom menu, side menus, tabs) can link to. Use these when one app has several ways to enter/load
608
+ * its portal component (e.g. a list view and a calendar view, or a viewer and an editor) that
609
+ * different parts of portal should link to independently. These live INSIDE portal.
610
+ * Fixed routes are declared here at build time; dynamic content entries (e.g. CMS pages) are stored
611
+ * separately in `appConfig.linkable` — merge both for the full navigable set.
608
612
  * @see DeepLinkEntry
609
613
  */
610
614
  linkable?: DeepLinkEntry[];
611
615
  /**
612
- * The app's PUBLIC VIEWS — the soft-routed entries over the single public bundle
613
- * (contextual page, display board, kiosk/TV, …), so the platform + Dev Hub can enumerate,
614
- * preview, and target them. Declares `route` + fixed `set` params + caller `params` + `kind`
615
- * per view; the `default` contextual view is the tag-tap target. See PublicView +
616
- * docs/design/public-views.md.
616
+ * The app's PUBLIC VIEWS — STANDALONE, external screens (display boards, kiosks/TVs, dashboards,
617
+ * public pages) served over the single public bundle, so the platform + Dev Hub can enumerate,
618
+ * preview, and target them. Declares `route` + fixed `set` params + caller `params` per view.
619
+ * NOT portal: no portal wrapper, no host auth/session, no physical-twin context — URL params only.
620
+ * For portal surfaces use `components.*` (where it renders) and `linkable` (portal menu entries).
621
+ * See PublicView + docs/design/public-views.md.
617
622
  */
618
623
  publicViews?: PublicView[];
619
624
  /**
@@ -1,6 +1,6 @@
1
1
  # Smartlinks API Summary
2
2
 
3
- Version: 2.0.24 | Generated: 2026-09-27T07:52:03.418Z
3
+ Version: 2.0.26 | Generated: 2026-09-28T11:34:04.010Z
4
4
 
5
5
  This is a concise summary of all available API functions and types.
6
6
 
@@ -2293,11 +2293,9 @@ interface PublicViewParams {
2293
2293
  interface PublicView {
2294
2294
  id: string;
2295
2295
  title: string;
2296
- kind: PublicViewKind;
2297
2296
  route?: string;
2298
2297
  set?: Record<string, string>;
2299
2298
  params?: PublicViewParams;
2300
- default?: boolean;
2301
2299
  }
2302
2300
  ```
2303
2301
 
@@ -2373,8 +2371,6 @@ interface GetCollectionWidgetsOptions {
2373
2371
 
2374
2372
  **AppFunctionAuthority** = `'caller' | 'collection'`
2375
2373
 
2376
- **PublicViewKind** = `'contextual' | 'standalone'`
2377
-
2378
2374
  ### appObjects
2379
2375
 
2380
2376
  **PaginatedResponse<T>** (interface)
@@ -334,22 +334,23 @@ See the [Deep Link Discovery guide](deep-link-discovery.md) for the full dual-so
334
334
 
335
335
  #### `publicViews`
336
336
 
337
- Declares the app's **public views** — the soft-routed entries over your single public bundle
338
- (`index.html` → HashRouter): the contextual page, a display board, a kiosk/TV screen, etc. Without
339
- this, those routes/modes are invisible to the platform and the Dev Hub. Each view is a `route` + fixed
340
- `set` params + caller `params` + a `kind`; the `default` **contextual** view is the tag-tap target.
341
- It's delivery-agnostic — the same view renders as a **page** (standalone, self-CSS, hash-routed, embed
342
- in an iframe or open directly) or, for a contextual view, as a **component** (`PublicContainer`).
343
- Not a separate build. (Distinct from `linkable`, which is deep-link discovery.)
337
+ Declares the app's **public views** — **standalone, external screens** served over your single public
338
+ bundle (`index.html` → HashRouter): a display board, a kiosk/TV screen, a dashboard, a public share
339
+ page. Without this, those routes/modes are invisible to the platform and the Dev Hub. Each view is a
340
+ `route` + fixed `set` params + caller `params`.
341
+
342
+ > **Public views are NOT portal.** They are completely external and independent. Their only input is
343
+ > **URL parameters** (often a `collectionId`, as a plain param). They expect **no** portal wrapper, **no**
344
+ > host-managed auth/session, and **no** physical-twin context (no QR/NFC/tag scan). They open at a URL
345
+ > and stand alone. For the two **portal** surfaces — where the app renders *inside* portal, and the
346
+ > entry points portal menus link to — see below.
344
347
 
345
348
  ```json
346
349
  "publicViews": [
347
- { "id": "page", "title": "Product page", "kind": "contextual", "route": "/", "default": true,
348
- "params": { "required": ["collectionId"], "optional": ["productId", "proofId"] } },
349
- { "id": "board", "title": "Display board", "kind": "standalone", "route": "/preview",
350
- "params": { "required": ["collectionId", "appId", "pageId"], "optional": ["orientation"] } },
351
- { "id": "tv", "title": "TV / big screen", "kind": "standalone", "route": "/",
352
- "set": { "tvMode": "true" }, "params": { "required": ["collectionId", "voteId"] } }
350
+ { "id": "board", "title": "Display board", "route": "/display",
351
+ "params": { "required": ["collectionId"], "optional": ["orientation"] } },
352
+ { "id": "tv", "title": "TV / big screen", "route": "/", "set": { "tvMode": "true" },
353
+ "params": { "required": ["collectionId", "voteId"] } }
353
354
  ]
354
355
  ```
355
356
 
@@ -357,14 +358,21 @@ Not a separate build. (Distinct from `linkable`, which is deep-link discovery.)
357
358
  |-------|------|----------|-------------|
358
359
  | `id` | string | ✅ | Stable id, unique within the app |
359
360
  | `title` | string | ✅ | Human label (Dev Hub dropdown, platform pickers) |
360
- | `kind` | `"contextual"` \| `"standalone"` | ✅ | Context-aware (tag-tap) vs full-screen, non-contextual |
361
361
  | `route` | string | ❌ | Hash route within the public bundle (defaults to `"/"`) |
362
362
  | `set` | object | ❌ | Query params this view PINS (e.g. `{ "tvMode": "true" }`), merged under caller params |
363
- | `params` | `{ required?: string[]; optional?: string[] }` | ❌ | The params the caller supplies |
364
- | `default` | boolean | ❌ | The default contextual view — the tag-tap target (at most one) |
363
+ | `params` | `{ required?: string[]; optional?: string[] }` | ❌ | The params the caller supplies via the URL |
364
+
365
+ Read the URL params with **`SL.readContext()`** (merges hash → search) instead of hand-rolling it.
366
+
367
+ ##### Public views vs the two portal surfaces
368
+
369
+ An app can have any combination of three setup styles. Only public views are external:
365
370
 
366
- Read context the same way in every delivery with **`SL.readContext(props?)`** (merges props → hash →
367
- search), instead of hand-rolling the `containerProps || hash || search` chain.
371
+ | Style | Declared by | Lives | Context |
372
+ |-------|-------------|-------|---------|
373
+ | **Portal components** — where the app renders inside portal (collection / product / batch / variant / proof) | module registry `components.*` (set at publish) | Inside portal | Physical twin (QR/NFC scan) |
374
+ | **Portal deep links** — the entry points portal menus/tabs/side-menus link to (e.g. list view vs calendar view) | `linkable` / `DeepLinkEntry` | Inside portal | Portal (menu picks the entry) |
375
+ | **Public views** — standalone external screens | `publicViews` (this block) | Outside portal | URL params only |
368
376
 
369
377
  #### `records`
370
378
 
package/openapi.yaml CHANGED
@@ -18480,8 +18480,6 @@ components:
18480
18480
  type: string
18481
18481
  title:
18482
18482
  type: string
18483
- kind:
18484
- $ref: "#/components/schemas/PublicViewKind"
18485
18483
  route:
18486
18484
  type: string
18487
18485
  set:
@@ -18490,12 +18488,9 @@ components:
18490
18488
  type: string
18491
18489
  params:
18492
18490
  $ref: "#/components/schemas/PublicViewParams"
18493
- default:
18494
- type: boolean
18495
18491
  required:
18496
18492
  - id
18497
18493
  - title
18498
- - kind
18499
18494
  AppManifest:
18500
18495
  type: object
18501
18496
  properties:
@@ -18635,11 +18630,6 @@ components:
18635
18630
  enum:
18636
18631
  - caller
18637
18632
  - collection
18638
- PublicViewKind:
18639
- type: string
18640
- enum:
18641
- - contextual
18642
- - standalone
18643
18633
  PaginatedResponse:
18644
18634
  type: object
18645
18635
  properties:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proveanything/smartlinks",
3
- "version": "2.0.24",
3
+ "version": "2.0.26",
4
4
  "description": "Official JavaScript/TypeScript SDK for the Smartlinks API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -65,8 +65,7 @@
65
65
  "author": "Glenn Shoosmith",
66
66
  "license": "MIT",
67
67
  "publishConfig": {
68
- "access": "public",
69
- "tag": "next"
68
+ "access": "public"
70
69
  },
71
70
  "dependencies": {
72
71
  "cross-fetch": "^3.1.5",