@fluid-app/fluid-cli-portal 0.1.57 → 0.1.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -811,8 +811,8 @@ type FluidOsHeyApiClient = Client;
811
811
  /**
812
812
  * Any valid JSON value for provider, integration, theme, metadata, or other dynamic payloads whose keys are not fixed by the API contract.
813
813
  */
814
- type JsonValue = string | number | boolean | null | Array<JsonValue> | {
815
- [key: string]: JsonValue;
814
+ type JsonValue$1 = string | number | boolean | null | Array<JsonValue$1> | {
815
+ [key: string]: JsonValue$1;
816
816
  };
817
817
  /**
818
818
  * FluidOS::NavigationItem
@@ -884,7 +884,7 @@ type FluidOsProfile = {
884
884
  * Dynamic Fluid OS JSON payload whose keys are defined by the app builder configuration.
885
885
  */
886
886
  type FluidOsDynamicPayload = {
887
- [key: string]: JsonValue;
887
+ [key: string]: JsonValue$1;
888
888
  } | null;
889
889
  //#endregion
890
890
  //#region src/utils/mappings.d.ts
@@ -957,6 +957,14 @@ declare function removeMapping(mappings: PortalMappings, resourceType: MappedRes
957
957
  type FileHash = string;
958
958
  /** Map of relative file paths to their content hashes. */
959
959
  type FileHashMap = Record<string, FileHash>;
960
+ interface SnapshotNetworkWidgetGrant {
961
+ readonly widgetId: string;
962
+ readonly widgetType: string;
963
+ readonly packageId: string;
964
+ readonly packageVersion: string;
965
+ readonly capabilityVersion: string;
966
+ }
967
+ type SnapshotNetworkWidgetGrantMap = Readonly<Record<string, readonly SnapshotNetworkWidgetGrant[]>>;
960
968
  /** Snapshot structure persisted to `.portal-sync/snapshot.json`. */
961
969
  interface Snapshot {
962
970
  /** Human-readable name of the portal definition. */
@@ -967,6 +975,8 @@ interface Snapshot {
967
975
  readonly pulled_at: string;
968
976
  /** Map of relative file paths → SHA-256 hashes. */
969
977
  readonly files: FileHashMap;
978
+ /** Network-enabled widget nodes present at the last successful sync. */
979
+ readonly network_widget_grants?: SnapshotNetworkWidgetGrantMap;
970
980
  }
971
981
  /** Result of diffing current files against a snapshot. */
972
982
  interface SnapshotDiff {
@@ -1039,6 +1049,8 @@ interface ValidationError {
1039
1049
  * Extract the slug from a file path (e.g., "screens/home.json" -> "home").
1040
1050
  */
1041
1051
  declare function slugFromPath(filePath: string): string;
1052
+ /** Validate every managed local portal file against the canonical schemas. */
1053
+ declare function validatePortalSchemas(portalDir: string): Promise<ValidationError[]>;
1042
1054
  /**
1043
1055
  * Categorize a snapshot diff into resource-type-specific change lists.
1044
1056
  */
@@ -1047,9 +1059,7 @@ declare function categorizeChanges(diff: SnapshotDiff): CategorizedChanges;
1047
1059
  * Validate that all cross-references between local portal files are valid.
1048
1060
  *
1049
1061
  * Checks:
1050
- * - New and changed resources contain the required local-file fields
1051
- * - Every widget node in a changed screen has a string "id" and "type"
1052
- * - New and changed themes include the required config object
1062
+ * - Widget IDs remain unique within each changed screen
1053
1063
  * - Navigation items' "screen" slugs reference existing screen files or mappings
1054
1064
  * - Profile "navigation" and "mobile_navigation" slugs reference existing nav files or mappings
1055
1065
  * - Profile "themes" slugs reference existing theme files or mappings
@@ -1273,23 +1283,739 @@ declare const versionCommand: Command;
1273
1283
  //#region src/commands/doctor.d.ts
1274
1284
  declare const doctorCommand: Command;
1275
1285
  //#endregion
1276
- //#region src/utils/transform.d.ts
1277
- type ApiScreen = FluidOsScreen;
1278
- type ApiTheme = FluidOsTheme;
1279
- type ApiNavigationBasic = FluidOsNavigationBasic;
1280
- type ApiNavigationItem = FluidOsNavigationItem;
1281
- type ApiProfile = FluidOsProfile;
1282
- interface LocalScreen {
1286
+ //#region ../../portal/definition-schema/src/generated/types.d.ts
1287
+ type JsonPrimitive = string | number | boolean | null;
1288
+ type JsonValue = JsonPrimitive | JsonValue[] | JsonObject | PortalWidgetNode;
1289
+ interface JsonObject {
1290
+ readonly [key: string]: JsonValue;
1291
+ }
1292
+ type ColorOption = "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1293
+ interface PortalDataSourceConfig {
1294
+ readonly sources: JsonObject[];
1295
+ readonly loading?: {
1296
+ readonly showSkeleton?: boolean;
1297
+ };
1298
+ readonly error?: {
1299
+ readonly fallback?: JsonObject;
1300
+ readonly retryCount?: number;
1301
+ readonly retryDelay?: number;
1302
+ };
1303
+ }
1304
+ interface PortalWidgetNodeBase {
1305
+ readonly id: string;
1306
+ readonly type: string;
1307
+ readonly props: JsonObject;
1308
+ readonly dataSource?: PortalDataSourceConfig;
1309
+ readonly columnIndex?: number;
1310
+ }
1311
+ interface AlertWidgetNode extends PortalWidgetNodeBase {
1312
+ readonly type: "AlertWidget";
1313
+ 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";
1325
+ background?: string | {
1326
+ type: "solid" | "image";
1327
+ color?: ColorOption;
1328
+ 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";
1333
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1334
+ };
1335
+ }
1336
+ interface BulletListWidgetNode extends PortalWidgetNodeBase {
1337
+ readonly type: "BulletListWidget";
1338
+ 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";
1347
+ background?: string | {
1348
+ type: "solid" | "image";
1349
+ color?: ColorOption;
1350
+ 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";
1356
+ gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1357
+ };
1358
+ }
1359
+ interface CalendarWidgetNode extends PortalWidgetNodeBase {
1360
+ readonly type: "CalendarWidget";
1361
+ 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";
1366
+ background?: string | {
1367
+ type: "solid" | "image";
1368
+ color?: ColorOption;
1369
+ 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;
1380
+ weekendDim?: boolean;
1381
+ };
1382
+ }
1383
+ interface CardWidgetNode extends PortalWidgetNodeBase {
1384
+ readonly type: "CardWidget";
1385
+ 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";
1395
+ background?: string | {
1396
+ type: "solid" | "image";
1397
+ color?: ColorOption;
1398
+ 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";
1405
+ children?: Array<PortalWidgetNode | null>;
1406
+ };
1407
+ }
1408
+ interface CarouselWidgetNode extends PortalWidgetNodeBase {
1409
+ readonly type: "CarouselWidget";
1410
+ 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";
1417
+ align?: {
1418
+ vertical?: "top" | "center" | "bottom";
1419
+ 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;
1435
+ slides?: JsonValue;
1436
+ };
1437
+ }
1438
+ interface CatchUpWidgetNode extends PortalWidgetNodeBase {
1439
+ readonly type: "CatchUpWidget";
1440
+ 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";
1445
+ background?: string | {
1446
+ type: "solid" | "image";
1447
+ color?: ColorOption;
1448
+ 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";
1456
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1457
+ };
1458
+ }
1459
+ interface ChartWidgetNode extends PortalWidgetNodeBase {
1460
+ readonly type: "ChartWidget";
1461
+ 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;
1475
+ background?: string | {
1476
+ type: "solid" | "image";
1477
+ color?: ColorOption;
1478
+ 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;
1487
+ chartConfig?: JsonValue;
1488
+ };
1489
+ }
1490
+ interface ContainerWidgetNode extends PortalWidgetNodeBase {
1491
+ readonly type: "ContainerWidget";
1492
+ readonly props: {
1493
+ gapSize?: "none" | "xs" | "sm" | "md" | "lg" | "xl";
1494
+ padding?: 0 | 2 | 4 | 6 | 8 | 10;
1495
+ background?: string | {
1496
+ type: "solid" | "image";
1497
+ color?: ColorOption;
1498
+ resource?: string | null | JsonObject;
1499
+ };
1500
+ children?: Array<PortalWidgetNode | null>;
1501
+ };
1502
+ }
1503
+ interface EmbedWidgetNode extends PortalWidgetNodeBase {
1504
+ readonly type: "EmbedWidget";
1505
+ 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;
1524
+ loading?: "lazy" | "eager";
1525
+ };
1526
+ }
1527
+ interface ImageWidgetNode extends PortalWidgetNodeBase {
1528
+ readonly type: "ImageWidget";
1529
+ 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;
1547
+ shareUrl?: string;
1548
+ };
1549
+ }
1550
+ interface LayoutWidgetNode extends PortalWidgetNodeBase {
1551
+ readonly type: "LayoutWidget";
1552
+ 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";
1555
+ background?: string | {
1556
+ type: "solid" | "image";
1557
+ color?: ColorOption;
1558
+ 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";
1564
+ children?: Array<PortalWidgetNode | null>;
1565
+ };
1566
+ }
1567
+ interface LinkWidgetNode extends PortalWidgetNodeBase {
1568
+ readonly type: "LinkWidget";
1569
+ 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";
1590
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1591
+ };
1592
+ }
1593
+ interface ListWidgetNode extends PortalWidgetNodeBase {
1594
+ readonly type: "ListWidget";
1595
+ 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";
1605
+ background?: string | {
1606
+ type: "solid" | "image";
1607
+ color?: ColorOption;
1608
+ 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";
1636
+ items?: JsonValue;
1637
+ };
1638
+ }
1639
+ interface MySiteWidgetNode extends PortalWidgetNodeBase {
1640
+ readonly type: "MySiteWidget";
1641
+ readonly props: {
1642
+ showPreview?: boolean;
1643
+ showAnalytics?: boolean;
1644
+ showLiveBadge?: boolean;
1645
+ showQR?: boolean;
1646
+ background?: string | {
1647
+ type: "solid" | "image";
1648
+ color?: ColorOption;
1649
+ 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";
1653
+ borderRadius?: "none" | "sm" | "md" | "lg" | "xl" | "full";
1654
+ };
1655
+ }
1656
+ interface NestedWidgetNode extends PortalWidgetNodeBase {
1657
+ readonly type: "NestedWidget";
1658
+ 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;
1665
+ titleAlignment?: {
1666
+ vertical?: "top" | "center" | "bottom";
1667
+ 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";
1678
+ background?: string | {
1679
+ type: "solid" | "image";
1680
+ color?: ColorOption;
1681
+ resource?: string | null | JsonObject;
1682
+ };
1683
+ shareables?: JsonValue;
1684
+ };
1685
+ }
1686
+ interface PointsWidgetNode extends PortalWidgetNodeBase {
1687
+ readonly type: "PointsWidget";
1688
+ 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;
1696
+ background?: string | {
1697
+ type: "solid" | "image";
1698
+ color?: ColorOption;
1699
+ 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";
1706
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1707
+ };
1708
+ }
1709
+ interface QuickLinksWidgetNode extends PortalWidgetNodeBase {
1710
+ readonly type: "QuickLinksWidget";
1711
+ 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;
1759
+ background?: string | {
1760
+ type: "solid" | "image";
1761
+ color?: ColorOption;
1762
+ 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";
1768
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1769
+ };
1770
+ }
1771
+ interface QuickShareWidgetNode extends PortalWidgetNodeBase {
1772
+ readonly type: "QuickShareWidget";
1773
+ 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";
1791
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1792
+ };
1793
+ }
1794
+ interface RecentActivityWidgetNode extends PortalWidgetNodeBase {
1795
+ readonly type: "RecentActivityWidget";
1796
+ 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;
1805
+ background?: string | {
1806
+ type: "solid" | "image";
1807
+ color?: ColorOption;
1808
+ 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";
1815
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1816
+ };
1817
+ }
1818
+ interface SeparatorWidgetNode extends PortalWidgetNodeBase {
1819
+ readonly type: "SeparatorWidget";
1820
+ 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;
1826
+ marginBottom?: 0 | 2 | 4 | 6 | 8 | 10;
1827
+ };
1828
+ }
1829
+ interface ShopWidgetNode extends PortalWidgetNodeBase {
1830
+ readonly type: "ShopWidget";
1831
+ 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;
1838
+ background?: string | {
1839
+ type: "solid" | "image";
1840
+ color?: ColorOption;
1841
+ 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;
1849
+ products?: JsonValue;
1850
+ };
1851
+ }
1852
+ interface SpacerWidgetNode extends PortalWidgetNodeBase {
1853
+ readonly type: "SpacerWidget";
1854
+ readonly props: {
1855
+ customHeight?: string;
1856
+ };
1857
+ }
1858
+ interface TableWidgetNode extends PortalWidgetNodeBase {
1859
+ readonly type: "TableWidget";
1860
+ 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";
1865
+ background?: string | {
1866
+ type: "solid" | "image";
1867
+ color?: ColorOption;
1868
+ 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;
1883
+ columns?: JsonValue;
1884
+ };
1885
+ }
1886
+ interface TextWidgetNode extends PortalWidgetNodeBase {
1887
+ readonly type: "TextWidget";
1888
+ 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";
1900
+ background?: string | {
1901
+ type: "solid" | "image";
1902
+ color?: ColorOption;
1903
+ 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";
1908
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1909
+ };
1910
+ }
1911
+ interface ToDoWidgetNode extends PortalWidgetNodeBase {
1912
+ readonly type: "ToDoWidget";
1913
+ 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";
1918
+ background?: string | {
1919
+ type: "solid" | "image";
1920
+ color?: ColorOption;
1921
+ 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";
1929
+ borderColor?: "background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "border" | "destructive" | "transparent";
1930
+ };
1931
+ }
1932
+ interface VideoWidgetNode extends PortalWidgetNodeBase {
1933
+ readonly type: "VideoWidget";
1934
+ 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;
1964
+ muted?: boolean;
1965
+ };
1966
+ }
1967
+ 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;
1968
+ interface PortalNetworkAccessGrant {
1969
+ readonly packageId: string;
1970
+ readonly packageVersion: string;
1971
+ readonly capabilityVersion: string;
1972
+ }
1973
+ interface PortalThirdPartyWidgetNode extends PortalWidgetNodeBase {
1974
+ readonly type: `company.${string}.${string}` | `droplet.${string}.${string}`;
1975
+ readonly props: JsonObject;
1976
+ readonly capabilityGrants?: {
1977
+ readonly networkAccess?: PortalNetworkAccessGrant;
1978
+ };
1979
+ }
1980
+ type PortalWidgetNode = PortalBuiltinWidgetNode | PortalThirdPartyWidgetNode;
1981
+ interface PortalScreen {
1982
+ readonly $schema?: string;
1983
+ readonly name: string;
1984
+ readonly component_tree: PortalWidgetNode[];
1985
+ }
1986
+ interface PortalThemeColor {
1987
+ readonly base: {
1988
+ readonly l: number;
1989
+ readonly c: number;
1990
+ readonly h: number;
1991
+ };
1992
+ readonly foreground: {
1993
+ readonly l: number;
1994
+ readonly c: number;
1995
+ readonly h: number;
1996
+ };
1997
+ }
1998
+ interface PortalThemeConfig {
1999
+ readonly id: string;
1283
2000
  readonly name: string;
1284
- readonly component_tree: Record<string, unknown>[];
2001
+ readonly light: Readonly<Record<"background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "destructive", PortalThemeColor>>;
2002
+ readonly dark: Readonly<Partial<Record<"background" | "foreground" | "primary" | "secondary" | "accent" | "muted" | "destructive", {
2003
+ readonly base?: PortalThemeColor["base"];
2004
+ readonly foreground?: PortalThemeColor["foreground"];
2005
+ }>>>;
2006
+ readonly fontSizes: Readonly<Record<"extraSmall" | "small" | "regular" | "large" | "extraLarge" | "giant", string>>;
2007
+ readonly fontFamilies: Readonly<Record<"header" | "body", string>>;
2008
+ readonly spacing: string;
2009
+ readonly radii: Readonly<Record<"small" | "medium" | "large" | "extraLarge", string>>;
2010
+ readonly syncWithBrandColors?: boolean;
1285
2011
  }
1286
- interface LocalTheme {
2012
+ interface PortalTheme {
2013
+ readonly $schema?: string;
1287
2014
  readonly name: string;
1288
- readonly config: Record<string, unknown>;
2015
+ readonly config: PortalThemeConfig;
1289
2016
  readonly active: boolean;
1290
2017
  }
1291
- interface LocalNavigationItem {
1292
- /** Server-owned sync identity. New draft items omit it until push. */
2018
+ interface PortalNavigationItem {
1293
2019
  readonly id?: number;
1294
2020
  readonly icon: string | null;
1295
2021
  readonly label: string | null;
@@ -1298,14 +2024,16 @@ interface LocalNavigationItem {
1298
2024
  readonly source: string;
1299
2025
  readonly position: number | null;
1300
2026
  readonly parent_id: number | null;
1301
- readonly children: LocalNavigationItem[];
2027
+ readonly children: PortalNavigationItem[];
1302
2028
  }
1303
- interface LocalNavigation {
2029
+ interface PortalNavigation {
2030
+ readonly $schema?: string;
1304
2031
  readonly name: string;
1305
- readonly platform: string;
1306
- readonly navigation_items: LocalNavigationItem[];
2032
+ readonly platform: "web" | "mobile";
2033
+ readonly navigation_items: PortalNavigationItem[];
1307
2034
  }
1308
- interface LocalProfile {
2035
+ interface PortalProfile {
2036
+ readonly $schema?: string;
1309
2037
  readonly name: string;
1310
2038
  readonly default: boolean;
1311
2039
  readonly navigation: string | null;
@@ -1318,6 +2046,18 @@ interface LocalProfile {
1318
2046
  readonly countries: number[];
1319
2047
  };
1320
2048
  }
2049
+ //#endregion
2050
+ //#region src/utils/transform.d.ts
2051
+ type ApiScreen = FluidOsScreen;
2052
+ type ApiTheme = FluidOsTheme;
2053
+ type ApiNavigationBasic = FluidOsNavigationBasic;
2054
+ type ApiNavigationItem = FluidOsNavigationItem;
2055
+ type ApiProfile = FluidOsProfile;
2056
+ type LocalScreen = PortalScreen;
2057
+ type LocalTheme = PortalTheme;
2058
+ type LocalNavigationItem = PortalNavigationItem;
2059
+ type LocalNavigation = PortalNavigation;
2060
+ type LocalProfile = PortalProfile;
1321
2061
  /**
1322
2062
  * Transform an API screen response into the local file format.
1323
2063
  * Strips server-only fields and normalizes `component_tree` to always be an array.
@@ -1330,7 +2070,8 @@ declare function transformScreen(screen: ApiScreen): LocalScreen;
1330
2070
  declare function deriveScreenSlug(screen: ApiScreen, existingSlugs: Set<string>): string;
1331
2071
  /**
1332
2072
  * Transform an API theme response into the local file format.
1333
- * Passes theme config through as-is (hex conversion is a separate ticket).
2073
+ * Normalizes both legacy flat and structured API configs to the current
2074
+ * structured theme payload.
1334
2075
  */
1335
2076
  declare function transformTheme(theme: ApiTheme): LocalTheme;
1336
2077
  /**
@@ -1363,5 +2104,5 @@ declare function transformProfile(profile: ApiProfile, navIdToSlug: Map<number,
1363
2104
  //#region src/index.d.ts
1364
2105
  declare const plugin: FluidPlugin;
1365
2106
  //#endregion
1366
- export { type BuildOptions, CANONICAL_PROJECT_NAME, type CategorizedChanges, type CompanyPackagePreflight, type CompanyWidgetPackage, type ConfiguredWidgetPackage, type CreateOptions, type CreatePortalGitCredentialOptions, type CreatePortalProjectDependencies, type DefinitionMapping, type DevOptions, FILE_SYSTEM_ERRORS, type FileHash, type FileHashMap, type FileSystemError, type FileSystemErrorCode, type GitCredentialOutcome, GitError, type LocalNavigation, type LocalNavigationItem, type LocalProfile, type LocalScreen, type LocalTheme, type MappedResourceType, type PortalDeployOptions, type PortalGitCredential, type PortalGitSyncOptions, type PortalGitSyncResult, type PortalMappings, type ProjectConfig, type PublishWidgetRuntimeArtifactsOptions, type ScaffoldFromGitHubOptions, type SelectedPageTemplate, type Snapshot, type SnapshotDiff, TEMPLATES, TEMPLATE_REPO_URL, type TemplateName, type TemplatePaths, type TemplateVariables, type ValidationError, type WidgetCreateOptions, type WidgetPublishOptions, buildIdToSlugMap, buildNavigationIdToSlugMap, buildSnapshot, buildThemeIdToSlugMap, categorizeChanges, cloneCommand, computeFileHash, copyTemplate, copyTemplateSafe, createCommand, createDirectory, createDirectorySafe, createPortalGitCredential, createPortalProject, plugin as default, deployCommand, deriveScreenSlug, deriveSlug, diffAgainstSnapshot, directoryExists, doctorCommand, ensureGitAvailable, fileExists, formatPackageKeyMismatch, getInstallCommand, getOriginUrl, getRunCommand, getSdkVersion, getSdkVersionSafe, getTemplatePaths, gitAheadBehindVsFetchHead, gitAutoCommit, gitClone, gitFetch, gitInit, gitMergeFastForward, gitMissingError, gitPush, hasUncommittedChanges, installDependencies, isGitAvailable, isGitRepo, pathExists, portalGitCredentialPath, preflightCompanyPackage, promptProjectConfig, publishWidgetRuntimeArtifacts, pullCommand, pushCommand, readCompanyWidgetPackage, readFileSafe, readMappings, readSnapshot, removeMapping, resolveIdToSlug, resolvePublishVersion, resolveSlugToId, rewriteProjectName, runPackageManager, runPortalGitSync, scaffoldFromGitHub, slugFromPath, topLevelWidgetCommand, transformNavigation, transformNavigationItems, transformProfile, transformScreen, transformTheme, updateMapping, validateCrossReferences, versionCommand, widgetCommand, writeFileSafe, writeFluidrcProfile, writeMappings, writeSnapshot };
2107
+ export { type BuildOptions, CANONICAL_PROJECT_NAME, type CategorizedChanges, type CompanyPackagePreflight, type CompanyWidgetPackage, type ConfiguredWidgetPackage, type CreateOptions, type CreatePortalGitCredentialOptions, type CreatePortalProjectDependencies, type DefinitionMapping, type DevOptions, FILE_SYSTEM_ERRORS, type FileHash, type FileHashMap, type FileSystemError, type FileSystemErrorCode, type GitCredentialOutcome, GitError, type LocalNavigation, type LocalNavigationItem, type LocalProfile, type LocalScreen, type LocalTheme, type MappedResourceType, type PortalDeployOptions, type PortalGitCredential, type PortalGitSyncOptions, type PortalGitSyncResult, type PortalMappings, type ProjectConfig, type PublishWidgetRuntimeArtifactsOptions, type ScaffoldFromGitHubOptions, type SelectedPageTemplate, type Snapshot, type SnapshotDiff, TEMPLATES, TEMPLATE_REPO_URL, type TemplateName, type TemplatePaths, type TemplateVariables, type ValidationError, type WidgetCreateOptions, type WidgetPublishOptions, buildIdToSlugMap, buildNavigationIdToSlugMap, buildSnapshot, buildThemeIdToSlugMap, categorizeChanges, cloneCommand, computeFileHash, copyTemplate, copyTemplateSafe, createCommand, createDirectory, createDirectorySafe, createPortalGitCredential, createPortalProject, plugin as default, deployCommand, deriveScreenSlug, deriveSlug, diffAgainstSnapshot, directoryExists, doctorCommand, ensureGitAvailable, fileExists, formatPackageKeyMismatch, getInstallCommand, getOriginUrl, getRunCommand, getSdkVersion, getSdkVersionSafe, getTemplatePaths, gitAheadBehindVsFetchHead, gitAutoCommit, gitClone, gitFetch, gitInit, gitMergeFastForward, gitMissingError, gitPush, hasUncommittedChanges, installDependencies, isGitAvailable, isGitRepo, pathExists, portalGitCredentialPath, preflightCompanyPackage, promptProjectConfig, publishWidgetRuntimeArtifacts, pullCommand, pushCommand, readCompanyWidgetPackage, readFileSafe, readMappings, readSnapshot, removeMapping, resolveIdToSlug, resolvePublishVersion, resolveSlugToId, rewriteProjectName, runPackageManager, runPortalGitSync, scaffoldFromGitHub, slugFromPath, topLevelWidgetCommand, transformNavigation, transformNavigationItems, transformProfile, transformScreen, transformTheme, updateMapping, validateCrossReferences, validatePortalSchemas, versionCommand, widgetCommand, writeFileSafe, writeFluidrcProfile, writeMappings, writeSnapshot };
1367
2108
  //# sourceMappingURL=index.d.mts.map