@deriv-web-design/ui 0.1.5 → 0.1.8

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.
@@ -1041,6 +1041,100 @@
1041
1041
  }
1042
1042
  }
1043
1043
  },
1044
+ "dynamic-table": {
1045
+ "id": "dynamic-table",
1046
+ "name": "Dynamic Table",
1047
+ "component": "DynamicTable",
1048
+ "category": "table",
1049
+ "description": "Comparison-table section with a label column and two or three value columns (Three columns or Four columns). Rounded card, light header row, horizontal dividers, and multi-line cells.",
1050
+ "purpose": "A comparison-table section for short, fixed column sets. It renders a rounded card with a light header row, horizontal dividers only, a bold first-column label, and two or three value columns. Unlike Table, this block has no search, pagination, or header tooltips. It is for marketing and product comparison content — not large instrument specification datasets.",
1051
+ "keywords": [
1052
+ "table",
1053
+ "comparison",
1054
+ "features",
1055
+ "platforms",
1056
+ "columns",
1057
+ "mt5",
1058
+ "web terminal",
1059
+ "desktop",
1060
+ "mobile",
1061
+ "windows",
1062
+ "mac",
1063
+ "trading",
1064
+ "deriv"
1065
+ ],
1066
+ "sectionType": "table",
1067
+ "global": false,
1068
+ "requiredFields": [
1069
+ "columns",
1070
+ "rows"
1071
+ ],
1072
+ "optionalFields": [
1073
+ "sectionTitle",
1074
+ "variant"
1075
+ ],
1076
+ "variants": [
1077
+ "Three columns",
1078
+ "Four columns"
1079
+ ],
1080
+ "recommendedPosition": 4,
1081
+ "placement": [
1082
+ "middle"
1083
+ ],
1084
+ "layout": {
1085
+ "alignment": "center",
1086
+ "contentWidth": "wide",
1087
+ "horizontalScroll": true,
1088
+ "background": true,
1089
+ "overlay": false
1090
+ },
1091
+ "supports": {
1092
+ "backgroundImage": false,
1093
+ "search": false,
1094
+ "pagination": false,
1095
+ "headerTooltips": false,
1096
+ "multiLineCells": true,
1097
+ "primaryButton": false,
1098
+ "secondaryButton": false,
1099
+ "badge": false
1100
+ },
1101
+ "imageRoles": [],
1102
+ "defaultValues": {
1103
+ "variant": "Three columns"
1104
+ },
1105
+ "fields": {
1106
+ "columns": {
1107
+ "type": "array",
1108
+ "required": true,
1109
+ "itemFields": {
1110
+ "header": {
1111
+ "type": "string",
1112
+ "required": true,
1113
+ "maxLength": 40
1114
+ },
1115
+ "key": {
1116
+ "type": "string",
1117
+ "required": true,
1118
+ "maxLength": 40
1119
+ }
1120
+ }
1121
+ },
1122
+ "rows": {
1123
+ "type": "array",
1124
+ "required": true
1125
+ },
1126
+ "sectionTitle": {
1127
+ "type": "string",
1128
+ "required": false,
1129
+ "maxLength": 80
1130
+ },
1131
+ "variant": {
1132
+ "type": "enum",
1133
+ "required": false,
1134
+ "default": "Three columns"
1135
+ }
1136
+ }
1137
+ },
1044
1138
  "faq-accordion-white": {
1045
1139
  "id": "faq-accordion-white",
1046
1140
  "name": "FAQ Accordion White",
@@ -1200,30 +1294,627 @@
1200
1294
  "autoScrollDuration": {
1201
1295
  "type": "number",
1202
1296
  "required": false,
1203
- "min": 10,
1204
- "max": 120,
1205
- "default": 32
1297
+ "min": 10,
1298
+ "max": 120,
1299
+ "default": 32
1300
+ },
1301
+ "awards": {
1302
+ "type": "array",
1303
+ "required": false,
1304
+ "itemFields": {
1305
+ "subtitle": {
1306
+ "type": "string",
1307
+ "required": true,
1308
+ "maxLength": 60
1309
+ },
1310
+ "title": {
1311
+ "type": "string",
1312
+ "required": true,
1313
+ "maxLength": 80
1314
+ }
1315
+ }
1316
+ },
1317
+ "title": {
1318
+ "type": "string",
1319
+ "required": false,
1320
+ "maxLength": 60
1321
+ }
1322
+ }
1323
+ },
1324
+ "feature-blog": {
1325
+ "id": "feature-blog",
1326
+ "name": "Feature Blog",
1327
+ "component": "FeatureBlog",
1328
+ "category": "content",
1329
+ "description": "Light section with a centered H2 heading above a responsive grid of image-led blog / press-release cards (date + category tags, title, summary), with an optional centered \"See all\" link below the grid.",
1330
+ "purpose": "A light-background content section that showcases blog posts or press releases as a responsive grid of image-led cards — thumbnail on top, date/category tags, title, and summary — with an optional centered \"See all\" link below the grid. Modeled after the \"Deriv press releases\" section on [deriv.com/newsroom](https://deriv.com/newsroom).",
1331
+ "keywords": [
1332
+ "blog",
1333
+ "press releases",
1334
+ "newsroom",
1335
+ "articles",
1336
+ "news",
1337
+ "content",
1338
+ "cards",
1339
+ "grid",
1340
+ "media",
1341
+ "press",
1342
+ "trading",
1343
+ "deriv",
1344
+ "newsroom"
1345
+ ],
1346
+ "sectionType": "content",
1347
+ "global": false,
1348
+ "requiredFields": [
1349
+ "posts"
1350
+ ],
1351
+ "optionalFields": [
1352
+ "title",
1353
+ "showLink",
1354
+ "linkText",
1355
+ "linkHref"
1356
+ ],
1357
+ "variants": [
1358
+ "default"
1359
+ ],
1360
+ "recommendedPosition": 4,
1361
+ "placement": [
1362
+ "middle",
1363
+ "bottom"
1364
+ ],
1365
+ "layout": {
1366
+ "alignment": "center",
1367
+ "gridColumns": "3",
1368
+ "contentWidth": "large",
1369
+ "background": false,
1370
+ "overlay": false
1371
+ },
1372
+ "supports": {
1373
+ "backgroundImage": false,
1374
+ "backgroundVideo": false,
1375
+ "foregroundImage": true,
1376
+ "primaryButton": false,
1377
+ "secondaryButton": false,
1378
+ "sectionLink": true,
1379
+ "cardLink": true,
1380
+ "tags": true
1381
+ },
1382
+ "imageRoles": [
1383
+ "post-thumbnail"
1384
+ ],
1385
+ "defaultValues": {
1386
+ "title": "Deriv press releases",
1387
+ "showLink": true,
1388
+ "linkText": "See all press releases"
1389
+ },
1390
+ "fields": {
1391
+ "linkHref": {
1392
+ "type": "url",
1393
+ "required": false,
1394
+ "description": "Href for the \"See all\" link."
1395
+ },
1396
+ "linkText": {
1397
+ "type": "string",
1398
+ "required": false,
1399
+ "default": "See all press releases",
1400
+ "defaultSource": "effective",
1401
+ "maxLength": 40
1402
+ },
1403
+ "posts": {
1404
+ "type": "array",
1405
+ "required": true,
1406
+ "itemFields": {
1407
+ "category": {
1408
+ "type": "string",
1409
+ "required": false,
1410
+ "maxLength": 30,
1411
+ "description": "Category label, e.g. \"Company\"."
1412
+ },
1413
+ "date": {
1414
+ "type": "string",
1415
+ "required": false,
1416
+ "maxLength": 30,
1417
+ "description": "Publish date label, e.g. \"July 24, 2026\"."
1418
+ },
1419
+ "href": {
1420
+ "type": "url",
1421
+ "required": false,
1422
+ "description": "Wraps the card in an anchor when set."
1423
+ },
1424
+ "summary": {
1425
+ "type": "string",
1426
+ "required": true,
1427
+ "maxLength": 220
1428
+ },
1429
+ "thumbnail": {
1430
+ "type": "image",
1431
+ "required": true
1432
+ },
1433
+ "thumbnailAlt": {
1434
+ "type": "string",
1435
+ "required": false,
1436
+ "default": "",
1437
+ "defaultSource": "effective",
1438
+ "maxLength": 125,
1439
+ "description": "Alt text for the post thumbnail. Defaults to an empty string, which marks the image as decorative — set it whenever the image carries meaning."
1440
+ },
1441
+ "title": {
1442
+ "type": "string",
1443
+ "required": true,
1444
+ "maxLength": 100
1445
+ }
1446
+ }
1447
+ },
1448
+ "showLink": {
1449
+ "type": "boolean",
1450
+ "required": false,
1451
+ "default": true,
1452
+ "description": "Show the \"See all\" link below the grid. On by default."
1453
+ },
1454
+ "title": {
1455
+ "type": "string",
1456
+ "required": false,
1457
+ "maxLength": 80
1458
+ }
1459
+ }
1460
+ },
1461
+ "feature-blog-categories": {
1462
+ "id": "feature-blog-categories",
1463
+ "name": "Feature Blog Categories",
1464
+ "component": "FeatureBlogCategories",
1465
+ "category": "content",
1466
+ "description": "Light section with a centered H2 heading, a search field, and CMS-managed category tabs above a responsive grid of image-led blog / press-release cards. Filtering by tab and search query happens client-side. Each card links to an internal page (same tab) or an external URL (opens in a new tab).",
1467
+ "purpose": "A light-background content section that showcases blog posts or press releases as a searchable, filterable grid of image-led cards. A search field and a row of CMS-managed category tabs sit above a responsive card grid; both filter the same post list client-side. Each card either navigates to an internal page (same tab) or opens an external URL in a new tab. Modeled after [deriv.com/newsroom/press-releases](https://deriv.com/newsroom/press-releases) and [deriv.com/newsroom/deriv-in-the-news](https://deriv.com/newsroom/deriv-in-the-news).",
1468
+ "keywords": [
1469
+ "blog",
1470
+ "press releases",
1471
+ "newsroom",
1472
+ "articles",
1473
+ "news",
1474
+ "content",
1475
+ "cards",
1476
+ "grid",
1477
+ "search",
1478
+ "filter",
1479
+ "tabs",
1480
+ "categories",
1481
+ "cms",
1482
+ "media",
1483
+ "press",
1484
+ "trading",
1485
+ "deriv"
1486
+ ],
1487
+ "sectionType": "content",
1488
+ "global": false,
1489
+ "requiredFields": [
1490
+ "categories",
1491
+ "posts"
1492
+ ],
1493
+ "optionalFields": [
1494
+ "title",
1495
+ "allCategoryId",
1496
+ "allCategoryLabel",
1497
+ "defaultActiveCategoryId",
1498
+ "searchPlaceholder",
1499
+ "emptyStateText"
1500
+ ],
1501
+ "variants": [
1502
+ "default"
1503
+ ],
1504
+ "recommendedPosition": 4,
1505
+ "placement": [
1506
+ "middle",
1507
+ "bottom"
1508
+ ],
1509
+ "layout": {
1510
+ "alignment": "center",
1511
+ "gridColumns": "3",
1512
+ "contentWidth": "large",
1513
+ "background": false,
1514
+ "overlay": false
1515
+ },
1516
+ "supports": {
1517
+ "backgroundImage": false,
1518
+ "backgroundVideo": false,
1519
+ "foregroundImage": true,
1520
+ "primaryButton": false,
1521
+ "secondaryButton": false,
1522
+ "search": true,
1523
+ "tabs": true,
1524
+ "cardLink": true,
1525
+ "externalLinkNewTab": true,
1526
+ "tags": true
1527
+ },
1528
+ "imageRoles": [
1529
+ "post-thumbnail"
1530
+ ],
1531
+ "defaultValues": {
1532
+ "title": "Deriv press releases",
1533
+ "allCategoryId": "all",
1534
+ "allCategoryLabel": "View all",
1535
+ "searchPlaceholder": "Search",
1536
+ "emptyStateText": "Sorry, we couldn't find any results matching."
1537
+ },
1538
+ "fields": {
1539
+ "allCategoryId": {
1540
+ "type": "string",
1541
+ "required": false,
1542
+ "default": "all",
1543
+ "defaultSource": "effective",
1544
+ "maxLength": 40
1545
+ },
1546
+ "allCategoryLabel": {
1547
+ "type": "string",
1548
+ "required": false,
1549
+ "default": "View all",
1550
+ "defaultSource": "effective",
1551
+ "maxLength": 30
1552
+ },
1553
+ "categories": {
1554
+ "type": "array",
1555
+ "required": true,
1556
+ "description": "Category tabs, CMS-managed. An additional \"all\" tab (see allCategoryId/allCategoryLabel) is always prepended automatically — do not include it here.",
1557
+ "itemFields": {
1558
+ "id": {
1559
+ "type": "string",
1560
+ "required": true,
1561
+ "maxLength": 40,
1562
+ "description": "Must match FeatureBlogCategoryPost.category for filtering to work."
1563
+ },
1564
+ "label": {
1565
+ "type": "string",
1566
+ "required": true,
1567
+ "maxLength": 30
1568
+ }
1569
+ }
1570
+ },
1571
+ "defaultActiveCategoryId": {
1572
+ "type": "string",
1573
+ "required": false,
1574
+ "description": "Initial active tab id. Defaults to allCategoryId (\"View all\") when omitted."
1575
+ },
1576
+ "emptyStateText": {
1577
+ "type": "string",
1578
+ "required": false,
1579
+ "default": "Sorry, we couldn't find any results matching.",
1580
+ "defaultSource": "effective",
1581
+ "maxLength": 120
1582
+ },
1583
+ "posts": {
1584
+ "type": "array",
1585
+ "required": true,
1586
+ "itemFields": {
1587
+ "category": {
1588
+ "type": "string",
1589
+ "required": true,
1590
+ "maxLength": 40,
1591
+ "description": "Must match one of categories[].id. Posts always also match the \"all\" tab."
1592
+ },
1593
+ "categoryLabel": {
1594
+ "type": "string",
1595
+ "required": false,
1596
+ "maxLength": 30,
1597
+ "description": "Category chip label shown on the card. Defaults to the matching tab's label."
1598
+ },
1599
+ "date": {
1600
+ "type": "string",
1601
+ "required": false,
1602
+ "maxLength": 30,
1603
+ "description": "Publish date label, e.g. \"July 24, 2026\"."
1604
+ },
1605
+ "href": {
1606
+ "type": "url",
1607
+ "required": false,
1608
+ "description": "Absolute http(s):// URLs open in a new tab (external); relative/internal paths navigate same-tab."
1609
+ },
1610
+ "summary": {
1611
+ "type": "string",
1612
+ "required": true,
1613
+ "maxLength": 220
1614
+ },
1615
+ "thumbnail": {
1616
+ "type": "image",
1617
+ "required": true
1618
+ },
1619
+ "thumbnailAlt": {
1620
+ "type": "string",
1621
+ "required": false,
1622
+ "default": "",
1623
+ "defaultSource": "effective",
1624
+ "maxLength": 125,
1625
+ "description": "Alt text for the post thumbnail. Defaults to an empty string, which marks the image as decorative — set it whenever the image carries meaning."
1626
+ },
1627
+ "title": {
1628
+ "type": "string",
1629
+ "required": true,
1630
+ "maxLength": 100
1631
+ }
1632
+ }
1633
+ },
1634
+ "searchPlaceholder": {
1635
+ "type": "string",
1636
+ "required": false,
1637
+ "default": "Search",
1638
+ "defaultSource": "effective",
1639
+ "maxLength": 40
1640
+ },
1641
+ "title": {
1642
+ "type": "string",
1643
+ "required": false,
1644
+ "maxLength": 80
1645
+ }
1646
+ }
1647
+ },
1648
+ "feature-blog-page": {
1649
+ "id": "feature-blog-page",
1650
+ "name": "Feature Blog Page",
1651
+ "component": "FeatureBlogPage",
1652
+ "category": "content",
1653
+ "description": "A full blog-article page: category tag, title, author/date meta, hero image, and a rich-content body alongside a sticky 'Contents' (table of contents) + 'Share article' sidebar that scroll-spies the current section on desktop. On mobile the sidebar collapses into an expandable 'Contents' card above the title and a horizontal share-icon row below the hero image. Breadcrumb navigation is not part of this template — it is composed separately above it.",
1654
+ "purpose": "A full blog-article page: category tag, title, author/date meta, hero image, and a rich-content body alongside a sticky \"Contents\" (table of contents) and \"Share article\" sidebar that highlights the current section as the reader scrolls. On mobile/tablet the sidebar collapses into an expandable \"Contents\" card above the title and a horizontal share-icon row below the hero image, so both stay reachable without a persistent floating widget. Breadcrumb navigation is intentionally **not** part of this template — it is composed separately above it by the consuming page. Modeled after [deriv.com/newsroom/updates/deriv-derived-indices-on-tradingview](https://deriv.com/newsroom/updates/deriv-derived-indices-on-tradingview).",
1655
+ "keywords": [
1656
+ "blog",
1657
+ "article",
1658
+ "blog post",
1659
+ "press release",
1660
+ "newsroom",
1661
+ "table of contents",
1662
+ "toc",
1663
+ "contents",
1664
+ "share",
1665
+ "social share",
1666
+ "sticky sidebar",
1667
+ "scrollspy",
1668
+ "author",
1669
+ "byline",
1670
+ "trading",
1671
+ "deriv"
1672
+ ],
1673
+ "sectionType": "article",
1674
+ "global": false,
1675
+ "requiredFields": [
1676
+ "title",
1677
+ "content"
1678
+ ],
1679
+ "optionalFields": [
1680
+ "category",
1681
+ "publishDate",
1682
+ "author",
1683
+ "heroImage",
1684
+ "heroImageAlt",
1685
+ "tocTitle",
1686
+ "tocDefaultOpen",
1687
+ "hideToc",
1688
+ "shareTitle",
1689
+ "shareUrl",
1690
+ "shareText",
1691
+ "sharePlatforms",
1692
+ "hideShare",
1693
+ "copiedLabel"
1694
+ ],
1695
+ "variants": [
1696
+ "default"
1697
+ ],
1698
+ "recommendedPosition": 1,
1699
+ "placement": [
1700
+ "top",
1701
+ "middle"
1702
+ ],
1703
+ "layout": {
1704
+ "alignment": "left",
1705
+ "gridColumns": "2",
1706
+ "contentWidth": "large",
1707
+ "background": false,
1708
+ "overlay": false
1709
+ },
1710
+ "supports": {
1711
+ "backgroundImage": false,
1712
+ "backgroundVideo": false,
1713
+ "foregroundImage": true,
1714
+ "primaryButton": false,
1715
+ "secondaryButton": false,
1716
+ "cardLink": false,
1717
+ "icons": true,
1718
+ "tableOfContents": true,
1719
+ "socialShare": true,
1720
+ "richContent": true
1721
+ },
1722
+ "imageRoles": [
1723
+ "hero-image",
1724
+ "author-avatar",
1725
+ "inline-image"
1726
+ ],
1727
+ "defaultValues": {
1728
+ "tocTitle": "Contents",
1729
+ "tocDefaultOpen": true,
1730
+ "hideToc": false,
1731
+ "shareTitle": "Share article",
1732
+ "sharePlatforms": [
1733
+ "facebook",
1734
+ "twitter",
1735
+ "telegram",
1736
+ "linkedin"
1737
+ ],
1738
+ "hideShare": false,
1739
+ "copiedLabel": "Copied!"
1740
+ },
1741
+ "fields": {
1742
+ "author": {
1743
+ "type": "object",
1744
+ "required": false,
1745
+ "objectFields": {
1746
+ "avatar": {
1747
+ "type": "image",
1748
+ "required": false
1749
+ },
1750
+ "avatarAlt": {
1751
+ "type": "string",
1752
+ "required": false,
1753
+ "maxLength": 125
1754
+ },
1755
+ "name": {
1756
+ "type": "string",
1757
+ "required": true,
1758
+ "maxLength": 60
1759
+ }
1760
+ }
1761
+ },
1762
+ "category": {
1763
+ "type": "string",
1764
+ "required": false,
1765
+ "maxLength": 40,
1766
+ "description": "Small category label rendered above the title, e.g. \"Press releases\"."
1767
+ },
1768
+ "content": {
1769
+ "type": "array",
1770
+ "required": true,
1771
+ "itemFields": {
1772
+ "caption": {
1773
+ "type": "string",
1774
+ "required": false,
1775
+ "maxLength": 200
1776
+ },
1777
+ "cite": {
1778
+ "type": "string",
1779
+ "required": false,
1780
+ "maxLength": 120
1781
+ },
1782
+ "id": {
1783
+ "type": "string",
1784
+ "required": false,
1785
+ "maxLength": 80,
1786
+ "description": "Stable anchor id; auto-generated (slugified) from `text` when omitted."
1787
+ },
1788
+ "image": {
1789
+ "type": "image",
1790
+ "required": false
1791
+ },
1792
+ "imageAlt": {
1793
+ "type": "string",
1794
+ "required": false,
1795
+ "maxLength": 125
1796
+ },
1797
+ "items": {
1798
+ "type": "array",
1799
+ "required": false
1800
+ },
1801
+ "level": {
1802
+ "type": "number",
1803
+ "required": false,
1804
+ "default": 2,
1805
+ "defaultSource": "effective",
1806
+ "enum": [
1807
+ 2,
1808
+ 3
1809
+ ],
1810
+ "description": "Only level-2 headings are collected into the table of contents."
1811
+ },
1812
+ "ordered": {
1813
+ "type": "boolean",
1814
+ "required": false,
1815
+ "default": false,
1816
+ "defaultSource": "effective"
1817
+ },
1818
+ "text": {
1819
+ "type": "string",
1820
+ "required": false,
1821
+ "maxLength": 1000
1822
+ },
1823
+ "type": {
1824
+ "type": "string",
1825
+ "required": true,
1826
+ "enum": [
1827
+ "heading",
1828
+ "paragraph",
1829
+ "list",
1830
+ "quote",
1831
+ "image"
1832
+ ]
1833
+ }
1834
+ }
1835
+ },
1836
+ "copiedLabel": {
1837
+ "type": "string",
1838
+ "required": false,
1839
+ "default": "Copied!",
1840
+ "maxLength": 30
1841
+ },
1842
+ "heroImage": {
1843
+ "type": "image",
1844
+ "required": false
1845
+ },
1846
+ "heroImageAlt": {
1847
+ "type": "string",
1848
+ "required": false,
1849
+ "default": "",
1850
+ "defaultSource": "effective",
1851
+ "maxLength": 125
1852
+ },
1853
+ "hideShare": {
1854
+ "type": "boolean",
1855
+ "required": false,
1856
+ "default": false
1857
+ },
1858
+ "hideToc": {
1859
+ "type": "boolean",
1860
+ "required": false,
1861
+ "default": false
1862
+ },
1863
+ "publishDate": {
1864
+ "type": "string",
1865
+ "required": false,
1866
+ "maxLength": 30,
1867
+ "description": "Publish date label, e.g. \"July 24, 2026\"."
1868
+ },
1869
+ "sharePlatforms": {
1870
+ "type": "array",
1871
+ "required": false,
1872
+ "default": [
1873
+ "facebook",
1874
+ "twitter",
1875
+ "telegram",
1876
+ "linkedin"
1877
+ ],
1878
+ "defaultSource": "effective",
1879
+ "enum": [
1880
+ "facebook",
1881
+ "twitter",
1882
+ "linkedin",
1883
+ "telegram"
1884
+ ]
1885
+ },
1886
+ "shareText": {
1887
+ "type": "string",
1888
+ "required": false,
1889
+ "maxLength": 200,
1890
+ "description": "Text passed to platforms that accept share text (X/Twitter, Telegram); defaults to `title`."
1206
1891
  },
1207
- "awards": {
1208
- "type": "array",
1892
+ "shareTitle": {
1893
+ "type": "string",
1209
1894
  "required": false,
1210
- "itemFields": {
1211
- "subtitle": {
1212
- "type": "string",
1213
- "required": true,
1214
- "maxLength": 60
1215
- },
1216
- "title": {
1217
- "type": "string",
1218
- "required": true,
1219
- "maxLength": 80
1220
- }
1221
- }
1895
+ "default": "Share article",
1896
+ "maxLength": 40
1897
+ },
1898
+ "shareUrl": {
1899
+ "type": "url",
1900
+ "required": false,
1901
+ "description": "Canonical URL used to build every share link and for \"copy link\"; sharing is hidden when omitted."
1222
1902
  },
1223
1903
  "title": {
1224
1904
  "type": "string",
1905
+ "required": true,
1906
+ "maxLength": 160
1907
+ },
1908
+ "tocDefaultOpen": {
1909
+ "type": "boolean",
1225
1910
  "required": false,
1226
- "maxLength": 60
1911
+ "default": true
1912
+ },
1913
+ "tocTitle": {
1914
+ "type": "string",
1915
+ "required": false,
1916
+ "default": "Contents",
1917
+ "maxLength": 40
1227
1918
  }
1228
1919
  }
1229
1920
  },
@@ -1630,6 +2321,161 @@
1630
2321
  }
1631
2322
  }
1632
2323
  },
2324
+ "feature-offices": {
2325
+ "id": "feature-offices",
2326
+ "name": "Feature Offices",
2327
+ "component": "FeatureOffices",
2328
+ "category": "content",
2329
+ "description": "Light section with a centered H2 heading and CMS-managed region tabs above a responsive grid of office address cards (flag image, city/country, address, optional \"See location\" link). Filtering by region happens client-side.",
2330
+ "purpose": "A light-background content section that lists a company's offices grouped by region, using a row of CMS-managed region tabs above a responsive grid of address cards (flag image, city/country, address, optional \"See location\" link). Modeled after [deriv.com/contact-us](https://deriv.com/contact-us) (\"Our offices\").",
2331
+ "keywords": [
2332
+ "offices",
2333
+ "locations",
2334
+ "contact",
2335
+ "addresses",
2336
+ "regions",
2337
+ "tabs",
2338
+ "cms",
2339
+ "map",
2340
+ "branches",
2341
+ "deriv"
2342
+ ],
2343
+ "sectionType": "content",
2344
+ "global": false,
2345
+ "requiredFields": [
2346
+ "regions",
2347
+ "offices"
2348
+ ],
2349
+ "optionalFields": [
2350
+ "title",
2351
+ "defaultActiveRegionId",
2352
+ "linkText"
2353
+ ],
2354
+ "variants": [
2355
+ "default"
2356
+ ],
2357
+ "recommendedPosition": 5,
2358
+ "placement": [
2359
+ "middle",
2360
+ "bottom"
2361
+ ],
2362
+ "layout": {
2363
+ "alignment": "center",
2364
+ "gridColumns": "3",
2365
+ "contentWidth": "large",
2366
+ "background": false,
2367
+ "overlay": false
2368
+ },
2369
+ "supports": {
2370
+ "backgroundImage": false,
2371
+ "backgroundVideo": false,
2372
+ "foregroundImage": true,
2373
+ "primaryButton": false,
2374
+ "secondaryButton": false,
2375
+ "search": false,
2376
+ "tabs": true,
2377
+ "cardLink": true,
2378
+ "externalLinkNewTab": true,
2379
+ "tags": false
2380
+ },
2381
+ "imageRoles": [
2382
+ "office-flag"
2383
+ ],
2384
+ "defaultValues": {
2385
+ "title": "Our offices",
2386
+ "linkText": "See location"
2387
+ },
2388
+ "fields": {
2389
+ "defaultActiveRegionId": {
2390
+ "type": "string",
2391
+ "required": false,
2392
+ "description": "Initial active tab id. Defaults to regions[0].id when omitted."
2393
+ },
2394
+ "linkText": {
2395
+ "type": "string",
2396
+ "required": false,
2397
+ "default": "See location",
2398
+ "defaultSource": "effective",
2399
+ "maxLength": 30,
2400
+ "description": "Default label for each office's link. Overridable per office via offices[].linkText."
2401
+ },
2402
+ "offices": {
2403
+ "type": "array",
2404
+ "required": true,
2405
+ "itemFields": {
2406
+ "address": {
2407
+ "type": "string",
2408
+ "required": true,
2409
+ "maxLength": 220,
2410
+ "description": "Full postal address. Use \"\\n\" to break onto multiple lines."
2411
+ },
2412
+ "city": {
2413
+ "type": "string",
2414
+ "required": true,
2415
+ "maxLength": 60
2416
+ },
2417
+ "country": {
2418
+ "type": "string",
2419
+ "required": true,
2420
+ "maxLength": 60
2421
+ },
2422
+ "flagAlt": {
2423
+ "type": "string",
2424
+ "required": false,
2425
+ "maxLength": 60,
2426
+ "description": "Alt text for the flag image. Defaults to country when omitted."
2427
+ },
2428
+ "flagImage": {
2429
+ "type": "image",
2430
+ "required": true,
2431
+ "description": "Real flag artwork (not an emoji), e.g. a flagcdn.com URL."
2432
+ },
2433
+ "href": {
2434
+ "type": "url",
2435
+ "required": false,
2436
+ "description": "Absolute http(s):// URLs open in a new tab (external); relative/internal paths navigate same-tab. Omit to render the card with no link."
2437
+ },
2438
+ "linkText": {
2439
+ "type": "string",
2440
+ "required": false,
2441
+ "maxLength": 30,
2442
+ "description": "Overrides the default \"See location\" link label for this office."
2443
+ },
2444
+ "region": {
2445
+ "type": "string",
2446
+ "required": true,
2447
+ "maxLength": 40,
2448
+ "description": "Must match one of regions[].id."
2449
+ }
2450
+ }
2451
+ },
2452
+ "regions": {
2453
+ "type": "array",
2454
+ "required": true,
2455
+ "description": "Region tabs, CMS-managed.",
2456
+ "itemFields": {
2457
+ "id": {
2458
+ "type": "string",
2459
+ "required": true,
2460
+ "maxLength": 40,
2461
+ "description": "Must match FeatureOffice.region for filtering to work."
2462
+ },
2463
+ "label": {
2464
+ "type": "string",
2465
+ "required": true,
2466
+ "maxLength": 30
2467
+ }
2468
+ }
2469
+ },
2470
+ "title": {
2471
+ "type": "string",
2472
+ "required": false,
2473
+ "default": "Our offices",
2474
+ "defaultSource": "effective",
2475
+ "maxLength": 60
2476
+ }
2477
+ }
2478
+ },
1633
2479
  "feature-scroll-media-right": {
1634
2480
  "id": "feature-scroll-media-right",
1635
2481
  "name": "Feature Scroll Media Right",
@@ -1886,6 +2732,7 @@
1886
2732
  "logoAlt",
1887
2733
  "socialLinks",
1888
2734
  "derivGo",
2735
+ "tradingView",
1889
2736
  "investorsInPeopleSrc",
1890
2737
  "investorsInPeopleAlt",
1891
2738
  "licenseText",
@@ -1972,8 +2819,8 @@
1972
2819
  "name": "Header Visuals",
1973
2820
  "component": "Header",
1974
2821
  "category": "header",
1975
- "description": "Light-grey sub-page header with centred title, CTA buttons and optional floating parallax visuals.",
1976
- "purpose": "A lightweight, light-grey page header for sub-pages: an optional eyebrow subtitle, a large title, optional description, and up to two CTA buttons over a faint SVG grid background. The Visuals variant adds floating parallax images in the top-left and bottom-right corners. This block is designed as a lower-weight alternative to the full-viewport Hero — it sits above content without dominating the first viewport (min-height 540px).",
2822
+ "description": "Sub-page header with centred title, CTA buttons, and either a light-grey background with optional floating parallax visuals, or a dark navy background (optionally with a search field) in a shorter format.",
2823
+ "purpose": "A page header for sub-pages: an optional eyebrow subtitle, a large title, optional description, and up to two CTA buttons over a faint SVG grid background. - **Visuals** variant adds floating parallax images in the top-left and bottom-right corners. - **Minimal** variant is the same without the floating graphics. - **Centred - Dark** variant swaps to a dark navy background with a shorter min-height, for tool/resource index pages that sit right below a dark navbar (no breadcrumb or navbar baked in — pair those components separately, as on `deriv.com/trading-calculators`). - **Centred - Dark with Search** variant is the dark background plus a search field below the title/description, for pages like the Help Centre index. This block is designed as a lower-weight alternative to the full-viewport Hero — it sits above content without dominating the first viewport (min-height 540px for the light variants; 420px on mobile/tablet and 460px on desktop for the dark variants — actual height still grows with longer content).",
1977
2824
  "keywords": [
1978
2825
  "header",
1979
2826
  "page-header",
@@ -1986,7 +2833,10 @@
1986
2833
  "parallax",
1987
2834
  "cta",
1988
2835
  "trading",
1989
- "deriv"
2836
+ "deriv",
2837
+ "dark",
2838
+ "search",
2839
+ "help-centre"
1990
2840
  ],
1991
2841
  "sectionType": "header",
1992
2842
  "global": false,
@@ -2000,11 +2850,14 @@
2000
2850
  "primaryButton",
2001
2851
  "secondaryButton",
2002
2852
  "leftVisual",
2003
- "rightVisual"
2853
+ "rightVisual",
2854
+ "search"
2004
2855
  ],
2005
2856
  "variants": [
2006
2857
  "visuals",
2007
- "minimal"
2858
+ "minimal",
2859
+ "dark",
2860
+ "dark-search"
2008
2861
  ],
2009
2862
  "recommendedPosition": 1,
2010
2863
  "placement": [
@@ -2024,7 +2877,8 @@
2024
2877
  "primaryButton": true,
2025
2878
  "secondaryButton": true,
2026
2879
  "eyebrow": true,
2027
- "parallax": true
2880
+ "parallax": true,
2881
+ "search": true
2028
2882
  },
2029
2883
  "imageRoles": [
2030
2884
  "left-visual",
@@ -2066,6 +2920,19 @@
2066
2920
  "aspectRatio": "1:1",
2067
2921
  "description": "Right floating visual, rendered by the `visuals` variant only. Accepts a ReactNode in code; page builders should pass an image URL string."
2068
2922
  },
2923
+ "search": {
2924
+ "type": "object",
2925
+ "required": false,
2926
+ "description": "Search field configuration, rendered only by the `dark-search` variant (the field always appears for that variant; this only customises it).",
2927
+ "objectFields": {
2928
+ "placeholder": {
2929
+ "type": "string",
2930
+ "required": false,
2931
+ "maxLength": 40,
2932
+ "description": "Placeholder text for the search input. Defaults to \"Search\"."
2933
+ }
2934
+ }
2935
+ },
2069
2936
  "secondaryButton": {
2070
2937
  "type": "object",
2071
2938
  "required": false,
@@ -2098,9 +2965,11 @@
2098
2965
  "required": true,
2099
2966
  "enum": [
2100
2967
  "visuals",
2101
- "minimal"
2968
+ "minimal",
2969
+ "dark",
2970
+ "dark-search"
2102
2971
  ],
2103
- "description": "Layout variant. Required — the component has no fallback, so omitting it renders an unstyled header."
2972
+ "description": "Layout variant. Required — the component has no fallback, so omitting it renders an unstyled header. 'dark' and 'dark-search' use a dark navy background with a shorter min-height than 'visuals'/'minimal'; 'dark-search' also renders a search field below the text (e.g. Help Centre header)."
2104
2973
  }
2105
2974
  }
2106
2975
  },
@@ -2726,8 +3595,10 @@
2726
3595
  "imageAlt"
2727
3596
  ],
2728
3597
  "variants": [
2729
- "split",
2730
- "full-bg"
3598
+ "split-left",
3599
+ "split-right",
3600
+ "full-bg-left",
3601
+ "full-bg-right"
2731
3602
  ],
2732
3603
  "recommendedPosition": 7,
2733
3604
  "placement": [
@@ -2755,7 +3626,7 @@
2755
3626
  "card-background"
2756
3627
  ],
2757
3628
  "defaultValues": {
2758
- "variant": "split",
3629
+ "variant": "split-left",
2759
3630
  "title": "Join our global community",
2760
3631
  "description": "Connect with traders around the world to exchange insights, explore portfolios, and gain valuable expertise.",
2761
3632
  "ctaLabel": "Trader's Hub",
@@ -2799,10 +3670,12 @@
2799
3670
  "type": "string",
2800
3671
  "required": false,
2801
3672
  "enum": [
2802
- "split",
2803
- "full-bg"
3673
+ "split-left",
3674
+ "split-right",
3675
+ "full-bg-left",
3676
+ "full-bg-right"
2804
3677
  ],
2805
- "default": "split"
3678
+ "default": "split-left"
2806
3679
  }
2807
3680
  }
2808
3681
  },
@@ -3150,62 +4023,199 @@
3150
4023
  "type": "array",
3151
4024
  "required": false,
3152
4025
  "itemFields": {
3153
- "code": {
4026
+ "code": {
4027
+ "type": "string",
4028
+ "required": true,
4029
+ "maxLength": 10
4030
+ },
4031
+ "label": {
4032
+ "type": "string",
4033
+ "required": true,
4034
+ "maxLength": 40
4035
+ }
4036
+ }
4037
+ },
4038
+ "languageLabel": {
4039
+ "type": "string",
4040
+ "required": false,
4041
+ "maxLength": 10,
4042
+ "description": "Current language code shown in the switcher, e.g. \"EN\". No default — omit it and the language switcher is not rendered at all."
4043
+ },
4044
+ "loginHref": {
4045
+ "type": "url",
4046
+ "required": false,
4047
+ "description": "Login link target. No default — omit it and the login link is not rendered at all."
4048
+ },
4049
+ "loginLabel": {
4050
+ "type": "string",
4051
+ "required": false,
4052
+ "maxLength": 30,
4053
+ "default": "Log in"
4054
+ },
4055
+ "logoHref": {
4056
+ "type": "url",
4057
+ "required": false,
4058
+ "default": "/"
4059
+ },
4060
+ "logoSrc": {
4061
+ "type": "image",
4062
+ "required": true
4063
+ },
4064
+ "logoSrcDark": {
4065
+ "type": "image",
4066
+ "required": false
4067
+ },
4068
+ "navItems": {
4069
+ "type": "array",
4070
+ "required": false,
4071
+ "default": []
4072
+ },
4073
+ "theme": {
4074
+ "type": "string",
4075
+ "required": false,
4076
+ "default": "dark",
4077
+ "enum": [
4078
+ "dark",
4079
+ "light"
4080
+ ],
4081
+ "description": "Colour theme. Defaults to \"dark\" — omit it and you get the dark navbar. (This entry previously documented \"light\", which the component never did.)"
4082
+ }
4083
+ }
4084
+ },
4085
+ "parallax-banner": {
4086
+ "id": "parallax-banner",
4087
+ "name": "Parallax Banner",
4088
+ "component": "ParallaxBanner",
4089
+ "category": "banner",
4090
+ "description": "Dark rounded banner card with a culture/values headline, supporting copy, one CTA link, and a photo with a subtle scroll-linked parallax. The \"default\" variant adds a grid of four short value cards underneath; \"banner-only\" renders just the banner. Modeled on the \"Our culture\" section on careers.deriv.com.",
4091
+ "purpose": "A dark, rounded banner card that introduces a company's culture or values — headline, supporting copy, and one CTA link on one side, a photo on the other — with a subtle scroll-linked parallax on the photo as the section enters and leaves the viewport. The `default` variant adds a grid of four short value/culture cards directly beneath the banner; the `banner-only` variant renders just the banner card. Modeled after the \"Our culture\" section on [careers.deriv.com](https://careers.deriv.com).",
4092
+ "keywords": [
4093
+ "careers",
4094
+ "culture",
4095
+ "values",
4096
+ "about-us",
4097
+ "banner",
4098
+ "image",
4099
+ "photo",
4100
+ "parallax",
4101
+ "scroll",
4102
+ "cta",
4103
+ "team",
4104
+ "hiring",
4105
+ "jobs",
4106
+ "deriv"
4107
+ ],
4108
+ "sectionType": "banner",
4109
+ "global": false,
4110
+ "requiredFields": [],
4111
+ "optionalFields": [
4112
+ "variant",
4113
+ "title",
4114
+ "description",
4115
+ "ctaLabel",
4116
+ "ctaHref",
4117
+ "imageUrl",
4118
+ "imageAlt",
4119
+ "cards",
4120
+ "enableParallax"
4121
+ ],
4122
+ "variants": [
4123
+ "default",
4124
+ "banner-only"
4125
+ ],
4126
+ "recommendedPosition": 4,
4127
+ "placement": [
4128
+ "middle",
4129
+ "bottom"
4130
+ ],
4131
+ "layout": {
4132
+ "alignment": "left",
4133
+ "buttonLayout": "none",
4134
+ "contentWidth": "wide",
4135
+ "background": true,
4136
+ "overlay": false,
4137
+ "parallax": true
4138
+ },
4139
+ "supports": {
4140
+ "backgroundImage": false,
4141
+ "backgroundVideo": false,
4142
+ "foregroundImage": true,
4143
+ "primaryButton": false,
4144
+ "secondaryButton": false,
4145
+ "ctaLink": true,
4146
+ "parallax": true,
4147
+ "editableText": true
4148
+ },
4149
+ "imageRoles": [
4150
+ "split-panel"
4151
+ ],
4152
+ "defaultValues": {
4153
+ "variant": "default",
4154
+ "title": "Our culture",
4155
+ "description": "We combine human values with AI precision. Collaboration, integrity, and continuous learning guide every project.",
4156
+ "ctaLabel": "Culture at Deriv",
4157
+ "enableParallax": true
4158
+ },
4159
+ "fields": {
4160
+ "cards": {
4161
+ "type": "array",
4162
+ "required": false,
4163
+ "itemFields": {
4164
+ "description": {
3154
4165
  "type": "string",
3155
4166
  "required": true,
3156
- "maxLength": 10
4167
+ "maxLength": 220
3157
4168
  },
3158
- "label": {
4169
+ "title": {
3159
4170
  "type": "string",
3160
4171
  "required": true,
3161
4172
  "maxLength": 40
3162
4173
  }
3163
4174
  }
3164
4175
  },
3165
- "languageLabel": {
4176
+ "ctaHref": {
3166
4177
  "type": "string",
3167
- "required": false,
3168
- "maxLength": 10,
3169
- "description": "Current language code shown in the switcher, e.g. \"EN\". No default — omit it and the language switcher is not rendered at all."
4178
+ "required": false
3170
4179
  },
3171
- "loginHref": {
3172
- "type": "url",
4180
+ "ctaLabel": {
4181
+ "type": "string",
3173
4182
  "required": false,
3174
- "description": "Login link target. No default — omit it and the login link is not rendered at all."
4183
+ "maxLength": 40
3175
4184
  },
3176
- "loginLabel": {
4185
+ "description": {
3177
4186
  "type": "string",
3178
4187
  "required": false,
3179
- "maxLength": 30,
3180
- "default": "Log in"
4188
+ "maxLength": 220
3181
4189
  },
3182
- "logoHref": {
3183
- "type": "url",
4190
+ "enableParallax": {
4191
+ "type": "boolean",
3184
4192
  "required": false,
3185
- "default": "/"
4193
+ "default": true
3186
4194
  },
3187
- "logoSrc": {
3188
- "type": "image",
3189
- "required": true
4195
+ "imageAlt": {
4196
+ "type": "string",
4197
+ "required": false,
4198
+ "maxLength": 120,
4199
+ "default": ""
3190
4200
  },
3191
- "logoSrcDark": {
4201
+ "imageUrl": {
3192
4202
  "type": "image",
3193
- "required": false
4203
+ "required": false,
4204
+ "aspectRatio": "4:3"
3194
4205
  },
3195
- "navItems": {
3196
- "type": "array",
4206
+ "title": {
4207
+ "type": "string",
3197
4208
  "required": false,
3198
- "default": []
4209
+ "maxLength": 60
3199
4210
  },
3200
- "theme": {
4211
+ "variant": {
3201
4212
  "type": "string",
3202
4213
  "required": false,
3203
- "default": "dark",
3204
4214
  "enum": [
3205
- "dark",
3206
- "light"
4215
+ "default",
4216
+ "banner-only"
3207
4217
  ],
3208
- "description": "Colour theme. Defaults to \"dark\" — omit it and you get the dark navbar. (This entry previously documented \"light\", which the component never did.)"
4218
+ "default": "default"
3209
4219
  }
3210
4220
  }
3211
4221
  },
@@ -3861,8 +4871,8 @@
3861
4871
  "name": "Testimonial",
3862
4872
  "component": "Testimonial",
3863
4873
  "category": "testimonial",
3864
- "description": "Auto-advancing testimonial carousel showing one quote card at a time with decorative quote marks, author details, and dot pagination.",
3865
- "purpose": "A full-width testimonial carousel section that displays one quote card at a time — with decorative quote marks, the quote text, an optional author avatar, name, and location — and auto-advances through the slides every 5 seconds, with dot pagination for manual navigation. This block is designed to build trust with partner or customer voices, giving each quote full visual focus. The 5-second auto-advance is **not configurable** — there is no prop to slow it down or switch it off. The block's only props are `title`, `items` and `className`.",
4874
+ "description": "Testimonial section with two variants: an auto-advancing single-slide quote carousel with dot pagination (default), and a horizontally-scrollable row of star-rated Trustpilot review cards with a rating badge and prev/next controls (trustpilot).",
4875
+ "purpose": "A full-width testimonial section for showcasing partner or customer quotes. Ships in two variants: - **Default** — one quote card at a time, with decorative quote marks, an optional author avatar, name, and location; auto-advances every 5 seconds with dot pagination for manual navigation. - **Trustpilot** — a horizontally-scrollable row of star-rated review cards plus a \"Trustpilot\" rating badge and prev/next arrow controls. Modeled after the \"What our customers say\" section on deriv.com's homepage. The 5-second auto-advance is **not configurable** — there is no prop to slow it down or switch it off. The block's only props are `title`, `items` and `className`.",
3866
4876
  "keywords": [
3867
4877
  "testimonial",
3868
4878
  "quote",
@@ -3874,7 +4884,12 @@
3874
4884
  "customer",
3875
4885
  "trader",
3876
4886
  "trading",
3877
- "deriv"
4887
+ "deriv",
4888
+ "trustpilot",
4889
+ "star rating",
4890
+ "reviews",
4891
+ "customer feedback",
4892
+ "homepage"
3878
4893
  ],
3879
4894
  "sectionType": "testimonial",
3880
4895
  "global": false,
@@ -3882,10 +4897,14 @@
3882
4897
  "items"
3883
4898
  ],
3884
4899
  "optionalFields": [
3885
- "title"
4900
+ "title",
4901
+ "variant",
4902
+ "trustpilotUrl",
4903
+ "trustpilotScore"
3886
4904
  ],
3887
4905
  "variants": [
3888
- "default"
4906
+ "default",
4907
+ "trustpilot"
3889
4908
  ],
3890
4909
  "recommendedPosition": 6,
3891
4910
  "placement": [
@@ -3905,6 +4924,9 @@
3905
4924
  "autoAdvance": true,
3906
4925
  "dotPagination": true,
3907
4926
  "quoteMarks": true,
4927
+ "starRating": true,
4928
+ "reviewLinkOut": true,
4929
+ "brandRatingBadge": true,
3908
4930
  "primaryButton": false,
3909
4931
  "secondaryButton": false,
3910
4932
  "badge": false
@@ -3912,7 +4934,11 @@
3912
4934
  "imageRoles": [
3913
4935
  "author-avatar"
3914
4936
  ],
3915
- "defaultValues": {},
4937
+ "defaultValues": {
4938
+ "variant": "default",
4939
+ "trustpilotUrl": "https://www.trustpilot.com/review/deriv.com?utm_medium=trustbox&utm_source=Mini",
4940
+ "trustpilotScore": 4.5
4941
+ },
3916
4942
  "fields": {
3917
4943
  "items": {
3918
4944
  "type": "array",
@@ -3937,6 +4963,16 @@
3937
4963
  "type": "string",
3938
4964
  "required": true,
3939
4965
  "maxLength": 400
4966
+ },
4967
+ "rating": {
4968
+ "type": "number",
4969
+ "required": false,
4970
+ "min": 0,
4971
+ "max": 5
4972
+ },
4973
+ "reviewUrl": {
4974
+ "type": "string",
4975
+ "required": false
3940
4976
  }
3941
4977
  }
3942
4978
  },
@@ -3944,6 +4980,20 @@
3944
4980
  "type": "string",
3945
4981
  "required": false,
3946
4982
  "maxLength": 80
4983
+ },
4984
+ "trustpilotScore": {
4985
+ "type": "number",
4986
+ "required": false,
4987
+ "min": 0,
4988
+ "max": 5
4989
+ },
4990
+ "trustpilotUrl": {
4991
+ "type": "string",
4992
+ "required": false
4993
+ },
4994
+ "variant": {
4995
+ "type": "enum",
4996
+ "required": false
3947
4997
  }
3948
4998
  }
3949
4999
  },
@@ -4005,5 +5055,251 @@
4005
5055
  "maxLength": 300
4006
5056
  }
4007
5057
  }
5058
+ },
5059
+ "trading-calculator": {
5060
+ "id": "trading-calculator",
5061
+ "name": "TradingCalculator",
5062
+ "component": "TradingCalculator",
5063
+ "category": "tools",
5064
+ "description": "A live two-panel trading calculator for a searchable instrument picker across forex, synthetics, stocks, commodities, and crypto. Four variants share the same inputs and live data but each surface a different focused result: `main` (margin, trade volume, pip value, long/short swap together), `margin` (margin required only, mirrors deriv.com/trading-calculators/margin-calculator), `pip` (pip value only, mirrors deriv.com/trading-calculators/pip-calculator), and `swap` (long/short swap charges only, mirrors deriv.com/trading-calculators/swap-calculator). Fetches live instrument specs and USD exchange rates itself, no configuration required.",
5065
+ "purpose": "A two-panel \"Calculator\" / \"Results\" trading calculator: a searchable instrument picker plus volume and asset-price inputs on the left, and computed results on the right. Ships in four variants (`variant` prop) that share identical inputs, styling, and live data, but each surface a different focused subset of results — see [Variants](#variants) below. Modeled after deriv.com's own trading-calculators pages, and wired to the same live data they use — the component fetches Deriv's public instrument-specs feed on mount and, only when an instrument's currency isn't already USD, calls Deriv's public exchange-rate API to convert the result. No API keys or setup are required; both endpoints are public and unauthenticated, and every variant is connected to the same two data sources — there is no separate margin/pip/swap API, matching how the three reference pages themselves work. | `variant` | Mirrors | Results panel shows | |---|---|---| | `\"main\"` (default) | [deriv.com/trading-calculators](https://deriv.com/trading-calculators) | Margin Required, Trade Volume + Pip value, Swap Charge Long + Short, swap rate/type/three-day/weekend info | | `\"margin\"` | [deriv.com/trading-calculators/margin-calculator](https://deriv.com/trading-calculators/margin-calculator) | Margin Required only | | `\"pip\"` | [deriv.com/trading-calculators/pip-calculator](https://deriv.com/trading-calculators/pip-calculator) | Pip value only | | `\"swap\"` | [deriv.com/trading-calculators/swap-calculator](https://deriv.com/trading-calculators/swap-calculator) | Swap Charge Long + Short, swap rate/type/three-day/weekend info |",
5066
+ "keywords": [
5067
+ "calculator",
5068
+ "trading calculator",
5069
+ "margin calculator",
5070
+ "pip calculator",
5071
+ "swap calculator",
5072
+ "leverage",
5073
+ "lot size",
5074
+ "forex",
5075
+ "cfd",
5076
+ "trading tools",
5077
+ "instrument specs",
5078
+ "exchange rate",
5079
+ "deriv",
5080
+ "trading-calculators"
5081
+ ],
5082
+ "sectionType": "calculator",
5083
+ "global": false,
5084
+ "requiredFields": [],
5085
+ "optionalFields": [
5086
+ "variant",
5087
+ "symbols",
5088
+ "symbolsEndpoint",
5089
+ "exchangeRateWsUrl",
5090
+ "defaultSymbol"
5091
+ ],
5092
+ "variants": [
5093
+ "main",
5094
+ "margin",
5095
+ "pip",
5096
+ "swap"
5097
+ ],
5098
+ "recommendedPosition": 4,
5099
+ "placement": [
5100
+ "middle"
5101
+ ],
5102
+ "layout": {
5103
+ "alignment": "center",
5104
+ "carousel": false,
5105
+ "contentWidth": "large",
5106
+ "background": false,
5107
+ "overlay": false
5108
+ },
5109
+ "supports": {
5110
+ "backgroundImage": false,
5111
+ "liveData": true,
5112
+ "form": true,
5113
+ "primaryButton": true,
5114
+ "secondaryButton": true,
5115
+ "badge": false
5116
+ },
5117
+ "imageRoles": [],
5118
+ "defaultValues": {
5119
+ "variant": "main",
5120
+ "symbolsEndpoint": "https://deriv-static-pricingfeedv2.firebaseio.com/n8n/row/prod/dynamic_trading_specs.json",
5121
+ "exchangeRateWsUrl": "wss://ws.derivws.com/websockets/v3?app_id=1089"
5122
+ },
5123
+ "fields": {
5124
+ "defaultSymbol": {
5125
+ "type": "string",
5126
+ "required": false,
5127
+ "maxLength": 30
5128
+ },
5129
+ "exchangeRateWsUrl": {
5130
+ "type": "string",
5131
+ "required": false
5132
+ },
5133
+ "symbols": {
5134
+ "type": "array",
5135
+ "required": false,
5136
+ "itemFields": {
5137
+ "ask_last": {
5138
+ "type": "number",
5139
+ "required": true
5140
+ },
5141
+ "asset_class": {
5142
+ "type": "string",
5143
+ "required": true
5144
+ },
5145
+ "base_currency": {
5146
+ "type": "string",
5147
+ "required": true
5148
+ },
5149
+ "contract_size": {
5150
+ "type": "number",
5151
+ "required": true
5152
+ },
5153
+ "description": {
5154
+ "type": "string",
5155
+ "required": true
5156
+ },
5157
+ "effective_leverage": {
5158
+ "type": "number",
5159
+ "required": true
5160
+ },
5161
+ "market": {
5162
+ "type": "string",
5163
+ "required": true
5164
+ },
5165
+ "pip_size": {
5166
+ "type": "number",
5167
+ "required": true
5168
+ },
5169
+ "point_size": {
5170
+ "type": "number",
5171
+ "required": true
5172
+ },
5173
+ "profit_currency": {
5174
+ "type": "string",
5175
+ "required": true
5176
+ },
5177
+ "swap_mode": {
5178
+ "type": "string",
5179
+ "required": true
5180
+ },
5181
+ "swap_rate_long": {
5182
+ "type": "number",
5183
+ "required": true
5184
+ },
5185
+ "swap_rate_short": {
5186
+ "type": "number",
5187
+ "required": true
5188
+ },
5189
+ "symbol": {
5190
+ "type": "string",
5191
+ "required": true
5192
+ },
5193
+ "volume_limit": {
5194
+ "type": "number",
5195
+ "required": true
5196
+ },
5197
+ "volume_min": {
5198
+ "type": "number",
5199
+ "required": true
5200
+ }
5201
+ }
5202
+ },
5203
+ "symbolsEndpoint": {
5204
+ "type": "string",
5205
+ "required": false
5206
+ },
5207
+ "variant": {
5208
+ "type": "string",
5209
+ "required": false,
5210
+ "enum": [
5211
+ "main",
5212
+ "margin",
5213
+ "pip",
5214
+ "swap"
5215
+ ],
5216
+ "default": "main"
5217
+ }
5218
+ }
5219
+ },
5220
+ "trading-calculator-how-to": {
5221
+ "id": "trading-calculator-how-to",
5222
+ "name": "TradingCalculatorHowTo",
5223
+ "component": "TradingCalculatorHowTo",
5224
+ "category": "tools",
5225
+ "description": "A \"How to calculate…\" explainer section pairing a centered title/description with a two-column \"Formula\" / \"Example\" card, walking through a worked calculation with an annotated calculation strip. Four variants mirror deriv.com's margin/pip/swap calculator explainer content: `margin` (deriv.com/trading-calculators/margin-calculator), `pip` (deriv.com/trading-calculators/pip-calculator), and `swap-points`/`swap-percentage` (deriv.com/trading-calculators/swap-calculator), which both render the same interactive \"In points\" / \"In percentage\" tab switch and only differ in which of the two formulas starts active.",
5226
+ "purpose": "A \"How to calculate…\" explainer section: a centered title/description, then a two-column \"Formula\" / \"Example\" card that walks through one worked calculation using an annotated calculation strip (a boxed row of numbers, each connected by a small dot to a caption naming what it is — \"Lots\", \"Contract size\", \"Volume\", etc.). Modeled after the explainer content on deriv.com's own trading-calculators pages. Ships in four variants (`variant` prop); the two `swap-*` variants both render the same interactive \"In points\" / \"In percentage\" tab switch between the swap page's two formulas — they only differ in which formula starts active, a visitor can still click either tab afterwards regardless of which variant was set. | `variant` | Mirrors | Notes | |---|---|---| | `\"margin\"` (default) | [deriv.com/trading-calculators/margin-calculator](https://deriv.com/trading-calculators/margin-calculator) | One formula, two calculation strips (Volume, then Required margin) | | `\"pip\"` | [deriv.com/trading-calculators/pip-calculator](https://deriv.com/trading-calculators/pip-calculator) | One formula, one calculation strip | | `\"swap-points\"` | [deriv.com/trading-calculators/swap-calculator](https://deriv.com/trading-calculators/swap-calculator) | Interactive tab switch — \"Swap calculation (In points)\" / \"Swap calculation (In percentage)\" — opening on the points-based formula | | `\"swap-percentage\"` | [deriv.com/trading-calculators/swap-calculator](https://deriv.com/trading-calculators/swap-calculator) | Same interactive tab switch, opening on the percentage/rollover-price-based formula | This block is the worked-example/explainer companion to `TradingCalculator` (the live tool) — pair the two together, `TradingCalculatorHowTo` typically placed below `TradingCalculator` on the same page, exactly as deriv.com does on all three reference pages.",
5227
+ "keywords": [
5228
+ "how to calculate",
5229
+ "margin calculator",
5230
+ "pip calculator",
5231
+ "swap calculator",
5232
+ "formula",
5233
+ "worked example",
5234
+ "explainer",
5235
+ "leverage",
5236
+ "lot size",
5237
+ "forex",
5238
+ "cfd",
5239
+ "trading tools",
5240
+ "deriv",
5241
+ "trading-calculators"
5242
+ ],
5243
+ "sectionType": "explainer",
5244
+ "global": false,
5245
+ "requiredFields": [],
5246
+ "optionalFields": [
5247
+ "variant",
5248
+ "title",
5249
+ "description"
5250
+ ],
5251
+ "variants": [
5252
+ "margin",
5253
+ "pip",
5254
+ "swap-points",
5255
+ "swap-percentage"
5256
+ ],
5257
+ "recommendedPosition": 5,
5258
+ "placement": [
5259
+ "middle"
5260
+ ],
5261
+ "layout": {
5262
+ "alignment": "center",
5263
+ "carousel": false,
5264
+ "contentWidth": "large",
5265
+ "background": false,
5266
+ "overlay": false
5267
+ },
5268
+ "supports": {
5269
+ "backgroundImage": false,
5270
+ "liveData": false,
5271
+ "form": false,
5272
+ "primaryButton": false,
5273
+ "secondaryButton": false,
5274
+ "badge": false,
5275
+ "editableText": true
5276
+ },
5277
+ "imageRoles": [],
5278
+ "defaultValues": {
5279
+ "variant": "margin"
5280
+ },
5281
+ "fields": {
5282
+ "description": {
5283
+ "type": "string",
5284
+ "required": false,
5285
+ "maxLength": 200
5286
+ },
5287
+ "title": {
5288
+ "type": "string",
5289
+ "required": false,
5290
+ "maxLength": 80
5291
+ },
5292
+ "variant": {
5293
+ "type": "string",
5294
+ "required": false,
5295
+ "enum": [
5296
+ "margin",
5297
+ "pip",
5298
+ "swap-points",
5299
+ "swap-percentage"
5300
+ ],
5301
+ "default": "margin"
5302
+ }
5303
+ }
4008
5304
  }
4009
5305
  }