@fluid-app/fluid-cli-portal 0.1.61 → 0.1.63

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 (26) hide show
  1. package/authoring/commands.md +242 -0
  2. package/dist/{backend-dev-plugin-20fLk-4t.mjs → backend-dev-plugin-z9IZCHaY.mjs} +2 -2
  3. package/dist/{backend-dev-plugin-20fLk-4t.mjs.map → backend-dev-plugin-z9IZCHaY.mjs.map} +1 -1
  4. package/dist/index.d.mts +571 -423
  5. package/dist/index.d.mts.map +1 -1
  6. package/dist/index.mjs +17 -15
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/{portal-dev-plugin-5BbRo9QT.mjs → portal-dev-plugin-2jZODDsX.mjs} +2 -2
  9. package/dist/{portal-dev-plugin-5BbRo9QT.mjs.map → portal-dev-plugin-2jZODDsX.mjs.map} +1 -1
  10. package/dist/{portal-widget-dev-plugin-NBHcnvFJ.mjs → portal-widget-dev-plugin-Dyp2bVy7.mjs} +3 -3
  11. package/dist/{portal-widget-dev-plugin-NBHcnvFJ.mjs.map → portal-widget-dev-plugin-Dyp2bVy7.mjs.map} +1 -1
  12. package/dist/{pull-BlG6pMwC.mjs → pull-BWnby_pY.mjs} +6287 -2908
  13. package/dist/{pull-BlG6pMwC.mjs.map → pull-BWnby_pY.mjs.map} +1 -1
  14. package/dist/{src-2znVq55R.mjs → src-CQ24GVe6.mjs} +7 -1
  15. package/dist/src-CQ24GVe6.mjs.map +1 -0
  16. package/dist/vite-plugin.mjs +4 -4
  17. package/package.json +6 -5
  18. package/templates/base/.gitignore.template +3 -0
  19. package/templates/base/AGENTS.md +40 -41
  20. package/templates/base/skills/fluid-portal-authoring/SKILL.md +37 -428
  21. package/templates/base/skills/fluid-portal-authoring/references/portal-json.md +46 -0
  22. package/templates/base/skills/fluid-portal-authoring/references/widgets-and-runtime.md +57 -0
  23. package/templates/base/skills/fluid-portal-authoring/references/workflows.md +56 -0
  24. package/templates/starter/.env.example +9 -0
  25. package/templates/starter/README.md.template +99 -169
  26. package/dist/src-2znVq55R.mjs.map +0 -1
package/dist/index.d.mts CHANGED
@@ -1284,761 +1284,909 @@ declare const versionCommand: Command;
1284
1284
  declare const doctorCommand: Command;
1285
1285
  //#endregion
1286
1286
  //#region ../../portal/definition-schema/src/generated/types.d.ts
1287
+ /** JSON scalar value. */
1287
1288
  type JsonPrimitive = string | number | boolean | null;
1289
+ /** Serializable value accepted by portal resources and widget props. */
1288
1290
  type JsonValue = JsonPrimitive | JsonValue[] | JsonObject | PortalWidgetNode;
1291
+ /** Serializable object with arbitrary string keys. */
1289
1292
  interface JsonObject {
1293
+ /** Serializable value stored at this key. */
1290
1294
  readonly [key: string]: JsonValue;
1291
1295
  }
1296
+ /** Semantic color token accepted by widget properties. */
1292
1297
  type ColorOption = "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1298
+ /** Data-source configuration attached to a widget node. */
1293
1299
  interface PortalDataSourceConfig {
1300
+ /** Ordered data-source definitions evaluated for the widget. */
1294
1301
  readonly sources: JsonObject[];
1302
+ /** Loading presentation settings. */
1295
1303
  readonly loading?: {
1296
1304
  readonly showSkeleton?: boolean;
1297
1305
  };
1306
+ /** Failure fallback and retry settings. */
1298
1307
  readonly error?: {
1299
1308
  readonly fallback?: JsonObject;
1300
1309
  readonly retryCount?: number;
1301
1310
  readonly retryDelay?: number;
1302
1311
  };
1303
1312
  }
1313
+ /** Fields shared by built-in and third-party widget nodes. */
1304
1314
  interface PortalWidgetNodeBase {
1315
+ /** Stable node identifier within the screen. */
1305
1316
  readonly id: string;
1317
+ /** Registered widget type. */
1306
1318
  readonly type: string;
1319
+ /** Widget-owned serializable properties. */
1307
1320
  readonly props: JsonObject;
1321
+ /** Optional configuration that populates widget props. */
1308
1322
  readonly dataSource?: PortalDataSourceConfig;
1323
+ /** Zero-based parent layout column. */
1309
1324
  readonly columnIndex?: number;
1310
1325
  }
1326
+ /** Portal node for the AlertWidget built-in widget. */
1311
1327
  interface AlertWidgetNode extends PortalWidgetNodeBase {
1328
+ /** Registered built-in widget type. */
1312
1329
  readonly type: "AlertWidget";
1330
+ /** Properties accepted by this widget. */
1313
1331
  readonly props: {
1314
- titleEnabled?: boolean;
1315
- title?: string;
1316
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1317
- titleFontWeight?: "normal" | "medium" | "semibold" | "bold";
1318
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1319
- titleAlignment?: "left" | "center" | "right";
1320
- description?: string;
1321
- descriptionFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1322
- descriptionFontWeight?: "normal" | "medium" | "semibold" | "bold";
1323
- descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1324
- descriptionAlignment?: "left" | "center" | "right";
1332
+ /** Enable the title displayed above the text */titleEnabled?: boolean; /** The title */
1333
+ title?: string; /** Font size for the title */
1334
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Font weight for the title */
1335
+ titleFontWeight?: "normal" | "medium" | "semibold" | "bold"; /** The color of the title */
1336
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Text alignment for the title */
1337
+ titleAlignment?: "left" | "center" | "right"; /** The text message */
1338
+ description?: string; /** Font size for the text */
1339
+ descriptionFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Font weight for the text */
1340
+ descriptionFontWeight?: "normal" | "medium" | "semibold" | "bold"; /** The color of the text */
1341
+ descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Text alignment for the description */
1342
+ descriptionAlignment?: "left" | "center" | "right"; /** Background for the text container */
1325
1343
  background?: string | {
1326
1344
  type: "solid" | "image";
1327
1345
  color?: ColorOption;
1328
1346
  resource?: string | null | JsonObject;
1329
- };
1330
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1331
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1332
- borderWidth?: "none" | "thin" | "medium" | "thick";
1347
+ }; /** The padding of the text container */
1348
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** The border radius of the text container */
1349
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** The border width of the text container */
1350
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** The border color of the text container */
1333
1351
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1334
1352
  };
1335
1353
  }
1354
+ /** Portal node for the BulletListWidget built-in widget. */
1336
1355
  interface BulletListWidgetNode extends PortalWidgetNodeBase {
1356
+ /** Registered built-in widget type. */
1337
1357
  readonly type: "BulletListWidget";
1358
+ /** Properties accepted by this widget. */
1338
1359
  readonly props: {
1339
- titleEnabled?: boolean;
1340
- title?: string;
1341
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1342
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1343
- listType?: "unordered" | "ordered";
1344
- items?: string[];
1345
- itemFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1346
- itemColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1360
+ /** Enable the title displayed above the list */titleEnabled?: boolean; /** The title */
1361
+ title?: string; /** Font size for the title */
1362
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** The color of the title */
1363
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Ordered (numbered) or unordered (bullets) */
1364
+ listType?: "unordered" | "ordered"; /** Add or remove list items */
1365
+ items?: string[]; /** Font size for list items */
1366
+ itemFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** The color of list items */
1367
+ itemColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background for the list container */
1347
1368
  background?: string | {
1348
1369
  type: "solid" | "image";
1349
1370
  color?: ColorOption;
1350
1371
  resource?: string | null | JsonObject;
1351
- };
1352
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1353
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1354
- borderWidth?: "none" | "thin" | "medium" | "thick";
1355
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1372
+ }; /** The padding of the list container */
1373
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** The border radius of the list container */
1374
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1375
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1376
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Gap between list items */
1356
1377
  gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1357
1378
  };
1358
1379
  }
1380
+ /** Portal node for the CalendarWidget built-in widget. */
1359
1381
  interface CalendarWidgetNode extends PortalWidgetNodeBase {
1382
+ /** Registered built-in widget type. */
1360
1383
  readonly type: "CalendarWidget";
1384
+ /** Properties accepted by this widget. */
1361
1385
  readonly props: {
1362
- titleEnabled?: boolean;
1363
- titleText?: string;
1364
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1365
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1386
+ /** Enable the title displayed above the calendar */titleEnabled?: boolean; /** Title text displayed above the calendar */
1387
+ titleText?: string; /** Font size for the widget title */
1388
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
1389
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background for the calendar container */
1366
1390
  background?: string | {
1367
1391
  type: "solid" | "image";
1368
1392
  color?: ColorOption;
1369
1393
  resource?: string | null | JsonObject;
1370
- };
1371
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1372
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1373
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1374
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1375
- borderWidth?: "none" | "thin" | "medium" | "thick";
1376
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1377
- showYearEyebrow?: boolean;
1378
- showTodayButton?: boolean;
1379
- showEventDensity?: boolean;
1394
+ }; /** Default text color for calendar content */
1395
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Drives today highlight, event dots, Today pill, and selected day */
1396
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Padding around the calendar container */
1397
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the calendar container */
1398
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the calendar container */
1399
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the calendar container */
1400
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Small uppercase year label above the month (e.g. '2026 / November'). */
1401
+ showYearEyebrow?: boolean; /** Show a 'Today' pill when viewing a different month. */
1402
+ showTodayButton?: boolean; /** Show 1–3 dots per day based on event count (off = single dot). */
1403
+ showEventDensity?: boolean; /** Subtly dim the Sun/Sat day-of-week headers for visual rhythm. */
1380
1404
  weekendDim?: boolean;
1381
1405
  };
1382
1406
  }
1407
+ /** Portal node for the CardWidget built-in widget. */
1383
1408
  interface CardWidgetNode extends PortalWidgetNodeBase {
1409
+ /** Registered built-in widget type. */
1384
1410
  readonly type: "CardWidget";
1411
+ /** Properties accepted by this widget. */
1385
1412
  readonly props: {
1386
- headerEnabled?: boolean;
1387
- title?: string;
1388
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1389
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1390
- headerBackground?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1391
- footerEnabled?: boolean;
1392
- footerContent?: string;
1393
- footerColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1394
- footerBackground?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1413
+ /** Toggle header visibility */headerEnabled?: boolean; /** Card title text */
1414
+ title?: string; /** Font size for the title */
1415
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the title */
1416
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background color for the header */
1417
+ headerBackground?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Toggle footer visibility */
1418
+ footerEnabled?: boolean; /** Footer content text */
1419
+ footerContent?: string; /** Color for the footer text */
1420
+ footerColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background color for the footer */
1421
+ footerBackground?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background for the card */
1395
1422
  background?: string | {
1396
1423
  type: "solid" | "image";
1397
1424
  color?: ColorOption;
1398
1425
  resource?: string | null | JsonObject;
1399
- };
1400
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1401
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1402
- borderWidth?: "none" | "thin" | "medium" | "thick";
1403
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1404
- gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1426
+ }; /** Card padding */
1427
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Card border radius */
1428
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Card border width */
1429
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Card border color */
1430
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Gap between child widgets */
1431
+ gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl"; /** Child widget nodes rendered inside this container. */
1405
1432
  children?: Array<PortalWidgetNode | null>;
1406
1433
  };
1407
1434
  }
1435
+ /** Portal node for the CarouselWidget built-in widget. */
1408
1436
  interface CarouselWidgetNode extends PortalWidgetNodeBase {
1437
+ /** Registered built-in widget type. */
1409
1438
  readonly type: "CarouselWidget";
1439
+ /** Properties accepted by this widget. */
1410
1440
  readonly props: {
1411
- editorialFrame?: boolean;
1412
- frameColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1413
- headerSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1414
- headerColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1415
- textSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1416
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1441
+ /** Premium dark canvas with layered shadow and gradient stack. Turn off for a classic transparent carousel. */editorialFrame?: boolean; /** Surface color of the carousel canvas. Drives the frame and gradient overlay. */
1442
+ frameColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Font size for the slide header */
1443
+ headerSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Headline color. Also drives eyebrow, controls and progress bar. */
1444
+ headerColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Font size for the slide text */
1445
+ textSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color variant for the slide text */
1446
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Alignment of the carousel content */
1417
1447
  align?: {
1418
1448
  vertical?: "top" | "center" | "bottom";
1419
1449
  horizontal?: "left" | "center" | "right";
1420
- };
1421
- textWidth?: string;
1422
- carouselHeight?: string;
1423
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1424
- borderWidth?: "none" | "thin" | "medium" | "thick";
1425
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1426
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1427
- overlayEnabled?: boolean;
1428
- overlayType?: "solid" | "gradient";
1429
- overlayIntensity?: number;
1430
- showButton?: boolean;
1431
- buttonColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1432
- buttonSize?: "sm" | "default" | "lg" | "xl";
1433
- enableAutoScroll?: boolean;
1434
- autoScrollInterval?: number;
1450
+ }; /** Maximum width for slide content */
1451
+ textWidth?: string; /** Height of the carousel */
1452
+ carouselHeight?: string; /** Rounded corners for the carousel */
1453
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the carousel container */
1454
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the carousel container */
1455
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Inner padding around slide content */
1456
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Add background overlay to slide content */
1457
+ overlayEnabled?: boolean; /** Overlay style (only applies when editorial frame is off) */
1458
+ overlayType?: "solid" | "gradient"; /** Opacity of the overlay (0-100) */
1459
+ overlayIntensity?: number; /** Global show/hide for all slide CTAs. Per-slide button content is set on each item under the Data tab (custom sources only). */
1460
+ showButton?: boolean; /** Color variant for the slide button */
1461
+ buttonColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of the slide button */
1462
+ buttonSize?: "sm" | "default" | "lg" | "xl"; /** Automatically advance to the next slide. Progress bar fills at this rate and pauses on hover. */
1463
+ enableAutoScroll?: boolean; /** Time between automatic slide transitions */
1464
+ autoScrollInterval?: number; /** Slides rendered by the carousel, usually supplied by a data source. */
1435
1465
  slides?: JsonValue;
1436
1466
  };
1437
1467
  }
1468
+ /** Portal node for the CatchUpWidget built-in widget. */
1438
1469
  interface CatchUpWidgetNode extends PortalWidgetNodeBase {
1470
+ /** Registered built-in widget type. */
1439
1471
  readonly type: "CatchUpWidget";
1472
+ /** Properties accepted by this widget. */
1440
1473
  readonly props: {
1441
- titleEnabled?: boolean;
1442
- titleText?: string;
1443
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1444
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1474
+ /** Enable the title displayed above the catch ups */titleEnabled?: boolean; /** Title text displayed above the catch ups */
1475
+ titleText?: string; /** Font size for the widget title */
1476
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
1477
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background for the container */
1445
1478
  background?: string | {
1446
1479
  type: "solid" | "image";
1447
1480
  color?: ColorOption;
1448
1481
  resource?: string | null | JsonObject;
1449
- };
1450
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1451
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1452
- maxItems?: number;
1453
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1454
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1455
- borderWidth?: "none" | "thin" | "medium" | "thick";
1482
+ }; /** Default text color for catch up items */
1483
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Color used for count display and icons */
1484
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Maximum number of catch ups to display */
1485
+ maxItems?: number; /** Padding around the container */
1486
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the container */
1487
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1488
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1456
1489
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1457
1490
  };
1458
1491
  }
1492
+ /** Portal node for the ChartWidget built-in widget. */
1459
1493
  interface ChartWidgetNode extends PortalWidgetNodeBase {
1494
+ /** Registered built-in widget type. */
1460
1495
  readonly type: "ChartWidget";
1496
+ /** Properties accepted by this widget. */
1461
1497
  readonly props: {
1462
- titleEnabled?: boolean;
1463
- title?: string;
1464
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1465
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1466
- description?: string;
1467
- descriptionFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1468
- descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1469
- chartType?: "bar" | "line" | "area" | "pie";
1470
- showLegend?: boolean;
1471
- showTooltip?: boolean;
1472
- showGrid?: boolean;
1473
- width?: string;
1474
- height?: string;
1498
+ /** Enable the title displayed above the chart */titleEnabled?: boolean; /** The chart title */
1499
+ title?: string; /** Font size for the chart title */
1500
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the chart title */
1501
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** The chart description */
1502
+ description?: string; /** Font size for the chart description */
1503
+ descriptionFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the chart description */
1504
+ descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Type of chart to display */
1505
+ chartType?: "bar" | "line" | "area" | "pie"; /** Display chart legend */
1506
+ showLegend?: boolean; /** Display tooltip on hover */
1507
+ showTooltip?: boolean; /** Display background grid lines */
1508
+ showGrid?: boolean; /** Width of the chart container (CSS value, e.g., 100%, 600px) */
1509
+ width?: string; /** Height of the chart */
1510
+ height?: string; /** Background for the chart container */
1475
1511
  background?: string | {
1476
1512
  type: "solid" | "image";
1477
1513
  color?: ColorOption;
1478
1514
  resource?: string | null | JsonObject;
1479
- };
1480
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1481
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1482
- borderWidth?: "none" | "thin" | "medium" | "thick";
1483
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1484
- dataKey?: "value";
1485
- xAxisKey?: "name";
1486
- data?: JsonValue;
1515
+ }; /** Padding for the chart container */
1516
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the chart container */
1517
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1518
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1519
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Key in the data to use for chart values */
1520
+ dataKey?: "value"; /** Key in the data to use for X-axis labels */
1521
+ xAxisKey?: "name"; /** Records plotted by the chart, usually supplied by a data source. */
1522
+ data?: JsonValue; /** Series labels, colors, and value mappings for the chart data. */
1487
1523
  chartConfig?: JsonValue;
1488
1524
  };
1489
1525
  }
1526
+ /** Portal node for the ContainerWidget built-in widget. */
1490
1527
  interface ContainerWidgetNode extends PortalWidgetNodeBase {
1528
+ /** Registered built-in widget type. */
1491
1529
  readonly type: "ContainerWidget";
1530
+ /** Properties accepted by this widget. */
1492
1531
  readonly props: {
1493
- gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1494
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1532
+ /** Gap between widgets */gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl"; /** Padding for the container */
1533
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Background for the container */
1495
1534
  background?: string | {
1496
1535
  type: "solid" | "image";
1497
1536
  color?: ColorOption;
1498
1537
  resource?: string | null | JsonObject;
1499
- };
1538
+ }; /** Child widget nodes rendered inside this container. */
1500
1539
  children?: Array<PortalWidgetNode | null>;
1501
1540
  };
1502
1541
  }
1542
+ /** Portal node for the EmbedWidget built-in widget. */
1503
1543
  interface EmbedWidgetNode extends PortalWidgetNodeBase {
1544
+ /** Registered built-in widget type. */
1504
1545
  readonly type: "EmbedWidget";
1546
+ /** Properties accepted by this widget. */
1505
1547
  readonly props: {
1506
- url?: string;
1507
- title?: string;
1508
- displayMode?: "inline" | "cover";
1509
- coverResource?: string | null | JsonObject;
1510
- coverUseCustomUrl?: boolean;
1511
- coverImageUrl?: string;
1512
- coverHeight?: string;
1513
- coverShowHeader?: boolean;
1514
- coverHeaderIcon?: "GraduationCap" | "Video" | "BookOpen" | "Globe" | "User" | "Star" | "Heart" | "Trophy" | "Sparkles" | "Zap" | "Gift" | "ShoppingBag" | "Bell" | "Calendar" | "Bookmark";
1515
- coverHeaderIconColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1516
- coverTitle?: string;
1517
- coverMeta?: string;
1518
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1519
- borderWidth?: "none" | "thin" | "medium" | "thick";
1520
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1521
- fullScreen?: boolean;
1522
- height?: string;
1523
- allowFullscreen?: boolean;
1548
+ /** The URL of the external site to embed */url?: string; /** Describes the embed for screen readers and assistive tech. Not visible on the page. */
1549
+ title?: string; /** Inline: iframe renders directly. Cover: shows a card that opens the embed in a full-screen modal. */
1550
+ displayMode?: "inline" | "cover"; /** Select the image shown before the embed opens */
1551
+ coverResource?: string | null | JsonObject; /** Enter a custom image URL instead of selecting media */
1552
+ coverUseCustomUrl?: boolean; /** Direct URL to the cover image */
1553
+ coverImageUrl?: string; /** Height of the cover image area */
1554
+ coverHeight?: string; /** Show the header with icon, title, and action buttons */
1555
+ coverShowHeader?: boolean; /** Icon displayed in the colored badge on the left */
1556
+ coverHeaderIcon?: "GraduationCap" | "Video" | "BookOpen" | "Globe" | "User" | "Star" | "Heart" | "Trophy" | "Sparkles" | "Zap" | "Gift" | "ShoppingBag" | "Bell" | "Calendar" | "Bookmark"; /** Background color of the icon badge */
1557
+ coverHeaderIconColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Title shown in the card header and modal (falls back to the widget Title if empty). Available even when the card header is hidden so the modal still has a meaningful title. */
1558
+ coverTitle?: string; /** Small uppercase meta line below the title (e.g. 'APR 16 · COACHING THE HOSTESS') */
1559
+ coverMeta?: string; /** Border radius for the embed container */
1560
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1561
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1562
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Inline mode: fill the available space instead of a fixed height */
1563
+ fullScreen?: boolean; /** Height of the inline embed iframe */
1564
+ height?: string; /** Allow embedded video/content to use fullscreen mode and show the inline expand control when available */
1565
+ allowFullscreen?: boolean; /** When to load the embedded content (inline mode only) */
1524
1566
  loading?: "lazy" | "eager";
1525
1567
  };
1526
1568
  }
1569
+ /** Portal node for the ImageWidget built-in widget. */
1527
1570
  interface ImageWidgetNode extends PortalWidgetNodeBase {
1571
+ /** Registered built-in widget type. */
1528
1572
  readonly type: "ImageWidget";
1573
+ /** Properties accepted by this widget. */
1529
1574
  readonly props: {
1530
- resource?: string | null | JsonObject;
1531
- useCustomUrl?: boolean;
1532
- src?: string;
1533
- alt?: string;
1534
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1535
- borderWidth?: "none" | "thin" | "medium" | "thick";
1536
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1537
- verticalSizing?: "auto" | "fixed";
1538
- fixedHeight?: string;
1539
- displayFit?: "cover" | "contain";
1540
- focusPoint?: string;
1541
- linkType?: "url" | "screen" | "share";
1542
- href?: string;
1543
- openInNewTab?: boolean;
1544
- screenSlug?: string;
1545
- shareSource?: "resource" | "url";
1546
- shareResource?: string | null | JsonObject;
1575
+ /** Browse and select an image */resource?: string | null | JsonObject; /** Enter a custom image URL instead of selecting media */
1576
+ useCustomUrl?: boolean; /** The source URL of the image */
1577
+ src?: string; /** Alternative text for the image (for accessibility) */
1578
+ alt?: string; /** Border radius for the container */
1579
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1580
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1581
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** How the image height is determined */
1582
+ verticalSizing?: "auto" | "fixed"; /** Fixed height of the image container */
1583
+ fixedHeight?: string; /** How the image fills its container */
1584
+ displayFit?: "cover" | "contain"; /** The focal point of the image within its container */
1585
+ focusPoint?: string; /** Choose whether this link opens a URL, screen, or share action */
1586
+ linkType?: "url" | "screen" | "share"; /** The destination URL */
1587
+ href?: string; /** Whether to open the link in a new tab */
1588
+ openInNewTab?: boolean; /** Select a screen to navigate to */
1589
+ screenSlug?: string; /** Choose whether the share action uses a resource or URL */
1590
+ shareSource?: "resource" | "url"; /** Select content to share */
1591
+ shareResource?: string | null | JsonObject; /** The URL to share */
1547
1592
  shareUrl?: string;
1548
1593
  };
1549
1594
  }
1595
+ /** Portal node for the LayoutWidget built-in widget. */
1550
1596
  interface LayoutWidgetNode extends PortalWidgetNodeBase {
1597
+ /** Registered built-in widget type. */
1551
1598
  readonly type: "LayoutWidget";
1599
+ /** Properties accepted by this widget. */
1552
1600
  readonly props: {
1553
- sectionLayout?: "single-column" | "2c-equal" | "2c-left-wider" | "2c-right-wider" | "2c-left-narrow" | "2c-right-narrow" | "3c-equal" | "3c-middle-wider";
1554
- gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1601
+ /** Column layout configuration */sectionLayout?: "single-column" | "2c-equal" | "2c-left-wider" | "2c-right-wider" | "2c-left-narrow" | "2c-right-narrow" | "3c-equal" | "3c-middle-wider"; /** Gap between columns and widgets */
1602
+ gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl"; /** Background for the layout container */
1555
1603
  background?: string | {
1556
1604
  type: "solid" | "image";
1557
1605
  color?: ColorOption;
1558
1606
  resource?: string | null | JsonObject;
1559
- };
1560
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1561
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1562
- borderWidth?: "none" | "thin" | "medium" | "thick";
1563
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1607
+ }; /** Padding for the layout container */
1608
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the layout container */
1609
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1610
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1611
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Child widget nodes rendered inside this container. */
1564
1612
  children?: Array<PortalWidgetNode | null>;
1565
1613
  };
1566
1614
  }
1615
+ /** Portal node for the LinkWidget built-in widget. */
1567
1616
  interface LinkWidgetNode extends PortalWidgetNodeBase {
1617
+ /** Registered built-in widget type. */
1568
1618
  readonly type: "LinkWidget";
1619
+ /** Properties accepted by this widget. */
1569
1620
  readonly props: {
1570
- linkType?: "url" | "screen" | "share";
1571
- text?: string;
1572
- href?: string;
1573
- openInNewTab?: boolean;
1574
- screenSlug?: string;
1575
- shareSource?: "resource" | "url";
1576
- shareResource?: string | null | JsonObject;
1577
- shareUrl?: string;
1578
- variant?: "default" | "outline" | "secondary" | "ghost" | "destructive";
1579
- size?: "sm" | "default" | "lg" | "xl";
1580
- fontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1581
- underline?: boolean;
1582
- alignment?: "left" | "center" | "right";
1583
- fullWidth?: boolean;
1584
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1585
- borderRadiusTL?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1586
- borderRadiusTR?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1587
- borderRadiusBL?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1588
- borderRadiusBR?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1589
- borderWidth?: "none" | "thin" | "medium" | "thick";
1621
+ /** Choose whether this button opens a URL, screen, or share action */linkType?: "url" | "screen" | "share"; /** The button label text */
1622
+ text?: string; /** The destination URL */
1623
+ href?: string; /** Whether to open the link in a new tab */
1624
+ openInNewTab?: boolean; /** Select a screen to navigate to */
1625
+ screenSlug?: string; /** Choose whether the share action uses a resource or URL */
1626
+ shareSource?: "resource" | "url"; /** Select content to share */
1627
+ shareResource?: string | null | JsonObject; /** The URL to share */
1628
+ shareUrl?: string; /** The visual style of the button */
1629
+ variant?: "default" | "outline" | "secondary" | "ghost" | "destructive"; /** The size of the button */
1630
+ size?: "sm" | "default" | "lg" | "xl"; /** The font size of the button text */
1631
+ fontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Underline the button text */
1632
+ underline?: boolean; /** Horizontal alignment of the button */
1633
+ alignment?: "left" | "center" | "right"; /** Makes the button stretch to full container width */
1634
+ fullWidth?: boolean; /** Outer container padding */
1635
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Corner radius of the link button (borderRadiusTL corner). */
1636
+ borderRadiusTL?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Corner radius of the link button (borderRadiusTR corner). */
1637
+ borderRadiusTR?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Corner radius of the link button (borderRadiusBL corner). */
1638
+ borderRadiusBL?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Corner radius of the link button (borderRadiusBR corner). */
1639
+ borderRadiusBR?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1640
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1590
1641
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1591
1642
  };
1592
1643
  }
1644
+ /** Portal node for the ListWidget built-in widget. */
1593
1645
  interface ListWidgetNode extends PortalWidgetNodeBase {
1646
+ /** Registered built-in widget type. */
1594
1647
  readonly type: "ListWidget";
1648
+ /** Properties accepted by this widget. */
1595
1649
  readonly props: {
1596
- titleEnabled?: boolean;
1597
- title?: string;
1598
- titleSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1599
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1600
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1601
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1602
- borderWidth?: "none" | "thin" | "medium" | "thick";
1603
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1604
- gap?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1650
+ /** Enable the title displayed above the list */titleEnabled?: boolean; /** Header text for the list */
1651
+ title?: string; /** Size of the list title */
1652
+ titleSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the list title */
1653
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Padding inside the container */
1654
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Rounded corners for the container and images */
1655
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1656
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1657
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Spacing between items */
1658
+ gap?: "none" | "xs" | "sm" | "md" | "lg" | "xl"; /** Background color or image for the widget */
1605
1659
  background?: string | {
1606
1660
  type: "solid" | "image";
1607
1661
  color?: ColorOption;
1608
1662
  resource?: string | null | JsonObject;
1609
- };
1610
- listType?: "unordered" | "ordered";
1611
- maxItems?: number;
1612
- imageAspectRatio?: "square" | "landscape" | "portrait";
1613
- showBadge?: boolean;
1614
- showMetaText?: boolean;
1615
- columns?: number;
1616
- scrollAxis?: "horizontal" | "vertical";
1617
- numberColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1618
- numberSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1619
- itemTitleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1620
- itemTitleSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1621
- descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1622
- descriptionSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1623
- priceColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1624
- priceSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1625
- originalPriceColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1626
- metaTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1627
- metaTextSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1628
- showFeaturedSection?: boolean;
1629
- featuredAsset?: string | null | JsonObject;
1630
- featuredTitle?: string;
1631
- featuredSubtitle?: string;
1632
- featuredButtonText?: string;
1633
- featuredButtonUrl?: string;
1634
- featuredSubtitleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1635
- featuredSubtitleSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1663
+ }; /** Type of list layout */
1664
+ listType?: "unordered" | "ordered"; /** Maximum number of items to display */
1665
+ maxItems?: number; /** Aspect ratio for item images (unordered list — ordered layouts use a fixed ratio per axis) */
1666
+ imageAspectRatio?: "square" | "landscape" | "portrait"; /** Display discount badge on images */
1667
+ showBadge?: boolean; /** Display QV and CV values */
1668
+ showMetaText?: boolean; /** Number of columns in the grid (unordered list only) */
1669
+ columns?: number; /** Direction for ordered list scrolling */
1670
+ scrollAxis?: "horizontal" | "vertical"; /** Color for ordered list numbers */
1671
+ numberColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of ordered list numbers (vertical scroll only — horizontal uses a fixed editorial size) */
1672
+ numberSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for item titles */
1673
+ itemTitleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of item titles */
1674
+ itemTitleSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for descriptions */
1675
+ descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of descriptions */
1676
+ descriptionSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for prices */
1677
+ priceColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of prices */
1678
+ priceSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for crossed-out original prices */
1679
+ originalPriceColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Color for QV/CV text */
1680
+ metaTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of QV/CV text */
1681
+ metaTextSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Display a featured content section */
1682
+ showFeaturedSection?: boolean; /** Select a single image or video resource for the featured section */
1683
+ featuredAsset?: string | null | JsonObject; /** Title for featured section */
1684
+ featuredTitle?: string; /** Subtitle for featured section */
1685
+ featuredSubtitle?: string; /** Text for featured section button */
1686
+ featuredButtonText?: string; /** URL for featured section button */
1687
+ featuredButtonUrl?: string; /** Color for featured subtitle */
1688
+ featuredSubtitleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Size of featured subtitle */
1689
+ featuredSubtitleSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Items rendered by the list, usually supplied by a data source. */
1636
1690
  items?: JsonValue;
1637
1691
  };
1638
1692
  }
1693
+ /** Portal node for the MySiteWidget built-in widget. */
1639
1694
  interface MySiteWidgetNode extends PortalWidgetNodeBase {
1695
+ /** Registered built-in widget type. */
1640
1696
  readonly type: "MySiteWidget";
1697
+ /** Properties accepted by this widget. */
1641
1698
  readonly props: {
1642
- showPreview?: boolean;
1643
- showAnalytics?: boolean;
1644
- showLiveBadge?: boolean;
1645
- showQR?: boolean;
1699
+ /** Show the live iframe preview of the storefront */showPreview?: boolean; /** Visitors and Leads grid in the footer */
1700
+ showAnalytics?: boolean; /** Small 'Live' chip in the preview corner */
1701
+ showLiveBadge?: boolean; /** Show a scannable QR code in the card footer */
1702
+ showQR?: boolean; /** Background for the widget container */
1646
1703
  background?: string | {
1647
1704
  type: "solid" | "image";
1648
1705
  color?: ColorOption;
1649
1706
  resource?: string | null | JsonObject;
1650
- };
1651
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1652
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1707
+ }; /** Primary text, hairline, and neutral chip color */
1708
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Drives the Live dot, conversion ring, and Visit CTA */
1709
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Corner radius for the widget and inner chips */
1653
1710
  borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1654
1711
  };
1655
1712
  }
1713
+ /** Portal node for the NestedWidget built-in widget. */
1656
1714
  interface NestedWidgetNode extends PortalWidgetNodeBase {
1715
+ /** Registered built-in widget type. */
1657
1716
  readonly type: "NestedWidget";
1717
+ /** Properties accepted by this widget. */
1658
1718
  readonly props: {
1659
- resource?: string | null | JsonObject;
1660
- titleEnabled?: boolean;
1661
- titleText?: string;
1662
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1663
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1664
- primaryMediaHeight?: string;
1719
+ /** Select the primary media displayed in the large panel */resource?: string | null | JsonObject; /** Enable the title displayed over the primary media */
1720
+ titleEnabled?: boolean; /** Main title displayed over the primary media */
1721
+ titleText?: string; /** Font size for the widget title */
1722
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
1723
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Height of the primary media container */
1724
+ primaryMediaHeight?: string; /** Alignment of the content inside the primary media */
1665
1725
  titleAlignment?: {
1666
1726
  vertical?: "top" | "center" | "bottom";
1667
1727
  horizontal?: "left" | "center" | "right";
1668
- };
1669
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1670
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1671
- borderWidth?: "none" | "thin" | "medium" | "thick";
1672
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1673
- overlayEnabled?: boolean;
1674
- overlayType?: "solid" | "gradient";
1675
- overlayIntensity?: number;
1676
- gap?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1677
- nestedTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1728
+ }; /** Padding used throughout the widget */
1729
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Rounded corners for the widget */
1730
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1731
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1732
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Add a dark overlay to the primary media for better text readability */
1733
+ overlayEnabled?: boolean; /** Type of overlay effect */
1734
+ overlayType?: "solid" | "gradient"; /** Opacity of the overlay (0-100) */
1735
+ overlayIntensity?: number; /** Gap between nested media items */
1736
+ gap?: "none" | "xs" | "sm" | "md" | "lg" | "xl"; /** Color for nested media labels */
1737
+ nestedTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background color for nested media container */
1678
1738
  background?: string | {
1679
1739
  type: "solid" | "image";
1680
1740
  color?: ColorOption;
1681
1741
  resource?: string | null | JsonObject;
1682
- };
1742
+ }; /** Shareable records rendered in the nested content region. */
1683
1743
  shareables?: JsonValue;
1684
1744
  };
1685
1745
  }
1746
+ /** Portal node for the PointsWidget built-in widget. */
1686
1747
  interface PointsWidgetNode extends PortalWidgetNodeBase {
1748
+ /** Registered built-in widget type. */
1687
1749
  readonly type: "PointsWidget";
1750
+ /** Properties accepted by this widget. */
1688
1751
  readonly props: {
1689
- titleEnabled?: boolean;
1690
- title?: string;
1691
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1692
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1693
- balanceColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1694
- historyEnabled?: boolean;
1695
- historyTitle?: string;
1752
+ /** Toggle title visibility */titleEnabled?: boolean; /** Title text displayed above the balance. Leave blank to use the company's configured points label. */
1753
+ title?: string; /** Font size for the title */
1754
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the title */
1755
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Color for the points balance number */
1756
+ balanceColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Show a collapsible history dropdown below the balance */
1757
+ historyEnabled?: boolean; /** Title for the history dropdown */
1758
+ historyTitle?: string; /** Background for the widget */
1696
1759
  background?: string | {
1697
1760
  type: "solid" | "image";
1698
1761
  color?: ColorOption;
1699
1762
  resource?: string | null | JsonObject;
1700
- };
1701
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1702
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1703
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1704
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1705
- borderWidth?: "none" | "thin" | "medium" | "thick";
1763
+ }; /** Default text color */
1764
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Color for positive points amounts */
1765
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Widget padding */
1766
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Widget border radius */
1767
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Widget border width */
1768
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Widget border color */
1706
1769
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1707
1770
  };
1708
1771
  }
1772
+ /** Portal node for the QuickLinksWidget built-in widget. */
1709
1773
  interface QuickLinksWidgetNode extends PortalWidgetNodeBase {
1774
+ /** Registered built-in widget type. */
1710
1775
  readonly type: "QuickLinksWidget";
1776
+ /** Properties accepted by this widget. */
1711
1777
  readonly props: {
1712
- titleEnabled?: boolean;
1713
- title?: string;
1714
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1715
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1716
- link1Label?: string;
1717
- link1Url?: string;
1718
- link1Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1719
- link1Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1720
- link2Enabled?: boolean;
1721
- link2Label?: string;
1722
- link2Url?: string;
1723
- link2Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1724
- link2Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1725
- link3Enabled?: boolean;
1726
- link3Label?: string;
1727
- link3Url?: string;
1728
- link3Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1729
- link3Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1730
- link4Enabled?: boolean;
1731
- link4Label?: string;
1732
- link4Url?: string;
1733
- link4Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1734
- link4Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1735
- link5Enabled?: boolean;
1736
- link5Label?: string;
1737
- link5Url?: string;
1738
- link5Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1739
- link5Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1740
- link6Enabled?: boolean;
1741
- link6Label?: string;
1742
- link6Url?: string;
1743
- link6Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1744
- link6Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1745
- link7Enabled?: boolean;
1746
- link7Label?: string;
1747
- link7Url?: string;
1748
- link7Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1749
- link7Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1750
- link8Enabled?: boolean;
1751
- link8Label?: string;
1752
- link8Url?: string;
1753
- link8Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles";
1754
- link8Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1755
- layout?: "cards" | "list";
1756
- iconRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1757
- showChevron?: boolean;
1758
- openInNewTab?: boolean;
1778
+ /** Small heading shown above the link list */titleEnabled?: boolean; /** Heading shown above the links */
1779
+ title?: string; /** Font size for the widget title */
1780
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
1781
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Text shown on the link */
1782
+ link1Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1783
+ link1Url?: string; /** Icon displayed in the colored badge */
1784
+ link1Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1785
+ link1Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 2 */
1786
+ link2Enabled?: boolean; /** Text shown on the link */
1787
+ link2Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1788
+ link2Url?: string; /** Icon displayed in the colored badge */
1789
+ link2Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1790
+ link2Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 3 */
1791
+ link3Enabled?: boolean; /** Text shown on the link */
1792
+ link3Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1793
+ link3Url?: string; /** Icon displayed in the colored badge */
1794
+ link3Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1795
+ link3Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 4 */
1796
+ link4Enabled?: boolean; /** Text shown on the link */
1797
+ link4Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1798
+ link4Url?: string; /** Icon displayed in the colored badge */
1799
+ link4Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1800
+ link4Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 5 */
1801
+ link5Enabled?: boolean; /** Text shown on the link */
1802
+ link5Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1803
+ link5Url?: string; /** Icon displayed in the colored badge */
1804
+ link5Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1805
+ link5Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 6 */
1806
+ link6Enabled?: boolean; /** Text shown on the link */
1807
+ link6Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1808
+ link6Url?: string; /** Icon displayed in the colored badge */
1809
+ link6Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1810
+ link6Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 7 */
1811
+ link7Enabled?: boolean; /** Text shown on the link */
1812
+ link7Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1813
+ link7Url?: string; /** Icon displayed in the colored badge */
1814
+ link7Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1815
+ link7Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display link slot 8 */
1816
+ link8Enabled?: boolean; /** Text shown on the link */
1817
+ link8Label?: string; /** Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path. */
1818
+ link8Url?: string; /** Icon displayed in the colored badge */
1819
+ link8Icon?: "Link" | "User" | "Share2" | "ShoppingBag" | "Video" | "Mail" | "MessageCircle" | "Globe" | "Calendar" | "Bell" | "Heart" | "Star" | "Zap" | "Gift" | "Phone" | "MapPin" | "Play" | "Package" | "ExternalLink" | "Bookmark" | "Trophy" | "Sparkles"; /** Color of the icon badge */
1820
+ link8Color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Cards: separated tiles. List: grouped rows with dividers. */
1821
+ layout?: "cards" | "list"; /** Corner radius for the colored icon badge */
1822
+ iconRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Right-aligned chevron indicating each row is a link */
1823
+ showChevron?: boolean; /** Open links in a new tab instead of the same window */
1824
+ openInNewTab?: boolean; /** Background for the widget container */
1759
1825
  background?: string | {
1760
1826
  type: "solid" | "image";
1761
1827
  color?: ColorOption;
1762
1828
  resource?: string | null | JsonObject;
1763
- };
1764
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1765
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1766
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1767
- borderWidth?: "none" | "thin" | "medium" | "thick";
1829
+ }; /** Label + chevron color, and the base for row backgrounds (via opacity) */
1830
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Padding around the widget */
1831
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Widget border radius (also drives row corners in cards layout) */
1832
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Widget border width */
1833
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Widget border color */
1768
1834
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1769
1835
  };
1770
1836
  }
1837
+ /** Portal node for the QuickShareWidget built-in widget. */
1771
1838
  interface QuickShareWidgetNode extends PortalWidgetNodeBase {
1839
+ /** Registered built-in widget type. */
1772
1840
  readonly type: "QuickShareWidget";
1841
+ /** Properties accepted by this widget. */
1773
1842
  readonly props: {
1774
- shareableResource?: string | null | JsonObject;
1775
- titleEnabled?: boolean;
1776
- titleText?: string;
1777
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1778
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1779
- showResourceType?: boolean;
1780
- showShareActions?: boolean;
1781
- showDomainPrefix?: boolean;
1782
- showBuyButton?: boolean;
1783
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1784
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1785
- overlayEnabled?: boolean;
1786
- overlayType?: "gradient" | "solid";
1787
- overlayIntensity?: number;
1788
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1789
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1790
- borderWidth?: "none" | "thin" | "medium" | "thick";
1843
+ /** Select the content to generate a share link for */shareableResource?: string | null | JsonObject; /** Display a title on the hero */
1844
+ titleEnabled?: boolean; /** Custom title text (defaults to the resource title if empty) */
1845
+ titleText?: string; /** Font size for the title */
1846
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the title */
1847
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display a small type eyebrow chip (Product · Page · Media…) */
1848
+ showResourceType?: boolean; /** Show Email, Text, and native Share buttons under the link chip */
1849
+ showShareActions?: boolean; /** Include the domain in the link chip (dimmed) with the path emphasized */
1850
+ showDomainPrefix?: boolean; /** Display the Buy button (only shown for Product resources) */
1851
+ showBuyButton?: boolean; /** Default text color for widget content (over the hero) */
1852
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Drives the price chip, primary button, and copy-success flash */
1853
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Add editorial gradient stack for legibility over the hero */
1854
+ overlayEnabled?: boolean; /** Gradient only (recommended) or gradient + solid wash (heavier) */
1855
+ overlayType?: "gradient" | "solid"; /** Opacity of the overlay (0-100) */
1856
+ overlayIntensity?: number; /** Padding around the widget content */
1857
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the widget container */
1858
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget container */
1859
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget container */
1791
1860
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1792
1861
  };
1793
1862
  }
1863
+ /** Portal node for the RecentActivityWidget built-in widget. */
1794
1864
  interface RecentActivityWidgetNode extends PortalWidgetNodeBase {
1865
+ /** Registered built-in widget type. */
1795
1866
  readonly type: "RecentActivityWidget";
1867
+ /** Properties accepted by this widget. */
1796
1868
  readonly props: {
1797
- titleEnabled?: boolean;
1798
- titleText?: string;
1799
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1800
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1801
- showEyebrow?: boolean;
1802
- showCountChip?: boolean;
1803
- maxItemsToShow?: number;
1804
- showRelativeTime?: boolean;
1869
+ /** Display the title and eyebrow above the feed */titleEnabled?: boolean; /** Title text displayed above the activity feed */
1870
+ titleText?: string; /** Font size for the widget title */
1871
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
1872
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Small uppercase label above the title */
1873
+ showEyebrow?: boolean; /** Accent pill next to the title showing how many updates */
1874
+ showCountChip?: boolean; /** Maximum number of activity items to display */
1875
+ maxItemsToShow?: number; /** Show 'now / 2m / 1h / 3d' instead of absolute times */
1876
+ showRelativeTime?: boolean; /** Background for the widget container */
1805
1877
  background?: string | {
1806
1878
  type: "solid" | "image";
1807
1879
  color?: ColorOption;
1808
1880
  resource?: string | null | JsonObject;
1809
- };
1810
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1811
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1812
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1813
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1814
- borderWidth?: "none" | "thin" | "medium" | "thick";
1881
+ }; /** Default text color for activity content */
1882
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Drives the count chip, type badge, initials avatar, and empty-state icon */
1883
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Padding around the widget container */
1884
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the widget container */
1885
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget container */
1886
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget container */
1815
1887
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1816
1888
  };
1817
1889
  }
1890
+ /** Portal node for the SeparatorWidget built-in widget. */
1818
1891
  interface SeparatorWidgetNode extends PortalWidgetNodeBase {
1892
+ /** Registered built-in widget type. */
1819
1893
  readonly type: "SeparatorWidget";
1894
+ /** Properties accepted by this widget. */
1820
1895
  readonly props: {
1821
- orientation?: "horizontal" | "vertical";
1822
- color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1823
- thickness?: string;
1824
- width?: string;
1825
- marginTop?: 0 | 2 | 4 | 6 | 8 | 10;
1896
+ /** Direction of the separator line */orientation?: "horizontal" | "vertical"; /** Color of the separator line */
1897
+ color?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Thickness of the separator line */
1898
+ thickness?: string; /** Width of the separator */
1899
+ width?: string; /** Space above the separator */
1900
+ marginTop?: 0 | 2 | 4 | 6 | 8 | 10; /** Space below the separator */
1826
1901
  marginBottom?: 0 | 2 | 4 | 6 | 8 | 10;
1827
1902
  };
1828
1903
  }
1904
+ /** Portal node for the ShopWidget built-in widget. */
1829
1905
  interface ShopWidgetNode extends PortalWidgetNodeBase {
1906
+ /** Registered built-in widget type. */
1830
1907
  readonly type: "ShopWidget";
1908
+ /** Properties accepted by this widget. */
1831
1909
  readonly props: {
1832
- titleEnabled?: boolean;
1833
- title?: string;
1834
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1835
- showSearch?: boolean;
1836
- showSort?: boolean;
1837
- columns?: 2 | 3 | 4 | 5 | 6;
1910
+ /** Enable the heading shown above the grid */titleEnabled?: boolean; /** Heading text shown above the grid */
1911
+ title?: string; /** Color of the heading text */
1912
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Display the search input above the grid */
1913
+ showSearch?: boolean; /** Display the sort menu above the grid */
1914
+ showSort?: boolean; /** Max columns at the largest breakpoint. Narrow widgets show 2 columns; wider containers scale up smoothly to the chosen maximum. */
1915
+ columns?: 2 | 3 | 4 | 5 | 6; /** Container background */
1838
1916
  background?: string | {
1839
1917
  type: "solid" | "image";
1840
1918
  color?: ColorOption;
1841
1919
  resource?: string | null | JsonObject;
1842
- };
1843
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1844
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1845
- cardBackground?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1846
- cardTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1847
- useDataSource?: boolean;
1848
- pageSize?: number;
1920
+ }; /** Inner spacing around the grid */
1921
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Container corner radius */
1922
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Override the card background color. Leave unset to use the theme's card color. */
1923
+ cardBackground?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Override title + price color inside each card. Leave unset to use the theme's foreground color. */
1924
+ cardTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Off shows all products from the catalog. On replaces the catalog with a data source — disables search and sort. */
1925
+ useDataSource?: boolean; /** Up to 10 acts as a hard cap. Above 10 the grid switches to infinite scroll (products load in batches of 10 as you scroll). */
1926
+ pageSize?: number; /** Products rendered in the shop grid, usually supplied by a data source. */
1849
1927
  products?: JsonValue;
1850
1928
  };
1851
1929
  }
1930
+ /** Portal node for the SpacerWidget built-in widget. */
1852
1931
  interface SpacerWidgetNode extends PortalWidgetNodeBase {
1932
+ /** Registered built-in widget type. */
1853
1933
  readonly type: "SpacerWidget";
1934
+ /** Properties accepted by this widget. */
1854
1935
  readonly props: {
1855
- customHeight?: string;
1936
+ /** Height of the spacer */customHeight?: string;
1856
1937
  };
1857
1938
  }
1939
+ /** Portal node for the TableWidget built-in widget. */
1858
1940
  interface TableWidgetNode extends PortalWidgetNodeBase {
1941
+ /** Registered built-in widget type. */
1859
1942
  readonly type: "TableWidget";
1943
+ /** Properties accepted by this widget. */
1860
1944
  readonly props: {
1861
- titleEnabled?: boolean;
1862
- titleText?: string;
1863
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1864
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1945
+ /** Enable the title displayed above the table */titleEnabled?: boolean; /** Title text displayed above the table */
1946
+ titleText?: string; /** Font size for the widget title */
1947
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
1948
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background for the table container */
1865
1949
  background?: string | {
1866
1950
  type: "solid" | "image";
1867
1951
  color?: ColorOption;
1868
1952
  resource?: string | null | JsonObject;
1869
- };
1870
- alternatingColorEnabled?: boolean;
1871
- headerBackgroundColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1872
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1873
- headerTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1874
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1875
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1876
- borderWidth?: "none" | "thin" | "medium" | "thick";
1877
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1878
- filterEnabled?: boolean;
1879
- sortingEnabled?: boolean;
1880
- paginationEnabled?: boolean;
1881
- maxRowsPerPage?: number;
1882
- data?: JsonValue;
1953
+ }; /** Enable alternating colors for table rows */
1954
+ alternatingColorEnabled?: boolean; /** Background color for the table header */
1955
+ headerBackgroundColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Default text color for table content */
1956
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Text color for the table header */
1957
+ headerTextColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Padding around the table container */
1958
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the table container */
1959
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
1960
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1961
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Show global search and column filters */
1962
+ filterEnabled?: boolean; /** Allow sorting by clicking column headers */
1963
+ sortingEnabled?: boolean; /** Split data into pages */
1964
+ paginationEnabled?: boolean; /** Maximum number of rows to display per page */
1965
+ maxRowsPerPage?: number; /** Rows rendered by the table, usually supplied by a data source. */
1966
+ data?: JsonValue; /** Column definitions used to label and read values from each row. */
1883
1967
  columns?: JsonValue;
1884
1968
  };
1885
1969
  }
1970
+ /** Portal node for the TextWidget built-in widget. */
1886
1971
  interface TextWidgetNode extends PortalWidgetNodeBase {
1972
+ /** Registered built-in widget type. */
1887
1973
  readonly type: "TextWidget";
1974
+ /** Properties accepted by this widget. */
1888
1975
  readonly props: {
1889
- titleEnabled?: boolean;
1890
- title?: string;
1891
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1892
- titleFontWeight?: "normal" | "medium" | "semibold" | "bold";
1893
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1894
- titleAlignment?: "left" | "center" | "right";
1895
- description?: string;
1896
- descriptionFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1897
- descriptionFontWeight?: "normal" | "medium" | "semibold" | "bold";
1898
- descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1899
- descriptionAlignment?: "left" | "center" | "right";
1976
+ /** Enable the title displayed above the text */titleEnabled?: boolean; /** The title */
1977
+ title?: string; /** Font size for the title */
1978
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Font weight for the title */
1979
+ titleFontWeight?: "normal" | "medium" | "semibold" | "bold"; /** The color of the title */
1980
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Text alignment for the title */
1981
+ titleAlignment?: "left" | "center" | "right"; /** The text message */
1982
+ description?: string; /** Font size for the text */
1983
+ descriptionFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Font weight for the text */
1984
+ descriptionFontWeight?: "normal" | "medium" | "semibold" | "bold"; /** The color of the text */
1985
+ descriptionColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Text alignment for the description */
1986
+ descriptionAlignment?: "left" | "center" | "right"; /** Background for the text container */
1900
1987
  background?: string | {
1901
1988
  type: "solid" | "image";
1902
1989
  color?: ColorOption;
1903
1990
  resource?: string | null | JsonObject;
1904
- };
1905
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1906
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1907
- borderWidth?: "none" | "thin" | "medium" | "thick";
1991
+ }; /** The padding of the text container */
1992
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** The border radius of the text container */
1993
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** The border width of the text container */
1994
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** The border color of the text container */
1908
1995
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1909
1996
  };
1910
1997
  }
1998
+ /** Portal node for the ToDoWidget built-in widget. */
1911
1999
  interface ToDoWidgetNode extends PortalWidgetNodeBase {
2000
+ /** Registered built-in widget type. */
1912
2001
  readonly type: "ToDoWidget";
2002
+ /** Properties accepted by this widget. */
1913
2003
  readonly props: {
1914
- titleEnabled?: boolean;
1915
- titleText?: string;
1916
- titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs";
1917
- titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
2004
+ /** Enable the title displayed above the todo list */titleEnabled?: boolean; /** Title text displayed above the todo list */
2005
+ titleText?: string; /** Font size for the widget title */
2006
+ titleFontSize?: "2xl" | "xl" | "lg" | "md" | "sm" | "xs"; /** Color for the widget title */
2007
+ titleColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Background for the widget container */
1918
2008
  background?: string | {
1919
2009
  type: "solid" | "image";
1920
2010
  color?: ColorOption;
1921
2011
  resource?: string | null | JsonObject;
1922
- };
1923
- textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1924
- accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1925
- maxItems?: number;
1926
- padding?: 0 | 2 | 4 | 6 | 8 | 10;
1927
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1928
- borderWidth?: "none" | "thin" | "medium" | "thick";
2012
+ }; /** Default text color for todo items */
2013
+ textColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Color used for count badge and icon */
2014
+ accentColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Maximum number of todo items to display */
2015
+ maxItems?: number; /** Padding around the widget container */
2016
+ padding?: 0 | 2 | 4 | 6 | 8 | 10; /** Border radius for the widget container */
2017
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
2018
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
1929
2019
  borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1930
2020
  };
1931
2021
  }
2022
+ /** Portal node for the VideoWidget built-in widget. */
1932
2023
  interface VideoWidgetNode extends PortalWidgetNodeBase {
2024
+ /** Registered built-in widget type. */
1933
2025
  readonly type: "VideoWidget";
2026
+ /** Properties accepted by this widget. */
1934
2027
  readonly props: {
1935
- resource?: string | null | JsonObject;
1936
- useCustomUrl?: boolean;
1937
- src?: string;
1938
- poster?: string;
1939
- displayMode?: "inline" | "card";
1940
- title?: string;
1941
- tagline?: string;
1942
- eyebrow?: string;
1943
- tag?: string;
1944
- duration?: string;
1945
- author?: string;
1946
- date?: string;
1947
- editorialFrame?: boolean;
1948
- frameColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1949
- showFullscreenPill?: boolean;
1950
- primaryCtaText?: string;
1951
- primaryCtaLink?: string;
1952
- secondaryCtaText?: string;
1953
- secondaryCtaLink?: string;
1954
- borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1955
- borderWidth?: "none" | "thin" | "medium" | "thick";
1956
- borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1957
- verticalSizing?: "auto" | "fixed";
1958
- fixedHeight?: string;
1959
- displayFit?: "cover" | "contain";
1960
- focusPoint?: string;
1961
- controls?: boolean;
1962
- autoplay?: boolean;
1963
- loop?: boolean;
2028
+ /** Browse and select a video */resource?: string | null | JsonObject; /** Enter a custom video URL instead of selecting media. */
2029
+ useCustomUrl?: boolean; /** Direct video URL for inline mode. Card mode supports YouTube, Vimeo, and direct video URLs. */
2030
+ src?: string; /** Thumbnail shown before play. Card mode can auto-derive YouTube thumbnails; add a poster for Vimeo URLs. */
2031
+ poster?: string; /** Inline: native player embedded in the page. Card: premium thumbnail that opens a modal. */
2032
+ displayMode?: "inline" | "card"; /** Headline on the card thumbnail (card mode only). */
2033
+ title?: string; /** Short body line under the title. */
2034
+ tagline?: string; /** Small label above the card (e.g. 'Training · Fluid Academy'). */
2035
+ eyebrow?: string; /** Optional pill label. */
2036
+ tag?: string; /** Runtime (e.g. '4:52' or '1:09:30'). Shown as a chip. */
2037
+ duration?: string; /** Meta line author. */
2038
+ author?: string; /** Meta line date (e.g. 'Apr 12'). */
2039
+ date?: string; /** Premium dark canvas with layered shadow and dual gradient overlays. */
2040
+ editorialFrame?: boolean; /** Surface color for the card and modal. */
2041
+ frameColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** Show the 'Full screen' hover hint on the card. */
2042
+ showFullscreenPill?: boolean; /** Primary button in the modal footer (optional). */
2043
+ primaryCtaText?: string; /** URL for the primary CTA. */
2044
+ primaryCtaLink?: string; /** Secondary (ghost) button in the modal footer (optional). */
2045
+ secondaryCtaText?: string; /** URL for the secondary CTA. */
2046
+ secondaryCtaLink?: string; /** Border radius for the video container */
2047
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full"; /** Border width for the widget */
2048
+ borderWidth?: "none" | "thin" | "medium" | "thick"; /** Border color for the widget */
2049
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent"; /** How the video height is determined (inline mode only) */
2050
+ verticalSizing?: "auto" | "fixed"; /** Fixed height of the video container */
2051
+ fixedHeight?: string; /** How the video fills its container */
2052
+ displayFit?: "cover" | "contain"; /** The focal point of the video within its container */
2053
+ focusPoint?: string; /** Display video playback controls (inline mode only — card mode always shows controls in the modal). */
2054
+ controls?: boolean; /** Automatically start playing the video */
2055
+ autoplay?: boolean; /** Repeat the video when it ends */
2056
+ loop?: boolean; /** Start with audio muted */
1964
2057
  muted?: boolean;
1965
2058
  };
1966
2059
  }
2060
+ /** Any registered built-in portal widget node. */
1967
2061
  type PortalBuiltinWidgetNode = AlertWidgetNode | BulletListWidgetNode | CalendarWidgetNode | CardWidgetNode | CarouselWidgetNode | CatchUpWidgetNode | ChartWidgetNode | ContainerWidgetNode | EmbedWidgetNode | ImageWidgetNode | LayoutWidgetNode | LinkWidgetNode | ListWidgetNode | MySiteWidgetNode | NestedWidgetNode | PointsWidgetNode | QuickLinksWidgetNode | QuickShareWidgetNode | RecentActivityWidgetNode | SeparatorWidgetNode | ShopWidgetNode | SpacerWidgetNode | TableWidgetNode | TextWidgetNode | ToDoWidgetNode | VideoWidgetNode;
2062
+ /** Portal node supplied by a company or Droplet widget package. */
2063
+ /** Exact consent grant for third-party widget network access. */
1968
2064
  interface PortalNetworkAccessGrant {
2065
+ /** Canonical package identifier approved for network access. */
1969
2066
  readonly packageId: string;
2067
+ /** Exact package version approved for network access. */
1970
2068
  readonly packageVersion: string;
2069
+ /** Exact network capability contract version approved. */
1971
2070
  readonly capabilityVersion: string;
1972
2071
  }
1973
2072
  interface PortalThirdPartyWidgetNode extends PortalWidgetNodeBase {
2073
+ /** Namespaced owner, package key, and widget name. */
1974
2074
  readonly type: `company.${string}.${string}` | `droplet.${string}.${string}`;
2075
+ /** Package-defined serializable widget properties. */
1975
2076
  readonly props: JsonObject;
2077
+ /** Placement-specific consent grants for third-party capabilities. */
1976
2078
  readonly capabilityGrants?: {
1977
2079
  readonly networkAccess?: PortalNetworkAccessGrant;
1978
2080
  };
1979
2081
  }
2082
+ /** Any built-in or third-party portal widget node. */
1980
2083
  type PortalWidgetNode = PortalBuiltinWidgetNode | PortalThirdPartyWidgetNode;
2084
+ /** Portal screen resource. */
1981
2085
  interface PortalScreen {
2086
+ /** Versioned schema URL. */
1982
2087
  readonly $schema?: string;
2088
+ /** Human-readable screen name. */
1983
2089
  readonly name: string;
2090
+ /** Zero or one root widget nodes. */
1984
2091
  readonly component_tree: PortalWidgetNode[];
1985
2092
  }
2093
+ /** Base and foreground OKLCH colors for a semantic theme role. */
1986
2094
  interface PortalThemeColor {
2095
+ /** Base OKLCH color. */
1987
2096
  readonly base: {
1988
2097
  readonly l: number;
1989
2098
  readonly c: number;
1990
2099
  readonly h: number;
1991
2100
  };
2101
+ /** Foreground OKLCH color. */
1992
2102
  readonly foreground: {
1993
2103
  readonly l: number;
1994
2104
  readonly c: number;
1995
2105
  readonly h: number;
1996
2106
  };
1997
2107
  }
2108
+ /** Complete structured portal theme configuration. */
1998
2109
  interface PortalThemeConfig {
2110
+ /** Stable theme configuration identifier. */
1999
2111
  readonly id: string;
2112
+ /** Human-readable configuration name. */
2000
2113
  readonly name: string;
2114
+ /** Required light-mode semantic colors. */
2001
2115
  readonly light: Readonly<Record<"background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "destructive", PortalThemeColor>>;
2116
+ /** Optional dark-mode semantic color overrides. */
2002
2117
  readonly dark: Readonly<Partial<Record<"background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "destructive", {
2003
2118
  readonly base?: PortalThemeColor["base"];
2004
2119
  readonly foreground?: PortalThemeColor["foreground"];
2005
2120
  }>>>;
2121
+ /** Named font-size tokens. */
2006
2122
  readonly fontSizes: Readonly<Record<"extraSmall" | "small" | "regular" | "large" | "extraLarge" | "giant", string>>;
2123
+ /** Heading and body font families. */
2007
2124
  readonly fontFamilies: Readonly<Record<"header" | "body", string>>;
2125
+ /** Base spacing token. */
2008
2126
  readonly spacing: string;
2127
+ /** Named border-radius tokens. */
2009
2128
  readonly radii: Readonly<Record<"small" | "medium" | "large" | "extraLarge", string>>;
2129
+ /** Whether Fluid brand colors update semantic colors. */
2010
2130
  readonly syncWithBrandColors?: boolean;
2011
2131
  }
2132
+ /** Portal theme resource. */
2012
2133
  interface PortalTheme {
2134
+ /** Versioned schema URL. */
2013
2135
  readonly $schema?: string;
2136
+ /** Human-readable theme name. */
2014
2137
  readonly name: string;
2138
+ /** Complete structured theme configuration. */
2015
2139
  readonly config: PortalThemeConfig;
2140
+ /** Whether the theme is active. */
2016
2141
  readonly active: boolean;
2017
2142
  }
2143
+ /** Navigation entry that can contain nested entries. */
2018
2144
  interface PortalNavigationItem {
2145
+ /** Remote item identifier, when assigned. */
2019
2146
  readonly id?: number;
2147
+ /** Display icon identifier. */
2020
2148
  readonly icon: string | null;
2149
+ /** Display label. */
2021
2150
  readonly label: string | null;
2151
+ /** Referenced screen resource slug. */
2022
2152
  readonly screen: string | null;
2153
+ /** Stable navigation item slug. */
2023
2154
  readonly slug: string | null;
2155
+ /** Fluid navigation source classification. */
2024
2156
  readonly source: string;
2157
+ /** Item ordering position. */
2025
2158
  readonly position: number | null;
2159
+ /** Parent item identifier, or null at the root. */
2026
2160
  readonly parent_id: number | null;
2161
+ /** Nested navigation entries. */
2027
2162
  readonly children: PortalNavigationItem[];
2028
2163
  }
2164
+ /** Web or mobile navigation resource. */
2029
2165
  interface PortalNavigation {
2166
+ /** Versioned schema URL. */
2030
2167
  readonly $schema?: string;
2168
+ /** Human-readable navigation name. */
2031
2169
  readonly name: string;
2170
+ /** Platform that uses this navigation. */
2032
2171
  readonly platform: "web" | "mobile";
2172
+ /** Ordered top-level navigation entries. */
2033
2173
  readonly navigation_items: PortalNavigationItem[];
2034
2174
  }
2175
+ /** Portal member profile resource. */
2035
2176
  interface PortalProfile {
2177
+ /** Versioned schema URL. */
2036
2178
  readonly $schema?: string;
2179
+ /** Human-readable profile name. */
2037
2180
  readonly name: string;
2181
+ /** Whether this is the fallback profile. */
2038
2182
  readonly default: boolean;
2183
+ /** Web navigation resource slug. */
2039
2184
  readonly navigation: string | null;
2185
+ /** Mobile navigation resource slug. */
2040
2186
  readonly mobile_navigation: string | null;
2187
+ /** Theme resource slugs available to this profile. */
2041
2188
  readonly themes: string[];
2189
+ /** Member attributes used for profile matching. */
2042
2190
  readonly permissions: {
2043
2191
  readonly ranks: number[];
2044
2192
  readonly roles: string[];