Changeset 3414465
- Timestamp:
- 12/08/2025 03:03:10 PM (3 months ago)
- Location:
- anyapi/trunk
- Files:
-
- 12 edited
-
anyapi.php (modified) (2 diffs)
-
assets/css/style.css (modified) (1 diff)
-
assets/css/style.css.map (modified) (1 diff)
-
assets/js/admin.js (modified) (1 diff)
-
assets/js/admin.min.js (modified) (1 diff)
-
inc/Admin.php (modified) (12 diffs)
-
inc/Anyapi.php (modified) (8 diffs)
-
inc/Controller/OrderIntegrations.php (modified) (3 diffs)
-
inc/Views/Dashboard.php (modified) (1 diff)
-
inc/Views/OrderApi.php (modified) (1 diff)
-
readme.txt (modified) (2 diffs)
-
templates/dashboard.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
anyapi/trunk/anyapi.php
r3394506 r3414465 9 9 * Plugin URI: https://www.anyapiplugin.com 10 10 * Description: No-Code WooCommerce REST API Integration. Connect Orders to any APIs with Automations, JSON Filter, API logs, and Easy Setup in Minutes. 11 * Version: 1.1. 311 * Version: 1.1.4 12 12 * Author: JC 13 13 * Author URI: https://www.anyapiplugin.com … … 22 22 if ( ! function_exists( 'add_action' ) ) { exit; } 23 23 24 define( 'ANYAPI_VERSION', '1.1. 3' );24 define( 'ANYAPI_VERSION', '1.1.4' ); 25 25 define( 'ANYAPI_ASSETS', '1.0.0' ); 26 26 -
anyapi/trunk/assets/css/style.css
r3394506 r3414465 1050 1050 } 1051 1051 } 1052 :root { 1053 --anyapi-bg: #f6f7f7; 1054 --anyapi-card: #fff; 1055 --anyapi-primary: #5d5fef; 1056 --anyapi-primary-hover: #4c4ddc; 1057 --anyapi-text: #1a1a2e; 1058 --anyapi-success: #00c48c; 1059 --anyapi-danger: #ff6b6b; 1060 } 1061 .dark-mode { 1062 --anyapi-bg: #0f1121; 1063 --anyapi-card: #161827; 1064 --anyapi-primary: #7b7cff; 1065 --anyapi-primary-hover: #9697ff; 1066 --anyapi-text: ##b2b2fa; 1067 --anyapi-success: #00d4a0; 1068 --anyapi-danger: #ff6b9d; 1069 } 1070 #anyapi-review-banner { 1071 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 1072 color: white; 1073 padding: 20px 30px; 1074 border-radius: 20px; 1075 margin: 30px 0; 1076 box-shadow: 0 20px 40px rgba(102, 126, 234, 0.3), 1077 0 10px 20px rgba(118, 75, 162, 0.2); 1078 position: relative; 1079 overflow: hidden; 1080 animation: slideDown 0.6s ease-out; 1081 } 1082 #anyapi-review-banner::before { 1083 content: ""; 1084 position: absolute; 1085 top: 0; 1086 left: -100%; 1087 width: 100%; 1088 height: 100%; 1089 background: linear-gradient( 1090 90deg, 1091 transparent, 1092 rgba(255, 255, 255, 0.1), 1093 transparent 1094 ); 1095 animation: shimmer 3s infinite; 1096 } 1097 .review-content { 1098 display: flex; 1099 align-items: center; 1100 gap: 20px; 1101 max-width: 1000px; 1102 margin: 0 auto; 1103 } 1104 .review-icon { 1105 font-size: 32px; 1106 animation: float 3s ease-in-out infinite; 1107 } 1108 .review-text h3 { 1109 margin: 0 0 4px 0; 1110 font-size: 22px; 1111 font-weight: 700; 1112 } 1113 .review-text p { 1114 margin: 0 0 8px 0; 1115 opacity: 0.9; 1116 font-size: 16px; 1117 } 1118 .review-stars { 1119 font-size: 20px; 1120 margin-top: 4px; 1121 animation: sparkle 2s ease-in-out infinite; 1122 } 1123 .review-actions { 1124 display: flex; 1125 gap: 12px; 1126 margin-left: auto; 1127 } 1128 .review-actions .button { 1129 padding: 12px 24px !important; 1130 font-weight: 600 !important; 1131 border-radius: 12px !important; 1132 transition: all 0.3s ease !important; 1133 } 1134 .review-actions .button-primary { 1135 background: #fff !important; 1136 color: #667eea !important; 1137 box-shadow: 0 8px 20px rgba(255, 255, 255, 0.3) !important; 1138 } 1139 .review-actions .button-primary:hover { 1140 transform: translateY(-2px); 1141 box-shadow: 0 12px 30px rgba(255, 255, 255, 0.4) !important; 1142 } 1143 .review-close { 1144 position: absolute; 1145 top: 12px; 1146 right: 20px; 1147 background: none; 1148 border: none; 1149 color: rgba(255, 255, 255, 0.8); 1150 font-size: 24px; 1151 width: 32px; 1152 height: 32px; 1153 border-radius: 50%; 1154 cursor: pointer; 1155 transition: all 0.3s ease; 1156 } 1157 .review-close:hover { 1158 background: rgba(255, 255, 255, 0.2); 1159 color: white; 1160 transform: rotate(90deg); 1161 } 1162 @keyframes slideDown { 1163 from { 1164 opacity: 0; 1165 transform: translateY(-30px); 1166 } 1167 to { 1168 opacity: 1; 1169 transform: translateY(0); 1170 } 1171 } 1172 @keyframes shimmer { 1173 0% { 1174 left: -100%; 1175 } 1176 100% { 1177 left: 100%; 1178 } 1179 } 1180 @keyframes float { 1181 0%, 1182 100% { 1183 transform: translateY(0px); 1184 } 1185 50% { 1186 transform: translateY(-10px); 1187 } 1188 } 1189 @keyframes sparkle { 1190 0%, 1191 100% { 1192 opacity: 1; 1193 } 1194 50% { 1195 opacity: 0.7; 1196 } 1197 } 1198 @media (max-width: 768px) { 1199 .review-content { 1200 flex-direction: column; 1201 text-align: center; 1202 gap: 16px; 1203 } 1204 .review-actions { 1205 margin-left: 0 !important; 1206 justify-content: center; 1207 flex-wrap: wrap; 1208 } 1209 } 1210 #anyapi-dashboard { 1211 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 1212 background: var(--anyapi-bg); 1213 min-height: 80vh; 1214 padding: 20px; 1215 border-radius: 8px; 1216 } 1217 #anyapi-last-updated { 1218 font-size: 13px; 1219 color: #646970; 1220 margin-top: 10px; 1221 margin-left: 15px; 1222 white-space: nowrap; 1223 float: right; 1224 } 1225 .anyapi-main-grid { 1226 display: grid; 1227 grid-template-columns: 1fr 320px; 1228 gap: 30px; 1229 margin-top: 20px; 1230 } 1231 @media (max-width: 1200px) { 1232 .anyapi-main-grid { 1233 grid-template-columns: 1fr; 1234 } 1235 .anyapi-sidebar { 1236 order: -1; 1237 } 1238 } 1239 .anyapi-grid { 1240 display: grid; 1241 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); 1242 gap: 20px; 1243 margin-bottom: 30px; 1244 } 1245 .anyapi-card { 1246 background: var(--anyapi-card); 1247 padding: 24px; 1248 border-radius: 12px; 1249 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); 1250 transition: transform 0.2s; 1251 } 1252 .anyapi-card:hover { 1253 transform: translateY(-4px); 1254 } 1255 .anyapi-card h3 { 1256 margin: 0 0 12px; 1257 font-size: 14px; 1258 color: #646970; 1259 text-transform: uppercase; 1260 letter-spacing: 0.5px; 1261 } 1262 .anyapi-card .value { 1263 font-size: 32px; 1264 font-weight: 700; 1265 color: #1d2327; 1266 margin: 8px 0 0; 1267 } 1268 .anyapi-card .change { 1269 font-size: 14px; 1270 } 1271 .positive { 1272 color: var(--anyapi-success); 1273 } 1274 .warning { 1275 color: #dba617; 1276 } 1277 .negative { 1278 color: var(--anyapi-danger); 1279 } 1280 .anyapi-charts-row { 1281 display: grid; 1282 grid-template-columns: 2fr 1fr; 1283 gap: 20px; 1284 margin-bottom: 30px; 1285 } 1286 @media (max-width: 960px) { 1287 .anyapi-charts-row { 1288 grid-template-columns: 1fr; 1289 } 1290 } 1291 .anyapi-chart-card { 1292 background: var(--anyapi-card); 1293 padding: 24px; 1294 border-radius: 12px; 1295 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); 1296 } 1297 .anyapi-chart-card h2 { 1298 margin-top: 0; 1299 font-size: 18px; 1300 } 1301 #anyapi-logs-section { 1302 background: var(--anyapi-card); 1303 border-radius: 12px; 1304 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); 1305 overflow: hidden; 1306 } 1307 #anyapi-logs-header { 1308 padding: 20px 24px; 1309 border-bottom: 1px solid #e2e4e7; 1310 display: flex; 1311 justify-content: space-between; 1312 align-items: center; 1313 } 1314 #anyapi-logs-section .logs-controls { 1315 display: flex; 1316 gap: 12px; 1317 align-items: center; 1318 } 1319 #anyapi-log-search { 1320 padding: 10px 16px; 1321 border: 1px solid #ddd; 1322 border-radius: 12px; 1323 width: 300px; 1324 max-width: 100%; 1325 } 1326 .method-post { 1327 background: #7c3aed; 1328 color: white; 1329 padding: 4px 10px; 1330 border-radius: 8px; 1331 font-size: 11px; 1332 font-weight: bold; 1333 } 1334 .status-badge { 1335 padding: 4px 10px; 1336 border-radius: 8px; 1337 font-weight: bold; 1338 font-size: 12px; 1339 } 1340 .status-badge.success { 1341 background: #10b981; 1342 color: white; 1343 } 1344 .status-badge.warning { 1345 background: #f59e0b; 1346 color: white; 1347 } 1348 .status-badge.error { 1349 background: #ef4444; 1350 color: white; 1351 } 1352 .endpoint code { 1353 font-size: 12px; 1354 background: #f3f4f6; 1355 padding: 2px 6px; 1356 border-radius: 4px; 1357 } 1358 .payload pre { 1359 margin: 0; 1360 font-size: 11px; 1361 color: #666; 1362 white-space: pre-wrap; 1363 word-break: break-all; 1364 } 1365 #anyapi-logs-footer { 1366 display: flex; 1367 justify-content: space-between; 1368 margin-top: 16px; 1369 font-size: 14px; 1370 color: #666; 1371 } 1372 #anyapi-log-search { 1373 padding: 8px 12px; 1374 border: 1px solid #ddd; 1375 border-radius: 6px; 1376 width: 300px; 1377 } 1378 #anyapi-logs-table { 1379 width: 100%; 1380 border-collapse: collapse; 1381 } 1382 #anyapi-logs-table th { 1383 background: #f9fafb; 1384 text-align: left; 1385 padding: 12px 16px; 1386 font-weight: 600; 1387 color: #1d2327; 1388 } 1389 #anyapi-logs-table td { 1390 padding: 12px 16px; 1391 border-top: 1px solid #e2e4e7; 1392 font-size: 14px; 1393 } 1394 .status-2xx { 1395 color: var(--anyapi-success); 1396 } 1397 .status-4xx { 1398 color: var(--anyapi-danger); 1399 } 1400 .status-5xx { 1401 color: var(--anyapi-danger); 1402 font-weight: bold; 1403 } 1404 .payload { 1405 font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; 1406 font-size: 12px; 1407 color: #646970; 1408 max-width: 300px; 1409 overflow: hidden; 1410 text-overflow: ellipsis; 1411 white-space: nowrap; 1412 } 1413 .loading { 1414 text-align: center; 1415 padding: 60px; 1416 font-size: 18px; 1417 color: #646970; 1418 } 1419 .anyapi-sidebar { 1420 display: flex; 1421 flex-direction: column; 1422 gap: 20px; 1423 } 1424 .anyapi-sidebar-card { 1425 background: var(--anyapi-card); 1426 padding: 20px; 1427 border-radius: 12px; 1428 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); 1429 border: 1px solid #e2e4e7; 1430 } 1431 .anyapi-sidebar-card h3 { 1432 margin: 0 0 12px; 1433 font-size: 16px; 1434 color: #1d2327; 1435 } 1436 .dashicons-yes-alt { 1437 color: #00a32a; 1438 } 1439 .dashicons-warning { 1440 color: #dba617; 1441 } 1442 .dashicons-update { 1443 color: #f56e14; 1444 animation: anyapi-spin 2s linear infinite; 1445 } 1446 .anyapi-new-version-notice { 1447 font-size: 12px; 1448 color: #d63638; 1449 font-weight: bold; 1450 margin: 8px 0 4px; 1451 } 1452 .anyapi-new-version-notice small { 1453 font-weight: normal; 1454 color: #666; 1455 } 1456 .anyapi-update-box { 1457 margin: 10px 0; 1458 padding: 12px; 1459 background: #fff8e5; 1460 border-left: 4px solid #ffb900; 1461 font-size: 11px; 1462 line-height: 1.4; 1463 } 1464 .anyapi-update-box strong { 1465 font-size: 11px; 1466 display: block; 1467 margin-bottom: 4px; 1468 } 1469 .anyapi-update-box ul { 1470 margin: 6px 0 8px; 1471 padding-left: 18px; 1472 line-height: 1.4; 1473 } 1474 .anyapi-update-box ul li { 1475 margin-bottom: 2px; 1476 } 1477 .anyapi-update-box .anyapi-update-button { 1478 background: #d63638; 1479 border-color: #d63638; 1480 box-shadow: none; 1481 text-shadow: none; 1482 color: #fff !important; 1483 } 1484 .anyapi-update-box .anyapi-update-button:hover, 1485 .anyapi-update-box .anyapi-update-button:focus { 1486 background: #c02a2a; 1487 border-color: #c02a2a; 1488 } 1489 .anyapi-update-box .anyapi-view-details { 1490 margin-left: 8px; 1491 font-size: 10px; 1492 color: #666; 1493 } 1494 .anyapi-update-box .anyapi-view-details:hover { 1495 color: #d63638; 1496 } 1497 .anyapi-latest-text { 1498 font-size: 12px; 1499 color: #646970; 1500 } 1501 @keyframes anyapi-spin { 1502 from { 1503 transform: rotate(0deg); 1504 } 1505 to { 1506 transform: rotate(360deg); 1507 } 1508 } 1509 .anyapi-upgrade { 1510 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 1511 color: white; 1512 position: relative; 1513 overflow: hidden; 1514 } 1515 .anyapi-upgrade::before { 1516 content: ""; 1517 position: absolute; 1518 top: -50%; 1519 right: -50%; 1520 width: 200%; 1521 height: 200%; 1522 background: rgba(255, 255, 255, 0.1); 1523 transform: rotate(30deg); 1524 } 1525 .anyapi-upgrade h3, 1526 .anyapi-upgrade p, 1527 .anyapi-upgrade li { 1528 color: white; 1529 } 1530 .anyapi-upgrade .badge { 1531 position: absolute; 1532 top: 12px; 1533 right: 12px; 1534 background: #ffb900; 1535 color: #000; 1536 padding: 4px 10px; 1537 border-radius: 20px; 1538 font-size: 11px; 1539 font-weight: bold; 1540 } 1541 .anyapi-upgrade .features { 1542 margin: 16px 0; 1543 padding-left: 20px; 1544 } 1545 .anyapi-upgrade .features li { 1546 margin-bottom: 8px; 1547 position: relative; 1548 } 1549 .anyapi-upgrade .features li::before { 1550 content: "✓"; 1551 position: absolute; 1552 left: -20px; 1553 } 1554 .anyapi-upgrade .button-primary { 1555 background: white; 1556 color: #667eea; 1557 font-weight: bold; 1558 } 1559 .anyapi-button-block { 1560 display: block; 1561 text-align: center; 1562 } 1563 .anyapi-save { 1564 text-align: center; 1565 margin-top: 12px; 1566 font-size: 14px; 1567 opacity: 0.9; 1568 } 1569 .anyapi-quick-links { 1570 list-style: none; 1571 padding: 0; 1572 margin: 0; 1573 } 1574 .anyapi-quick-links li { 1575 margin-bottom: 8px; 1576 } 1577 .anyapi-quick-links a { 1578 color: #0073aa; 1579 text-decoration: none; 1580 } 1581 .anyapi-quick-links a:hover { 1582 text-decoration: underline; 1583 } 1584 .anyapi-bottom-grid { 1585 display: grid; 1586 grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); 1587 gap: 20px; 1588 margin-top: 40px; 1589 } 1590 .anyapi-info-card { 1591 background: var(--anyapi-card); 1592 padding: 24px; 1593 border-radius: 12px; 1594 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); 1595 border: 1px solid #e2e4e7; 1596 text-align: center; 1597 } 1598 .anyapi-info-card h3 { 1599 margin: 0 0 12px; 1600 color: #1d2327; 1601 } 1602 .anyapi-info-card p { 1603 color: #646970; 1604 margin-bottom: 20px; 1605 line-height: 1.5; 1606 } 1607 .anyapi-info-card .button { 1608 width: 100%; 1609 } 1610 #anyapi-dashboard-header { 1611 position: relative; 1612 display: flex; 1613 justify-content: space-between; 1614 align-items: center; 1615 min-height: 64px; 1616 padding: 0 24px; 1617 margin-bottom: 28px; 1618 flex-wrap: wrap; 1619 gap: 16px; 1620 } 1621 .anyapi-header-left { 1622 display: flex; 1623 align-items: center; 1624 gap: 12px; 1625 } 1626 .anyapi-logo { 1627 height: 40px; 1628 width: auto; 1629 } 1630 .anyapi-logo svg { 1631 border-radius: 8px; 1632 transition: transform 0.2s; 1633 } 1634 .anyapi-logo:hover svg { 1635 transform: scale(1.08); 1636 } 1637 .anyapi-header-right { 1638 position: absolute; 1639 right: 20px; 1640 top: 50%; 1641 transform: translateY(-50%); 1642 } 1643 @media (max-width: 782px) { 1644 #anyapi-dashboard-header { 1645 padding: 0 16px; 1646 } 1647 .anyapi-header-right { 1648 right: 16px; 1649 } 1650 } 1651 #dark-mode-toggle { 1652 position: relative; 1653 width: 56px; 1654 height: 28px; 1655 background: #ccd0d5; 1656 border-radius: 50px; 1657 border: none; 1658 cursor: pointer; 1659 overflow: hidden; 1660 transition: background 0.3s; 1661 } 1662 #dark-mode-toggle .toggle-ball { 1663 position: absolute; 1664 top: 4px; 1665 left: 4px; 1666 width: 20px; 1667 height: 20px; 1668 background: white; 1669 border-radius: 50%; 1670 transition: transform 0.3s; 1671 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); 1672 } 1673 #dark-mode-toggle .sun-icon, 1674 #dark-mode-toggle .moon-icon { 1675 position: absolute; 1676 top: 6px; 1677 font-size: 14px; 1678 transition: opacity 0.3s; 1679 } 1680 #dark-mode-toggle .sun-icon { 1681 left: 8px; 1682 opacity: 1; 1683 } 1684 #dark-mode-toggle .moon-icon { 1685 right: 8px; 1686 opacity: 0; 1687 } 1688 .dark-mode #dark-mode-toggle { 1689 background: #6366f1; 1690 } 1691 .dark-mode #dark-mode-toggle .toggle-ball { 1692 transform: translateX(28px); 1693 } 1694 .dark-mode #dark-mode-toggle .sun-icon { 1695 opacity: 0; 1696 } 1697 .dark-mode #dark-mode-toggle .moon-icon { 1698 opacity: 1; 1699 } 1700 .dark-mode { 1701 background: #1e1e1e; 1702 color: #e0e0e0; 1703 } 1704 .dark-mode #anyapi-dashboard, 1705 .dark-mode .anyapi-card, 1706 .dark-mode .chart-card, 1707 .dark-mode #logs-section, 1708 .dark-mode .anyapi-sidebar-card, 1709 .dark-mode .anyapi-info-card { 1710 background: #2d2d2d; 1711 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); 1712 border-color: #444; 1713 } 1714 .dark-mode .anyapi-card h3, 1715 .dark-mode .chart-card h2, 1716 .dark-mode #logs-table th, 1717 .dark-mode .anyapi-info-card h3 { 1718 color: #a0a0a0; 1719 } 1720 .dark-mode .value, 1721 .dark-mode #logs-table td { 1722 color: var(--anyapi-text); 1723 } 1724 .dark-mode #logs-table th { 1725 background: #363636; 1726 } 1727 .dark-mode .status-2xx { 1728 color: var(--anyapi-success); 1729 } 1730 .dark-mode .status-4xx, 1731 .dark-mode .status-5xx { 1732 color: var(--anyapi-danger); 1733 } 1734 :root { 1735 --anyapi-purple: #7b68ee; 1736 --anyapi-gray-light: #f8f9fa; 1737 --anyapi-gray: #6c757d; 1738 } 1739 .dark-mode { 1740 --anyapi-purple: #a78bfa; 1741 --anyapi-gray-light: #2d3748; 1742 --anyapi-gray: #a0aec0; 1743 } 1744 .integration-main { 1745 display: grid; 1746 grid-template-columns: 200px 1fr; 1747 gap: 30px; 1748 margin: 20px 0; 1749 } 1750 .steps-sidebar { 1751 background: var(--anyapi-card); 1752 border-radius: 12px; 1753 padding: 20px; 1754 height: -moz-fit-content; 1755 height: fit-content; 1756 } 1757 .step-item { 1758 display: flex; 1759 align-items: center; 1760 gap: 12px; 1761 padding: 12px 0; 1762 cursor: pointer; 1763 transition: color 0.3s; 1764 } 1765 .step-item.active .step-number { 1766 background: var(--anyapi-purple); 1767 color: white; 1768 } 1769 .step-number { 1770 width: 32px; 1771 height: 32px; 1772 border-radius: 50%; 1773 background: var(--anyapi-gray-light); 1774 display: grid; 1775 place-items: center; 1776 font-weight: bold; 1777 } 1778 .step-label { 1779 font-size: 14px; 1780 color: var(--anyapi-text-muted); 1781 } 1782 .integration-content { 1783 position: relative; 1784 } 1785 .step-content { 1786 display: none; 1787 animation: fadeIn 0.3s; 1788 } 1789 .step-content.active { 1790 display: block; 1791 } 1792 @keyframes fadeIn { 1793 from { 1794 opacity: 0; 1795 transform: translateX(10px); 1796 } 1797 to { 1798 opacity: 1; 1799 transform: translateX(0); 1800 } 1801 } 1802 .form-group { 1803 margin-bottom: 24px; 1804 } 1805 .form-group label { 1806 display: block; 1807 margin-bottom: 8px; 1808 font-weight: 600; 1809 color: var(--anyapi-text); 1810 } 1811 .form-group input, 1812 .form-group select, 1813 .form-group textarea { 1814 width: 100%; 1815 padding: 12px; 1816 border: 1px solid var(--anyapi-border); 1817 border-radius: 8px; 1818 background: var(--anyapi-card); 1819 transition: border-color 0.3s; 1820 } 1821 .form-group input:focus, 1822 .form-group select:focus, 1823 .form-group textarea:focus { 1824 outline: none; 1825 border-color: var(--anyapi-primary); 1826 } 1827 .required { 1828 color: var(--anyapi-danger); 1829 } 1830 .help-text { 1831 color: var(--anyapi-text-muted); 1832 font-size: 12px; 1833 } 1834 .filter-mode-toggle { 1835 display: flex; 1836 gap: 8px; 1837 margin: 12px 0; 1838 } 1839 .mode-btn { 1840 padding: 8px 16px; 1841 border: 1px solid var(--anyapi-border); 1842 background: var(--anyapi-card); 1843 border-radius: 6px; 1844 cursor: pointer; 1845 } 1846 .mode-btn.active { 1847 background: var(--anyapi-primary); 1848 color: white; 1849 border-color: var(--anyapi-primary); 1850 } 1851 .json-preview { 1852 background: #1e1e1e; 1853 border-radius: 8px; 1854 padding: 16px; 1855 margin: 16px 0; 1856 overflow: auto; 1857 } 1858 .json-preview pre { 1859 margin: 0; 1860 color: #f8f8f2; 1861 font-family: "Courier New", monospace; 1862 font-size: 14px; 1863 } 1864 .actions-grid { 1865 display: grid; 1866 grid-template-columns: 1fr 1fr; 1867 gap: 20px; 1868 margin-bottom: 24px; 1869 } 1870 .action-card { 1871 background: var(--anyapi-card); 1872 padding: 20px; 1873 border-radius: 12px; 1874 border: 1px solid var(--anyapi-border); 1875 } 1876 .action-card h3 { 1877 margin-top: 0; 1878 color: var(--anyapi-text); 1879 } 1880 .action-card label { 1881 display: block; 1882 margin: 8px 0; 1883 cursor: pointer; 1884 } 1885 .integration-footer { 1886 display: flex; 1887 justify-content: flex-end; 1888 gap: 12px; 1889 padding: 20px 0; 1890 border-top: 1px solid var(--anyapi-border); 1891 } 1892 .preview-json-btn { 1893 background: var(--anyapi-danger); 1894 color: white; 1895 } 1896 @media (max-width: 960px) { 1897 .integration-main { 1898 grid-template-columns: 1fr; 1899 } 1900 .steps-sidebar { 1901 order: -1; 1902 display: flex; 1903 justify-content: center; 1904 } 1905 .step-item { 1906 flex-direction: column; 1907 text-align: center; 1908 } 1909 .actions-grid { 1910 grid-template-columns: 1fr; 1911 } 1912 } 1913 #anyapi-status { 1914 background: var(--anyapi-bg); 1915 min-height: 100vh; 1916 } 1917 .anyapi-notice.success { 1918 background: linear-gradient(90deg, #10b981 0%, #34d399 100%); 1919 color: white; 1920 padding: 16px 24px; 1921 border-radius: 12px; 1922 font-weight: 600; 1923 display: flex; 1924 align-items: center; 1925 justify-content: space-between; 1926 margin: 20px 0; 1927 box-shadow: 0 4px 20px rgba(16, 185, 129, 0.2); 1928 } 1929 .notice-actions { 1930 display: flex; 1931 gap: 8px; 1932 } 1933 .integration-card { 1934 background: var(--anyapi-card); 1935 border: 1px solid var(--anyapi-border); 1936 border-radius: 16px; 1937 overflow: hidden; 1938 margin: 30px 0; 1939 box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08); 1940 } 1941 .integration-row { 1942 display: grid; 1943 grid-template-columns: 100px 1fr 120px 1fr 100px 1fr; 1944 gap: 16px; 1945 padding: 24px; 1946 align-items: center; 1947 flex-wrap: wrap; 1948 } 1949 @media (max-width: 1280px) { 1950 .integration-row { 1951 grid-template-columns: 1fr 1fr; 1952 gap: 20px; 1953 } 1954 } 1955 @media (max-width: 782px) { 1956 .integration-row { 1957 grid-template-columns: 1fr; 1958 text-align: center; 1959 } 1960 } 1961 .badge { 1962 padding: 8px 16px; 1963 border-radius: 50px; 1964 font-size: 13px; 1965 font-weight: 700; 1966 text-align: center; 1967 white-space: nowrap; 1968 } 1969 .badge.purple { 1970 background: #7b68ee; 1971 color: white; 1972 } 1973 .badge.gray { 1974 background: #e2e8f0; 1975 color: #475569; 1976 } 1977 .code-snippet { 1978 background: #1e1e1e; 1979 color: #a6e22e; 1980 padding: 12px 16px; 1981 border-radius: 12px; 1982 font-family: "SFMono-Regular", Consolas, monospace; 1983 font-size: 13px; 1984 overflow: hidden; 1985 text-overflow: ellipsis; 1986 white-space: nowrap; 1987 max-width: 100%; 1988 } 1989 .dark-mode .code-snippet { 1990 background: #2d2d2d; 1991 color: #89ddff; 1992 } 1993 .status-action { 1994 text-align: center; 1995 margin: 40px 0; 1996 } 1997 .button-warning { 1998 background: #f59e0b !important; 1999 color: white !important; 2000 padding: 14px 32px !important; 2001 font-size: 16px; 2002 border-radius: 12px; 2003 } 2004 .status-footer { 2005 text-align: center; 2006 margin: 60px 0 20px; 2007 } 2008 .dark-mode .anyapi-notice.success { 2009 background: linear-gradient(90deg, #059669 0%, #10b981 100%); 2010 } 2011 .dark-mode .integration-card { 2012 box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); 2013 } 2014 .completion-wrapper { 2015 text-align: center; 2016 max-width: 900px; 2017 margin: 0 auto; 2018 padding: 20px; 2019 } 2020 .completion-header h2 { 2021 font-size: 28px; 2022 margin: 16px 0; 2023 color: var(--anyapi-text); 2024 } 2025 .success-icon { 2026 font-size: 64px; 2027 color: #10b981; 2028 } 2029 .completion-actions { 2030 margin: 30px 0; 2031 display: flex; 2032 gap: 12px; 2033 justify-content: center; 2034 flex-wrap: wrap; 2035 } 2036 .integration-card.standalone { 2037 margin: 40px auto; 2038 max-width: 100%; 2039 } 2040 .final-cta { 2041 margin: 50px 0; 2042 } 2043 .button-hero { 2044 padding: 18px 40px !important; 2045 font-size: 18px !important; 2046 border-radius: 16px; 2047 box-shadow: 0 8px 25px rgba(245, 158, 11, 0.4); 2048 } 2049 .completion-footer { 2050 margin-top: 60px; 2051 display: flex; 2052 gap: 20px; 2053 justify-content: center; 2054 flex-wrap: wrap; 2055 } 2056 .test-api-section { 2057 margin: 50px auto; 2058 text-align: center; 2059 } 2060 .button-success { 2061 background: linear-gradient(135deg, #10b981, #34d399) !important; 2062 color: white !important; 2063 border: none; 2064 padding: 18px 40px !important; 2065 font-size: 18px; 2066 border-radius: 16px; 2067 box-shadow: 0 10px 30px rgba(16, 185, 129, 0.4); 2068 transition: all 0.3s; 2069 } 2070 .button-success:hover { 2071 transform: translateY(-3px); 2072 box-shadow: 0 15px 40px rgba(16, 185, 129, 0.5); 2073 } 2074 .button-success.loading { 2075 opacity: 0.7; 2076 cursor: not-allowed; 2077 position: relative; 2078 } 2079 .button-success.loading::after { 2080 content: ""; 2081 position: absolute; 2082 width: 20px; 2083 height: 20px; 2084 border: 3px solid #fff; 2085 border-top-color: transparent; 2086 border-radius: 50%; 2087 animation: spin 1s linear infinite; 2088 right: 20px; 2089 } 2090 @keyframes spin { 2091 to { 2092 transform: rotate(360deg); 2093 } 2094 } 2095 .test-result { 2096 margin-top: 30px; 2097 padding: 20px; 2098 border-radius: 12px; 2099 font-family: "SFMono-Regular", monospace; 2100 font-size: 14px; 2101 text-align: left; 2102 max-width: 800px; 2103 margin-left: auto; 2104 margin-right: auto; 2105 border: 1px solid; 2106 } 2107 .test-result.success { 2108 background: #ecfdf5; 2109 border-color: #10b981; 2110 color: #065f46; 2111 } 2112 .test-result.error { 2113 background: #fee2e2; 2114 border-color: #ef4444; 2115 color: #991b1b; 2116 } 2117 .dark-mode .test-result.success { 2118 background: #064e3b; 2119 color: #86efac; 2120 } 2121 .dark-mode .test-result.error { 2122 background: #7f1d1d; 2123 color: #fca5a5; 2124 } 1052 2125 1053 2126 /*# sourceMappingURL=style.css.map */ -
anyapi/trunk/assets/css/style.css.map
r3394506 r3414465 1 {"version":3,"sources":["modules/tabs.scss","modules/button.scss","modules/checkbox.scss","modules/table.scss","modules/form.scss","modules/features.scss","modules/pretty.scss","modules/general.scss","modules/desert.scss" ],"names":[],"mappings":"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","file":"style.css","sourcesContent":[".nav-tabs,\n.nav-tabs-tools,\n.nav-tabs-filter,\n.nav-tabs-api,\n.nav-tabs-apiauth {\n float: left;\n width: 100%;\n margin: 0;\n list-style-type: none;\n border-bottom: 1px solid transparent;\n\n > li {\n float: left;\n margin-bottom: -1px;\n\n > a {\n margin-right: 2px;\n line-height: 1.5;\n padding: 10px;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n float: left;\n text-decoration: none;\n\n &:hover {\n border-color: #eee #eee #ddd;\n }\n }\n\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border-color: transparent;\n }\n }\n }\n}\n\n.tab-content > .tab-pane,\n.tab-content-tools > .tab-pane-tools {\n float: left;\n width: 98%;\n display: none;\n\n &.active {\n display: block;\n padding: 10px;\n background-color: #fff;\n box-shadow: 0 5px 4px -2px rgba(0, 0, 0, 0.15);\n }\n}\n\n#top-btn {\n display: none;\n position: fixed;\n bottom: 20px;\n right: 30px;\n z-index: 99;\n font-size: 18px;\n border: none;\n outline: none;\n background-color: purple;\n color: white;\n cursor: pointer;\n padding: 15px;\n border-radius: 4px;\n}\n\n#top-btn:hover {\n background-color: #555;\n}\n","/**************************/\n/* Tags */\n/**************************/\n\n.tag {\n display: inline-block;\n text-decoration: none;\n padding: 0.4rem 0.8rem; /* 0.4 0.8*/\n font-size: 0.9rem; /* 1.2 */\n color: none;\n border-radius: 100px;\n font-weight: 300;\n}\n\n.tag.small {\n font-size: 0.8rem;\n border-radius: 3px;\n font-weight: 300;\n}\n\n.tag.medium {\n font-size: 0.9rem;\n border-radius: 15px;\n font-weight: 300;\n}\n\n.tag.large {\n font-size: 1.4rem;\n border-radius: 15px;\n font-weight: 400;\n}\n\n.tag.step {\n font-size: 1.2rem;\n border-radius: 50px;\n font-weight: 500;\n}\n\n.tag.uppercase {\n text-transform: uppercase;\n}\n\n/* Basic */\n.tag--woo {\n color: #eee;\n background-color: rgb(108, 59, 164);\n}\n\n.tag--woorev {\n color: rgb(108, 59, 164);\n background-color: #eee;\n}\n\n.tag--wooadv {\n color: #eee;\n background-color: rgb(218, 179, 254);\n}\n\n.tag--auth {\n color: #333;\n background-color: rgb(246, 169, 14);\n}\n\n.tag--attr {\n color: #333;\n background-color: rgb(206, 206, 206);\n}\n\n.tag--large {\n color: #333;\n background-color: #eee;\n}\n\n/* Attributes */\n.tag--order {\n color: #eee;\n background-color: rgb(132, 95, 132);\n}\n\n.tag--billing {\n color: #333;\n background-color: rgb(206, 206, 206);\n}\n\n.tag--fields {\n color: lightblue;\n background-color: rgb(25, 25, 25);\n}\n\n/* Features */\n.tag--codefree {\n // background-color: rgb(249, 222, 0);\n color: #fff;\n background-color: #11111a;\n}\n\n.tag--secure {\n color: #fff;\n background-color: rgb(10, 151, 218);\n}\n\n.tag--notice {\n // background-color: #dd6413;\n color: #fff;\n background-color: #4a4af3;\n}\n\n.tag--new {\n color: #11111a;\n background-color: #f34a4a;\n}\n\n.tag--cap {\n color: #f34a4a;\n background-color: #11111a;\n}\n\n/* License */\n.tag--disable {\n color: #fff;\n background-color: rgb(231, 0, 0);\n}\n\n.tag--enable {\n color: #fff;\n background-color: #43aa8b;\n // background-color: rgb(48, 154, 62);\n}\n\n/**************************/\n/* Dynamic Tags */\n/**************************/\n\n.tag.available:hover {\n cursor: pointer;\n opacity: 0.7;\n}\n\n.tag.selected {\n cursor: pointer;\n opacity: 0.7;\n}\n\n.tag.disabled {\n color: white;\n background-color: #d2d2d2;\n /* text-decoration: line-through; */\n pointer-events: none;\n}\n\n.tag.pro {\n color: #333;\n background-color: #fdf2e9;\n cursor: not-allowed;\n}\n\n/* Step */\n.step-tag {\n color: #eee;\n background-color: #ccc;\n cursor: pointer;\n text-transform: uppercase;\n}\n\n.step-tag.current {\n background-color: rgb(108, 59, 164);\n}\n\n.order-api-step > .step-pane {\n display: none;\n &.active {\n display: block;\n }\n}\n\n.notice-tag {\n color: #eee;\n background-color: #ccc;\n}\n\n/**************************/\n/* Buttons */\n/**************************/\n\n.btn,\n.btn:link,\n.btn:visited {\n display: inline-block;\n text-decoration: none;\n font-size: 1rem; /* 2 */\n font-weight: 400;\n padding: 0.8rem 1.6rem; /* 1.6 3.2 */\n border-radius: 9px; /* 9 */\n\n /* default color*/\n // background-color: #f34a4a;\n color: #11111a;\n\n /* Only necessary for .btn */\n border: none;\n cursor: pointer;\n font-family: inherit;\n\n /* Put transition on original \"state\" */\n /* transition: background-color 0.3s; */\n transition: all 0.3s;\n}\n\n.btn.medium {\n font-size: 0.9rem;\n font-weight: 400;\n padding: 0.6rem 1rem;\n}\n\n.btn--full:link,\n.btn--full:visited {\n // background-color: #e67e22;\n // color: #fff;\n background-color: #f34a4a;\n color: #11111a;\n}\n\n.btn--full:hover,\n.btn--full:active {\n // background-color: #cf711f;\n background-color: #11111a;\n color: #f34a4a;\n}\n\n.btn--full.small {\n font-size: 0.9rem;\n border-radius: 26px;\n font-weight: 500;\n}\n\n.btn--outline:link,\n.btn--outline:visited {\n // background-color: #fff;\n background-color: #2f2f48;\n // color: #555;\n}\n\n.btn--outline:hover,\n.btn--outline:active {\n // background-color: #fdf2e9;\n background-color: #11111a;\n color: #fff;\n\n // border: 3px solid #fff;\n /* Trick to add border inside */\n // box-shadow: inset 0 0 0 3px #fff;\n}\n\n/* Prev Next Save */\n.next-btn,\n.prev-btn,\n.save-btn,\n.back-btn,\n.save-settings {\n text-align: right;\n padding: 1px;\n}\n\n.btn-next,\n.btn-prev,\n.btn-save,\n.btn-back {\n float: right;\n}\n","/* $on: #009eea; */\n$on: rgb(108, 59, 164);\n$bg: #d9cb9e;\n$off: #8c8c8c;\n\n@mixin center {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n@mixin userSelect($value) {\n -webkit-touch-callout: $value;\n -webkit-user-select: $value;\n -khtml-user-select: $value;\n -moz-user-select: $value;\n -ms-user-select: $value;\n user-select: $value;\n}\n\n@mixin ui-toggle($height, $on, $off) {\n margin: 0;\n padding: 0;\n\n input[type=\"checkbox\"] {\n display: none;\n\n &:checked + label {\n border-color: $on;\n background: $on;\n box-shadow: inset 0 0 0 #{$height / 2} $on;\n\n > div {\n margin-left: $height;\n }\n }\n }\n\n label {\n transition: all 200ms ease;\n display: inline-block;\n position: relative;\n\n @include userSelect(none);\n\n background: $off;\n box-shadow: inset 0 0 0 0 $on;\n border: 2px solid $off;\n border-radius: $height + 2;\n width: $height * 2;\n height: $height;\n\n div {\n transition: all 200ms ease;\n background: #ffffff;\n width: $height;\n height: $height;\n border-radius: $height / 2;\n }\n\n &:hover,\n & > div:hover {\n cursor: pointer;\n }\n }\n}\n\ndiv.ui-toggle {\n @include ui-toggle(16px, $on, $off);\n\n &.mb-10 {\n margin-bottom: 10px;\n }\n}\n",".api-table {\n width: 100%;\n border-spacing: 5px;\n text-align: left;\n\n &,\n & th,\n & td {\n border: 1px solid #ccc;\n border-collapse: collapse;\n padding: 10px;\n }\n\n & th {\n background-color: #f5f5f5;\n }\n}\n\n.tag-table {\n width: 100%;\n border-spacing: 5px;\n text-align: left;\n\n &,\n & th,\n & td {\n border: 0.8px solid #ccc;\n border-collapse: collapse;\n padding: 5px;\n }\n\n & th {\n background-color: none;\n }\n}\n\n.text-center {\n text-align: center;\n}\n",".inline-block {\n display: inline-block;\n}\n\n.text-left {\n text-align: left;\n}\n\n.text-right {\n text-align: right;\n}\n\n.w-50 {\n width: 49%;\n}\n\n.inline {\n display: inline-block;\n}\n\n.meta-label {\n display: inline-block;\n font-weight: bold;\n margin-bottom: 5px;\n}\n\n.meta-container {\n display: block;\n margin-top: 20px;\n}\n","/**************************/\n/* Feature CSS */\n/**************************/\n\n.section-features {\n padding: 9.6rem 0;\n}\n\n.feature {\n box-shadow: 0 2.4rem 4.8rem rgba(0, 0, 0, 0.075);\n border-radius: 11px;\n overflow: hidden;\n transition: all 0.4s;\n}\n\n/* card action */\n.feature:hover {\n transform: translateY(-1.2rem);\n box-shadow: 0 3.2rem 6.4rem rgba(0, 0, 0, 0.06);\n}\n\n/* content backgrpund */\n.feature-content {\n font-size: 0.9rem; /* 1.8 */\n line-height: 1.8;\n align-items: center;\n padding: 1.6rem 2.4rem 2.4rem 2.4rem;\n /* 3.2rem 4.8rem 4.8rem 4.8rem;*/\n}\n\n.feature-cards {\n padding: 1.6rem 2.4rem 2.4rem 2.4rem;\n}\n\n.feature-tags {\n margin-bottom: 1.2rem; /* 1.2rem */\n display: flex;\n gap: 0.4rem;\n}\n\n.feature-dashboard-tags {\n margin-top: 2.2rem; /* 1.2rem */\n margin-bottom: 2.2rem; /* 1.2rem */\n display: flex;\n gap: 0.4rem;\n}\n\n.feature-hidden {\n margin-bottom: 1.2rem;\n gap: 0.4rem;\n}\n\n.feature-name {\n font-size: 1.2rem; /* 2.4 */\n color: #333;\n font-weight: 600;\n margin-bottom: 1.6rem; /* 3.2 */\n}\n\n.feature-info {\n font-size: 0.9rem; /*1.8 */\n line-height: 1.6; /*1.8 */\n}\n\n.feature-attributes {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.2rem; /* 2 */\n}\n\n.feature-attribute {\n font-size: 1rem; /* 1.8 */\n display: flex;\n align-items: center;\n gap: 0.8rem; /* 1.6 */\n}\n\n.feature-icon {\n height: 2.4rem;\n width: 2.4rem;\n color: #e67e22;\n}\n\n.feature-img {\n width: 100%;\n}\n\n.call-to-action {\n text-align: center;\n margin-top: 2.4rem; /* 4.8 */\n}\n\n.all-features {\n text-align: center;\n font-size: 1rem; /* 1.8 */\n}\n\n/* pagination */\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #555;\n background-color: #fae5d3;\n border: 2px solid rgb(255, 255, 255);\n border-radius: 11px;\n}\n\n/**************************/\n/* Card CSS no movement */\n/**************************/\n\n.card-content {\n box-shadow: 0 2.4rem 4.8rem rgba(0, 0, 0, 0.075);\n border-radius: 11px;\n overflow: hidden;\n transition: all 0.4s;\n}\n\n/**************************/\n/* Admin Notice */\n/**************************/\n\n.notice-action-button {\n float: right;\n margin-top: -66px;\n}\n\n/**************************/\n/* Order API */\n/**************************/\n\n/* action span */\n.action-tags {\n margin-bottom: 1.2rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.8rem 0.2rem;\n}\n\n.tag-item {\n flex: 0 0 calc(50% - 0.1em);\n display: flex;\n // align-items: center;\n // gap: 0.4rem;\n // box-sizing: border-box;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.tag-wrapper {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n margin-bottom: 0.3rem;\n}\n\n.tag-wrapper .tag {\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.tag-wrapper .image-container {\n flex-shrink: 0;\n}\n\n.tag-wrapper .image-container img {\n display: block;\n}\n\n.tag-desc {\n margin: 0;\n font-size: 0.85rem;\n color: #666;\n line-height: 1.4;\n word-break: break-word;\n}\n\n/**************************/\n/* API input form */\n/**************************/\n\n.api-input-form {\n display: grid;\n /* grid-template-columns: 0.5fr 1fr; */\n border-radius: 11px;\n overflow: hidden;\n text-align: left;\n /* padding: 1.8rem 0rem 1.8rem 1.8rem; */\n padding: 0px 0px 18px 0px;\n /* font-size: 1.8rem; */\n font-size: 18px;\n line-height: 1.8;\n}\n\n.api-input-form label {\n /* display: block; */\n /* font-size: 1.6rem; */\n font-size: 16px;\n font-weight: 500;\n /*margin-bottom: 1.2rem; */\n margin-bottom: 12px;\n margin-top: 12px;\n}\n\n.api-input-form input,\n.api-input-form textarea,\n.api-input-form select {\n width: 60%;\n /* padding: 0.7rem;\n font-size: 1.5rem; */\n padding: 7px;\n font-size: 15px;\n font-family: inherit;\n color: inherit;\n border-radius: 9px;\n background-color: #fdf2e9;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.api-input-form input::placeholder,\n.api-input-form textarea::placeholder {\n color: #aaa;\n}\n\n.api-input-form *:focus {\n outline: none;\n /* box-shadow: 0 0 0 0.8rem rgba(253, 242, 233, 0.5); */\n box-shadow: 0 0 0 16px rgba(253, 242, 233, 0.5);\n}\n\n/**************************/\n/* Advance mode */\n/**************************/\n\n.adv-box-container {\n display: flex;\n flex-direction: row;\n padding: 0px 0px;\n}\n\n.adv-box {\n width: 350px;\n}\n\n.adv-pre {\n width: 650px;\n}\n\n.adv-box-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 0 10px 10px;\n}\n\n.adv-box-title {\n font-weight: bold;\n font-size: 0.9rem; /* 1.8 */\n margin: 0;\n}\n\n.adv-box-table-container {\n height: 250px;\n margin-bottom: 15px;\n overflow: auto;\n border: 1px solid #bbb;\n border-radius: 5px;\n}\n\n/* Idle */\n.adv-minus-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n}\n\n/* Delete button */\n.adv-box-btn {\n border-radius: 5px;\n transition: background-color 0.15s ease-in-out;\n user-select: none;\n border: none;\n cursor: pointer;\n font-size: 14px;\n height: 35px;\n}\n\n.adv-box-btn.circle {\n border-radius: 50px;\n}\n\n/* Button icon */\n.adv-box-btn-icon {\n height: 3px;\n width: 12px;\n border-radius: 5px;\n background-color: white;\n}\n\n.adv-box-btn-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #e53c4a;\n height: 22px;\n width: 22px;\n}\n\n.adv-box-btn-delete:hover {\n background-color: #db3240;\n}\n\n.adv-box-btn-delete:active {\n background-color: #cc2331;\n}\n\n.adv-box td .adv-box-btn-delete {\n margin: auto;\n}\n\n.adv-box-footer {\n display: flex;\n flex-direction: column;\n}\n\n.adv-box-total {\n flex: 1;\n font-size: 14px;\n font-weight: bold;\n margin: 0 10px 15px;\n padding: 0;\n text-align: right;\n}\n\n/**************************/\n/* Tooltips*/\n/**************************/\n\n// .image-container {\n// position: relative;\n// display: inline-block;\n// }\n\n// .image-info {\n// display: none;\n// /* position: absolute; */\n// position: absolute;\n// background-color: #fff;\n// padding: 1px;\n// border: 1px solid #ccc;\n// border-radius: 5px;\n// }\n\n// .image-container:hover .image-info {\n// display: block;\n// }\n\n.api-label {\n display: flex;\n align-items: center; // 文字與圖片垂直置中\n gap: 6px; // 文字與圖片之間的間距\n font-weight: 500;\n cursor: default;\n}\n\n/* 圖片 + info 的容器 */\n.image-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.image-info {\n display: none;\n position: absolute;\n left: 100%; // 貼在圖片右側\n top: 50%;\n transform: translateY(-50%);\n margin-left: 10px; // 留出箭頭空間\n background: #fff;\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 5px;\n font-size: 13px;\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n z-index: 10;\n\n /* 小箭頭(左側指向圖片) */\n &::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: -16px; // 箭頭寬度\n transform: translateY(-50%);\n border: 8px solid transparent;\n border-right-color: #ccc; // 外框箭頭(與邊框同色)\n }\n\n /* 內層白色箭頭(蓋掉邊框,讓看起來乾淨) */\n &::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: -14px; // 比外箭頭內縮 1px\n transform: translateY(-50%);\n border: 7px solid transparent;\n border-right-color: #fff; // 填滿背景色\n z-index: 1;\n }\n}\n\n/* Hover 時顯示 */\n.image-wrapper:hover .image-info {\n display: block;\n}\n\n/**************************/\n/* Idle */\n/**************************/\n\n.aa-legend {\n list-style-type: none;\n margin: 17rem 0rem 0rem 5rem;\n}\n\n.aa-legend-item {\n display: flex;\n align-items: center;\n margin-bottom: 10px;\n padding: 0;\n}\n\n.aa-legend-description {\n margin: 0 0 0 10px;\n}\n\n.aa-legend-bullet {\n width: 22px;\n height: 22px;\n border-radius: 5px 5px 0 0;\n}\n\n.color1 {\n color: white;\n background-color: #277da1;\n}\n.color2 {\n color: white;\n background-color: #43aa8b;\n}\n.color3 {\n color: white;\n background-color: #f8961e;\n}\n","/* Scroll control */\n.scroll {\n /* background-color: #e9ecef;*/\n padding: 0px;\n /* How elements that don't fit into container appear */\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 40px;\n}\n/* Api Tools Section*/\n.pretty {\n background-color: #adb5bd;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.pretty.sendapi {\n height: 555px;\n}\n\n.pretty.filterapi {\n height: 222px;\n width: 777px;\n}\n\n.pretty.manageapi {\n height: 444px;\n}\n\n/* Order Api Section*/\n.pretty.api {\n height: 333px;\n}\n\n.pretty.advance {\n height: 250px;\n color: lightblue;\n}\n\n.pretty.props {\n height: 333px;\n align-items: left;\n}\n/* Hide pretty */\n.json {\n display: none;\n}\n",".container {\n /* 1140px */\n max-width: 80rem;\n /* max-width: 80rem;\n /*120rem*/\n padding: 0 3.2rem;\n margin: 0 auto;\n}\n\n.grid {\n display: grid;\n column-gap: 2.2rem; /* 6.4 */\n row-gap: 9.6rem;\n /* margin-bottom: 9.6rem; */\n}\n\n/*\n.grid:not(:last-child) {\n margin-bottom: 9.6rem;\n}\n*/\n.grid--2-cols {\n grid-template-columns: repeat(2, 1fr);\n}\n\n.grid--3-cols {\n grid-template-columns: repeat(3, 1fr);\n}\n\n.grid--4-cols {\n grid-template-columns: repeat(4, 1fr);\n}\n\n.grid--5-cols {\n grid-template-columns: repeat(5, 1fr);\n}\n\n.grid--center-v {\n align-items: center;\n}\n\n/**************************/\n/* HEADER */\n/**************************/\n\n.header {\n background: #fff;\n box-sizing: border-box;\n padding: 0;\n position: fixed;\n width: calc(100% - 160px);\n top: 32px;\n z-index: 1001;\n}\n\n.header-title {\n padding: 1.2rem 0rem 1.2rem 0rem;\n}\n\n/**************************/\n/* General */\n/**************************/\n\n.heading-primary,\n.heading-secondary,\n.heading-tertiary {\n font-weight: 700;\n color: #333;\n /* color: #45260a; */\n /* color: #343a40; */\n letter-spacing: -0.5px;\n}\n\n.heading-primary {\n font-size: 5.2rem;\n line-height: 1.05;\n margin-bottom: 3.2rem;\n}\n\n.heading-secondary {\n font-size: 4.4rem;\n line-height: 1.2;\n margin-bottom: 9.6rem;\n}\n\n.heading-tertiary {\n font-size: 3rem;\n line-height: 1.2;\n margin-bottom: 3.2rem;\n}\n\n.subheading {\n display: block;\n font-size: 1.6rem;\n font-weight: 500;\n color: #cf711f;\n text-transform: uppercase;\n margin-bottom: 1.6rem;\n letter-spacing: 0.75px;\n}\n\n.list {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 1.6rem;\n}\n\n.list-item {\n font-size: 1.8rem;\n display: flex;\n align-items: center;\n gap: 1.6rem;\n}\n\n.list-icon {\n width: 3rem;\n height: 3rem;\n color: #e67e22;\n}\n\n*:focus {\n outline: none;\n /* outline: 4px dotted #e67e22; */\n /* outline-offset: 8px; */\n box-shadow: 0 0 0 0.8rem rgba(230, 125, 34, 0.5);\n}\n\n/* HELPER/SETTINGS CLASSES */\n.margin-right-sm {\n margin-right: 1.6rem !important;\n}\n\n.margin-bottom-md {\n margin-bottom: 4.8rem !important;\n}\n\n.center-text {\n text-align: center;\n}\n\nstrong {\n font-weight: 500;\n}\n\n/**************************/\n/* SECTION */\n/**************************/\n\n.section-pricing {\n padding: 9.6rem 0;\n}\n\n.pricing-plan {\n border-radius: 11px;\n\n width: 75%;\n}\n\n.pricing-plan--starter {\n justify-self: end;\n border: 2px solid #fdf2e9;\n padding: 4.6rem;\n}\n\n.pricing-plan--complete {\n background-color: #fdf2e9;\n padding: 4.8rem;\n position: relative;\n overflow: hidden;\n}\n\n.pricing-plan--complete::after {\n content: \"Best value\";\n position: absolute;\n top: 6%;\n right: -18%;\n\n text-transform: uppercase;\n font-size: 1.4rem;\n font-weight: 700;\n color: #333;\n background-color: #ffd43b;\n padding: 0.8rem 8rem;\n transform: rotate(45deg);\n}\n\n.plan-header {\n text-align: center;\n margin-bottom: 4.8rem;\n}\n\n.plan-name {\n color: #cf711f;\n font-weight: 600;\n font-size: 2rem;\n text-transform: uppercase;\n letter-spacing: 0.75;\n margin-bottom: 3.2rem;\n}\n\n.plan-price {\n font-size: 6.2rem;\n font-weight: 600;\n color: #333;\n margin-bottom: 1.6rem;\n}\n\n.plan-price span {\n font-size: 3rem;\n font-weight: 500;\n margin-right: 0.8rem;\n}\n\n.plan-text {\n font-size: 1.6rem;\n line-height: 1.6;\n color: #6f6f6f;\n}\n\n.plan-sing-up {\n text-align: center;\n margin-top: 4.8rem;\n}\n\n.plan-details {\n font-size: 1.6rem;\n line-height: 1.6;\n text-align: center;\n}\n\n.feature-icon {\n color: #e67e22;\n height: 3.2rem;\n width: 3.2rem;\n background-color: #fdf2e9;\n margin-bottom: 3.2rem;\n padding: 1.6rem;\n border-radius: 50%;\n}\n\n.feature-title {\n font-size: 2.4rem;\n color: #333;\n font-weight: 700;\n margin-bottom: 1.6rem;\n}\n\n.feature-text {\n font-size: 1.8rem;\n line-height: 1.8;\n}\n","/* desert scheme ported from vim to google prettify */\r\npre.prettyprint {\r\n display: block;\r\n background-color: #333;\r\n}\r\npre .nocode {\r\n background-color: none;\r\n color: #000;\r\n}\r\npre .str {\r\n color: #ffa0a0;\r\n} /* string - pink */\r\npre .kwd {\r\n color: #f0e68c;\r\n font-weight: bold;\r\n}\r\npre .com {\r\n color: #87ceeb;\r\n} /* comment - skyblue */\r\npre .typ {\r\n color: #98fb98;\r\n} /* type - lightgreen */\r\npre .lit {\r\n color: #cd5c5c;\r\n} /* literal - darkred */\r\npre .pun {\r\n color: #fff;\r\n} /* punctuation */\r\npre .pln {\r\n color: #fff;\r\n} /* plaintext */\r\npre .tag {\r\n color: #f0e68c;\r\n font-weight: bold;\r\n} /* html/xml tag - lightyellow */\r\npre .atn {\r\n color: #bdb76b;\r\n font-weight: bold;\r\n} /* attribute name - khaki */\r\npre .atv {\r\n color: #ffa0a0;\r\n} /* attribute value - pink */\r\npre .dec {\r\n color: #98fb98;\r\n} /* decimal - lightgreen */\r\n\r\n/* Specify class=linenums on a pre to get line numbering */\r\nol.linenums {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n color: #aeaeae;\r\n} /* IE indents via margin-left */\r\nli.L0,\r\nli.L1,\r\nli.L2,\r\nli.L3,\r\nli.L5,\r\nli.L6,\r\nli.L7,\r\nli.L8 {\r\n list-style-type: none;\r\n}\r\n/* Alternate shading for lines */\r\nli.L1,\r\nli.L3,\r\nli.L5,\r\nli.L7,\r\nli.L9 {\r\n}\r\n\r\n@media print {\r\n pre.prettyprint {\r\n background-color: none;\r\n }\r\n pre .str,\r\n code .str {\r\n color: #060;\r\n }\r\n pre .kwd,\r\n code .kwd {\r\n color: #006;\r\n font-weight: bold;\r\n }\r\n pre .com,\r\n code .com {\r\n color: #600;\r\n font-style: italic;\r\n }\r\n pre .typ,\r\n code .typ {\r\n color: #404;\r\n font-weight: bold;\r\n }\r\n pre .lit,\r\n code .lit {\r\n color: #044;\r\n }\r\n pre .pun,\r\n code .pun {\r\n color: #440;\r\n }\r\n pre .pln,\r\n code .pln {\r\n color: #000;\r\n }\r\n pre .tag,\r\n code .tag {\r\n color: #006;\r\n font-weight: bold;\r\n }\r\n pre .atn,\r\n code .atn {\r\n color: #404;\r\n }\r\n pre .atv,\r\n code .atv {\r\n color: #060;\r\n }\r\n}\r\n"]}1 {"version":3,"sources":["modules/tabs.scss","modules/button.scss","modules/checkbox.scss","modules/table.scss","modules/form.scss","modules/features.scss","modules/pretty.scss","modules/general.scss","modules/desert.scss","modules/ui-dashboard.scss","modules/ui-orderapi.scss"],"names":[],"mappings":"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","file":"style.css","sourcesContent":[".nav-tabs,\n.nav-tabs-tools,\n.nav-tabs-filter,\n.nav-tabs-api,\n.nav-tabs-apiauth {\n float: left;\n width: 100%;\n margin: 0;\n list-style-type: none;\n border-bottom: 1px solid transparent;\n\n > li {\n float: left;\n margin-bottom: -1px;\n\n > a {\n margin-right: 2px;\n line-height: 1.5;\n padding: 10px;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n float: left;\n text-decoration: none;\n\n &:hover {\n border-color: #eee #eee #ddd;\n }\n }\n\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border-color: transparent;\n }\n }\n }\n}\n\n.tab-content > .tab-pane,\n.tab-content-tools > .tab-pane-tools {\n float: left;\n width: 98%;\n display: none;\n\n &.active {\n display: block;\n padding: 10px;\n background-color: #fff;\n box-shadow: 0 5px 4px -2px rgba(0, 0, 0, 0.15);\n }\n}\n\n#top-btn {\n display: none;\n position: fixed;\n bottom: 20px;\n right: 30px;\n z-index: 99;\n font-size: 18px;\n border: none;\n outline: none;\n background-color: purple;\n color: white;\n cursor: pointer;\n padding: 15px;\n border-radius: 4px;\n}\n\n#top-btn:hover {\n background-color: #555;\n}\n","/**************************/\n/* Tags */\n/**************************/\n\n.tag {\n display: inline-block;\n text-decoration: none;\n padding: 0.4rem 0.8rem; /* 0.4 0.8*/\n font-size: 0.9rem; /* 1.2 */\n color: none;\n border-radius: 100px;\n font-weight: 300;\n}\n\n.tag.small {\n font-size: 0.8rem;\n border-radius: 3px;\n font-weight: 300;\n}\n\n.tag.medium {\n font-size: 0.9rem;\n border-radius: 15px;\n font-weight: 300;\n}\n\n.tag.large {\n font-size: 1.4rem;\n border-radius: 15px;\n font-weight: 400;\n}\n\n.tag.step {\n font-size: 1.2rem;\n border-radius: 50px;\n font-weight: 500;\n}\n\n.tag.uppercase {\n text-transform: uppercase;\n}\n\n/* Basic */\n.tag--woo {\n color: #eee;\n background-color: rgb(108, 59, 164);\n}\n\n.tag--woorev {\n color: rgb(108, 59, 164);\n background-color: #eee;\n}\n\n.tag--wooadv {\n color: #eee;\n background-color: rgb(218, 179, 254);\n}\n\n.tag--auth {\n color: #333;\n background-color: rgb(246, 169, 14);\n}\n\n.tag--attr {\n color: #333;\n background-color: rgb(206, 206, 206);\n}\n\n.tag--large {\n color: #333;\n background-color: #eee;\n}\n\n/* Attributes */\n.tag--order {\n color: #eee;\n background-color: rgb(132, 95, 132);\n}\n\n.tag--billing {\n color: #333;\n background-color: rgb(206, 206, 206);\n}\n\n.tag--fields {\n color: lightblue;\n background-color: rgb(25, 25, 25);\n}\n\n/* Features */\n.tag--codefree {\n // background-color: rgb(249, 222, 0);\n color: #fff;\n background-color: #11111a;\n}\n\n.tag--secure {\n color: #fff;\n background-color: rgb(10, 151, 218);\n}\n\n.tag--notice {\n // background-color: #dd6413;\n color: #fff;\n background-color: #4a4af3;\n}\n\n.tag--new {\n color: #11111a;\n background-color: #f34a4a;\n}\n\n.tag--cap {\n color: #f34a4a;\n background-color: #11111a;\n}\n\n/* License */\n.tag--disable {\n color: #fff;\n background-color: rgb(231, 0, 0);\n}\n\n.tag--enable {\n color: #fff;\n background-color: #43aa8b;\n // background-color: rgb(48, 154, 62);\n}\n\n/**************************/\n/* Dynamic Tags */\n/**************************/\n\n.tag.available:hover {\n cursor: pointer;\n opacity: 0.7;\n}\n\n.tag.selected {\n cursor: pointer;\n opacity: 0.7;\n}\n\n.tag.disabled {\n color: white;\n background-color: #d2d2d2;\n /* text-decoration: line-through; */\n pointer-events: none;\n}\n\n.tag.pro {\n color: #333;\n background-color: #fdf2e9;\n cursor: not-allowed;\n}\n\n/* Step */\n.step-tag {\n color: #eee;\n background-color: #ccc;\n cursor: pointer;\n text-transform: uppercase;\n}\n\n.step-tag.current {\n background-color: rgb(108, 59, 164);\n}\n\n.order-api-step > .step-pane {\n display: none;\n &.active {\n display: block;\n }\n}\n\n.notice-tag {\n color: #eee;\n background-color: #ccc;\n}\n\n/**************************/\n/* Buttons */\n/**************************/\n\n.btn,\n.btn:link,\n.btn:visited {\n display: inline-block;\n text-decoration: none;\n font-size: 1rem; /* 2 */\n font-weight: 400;\n padding: 0.8rem 1.6rem; /* 1.6 3.2 */\n border-radius: 9px; /* 9 */\n\n /* default color*/\n // background-color: #f34a4a;\n color: #11111a;\n\n /* Only necessary for .btn */\n border: none;\n cursor: pointer;\n font-family: inherit;\n\n /* Put transition on original \"state\" */\n /* transition: background-color 0.3s; */\n transition: all 0.3s;\n}\n\n.btn.medium {\n font-size: 0.9rem;\n font-weight: 400;\n padding: 0.6rem 1rem;\n}\n\n.btn--full:link,\n.btn--full:visited {\n // background-color: #e67e22;\n // color: #fff;\n background-color: #f34a4a;\n color: #11111a;\n}\n\n.btn--full:hover,\n.btn--full:active {\n // background-color: #cf711f;\n background-color: #11111a;\n color: #f34a4a;\n}\n\n.btn--full.small {\n font-size: 0.9rem;\n border-radius: 26px;\n font-weight: 500;\n}\n\n.btn--outline:link,\n.btn--outline:visited {\n // background-color: #fff;\n background-color: #2f2f48;\n // color: #555;\n}\n\n.btn--outline:hover,\n.btn--outline:active {\n // background-color: #fdf2e9;\n background-color: #11111a;\n color: #fff;\n\n // border: 3px solid #fff;\n /* Trick to add border inside */\n // box-shadow: inset 0 0 0 3px #fff;\n}\n\n/* Prev Next Save */\n.next-btn,\n.prev-btn,\n.save-btn,\n.back-btn,\n.save-settings {\n text-align: right;\n padding: 1px;\n}\n\n.btn-next,\n.btn-prev,\n.btn-save,\n.btn-back {\n float: right;\n}\n","/* $on: #009eea; */\n$on: rgb(108, 59, 164);\n$bg: #d9cb9e;\n$off: #8c8c8c;\n\n@mixin center {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n@mixin userSelect($value) {\n -webkit-touch-callout: $value;\n -webkit-user-select: $value;\n -khtml-user-select: $value;\n -moz-user-select: $value;\n -ms-user-select: $value;\n user-select: $value;\n}\n\n@mixin ui-toggle($height, $on, $off) {\n margin: 0;\n padding: 0;\n\n input[type=\"checkbox\"] {\n display: none;\n\n &:checked + label {\n border-color: $on;\n background: $on;\n box-shadow: inset 0 0 0 #{$height / 2} $on;\n\n > div {\n margin-left: $height;\n }\n }\n }\n\n label {\n transition: all 200ms ease;\n display: inline-block;\n position: relative;\n\n @include userSelect(none);\n\n background: $off;\n box-shadow: inset 0 0 0 0 $on;\n border: 2px solid $off;\n border-radius: $height + 2;\n width: $height * 2;\n height: $height;\n\n div {\n transition: all 200ms ease;\n background: #ffffff;\n width: $height;\n height: $height;\n border-radius: $height / 2;\n }\n\n &:hover,\n & > div:hover {\n cursor: pointer;\n }\n }\n}\n\ndiv.ui-toggle {\n @include ui-toggle(16px, $on, $off);\n\n &.mb-10 {\n margin-bottom: 10px;\n }\n}\n",".api-table {\n width: 100%;\n border-spacing: 5px;\n text-align: left;\n\n &,\n & th,\n & td {\n border: 1px solid #ccc;\n border-collapse: collapse;\n padding: 10px;\n }\n\n & th {\n background-color: #f5f5f5;\n }\n}\n\n.tag-table {\n width: 100%;\n border-spacing: 5px;\n text-align: left;\n\n &,\n & th,\n & td {\n border: 0.8px solid #ccc;\n border-collapse: collapse;\n padding: 5px;\n }\n\n & th {\n background-color: none;\n }\n}\n\n.text-center {\n text-align: center;\n}\n",".inline-block {\n display: inline-block;\n}\n\n.text-left {\n text-align: left;\n}\n\n.text-right {\n text-align: right;\n}\n\n.w-50 {\n width: 49%;\n}\n\n.inline {\n display: inline-block;\n}\n\n.meta-label {\n display: inline-block;\n font-weight: bold;\n margin-bottom: 5px;\n}\n\n.meta-container {\n display: block;\n margin-top: 20px;\n}\n","/**************************/\n/* Feature CSS */\n/**************************/\n\n.section-features {\n padding: 9.6rem 0;\n}\n\n.feature {\n box-shadow: 0 2.4rem 4.8rem rgba(0, 0, 0, 0.075);\n border-radius: 11px;\n overflow: hidden;\n transition: all 0.4s;\n}\n\n/* card action */\n.feature:hover {\n transform: translateY(-1.2rem);\n box-shadow: 0 3.2rem 6.4rem rgba(0, 0, 0, 0.06);\n}\n\n/* content backgrpund */\n.feature-content {\n font-size: 0.9rem; /* 1.8 */\n line-height: 1.8;\n align-items: center;\n padding: 1.6rem 2.4rem 2.4rem 2.4rem;\n /* 3.2rem 4.8rem 4.8rem 4.8rem;*/\n}\n\n.feature-cards {\n padding: 1.6rem 2.4rem 2.4rem 2.4rem;\n}\n\n.feature-tags {\n margin-bottom: 1.2rem; /* 1.2rem */\n display: flex;\n gap: 0.4rem;\n}\n\n.feature-dashboard-tags {\n margin-top: 2.2rem; /* 1.2rem */\n margin-bottom: 2.2rem; /* 1.2rem */\n display: flex;\n gap: 0.4rem;\n}\n\n.feature-hidden {\n margin-bottom: 1.2rem;\n gap: 0.4rem;\n}\n\n.feature-name {\n font-size: 1.2rem; /* 2.4 */\n color: #333;\n font-weight: 600;\n margin-bottom: 1.6rem; /* 3.2 */\n}\n\n.feature-info {\n font-size: 0.9rem; /*1.8 */\n line-height: 1.6; /*1.8 */\n}\n\n.feature-attributes {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.2rem; /* 2 */\n}\n\n.feature-attribute {\n font-size: 1rem; /* 1.8 */\n display: flex;\n align-items: center;\n gap: 0.8rem; /* 1.6 */\n}\n\n.feature-icon {\n height: 2.4rem;\n width: 2.4rem;\n color: #e67e22;\n}\n\n.feature-img {\n width: 100%;\n}\n\n.call-to-action {\n text-align: center;\n margin-top: 2.4rem; /* 4.8 */\n}\n\n.all-features {\n text-align: center;\n font-size: 1rem; /* 1.8 */\n}\n\n/* pagination */\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #555;\n background-color: #fae5d3;\n border: 2px solid rgb(255, 255, 255);\n border-radius: 11px;\n}\n\n/**************************/\n/* Card CSS no movement */\n/**************************/\n\n.card-content {\n box-shadow: 0 2.4rem 4.8rem rgba(0, 0, 0, 0.075);\n border-radius: 11px;\n overflow: hidden;\n transition: all 0.4s;\n}\n\n/**************************/\n/* Admin Notice */\n/**************************/\n\n.notice-action-button {\n float: right;\n margin-top: -66px;\n}\n\n/**************************/\n/* Order API */\n/**************************/\n\n/* action span */\n.action-tags {\n margin-bottom: 1.2rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.8rem 0.2rem;\n}\n\n.tag-item {\n flex: 0 0 calc(50% - 0.1em);\n display: flex;\n // align-items: center;\n // gap: 0.4rem;\n // box-sizing: border-box;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.tag-wrapper {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n margin-bottom: 0.3rem;\n}\n\n.tag-wrapper .tag {\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.tag-wrapper .image-container {\n flex-shrink: 0;\n}\n\n.tag-wrapper .image-container img {\n display: block;\n}\n\n.tag-desc {\n margin: 0;\n font-size: 0.85rem;\n color: #666;\n line-height: 1.4;\n word-break: break-word;\n}\n\n/**************************/\n/* API input form */\n/**************************/\n\n.api-input-form {\n display: grid;\n /* grid-template-columns: 0.5fr 1fr; */\n border-radius: 11px;\n overflow: hidden;\n text-align: left;\n /* padding: 1.8rem 0rem 1.8rem 1.8rem; */\n padding: 0px 0px 18px 0px;\n /* font-size: 1.8rem; */\n font-size: 18px;\n line-height: 1.8;\n}\n\n.api-input-form label {\n /* display: block; */\n /* font-size: 1.6rem; */\n font-size: 16px;\n font-weight: 500;\n /*margin-bottom: 1.2rem; */\n margin-bottom: 12px;\n margin-top: 12px;\n}\n\n.api-input-form input,\n.api-input-form textarea,\n.api-input-form select {\n width: 60%;\n /* padding: 0.7rem;\n font-size: 1.5rem; */\n padding: 7px;\n font-size: 15px;\n font-family: inherit;\n color: inherit;\n border-radius: 9px;\n background-color: #fdf2e9;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.api-input-form input::placeholder,\n.api-input-form textarea::placeholder {\n color: #aaa;\n}\n\n.api-input-form *:focus {\n outline: none;\n /* box-shadow: 0 0 0 0.8rem rgba(253, 242, 233, 0.5); */\n box-shadow: 0 0 0 16px rgba(253, 242, 233, 0.5);\n}\n\n/**************************/\n/* Advance mode */\n/**************************/\n\n.adv-box-container {\n display: flex;\n flex-direction: row;\n padding: 0px 0px;\n}\n\n.adv-box {\n width: 350px;\n}\n\n.adv-pre {\n width: 650px;\n}\n\n.adv-box-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 0 10px 10px;\n}\n\n.adv-box-title {\n font-weight: bold;\n font-size: 0.9rem; /* 1.8 */\n margin: 0;\n}\n\n.adv-box-table-container {\n height: 250px;\n margin-bottom: 15px;\n overflow: auto;\n border: 1px solid #bbb;\n border-radius: 5px;\n}\n\n/* Idle */\n.adv-minus-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n}\n\n/* Delete button */\n.adv-box-btn {\n border-radius: 5px;\n transition: background-color 0.15s ease-in-out;\n user-select: none;\n border: none;\n cursor: pointer;\n font-size: 14px;\n height: 35px;\n}\n\n.adv-box-btn.circle {\n border-radius: 50px;\n}\n\n/* Button icon */\n.adv-box-btn-icon {\n height: 3px;\n width: 12px;\n border-radius: 5px;\n background-color: white;\n}\n\n.adv-box-btn-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #e53c4a;\n height: 22px;\n width: 22px;\n}\n\n.adv-box-btn-delete:hover {\n background-color: #db3240;\n}\n\n.adv-box-btn-delete:active {\n background-color: #cc2331;\n}\n\n.adv-box td .adv-box-btn-delete {\n margin: auto;\n}\n\n.adv-box-footer {\n display: flex;\n flex-direction: column;\n}\n\n.adv-box-total {\n flex: 1;\n font-size: 14px;\n font-weight: bold;\n margin: 0 10px 15px;\n padding: 0;\n text-align: right;\n}\n\n/**************************/\n/* Tooltips*/\n/**************************/\n\n// .image-container {\n// position: relative;\n// display: inline-block;\n// }\n\n// .image-info {\n// display: none;\n// /* position: absolute; */\n// position: absolute;\n// background-color: #fff;\n// padding: 1px;\n// border: 1px solid #ccc;\n// border-radius: 5px;\n// }\n\n// .image-container:hover .image-info {\n// display: block;\n// }\n\n.api-label {\n display: flex;\n align-items: center; // 文字與圖片垂直置中\n gap: 6px; // 文字與圖片之間的間距\n font-weight: 500;\n cursor: default;\n}\n\n/* 圖片 + info 的容器 */\n.image-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.image-info {\n display: none;\n position: absolute;\n left: 100%; // 貼在圖片右側\n top: 50%;\n transform: translateY(-50%);\n margin-left: 10px; // 留出箭頭空間\n background: #fff;\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 5px;\n font-size: 13px;\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n z-index: 10;\n\n /* 小箭頭(左側指向圖片) */\n &::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: -16px; // 箭頭寬度\n transform: translateY(-50%);\n border: 8px solid transparent;\n border-right-color: #ccc; // 外框箭頭(與邊框同色)\n }\n\n /* 內層白色箭頭(蓋掉邊框,讓看起來乾淨) */\n &::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: -14px; // 比外箭頭內縮 1px\n transform: translateY(-50%);\n border: 7px solid transparent;\n border-right-color: #fff; // 填滿背景色\n z-index: 1;\n }\n}\n\n/* Hover 時顯示 */\n.image-wrapper:hover .image-info {\n display: block;\n}\n\n/**************************/\n/* Idle */\n/**************************/\n\n.aa-legend {\n list-style-type: none;\n margin: 17rem 0rem 0rem 5rem;\n}\n\n.aa-legend-item {\n display: flex;\n align-items: center;\n margin-bottom: 10px;\n padding: 0;\n}\n\n.aa-legend-description {\n margin: 0 0 0 10px;\n}\n\n.aa-legend-bullet {\n width: 22px;\n height: 22px;\n border-radius: 5px 5px 0 0;\n}\n\n.color1 {\n color: white;\n background-color: #277da1;\n}\n.color2 {\n color: white;\n background-color: #43aa8b;\n}\n.color3 {\n color: white;\n background-color: #f8961e;\n}\n","/* Scroll control */\n.scroll {\n /* background-color: #e9ecef;*/\n padding: 0px;\n /* How elements that don't fit into container appear */\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 40px;\n}\n/* Api Tools Section*/\n.pretty {\n background-color: #adb5bd;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.pretty.sendapi {\n height: 555px;\n}\n\n.pretty.filterapi {\n height: 222px;\n width: 777px;\n}\n\n.pretty.manageapi {\n height: 444px;\n}\n\n/* Order Api Section*/\n.pretty.api {\n height: 333px;\n}\n\n.pretty.advance {\n height: 250px;\n color: lightblue;\n}\n\n.pretty.props {\n height: 333px;\n align-items: left;\n}\n/* Hide pretty */\n.json {\n display: none;\n}\n",".container {\n /* 1140px */\n max-width: 80rem;\n /* max-width: 80rem;\n /*120rem*/\n padding: 0 3.2rem;\n margin: 0 auto;\n}\n\n.grid {\n display: grid;\n column-gap: 2.2rem; /* 6.4 */\n row-gap: 9.6rem;\n /* margin-bottom: 9.6rem; */\n}\n\n/*\n.grid:not(:last-child) {\n margin-bottom: 9.6rem;\n}\n*/\n.grid--2-cols {\n grid-template-columns: repeat(2, 1fr);\n}\n\n.grid--3-cols {\n grid-template-columns: repeat(3, 1fr);\n}\n\n.grid--4-cols {\n grid-template-columns: repeat(4, 1fr);\n}\n\n.grid--5-cols {\n grid-template-columns: repeat(5, 1fr);\n}\n\n.grid--center-v {\n align-items: center;\n}\n\n/**************************/\n/* HEADER */\n/**************************/\n\n.header {\n background: #fff;\n box-sizing: border-box;\n padding: 0;\n position: fixed;\n width: calc(100% - 160px);\n top: 32px;\n z-index: 1001;\n}\n\n.header-title {\n padding: 1.2rem 0rem 1.2rem 0rem;\n}\n\n/**************************/\n/* General */\n/**************************/\n\n.heading-primary,\n.heading-secondary,\n.heading-tertiary {\n font-weight: 700;\n color: #333;\n /* color: #45260a; */\n /* color: #343a40; */\n letter-spacing: -0.5px;\n}\n\n.heading-primary {\n font-size: 5.2rem;\n line-height: 1.05;\n margin-bottom: 3.2rem;\n}\n\n.heading-secondary {\n font-size: 4.4rem;\n line-height: 1.2;\n margin-bottom: 9.6rem;\n}\n\n.heading-tertiary {\n font-size: 3rem;\n line-height: 1.2;\n margin-bottom: 3.2rem;\n}\n\n.subheading {\n display: block;\n font-size: 1.6rem;\n font-weight: 500;\n color: #cf711f;\n text-transform: uppercase;\n margin-bottom: 1.6rem;\n letter-spacing: 0.75px;\n}\n\n.list {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 1.6rem;\n}\n\n.list-item {\n font-size: 1.8rem;\n display: flex;\n align-items: center;\n gap: 1.6rem;\n}\n\n.list-icon {\n width: 3rem;\n height: 3rem;\n color: #e67e22;\n}\n\n*:focus {\n outline: none;\n /* outline: 4px dotted #e67e22; */\n /* outline-offset: 8px; */\n box-shadow: 0 0 0 0.8rem rgba(230, 125, 34, 0.5);\n}\n\n/* HELPER/SETTINGS CLASSES */\n.margin-right-sm {\n margin-right: 1.6rem !important;\n}\n\n.margin-bottom-md {\n margin-bottom: 4.8rem !important;\n}\n\n.center-text {\n text-align: center;\n}\n\nstrong {\n font-weight: 500;\n}\n\n/**************************/\n/* SECTION */\n/**************************/\n\n.section-pricing {\n padding: 9.6rem 0;\n}\n\n.pricing-plan {\n border-radius: 11px;\n\n width: 75%;\n}\n\n.pricing-plan--starter {\n justify-self: end;\n border: 2px solid #fdf2e9;\n padding: 4.6rem;\n}\n\n.pricing-plan--complete {\n background-color: #fdf2e9;\n padding: 4.8rem;\n position: relative;\n overflow: hidden;\n}\n\n.pricing-plan--complete::after {\n content: \"Best value\";\n position: absolute;\n top: 6%;\n right: -18%;\n\n text-transform: uppercase;\n font-size: 1.4rem;\n font-weight: 700;\n color: #333;\n background-color: #ffd43b;\n padding: 0.8rem 8rem;\n transform: rotate(45deg);\n}\n\n.plan-header {\n text-align: center;\n margin-bottom: 4.8rem;\n}\n\n.plan-name {\n color: #cf711f;\n font-weight: 600;\n font-size: 2rem;\n text-transform: uppercase;\n letter-spacing: 0.75;\n margin-bottom: 3.2rem;\n}\n\n.plan-price {\n font-size: 6.2rem;\n font-weight: 600;\n color: #333;\n margin-bottom: 1.6rem;\n}\n\n.plan-price span {\n font-size: 3rem;\n font-weight: 500;\n margin-right: 0.8rem;\n}\n\n.plan-text {\n font-size: 1.6rem;\n line-height: 1.6;\n color: #6f6f6f;\n}\n\n.plan-sing-up {\n text-align: center;\n margin-top: 4.8rem;\n}\n\n.plan-details {\n font-size: 1.6rem;\n line-height: 1.6;\n text-align: center;\n}\n\n.feature-icon {\n color: #e67e22;\n height: 3.2rem;\n width: 3.2rem;\n background-color: #fdf2e9;\n margin-bottom: 3.2rem;\n padding: 1.6rem;\n border-radius: 50%;\n}\n\n.feature-title {\n font-size: 2.4rem;\n color: #333;\n font-weight: 700;\n margin-bottom: 1.6rem;\n}\n\n.feature-text {\n font-size: 1.8rem;\n line-height: 1.8;\n}\n","/* desert scheme ported from vim to google prettify */\r\npre.prettyprint {\r\n display: block;\r\n background-color: #333;\r\n}\r\npre .nocode {\r\n background-color: none;\r\n color: #000;\r\n}\r\npre .str {\r\n color: #ffa0a0;\r\n} /* string - pink */\r\npre .kwd {\r\n color: #f0e68c;\r\n font-weight: bold;\r\n}\r\npre .com {\r\n color: #87ceeb;\r\n} /* comment - skyblue */\r\npre .typ {\r\n color: #98fb98;\r\n} /* type - lightgreen */\r\npre .lit {\r\n color: #cd5c5c;\r\n} /* literal - darkred */\r\npre .pun {\r\n color: #fff;\r\n} /* punctuation */\r\npre .pln {\r\n color: #fff;\r\n} /* plaintext */\r\npre .tag {\r\n color: #f0e68c;\r\n font-weight: bold;\r\n} /* html/xml tag - lightyellow */\r\npre .atn {\r\n color: #bdb76b;\r\n font-weight: bold;\r\n} /* attribute name - khaki */\r\npre .atv {\r\n color: #ffa0a0;\r\n} /* attribute value - pink */\r\npre .dec {\r\n color: #98fb98;\r\n} /* decimal - lightgreen */\r\n\r\n/* Specify class=linenums on a pre to get line numbering */\r\nol.linenums {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n color: #aeaeae;\r\n} /* IE indents via margin-left */\r\nli.L0,\r\nli.L1,\r\nli.L2,\r\nli.L3,\r\nli.L5,\r\nli.L6,\r\nli.L7,\r\nli.L8 {\r\n list-style-type: none;\r\n}\r\n/* Alternate shading for lines */\r\nli.L1,\r\nli.L3,\r\nli.L5,\r\nli.L7,\r\nli.L9 {\r\n}\r\n\r\n@media print {\r\n pre.prettyprint {\r\n background-color: none;\r\n }\r\n pre .str,\r\n code .str {\r\n color: #060;\r\n }\r\n pre .kwd,\r\n code .kwd {\r\n color: #006;\r\n font-weight: bold;\r\n }\r\n pre .com,\r\n code .com {\r\n color: #600;\r\n font-style: italic;\r\n }\r\n pre .typ,\r\n code .typ {\r\n color: #404;\r\n font-weight: bold;\r\n }\r\n pre .lit,\r\n code .lit {\r\n color: #044;\r\n }\r\n pre .pun,\r\n code .pun {\r\n color: #440;\r\n }\r\n pre .pln,\r\n code .pln {\r\n color: #000;\r\n }\r\n pre .tag,\r\n code .tag {\r\n color: #006;\r\n font-weight: bold;\r\n }\r\n pre .atn,\r\n code .atn {\r\n color: #404;\r\n }\r\n pre .atv,\r\n code .atv {\r\n color: #060;\r\n }\r\n}\r\n","/***********************************************************/\n/* ==================== Global Color ===================== */\n/***********************************************************/\n\n/*\nPrimary #f34a4a\nSecondary #4a4af3\nText #b2b2fa\nAccent #f34a4a\nBG Primary #11111A\nBG Secondary #1B1B28\nHeading #fff\nButton Text #11111A\nTertiary #2F2F48\n*/\n\n/* Light Mode(default */\n:root {\n --anyapi-bg: #f6f7f7;\n --anyapi-card: #fff;\n --anyapi-primary: #5d5fef;\n --anyapi-primary-hover: #4c4ddc;\n --anyapi-text: #1a1a2e;\n --anyapi-success: #00c48c;\n --anyapi-danger: #ff6b6b;\n // --anyapi-border: #e8e8ff;\n // --anyapi-text-muted: #666699;\n}\n\n.dark-mode {\n --anyapi-bg: #0f1121;\n --anyapi-card: #161827;\n --anyapi-primary: #7b7cff;\n --anyapi-primary-hover: #9697ff;\n --anyapi-text: ##b2b2fa;\n --anyapi-success: #00d4a0;\n --anyapi-danger: #ff6b9d;\n // --anyapi-border: #23273a;\n // --anyapi-text-muted: #9494b8;\n}\n\n/***********************************************************/\n/* ====================== Dashboard ====================== */\n/***********************************************************/\n\n#anyapi-review-banner {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n padding: 20px 30px;\n border-radius: 20px;\n margin: 30px 0;\n box-shadow: 0 20px 40px rgba(102, 126, 234, 0.3),\n 0 10px 20px rgba(118, 75, 162, 0.2);\n position: relative;\n overflow: hidden;\n animation: slideDown 0.6s ease-out;\n}\n\n#anyapi-review-banner::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.1),\n transparent\n );\n animation: shimmer 3s infinite;\n}\n\n.review-content {\n display: flex;\n align-items: center;\n gap: 20px;\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.review-icon {\n font-size: 32px;\n animation: float 3s ease-in-out infinite;\n}\n\n.review-text h3 {\n margin: 0 0 4px 0;\n font-size: 22px;\n font-weight: 700;\n}\n\n.review-text p {\n margin: 0 0 8px 0;\n opacity: 0.9;\n font-size: 16px;\n}\n\n.review-stars {\n font-size: 20px;\n margin-top: 4px;\n animation: sparkle 2s ease-in-out infinite;\n}\n\n.review-actions {\n display: flex;\n gap: 12px;\n margin-left: auto;\n}\n\n.review-actions .button {\n padding: 12px 24px !important;\n font-weight: 600 !important;\n border-radius: 12px !important;\n transition: all 0.3s ease !important;\n}\n\n.review-actions .button-primary {\n background: #fff !important;\n color: #667eea !important;\n box-shadow: 0 8px 20px rgba(255, 255, 255, 0.3) !important;\n}\n\n.review-actions .button-primary:hover {\n transform: translateY(-2px);\n box-shadow: 0 12px 30px rgba(255, 255, 255, 0.4) !important;\n}\n\n.review-close {\n position: absolute;\n top: 12px;\n right: 20px;\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.8);\n font-size: 24px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.review-close:hover {\n background: rgba(255, 255, 255, 0.2);\n color: white;\n transform: rotate(90deg);\n}\n\n/* Animations */\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes shimmer {\n 0% {\n left: -100%;\n }\n 100% {\n left: 100%;\n }\n}\n\n@keyframes float {\n 0%,\n 100% {\n transform: translateY(0px);\n }\n 50% {\n transform: translateY(-10px);\n }\n}\n\n@keyframes sparkle {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .review-content {\n flex-direction: column;\n text-align: center;\n gap: 16px;\n }\n .review-actions {\n margin-left: 0 !important;\n justify-content: center;\n flex-wrap: wrap;\n }\n}\n\n#anyapi-dashboard {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: var(--anyapi-bg);\n min-height: 80vh;\n padding: 20px;\n border-radius: 8px;\n}\n\n#anyapi-last-updated {\n font-size: 13px;\n color: #646970;\n margin-top: 10px;\n margin-left: 15px;\n white-space: nowrap;\n float: right;\n}\n\n/* Main Layout (Left Content + Right Info */\n.anyapi-main-grid {\n display: grid;\n grid-template-columns: 1fr 320px;\n gap: 30px;\n margin-top: 20px;\n}\n@media (max-width: 1200px) {\n .anyapi-main-grid {\n grid-template-columns: 1fr;\n }\n .anyapi-sidebar {\n order: -1;\n }\n}\n\n.anyapi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.anyapi-card {\n // background: #fff;\n background: var(--anyapi-card);\n padding: 24px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n transition: transform 0.2s;\n}\n\n.anyapi-card:hover {\n transform: translateY(-4px);\n}\n\n.anyapi-card h3 {\n margin: 0 0 12px;\n font-size: 14px;\n color: #646970;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.anyapi-card .value {\n font-size: 32px;\n font-weight: 700;\n color: #1d2327;\n margin: 8px 0 0;\n}\n\n.anyapi-card .change {\n font-size: 14px;\n}\n\n/* Status */\n.positive {\n // color: #00a32a;\n color: var(--anyapi-success);\n}\n\n.warning {\n color: #dba617;\n // color: var(--anyapi-success);\n}\n\n.negative {\n // color: #d63638;\n color: var(--anyapi-danger);\n}\n\n/* Chart Section */\n.anyapi-charts-row {\n display: grid;\n grid-template-columns: 2fr 1fr;\n gap: 20px;\n margin-bottom: 30px;\n}\n\n@media (max-width: 960px) {\n .anyapi-charts-row {\n grid-template-columns: 1fr;\n }\n}\n\n.anyapi-chart-card {\n // background: #fff;\n background: var(--anyapi-card);\n padding: 24px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.anyapi-chart-card h2 {\n margin-top: 0;\n font-size: 18px;\n}\n\n/* Logs Section */\n#anyapi-logs-section {\n // background: #fff;\n background: var(--anyapi-card);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n}\n\n#anyapi-logs-header {\n padding: 20px 24px;\n border-bottom: 1px solid #e2e4e7;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n#anyapi-logs-section .logs-controls {\n display: flex;\n gap: 12px;\n align-items: center;\n}\n\n#anyapi-log-search {\n padding: 10px 16px;\n border: 1px solid #ddd;\n border-radius: 12px;\n width: 300px;\n max-width: 100%;\n}\n\n.method-post {\n background: #7c3aed;\n color: white;\n padding: 4px 10px;\n border-radius: 8px;\n font-size: 11px;\n font-weight: bold;\n}\n\n.status-badge {\n padding: 4px 10px;\n border-radius: 8px;\n font-weight: bold;\n font-size: 12px;\n}\n\n.status-badge.success {\n background: #10b981;\n color: white;\n}\n\n.status-badge.warning {\n background: #f59e0b;\n color: white;\n}\n\n.status-badge.error {\n background: #ef4444;\n color: white;\n}\n\n.endpoint code {\n font-size: 12px;\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.payload pre {\n margin: 0;\n font-size: 11px;\n color: #666;\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n#anyapi-logs-footer {\n display: flex;\n justify-content: space-between;\n margin-top: 16px;\n font-size: 14px;\n color: #666;\n}\n\n#anyapi-log-search {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n width: 300px;\n}\n\n#anyapi-logs-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n#anyapi-logs-table th {\n background: #f9fafb;\n text-align: left;\n padding: 12px 16px;\n font-weight: 600;\n color: #1d2327;\n}\n\n#anyapi-logs-table td {\n padding: 12px 16px;\n border-top: 1px solid #e2e4e7;\n font-size: 14px;\n}\n\n/* Idle CSSS */\n/* Status */\n.status-2xx {\n // color: #00a32a;\n color: var(--anyapi-success);\n}\n\n.status-4xx {\n // color: #d63638;\n color: var(--anyapi-danger);\n}\n\n.status-5xx {\n // color: #d63638;\n color: var(--anyapi-danger);\n font-weight: bold;\n}\n\n/* Idle CSS */\n.payload {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n color: #646970;\n max-width: 300px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n/* Idle CSS */\n.loading {\n text-align: center;\n padding: 60px;\n font-size: 18px;\n color: #646970;\n}\n\n/* Right Sidebar & Cards */\n.anyapi-sidebar {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.anyapi-sidebar-card {\n // background: #fff;\n background: var(--anyapi-card);\n padding: 20px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n border: 1px solid #e2e4e7;\n}\n\n.anyapi-sidebar-card h3 {\n margin: 0 0 12px;\n font-size: 16px;\n color: #1d2327;\n}\n\n/* Plugin Version Card */\n.dashicons-yes-alt {\n color: #00a32a;\n}\n\n.dashicons-warning {\n color: #dba617;\n}\n\n.dashicons-update {\n color: #f56e14;\n animation: anyapi-spin 2s linear infinite;\n}\n\n.anyapi-new-version-notice {\n font-size: 12px;\n color: #d63638;\n font-weight: bold;\n margin: 8px 0 4px;\n\n small {\n font-weight: normal;\n color: #666;\n }\n}\n/* Update details box */\n.anyapi-update-box {\n margin: 10px 0;\n padding: 12px;\n background: #fff8e5;\n border-left: 4px solid #ffb900;\n font-size: 11px;\n line-height: 1.4;\n\n strong {\n font-size: 11px;\n display: block;\n margin-bottom: 4px;\n }\n\n ul {\n margin: 6px 0 8px;\n padding-left: 18px;\n line-height: 1.4;\n\n li {\n margin-bottom: 2px;\n }\n }\n\n .anyapi-update-button {\n background: #d63638;\n border-color: #d63638;\n box-shadow: none;\n text-shadow: none;\n color: #fff !important;\n\n &:hover,\n &:focus {\n background: #c02a2a;\n border-color: #c02a2a;\n }\n }\n\n .anyapi-view-details {\n margin-left: 8px;\n font-size: 10px;\n color: #666;\n\n &:hover {\n color: #d63638;\n }\n }\n}\n\n.anyapi-latest-text {\n font-size: 12px;\n color: #646970;\n}\n\n/* Global */\n@keyframes anyapi-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Upgrade Card */\n.anyapi-upgrade {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n position: relative;\n overflow: hidden;\n}\n\n.anyapi-upgrade::before {\n content: \"\";\n position: absolute;\n top: -50%;\n right: -50%;\n width: 200%;\n height: 200%;\n background: rgba(255, 255, 255, 0.1);\n transform: rotate(30deg);\n}\n\n.anyapi-upgrade h3,\n.anyapi-upgrade p,\n.anyapi-upgrade li {\n color: white;\n}\n\n.anyapi-upgrade .badge {\n position: absolute;\n top: 12px;\n right: 12px;\n background: #ffb900;\n color: #000;\n padding: 4px 10px;\n border-radius: 20px;\n font-size: 11px;\n font-weight: bold;\n}\n\n.anyapi-upgrade .features {\n margin: 16px 0;\n padding-left: 20px;\n}\n\n.anyapi-upgrade .features li {\n margin-bottom: 8px;\n position: relative;\n}\n\n.anyapi-upgrade .features li::before {\n content: \"✓\";\n position: absolute;\n left: -20px;\n}\n\n.anyapi-upgrade .button-primary {\n background: white;\n color: #667eea;\n font-weight: bold;\n}\n\n.anyapi-button-block {\n display: block;\n text-align: center;\n}\n\n.anyapi-save {\n text-align: center;\n margin-top: 12px;\n font-size: 14px;\n opacity: 0.9;\n}\n\n/* Quick Links Card */\n.anyapi-quick-links {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\n.anyapi-quick-links li {\n margin-bottom: 8px;\n}\n\n.anyapi-quick-links a {\n color: #0073aa;\n text-decoration: none;\n}\n\n.anyapi-quick-links a:hover {\n text-decoration: underline;\n}\n\n/* Bottom Cards */\n.anyapi-bottom-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n gap: 20px;\n margin-top: 40px;\n}\n.anyapi-info-card {\n // background: #fff;\n background: var(--anyapi-card);\n padding: 24px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n border: 1px solid #e2e4e7;\n text-align: center;\n}\n.anyapi-info-card h3 {\n margin: 0 0 12px;\n color: #1d2327;\n}\n.anyapi-info-card p {\n color: #646970;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n.anyapi-info-card .button {\n width: 100%;\n}\n\n/***********************************************************/\n/* ================== Dashboard Header =================== */\n/***********************************************************/\n\n#anyapi-dashboard-header {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n min-height: 64px;\n padding: 0 24px; /* <- padding -> */\n margin-bottom: 28px;\n flex-wrap: wrap;\n gap: 16px;\n}\n\n.anyapi-header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.anyapi-logo {\n height: 40px;\n width: auto;\n}\n\n.anyapi-logo svg {\n border-radius: 8px;\n transition: transform 0.2s;\n}\n.anyapi-logo:hover svg {\n transform: scale(1.08);\n}\n\n.anyapi-header-right {\n position: absolute;\n right: 20px; /* ← 24px、20px、16px、30px */\n top: 50%;\n transform: translateY(-50%);\n}\n/* Responsive */\n@media (max-width: 782px) {\n #anyapi-dashboard-header {\n padding: 0 16px;\n }\n .anyapi-header-right {\n right: 16px; /* 手機時可再縮一點 */\n }\n}\n\n/***********************************************************/\n/* ================== Dark Mode Toggle =================== */\n/***********************************************************/\n\n#dark-mode-toggle {\n position: relative;\n width: 56px;\n height: 28px;\n background: #ccd0d5;\n border-radius: 50px;\n border: none;\n cursor: pointer;\n overflow: hidden;\n transition: background 0.3s;\n}\n\n#dark-mode-toggle .toggle-ball {\n position: absolute;\n top: 4px;\n left: 4px;\n width: 20px;\n height: 20px;\n background: white;\n border-radius: 50%;\n transition: transform 0.3s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n}\n\n#dark-mode-toggle .sun-icon,\n#dark-mode-toggle .moon-icon {\n position: absolute;\n top: 6px;\n font-size: 14px;\n transition: opacity 0.3s;\n}\n\n#dark-mode-toggle .sun-icon {\n left: 8px;\n opacity: 1;\n}\n#dark-mode-toggle .moon-icon {\n right: 8px;\n opacity: 0;\n}\n\n/* Toggle Dark Mode */\n.dark-mode #dark-mode-toggle {\n background: #6366f1;\n}\n\n.dark-mode #dark-mode-toggle .toggle-ball {\n transform: translateX(28px);\n}\n\n.dark-mode #dark-mode-toggle .sun-icon {\n opacity: 0;\n}\n\n.dark-mode #dark-mode-toggle .moon-icon {\n opacity: 1;\n}\n\n.dark-mode {\n background: #1e1e1e;\n color: #e0e0e0;\n}\n\n.dark-mode #anyapi-dashboard,\n.dark-mode .anyapi-card,\n.dark-mode .chart-card,\n.dark-mode #logs-section,\n.dark-mode .anyapi-sidebar-card,\n.dark-mode .anyapi-info-card {\n background: #2d2d2d;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n border-color: #444;\n}\n\n.dark-mode .anyapi-card h3,\n.dark-mode .chart-card h2,\n.dark-mode #logs-table th,\n.dark-mode .anyapi-info-card h3 {\n color: #a0a0a0;\n}\n\n.dark-mode .value,\n.dark-mode #logs-table td {\n color: var(--anyapi-text);\n}\n\n.dark-mode #logs-table th {\n background: #363636;\n}\n\n.dark-mode .status-2xx {\n // color: #00e676;\n color: var(--anyapi-success);\n}\n.dark-mode .status-4xx,\n.dark-mode .status-5xx {\n // color: #ff5252;\n color: var(--anyapi-danger);\n}\n","/* Integration 專屬樣式(加在原有 CSS 後) */\n:root {\n /* 延續上次變數 */\n --anyapi-purple: #7b68ee; /* 步驟紫色,從截圖提取 */\n --anyapi-gray-light: #f8f9fa;\n --anyapi-gray: #6c757d;\n}\n\n.dark-mode {\n --anyapi-purple: #a78bfa;\n --anyapi-gray-light: #2d3748;\n --anyapi-gray: #a0aec0;\n}\n\n.integration-main {\n display: grid;\n grid-template-columns: 200px 1fr;\n gap: 30px;\n margin: 20px 0;\n}\n\n.steps-sidebar {\n background: var(--anyapi-card);\n border-radius: 12px;\n padding: 20px;\n height: fit-content;\n}\n\n.step-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n cursor: pointer;\n transition: color 0.3s;\n}\n\n.step-item.active .step-number {\n background: var(--anyapi-purple);\n color: white;\n}\n\n.step-number {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--anyapi-gray-light);\n display: grid;\n place-items: center;\n font-weight: bold;\n}\n\n.step-label {\n font-size: 14px;\n color: var(--anyapi-text-muted);\n}\n\n.integration-content {\n position: relative;\n}\n\n.step-content {\n display: none;\n animation: fadeIn 0.3s;\n}\n\n.step-content.active {\n display: block;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateX(10px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.form-group {\n margin-bottom: 24px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n font-weight: 600;\n color: var(--anyapi-text);\n}\n\n.form-group input,\n.form-group select,\n.form-group textarea {\n width: 100%;\n padding: 12px;\n border: 1px solid var(--anyapi-border);\n border-radius: 8px;\n background: var(--anyapi-card);\n transition: border-color 0.3s;\n}\n\n.form-group input:focus,\n.form-group select:focus,\n.form-group textarea:focus {\n outline: none;\n border-color: var(--anyapi-primary);\n}\n\n.required {\n color: var(--anyapi-danger);\n}\n\n.help-text {\n color: var(--anyapi-text-muted);\n font-size: 12px;\n}\n\n.filter-mode-toggle {\n display: flex;\n gap: 8px;\n margin: 12px 0;\n}\n\n.mode-btn {\n padding: 8px 16px;\n border: 1px solid var(--anyapi-border);\n background: var(--anyapi-card);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.mode-btn.active {\n background: var(--anyapi-primary);\n color: white;\n border-color: var(--anyapi-primary);\n}\n\n.json-preview {\n background: #1e1e1e;\n border-radius: 8px;\n padding: 16px;\n margin: 16px 0;\n overflow: auto;\n}\n\n.json-preview pre {\n margin: 0;\n color: #f8f8f2;\n font-family: \"Courier New\", monospace;\n font-size: 14px;\n}\n\n.actions-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.action-card {\n background: var(--anyapi-card);\n padding: 20px;\n border-radius: 12px;\n border: 1px solid var(--anyapi-border);\n}\n\n.action-card h3 {\n margin-top: 0;\n color: var(--anyapi-text);\n}\n\n.action-card label {\n display: block;\n margin: 8px 0;\n cursor: pointer;\n}\n\n.integration-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 20px 0;\n border-top: 1px solid var(--anyapi-border);\n}\n\n.preview-json-btn {\n background: var(--anyapi-danger);\n color: white;\n}\n\n/* 響應式 */\n@media (max-width: 960px) {\n .integration-main {\n grid-template-columns: 1fr;\n }\n .steps-sidebar {\n order: -1;\n display: flex;\n justify-content: center;\n }\n .step-item {\n flex-direction: column;\n text-align: center;\n }\n .actions-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* API Status 專屬樣式 */\n#anyapi-status {\n background: var(--anyapi-bg);\n min-height: 100vh;\n}\n\n.anyapi-notice.success {\n background: linear-gradient(90deg, #10b981 0%, #34d399 100%);\n color: white;\n padding: 16px 24px;\n border-radius: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 20px 0;\n box-shadow: 0 4px 20px rgba(16, 185, 129, 0.2);\n}\n\n.notice-actions {\n display: flex;\n gap: 8px;\n}\n\n.integration-card {\n background: var(--anyapi-card);\n border: 1px solid var(--anyapi-border);\n border-radius: 16px;\n overflow: hidden;\n margin: 30px 0;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);\n}\n\n.integration-row {\n display: grid;\n grid-template-columns: 100px 1fr 120px 1fr 100px 1fr;\n gap: 16px;\n padding: 24px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n@media (max-width: 1280px) {\n .integration-row {\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n }\n}\n\n@media (max-width: 782px) {\n .integration-row {\n grid-template-columns: 1fr;\n text-align: center;\n }\n}\n\n.badge {\n padding: 8px 16px;\n border-radius: 50px;\n font-size: 13px;\n font-weight: 700;\n text-align: center;\n white-space: nowrap;\n}\n\n.badge.purple {\n background: #7b68ee;\n color: white;\n}\n\n.badge.gray {\n background: #e2e8f0;\n color: #475569;\n}\n\n.code-snippet {\n background: #1e1e1e;\n color: #a6e22e;\n padding: 12px 16px;\n border-radius: 12px;\n font-family: \"SFMono-Regular\", Consolas, monospace;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.dark-mode .code-snippet {\n background: #2d2d2d;\n color: #89ddff;\n}\n\n.status-action {\n text-align: center;\n margin: 40px 0;\n}\n\n.button-warning {\n background: #f59e0b !important;\n color: white !important;\n padding: 14px 32px !important;\n font-size: 16px;\n border-radius: 12px;\n}\n\n.status-footer {\n text-align: center;\n margin: 60px 0 20px;\n}\n\n/* Dark Mode 增強 */\n.dark-mode .anyapi-notice.success {\n background: linear-gradient(90deg, #059669 0%, #10b981 100%);\n}\n\n.dark-mode .integration-card {\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);\n}\n\n/* 完成頁 */\n.completion-wrapper {\n text-align: center;\n max-width: 900px;\n margin: 0 auto;\n padding: 20px;\n}\n.completion-header h2 {\n font-size: 28px;\n margin: 16px 0;\n color: var(--anyapi-text);\n}\n.success-icon {\n font-size: 64px;\n color: #10b981;\n}\n.completion-actions {\n margin: 30px 0;\n display: flex;\n gap: 12px;\n justify-content: center;\n flex-wrap: wrap;\n}\n.integration-card.standalone {\n margin: 40px auto;\n max-width: 100%;\n}\n.final-cta {\n margin: 50px 0;\n}\n.button-hero {\n padding: 18px 40px !important;\n font-size: 18px !important;\n border-radius: 16px;\n box-shadow: 0 8px 25px rgba(245, 158, 11, 0.4);\n}\n.completion-footer {\n margin-top: 60px;\n display: flex;\n gap: 20px;\n justify-content: center;\n flex-wrap: wrap;\n}\n\n/* */\n.test-api-section {\n margin: 50px auto;\n text-align: center;\n}\n\n.button-success {\n background: linear-gradient(135deg, #10b981, #34d399) !important;\n color: white !important;\n border: none;\n padding: 18px 40px !important;\n font-size: 18px;\n border-radius: 16px;\n box-shadow: 0 10px 30px rgba(16, 185, 129, 0.4);\n transition: all 0.3s;\n}\n\n.button-success:hover {\n transform: translateY(-3px);\n box-shadow: 0 15px 40px rgba(16, 185, 129, 0.5);\n}\n\n.button-success.loading {\n opacity: 0.7;\n cursor: not-allowed;\n position: relative;\n}\n.button-success.loading::after {\n content: \"\";\n position: absolute;\n width: 20px;\n height: 20px;\n border: 3px solid #fff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n right: 20px;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.test-result {\n margin-top: 30px;\n padding: 20px;\n border-radius: 12px;\n font-family: \"SFMono-Regular\", monospace;\n font-size: 14px;\n text-align: left;\n max-width: 800px;\n margin-left: auto;\n margin-right: auto;\n border: 1px solid;\n}\n\n.test-result.success {\n background: #ecfdf5;\n border-color: #10b981;\n color: #065f46;\n}\n\n.test-result.error {\n background: #fee2e2;\n border-color: #ef4444;\n color: #991b1b;\n}\n\n.dark-mode .test-result.success {\n background: #064e3b;\n color: #86efac;\n}\n.dark-mode .test-result.error {\n background: #7f1d1d;\n color: #fca5a5;\n}\n"]} -
anyapi/trunk/assets/js/admin.js
r3394506 r3414465 10 10 }); 11 11 }); 12 13 /** 14 * Dark Mode & Last Updated 15 */ 16 17 document.addEventListener("DOMContentLoaded", () => { 18 const toggle = document.getElementById("dark-mode-toggle"); 19 const body = document.body; 20 21 if (localStorage.getItem("anyapiDarkMode") === "enabled") { 22 body.classList.add("dark-mode"); 23 } 24 25 if (!toggle) return; 26 toggle.addEventListener("click", () => { 27 body.classList.toggle("dark-mode"); 28 if (body.classList.contains("dark-mode")) { 29 localStorage.setItem("anyapiDarkMode", "enabled"); 30 } else { 31 localStorage.setItem("anyapiDarkMode", "disabled"); 32 } 33 }); 34 35 // Dashboard update time 36 function updateTime() { 37 document.getElementById("update-time").textContent = 38 new Date().toLocaleTimeString("zh-en", { 39 hour: "2-digit", 40 minute: "2-digit", 41 }); 42 } 43 updateTime(); 44 setInterval(updateTime, 30000); 45 }); 46 47 /** 48 * Review Card 49 */ 50 51 jQuery(document).ready(function ($) { 52 if (!anyapiReview.show_banner) return; 53 54 const $banner = $("#anyapi-review-banner"); 55 const $daysUsed = $banner.find(".days-used"); 56 const $yesBtn = $("#anyapi-review-yes"); 57 const $dismissBtn = $("#anyapi-review-dismiss"); 58 const $closeBtn = $("#anyapi-review-close"); 59 60 // Update the days used 61 const days = anyapiReview.days_used; 62 if ($daysUsed.length && days > 0) { 63 $daysUsed.html(`You've beend using <strong>${days}</strong> days`); 64 } 65 66 // Hit review 67 $yesBtn.on("click", function (e) { 68 e.preventDefault(); 69 window.open(anyapiReview.review_url, "_blank"); 70 dismissReviewBanner(true); 71 }); 72 73 // Hit dismiss 74 $dismissBtn.on("click", function () { 75 dismissReviewBanner(false); 76 }); 77 78 // Hit close 79 $closeBtn.on("click", function () { 80 dismissReviewBanner(false); 81 }); 82 83 function dismissReviewBanner(reviewed = false) { 84 $.post( 85 anyapiReview.ajax_url, 86 { 87 action: "anyapi_dismiss_review", 88 reviewed: reviewed ? 1 : 0, 89 _wpnonce: anyapiReview.nonce, 90 }, 91 function () { 92 $banner.fadeOut(300, function () { 93 $banner.remove(); 94 }); 95 } 96 ); 97 } 98 }); -
anyapi/trunk/assets/js/admin.min.js
r3394506 r3414465 1 !function t(o,u,i){function c(n,r){if(!u[n]){if(!o[n]){var e="function"==typeof require&&require;if(!r&&e)return e(n,!0);if(f)return f(n,!0);throw(r=new Error("Cannot find module '"+n+"'")).code="MODULE_NOT_FOUND",r}e=u[n]={exports:{}},o[n][0].call(e.exports,function(r){return c(o[n][1][r]||r)},e,e.exports,t,o,u,i)}return u[n].exports}for(var f="function"==typeof require&&require,r=0;r<i.length;r++)c(i[r]);return c}({1:[function(r,n,e){"use strict";jQuery(document).ready(function(r){r(document).on("click",".notice-action",function(){jQuery.post(ajaxurl,{action:"close_notice"})})})},{}]},{},[1]); 1 !(function i(o, a, r) { 2 function c(n, e) { 3 if (!a[n]) { 4 if (!o[n]) { 5 var t = "function" == typeof require && require; 6 if (!e && t) return t(n, !0); 7 if (d) return d(n, !0); 8 throw ( 9 (((e = new Error("Cannot find module '" + n + "'")).code = 10 "MODULE_NOT_FOUND"), 11 e) 12 ); 13 } 14 (t = a[n] = { exports: {} }), 15 o[n][0].call( 16 t.exports, 17 function (e) { 18 return c(o[n][1][e] || e); 19 }, 20 t, 21 t.exports, 22 i, 23 o, 24 a, 25 r 26 ); 27 } 28 return a[n].exports; 29 } 30 for ( 31 var d = "function" == typeof require && require, e = 0; 32 e < r.length; 33 e++ 34 ) 35 c(r[e]); 36 return c; 37 })( 38 { 39 1: [ 40 function (e, n, t) { 41 "use strict"; 42 jQuery(document).ready(function (e) { 43 e(document).on("click", ".notice-action", function () { 44 jQuery.post(ajaxurl, { action: "close_notice" }); 45 }); 46 }), 47 document.addEventListener("DOMContentLoaded", function () { 48 var e = document.getElementById("dark-mode-toggle"), 49 n = document.body; 50 function t() { 51 document.getElementById("update-time").textContent = 52 new Date().toLocaleTimeString("zh-en", { 53 hour: "2-digit", 54 minute: "2-digit", 55 }); 56 } 57 "enabled" === localStorage.getItem("anyapiDarkMode") && 58 n.classList.add("dark-mode"), 59 e && 60 (e.addEventListener("click", function () { 61 n.classList.toggle("dark-mode"), 62 n.classList.contains("dark-mode") 63 ? localStorage.setItem("anyapiDarkMode", "enabled") 64 : localStorage.setItem("anyapiDarkMode", "disabled"); 65 }), 66 t(), 67 setInterval(t, 3e4)); 68 }), 69 jQuery(document).ready(function (n) { 70 var t, e, i, o, a, r; 71 function c(e) { 72 n.post( 73 anyapiReview.ajax_url, 74 { 75 action: "anyapi_dismiss_review", 76 reviewed: 0 < arguments.length && void 0 !== e && e ? 1 : 0, 77 _wpnonce: anyapiReview.nonce, 78 }, 79 function () { 80 t.fadeOut(300, function () { 81 t.remove(); 82 }); 83 } 84 ); 85 } 86 anyapiReview.show_banner && 87 ((e = (t = n("#anyapi-review-banner")).find(".days-used")), 88 (i = n("#anyapi-review-yes")), 89 (o = n("#anyapi-review-dismiss")), 90 (a = n("#anyapi-review-close")), 91 (r = anyapiReview.days_used), 92 e.length && 93 0 < r && 94 e.html( 95 "You've beend using <strong>".concat(r, "</strong> days") 96 ), 97 i.on("click", function (e) { 98 e.preventDefault(), 99 window.open(anyapiReview.review_url, "_blank"), 100 c(!0); 101 }), 102 o.on("click", function () { 103 c(!1); 104 }), 105 a.on("click", function () { 106 c(!1); 107 })); 108 }); 109 }, 110 {}, 111 ], 112 }, 113 {}, 114 [1] 115 ); -
anyapi/trunk/inc/Admin.php
r3394506 r3414465 6 6 namespace Anyapi; 7 7 8 class Admin {8 class Admin { 9 9 10 10 public $plugin_path; … … 34 34 } 35 35 add_action( 'admin_init', array( $this, 'anyapiInit' ) ); 36 add_action( 'admin_notices', array( $this, 'addAdminNotice' ) );37 36 add_action( 'admin_enqueue_scripts', array( $this, 'enqueueFiles') ); 38 37 39 add_action( 'wp_ajax_close_notice', function() { 40 set_transient( 'anyapi_notice_closed', true, 259200 ); 41 }); 38 // add_action( 'admin_notices', array( $this, 'addAdminNotice' ) ); 39 // add_action( 'wp_ajax_close_notice', function() { 40 // set_transient( 'anyapi_notice_closed', true, 259200 ); 41 // }); 42 add_action( 'wp_ajax_anyapi_dismiss_review', array( $this, 'ajaxDismissReview' ) ); 43 add_action( 'wp_ajax_anyapi_get_logs', array( $this, 'ajaxGetLogs' ) ); 42 44 43 45 add_filter( "plugin_action_links_" . plugin_basename( dirname( __FILE__, 2) ) . '/anyapi.php', array( $this, 'settingsLinks' ) , 10, 2 ); … … 188 190 public function anyapiInit() { 189 191 190 $this->update ();191 192 if ( ! get_option( 'anyapi_ wc_apilog_function' ) ) {192 $this->updateStatus(); 193 194 if ( ! get_option( 'anyapi_activated_time' ) ) { 193 195 return; 194 196 } … … 205 207 `api_url` text NOT NULL, 206 208 `payload` longtext NOT NULL, 209 `latency` int NULL, 207 210 `timestamp` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, 208 211 PRIMARY KEY (`id`) … … 212 215 213 216 dbDelta( $sql ); 217 218 } 219 220 public function updateStatus() { 221 222 $logCount = self::getLog( 'count' ); 223 $activatedTime = get_option( 'anyapi_activated_time' ); 224 $daysUsed = 0; 225 if ( ! $activatedTime ) { 226 $activatedTime = time(); 227 update_option( 'anyapi_activated_time ', $activatedTime ); 228 $daysUsed = 0; 229 } else { 230 $daysUsed = floor( ( time() - $activatedTime ) / DAY_IN_SECONDS ); 231 } 232 233 $dismissed = get_option( 'anyapi_review_dismissed' ); 234 $dismissTime = get_option( 'anyapi_review_dismiss_time' ); 235 $reviewed = get_option( 'anyapi_review_given' ); 236 $shouldShowBanner = ( 237 $logCount >= 10 && 238 $daysUsed >= 7 && 239 ! $dismissed && 240 ! $reviewed && 241 ( ! $dismissTime || time() > $dismissTime ) 242 ); 243 244 update_option( 'anyapi_version', ANYAPI_VERSION ); 245 update_option( 'anyapi_orderapi', true ); 246 update_option( 'anyapi_log_count', $logCount ); 247 update_option( 'anyapi_review_conditions', array( 248 'log_count' => $logCount, 249 'days_used' => $daysUsed, 250 'should_show' => $shouldShowBanner 251 ) ); 252 253 if ( $shouldShowBanner ) { 254 update_option( 'anyapi_review_dismissed', false ); 255 } 214 256 215 257 } … … 221 263 $apiStatus = get_option( $name[ 'anyApiOrderApi' ], array() ); 222 264 $notice = self::getConfig()[ 'message' ]; 223 $logCount = self::get NumberOfLog( 'count' , 'anyapi_log_anyapi' );265 $logCount = self::getLog( 'count' ); 224 266 225 267 if ( ! isset( $numberOfKey ) || count( $numberOfKey ) === 0 ) { … … 294 336 } 295 337 296 p rivate function getNumberOfLog( $cache, $suffix) {338 public static function getLog( $cache ) { 297 339 298 340 global $wpdb; 299 $results = wp_cache_get( 'anyapi_log_'. $cache, 'anyapi_log_cache' );300 $ searchTable = $wpdb->prefix . $suffix;341 $results = wp_cache_get( 'anyapi_log_'. $cache, 'anyapi_log_cache' ); 342 $table = $wpdb->prefix . 'anyapi_log_anyapi'; 301 343 302 344 if ( false === $results ) { 303 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table query required for API logs. 304 $results = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM %i" , $searchTable ) ); 345 $results = match ( $cache ) { 346 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table query required for API logs. 347 'count' => $wpdb->get_var( $wpdb->prepare( 348 "SELECT COUNT(*) FROM %i", $table 349 ) ), 350 'todaycall' => $wpdb->get_var( $wpdb->prepare( 351 "SELECT COUNT(*) FROM %i WHERE DATE(timestamp) = CURDATE()", $table 352 ) ), 353 'rate' => $wpdb->get_var( $wpdb->prepare( 354 "SELECT COUNT(*) FROM %i WHERE DATE(timestamp) = CURDATE() AND http_code >= %d AND http_code < %d", $table, 200, 300 355 ) ), 356 'latency' => $wpdb->get_var( $wpdb->prepare( 357 "SELECT AVG(latency) FROM %i WHERE DATE(timestamp) = CURDATE() AND latency IS NOT NULL", $table 358 ) ), 359 'endpoints' => $wpdb->get_var( $wpdb->prepare( 360 "SELECT COUNT(DISTINCT api_url) FROM %i", $table 361 ) ), 362 'ytdcall' => $wpdb->get_var( $wpdb->prepare( 363 "SELECT COUNT(*) FROM %i WHERE DATE(timestamp) = CURDATE() - INTERVAL 1 DAY", $table 364 ) ), 365 default => 0, 366 }; 305 367 wp_cache_set( 'anyapi_log_'. $cache, $results, 'anyapi_log_cache', 300 ); 306 368 return $results; … … 309 371 } 310 372 311 public function enqueueFiles() { 373 public static function activatedDay() { 374 $activatedTime = get_option( 'anyapi_activated_time' ); 375 return $activatedTime ? 376 floor( ( time() - $activatedTime ) / DAY_IN_SECONDS ) : 0; 377 } 378 379 public static function getLogCount() { 380 return get_option( 'anyapi_log_count' ); 381 } 382 383 public static function shouldShowBanner() { 384 return self::getLogCount() >= 10 && self::activatedDay() >= 7 && ! get_option( 'anyapi_review_dismissed' ); 385 } 386 387 public function enqueueFiles( $hook ) { 388 389 if ( strpos( $hook, 'anyapi' ) === false ) return; 312 390 313 391 $assets = [ 314 392 'style' => 'assets/css/style.css', 315 393 'scripts' => array( 316 'script' => 'assets/js/admin.min.js', 394 'anyapi-admin' => 'assets/js/admin.min.js', 395 'anyapi-logs' => 'assets/js/anyapi-logs.min.js', 317 396 'layout-tab' => 'assets/js/layout-tab.min.js', 318 397 'settings-api' => 'assets/js/settings-api.min.js', … … 337 416 } 338 417 339 } 418 wp_localize_script( 'anyapi-logs', 'anyapiLogs', array( 419 'ajax_url' => admin_url( 'admin-ajax.php' ), 420 'nonce' => wp_create_nonce( 'anyapi_logs_nonce' ), 421 'i18n' => array( 422 'no_logs' => __( 'No API logs found', 'anyapi' ), 423 'searching' => __( 'Searching...', 'anyapi' ), 424 'loading' => __( 'Loading logs...', 'anyapi' ) 425 ) 426 ) ); 427 428 429 wp_localize_script( 'anyapi-admin', 'anyapiReview', array( 430 'ajax_url' => admin_url( 'admin-ajax.php' ), 431 'nonce' => wp_create_nonce( 'anyapi_review_nonce' ), 432 'show_banner' => self::shouldShowBanner(), 433 'review_url' => 'https://wordpress.org/support/plugin/anyapi/reviews/#new-post', 434 'i18n' => array( 435 'thanks' => __( 'Thank you for support!', 'anyapi' ), 436 'dismissed' => __( 'Got it! You can re-enable this in settings anytime.', 'anyapi' ) 437 ) 438 ) ); 439 440 } 441 442 public function ajaxDismissReview() { 443 444 check_ajax_referer( 'anyapi_review_nonce' ); 445 446 if ( isset( $_POST[ 'reviewed' ] ) && $_POST[ 'reviewed' ] == 1 ) { 447 // review and dismissed + message 448 update_option( 'anyapi_review_dismissed', true ); 449 update_option( 'anyapi_review_given', true ); 450 } else { 451 $dismissTime = time() + ( 14 * DAY_IN_SECONDS ); 452 update_option( 'anyapi_review_dismissed', true ); 453 update_option( 'anyapi_review_dismiss_time', $dismissTime ); 454 } 455 wp_send_json_success(); 456 457 } 458 459 public function ajaxGetLogs() { 460 461 check_ajax_referer( 'anyapi_logs_nonce' ); 462 463 global $wpdb; 464 $table = $wpdb->prefix . 'anyapi_log_anyapi'; 465 $page = max( 1, intval( $_POST[ 'page' ] ?? 1 ) ); 466 $searchRaw = isset( $_POST[ 'search' ] ) ?? '' ; 467 $search = sanitize_text_field( $searchRaw ?? '' ); 468 $perPage = 10; 469 $offset = ( $page - 1 ) * $perPage; 470 471 $params = []; 472 if ( ! empty( $search ) ) { 473 $like = "%$search%"; 474 $params = [ $like, $like, $like ]; 475 } 476 477 $total = wp_cache_get( 'anyapi_log_'. $search, 'anyapi_log_cache' ); 478 if ( false === $total ) { 479 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table query required for API logs. 480 $total = $wpdb->get_var( $wpdb->prepare( 481 "SELECT COUNT(*) FROM %i WHERE (api_url LIKE %s OR payload LIKE %s OR order_id LIKE %s)", $table, ...$params 482 ) ); 483 wp_cache_set( 'anyapi_log_'. $search, $total, 'anyapi_log_cache', 60 ); 484 } 485 486 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Custom table query required for API logs. 487 $logs = $wpdb->get_results( $wpdb->prepare( 488 "SELECT id, order_id, http_code, api_url, payload, latency, timestamp FROM %i WHERE (api_url LIKE %s OR payload LIKE %s OR order_id LIKE %s) ORDER BY timestamp DESC LIMIT %d OFFSET %d", $table, ...array_merge( $params, [ $perPage, $offset ] ) 489 ), ARRAY_A ); 490 491 wp_send_json_success( [ 492 'logs' => $logs, 493 'total' => intval( $total ), 494 'page' => $page 495 ] ); 496 497 } 498 340 499 341 500 public function settingsLinks( $links ) { … … 364 523 } 365 524 525 public static function pluginVersionCheck( $currentVer ) { 526 527 $latestVer = self::getLatestVersion(); 528 if ( ! $latestVer ) { 529 return; 530 } 531 return $latestVer && version_compare( $currentVer, $latestVer[ 'version' ], '<' ); 532 533 } 534 535 public static function getLatestVersion() { 536 537 $cacheKey = 'anyapi_latest_version_wporg'; 538 $cached = get_transient( $cacheKey ); 539 if ( false !== $cached ) { 540 return $cached; 541 } 542 543 $response = wp_remote_get( 544 'https://plugins.svn.wordpress.org/anyapi/trunk/readme.txt', array( 545 'timeout' => 10, 546 'sslverify' => true, 547 ) 548 ); 549 550 if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) { 551 return false; 552 } 553 554 $body = wp_remote_retrieve_body( $response ); 555 // 1. Search Stable Tag 556 if ( preg_match( '/^Stable tag:\s*([0-9.]+)/mi', $body, $m ) ) { 557 $latestVersion = trim( $m[1] ); 558 } else { 559 return false; 560 } 561 // 2. Changelog Latest Update Content 562 $date = ''; 563 $changes = array(); 564 if ( preg_match( '/=\s*' . preg_quote( $latestVersion, '/' ) . '\s*\(([\d-]+)\)\s*=\s*\n(.*?)(?:\n\n=|$)/s', $body, $m ) ) { 565 $date = $m[1]; 566 $changedText = trim( $m[2] ); 567 $lines = array_filter( array_map( 'trim', explode( "\n", $changedText ) ) ); 568 foreach ( $lines as $line ) { 569 $line = preg_replace( '/^\*\s*/', '', $line ); 570 if ( $line ) $changes[] = $line; 571 } 572 } 573 574 $result = array( 575 'version' => $latestVersion, 576 'date' => $date ?: gmdate( 'Y-m-d' ), 577 'changes' => ! empty( $changes ) ? $changes : array( 'Update Changlog Not Found' ), 578 ); 579 580 set_transient( $cacheKey, $result, 12 * HOUR_IN_SECONDS ); 581 582 return $result; 583 584 } 585 586 public static function pluginUpdateUrl() { 587 588 $pluginDir = 'anyapi/anyapi.php'; 589 $updateUrl = wp_nonce_url( 590 admin_url( 'update.php?action=upgrade-plugin&plugin=' . $pluginDir ), 591 'upgrade-plugin_' . $pluginDir 592 ); 593 // redirect to dashboard 594 return $updateUrl = add_query_arg( 'return', urlencode( admin_url( 'admin.php?page=anyapi-settings' ) ), $updateUrl ); 595 596 } 597 366 598 public static function isProActivate() { 367 599 $activePlugins = get_option( 'active_plugins' ); … … 371 603 } 372 604 373 public function update() {374 update_option( 'anyapi_version', ANYAPI_VERSION );375 update_option( 'anyapi_orderapi', true );376 }377 378 605 public function dashboardPage() { 379 606 return require_once "$this->plugin_path/templates/dashboard.php"; 607 } 608 public function settingsPage() { 609 return require_once "$this->plugin_path/templates/settings.php"; 380 610 } 381 611 … … 414 644 415 645 public static function deactivate() { 416 417 646 flush_rewrite_rules(); 418 419 647 } 420 648 -
anyapi/trunk/inc/Anyapi.php
r3394506 r3414465 86 86 * 87 87 */ 88 88 89 public function loadAddOns( $input ) { 89 90 … … 184 185 185 186 $args = array( 187 // Dashboard Header (*) 188 // array( 189 // 'id' => 'anyapi_admin_header', 190 // 'title' => '', 191 // 'callback' => array( $this->dashboard, 'dashboardHeader' ), 192 // 'page' => 'anyapi_admin_header_content', 193 // 'args' => array( 194 // ) 195 // ), 196 // Dashboard Section 197 array( 198 'id' => 'anyapi_admin_dashboard', 199 'title' => '', 200 'callback' => array( $this->dashboard, 'dashboardContent' ), 201 'page' => 'anyapi_admin_dashboard_content', 202 'args' => array( 203 ) 204 ), 186 205 // Fearture Tabs 187 206 array( … … 374 393 ), 375 394 ); 395 376 396 $this->settings->setSections( $args ); 377 397 … … 402 422 403 423 $this->subpages = []; 424 $settingsPage = array( 425 'parent_slug' => self::MENU_SLUG, 426 'page_title' => 'AnyAPI - Settings', 427 'menu_title' => 'Settings', 428 'capability' => 'manage_options', 429 'menu_slug' => self::MENU_SLUG . '_settings', 430 'callback' => array( $this->settings, 'settingsPage' ) 431 ); 432 $this->subpages[] = $settingsPage; 433 404 434 $orderAPIPage = null; 405 435 $restAPIPage = null; … … 407 437 $proMenu = null; 408 438 409 $orderAPIOption = get_option( 'anyapi_wc_orderapi_integration' ); 410 if ( $orderAPIOption ) { 439 if ( self::activateOrderAPI() ) { 411 440 $orderAPIPage = array( 412 441 'parent_slug' => self::MENU_SLUG, … … 420 449 } 421 450 422 $restAPIOption = get_option( 'anyapi_wc_restapi_function' ); 423 if ( $restAPIOption ) { 451 if ( self::activateAPITool() ) { 424 452 $restAPIPage = array( 425 453 'parent_slug' => self::MENU_SLUG, … … 433 461 } 434 462 435 $apiLogOption = get_option( 'anyapi_wc_apilog_function' ); 436 if ( $apiLogOption ) { 463 if ( self::activateAPILog() ) { 437 464 $apiLogPage = array( 438 465 'parent_slug' => self::MENU_SLUG, … … 528 555 } 529 556 557 public static function activateOrderAPI() { 558 return get_option( 'anyapi_wc_orderapi_integration' ); 559 } 560 561 public static function activateAPITool() { 562 return get_option( 'anyapi_wc_restapi_function' ); 563 } 564 565 public static function activateAPILog() { 566 return get_option( 'anyapi_wc_apilog_function' ); 567 } 568 530 569 public static function getOption() { 531 570 return self::getConfig(); -
anyapi/trunk/inc/Controller/OrderIntegrations.php
r3394506 r3414465 248 248 'api_url' => $response[ 'apiUrl' ], 249 249 'payload' => wp_json_encode( $response[ 'payload' ] ), 250 'latency' => $response[ 'latency' ], 250 251 'timestamp' => current_time('mysql'), 251 252 ) … … 270 271 ); 271 272 272 $response = wp_remote_post( $reqUrl, $args ); 273 $start = microtime( true ); 274 $response = wp_remote_post( $reqUrl, $args ); 275 $latency = round( ( microtime( true ) - $start ) * 1000 ); 273 276 274 277 if ( is_wp_error( $response ) ) { … … 289 292 'payload' => $payload, 290 293 'response' => $body, 294 'latency' => $latency 291 295 ); 292 296 -
anyapi/trunk/inc/Views/Dashboard.php
r3394506 r3414465 6 6 namespace Anyapi\Views; 7 7 8 use Anyapi\Admin; 8 9 use Anyapi\Anyapi; 9 10 10 11 class Dashboard { 12 13 public function dashboardHeader( $args ) { 14 ?> 15 <?php self::showBanner() ?> 16 <div id="anyapi-dashboard-header"> 17 <div class="anyapi-header-left"> 18 <!-- Logo --> 19 <img src="" 20 alt="AnyAPI Logo" 21 class="anyapi-logo"> 22 </div> 23 24 <div class="anyapi-header-right"> 25 <!-- Dark Mode Toggle --> 26 <button type="button" id="dark-mode-toggle" class="dark-mode-toggle" aria-label="toggle-dark-mode"> 27 <span class="sun-icon"></span> 28 <span class="moon-icon"></span> 29 <span class="toggle-ball"></span> 30 </button> 31 </div> 32 </div> 33 <?php 34 } 35 36 public function showBanner() { 37 38 $notice = Admin::getConfig()[ 'message' ]; 39 ?> 40 <?php if ( Admin::shouldShowBanner() ): ?> 41 <div id="anyapi-review-banner" class="anyapi-review-banner"> 42 <div class="review-content"> 43 <div class="review-icon">✨</div> 44 <div class="review-text"> 45 <h3>Enjoying AnyAPI ?</h3> 46 <p class="days-used"> 47 <?php 48 printf( 49 'You’ve been using <a href="%s"><span class="tag" style="color: #f34a4a">%s </span></a>plugin for %s times automations and over %s days now', 50 esc_url( '/wp-admin/admin.php?page=anyapi' ), 51 esc_html( 'AnyAPI' ), 52 esc_html( Admin::getLogCount() ), 53 esc_html( Admin::activatedDay() ), 54 ) 55 ?> 56 </p> 57 <p> 58 <?php 59 printf( 60 '%s', 61 esc_html( $notice[ 'system_3' ] ) 62 ) 63 ?> 64 </p> 65 <div class="review-stars">⭐⭐⭐⭐⭐</div> 66 </div> 67 <div class="review-actions"> 68 <a href="#" id="anyapi-review-yes" class="button button-primary button-large"> 69 Leave a nice review 70 </a> 71 <button id="anyapi-review-dismiss" class="button button-secondary"> 72 Ask me later 73 </button> 74 </div> 75 </div> 76 <button class="review-close" id="anyapi-review-close">×</button> 77 </div> 78 <?php endif; ?> 79 <?php 80 } 81 82 public function dashboardContent( $args ) { 83 ?> 84 <div id="anyapi-dashboard" class="wrap"> 85 <h1 class="wp-heading-inline">Dashboard</h1> 86 <span id="anyapi-last-updated">Last Update : 87 <span id="update-time">Just a moment</span> 88 </span> 89 90 <div class="anyapi-main-grid"> 91 <!-- Left Content --> 92 <div class="anyapi-content"> 93 <?php self::statusCard() ?> 94 <!-- Chart Cards --> 95 <?php self::logSection() ?> 96 <!-- Bottom Cards --> 97 </div> 98 <?php self::dashboardSideBar() ?> 99 </div> 100 </div> 101 <?php 102 } 103 104 public function statusCard() { 105 // 1. API Calls Today & vs ytd 106 $todayCalls = Admin::getLog( 'todaycall' ); 107 $ytdCalls = Admin::getLog( 'ytdcall' ); 108 $callsChange = $ytdCalls > 0 109 ? round( (( $todayCalls - $ytdCalls ) / $ytdCalls) * 100, 1 ) 110 : ( $todayCalls > 0 ? 100 : 0 ); 111 112 // 2. Success Rate Today (http_code 2xx) 113 $todaySuccess = Admin::getLog( 'rate' ); 114 $successRate = $todayCalls > 0 ? round( ($todaySuccess / $todayCalls) * 100, 2 ) : 0; 115 116 // 3. Average Latency Today 117 $avgLatency = Admin::getLog( 'latency' ); 118 $avgLatency = $avgLatency ? round( $avgLatency ) : 0; 119 120 // 4. Active Endpoints(api URL) 121 $activeEndpoints = Admin::getLog( 'endpoints' ); 122 $activeEndpoints = $activeEndpoints ? : 0; 123 124 ?> 125 <div class="anyapi-grid"> 126 127 <div class="anyapi-card"> 128 <h3>API Calls Today</h3> 129 <div class="anyapi-value"><?php echo number_format( $todayCalls ); ?></div> 130 <div class="change <?php echo $callsChange >= 0 ? 'positive' : 'negative'; ?>"> 131 <?php echo $callsChange >= 0 ? 'Up' : 'Down'; ?> <?php echo esc_html( abs( $callsChange ) ); ?>% 132 </div> 133 </div> 134 135 <div class="anyapi-card"> 136 <h3>Success Rate Today</h3> 137 <div class="anyapi-value success"><?php echo esc_html( $successRate ); ?>%</div> 138 <div class="change positive">Healthy</div> 139 </div> 140 141 <div class="anyapi-card"> 142 <h3>Average Latency</h3> 143 <div class="anyapi-value"><?php echo number_format( $avgLatency ); ?> ms</div> 144 <div class="change <?php echo $avgLatency < 1800 ? 'positive' : 'warning'; ?>"> 145 <?php echo $avgLatency < 1800 ? 'Fast' : 'Slow'; ?> 146 </div> 147 </div> 148 149 <div class="anyapi-card"> 150 <h3>Active Endpoints</h3> 151 <div class="anyapi-value"><?php echo esc_html( $activeEndpoints ); ?></div> 152 <div class="change">Unique URLs</div> 153 </div> 154 155 </div> 156 <?php 157 } 158 159 public function logSection() { 160 ?> 161 <div id="anyapi-logs-section" class="anyapi-card"> 162 163 <div id="anyapi-logs-header"> 164 <h2>Real Time API Log</h2> 165 <div class="logs-controls"> 166 <!-- <input type="text" id="anyapi-log-search" placeholder="Search endpoint, payload, order ID..."> --> 167 <button id="anyapi-log-refresh" class="button">Refresh</button> 168 </div> 169 </div> 170 171 <div class="table-container"> 172 <table id="anyapi-logs-table" class="wp-list-table widefat fixed striped"> 173 <thead> 174 <tr> 175 <th class="column-time">Time</th> 176 <th class="column-method">Method</th> 177 <th class="column-endpoint">Endpoint</th> 178 <th class="column-status">Status</th> 179 <th class="column-latency">Latency</th> 180 <th class="column-payload">Payload</th> 181 </tr> 182 </thead> 183 <tbody id="anyapi-logs-body"> 184 <tr><td colspan="6" class="loading">Loading logs...</td></tr> 185 </tbody> 186 </table> 187 </div> 188 189 <div id="anyapi-logs-footer"> 190 <div id="logs-pagination"></div> 191 <div id="logs-info"></div> 192 </div> 193 194 </div> 195 <?php 196 } 197 198 public function chartCard() { 199 ?> 200 <div class="anyapi-charts-row"> 201 <div class="anyapi-chart-card"> 202 <h2>Calling trends over the past 7 days</h2> 203 <canvas id="trendsChart" height="300"></canvas> 204 </div> 205 <div class="anyapi-chart-card"> 206 <h2>Error (type) distribution</h2> 207 <canvas id="errorPie" height="300"></canvas> 208 </div> 209 </div> 210 <?php 211 } 212 213 public function dashboardSideBar() { 214 ?> 215 <div class="anyapi-sidebar"> 216 <?php 217 self::versionCard(); 218 // upgradeCard 219 self::quickLinksCard(); 220 self::documentCard(); 221 ?> 222 </div> 223 <?php 224 } 225 226 public function versionCard() { 227 228 $currentVer = ANYAPI_VERSION; 229 $latestVer = Admin::getLatestVersion(); 230 ?> 231 <div class="anyapi-sidebar-card"> 232 <h3>Current Version</h3> 233 <p> 234 <strong>v<?php echo esc_html( $currentVer ); ?></strong> 235 <?php if ( ! $latestVer ): ?> 236 <span class="dashicons dashicons-warning"></span> 237 <?php elseif ( ! Admin::pluginVersionCheck( $currentVer ) ): ?> 238 <span class="dashicons dashicons-yes-alt"></span> 239 <?php else: ?> 240 <span class="dashicons dashicons-update"></span> 241 <?php endif; ?> 242 </p> 243 244 <?php if ( Admin::pluginVersionCheck( $currentVer ) ): ?> 245 <p class="anyapi-new-version-notice"> 246 New Version v<?php echo esc_html( $latestVer[ 'version' ] ); ?> 247 <small>(<?php echo esc_html( $latestVer[ 'date' ] ); ?>)</small> 248 </p> 249 250 <div class="anyapi-update-box"> 251 <strong>Update details : </strong> 252 <ul> 253 <?php foreach ( array_slice( $latestVer[ 'changes' ],0,4 ) as $change ): ?> 254 <li><?php echo esc_html( $change ); ?></li> 255 <?php endforeach; ?> 256 </ul> 257 258 <a href="<?php echo esc_url( Admin::pluginUpdateUrl() ); ?>" 259 class="anyapi-update-button button button-primary button-small"> 260 Update to v<?php echo esc_html( $latestVer[ 'version' ] ); ?> 261 </a> 262 263 <a href="https://wordpress.org/plugins/anyapi/#developers" 264 target="_blank" class="anyapi-view-details"> 265 View version details → 266 </a> 267 </div> 268 269 <?php else: ?> 270 <p style="anyapi-latest-text"> 271 Latest Version (<?php echo esc_html( $latestVer[ 'date' ] ); ?>) 272 </p> 273 <?php endif; ?> 274 275 </div> 276 <?php 277 278 } 279 280 public function upgradeCard() { 281 ?> 282 <div class="anyapi-sidebar-card anyapi-upgrade"> 283 <div class="upgrade-header"> 284 <h3>Upgrade to AnyAPI Pro</h3> 285 <span class="badge">Popular</span> 286 </div> 287 <ul class="features"> 288 <li></li> 289 </ul> 290 <a href="https://anyapiplugin.com/pricing" target="_blank" class="anyapi-button-block button button-primary">Upgrade Now</a> 291 <p class="anyapi-save"> <strong></strong></p> 292 </div> 293 <?php 294 } 295 296 public function quickLinksCard() { 297 ?> 298 <div class="anyapi-sidebar-card"> 299 <h3>Quick Links</h3> 300 <ul class="anyapi-quick-links"> 301 <?php if ( Anyapi::activateOrderAPI() ) :?> 302 <li><a href="admin.php?page=anyapi_orderapi">Woo Order Automation</a></li> 303 <?php else: ?> 304 <li><a href="admin.php?page=anyapi_settings">Woo Order Automation</a></li> 305 <?php endif; ?> 306 307 <?php if ( Anyapi::activateAPITool() ) :?> 308 <li><a href="admin.php?page=anyapi_restapi">API Development Tools</a></li> 309 <?php else: ?> 310 <li><a href="admin.php?page=anyapi_settings">API Development Tools</a></li> 311 <?php endif; ?> 312 313 <?php if ( Anyapi::activateAPILog() ) :?> 314 <li><a href="admin.php?page=anyapi_restapi">API Integration Logs</a></li> 315 <?php else: ?> 316 <li><a href="admin.php?page=anyapi_settings">API Integration Logs</a></li> 317 <?php endif; ?> 318 <li><a href="admin.php?page=anyapi_settings">Plugin Setting</a></li> 319 </ul> 320 </div> 321 <?php 322 } 323 324 public function documentCard() { 325 ?> 326 <div class="anyapi-sidebar-card"> 327 <h3>Documentation</h3> 328 <ul class="anyapi-quick-links"> 329 <li><a href="https://anyapiplugin.com/docs/setup-order-api-integration/" target="_blank">Quick Setup - Woo Order API Integration</a></li> 330 <li><a href="https://anyapiplugin.com/docs/woocommerce-rest-api/" target="_blank">WooCommerce REST API Tools</a></li> 331 <li><a href="https://anyapiplugin.com/docs/json-filter/" target="_blank">JSON Filter Mode</a></li> 332 </ul> 333 </div> 334 <?php 335 } 336 337 public function bottomCard() { 338 ?> 339 <div class="anyapi-bottom-grid"> 340 <div class="anyapi-info-card"> 341 <h3>Documentation</h3> 342 <p></p> 343 <a href="https://anyapi.com/docs" target="_blank" class="button">Doc</a> 344 </div> 345 <div class="anyapi-info-card"> 346 <h3>Join Our Community</h3> 347 <p></p> 348 <a href="https://fb.com/groups/anyapi" target="_blank" class="button">Join</a> 349 </div> 350 <div class="anyapi-info-card"> 351 <h3>Need Help?</h3> 352 <p></p> 353 <a href="https://anyapi.com/support" target="_blank" class="button">Request</a> 354 </div> 355 <div class="anyapi-info-card"> 356 <h3>Enjoying AnyAPI?</h3> 357 <p></p> 358 <a href="https://wordpress.org/support/plugin/anyapi/reviews/#new-post" target="_blank" class="button button-primary">Review</a> 359 </div> 360 </div> 361 <?php 362 } 11 363 12 364 public function featureCard( $args ) { -
anyapi/trunk/inc/Views/OrderApi.php
r3394506 r3414465 37 37 echo '<div class="feature-tags">'; 38 38 echo "<span class=\"tag-key tag large tag--large\">API Key not found</span></div>"; 39 echo '<p class="feature-attribute">Please setup API Key in Dashboard</p>';39 echo '<p class="feature-attribute">Please setup API Key in<a href="admin.php?page=anyapi_settings">Settings</a></p>'; 40 40 } 41 41 -
anyapi/trunk/readme.txt
r3394506 r3414465 3 3 Donate link: 4 4 Tags: api, json, webhooks, automation, automator 5 Tested up to: 6. 86 Stable tag: 1.1. 35 Tested up to: 6.9 6 Stable tag: 1.1.4 7 7 License: GPLv2 or later 8 8 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 80 80 == Changelog == 81 81 82 = 1.1.4 (2025-12-8) = 83 * Added - dashboard 84 * Added - real time API log 85 * Tweak - api monitoring 86 82 87 = 1.1.3 (2025-11-12) = 83 88 * Added - filter fields and json preview in advance mode -
anyapi/trunk/templates/dashboard.php
r3394506 r3414465 1 <div class="wrap">2 3 <div class="header-title"><h1>AnyAPI</h1></div>4 1 <?php 5 2 if ( ! defined( 'ABSPATH' ) ) exit; … … 7 4 ?> 8 5 9 <ul class="nav nav-tabs"> 10 <li class="active"><a href="#tab-1">Features</a></li> 11 <li><a href="#tab-2">Setup Key</a></li> 12 <li><a href="#tab-3">Saved Key</a></li> 13 </ul> 6 <!-- AnyAPI Header --> 7 <?php 8 do_settings_sections( 'anyapi_admin_header_content' ); 9 ?> 14 10 15 <div class="tab-content"> 16 17 <div id="tab-1" class="tab-pane active"> 18 <div class="feature-cards"> 19 20 <div class="container grid grid--3-cols margin-bottom-md"> 21 22 <div class="feature api-integration"> 23 <div class="feature-content"> 24 <div class="feature-dashboard-tags"> 25 <span class="tag tag--codefree">Code-free</span> 26 <span class="tag tag--woo">Woo</span> 27 <a href="https://anyapiplugin.com/docs/setup-order-api-integration/?utm_source=anyapi_plugin&utm_medium=plugin_dashboard&utm_campaign=setup_docs_link" target="_blank"><span class="tag tag--new">Start Guide</span></a> 28 </div> 29 <p class="feature-name">Order API Integration to any APIs</p> 30 <?php 31 do_settings_sections( 'anyapi_orderapi_integration_content' ); 32 ?> 33 <div class="call-to-action"> 34 <?php 35 do_settings_sections( 'anyapi_orderapi_integration' ); 36 ?> 37 </div> 38 </div> 39 </div> 40 41 <div class="feature api-tools"> 42 <div class="feature-content"> 43 <div class="feature-dashboard-tags"> 44 <span class="tag tag--codefree">Code-free</span> 45 <span class="tag tag--woo">Woo</span> 46 <a href="https://anyapiplugin.com/docs/woocommerce-api-tools/development-tools/?utm_source=anyapi_plugin&utm_medium=plugin_dashboard&utm_campaign=setup_docs_link" target="_blank"><span class="tag tag--new">Start Guide</span></a> 47 </div> 48 <p class="feature-name">Woo API Development Tools</p> 49 50 <ul class="feature-attributes"> 51 <li class="feature-attribute"> 52 <span><strong>Easy</strong> for Testing</span> 53 </li> 54 <li class="feature-attribute"> 55 <span><strong>REST API</strong> CRUD</span> 56 </li> 57 <li class="feature-attribute"> 58 <span><strong>Access</strong> Order, Products, Customers APIs</span> 59 </li> 60 <li class="feature-attribute"> 61 <span><strong>View</strong> Response JSON for debugging</span> 62 </li> 63 </ul> 64 65 <div class="call-to-action"> 66 <?php 67 do_settings_sections( 'anyapi_restapi_function' ); 68 ?> 69 </div> 70 </div> 71 </div> 72 73 <div class="feature api-logs"> 74 <div class="feature-content"> 75 <div class="feature-dashboard-tags"> 76 <span class="tag tag--codefree">Code-free</span> 77 <span class="tag tag--new">New !</span> 78 </div> 79 <p class="feature-name">API Integration Logs</p> 80 <?php 81 do_settings_sections( 'anyapi_wc_apilog_function_content' ); 82 ?> 83 <div class="call-to-action"> 84 <?php 85 do_settings_sections( 'anyapi_apilog_function' ); 86 ?> 87 </div> 88 </div> 89 </div> 90 91 </div> 92 93 </div> 94 </div> 95 96 <div id="tab-2" class="tab-pane"> 97 <div class="auth-cards"> 98 <?php 99 do_settings_sections( 'anyapi_apikey_setup' ); 100 ?> 101 </div> 102 103 <div class="container auth-forms"> 104 <div class="container basic-auth-form" hidden> 105 <form method="post" action="options.php"> 106 <div class="basic-auth-card"> 107 <?php 108 do_settings_sections( 'anyapi_auth_basic' ); 109 settings_fields( 'anyapi_wc_apikey' ); 110 ?> 111 </div> 112 </form> 113 </div> 114 115 <div class="container bearer-token-form" hidden> 116 <form method="post" action="options.php"> 117 <div class="basic-auth-card"> 118 <?php 119 do_settings_sections( 'anyapi_auth_bearertoken' ); 120 settings_fields( 'anyapi_wc_apikey' ); 121 ?> 122 </div> 123 </form> 124 </div> 125 </div> 126 </div> 127 128 <div id="tab-3" class="tab-pane"> 129 <div class="container"> 130 <div class="feature-cards"> 131 <div class="card-content"> 132 <div class="feature-content"> 133 <?php 134 do_settings_sections( 'anyapi_apikey_records' ); 135 ?> 136 </div> 137 </div> 138 </div> 139 </div> 140 </div> 141 142 </div> 143 144 </div> 11 <!-- AnyAPI Dashboard Cards --> 12 <?php 13 do_settings_sections( 'anyapi_admin_dashboard_content' ); 14 ?>
Note: See TracChangeset
for help on using the changeset viewer.