Compare commits
33 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6671155ec7 | ||
|
|
61aa3f4994 | ||
|
|
68c6611e30 | ||
|
|
890eafb883 | ||
|
|
d1bb583274 | ||
|
|
04447e5a15 | ||
|
|
2f1ad3b06e | ||
|
|
d9851295e8 | ||
|
|
f3ab0aaa76 | ||
|
|
a81cf9cd5b | ||
|
|
3c6261dc9b | ||
|
|
6642cf12d2 | ||
|
|
c6bc1b9338 | ||
|
|
cb71ba1cf7 | ||
|
|
ff96cc3f3b | ||
|
|
b723a134a7 | ||
|
|
f7ca7d87e7 | ||
|
|
dcb48fde7c | ||
|
|
e677b018cf | ||
|
|
849d309228 | ||
|
|
93c4275848 | ||
|
|
895e90d710 | ||
|
|
63f4738a2e | ||
|
|
acf82b006a | ||
|
|
c1d8176a6c | ||
|
|
2dee744bef | ||
|
|
700c489988 | ||
|
|
b83e710fcf | ||
|
|
756a7c98e3 | ||
|
|
a1f806849e | ||
|
|
5f40a4281c | ||
|
|
62706771b2 | ||
|
|
8b7bef9e6d |
37
.github/workflows/downloads-chart.yml
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
name: Update downloads chart
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Daily at 06:15 UTC (after pypistats has processed the prior day)
|
||||
- cron: "15 6 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
regenerate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
token: ${{ secrets.PAT }}
|
||||
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.12"
|
||||
|
||||
- name: Regenerate cumulative downloads chart
|
||||
run: python scripts/generate_downloads_chart.py
|
||||
|
||||
- name: Commit and push updated chart
|
||||
run: |
|
||||
if git diff --quiet assets/downloads-chart.svg; then
|
||||
echo "No changes to downloads chart."
|
||||
exit 0
|
||||
fi
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
git add assets/downloads-chart.svg
|
||||
git commit -m "chore: refresh downloads chart"
|
||||
git push
|
||||
24
.gitignore
vendored
|
|
@ -42,3 +42,27 @@ demo.SemanticModel/
|
|||
demo.pbip
|
||||
pbir_desktop_test/
|
||||
"pbib examples/"
|
||||
|
||||
# Marketing assets (local only, not for GitHub)
|
||||
marketing/
|
||||
|
||||
# Local-only documents (private notes, call prep, etc.)
|
||||
docs/
|
||||
|
||||
# Assets not referenced in README
|
||||
assets/*.png
|
||||
assets/Claude_AI_symbol.svg
|
||||
assets/New_Power_BI_Logo.svg
|
||||
assets/commands.svg
|
||||
assets/cta-start.svg
|
||||
assets/dax-skill.svg
|
||||
assets/deploy-secure.svg
|
||||
assets/docs-diagnostics.svg
|
||||
assets/dual-layer.svg
|
||||
assets/feature-grid.svg
|
||||
assets/header.svg
|
||||
assets/how-it-works.svg
|
||||
assets/modeling-skill.svg
|
||||
assets/release-vibe-bi.svg
|
||||
assets/token-cost.svg
|
||||
assets/workflow.svg
|
||||
|
|
|
|||
20
CHANGELOG.md
|
|
@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [3.10.6] - 2026-04-07
|
||||
|
||||
### Fixed
|
||||
- `visual bind` no longer writes the legacy `Commands` block (SemanticQueryDataShapeCommand) to `visual.json`. PBIR 2.7.0 uses `additionalProperties: false` on the query object, so the `Commands` field is a hard schema violation. Only `queryState` projections are now written.
|
||||
- `pbi report validate` and the full PBIR validator no longer flag a missing `layoutOptimization` field as an error. The real Microsoft schema does not list it as required; the previous check was against a stale internal schema.
|
||||
- `pbi report set-background` now always writes `transparency: 0` alongside the color. Power BI Desktop defaults a missing `transparency` property to 100 (fully invisible), making the color silently unrendered. The new `--transparency` flag (0-100, default 0) lets callers override for semi-transparent backgrounds.
|
||||
|
||||
### Added
|
||||
- `--no-sync` flag on `report`, `visual`, `filters`, and `bookmarks` command groups. Suppresses the per-command Desktop auto-sync for scripted multi-step builds. Use `pbi report reload` for a single explicit sync at the end of the script.
|
||||
|
||||
## [3.10.5] - 2026-04-06
|
||||
|
||||
### Fixed
|
||||
- ASCII banner: replaced incorrect hand-crafted art with the official design from `assets/banner.svg`. The `I` in PBI is now correctly narrow, and a small `███╗/╚══╝` block serves as the visible `-` separator between PBI and CLI.
|
||||
|
||||
## [3.10.4] - 2026-04-06
|
||||
|
||||
### Added
|
||||
- ASCII banner displayed in terminal when `pbi` is invoked with no subcommand. Renders in Power BI yellow on color terminals, plain text fallback on legacy terminals without Unicode support. Skipped when `--json` flag is used.
|
||||
|
||||
## [3.10.3] - 2026-04-05
|
||||
|
||||
### Changed
|
||||
|
|
|
|||
|
|
@ -41,6 +41,14 @@
|
|||
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/stats.svg" alt="pbi-cli at a Glance" width="850"/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/MinaSaad1/pbi-cli/master/assets/downloads-chart.svg" alt="pbi-cli cumulative downloads from PyPI" width="850"/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub>Cumulative downloads, refreshed daily from <a href="https://pypistats.org/packages/pbi-cli-tool">pypistats.org</a> via GitHub Actions.</sub>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Get Started
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated by Pixelmator Pro 3.6.17 -->
|
||||
<svg width="1200" height="1200" viewBox="0 0 1200 1200" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="g314">
|
||||
<path id="path147" fill="#d97757" stroke="none" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4 KiB |
|
|
@ -1,36 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="630px" height="630px" viewBox="0 0 630 630" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
|
||||
<title>PBI Logo</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
|
||||
<stop stop-color="#EBBB14" offset="0%"></stop>
|
||||
<stop stop-color="#B25400" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
|
||||
<stop stop-color="#F9E583" offset="0%"></stop>
|
||||
<stop stop-color="#DE9800" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<path d="M346,604 L346,630 L320,630 L153,630 C138.640597,630 127,618.359403 127,604 L127,183 C127,168.640597 138.640597,157 153,157 L320,157 C334.359403,157 346,168.640597 346,183 L346,604 Z" id="path-3"></path>
|
||||
<filter x="-9.1%" y="-6.3%" width="136.5%" height="116.9%" filterUnits="objectBoundingBox" id="filter-4">
|
||||
<feOffset dx="20" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="10" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0530211976 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-5">
|
||||
<stop stop-color="#F9E68B" offset="0%"></stop>
|
||||
<stop stop-color="#F3CD32" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="PBI-Logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Group" transform="translate(77.500000, 0.000000)">
|
||||
<rect id="Rectangle" fill="url(#linearGradient-1)" x="256" y="0" width="219" height="630" rx="26"></rect>
|
||||
<g id="Combined-Shape">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
|
||||
<use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
|
||||
</g>
|
||||
<path d="M219,604 L219,630 L193,630 L26,630 C11.6405965,630 1.75851975e-15,618.359403 0,604 L0,341 C-1.75851975e-15,326.640597 11.6405965,315 26,315 L193,315 C207.359403,315 219,326.640597 219,341 L219,604 Z" id="Combined-Shape" fill="url(#linearGradient-5)"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.5 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="440" viewBox="0 0 850 440">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="230" viewBox="0 0 850 230">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="28" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Architecture: Two Layers, One CLI</text>
|
||||
|
||||
<!-- Box 1: Claude Code -->
|
||||
|
|
@ -192,6 +77,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="218" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">No MCP server, no external binaries. Sub-second execution.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 6.4 KiB |
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cd0accbfe5f058a692937540f456a1010e2fa82f60089949e52d3c4999d8c401
|
||||
size 17179306
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:173d00d74c9e4bebb2f957b84562b62155b0c0a42081f81be425f3d3c4dcf628
|
||||
size 16253073
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:21eeb1a24d1a8d59ff0e4a8903dd7e7f864e01c715420012417e010395c90005
|
||||
size 17077876
|
||||
|
|
@ -1,129 +1,15 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="590" viewBox="0 0 850 590">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="380" viewBox="0 0 850 380">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="sync-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<linearGradient id="sync-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#06d6a0" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#06d6a0" stop-opacity="0.15"/>
|
||||
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="30" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#06d6a0" text-anchor="middle" font-weight="bold">Desktop Auto-Sync</text>
|
||||
<text x="425" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Report changes appear in Desktop automatically. Your modeling work is preserved.</text>
|
||||
|
||||
|
|
@ -229,6 +115,4 @@
|
|||
<text x="490" y="324" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3">Desktop reopens automatically</text>
|
||||
<text x="470" y="346" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#06d6a0">✓</text>
|
||||
<text x="490" y="346" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3">All work preserved -- both layers</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 8.6 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Undo Anything. Instantly.</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Snapshot your model before risky changes, restore when things go wrong</text>
|
||||
|
||||
|
|
@ -169,6 +54,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="510" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Never lose work again. Snapshot before, restore after.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 4.4 KiB |
|
|
@ -1,123 +1,9 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="555" viewBox="0 0 850 555">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="345" viewBox="0 0 850 345" font-family="'Segoe UI', system-ui, sans-serif">
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
<!-- Background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="36" font-size="19" fill="#F2C811" font-weight="bold" text-anchor="middle">Why pbi-cli?</text>
|
||||
|
||||
<!-- LEFT panel -->
|
||||
|
|
@ -222,5 +108,4 @@
|
|||
<circle cx="425" cy="215" r="28" fill="#0d1117" stroke="#F2C811" stroke-width="2"/>
|
||||
<text x="425" y="221" font-size="15" fill="#F2C811" font-weight="bold" text-anchor="middle">VS</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 6.4 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="480" viewBox="0 0 850 480">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">One Prompt, Five Measures</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Stop clicking through the GUI for every single measure</text>
|
||||
|
||||
|
|
@ -182,6 +67,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="470" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Batch operations that would take hours in the GUI, done in seconds</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 5.3 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#06d6a0" text-anchor="middle" font-weight="bold">Just Ask Claude -- Report Layer</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Describe the report you want, Claude builds it</text>
|
||||
|
||||
|
|
@ -171,6 +56,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="508" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">No drag-and-drop. No manual binding. Just describe what you want on the page.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 4.6 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Just Ask Claude</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Plain English in, Power BI changes out</text>
|
||||
|
||||
|
|
@ -173,6 +58,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="508" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">No DAX syntax to memorize. No GUI menus to navigate. Just describe what you need.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 4.6 KiB |
|
|
@ -1,347 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="590" viewBox="0 0 850 590">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- 1. BACKGROUND -->
|
||||
<!-- 2. TERMINAL CHROME BAR -->
|
||||
<rect x="0" y="0" width="850" height="46" rx="8" fill="#161b22"/>
|
||||
<rect x="0" y="30" width="850" height="16" fill="#161b22"/>
|
||||
<circle cx="28" cy="23" r="6" fill="#ff5f57"/>
|
||||
<circle cx="48" cy="23" r="6" fill="#febc2e"/>
|
||||
<circle cx="68" cy="23" r="6" fill="#28c840"/>
|
||||
<text x="425" y="28" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681" text-anchor="middle">pbi-cli -- command showcase</text>
|
||||
|
||||
<!-- 3. VERTICAL COLUMN DIVIDER -->
|
||||
<line x1="425" y1="46" x2="425" y2="295" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- 4. COLUMN HEADERS -->
|
||||
<rect x="35" y="52" width="100" height="21" rx="10" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="85" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" font-weight="bold">MODELING</text>
|
||||
<rect x="440" y="52" width="105" height="21" rx="10" fill="#06d6a0" fill-opacity="0.12" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="492" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" font-weight="bold">REPORTING</text>
|
||||
|
||||
<!-- 5. ROW BACKGROUND HIGHLIGHTS -->
|
||||
<rect x="0" y="84" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
|
||||
<rect x="425" y="84" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
|
||||
<rect x="0" y="154" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
|
||||
<rect x="425" y="154" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
|
||||
<rect x="0" y="224" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
|
||||
<rect x="425" y="224" width="425" height="33" fill="#58a6ff" fill-opacity="0.02"/>
|
||||
|
||||
<!-- ===== LEFT COLUMN COMMANDS ===== -->
|
||||
|
||||
<!-- Row 1 y=102: model export -->
|
||||
<text x="38" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="50" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="98" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> model export</text>
|
||||
|
||||
<!-- Row 2 y=137: dax run -->
|
||||
<text x="38" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="50" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="98" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> dax run</text>
|
||||
|
||||
<!-- Row 3 y=172: dax add-measure -->
|
||||
<text x="38" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="50" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="98" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> dax add-measure</text>
|
||||
|
||||
<!-- Row 4 y=207: table list -->
|
||||
<text x="38" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="50" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="98" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> table list</text>
|
||||
|
||||
<!-- Row 5 y=242: relationship list -->
|
||||
<text x="38" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="50" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="98" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> relationship list</text>
|
||||
|
||||
<!-- Row 6 y=277: model import -->
|
||||
<text x="38" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="50" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="98" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#a5d6ff"> model import</text>
|
||||
|
||||
<!-- ===== RIGHT COLUMN COMMANDS ===== -->
|
||||
|
||||
<!-- Row 1 y=102: report add-visual -->
|
||||
<text x="443" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="455" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="503" y="102" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report add-visual</text>
|
||||
|
||||
<!-- Row 2 y=137: report bind-data -->
|
||||
<text x="443" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="455" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="503" y="137" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report bind-data</text>
|
||||
|
||||
<!-- Row 3 y=172: report add-page -->
|
||||
<text x="443" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="455" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="503" y="172" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report add-page</text>
|
||||
|
||||
<!-- Row 4 y=207: report list-visuals -->
|
||||
<text x="443" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="455" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="503" y="207" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report list-visuals</text>
|
||||
|
||||
<!-- Row 5 y=242: report update-theme -->
|
||||
<text x="443" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="455" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="503" y="242" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report update-theme</text>
|
||||
|
||||
<!-- Row 6 y=277: report export -->
|
||||
<text x="443" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#6e7681">$</text>
|
||||
<text x="455" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#F2C811">pbi-cli</text>
|
||||
<text x="503" y="277" font-family="'Courier New', Courier, monospace" font-size="12" fill="#7ee787"> report export</text>
|
||||
|
||||
<!-- ===== LEFT COLUMN VISUAL ICONS (replacing text badges) ===== -->
|
||||
|
||||
<!-- Row 1: model export → file with up-arrow (TMDL export) -->
|
||||
<g transform="translate(373, 91)">
|
||||
<rect x="0" y="2" width="16" height="14" rx="1.5" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="1"/>
|
||||
<line x1="8" y1="11" x2="8" y2="5" stroke="#58a6ff" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<polygon points="8,3 5,7 11,7" fill="#58a6ff"/>
|
||||
<line x1="3" y1="13" x2="13" y2="13" stroke="#58a6ff" stroke-width="1" opacity="0.5"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 2: dax run → play triangle (DAX execute) -->
|
||||
<g transform="translate(375, 126)">
|
||||
<circle cx="8" cy="8" r="8" fill="#F2C811" fill-opacity="0.12" stroke="#F2C811" stroke-width="1"/>
|
||||
<polygon points="5,4 5,12 13,8" fill="#F2C811" fill-opacity="0.9"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 3: dax add-measure → sparkle / AI star -->
|
||||
<g transform="translate(377, 161)">
|
||||
<path d="M8,0 L9.5,6 L16,8 L9.5,10 L8,16 L6.5,10 L0,8 L6.5,6 Z" fill="#c084fc" fill-opacity="0.85"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 4: table list → rows/grid icon -->
|
||||
<g transform="translate(373, 196)">
|
||||
<rect x="0" y="0" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.8"/>
|
||||
<rect x="0" y="5" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.6"/>
|
||||
<rect x="0" y="10" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.4"/>
|
||||
<rect x="0" y="15" width="16" height="3" rx="1" fill="#8b949e" fill-opacity="0.25"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 5: relationship list → two nodes with edge -->
|
||||
<g transform="translate(373, 231)">
|
||||
<circle cx="4" cy="8" r="4" fill="none" stroke="#8b949e" stroke-width="1.5"/>
|
||||
<circle cx="16" cy="4" r="4" fill="none" stroke="#8b949e" stroke-width="1.5"/>
|
||||
<line x1="4" y1="4" x2="16" y2="4" stroke="#8b949e" stroke-width="1.5"/>
|
||||
<circle cx="4" cy="4" r="1.5" fill="#8b949e"/>
|
||||
<circle cx="16" cy="4" r="1.5" fill="#8b949e"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 6: model import → file with down-arrow -->
|
||||
<g transform="translate(373, 266)">
|
||||
<rect x="0" y="2" width="16" height="14" rx="1.5" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="1"/>
|
||||
<line x1="8" y1="5" x2="8" y2="11" stroke="#58a6ff" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<polygon points="8,14 5,9 11,9" fill="#58a6ff"/>
|
||||
<line x1="3" y1="13" x2="13" y2="13" stroke="#58a6ff" stroke-width="1" opacity="0.5"/>
|
||||
</g>
|
||||
|
||||
<!-- ===== RIGHT COLUMN VISUAL ICONS (replacing text badges) ===== -->
|
||||
|
||||
<!-- Row 1: report add-visual → small bar chart in frame -->
|
||||
<g transform="translate(796, 91)">
|
||||
<rect x="0" y="0" width="20" height="16" rx="2" fill="none" stroke="#06d6a0" stroke-width="1"/>
|
||||
<rect x="2" y="8" width="3" height="6" rx="0.5" fill="#06d6a0" fill-opacity="0.6"/>
|
||||
<rect x="7" y="5" width="3" height="9" rx="0.5" fill="#06d6a0" fill-opacity="0.75"/>
|
||||
<rect x="12" y="2" width="3" height="12" rx="0.5" fill="#06d6a0" fill-opacity="0.9"/>
|
||||
<rect x="17" y="4" width="2" height="10" rx="0.5" fill="#06d6a0" fill-opacity="0.8"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 2: report bind-data → link chain -->
|
||||
<g transform="translate(796, 126)">
|
||||
<circle cx="5" cy="8" r="5" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<circle cx="15" cy="8" r="5" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<rect x="7" y="5" width="6" height="6" rx="2" fill="#06d6a0" fill-opacity="0.35" stroke="#06d6a0" stroke-width="1"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 3: report add-page → page with plus -->
|
||||
<g transform="translate(796, 161)">
|
||||
<rect x="0" y="0" width="14" height="18" rx="2" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<line x1="14" y1="8" x2="20" y2="8" stroke="#06d6a0" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<line x1="17" y1="5" x2="17" y2="11" stroke="#06d6a0" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<line x1="3" y1="6" x2="11" y2="6" stroke="#06d6a0" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="3" y1="9" x2="11" y2="9" stroke="#06d6a0" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="3" y1="12" x2="9" y2="12" stroke="#06d6a0" stroke-width="1" opacity="0.4"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 4: report list-visuals → eye / view icon -->
|
||||
<g transform="translate(796, 196)">
|
||||
<path d="M0,8 C3,2 17,2 20,8 C17,14 3,14 0,8 Z" fill="none" stroke="#8b949e" stroke-width="1.5"/>
|
||||
<circle cx="10" cy="8" r="3.5" fill="none" stroke="#8b949e" stroke-width="1.5"/>
|
||||
<circle cx="10" cy="8" r="1.5" fill="#8b949e" fill-opacity="0.7"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 5: report update-theme → palette circle with color dots -->
|
||||
<g transform="translate(796, 230)">
|
||||
<circle cx="10" cy="10" r="9" fill="none" stroke="#FF9500" stroke-width="1.5"/>
|
||||
<circle cx="10" cy="12" r="3" fill="#0d1117" stroke="#FF9500" stroke-width="1"/>
|
||||
<circle cx="5" cy="5" r="2.5" fill="#06d6a0" fill-opacity="0.9"/>
|
||||
<circle cx="10" cy="2" r="2.5" fill="#F2C811" fill-opacity="0.9"/>
|
||||
<circle cx="15" cy="5" r="2.5" fill="#58a6ff" fill-opacity="0.9"/>
|
||||
<circle cx="17" cy="11" r="2.5" fill="#c084fc" fill-opacity="0.9"/>
|
||||
</g>
|
||||
|
||||
<!-- Row 6: report export → box with up-arrow -->
|
||||
<g transform="translate(796, 266)">
|
||||
<rect x="0" y="6" width="20" height="12" rx="2" fill="none" stroke="#58a6ff" stroke-width="1.5"/>
|
||||
<line x1="10" y1="12" x2="10" y2="2" stroke="#58a6ff" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<polygon points="10,0 6,5 14,5" fill="#58a6ff"/>
|
||||
<line x1="4" y1="10" x2="4" y2="18" stroke="#58a6ff" stroke-width="1" opacity="0.3"/>
|
||||
<line x1="16" y1="10" x2="16" y2="18" stroke="#58a6ff" stroke-width="1" opacity="0.3"/>
|
||||
</g>
|
||||
|
||||
<!-- 7. HORIZONTAL SEPARATOR ABOVE FOOTER -->
|
||||
<line x1="0" y1="295" x2="850" y2="295" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- 8. FOOTER BAR -->
|
||||
<rect x="0" y="295" width="850" height="85" fill="#161b22"/>
|
||||
|
||||
<!-- Footer stat badges with visual icons -->
|
||||
|
||||
<!-- Badge 1: 30+ commands -->
|
||||
<rect x="153" y="318" width="120" height="36" rx="14" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<!-- Terminal icon -->
|
||||
<g transform="translate(163, 327)">
|
||||
<rect x="0" y="0" width="16" height="12" rx="2" fill="#58a6ff" fill-opacity="0.15" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="2" y="9" font-family="'Courier New', monospace" font-size="7" fill="#58a6ff">$_</text>
|
||||
</g>
|
||||
<text x="225" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#58a6ff" text-anchor="middle" font-weight="bold">30+ commands</text>
|
||||
|
||||
<!-- Badge 2: Both layers with icon -->
|
||||
<rect x="365" y="318" width="120" height="36" rx="14" fill="#F2C811" fill-opacity="0.1" stroke="#F2C811" stroke-width="1"/>
|
||||
<!-- Stack icon -->
|
||||
<g transform="translate(375, 327)">
|
||||
<rect x="0" y="0" width="16" height="4" rx="1" fill="#58a6ff" fill-opacity="0.7"/>
|
||||
<rect x="0" y="6" width="16" height="4" rx="1" fill="#06d6a0" fill-opacity="0.7"/>
|
||||
</g>
|
||||
<text x="425" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="bold">Both layers</text>
|
||||
|
||||
<!-- Badge 3: AI-native with sparkle icon -->
|
||||
<rect x="577" y="318" width="120" height="36" rx="14" fill="#c084fc" fill-opacity="0.1" stroke="#c084fc" stroke-width="1"/>
|
||||
<!-- Sparkle icon -->
|
||||
<g transform="translate(584, 326)">
|
||||
<path d="M6,0 L7.2,4.8 L12,6 L7.2,7.2 L6,12 L4.8,7.2 L0,6 L4.8,4.8 Z" fill="#c084fc" fill-opacity="0.85"/>
|
||||
</g>
|
||||
<text x="637" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c084fc" text-anchor="middle" font-weight="bold">AI-native</text>
|
||||
|
||||
<!-- Footer subtext -->
|
||||
<text x="425" y="368" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#6e7681" text-anchor="middle">pipx install pbi-cli-tool</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 26 KiB |
|
|
@ -1,186 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<style>
|
||||
@keyframes blink {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0; }
|
||||
}
|
||||
.cursor { animation: blink 1s step-end infinite; }
|
||||
</style>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="52" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="32" font-weight="bold" fill="#F2C811">Start Vibe Modeling</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="425" y="80" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="16" fill="#8b949e">Two commands to transform your Power BI workflow</text>
|
||||
|
||||
<!-- Command 1 background -->
|
||||
<rect x="75" y="105" width="700" height="50" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Command 1 text -->
|
||||
<text y="137" font-family="'Cascadia Code', 'Fira Code', 'Consolas', monospace" font-size="18">
|
||||
<tspan x="100" fill="#06d6a0">$</tspan>
|
||||
<tspan fill="#c9d1d9"> pipx install pbi-cli-tool</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Blinking cursor -->
|
||||
<rect class="cursor" x="407" y="119" width="2" height="20" fill="#F2C811"/>
|
||||
|
||||
<!-- Command 2 background -->
|
||||
<rect x="75" y="175" width="700" height="70" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Command 2 line 1 -->
|
||||
<text y="205" font-family="'Cascadia Code', 'Fira Code', 'Consolas', monospace" font-size="18">
|
||||
<tspan x="100" fill="#06d6a0">$</tspan>
|
||||
<tspan fill="#c9d1d9"> pbi connect</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Command 2 line 2: checkmark + status -->
|
||||
<text y="230" font-family="'Cascadia Code', 'Fira Code', 'Consolas', monospace" font-size="16">
|
||||
<tspan x="110" fill="#06d6a0">✔ Connected! 7 skills installed.</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Info card background -->
|
||||
<rect x="75" y="270" width="700" height="120" rx="8" ry="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3" stroke-width="1"/>
|
||||
|
||||
<!-- LinkedIn row -->
|
||||
<g transform="translate(425, 300)">
|
||||
<!-- LinkedIn "in" badge -->
|
||||
<rect x="-62" y="-14" width="22" height="18" rx="3" ry="3" fill="#0a66c2"/>
|
||||
<text x="-51" y="1" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="13" font-weight="bold" fill="#ffffff">in</text>
|
||||
<!-- LinkedIn handle -->
|
||||
<text x="-30" y="1" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#c9d1d9"> @minasaad1</text>
|
||||
</g>
|
||||
|
||||
<!-- Website -->
|
||||
<text x="425" y="340" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="20" font-weight="bold" fill="#F2C811">mina-saad.com</text>
|
||||
|
||||
<!-- GitHub -->
|
||||
<text x="425" y="372" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#58a6ff">github.com/MinaSaad1/pbi-cli</text>
|
||||
|
||||
<!-- Bottom section -->
|
||||
<text x="425" y="422" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="16" font-weight="600" fill="#c9d1d9">Open source. MIT License. Star it on GitHub.</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="456" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#8b949e">Like this? Share it with your Power BI team.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="520" viewBox="0 0 850 520">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Debug DAX Like Never Before</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Describe the problem in plain English, Claude finds and fixes it</text>
|
||||
|
||||
|
|
@ -175,6 +60,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="510" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Stop guessing why your DAX is broken. Let Claude trace the problem.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 5.1 KiB |
|
|
@ -1,202 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="790" viewBox="0 0 850 790">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title Section -->
|
||||
<text x="425" y="38" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#58a6ff" text-anchor="middle">DAX Skill</text>
|
||||
<text x="425" y="62" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e" text-anchor="middle">Ask questions about your data in plain English</text>
|
||||
|
||||
<!-- Chat Container -->
|
||||
<rect x="40" y="80" width="770" height="410" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Header Bar -->
|
||||
<rect x="40" y="80" width="770" height="36" rx="8" ry="8" fill="#161b22"/>
|
||||
<rect x="40" y="108" width="770" height="8" fill="#161b22"/>
|
||||
<line x1="40" y1="116" x2="810" y2="116" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Traffic Lights -->
|
||||
<circle cx="64" cy="98" r="6" fill="#ff5f57"/>
|
||||
<circle cx="84" cy="98" r="6" fill="#febc2e"/>
|
||||
<circle cx="104" cy="98" r="6" fill="#28c840"/>
|
||||
|
||||
<!-- Claude Code Label -->
|
||||
<text x="130" y="103" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#d97757">Claude Code</text>
|
||||
|
||||
<!-- User Message Bubble -->
|
||||
<rect x="60" y="130" width="450" height="42" rx="12" ry="12" fill="#1a3a5c" stroke="#264d73" stroke-width="1"/>
|
||||
<text x="80" y="156" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#c9d1d9">What are the top 5 products by revenue?</text>
|
||||
|
||||
<!-- Claude Response 1: Querying -->
|
||||
<rect x="60" y="186" width="730" height="80" rx="12" ry="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
|
||||
<text x="80" y="210" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e">Querying your model...</text>
|
||||
|
||||
<!-- Code Block -->
|
||||
<rect x="76" y="220" width="698" height="34" rx="6" ry="6" fill="#0d1117"/>
|
||||
<text x="92" y="242" font-family="Cascadia Code, Consolas, monospace" font-size="13" fill="#F2C811">EVALUATE TOPN(5, Products, [Revenue], DESC)</text>
|
||||
|
||||
<!-- Claude Response 2: Results Table -->
|
||||
<rect x="60" y="280" width="730" height="198" rx="12" ry="12" fill="#1c1c1c" stroke="#30363d" stroke-width="1"/>
|
||||
<text x="80" y="306" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#c9d1d9">Here are your results:</text>
|
||||
|
||||
<!-- Table Headers -->
|
||||
<text x="100" y="334" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#F2C811">Product</text>
|
||||
<text x="500" y="334" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#F2C811">Revenue</text>
|
||||
|
||||
<!-- Separator Line -->
|
||||
<line x1="80" y1="342" x2="770" y2="342" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Row 1 -->
|
||||
<text x="100" y="364" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Adventure Touring Bike</text>
|
||||
<text x="500" y="364" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$423,000</text>
|
||||
|
||||
<!-- Row 2 -->
|
||||
<text x="100" y="388" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Mountain Pro Series</text>
|
||||
<text x="500" y="388" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$312,500</text>
|
||||
|
||||
<!-- Row 3 -->
|
||||
<text x="100" y="412" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Road Elite Carbon</text>
|
||||
<text x="500" y="412" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$287,200</text>
|
||||
|
||||
<!-- Row 4 -->
|
||||
<text x="100" y="436" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Urban Commuter X1</text>
|
||||
<text x="500" y="436" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$198,400</text>
|
||||
|
||||
<!-- Row 5 -->
|
||||
<text x="100" y="460" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c9d1d9">Trail Explorer 500</text>
|
||||
<text x="500" y="460" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#06d6a0">$156,800</text>
|
||||
|
||||
<!-- Capability Pills -->
|
||||
<rect x="155" y="504" width="150" height="32" rx="16" ry="16" fill="none" stroke="#58a6ff" stroke-width="1.5"/>
|
||||
<text x="230" y="525" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle">Execute Queries</text>
|
||||
|
||||
<rect x="350" y="504" width="150" height="32" rx="16" ry="16" fill="none" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text x="425" y="525" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle">Validate Syntax</text>
|
||||
|
||||
<rect x="545" y="504" width="150" height="32" rx="16" ry="16" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<text x="620" y="525" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle">Format Results</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="562" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e" text-anchor="middle">From question to answer in seconds. No DAX syntax required.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 17 KiB |
|
|
@ -1,267 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="790" viewBox="0 0 850 790">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<marker id="arrowDown" markerWidth="8" markerHeight="8" refX="4" refY="4" orient="auto">
|
||||
<path d="M1,1 L4,7 L7,1" fill="none" stroke="#7b61ff" stroke-width="1.5"/>
|
||||
</marker>
|
||||
<marker id="arrowRollback" markerWidth="8" markerHeight="8" refX="4" refY="4" orient="auto">
|
||||
<path d="M1,1 L4,7 L7,1" fill="none" stroke="#ff6b6b" stroke-width="1.5"/>
|
||||
</marker>
|
||||
<filter id="glow">
|
||||
<feGaussianBlur stdDeviation="2" result="blur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="blur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title Section -->
|
||||
<text x="425" y="40" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#F2C811" text-anchor="middle">Deploy + Secure</text>
|
||||
<text x="425" y="65" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e" text-anchor="middle">Snapshot, restore, and lock down your model</text>
|
||||
|
||||
<!-- =============================== -->
|
||||
<!-- LEFT PANEL - Deployment Skill -->
|
||||
<!-- =============================== -->
|
||||
<rect x="25" y="85" width="390" height="390" rx="8" fill="#161b22" stroke="#7b61ff" stroke-width="2"/>
|
||||
|
||||
<!-- Panel Header -->
|
||||
<text x="220" y="115" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#7b61ff" text-anchor="middle">Deployment Skill</text>
|
||||
<line x1="45" y1="125" x2="395" y2="125" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- TMDL label -->
|
||||
<text x="55" y="160" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">TMDL</text>
|
||||
|
||||
<!-- Version History Flow -->
|
||||
<!-- v1 Baseline -->
|
||||
<rect x="120" y="145" width="200" height="36" rx="6" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
|
||||
<text x="220" y="168" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9" text-anchor="middle">v1 Baseline</text>
|
||||
|
||||
<!-- Arrow v1 -> v2 -->
|
||||
<line x1="220" y1="181" x2="220" y2="205" stroke="#7b61ff" stroke-width="2" marker-end="url(#arrowDown)"/>
|
||||
|
||||
<!-- v2 + Measures -->
|
||||
<rect x="120" y="210" width="200" height="36" rx="6" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
|
||||
<text x="220" y="233" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9" text-anchor="middle">v2 + Measures</text>
|
||||
|
||||
<!-- Arrow v2 -> v3 -->
|
||||
<line x1="220" y1="246" x2="220" y2="270" stroke="#7b61ff" stroke-width="2" marker-end="url(#arrowDown)"/>
|
||||
|
||||
<!-- v3 + RLS -->
|
||||
<rect x="120" y="275" width="200" height="36" rx="6" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
|
||||
<text x="220" y="298" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9" text-anchor="middle">v3 + RLS</text>
|
||||
|
||||
<!-- Rollback curved arrow from v3 back to v1 -->
|
||||
<path d="M120,293 Q60,293 60,228 Q60,163 120,163" fill="none" stroke="#ff6b6b" stroke-width="2" stroke-dasharray="5,3" marker-end="url(#arrowRollback)"/>
|
||||
<text x="42" y="232" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#ff6b6b" text-anchor="middle" transform="rotate(-90, 42, 232)">Rollback</text>
|
||||
|
||||
<!-- Commands -->
|
||||
<text x="220" y="345" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi database export-tmdl</text>
|
||||
<text x="220" y="365" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi database import-tmdl</text>
|
||||
|
||||
<!-- Decorative icons for deployment -->
|
||||
<g transform="translate(340, 145)" opacity="0.4">
|
||||
<rect x="0" y="0" width="28" height="28" rx="4" fill="none" stroke="#7b61ff" stroke-width="1"/>
|
||||
<path d="M8,20 L14,8 L20,20 Z" fill="none" stroke="#7b61ff" stroke-width="1.2"/>
|
||||
</g>
|
||||
|
||||
<!-- =============================== -->
|
||||
<!-- RIGHT PANEL - Security Skill -->
|
||||
<!-- =============================== -->
|
||||
<rect x="435" y="85" width="390" height="390" rx="8" fill="#161b22" stroke="#06d6a0" stroke-width="2"/>
|
||||
|
||||
<!-- Panel Header -->
|
||||
<text x="630" y="115" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#06d6a0" text-anchor="middle">Security Skill</text>
|
||||
<line x1="455" y1="125" x2="805" y2="125" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- RLS User Icons -->
|
||||
<!-- East User -->
|
||||
<circle cx="510" cy="170" r="22" fill="#1a3a5c" stroke="#58a6ff" stroke-width="1.5"/>
|
||||
<text x="510" y="176" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#58a6ff" text-anchor="middle">E</text>
|
||||
<text x="510" y="205" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">East</text>
|
||||
|
||||
<!-- West User -->
|
||||
<circle cx="630" cy="170" r="22" fill="#1a3a5c" stroke="#58a6ff" stroke-width="1.5"/>
|
||||
<text x="630" y="176" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#58a6ff" text-anchor="middle">W</text>
|
||||
<text x="630" y="205" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">West</text>
|
||||
|
||||
<!-- Admin User -->
|
||||
<circle cx="750" cy="170" r="22" fill="#1a3a5c" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<text x="750" y="176" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#06d6a0" text-anchor="middle">A</text>
|
||||
<text x="750" y="205" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Admin</text>
|
||||
|
||||
<!-- Arrows from users to Filter -->
|
||||
<line x1="510" y1="192" x2="555" y2="248" stroke="#30363d" stroke-width="1.5"/>
|
||||
<line x1="630" y1="192" x2="630" y2="248" stroke="#30363d" stroke-width="1.5"/>
|
||||
<line x1="750" y1="192" x2="705" y2="248" stroke="#30363d" stroke-width="1.5"/>
|
||||
|
||||
<!-- Filter Box -->
|
||||
<rect x="555" y="248" width="150" height="34" rx="6" fill="#0d1117" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<text x="630" y="270" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0" text-anchor="middle">Filter</text>
|
||||
|
||||
<!-- Data rows showing different visibility -->
|
||||
<!-- East sees -->
|
||||
<rect x="470" y="300" width="100" height="26" rx="4" fill="#0d1117" stroke="#30363d" stroke-width="1"/>
|
||||
<text x="520" y="317" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle">East data</text>
|
||||
|
||||
<!-- West sees -->
|
||||
<rect x="580" y="300" width="100" height="26" rx="4" fill="#0d1117" stroke="#30363d" stroke-width="1"/>
|
||||
<text x="630" y="317" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle">West data</text>
|
||||
|
||||
<!-- Admin sees all -->
|
||||
<rect x="690" y="300" width="100" height="26" rx="4" fill="#0d1117" stroke="#30363d" stroke-width="1"/>
|
||||
<text x="740" y="317" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle">All data</text>
|
||||
|
||||
<!-- Filter expression -->
|
||||
<text x="630" y="355" font-family="Consolas, Courier New, monospace" font-size="12" fill="#d97757" text-anchor="middle">[Region] = "East"</text>
|
||||
|
||||
<!-- Commands -->
|
||||
<text x="630" y="400" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi security-role create</text>
|
||||
<text x="630" y="420" font-family="Consolas, Courier New, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi security-role add-filter</text>
|
||||
|
||||
<!-- Decorative lock icon for security -->
|
||||
<g transform="translate(770, 380)" opacity="0.35">
|
||||
<rect x="2" y="10" width="20" height="14" rx="3" fill="none" stroke="#06d6a0" stroke-width="1.2"/>
|
||||
<path d="M7,10 V6 Q7,1 12,1 Q17,1 17,6 V10" fill="none" stroke="#06d6a0" stroke-width="1.2"/>
|
||||
</g>
|
||||
|
||||
<!-- =============================== -->
|
||||
<!-- CAPABILITY PILLS -->
|
||||
<!-- =============================== -->
|
||||
<g transform="translate(0, 495)">
|
||||
<!-- Pill 1: TMDL Export/Import -->
|
||||
<rect x="145" y="0" width="170" height="34" rx="17" fill="none" stroke="#7b61ff" stroke-width="1.5"/>
|
||||
<text x="230" y="22" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#7b61ff" text-anchor="middle">TMDL Export/Import</text>
|
||||
|
||||
<!-- Pill 2: Transaction Safety -->
|
||||
<rect x="340" y="0" width="170" height="34" rx="17" fill="none" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text x="425" y="22" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle">Transaction Safety</text>
|
||||
|
||||
<!-- Pill 3: Role-Based Filters -->
|
||||
<rect x="535" y="0" width="170" height="34" rx="17" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<text x="620" y="22" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle">Role-Based Filters</text>
|
||||
</g>
|
||||
|
||||
<!-- =============================== -->
|
||||
<!-- FOOTER -->
|
||||
<!-- =============================== -->
|
||||
<text x="425" y="560" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e" text-anchor="middle">Version control your models. Secure them with one prompt.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 21 KiB |
|
|
@ -1,226 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="790" viewBox="0 0 850 790">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
|
||||
.title { font-family: 'Inter', sans-serif; font-weight: 700; }
|
||||
.subtitle { font-family: 'Inter', sans-serif; font-weight: 400; }
|
||||
.body { font-family: 'Inter', sans-serif; font-weight: 400; }
|
||||
.bold { font-family: 'Inter', sans-serif; font-weight: 600; }
|
||||
.mono { font-family: 'JetBrains Mono', monospace; font-weight: 400; }
|
||||
</style>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title Section -->
|
||||
<text x="425" y="42" text-anchor="middle" class="title" font-size="28" fill="#F2C811">Docs + Diagnostics</text>
|
||||
<text x="425" y="68" text-anchor="middle" class="subtitle" font-size="16" fill="#8b949e">Auto-document everything. Find bottlenecks instantly.</text>
|
||||
|
||||
<!-- Left Panel - Docs Skill -->
|
||||
<rect x="25" y="90" width="390" height="380" fill="#161b22" stroke="#ff6b6b" stroke-width="2" rx="8"/>
|
||||
<text x="220" y="122" text-anchor="middle" class="title" font-size="18" fill="#ff6b6b">Docs Skill</text>
|
||||
<line x1="45" y1="134" x2="395" y2="134" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Data Dictionary Table Header -->
|
||||
<text x="70" y="162" class="bold" font-size="13" fill="#F2C811">Table</text>
|
||||
<text x="175" y="162" class="bold" font-size="13" fill="#F2C811">Column</text>
|
||||
<text x="310" y="162" class="bold" font-size="13" fill="#F2C811">Type</text>
|
||||
<line x1="45" y1="172" x2="395" y2="172" stroke="#30363d" stroke-width="1" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- Table Rows -->
|
||||
<text x="70" y="194" class="body" font-size="12" fill="#c9d1d9">Sales</text>
|
||||
<text x="175" y="194" class="body" font-size="12" fill="#c9d1d9">Amount</text>
|
||||
<text x="310" y="194" class="body" font-size="12" fill="#c9d1d9">Decimal</text>
|
||||
|
||||
<text x="70" y="216" class="body" font-size="12" fill="#c9d1d9">Sales</text>
|
||||
<text x="175" y="216" class="body" font-size="12" fill="#c9d1d9">OrderDate</text>
|
||||
<text x="310" y="216" class="body" font-size="12" fill="#c9d1d9">DateTime</text>
|
||||
|
||||
<text x="70" y="238" class="body" font-size="12" fill="#c9d1d9">Product</text>
|
||||
<text x="175" y="238" class="body" font-size="12" fill="#c9d1d9">Name</text>
|
||||
<text x="310" y="238" class="body" font-size="12" fill="#c9d1d9">String</text>
|
||||
|
||||
<text x="70" y="260" class="body" font-size="12" fill="#c9d1d9">Product</text>
|
||||
<text x="175" y="260" class="body" font-size="12" fill="#c9d1d9">Category</text>
|
||||
<text x="310" y="260" class="body" font-size="12" fill="#c9d1d9">String</text>
|
||||
|
||||
<text x="70" y="282" class="body" font-size="12" fill="#c9d1d9">Calendar</text>
|
||||
<text x="175" y="282" class="body" font-size="12" fill="#c9d1d9">Date</text>
|
||||
<text x="310" y="282" class="body" font-size="12" fill="#c9d1d9">DateTime</text>
|
||||
|
||||
<text x="70" y="310" class="body" font-size="12" fill="#8b949e">... 82 more columns</text>
|
||||
|
||||
<line x1="45" y1="326" x2="395" y2="326" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Command and Result -->
|
||||
<text x="220" y="352" text-anchor="middle" class="mono" font-size="12" fill="#58a6ff">pbi model document</text>
|
||||
<text x="220" y="376" text-anchor="middle" class="body" font-size="12" fill="#06d6a0">Generated complete data dictionary</text>
|
||||
|
||||
<!-- Right Panel - Diagnostics Skill -->
|
||||
<rect x="435" y="90" width="390" height="380" fill="#161b22" stroke="#ffd166" stroke-width="2" rx="8"/>
|
||||
<text x="630" y="122" text-anchor="middle" class="title" font-size="18" fill="#ffd166">Diagnostics Skill</text>
|
||||
<line x1="455" y1="134" x2="805" y2="134" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Health Check Results -->
|
||||
<!-- Check mark - Relationships OK -->
|
||||
<text x="470" y="164" class="body" font-size="14" fill="#06d6a0">✓</text>
|
||||
<text x="492" y="164" class="body" font-size="14" fill="#06d6a0">Relationships OK</text>
|
||||
|
||||
<!-- Check mark - No Circular Deps -->
|
||||
<text x="470" y="190" class="body" font-size="14" fill="#06d6a0">✓</text>
|
||||
<text x="492" y="190" class="body" font-size="14" fill="#06d6a0">No Circular Deps</text>
|
||||
|
||||
<!-- Warning - 3 Unused Measures -->
|
||||
<text x="470" y="216" class="body" font-size="14" fill="#febc2e">⚠</text>
|
||||
<text x="492" y="216" class="body" font-size="14" fill="#febc2e">3 Unused Measures</text>
|
||||
|
||||
<!-- Error - Missing Date Table -->
|
||||
<text x="470" y="242" class="body" font-size="14" fill="#ff6b6b">✗</text>
|
||||
<text x="492" y="242" class="body" font-size="14" fill="#ff6b6b">Missing Date Table</text>
|
||||
|
||||
<line x1="455" y1="260" x2="805" y2="260" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Query Trace Section -->
|
||||
<text x="470" y="286" class="bold" font-size="14" fill="#ffd166">Query Trace</text>
|
||||
<text x="470" y="310" class="mono" font-size="11" fill="#8b949e">SELECT ... FROM Sales</text>
|
||||
<text x="470" y="334" class="body" font-size="12" fill="#ff6b6b">Duration: 2.4s</text>
|
||||
<text x="470" y="356" class="body" font-size="12" fill="#06d6a0">Recommendation: Add index</text>
|
||||
|
||||
<line x1="455" y1="372" x2="805" y2="372" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Command -->
|
||||
<text x="630" y="398" text-anchor="middle" class="mono" font-size="12" fill="#58a6ff">pbi trace start</text>
|
||||
|
||||
<!-- Capability Pills -->
|
||||
<!-- Data Dictionary pill -->
|
||||
<rect x="175" y="490" width="140" height="32" rx="16" fill="none" stroke="#ff6b6b" stroke-width="1.5"/>
|
||||
<text x="245" y="511" text-anchor="middle" class="bold" font-size="14" fill="#ff6b6b">Data Dictionary</text>
|
||||
|
||||
<!-- Query Tracing pill -->
|
||||
<rect x="355" y="490" width="140" height="32" rx="16" fill="none" stroke="#ffd166" stroke-width="1.5"/>
|
||||
<text x="425" y="511" text-anchor="middle" class="bold" font-size="14" fill="#ffd166">Query Tracing</text>
|
||||
|
||||
<!-- Health Check pill -->
|
||||
<rect x="535" y="490" width="140" height="32" rx="16" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<text x="605" y="511" text-anchor="middle" class="bold" font-size="14" fill="#06d6a0">Health Check</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="555" text-anchor="middle" class="subtitle" font-size="15" fill="#8b949e">Know your model inside out. Fix problems before they reach production.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 18 KiB |
39
assets/downloads-chart.svg
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="340" viewBox="0 0 850 340">
|
||||
<defs>
|
||||
<linearGradient id="areaFill" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#58a6ff" stop-opacity="0.45"/>
|
||||
<stop offset="100%" stop-color="#58a6ff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="425" y="33" font-family="'Segoe UI', Arial, sans-serif" font-size="17" fill="#F2C811" text-anchor="middle" font-weight="bold">pbi-cli Downloads Over Time</text>
|
||||
<text x="425" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Cumulative installs from PyPI • mirrors excluded • source: pypistats.org</text>
|
||||
|
||||
<!-- Gridlines & y-labels -->
|
||||
<line x1="70" y1="280.0" x2="810" y2="280.0" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="239.6" x2="810" y2="239.6" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="199.2" x2="810" y2="199.2" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="158.8" x2="810" y2="158.8" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="118.4" x2="810" y2="118.4" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/><line x1="70" y1="78.0" x2="810" y2="78.0" stroke="#21262d" stroke-width="1" stroke-dasharray="2,3"/>
|
||||
<text x="62" y="284.0" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">0</text><text x="62" y="243.6" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">1,000</text><text x="62" y="203.2" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">2,000</text><text x="62" y="162.8" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">3,000</text><text x="62" y="122.4" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">4,000</text><text x="62" y="82.0" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">5,000</text>
|
||||
|
||||
<!-- Area fill -->
|
||||
<path d="M 70.00,280 L 70.00,255.48 L 99.60,244.77 L 129.20,243.48 L 158.80,243.24 L 188.40,241.90 L 218.00,241.22 L 247.60,239.92 L 277.20,236.81 L 306.80,230.35 L 336.40,226.75 L 366.00,215.04 L 395.60,206.84 L 425.20,182.51 L 454.80,172.66 L 484.40,166.76 L 514.00,160.94 L 543.60,159.45 L 573.20,155.89 L 602.80,150.28 L 632.40,141.15 L 662.00,137.87 L 691.60,133.11 L 721.20,128.38 L 750.80,126.80 L 780.40,125.03 L 810.00,119.05 L 810.00,280 Z" fill="url(#areaFill)"/>
|
||||
|
||||
<!-- Line -->
|
||||
<path d="M 70.00,255.48 L 99.60,244.77 L 129.20,243.48 L 158.80,243.24 L 188.40,241.90 L 218.00,241.22 L 247.60,239.92 L 277.20,236.81 L 306.80,230.35 L 336.40,226.75 L 366.00,215.04 L 395.60,206.84 L 425.20,182.51 L 454.80,172.66 L 484.40,166.76 L 514.00,160.94 L 543.60,159.45 L 573.20,155.89 L 602.80,150.28 L 632.40,141.15 L 662.00,137.87 L 691.60,133.11 L 721.20,128.38 L 750.80,126.80 L 780.40,125.03 L 810.00,119.05" fill="none" stroke="#58a6ff" stroke-width="2.5" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
|
||||
<!-- Data points -->
|
||||
<circle cx="70.00" cy="255.48" r="2.5" fill="#58a6ff"/><circle cx="99.60" cy="244.77" r="2.5" fill="#58a6ff"/><circle cx="129.20" cy="243.48" r="2.5" fill="#58a6ff"/><circle cx="158.80" cy="243.24" r="2.5" fill="#58a6ff"/><circle cx="188.40" cy="241.90" r="2.5" fill="#58a6ff"/><circle cx="218.00" cy="241.22" r="2.5" fill="#58a6ff"/><circle cx="247.60" cy="239.92" r="2.5" fill="#58a6ff"/><circle cx="277.20" cy="236.81" r="2.5" fill="#58a6ff"/><circle cx="306.80" cy="230.35" r="2.5" fill="#58a6ff"/><circle cx="336.40" cy="226.75" r="2.5" fill="#58a6ff"/><circle cx="366.00" cy="215.04" r="2.5" fill="#58a6ff"/><circle cx="395.60" cy="206.84" r="2.5" fill="#58a6ff"/><circle cx="425.20" cy="182.51" r="2.5" fill="#58a6ff"/><circle cx="454.80" cy="172.66" r="2.5" fill="#58a6ff"/><circle cx="484.40" cy="166.76" r="2.5" fill="#58a6ff"/><circle cx="514.00" cy="160.94" r="2.5" fill="#58a6ff"/><circle cx="543.60" cy="159.45" r="2.5" fill="#58a6ff"/><circle cx="573.20" cy="155.89" r="2.5" fill="#58a6ff"/><circle cx="602.80" cy="150.28" r="2.5" fill="#58a6ff"/><circle cx="632.40" cy="141.15" r="2.5" fill="#58a6ff"/><circle cx="662.00" cy="137.87" r="2.5" fill="#58a6ff"/><circle cx="691.60" cy="133.11" r="2.5" fill="#58a6ff"/><circle cx="721.20" cy="128.38" r="2.5" fill="#58a6ff"/><circle cx="750.80" cy="126.80" r="2.5" fill="#58a6ff"/><circle cx="780.40" cy="125.03" r="2.5" fill="#58a6ff"/><circle cx="810.00" cy="119.05" r="4" fill="#F2C811"/>
|
||||
|
||||
<!-- Last-value callout -->
|
||||
<rect x="720.0" y="92.0" width="82" height="24" rx="4" fill="#0d1a2a" stroke="#F2C811" stroke-width="1"/>
|
||||
<text x="761.0" y="108.0" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="bold">3,984 total</text>
|
||||
|
||||
<!-- X-axis labels -->
|
||||
<text x="70.0" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Mar 26</text><text x="247.6" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 01</text><text x="454.8" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 08</text><text x="632.4" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 14</text><text x="810.0" y="298" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Apr 20</text>
|
||||
|
||||
<!-- Footer: date range -->
|
||||
<text x="70" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Mar 26, 2026 → Apr 20, 2026</text>
|
||||
<text x="810" y="328" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="end">26 days of data</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.9 KiB |
|
|
@ -1,220 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="650" viewBox="0 0 850 650">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="dl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#F2C811" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#F2C811" stop-opacity="0.15"/>
|
||||
<stop offset="100%" stop-color="#F2C811" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dl-b1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dl-b2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dl-b3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Badge -->
|
||||
<rect x="285" y="12" width="280" height="28" rx="14" fill="#161b22" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text x="425" y="31" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" text-anchor="middle" font-weight="bold">THE FIRST CLI FOR BOTH LAYERS</text>
|
||||
|
||||
<!-- Main title -->
|
||||
<text x="425" y="72" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#e6edf3" text-anchor="middle" font-weight="bold">One CLI. Two Layers. Complete Control.</text>
|
||||
<text x="425" y="96" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#8b949e" text-anchor="middle">pbi-cli connects Claude Code to both your semantic model and your report design</text>
|
||||
|
||||
<rect x="60" y="110" width="730" height="1" fill="url(#dl-glow)"/>
|
||||
|
||||
<!-- ============ LEFT: Semantic Model Layer ============ -->
|
||||
<rect x="55" y="125" width="340" height="270" rx="10" fill="#161b22" stroke="#58a6ff" stroke-width="1.5"/>
|
||||
|
||||
<!-- Layer header -->
|
||||
<text x="225" y="149" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#58a6ff" text-anchor="middle" font-weight="bold">Semantic Model Layer</text>
|
||||
<line x1="70" y1="160" x2="380" y2="160" stroke="#58a6ff" stroke-width="1" stroke-opacity="0.2"/>
|
||||
|
||||
<!-- Power BI logo centered -->
|
||||
<g transform="translate(197, 172)">
|
||||
<rect x="30" y="0" width="16" height="40" rx="3" fill="url(#dl-b1)"/>
|
||||
<rect x="15" y="12" width="16" height="28" rx="3" fill="url(#dl-b2)"/>
|
||||
<rect x="0" y="22" width="16" height="18" rx="3" fill="url(#dl-b3)"/>
|
||||
</g>
|
||||
|
||||
<text x="225" y="228" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">Live .NET Connection</text>
|
||||
<text x="225" y="246" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Direct TOM interop via pythonnet</text>
|
||||
|
||||
<!-- Commands -->
|
||||
<circle cx="75" cy="268" r="3" fill="#58a6ff" opacity="0.6"/>
|
||||
<text x="87" y="272" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi measure create</text>
|
||||
<circle cx="75" cy="288" r="3" fill="#58a6ff" opacity="0.6"/>
|
||||
<text x="87" y="292" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi dax execute</text>
|
||||
<circle cx="75" cy="308" r="3" fill="#58a6ff" opacity="0.6"/>
|
||||
<text x="87" y="312" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi database export-tmdl</text>
|
||||
<circle cx="75" cy="328" r="3" fill="#58a6ff" opacity="0.6"/>
|
||||
<text x="87" y="332" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi relationship create</text>
|
||||
|
||||
<!-- 7 skills badge -->
|
||||
<rect x="165" y="360" width="120" height="24" rx="12" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="225" y="376" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" font-weight="600">7 Claude Skills</text>
|
||||
|
||||
<!-- ============ RIGHT: Report Layer ============ -->
|
||||
<rect x="455" y="125" width="340" height="270" rx="10" fill="#161b22" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
|
||||
<!-- Layer header -->
|
||||
<text x="625" y="149" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#06d6a0" text-anchor="middle" font-weight="bold">Report Layer</text>
|
||||
<line x1="470" y1="160" x2="780" y2="160" stroke="#06d6a0" stroke-width="1" stroke-opacity="0.2"/>
|
||||
|
||||
<!-- NEW badge -->
|
||||
<rect x="730" y="135" width="50" height="20" rx="10" fill="#06d6a0"/>
|
||||
<text x="755" y="150" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#0d1117" text-anchor="middle" font-weight="bold">NEW</text>
|
||||
|
||||
<!-- Report icon centered -->
|
||||
<g transform="translate(608, 172)">
|
||||
<rect x="0" y="0" width="34" height="42" rx="4" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<line x1="5" y1="9" x2="29" y2="9" stroke="#06d6a0" stroke-width="0.8" stroke-opacity="0.3"/>
|
||||
<rect x="6" y="16" width="6" height="20" rx="1" fill="#06d6a0" opacity="0.4"/>
|
||||
<rect x="14" y="10" width="6" height="26" rx="1" fill="#06d6a0" opacity="0.6"/>
|
||||
<rect x="22" y="5" width="6" height="31" rx="1" fill="#06d6a0" opacity="0.8"/>
|
||||
</g>
|
||||
|
||||
<text x="625" y="228" font-family="'Segoe UI', Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle" font-weight="bold">PBIR File Operations</text>
|
||||
<text x="625" y="246" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Read/write JSON, no connection</text>
|
||||
|
||||
<!-- Commands -->
|
||||
<circle cx="465" cy="268" r="3" fill="#06d6a0" opacity="0.6"/>
|
||||
<text x="477" y="272" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi visual add --type bar</text>
|
||||
<circle cx="465" cy="288" r="3" fill="#06d6a0" opacity="0.6"/>
|
||||
<text x="477" y="292" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi visual bind --category</text>
|
||||
<circle cx="465" cy="308" r="3" fill="#06d6a0" opacity="0.6"/>
|
||||
<text x="477" y="312" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi filters add-topn --n 10</text>
|
||||
<circle cx="465" cy="328" r="3" fill="#06d6a0" opacity="0.6"/>
|
||||
<text x="477" y="332" font-family="'Courier New', Courier, monospace" font-size="12" fill="#e6edf3">pbi report set-theme</text>
|
||||
|
||||
<!-- 5 skills badge -->
|
||||
<rect x="565" y="360" width="120" height="24" rx="12" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="625" y="376" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" font-weight="600">5 Claude Skills</text>
|
||||
|
||||
<!-- ============ Footer stats ============ -->
|
||||
<text x="425" y="425" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">27 command groups | 125+ subcommands | 32 visual types | 12 Claude skills</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
|
@ -1,230 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="730" viewBox="0 0 850 730">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<text x="425" y="35" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">22 Command Groups</text>
|
||||
<text x="425" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Covering the full Tabular Object Model</text>
|
||||
|
||||
<!-- Row 1 -->
|
||||
<rect x="22" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="32" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">connect</text>
|
||||
<text x="32" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Link to Power BI Desktop</text>
|
||||
|
||||
<rect x="227" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="237" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">dax</text>
|
||||
<text x="237" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Execute and validate DAX queries</text>
|
||||
|
||||
<rect x="432" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="442" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">measure</text>
|
||||
<text x="442" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Create, update, delete measures</text>
|
||||
|
||||
<rect x="637" y="68" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="647" y="90" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">table</text>
|
||||
<text x="647" y="118" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Manage tables and schemas</text>
|
||||
|
||||
<!-- Row 2 -->
|
||||
<rect x="22" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="32" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">column</text>
|
||||
<text x="32" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Add, rename, hide columns</text>
|
||||
|
||||
<rect x="227" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="237" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">relationship</text>
|
||||
<text x="237" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Define table joins and cardinality</text>
|
||||
|
||||
<rect x="432" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="442" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">model</text>
|
||||
<text x="442" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Model metadata and statistics</text>
|
||||
|
||||
<rect x="637" y="140" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="647" y="162" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">database</text>
|
||||
<text x="647" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">TMDL/TMSL import and export</text>
|
||||
|
||||
<!-- Row 3 -->
|
||||
<rect x="22" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="32" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">security-role</text>
|
||||
<text x="32" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Row-level security roles</text>
|
||||
|
||||
<rect x="227" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="237" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">calc-group</text>
|
||||
<text x="237" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Calculation groups and items</text>
|
||||
|
||||
<rect x="432" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="442" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">partition</text>
|
||||
<text x="442" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Table partitions and refresh</text>
|
||||
|
||||
<rect x="637" y="212" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="647" y="234" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">perspective</text>
|
||||
<text x="647" y="262" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">User perspectives and views</text>
|
||||
|
||||
<!-- Row 4 -->
|
||||
<rect x="22" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="32" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">hierarchy</text>
|
||||
<text x="32" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Column hierarchies and levels</text>
|
||||
|
||||
<rect x="227" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="237" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">expression</text>
|
||||
<text x="237" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Named M/Power Query sources</text>
|
||||
|
||||
<rect x="432" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="442" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">calendar</text>
|
||||
<text x="442" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Date table configuration</text>
|
||||
|
||||
<rect x="637" y="284" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="647" y="306" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">trace</text>
|
||||
<text x="647" y="334" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Query tracing and profiling</text>
|
||||
|
||||
<!-- Row 5 -->
|
||||
<rect x="22" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="32" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">transaction</text>
|
||||
<text x="32" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Atomic multi-step changes</text>
|
||||
|
||||
<rect x="227" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="237" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">advanced</text>
|
||||
<text x="237" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Culture and locale settings</text>
|
||||
|
||||
<rect x="432" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="442" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">repl</text>
|
||||
<text x="442" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Interactive DAX shell</text>
|
||||
|
||||
<rect x="637" y="356" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="647" y="378" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">skills</text>
|
||||
<text x="647" y="406" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Claude Code AI skill packs</text>
|
||||
|
||||
<!-- Row 6 -->
|
||||
<rect x="22" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="32" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">disconnect</text>
|
||||
<text x="32" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Close active connection</text>
|
||||
|
||||
<rect x="227" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="237" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">connections</text>
|
||||
<text x="237" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Manage saved sessions</text>
|
||||
|
||||
<rect x="432" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.3"/>
|
||||
<text x="442" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold">setup</text>
|
||||
<text x="442" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">Environment and DLL check</text>
|
||||
|
||||
<!-- Summary cell -->
|
||||
<rect x="637" y="428" width="195" height="62" rx="6" fill="#161b22" stroke="#F2C811" stroke-opacity="0.8"/>
|
||||
<text x="734" y="456" font-family="'Segoe UI', Arial, sans-serif" font-size="15" fill="#F2C811" text-anchor="middle" font-weight="bold">100+ Subcommands</text>
|
||||
<text x="734" y="478" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">Full TOM coverage</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="510" font-family="'Courier New', Courier, monospace" font-size="12" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi <group> <command> [options]</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 22 KiB |
|
|
@ -1,19 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="475" height="135" viewBox="0 0 475 135">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="14.5" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="21" y="29">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="21" y="47">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="21" y="65">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="21" y="83">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="21" y="101">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="21" y="119">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="14.5" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="20" y="28">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="20" y="46">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="20" y="64">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="20" y="82">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="20" y="100">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="20" y="118">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
|
|
@ -1,228 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#F2C811" fill-opacity="0.4"/>
|
||||
</marker>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="42" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#F2C811">How It Works</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="425" y="68" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e">Two commands. That is all.</text>
|
||||
|
||||
<!-- ==================== STEP 1 - INSTALL ==================== -->
|
||||
<g transform="translate(142, 0)">
|
||||
<!-- Step number circle -->
|
||||
<circle cx="0" cy="105" r="18" fill="#F2C811"/>
|
||||
<text x="0" y="111" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#0d1117">1</text>
|
||||
|
||||
<!-- Card -->
|
||||
<rect x="-100" y="135" width="200" height="180" rx="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.4" stroke-width="1"/>
|
||||
|
||||
<!-- Terminal header bar -->
|
||||
<rect x="-88" y="147" width="176" height="24" rx="4" fill="#21262d"/>
|
||||
<!-- Traffic light dots -->
|
||||
<circle cx="-74" cy="159" r="4" fill="#ff5f56"/>
|
||||
<circle cx="-60" cy="159" r="4" fill="#ffbd2e"/>
|
||||
<circle cx="-46" cy="159" r="4" fill="#27c93f"/>
|
||||
|
||||
<!-- Terminal text -->
|
||||
<text x="-78" y="198" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">$ pipx install</text>
|
||||
<text x="-78" y="218" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0"> pbi-cli-tool</text>
|
||||
<text x="-78" y="252" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">✓ Installed!</text>
|
||||
|
||||
<!-- Label -->
|
||||
<text x="0" y="340" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#F2C811">INSTALL</text>
|
||||
<!-- Sublabel -->
|
||||
<text x="0" y="360" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">One-line install via pipx</text>
|
||||
</g>
|
||||
|
||||
<!-- ==================== ARROW 1 to 2 ==================== -->
|
||||
<line x1="260" y1="225" x2="305" y2="225" stroke="#F2C811" stroke-opacity="0.4" stroke-width="2" stroke-dasharray="6,4" marker-end="url(#arrowhead)"/>
|
||||
|
||||
<!-- ==================== STEP 2 - CONNECT ==================== -->
|
||||
<g transform="translate(425, 0)">
|
||||
<!-- Step number circle -->
|
||||
<circle cx="0" cy="105" r="18" fill="#F2C811"/>
|
||||
<text x="0" y="111" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#0d1117">2</text>
|
||||
|
||||
<!-- Card -->
|
||||
<rect x="-100" y="135" width="200" height="180" rx="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.4" stroke-width="1"/>
|
||||
|
||||
<!-- Terminal header bar -->
|
||||
<rect x="-88" y="147" width="176" height="24" rx="4" fill="#21262d"/>
|
||||
<!-- Traffic light dots -->
|
||||
<circle cx="-74" cy="159" r="4" fill="#ff5f56"/>
|
||||
<circle cx="-60" cy="159" r="4" fill="#ffbd2e"/>
|
||||
<circle cx="-46" cy="159" r="4" fill="#27c93f"/>
|
||||
|
||||
<!-- Terminal text -->
|
||||
<text x="-78" y="198" font-family="Consolas, Monaco, monospace" font-size="13" fill="#58a6ff">$ pbi connect</text>
|
||||
<text x="-78" y="220" font-family="Consolas, Monaco, monospace" font-size="13" fill="#8b949e">Scanning for Power BI...</text>
|
||||
<text x="-78" y="248" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">✓ Connected to</text>
|
||||
<text x="-78" y="264" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0"> Adventure Works</text>
|
||||
<text x="-78" y="290" font-family="Consolas, Monaco, monospace" font-size="13" fill="#F2C811"> 7 skills installed</text>
|
||||
|
||||
<!-- Label -->
|
||||
<text x="0" y="340" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#F2C811">CONNECT</text>
|
||||
<!-- Sublabel -->
|
||||
<text x="0" y="360" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">Auto-detects Power BI Desktop</text>
|
||||
</g>
|
||||
|
||||
<!-- ==================== ARROW 2 to 3 ==================== -->
|
||||
<line x1="543" y1="225" x2="588" y2="225" stroke="#F2C811" stroke-opacity="0.4" stroke-width="2" stroke-dasharray="6,4" marker-end="url(#arrowhead)"/>
|
||||
|
||||
<!-- ==================== STEP 3 - CHAT ==================== -->
|
||||
<g transform="translate(708, 0)">
|
||||
<!-- Step number circle -->
|
||||
<circle cx="0" cy="105" r="18" fill="#F2C811"/>
|
||||
<text x="0" y="111" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#0d1117">3</text>
|
||||
|
||||
<!-- Card -->
|
||||
<rect x="-100" y="135" width="200" height="180" rx="8" fill="#161b22" stroke="#F2C811" stroke-opacity="0.4" stroke-width="1"/>
|
||||
|
||||
<!-- Chat header -->
|
||||
<rect x="-88" y="147" width="176" height="24" rx="4" fill="#21262d"/>
|
||||
<text x="-74" y="163" font-family="Segoe UI, Arial, sans-serif" font-size="11" font-weight="bold" fill="#8b949e">Claude Code</text>
|
||||
|
||||
<!-- User chat bubble -->
|
||||
<rect x="-82" y="182" width="164" height="30" rx="6" fill="#1a3a5c"/>
|
||||
<text x="-72" y="201" font-family="Segoe UI, Arial, sans-serif" font-size="12" fill="#c9d1d9">Create a date table</text>
|
||||
|
||||
<!-- Claude response bubble -->
|
||||
<rect x="-82" y="222" width="164" height="44" rx="6" fill="#1c1c1c"/>
|
||||
<text x="-72" y="240" font-family="Consolas, Monaco, monospace" font-size="11" fill="#8b949e">Running:</text>
|
||||
<text x="-72" y="256" font-family="Consolas, Monaco, monospace" font-size="11" fill="#58a6ff">pbi calendar generate</text>
|
||||
|
||||
<!-- Check result -->
|
||||
<text x="-78" y="290" font-family="Consolas, Monaco, monospace" font-size="13" fill="#06d6a0">✓ Date table created</text>
|
||||
|
||||
<!-- Label -->
|
||||
<text x="0" y="340" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="18" font-weight="bold" fill="#F2C811">CHAT</text>
|
||||
<!-- Sublabel -->
|
||||
<text x="0" y="360" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">Claude picks the right skill</text>
|
||||
</g>
|
||||
|
||||
<!-- ==================== FOOTER ==================== -->
|
||||
<text x="425" y="440" text-anchor="middle" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e">Claude auto-discovers 7 Power BI skills. No commands to memorize.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 18 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="650" viewBox="0 0 850 650">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="440" viewBox="0 0 850 440">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="16" fill="#F2C811" text-anchor="middle" font-weight="bold">Dual-Layer Architecture</text>
|
||||
|
||||
<!-- ===== MODELING BAND y=48-188 ===== -->
|
||||
|
|
@ -271,5 +156,4 @@
|
|||
</g>
|
||||
<text x="675" y="388" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#7ee787" text-anchor="middle" font-weight="600">Theme Engine</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 13 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="700" viewBox="0 0 850 700">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="490" viewBox="0 0 850 490">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Model Health Check</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Ask Claude to audit your semantic model in seconds</text>
|
||||
|
||||
|
|
@ -191,6 +76,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="480" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Catch model issues before they reach production</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 5.9 KiB |
|
|
@ -1,220 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="770" viewBox="0 0 850 770">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title section -->
|
||||
<text x="425" y="40" font-family="Segoe UI, Arial, sans-serif" font-size="28" font-weight="bold" fill="#F2C811" text-anchor="middle">Modeling Skill</text>
|
||||
<text x="425" y="64" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#8b949e" text-anchor="middle">Describe your schema. Claude builds it.</text>
|
||||
|
||||
<!-- Chat container -->
|
||||
<rect x="40" y="84" width="770" height="396" rx="8" ry="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Header bar -->
|
||||
<rect x="40" y="84" width="770" height="36" rx="8" ry="8" fill="#161b22"/>
|
||||
<rect x="40" y="104" width="770" height="16" fill="#161b22"/>
|
||||
<line x1="40" y1="120" x2="810" y2="120" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Traffic lights -->
|
||||
<circle cx="64" cy="102" r="6" fill="#ff5f57"/>
|
||||
<circle cx="84" cy="102" r="6" fill="#febc2e"/>
|
||||
<circle cx="104" cy="102" r="6" fill="#28c840"/>
|
||||
|
||||
<!-- Claude Code label -->
|
||||
<text x="130" y="107" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#d97757">Claude Code</text>
|
||||
|
||||
<!-- User message -->
|
||||
<rect x="70" y="134" width="600" height="56" rx="12" ry="12" fill="#1a3a5c"/>
|
||||
<text x="88" y="157" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#c9d1d9">Create a star schema with Sales as the fact table,</text>
|
||||
<text x="88" y="178" font-family="Segoe UI, Arial, sans-serif" font-size="16" fill="#c9d1d9">linked to Products, Calendar, Customers, and Store</text>
|
||||
|
||||
<!-- Claude response -->
|
||||
<rect x="70" y="204" width="710" height="262" rx="12" ry="12" fill="#1c1c1c"/>
|
||||
|
||||
<!-- "Building star schema..." -->
|
||||
<text x="88" y="230" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e">Building star schema...</text>
|
||||
|
||||
<!-- Check item 1: Sales (fact) -->
|
||||
<text x="88" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">✔</text>
|
||||
<text x="108" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
|
||||
<text x="201" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Sales</text>
|
||||
<text x="240" y="258" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> (fact)</text>
|
||||
|
||||
<!-- Check item 2: Products -->
|
||||
<text x="88" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">✔</text>
|
||||
<text x="108" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
|
||||
<text x="201" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Products</text>
|
||||
<text x="265" y="284" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
|
||||
|
||||
<!-- Check item 3: Calendar -->
|
||||
<text x="88" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">✔</text>
|
||||
<text x="108" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
|
||||
<text x="201" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Calendar</text>
|
||||
<text x="264" y="310" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
|
||||
|
||||
<!-- Check item 4: Customers -->
|
||||
<text x="88" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">✔</text>
|
||||
<text x="108" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
|
||||
<text x="201" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Customers</text>
|
||||
<text x="276" y="336" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
|
||||
|
||||
<!-- Check item 5: Store -->
|
||||
<text x="88" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0">✔</text>
|
||||
<text x="108" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#c9d1d9">Created table </text>
|
||||
<text x="201" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="bold" fill="#06d6a0">Store</text>
|
||||
<text x="237" y="362" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#8b949e"> linked to Sales</text>
|
||||
|
||||
<!-- Separator line -->
|
||||
<line x1="88" y1="380" x2="760" y2="380" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Summary: "5 tables, 4 relationships created" -->
|
||||
<text x="88" y="404" font-family="Segoe UI, Arial, sans-serif" font-size="16" font-weight="bold" fill="#F2C811">5 tables, 4 relationships created</text>
|
||||
|
||||
<!-- Sub-summary -->
|
||||
<text x="88" y="424" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#8b949e">All relationships are one-to-many, single direction</text>
|
||||
|
||||
<!-- Capability pills -->
|
||||
<!-- Total width of 4 pills: 4 pills with padding. Let's center them. -->
|
||||
<!-- Pill widths: Tables ~90, Relationships ~130, Measures ~100, Date Tables ~115 -->
|
||||
<!-- Total ~435 + 3*16 gaps = 483. Start x = (850-483)/2 = 183.5 -->
|
||||
|
||||
<!-- Pill: Tables -->
|
||||
<rect x="148" y="494" width="90" height="30" rx="15" ry="15" fill="none" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text x="193" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#F2C811" text-anchor="middle">Tables</text>
|
||||
|
||||
<!-- Pill: Relationships -->
|
||||
<rect x="254" y="494" width="130" height="30" rx="15" ry="15" fill="none" stroke="#7b61ff" stroke-width="1.5"/>
|
||||
<text x="319" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#7b61ff" text-anchor="middle">Relationships</text>
|
||||
|
||||
<!-- Pill: Measures -->
|
||||
<rect x="400" y="494" width="100" height="30" rx="15" ry="15" fill="none" stroke="#06d6a0" stroke-width="1.5"/>
|
||||
<text x="450" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#06d6a0" text-anchor="middle">Measures</text>
|
||||
|
||||
<!-- Pill: Date Tables -->
|
||||
<rect x="516" y="494" width="115" height="30" rx="15" ry="15" fill="none" stroke="#58a6ff" stroke-width="1.5"/>
|
||||
<text x="573.5" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="14" fill="#58a6ff" text-anchor="middle">Date Tables</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="550" font-family="Segoe UI, Arial, sans-serif" font-size="15" fill="#8b949e" text-anchor="middle">From description to working schema in one prompt.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:beaee64113d74512f7b8c24178bba4762145d6a54dd3ec47a64ae2b2706fe033
|
||||
size 6733336
|
||||
|
|
@ -1,301 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="rel-glow" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F2C811" stop-opacity="0.08"/>
|
||||
<stop offset="50%" stop-color="#F2C811" stop-opacity="0.02"/>
|
||||
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0.06"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rel-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rel-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rel-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Subtle radial glow behind center -->
|
||||
<rect width="100%" height="100%" fill="url(#rel-glow)" rx="8"/>
|
||||
|
||||
<!-- Decorative corner accents -->
|
||||
<line x1="15" y1="15" x2="55" y2="15" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="15" y1="15" x2="15" y2="55" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="835" y1="15" x2="795" y2="15" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="835" y1="15" x2="835" y2="55" stroke="#F2C811" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="15" y1="465" x2="55" y2="465" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="15" y1="465" x2="15" y2="425" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="835" y1="465" x2="795" y2="465" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
|
||||
<line x1="835" y1="465" x2="835" y2="425" stroke="#06d6a0" stroke-width="2" stroke-opacity="0.4"/>
|
||||
|
||||
<!-- ===== "VIBE BI" block art (shadow) ===== -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="10" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="246" y="44">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="246" y="56">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="246" y="68">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="246" y="80">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="246" y="92"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="246" y="104"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="10" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="245" y="43">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="245" y="55">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="245" y="67">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="245" y="79">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="245" y="91"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="245" y="103"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="100" y1="115" x2="750" y2="115" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="140" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Vibe-Driven Business Intelligence</text>
|
||||
|
||||
<!-- ===== PBI-CLI block art (shadow) ===== -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="248" y="168">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="248" y="179">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="248" y="190">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="248" y="201">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="248" y="212">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="248" y="223">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="247" y="167">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="247" y="178">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="247" y="189">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="247" y="200">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="247" y="211">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="247" y="222">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Version badge -->
|
||||
<rect x="370" y="234" width="110" height="28" rx="14" fill="#F2C811" fill-opacity="0.12" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text x="425" y="253" font-family="'Courier New', Courier, monospace" font-size="14" fill="#F2C811" text-anchor="middle" font-weight="bold">v3.10.1</text>
|
||||
|
||||
<!-- ===== EVOLUTION ARROW: Before -> After ===== -->
|
||||
|
||||
<!-- "Was" side -->
|
||||
<rect x="60" y="285" width="280" height="140" rx="10" fill="#161b22" stroke="#8b949e" stroke-width="1" stroke-opacity="0.4"/>
|
||||
<!-- Crossed out old label -->
|
||||
<text x="200" y="312" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle" opacity="0.5">Previously</text>
|
||||
<text x="200" y="348" font-family="'Segoe UI', Arial, sans-serif" font-size="22" fill="#8b949e" text-anchor="middle" opacity="0.4">Vibe Modeling</text>
|
||||
<line x1="110" y1="345" x2="290" y2="345" stroke="#ff4444" stroke-width="2" stroke-opacity="0.6"/>
|
||||
<!-- Only modeling pill -->
|
||||
<rect x="148" y="368" width="104" height="24" rx="12" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1" stroke-opacity="0.4"/>
|
||||
<text x="200" y="384" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" opacity="0.5">Modeling only</text>
|
||||
|
||||
<!-- Arrow connecting them -->
|
||||
<g transform="translate(360, 340)">
|
||||
<line x1="0" y1="0" x2="60" y2="0" stroke="#F2C811" stroke-width="3" stroke-linecap="round"/>
|
||||
<polygon points="65,0 55,-6 55,6" fill="#F2C811"/>
|
||||
<!-- Sparkle on arrow -->
|
||||
<path d="M30,-12 L31.5,-6 L38,-4 L31.5,-2 L30,4 L28.5,-2 L22,-4 L28.5,-6 Z" fill="#F2C811" fill-opacity="0.7"/>
|
||||
</g>
|
||||
|
||||
<!-- "Now" side -->
|
||||
<rect x="445" y="285" width="345" height="140" rx="10" fill="#161b22" stroke="#F2C811" stroke-width="2"/>
|
||||
<!-- Glow effect on Now card -->
|
||||
<rect x="445" y="285" width="345" height="140" rx="10" fill="#F2C811" fill-opacity="0.03"/>
|
||||
<text x="617" y="312" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" text-anchor="middle" font-weight="600">Now</text>
|
||||
<text x="617" y="348" font-family="'Segoe UI', Arial, sans-serif" font-size="22" fill="#F2C811" text-anchor="middle" font-weight="bold">VIBE BI</text>
|
||||
|
||||
<!-- Both layer pills -->
|
||||
<rect x="498" y="362" width="100" height="24" rx="12" fill="#58a6ff" fill-opacity="0.15" stroke="#58a6ff" stroke-width="1"/>
|
||||
<!-- Database icon in pill -->
|
||||
<g transform="translate(505, 367)">
|
||||
<ellipse cx="6" cy="3" rx="5" ry="3" fill="none" stroke="#58a6ff" stroke-width="1"/>
|
||||
<line x1="1" y1="3" x2="1" y2="10" stroke="#58a6ff" stroke-width="1"/>
|
||||
<line x1="11" y1="3" x2="11" y2="10" stroke="#58a6ff" stroke-width="1"/>
|
||||
<ellipse cx="6" cy="10" rx="5" ry="3" fill="none" stroke="#58a6ff" stroke-width="1"/>
|
||||
</g>
|
||||
<text x="558" y="379" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
|
||||
<text x="607" y="379" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" text-anchor="middle" font-weight="bold">+</text>
|
||||
|
||||
<rect x="618" y="362" width="108" height="24" rx="12" fill="#06d6a0" fill-opacity="0.15" stroke="#06d6a0" stroke-width="1"/>
|
||||
<!-- Bar chart icon in pill -->
|
||||
<g transform="translate(625, 367)">
|
||||
<rect x="0" y="8" width="4" height="6" rx="1" fill="#06d6a0" fill-opacity="0.7"/>
|
||||
<rect x="5" y="4" width="4" height="10" rx="1" fill="#06d6a0" fill-opacity="0.8"/>
|
||||
<rect x="10" y="0" width="4" height="14" rx="1" fill="#06d6a0" fill-opacity="0.9"/>
|
||||
</g>
|
||||
<text x="682" y="379" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Power BI bars icon in Now card -->
|
||||
<g transform="translate(752, 300)">
|
||||
<rect x="16" y="0" width="10" height="22" rx="2" fill="url(#rel-bar1)"/>
|
||||
<rect x="8" y="6" width="10" height="16" rx="2" fill="url(#rel-bar2)"/>
|
||||
<rect x="0" y="11" width="10" height="11" rx="2" fill="url(#rel-bar3)"/>
|
||||
</g>
|
||||
|
||||
<!-- ===== BOTTOM STATS ROW ===== -->
|
||||
|
||||
<!-- Stat 1: Commands -->
|
||||
<g transform="translate(110, 445)">
|
||||
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#58a6ff" font-weight="bold">30+</text>
|
||||
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">commands</text>
|
||||
</g>
|
||||
|
||||
<!-- Separator dot -->
|
||||
<circle cx="230" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
|
||||
|
||||
<!-- Stat 2: Visuals -->
|
||||
<g transform="translate(280, 445)">
|
||||
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#06d6a0" font-weight="bold">32</text>
|
||||
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">visual types</text>
|
||||
</g>
|
||||
|
||||
<!-- Separator dot -->
|
||||
<circle cx="390" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
|
||||
|
||||
<!-- Stat 3: Skills -->
|
||||
<g transform="translate(435, 445)">
|
||||
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#F2C811" font-weight="bold">12</text>
|
||||
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">Claude skills</text>
|
||||
</g>
|
||||
|
||||
<!-- Separator dot -->
|
||||
<circle cx="545" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
|
||||
|
||||
<!-- Stat 4: Tokens -->
|
||||
<g transform="translate(590, 445)">
|
||||
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#d97757" font-weight="bold">~30</text>
|
||||
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">tokens/call</text>
|
||||
</g>
|
||||
|
||||
<!-- Separator dot -->
|
||||
<circle cx="710" cy="440" r="2.5" fill="#F2C811" fill-opacity="0.4"/>
|
||||
|
||||
<!-- Stat 5: Tests -->
|
||||
<g transform="translate(750, 445)">
|
||||
<text x="0" y="0" font-family="'Segoe UI', Arial, sans-serif" font-size="24" fill="#c084fc" font-weight="bold">488</text>
|
||||
<text x="0" y="16" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e">tests</text>
|
||||
</g>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 24 KiB |
|
|
@ -1,129 +1,15 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="560" viewBox="0 0 850 560">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="350" viewBox="0 0 850 350">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="rl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<linearGradient id="rl-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#06d6a0" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#06d6a0" stop-opacity="0.12"/>
|
||||
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="30" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#06d6a0" text-anchor="middle" font-weight="bold">Report Layer</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Build entire Power BI reports from the command line</text>
|
||||
|
||||
|
|
@ -237,6 +123,4 @@
|
|||
|
||||
<circle cx="630" cy="315" r="4" fill="#06d6a0"/>
|
||||
<text x="642" y="319" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#e6edf3">Git-friendly PBIR</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 7.8 KiB |
|
|
@ -1,129 +1,15 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="490" viewBox="0 0 850 490">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="280" viewBox="0 0 850 280">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="rw-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<linearGradient id="rw-glow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#06d6a0" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#06d6a0" stop-opacity="0.12"/>
|
||||
<stop offset="100%" stop-color="#06d6a0" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="28" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#06d6a0" text-anchor="middle" font-weight="bold">Build a Report in 6 Steps</text>
|
||||
<text x="425" y="48" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">From empty folder to a complete, themed report with visuals and filters</text>
|
||||
|
||||
|
|
@ -235,6 +121,4 @@
|
|||
<text x="425" y="250" font-family="'Courier New', Courier, monospace" font-size="12" fill="#58a6ff" text-anchor="middle">pbi visual add --type bar --page overview && pbi visual bind --category --value</text>
|
||||
|
||||
<text x="425" y="275" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e" text-anchor="middle">All steps work offline on PBIR files. Desktop auto-syncs when it's open.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 8.1 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="670" viewBox="0 0 850 670">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="460" viewBox="0 0 850 460">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">Test Row-Level Security in Seconds</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Create, configure, and validate RLS roles without touching the GUI</text>
|
||||
|
||||
|
|
@ -163,6 +48,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="450" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Build and validate security roles entirely from conversation. No Security tab needed.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 4.1 KiB |
|
|
@ -1,129 +1,15 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="690" viewBox="0 0 850 690">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="480" viewBox="0 0 850 480">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="glow-line" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<linearGradient id="glow-line" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#F2C811" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#F2C811" stop-opacity="0.2"/>
|
||||
<stop offset="100%" stop-color="#F2C811" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#F2C811" text-anchor="middle" font-weight="bold">12 Skills That Claude Discovers Automatically</text>
|
||||
<text x="425" y="54" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">Two layers, one CLI. Claude picks the right skill for every task.</text>
|
||||
|
||||
|
|
@ -251,6 +137,4 @@
|
|||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="465" font-family="'Courier New', Courier, monospace" font-size="15" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi skills list</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 12 KiB |
125
assets/stats.svg
|
|
@ -1,123 +1,9 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="510" viewBox="0 0 850 510">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="300" viewBox="0 0 850 300">
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
<!-- BACKGROUND -->
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- BACKGROUND -->
|
||||
<!-- TITLE -->
|
||||
<!-- TITLE -->
|
||||
<text x="425" y="33" font-family="'Segoe UI', Arial, sans-serif" font-size="17" fill="#F2C811" text-anchor="middle" font-weight="bold">pbi-cli at a Glance</text>
|
||||
|
||||
<!-- ===================== CELL 1: 30+ CLI Commands (blue) top-left ===================== -->
|
||||
|
|
@ -198,5 +84,4 @@
|
|||
<rect x="760" y="199" width="55" height="12" rx="3" fill="#06d6a0" fill-opacity="0.5"/>
|
||||
<text x="787" y="209" font-family="'Segoe UI', Arial, sans-serif" font-size="7" fill="#06d6a0" text-anchor="middle">REPORTING</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 5.2 KiB |
|
|
@ -1,186 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="630" viewBox="0 0 850 630">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">100x More Efficient Than MCP</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Token cost per operation: MCP tool call vs CLI command</text>
|
||||
|
||||
<!-- Chart area -->
|
||||
<rect x="40" y="65" width="770" height="300" rx="8" fill="#161b22" stroke="#30363d" stroke-width="1"/>
|
||||
|
||||
<!-- Row 1: connect -->
|
||||
<text x="120" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">connect</text>
|
||||
<!-- MCP bar -->
|
||||
<rect x="135" y="86" width="600" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
|
||||
<text x="742" y="98" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,800</text>
|
||||
<!-- CLI bar -->
|
||||
<rect x="135" y="104" width="4" height="14" rx="2" fill="#06d6a0"/>
|
||||
<text x="146" y="116" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~30</text>
|
||||
|
||||
<!-- Row 2: dax query -->
|
||||
<text x="120" y="155" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">dax query</text>
|
||||
<!-- MCP bar -->
|
||||
<rect x="135" y="141" width="575" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
|
||||
<text x="717" y="153" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,600</text>
|
||||
<!-- CLI bar -->
|
||||
<rect x="135" y="159" width="5" height="14" rx="2" fill="#06d6a0"/>
|
||||
<text x="147" y="171" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~35</text>
|
||||
|
||||
<!-- Row 3: measure -->
|
||||
<text x="120" y="210" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">measure</text>
|
||||
<!-- MCP bar -->
|
||||
<rect x="135" y="196" width="550" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
|
||||
<text x="692" y="208" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,400</text>
|
||||
<!-- CLI bar -->
|
||||
<rect x="135" y="214" width="4" height="14" rx="2" fill="#06d6a0"/>
|
||||
<text x="146" y="226" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~28</text>
|
||||
|
||||
<!-- Row 4: model stats -->
|
||||
<text x="120" y="265" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">model</text>
|
||||
<!-- MCP bar -->
|
||||
<rect x="135" y="251" width="525" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
|
||||
<text x="667" y="263" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,200</text>
|
||||
<!-- CLI bar -->
|
||||
<rect x="135" y="269" width="4" height="14" rx="2" fill="#06d6a0"/>
|
||||
<text x="146" y="281" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~25</text>
|
||||
|
||||
<!-- Row 5: export -->
|
||||
<text x="120" y="320" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#c9d1d9" text-anchor="end">export</text>
|
||||
<!-- MCP bar -->
|
||||
<rect x="135" y="306" width="563" height="14" rx="3" fill="#ff6b6b" fill-opacity="0.7"/>
|
||||
<text x="705" y="318" font-family="'Courier New', Courier, monospace" font-size="11" fill="#ff6b6b">4,500</text>
|
||||
<!-- CLI bar -->
|
||||
<rect x="135" y="324" width="4" height="14" rx="2" fill="#06d6a0"/>
|
||||
<text x="146" y="336" font-family="'Courier New', Courier, monospace" font-size="11" fill="#06d6a0">~32</text>
|
||||
|
||||
<!-- Legend -->
|
||||
<rect x="230" y="378" width="14" height="14" rx="2" fill="#ff6b6b" fill-opacity="0.7"/>
|
||||
<text x="250" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#ff6b6b">MCP tool call</text>
|
||||
|
||||
<rect x="380" y="378" width="14" height="14" rx="2" fill="#06d6a0"/>
|
||||
<text x="400" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#06d6a0">CLI command</text>
|
||||
|
||||
<text x="530" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#8b949e">|</text>
|
||||
|
||||
<text x="550" y="390" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="#F2C811" font-weight="bold">~130x savings</text>
|
||||
|
||||
<!-- Footer -->
|
||||
<text x="425" y="414" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#8b949e" text-anchor="middle">Same capabilities, fraction of the cost. Your AI budget goes 100x further.</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 16 KiB |
|
|
@ -1,122 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="650" viewBox="0 0 850 650">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="850" height="440" viewBox="0 0 850 440">
|
||||
<rect width="100%" height="100%" fill="#0d1117" rx="8"/>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Title -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="30" font-family="'Segoe UI', Arial, sans-serif" font-size="20" fill="#F2C811" text-anchor="middle" font-weight="bold">32 Visual Types, All from CLI</text>
|
||||
<text x="425" y="50" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">pbi visual add --type <alias> -- use friendly names, pbi-cli handles the rest</text>
|
||||
|
||||
|
|
@ -357,6 +242,4 @@
|
|||
<text x="425" y="410" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#8b949e" text-anchor="middle">card_new, multi_row_card, shape, action_button, page_navigator, and more</text>
|
||||
|
||||
<text x="425" y="435" font-family="'Courier New', Courier, monospace" font-size="14" fill="#58a6ff" text-anchor="middle" font-weight="bold">pbi visual add --type bar --page overview --name my_chart</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 16 KiB |
|
|
@ -1,244 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="850" height="600" viewBox="0 0 850 600">
|
||||
<defs>
|
||||
<linearGradient id="hdr-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdr-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="pbi-lg5" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="wf-bar1" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBBB14"/>
|
||||
<stop offset="100%" stop-color="#B25400"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="wf-bar2" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E583"/>
|
||||
<stop offset="100%" stop-color="#DE9800"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="wf-bar3" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||
<stop offset="0%" stop-color="#F9E68B"/>
|
||||
<stop offset="100%" stop-color="#F3CD32"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- ==================== VIBE BI HEADER ==================== -->
|
||||
|
||||
<!-- "VIBE BI" block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="296" y="22">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="296" y="33">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="44">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="55">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="296" y="66"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="296" y="77"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- "VIBE BI" block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="9" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="295" y="21">██╗ ██╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗</tspan>
|
||||
<tspan x="295" y="32">██║ ██║ ██║ ██╔══██╗ ██╔════╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="43">██║ ██║ ██║ ██████╔╝ █████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="54">╚██╗ ██╔╝ ██║ ██╔══██╗ ██╔══╝ ██╔══██╗ ██║</tspan>
|
||||
<tspan x="295" y="65"> ╚████╔╝ ██║ ██████╔╝ ███████╗ ██████╔╝ ██║</tspan>
|
||||
<tspan x="295" y="76"> ╚═══╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="60" y1="84" x2="790" y2="84" stroke="#F2C811" stroke-opacity="0.15" stroke-width="1"/>
|
||||
|
||||
<!-- Tagline -->
|
||||
<text x="425" y="100" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#e6edf3" text-anchor="middle" font-weight="600">The First CLI for Both Power BI Modeling and Reporting</text>
|
||||
|
||||
<!-- ===== Connection Flow: Claude > PBI-CLI > Power BI ===== -->
|
||||
|
||||
<!-- Claude AI logo (inline, original 1200x1200, displayed as 50x50, centered at x=110) -->
|
||||
<svg x="85" y="110" width="50" height="50" viewBox="0 0 1200 1200">
|
||||
<path fill="#d97757" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/>
|
||||
</svg>
|
||||
<text x="110" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#d97757" text-anchor="middle" font-weight="600">Claude Code</text>
|
||||
|
||||
<!-- Left arrow -->
|
||||
<line x1="155" y1="135" x2="290" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="294,135 286,130 286,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- PBI-CLI block art (shadow) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#7A6508" xml:space="preserve">
|
||||
<tspan x="316" y="118">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="316" y="128">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="316" y="138">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="148">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="316" y="158">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="316" y="168">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
<!-- PBI-CLI block art (main) -->
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="7" fill="#F2C811" xml:space="preserve">
|
||||
<tspan x="315" y="117">██████╗ ██████╗ ██╗ ██████╗ ██╗ ██╗</tspan>
|
||||
<tspan x="315" y="127">██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ██║ ██║</tspan>
|
||||
<tspan x="315" y="137">██████╔╝ ██████╔╝ ██║ ███╗ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="147">██╔═══╝ ██╔══██╗ ██║ ╚══╝ ██║ ██║ ██║</tspan>
|
||||
<tspan x="315" y="157">██║ ██████╔╝ ██║ ╚██████╗ ███████╗ ██║</tspan>
|
||||
<tspan x="315" y="167">╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝</tspan>
|
||||
</text>
|
||||
|
||||
<!-- Right arrow -->
|
||||
<line x1="560" y1="135" x2="655" y2="135" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.5"/>
|
||||
<polygon points="659,135 651,130 651,140" fill="#F2C811" fill-opacity="0.5"/>
|
||||
|
||||
<!-- Power BI logo (inline, original 630x630, displayed as 50x50, centered at x=700) -->
|
||||
<svg x="675" y="110" width="50" height="50" viewBox="0 0 630 630">
|
||||
<g transform="translate(77.5, 0)">
|
||||
<rect fill="url(#pbi-lg1)" x="256" y="0" width="219" height="630" rx="26"/>
|
||||
<path fill="url(#pbi-lg2)" d="M346,604 L346,630 L320,630 L153,630 C138.64,630 127,618.36 127,604 L127,183 C127,168.64 138.64,157 153,157 L320,157 C334.36,157 346,168.64 346,183 L346,604 Z"/>
|
||||
<path fill="url(#pbi-lg5)" d="M219,604 L219,630 L193,630 L26,630 C11.64,630 0,618.36 0,604 L0,341 C0,326.64 11.64,315 26,315 L193,315 C207.36,315 219,326.64 219,341 L219,604 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<text x="700" y="175" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" font-weight="600">Power BI</text>
|
||||
|
||||
<!-- Modeling + Reporting pills -->
|
||||
<rect x="308" y="176" width="100" height="20" rx="10" fill="#58a6ff" fill-opacity="0.1" stroke="#58a6ff" stroke-width="1"/>
|
||||
<text x="358" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#58a6ff" text-anchor="middle" font-weight="600">Modeling</text>
|
||||
<text x="420" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">+</text>
|
||||
<rect x="432" y="176" width="100" height="20" rx="10" fill="#06d6a0" fill-opacity="0.1" stroke="#06d6a0" stroke-width="1"/>
|
||||
<text x="482" y="190" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#06d6a0" text-anchor="middle" font-weight="600">Reporting</text>
|
||||
|
||||
<!-- Bottom separator -->
|
||||
<line x1="60" y1="200" x2="790" y2="200" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- ==================== END HEADER ==================== -->
|
||||
|
||||
<!-- Feature content (shifted down by 210px) -->
|
||||
<g transform="translate(0, 210)">
|
||||
|
||||
<!-- Background -->
|
||||
<!-- Title -->
|
||||
<text x="425" y="32" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#F2C811" text-anchor="middle" font-weight="bold">The VIBE BI Workflow</text>
|
||||
|
||||
<!-- ==================== NODE 1: Claude Code ==================== -->
|
||||
<!-- Step badge -->
|
||||
<circle cx="130" cy="61" r="13" fill="#d97757" fill-opacity="0.2" stroke="#d97757" stroke-width="1.5"/>
|
||||
<text x="130" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#d97757" font-weight="bold" text-anchor="middle">1</text>
|
||||
<!-- Card -->
|
||||
<rect x="30" y="75" width="200" height="190" rx="10" fill="#161b22" stroke="#d97757" stroke-width="1.5"/>
|
||||
<!-- Header band -->
|
||||
<path d="M 40,75 L 220,75 A 10,10 0 0,1 230,85 L 230,127 L 30,127 L 30,85 A 10,10 0 0,1 40,75 Z" fill="#d97757" fill-opacity="0.12"/>
|
||||
<!-- Claude starburst icon -->
|
||||
<g transform="translate(130,101)">
|
||||
<line x1="0" y1="-12" x2="0" y2="12" stroke="#d97757" stroke-width="2.5"/>
|
||||
<line x1="-12" y1="0" x2="12" y2="0" stroke="#d97757" stroke-width="2.5"/>
|
||||
<line x1="-8.5" y1="-8.5" x2="8.5" y2="8.5" stroke="#d97757" stroke-width="2"/>
|
||||
<line x1="8.5" y1="-8.5" x2="-8.5" y2="8.5" stroke="#d97757" stroke-width="2"/>
|
||||
<line x1="-5" y1="-11" x2="5" y2="11" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
|
||||
<line x1="11" y1="-5" x2="-11" y2="5" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
|
||||
<line x1="5" y1="-11" x2="-5" y2="11" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
|
||||
<line x1="-11" y1="-5" x2="11" y2="5" stroke="#d97757" stroke-width="1.5" opacity="0.6"/>
|
||||
</g>
|
||||
<!-- Node name and subtitle -->
|
||||
<text x="130" y="142" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#d97757" font-weight="bold" text-anchor="middle">Claude Code</text>
|
||||
<text x="130" y="157" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">AI Assistant</text>
|
||||
<!-- Divider -->
|
||||
<line x1="45" y1="165" x2="215" y2="165" stroke="#d97757" stroke-opacity="0.2" stroke-width="1"/>
|
||||
<!-- Bullets -->
|
||||
<circle cx="52" cy="175.5" r="2.5" fill="#d97757" opacity="0.7"/>
|
||||
<text x="62" y="179" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Reads TMDL + PBIR source files</text>
|
||||
<circle cx="52" cy="192.5" r="2.5" fill="#d97757" opacity="0.7"/>
|
||||
<text x="62" y="196" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Understands model + report state</text>
|
||||
<circle cx="52" cy="209.5" r="2.5" fill="#d97757" opacity="0.7"/>
|
||||
<text x="62" y="213" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Plans and executes changes</text>
|
||||
|
||||
<!-- ==================== NODE 2: pbi-cli ==================== -->
|
||||
<!-- Step badge -->
|
||||
<circle cx="425" cy="61" r="13" fill="#F2C811" fill-opacity="0.2" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text x="425" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold" text-anchor="middle">2</text>
|
||||
<!-- Card -->
|
||||
<rect x="325" y="75" width="200" height="190" rx="10" fill="#161b22" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<!-- Header band -->
|
||||
<path d="M 335,75 L 515,75 A 10,10 0 0,1 525,85 L 525,127 L 325,127 L 325,85 A 10,10 0 0,1 335,75 Z" fill="#F2C811" fill-opacity="0.12"/>
|
||||
<!-- Terminal icon -->
|
||||
<g transform="translate(401,87)">
|
||||
<rect x="0" y="0" width="48" height="28" rx="4" fill="#F2C811" fill-opacity="0.1" stroke="#F2C811" stroke-width="1.5"/>
|
||||
<text font-family="'Courier New', Courier, monospace" font-size="11" fill="#F2C811" x="5" y="19">$ pbi-cli</text>
|
||||
</g>
|
||||
<!-- Node name and subtitle -->
|
||||
<text x="425" y="142" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#F2C811" font-weight="bold" text-anchor="middle">pbi-cli</text>
|
||||
<text x="425" y="157" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">The Bridge</text>
|
||||
<!-- Divider -->
|
||||
<line x1="340" y1="165" x2="510" y2="165" stroke="#F2C811" stroke-opacity="0.2" stroke-width="1"/>
|
||||
<!-- Bullets -->
|
||||
<circle cx="347" cy="175.5" r="2.5" fill="#F2C811" opacity="0.7"/>
|
||||
<text x="357" y="179" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Runs targeted CLI commands</text>
|
||||
<circle cx="347" cy="192.5" r="2.5" fill="#F2C811" opacity="0.7"/>
|
||||
<text x="357" y="196" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Writes TMDL + PBIR files</text>
|
||||
<circle cx="347" cy="209.5" r="2.5" fill="#F2C811" opacity="0.7"/>
|
||||
<text x="357" y="213" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">~30 tokens per operation</text>
|
||||
|
||||
<!-- ==================== NODE 3: Power BI Desktop ==================== -->
|
||||
<!-- Step badge -->
|
||||
<circle cx="720" cy="61" r="13" fill="#EBBB14" fill-opacity="0.2" stroke="#EBBB14" stroke-width="1.5"/>
|
||||
<text x="720" y="66" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#EBBB14" font-weight="bold" text-anchor="middle">3</text>
|
||||
<!-- Card -->
|
||||
<rect x="620" y="75" width="200" height="190" rx="10" fill="#161b22" stroke="#EBBB14" stroke-width="1.5"/>
|
||||
<!-- Header band -->
|
||||
<path d="M 630,75 L 810,75 A 10,10 0 0,1 820,85 L 820,127 L 620,127 L 620,85 A 10,10 0 0,1 630,75 Z" fill="#EBBB14" fill-opacity="0.12"/>
|
||||
<!-- Power BI bars icon -->
|
||||
<rect x="724" y="83" width="16" height="34" rx="3" fill="url(#wf-bar1)"/>
|
||||
<rect x="712" y="92" width="16" height="25" rx="3" fill="url(#wf-bar2)"/>
|
||||
<rect x="700" y="101" width="16" height="16" rx="3" fill="url(#wf-bar3)"/>
|
||||
<!-- Node name and subtitle -->
|
||||
<text x="720" y="142" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#EBBB14" font-weight="bold" text-anchor="middle">Power BI Desktop</text>
|
||||
<text x="720" y="157" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Live Preview</text>
|
||||
<!-- Divider -->
|
||||
<line x1="635" y1="165" x2="805" y2="165" stroke="#EBBB14" stroke-opacity="0.2" stroke-width="1"/>
|
||||
<!-- Bullets -->
|
||||
<circle cx="642" cy="175.5" r="2.5" fill="#EBBB14" opacity="0.7"/>
|
||||
<text x="652" y="179" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Detects file changes instantly</text>
|
||||
<circle cx="642" cy="192.5" r="2.5" fill="#EBBB14" opacity="0.7"/>
|
||||
<text x="652" y="196" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Refreshes model live</text>
|
||||
<circle cx="642" cy="209.5" r="2.5" fill="#EBBB14" opacity="0.7"/>
|
||||
<text x="652" y="213" font-family="'Segoe UI', Arial, sans-serif" font-size="10.5" fill="#8b949e">Report updates in real time</text>
|
||||
|
||||
<!-- ==================== FORWARD ARROW 1: Node 1 to Node 2 ==================== -->
|
||||
<line x1="234" y1="170" x2="317" y2="170" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.6"/>
|
||||
<polygon points="321,170 313,165 313,175" fill="#F2C811" fill-opacity="0.6"/>
|
||||
<text x="277" y="158" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#F2C811" text-anchor="middle" fill-opacity="0.9">CLI commands</text>
|
||||
<rect x="247" y="174" width="60" height="14" rx="7" fill="#06d6a0" fill-opacity="0.12" stroke="#06d6a0" stroke-width="0.8"/>
|
||||
<text x="277" y="184" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#06d6a0" text-anchor="middle">~30 tokens</text>
|
||||
|
||||
<!-- ==================== FORWARD ARROW 2: Node 2 to Node 3 ==================== -->
|
||||
<line x1="529" y1="170" x2="612" y2="170" stroke="#F2C811" stroke-width="2" stroke-dasharray="6,4" stroke-opacity="0.6"/>
|
||||
<polygon points="616,170 608,165 608,175" fill="#F2C811" fill-opacity="0.6"/>
|
||||
<text x="572" y="158" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#F2C811" text-anchor="middle" fill-opacity="0.9">TMDL + PBIR files</text>
|
||||
<rect x="537" y="174" width="70" height="14" rx="7" fill="#58a6ff" fill-opacity="0.12" stroke="#58a6ff" stroke-width="0.8"/>
|
||||
<text x="572" y="184" font-family="'Segoe UI', Arial, sans-serif" font-size="9" fill="#58a6ff" text-anchor="middle">auto-detected</text>
|
||||
|
||||
<!-- ==================== RETURN LOOP ARROW ==================== -->
|
||||
<path d="M 820,255 C 820,305 720,320 425,320 C 130,320 30,305 30,255"
|
||||
fill="none" stroke="#F2C811" stroke-width="1.5" stroke-dasharray="6,4" stroke-opacity="0.4"/>
|
||||
<polygon points="30,255 25,265 35,265" fill="#F2C811" fill-opacity="0.4"/>
|
||||
<text x="425" y="338" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="#F2C811" text-anchor="middle" fill-opacity="0.6">reads updated model + report · loop continues</text>
|
||||
|
||||
<!-- ==================== VIBE BI BADGE ==================== -->
|
||||
<text x="425" y="375" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="#8b949e" text-anchor="middle">Powered by VIBE BI · Vibe-Driven Business Intelligence</text>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 22 KiB |
|
|
@ -1,958 +0,0 @@
|
|||
# Tier 1 Gap-Fill: cardVisual, actionButton, Page Properties, Container Objects
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Add the four highest-priority features discovered from Supply Chain Analytics .pbip export: `cardVisual` and `actionButton` visual types, page background/visibility controls, and `visualContainerObjects` setters for border/background/title.
|
||||
|
||||
**Architecture:** All changes follow the existing pure-function pattern -- `fn(definition_path: Path, ...) -> dict[str, Any]`. Visual types extend `pbir_models.py` and `visual_backend.py` plus add JSON templates and preview renderer entries. Page and container props are new functions in `report_backend.py` and `visual_backend.py` respectively, each wired to a Click subcommand.
|
||||
|
||||
**Tech Stack:** Python 3.10+, pytest, ruff, click, JSON file I/O (no new dependencies).
|
||||
|
||||
---
|
||||
|
||||
## File Map
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
| `src/pbi_cli/core/pbir_models.py` | Add `cardVisual`, `actionButton` to `SUPPORTED_VISUAL_TYPES` and `VISUAL_TYPE_ALIASES` |
|
||||
| `src/pbi_cli/core/visual_backend.py` | Add entries for both types to `VISUAL_DATA_ROLES`, `MEASURE_ROLES`, `ROLE_ALIASES`, `DEFAULT_SIZES`; add `visual_set_container()` |
|
||||
| `src/pbi_cli/templates/visuals/cardVisual.json` | **New** template with `queryState.Data` + `sortDefinition` + `visualContainerObjects` |
|
||||
| `src/pbi_cli/templates/visuals/actionButton.json` | **New** template with no `queryState`, top-level `howCreated` |
|
||||
| `src/pbi_cli/preview/renderer.py` | Add color/icon entries for both types |
|
||||
| `src/pbi_cli/core/report_backend.py` | Add `page_set_background()` and `page_set_visibility()` |
|
||||
| `src/pbi_cli/commands/report.py` | Add `set-background` and `set-visibility` subcommands |
|
||||
| `src/pbi_cli/commands/visual.py` | Add `set-container` subcommand |
|
||||
| `tests/test_visual_backend.py` | New tests for new types and `visual_set_container` |
|
||||
| `tests/test_report_backend.py` | New tests for `page_set_background` and `page_set_visibility` |
|
||||
| `src/pbi_cli/__init__.py` | Bump version `3.3.0` → `3.4.0` |
|
||||
| `pyproject.toml` | Bump version `3.3.0` → `3.4.0` |
|
||||
|
||||
---
|
||||
|
||||
## Task 1: Add cardVisual and actionButton Visual Types
|
||||
|
||||
### What to know
|
||||
|
||||
From the real Desktop export of Supply Chain Analytics:
|
||||
|
||||
- **cardVisual** (25 occurrences) is the modern card. Its queryState uses a `"Data"` role (not `"Fields"`). It also has a top-level `sortDefinition` in `query` and a `visualContainerObjects` key alongside `visual.objects`.
|
||||
- **actionButton** (25 occurrences) is a navigation/action button. It has **no `query`/`queryState`** at all. It requires a top-level `"howCreated": "InsertVisualButton"` field.
|
||||
- Both types were previously absent from `SUPPORTED_VISUAL_TYPES`, causing `visual_add cardVisual` to raise `VisualTypeError`.
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/pbi_cli/core/pbir_models.py`
|
||||
- Modify: `src/pbi_cli/core/visual_backend.py`
|
||||
- Create: `src/pbi_cli/templates/visuals/cardVisual.json`
|
||||
- Create: `src/pbi_cli/templates/visuals/actionButton.json`
|
||||
- Modify: `src/pbi_cli/preview/renderer.py`
|
||||
- Modify: `tests/test_visual_backend.py`
|
||||
|
||||
---
|
||||
|
||||
- [ ] **Step 1a: Write failing tests for cardVisual and actionButton**
|
||||
|
||||
Add these tests at the bottom of `tests/test_visual_backend.py` (after the existing imports, extend the import list to include nothing new -- `visual_add` and `visual_list` are already imported):
|
||||
|
||||
```python
|
||||
# ---------------------------------------------------------------------------
|
||||
# Task 1 tests -- cardVisual and actionButton
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_visual_add_card_visual(report_with_page: Path) -> None:
|
||||
result = visual_add(
|
||||
report_with_page, "test_page", "cardVisual", x=10, y=10
|
||||
)
|
||||
assert result["status"] == "created"
|
||||
assert result["visual_type"] == "cardVisual"
|
||||
vdir = report_with_page / "pages" / "test_page" / "visuals" / result["name"]
|
||||
vfile = vdir / "visual.json"
|
||||
data = json.loads(vfile.read_text())
|
||||
assert data["visual"]["visualType"] == "cardVisual"
|
||||
assert "Data" in data["visual"]["query"]["queryState"]
|
||||
assert "sortDefinition" in data["visual"]["query"]
|
||||
assert "visualContainerObjects" in data["visual"]
|
||||
|
||||
|
||||
def test_visual_add_card_visual_alias(report_with_page: Path) -> None:
|
||||
result = visual_add(
|
||||
report_with_page, "test_page", "card_visual", x=10, y=10
|
||||
)
|
||||
assert result["visual_type"] == "cardVisual"
|
||||
|
||||
|
||||
def test_visual_add_action_button(report_with_page: Path) -> None:
|
||||
result = visual_add(
|
||||
report_with_page, "test_page", "actionButton", x=0, y=0
|
||||
)
|
||||
assert result["status"] == "created"
|
||||
assert result["visual_type"] == "actionButton"
|
||||
vdir = report_with_page / "pages" / "test_page" / "visuals" / result["name"]
|
||||
data = json.loads((vdir / "visual.json").read_text())
|
||||
assert data["visual"]["visualType"] == "actionButton"
|
||||
# No queryState on actionButton
|
||||
assert "query" not in data["visual"]
|
||||
assert data.get("howCreated") == "InsertVisualButton"
|
||||
|
||||
|
||||
def test_visual_add_action_button_aliases(report_with_page: Path) -> None:
|
||||
for alias in ("action_button", "button"):
|
||||
result = visual_add(
|
||||
report_with_page, "test_page", alias, x=0, y=0
|
||||
)
|
||||
assert result["visual_type"] == "actionButton"
|
||||
```
|
||||
|
||||
- [ ] **Step 1b: Run tests to verify they fail**
|
||||
|
||||
```bash
|
||||
cd "e:/Coding Projects/Open Source/pbi-cli"
|
||||
python -m pytest tests/test_visual_backend.py::test_visual_add_card_visual tests/test_visual_backend.py::test_visual_add_action_button -v
|
||||
```
|
||||
|
||||
Expected: FAIL with `VisualTypeError` (type not in SUPPORTED_VISUAL_TYPES).
|
||||
|
||||
- [ ] **Step 1c: Update pbir_models.py**
|
||||
|
||||
In `src/pbi_cli/core/pbir_models.py`:
|
||||
|
||||
Add `"cardVisual"` and `"actionButton"` to the `SUPPORTED_VISUAL_TYPES` frozenset (in the v3.1.0 additions block or add a new `# v3.4.0 additions` comment):
|
||||
|
||||
```python
|
||||
# v3.4.0 additions
|
||||
"cardVisual",
|
||||
"actionButton",
|
||||
```
|
||||
|
||||
Add to `VISUAL_TYPE_ALIASES` dict:
|
||||
|
||||
```python
|
||||
# v3.4.0 additions
|
||||
"card_visual": "cardVisual",
|
||||
"modern_card": "cardVisual",
|
||||
"action_button": "actionButton",
|
||||
"button": "actionButton",
|
||||
```
|
||||
|
||||
- [ ] **Step 1d: Update visual_backend.py**
|
||||
|
||||
In `src/pbi_cli/core/visual_backend.py`:
|
||||
|
||||
Add to `VISUAL_DATA_ROLES`:
|
||||
```python
|
||||
# v3.4.0 additions
|
||||
"cardVisual": ["Data"],
|
||||
"actionButton": [],
|
||||
```
|
||||
|
||||
Add `"Data"` to `MEASURE_ROLES` frozenset (cardVisual's Data role accepts measures):
|
||||
```python
|
||||
MEASURE_ROLES: frozenset[str] = frozenset({
|
||||
"Y", "Values", "Fields", "Indicator", "Goal",
|
||||
# v3.1.0 additions
|
||||
"ColumnY", "LineY", "X", "Size",
|
||||
# v3.4.0 additions
|
||||
"Data",
|
||||
})
|
||||
```
|
||||
|
||||
Add to `ROLE_ALIASES`:
|
||||
```python
|
||||
# v3.4.0 additions
|
||||
"cardVisual": {"field": "Data", "value": "Data"},
|
||||
"actionButton": {},
|
||||
```
|
||||
|
||||
Add to `DEFAULT_SIZES`:
|
||||
```python
|
||||
# v3.4.0 additions -- sizes from real Desktop export
|
||||
"cardVisual": (217, 87),
|
||||
"actionButton": (51, 22),
|
||||
```
|
||||
|
||||
- [ ] **Step 1e: Create cardVisual.json template**
|
||||
|
||||
Create `src/pbi_cli/templates/visuals/cardVisual.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.5.0/schema.json",
|
||||
"name": "__VISUAL_NAME__",
|
||||
"position": {
|
||||
"x": __X__,
|
||||
"y": __Y__,
|
||||
"z": __Z__,
|
||||
"height": __HEIGHT__,
|
||||
"width": __WIDTH__,
|
||||
"tabOrder": __TAB_ORDER__
|
||||
},
|
||||
"visual": {
|
||||
"visualType": "cardVisual",
|
||||
"query": {
|
||||
"queryState": {
|
||||
"Data": {
|
||||
"projections": []
|
||||
}
|
||||
},
|
||||
"sortDefinition": {
|
||||
"sort": [],
|
||||
"isDefaultSort": true
|
||||
}
|
||||
},
|
||||
"objects": {},
|
||||
"visualContainerObjects": {},
|
||||
"drillFilterOtherVisuals": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 1f: Create actionButton.json template**
|
||||
|
||||
Create `src/pbi_cli/templates/visuals/actionButton.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.5.0/schema.json",
|
||||
"name": "__VISUAL_NAME__",
|
||||
"position": {
|
||||
"x": __X__,
|
||||
"y": __Y__,
|
||||
"z": __Z__,
|
||||
"height": __HEIGHT__,
|
||||
"width": __WIDTH__,
|
||||
"tabOrder": __TAB_ORDER__
|
||||
},
|
||||
"visual": {
|
||||
"visualType": "actionButton",
|
||||
"objects": {},
|
||||
"visualContainerObjects": {},
|
||||
"drillFilterOtherVisuals": true
|
||||
},
|
||||
"howCreated": "InsertVisualButton"
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 1g: Update preview renderer**
|
||||
|
||||
In `src/pbi_cli/preview/renderer.py`, add to `_VISUAL_COLORS` after the v3.1.0 block:
|
||||
|
||||
```python
|
||||
# v3.4.0 additions
|
||||
"cardVisual": "#767171",
|
||||
"actionButton": "#E8832A",
|
||||
```
|
||||
|
||||
Add to `_VISUAL_ICONS` after the v3.1.0 block:
|
||||
|
||||
```python
|
||||
# v3.4.0 additions
|
||||
"cardVisual": "■",
|
||||
"actionButton": "▶",
|
||||
```
|
||||
|
||||
- [ ] **Step 1h: Run tests to verify they pass**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_visual_backend.py::test_visual_add_card_visual tests/test_visual_backend.py::test_visual_add_card_visual_alias tests/test_visual_backend.py::test_visual_add_action_button tests/test_visual_backend.py::test_visual_add_action_button_aliases -v
|
||||
```
|
||||
|
||||
Expected: all PASS.
|
||||
|
||||
- [ ] **Step 1i: Run full test suite and ruff**
|
||||
|
||||
```bash
|
||||
python -m pytest -m "not e2e" -q
|
||||
python -m ruff check src/ tests/
|
||||
```
|
||||
|
||||
Expected: zero failures, zero ruff errors.
|
||||
|
||||
- [ ] **Step 1j: Commit**
|
||||
|
||||
```bash
|
||||
cd "e:/Coding Projects/Open Source/pbi-cli"
|
||||
git add src/pbi_cli/core/pbir_models.py src/pbi_cli/core/visual_backend.py
|
||||
git add src/pbi_cli/templates/visuals/cardVisual.json src/pbi_cli/templates/visuals/actionButton.json
|
||||
git add src/pbi_cli/preview/renderer.py tests/test_visual_backend.py
|
||||
git commit -m "feat: add cardVisual and actionButton visual types (v3.4.0)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: page_set_background
|
||||
|
||||
### What to know
|
||||
|
||||
`page.json` has an optional top-level `"objects"` key. When a background color is set in Desktop, it writes:
|
||||
|
||||
```json
|
||||
"objects": {
|
||||
"background": [
|
||||
{
|
||||
"properties": {
|
||||
"color": {
|
||||
"solid": {
|
||||
"color": {
|
||||
"expr": {
|
||||
"Literal": {"Value": "'#F8F9FA'"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
The function merges this into the existing `objects` dict (preserving any other object properties like `outspace`).
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/pbi_cli/core/report_backend.py`
|
||||
- Modify: `src/pbi_cli/commands/report.py`
|
||||
- Modify: `tests/test_report_backend.py`
|
||||
|
||||
---
|
||||
|
||||
- [ ] **Step 2a: Write failing tests**
|
||||
|
||||
Add to the imports in `tests/test_report_backend.py`:
|
||||
```python
|
||||
from pbi_cli.core.report_backend import (
|
||||
page_set_background,
|
||||
page_set_visibility,
|
||||
... # keep existing imports
|
||||
)
|
||||
```
|
||||
|
||||
Add tests:
|
||||
|
||||
```python
|
||||
# ---------------------------------------------------------------------------
|
||||
# Task 2 -- page_set_background
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_page_set_background_writes_color(sample_report: Path) -> None:
|
||||
# sample_report fixture already has a page named "page1"
|
||||
result = page_set_background(sample_report, "page1", "#F8F9FA")
|
||||
assert result["status"] == "updated"
|
||||
assert result["background_color"] == "#F8F9FA"
|
||||
page_data = _read(sample_report / "pages" / "page1" / "page.json")
|
||||
bg = page_data["objects"]["background"][0]["properties"]["color"]
|
||||
assert bg["solid"]["color"]["expr"]["Literal"]["Value"] == "'#F8F9FA'"
|
||||
|
||||
|
||||
def test_page_set_background_preserves_other_objects(sample_report: Path) -> None:
|
||||
# Manually set an existing object key first
|
||||
page_json = sample_report / "pages" / "page1" / "page.json"
|
||||
data = _read(page_json)
|
||||
data["objects"] = {"outspace": [{"properties": {"color": {}}}]}
|
||||
page_json.write_text(json.dumps(data, indent=2), encoding="utf-8")
|
||||
|
||||
page_set_background(sample_report, "page1", "#FFFFFF")
|
||||
|
||||
updated = _read(page_json)
|
||||
assert "outspace" in updated["objects"]
|
||||
assert "background" in updated["objects"]
|
||||
|
||||
|
||||
def test_page_set_background_overrides_existing_background(sample_report: Path) -> None:
|
||||
page_set_background(sample_report, "page1", "#111111")
|
||||
page_set_background(sample_report, "page1", "#AABBCC")
|
||||
data = _read(sample_report / "pages" / "page1" / "page.json")
|
||||
bg = data["objects"]["background"][0]["properties"]["color"]
|
||||
assert bg["solid"]["color"]["expr"]["Literal"]["Value"] == "'#AABBCC'"
|
||||
|
||||
|
||||
def test_page_set_background_raises_for_missing_page(sample_report: Path) -> None:
|
||||
with pytest.raises(PbiCliError, match="not found"):
|
||||
page_set_background(sample_report, "no_such_page", "#000000")
|
||||
```
|
||||
|
||||
- [ ] **Step 2b: Run to verify tests fail**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_report_backend.py::test_page_set_background_writes_color -v
|
||||
```
|
||||
|
||||
Expected: FAIL with `ImportError` (function not yet defined).
|
||||
|
||||
- [ ] **Step 2c: Implement page_set_background in report_backend.py**
|
||||
|
||||
Add after `page_get()`:
|
||||
|
||||
```python
|
||||
def page_set_background(
|
||||
definition_path: Path,
|
||||
page_name: str,
|
||||
color: str,
|
||||
) -> dict[str, Any]:
|
||||
"""Set the background color of a page.
|
||||
|
||||
Updates the ``objects.background`` property in ``page.json``.
|
||||
The color must be a hex string, e.g. ``'#F8F9FA'``.
|
||||
"""
|
||||
page_dir = get_page_dir(definition_path, page_name)
|
||||
page_json_path = page_dir / "page.json"
|
||||
if not page_json_path.exists():
|
||||
raise PbiCliError(f"Page '{page_name}' not found.")
|
||||
|
||||
page_data = _read_json(page_json_path)
|
||||
background_entry = {
|
||||
"properties": {
|
||||
"color": {
|
||||
"solid": {
|
||||
"color": {
|
||||
"expr": {
|
||||
"Literal": {"Value": f"'{color}'"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
objects = {**page_data.get("objects", {}), "background": [background_entry]}
|
||||
_write_json(page_json_path, {**page_data, "objects": objects})
|
||||
return {"status": "updated", "page": page_name, "background_color": color}
|
||||
```
|
||||
|
||||
- [ ] **Step 2d: Add set-background CLI command in report.py**
|
||||
|
||||
Add after the `diff_theme` command:
|
||||
|
||||
```python
|
||||
@report.command(name="set-background")
|
||||
@click.argument("page_name")
|
||||
@click.option("--color", "-c", required=True, help="Hex color e.g. '#F8F9FA'.")
|
||||
@click.pass_context
|
||||
@pass_context
|
||||
def set_background(
|
||||
ctx: PbiContext, click_ctx: click.Context, page_name: str, color: str
|
||||
) -> None:
|
||||
"""Set the background color of a page."""
|
||||
from pbi_cli.core.pbir_path import resolve_report_path
|
||||
from pbi_cli.core.report_backend import page_set_background
|
||||
|
||||
report_path = click_ctx.parent.obj.get("report_path") if click_ctx.parent else None
|
||||
definition_path = resolve_report_path(report_path)
|
||||
run_command(
|
||||
ctx,
|
||||
page_set_background,
|
||||
definition_path=definition_path,
|
||||
page_name=page_name,
|
||||
color=color,
|
||||
)
|
||||
```
|
||||
|
||||
- [ ] **Step 2e: Run tests to verify they pass**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_report_backend.py -k "background" -v
|
||||
```
|
||||
|
||||
Expected: all 4 PASS.
|
||||
|
||||
- [ ] **Step 2f: Run full suite + ruff**
|
||||
|
||||
```bash
|
||||
python -m pytest -m "not e2e" -q && python -m ruff check src/ tests/
|
||||
```
|
||||
|
||||
- [ ] **Step 2g: Commit**
|
||||
|
||||
```bash
|
||||
git add src/pbi_cli/core/report_backend.py src/pbi_cli/commands/report.py tests/test_report_backend.py
|
||||
git commit -m "feat: add page_set_background and pbi report set-background command"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 3: page_set_visibility
|
||||
|
||||
### What to know
|
||||
|
||||
Hidden pages in Desktop write a top-level `"visibility": "HiddenInViewMode"` key in `page.json`. To unhide, the key is simply removed. The real Supply Chain report has one hidden page (`definition` folder was confirmed to have `"visibility": "HiddenInViewMode"` on that page).
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/pbi_cli/core/report_backend.py` (add function, add to import in test)
|
||||
- Modify: `src/pbi_cli/commands/report.py` (add subcommand)
|
||||
- Modify: `tests/test_report_backend.py` (add tests)
|
||||
|
||||
---
|
||||
|
||||
- [ ] **Step 3a: Write failing tests**
|
||||
|
||||
```python
|
||||
# ---------------------------------------------------------------------------
|
||||
# Task 3 -- page_set_visibility
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_page_set_visibility_hidden(sample_report: Path) -> None:
|
||||
result = page_set_visibility(sample_report, "page1", hidden=True)
|
||||
assert result["status"] == "updated"
|
||||
assert result["hidden"] is True
|
||||
data = _read(sample_report / "pages" / "page1" / "page.json")
|
||||
assert data.get("visibility") == "HiddenInViewMode"
|
||||
|
||||
|
||||
def test_page_set_visibility_visible(sample_report: Path) -> None:
|
||||
# First hide, then show
|
||||
page_json = sample_report / "pages" / "page1" / "page.json"
|
||||
data = _read(page_json)
|
||||
page_json.write_text(
|
||||
json.dumps({**data, "visibility": "HiddenInViewMode"}, indent=2),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
result = page_set_visibility(sample_report, "page1", hidden=False)
|
||||
assert result["hidden"] is False
|
||||
updated = _read(page_json)
|
||||
assert "visibility" not in updated
|
||||
|
||||
|
||||
def test_page_set_visibility_idempotent_visible(sample_report: Path) -> None:
|
||||
# Calling visible on an already-visible page should not add visibility key
|
||||
page_set_visibility(sample_report, "page1", hidden=False)
|
||||
data = _read(sample_report / "pages" / "page1" / "page.json")
|
||||
assert "visibility" not in data
|
||||
|
||||
|
||||
def test_page_set_visibility_raises_for_missing_page(sample_report: Path) -> None:
|
||||
with pytest.raises(PbiCliError, match="not found"):
|
||||
page_set_visibility(sample_report, "ghost_page", hidden=True)
|
||||
```
|
||||
|
||||
- [ ] **Step 3b: Run to verify failure**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_report_backend.py::test_page_set_visibility_hidden -v
|
||||
```
|
||||
|
||||
Expected: FAIL with `ImportError`.
|
||||
|
||||
- [ ] **Step 3c: Implement page_set_visibility in report_backend.py**
|
||||
|
||||
Add after `page_set_background()`:
|
||||
|
||||
```python
|
||||
def page_set_visibility(
|
||||
definition_path: Path,
|
||||
page_name: str,
|
||||
hidden: bool,
|
||||
) -> dict[str, Any]:
|
||||
"""Show or hide a page in the report navigation.
|
||||
|
||||
Setting ``hidden=True`` writes ``"visibility": "HiddenInViewMode"`` to
|
||||
``page.json``. Setting ``hidden=False`` removes the key if present.
|
||||
"""
|
||||
page_dir = get_page_dir(definition_path, page_name)
|
||||
page_json_path = page_dir / "page.json"
|
||||
if not page_json_path.exists():
|
||||
raise PbiCliError(f"Page '{page_name}' not found.")
|
||||
|
||||
page_data = _read_json(page_json_path)
|
||||
if hidden:
|
||||
updated = {**page_data, "visibility": "HiddenInViewMode"}
|
||||
else:
|
||||
updated = {k: v for k, v in page_data.items() if k != "visibility"}
|
||||
_write_json(page_json_path, updated)
|
||||
return {"status": "updated", "page": page_name, "hidden": hidden}
|
||||
```
|
||||
|
||||
- [ ] **Step 3d: Add set-visibility CLI command in report.py**
|
||||
|
||||
Add after `set_background`:
|
||||
|
||||
```python
|
||||
@report.command(name="set-visibility")
|
||||
@click.argument("page_name")
|
||||
@click.option(
|
||||
"--hidden/--visible",
|
||||
default=True,
|
||||
help="Hide or show the page in navigation.",
|
||||
)
|
||||
@click.pass_context
|
||||
@pass_context
|
||||
def set_visibility(
|
||||
ctx: PbiContext, click_ctx: click.Context, page_name: str, hidden: bool
|
||||
) -> None:
|
||||
"""Hide or show a page in the report navigation."""
|
||||
from pbi_cli.core.pbir_path import resolve_report_path
|
||||
from pbi_cli.core.report_backend import page_set_visibility
|
||||
|
||||
report_path = click_ctx.parent.obj.get("report_path") if click_ctx.parent else None
|
||||
definition_path = resolve_report_path(report_path)
|
||||
run_command(
|
||||
ctx,
|
||||
page_set_visibility,
|
||||
definition_path=definition_path,
|
||||
page_name=page_name,
|
||||
hidden=hidden,
|
||||
)
|
||||
```
|
||||
|
||||
- [ ] **Step 3e: Run tests**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_report_backend.py -k "visibility" -v
|
||||
```
|
||||
|
||||
Expected: all 4 PASS.
|
||||
|
||||
- [ ] **Step 3f: Run full suite + ruff**
|
||||
|
||||
```bash
|
||||
python -m pytest -m "not e2e" -q && python -m ruff check src/ tests/
|
||||
```
|
||||
|
||||
- [ ] **Step 3g: Commit**
|
||||
|
||||
```bash
|
||||
git add src/pbi_cli/core/report_backend.py src/pbi_cli/commands/report.py tests/test_report_backend.py
|
||||
git commit -m "feat: add page_set_visibility and pbi report set-visibility command"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 4: visual_set_container (visualContainerObjects)
|
||||
|
||||
### What to know
|
||||
|
||||
`visual.json` contains a `visual.visualContainerObjects` dict that controls border, background, title, and padding at the *container* level (separate from `visual.objects` which controls visual-internal formatting). From the real Desktop export, the schema is:
|
||||
|
||||
```json
|
||||
"visualContainerObjects": {
|
||||
"border": [{"properties": {"show": {"expr": {"Literal": {"Value": "false"}}}}}],
|
||||
"background": [{"properties": {"show": {"expr": {"Literal": {"Value": "false"}}}}}],
|
||||
"title": [{"properties": {"text": {"expr": {"Literal": {"Value": "'My Title'"}}}}}]
|
||||
}
|
||||
```
|
||||
|
||||
The function accepts keyword arguments for `border_show`, `background_show`, and `title`. It merges only the provided keys into the existing `visualContainerObjects`, leaving others unchanged. All updates are immutable (build new dicts, never mutate).
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/pbi_cli/core/visual_backend.py` (add function)
|
||||
- Modify: `src/pbi_cli/commands/visual.py` (add subcommand)
|
||||
- Modify: `tests/test_visual_backend.py` (add tests)
|
||||
|
||||
---
|
||||
|
||||
- [ ] **Step 4a: Write failing tests**
|
||||
|
||||
Add to `tests/test_visual_backend.py` imports:
|
||||
```python
|
||||
from pbi_cli.core.visual_backend import (
|
||||
visual_add,
|
||||
visual_bind,
|
||||
visual_delete,
|
||||
visual_get,
|
||||
visual_list,
|
||||
visual_set_container,
|
||||
visual_update,
|
||||
)
|
||||
```
|
||||
|
||||
Add tests:
|
||||
|
||||
```python
|
||||
# ---------------------------------------------------------------------------
|
||||
# Task 4 -- visual_set_container
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@pytest.fixture
|
||||
def page_with_bar_visual(report_with_page: Path) -> tuple[Path, str]:
|
||||
"""Returns (definition_path, visual_name) for a barChart visual."""
|
||||
result = visual_add(report_with_page, "test_page", "barChart", x=0, y=0)
|
||||
return report_with_page, result["name"]
|
||||
|
||||
|
||||
def test_visual_set_container_border_hide(
|
||||
page_with_bar_visual: tuple[Path, str],
|
||||
) -> None:
|
||||
defn, vname = page_with_bar_visual
|
||||
result = visual_set_container(defn, "test_page", vname, border_show=False)
|
||||
assert result["status"] == "updated"
|
||||
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
|
||||
data = json.loads(vfile.read_text())
|
||||
border = data["visual"]["visualContainerObjects"]["border"]
|
||||
val = border[0]["properties"]["show"]["expr"]["Literal"]["Value"]
|
||||
assert val == "false"
|
||||
|
||||
|
||||
def test_visual_set_container_background_hide(
|
||||
page_with_bar_visual: tuple[Path, str],
|
||||
) -> None:
|
||||
defn, vname = page_with_bar_visual
|
||||
visual_set_container(defn, "test_page", vname, background_show=False)
|
||||
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
|
||||
data = json.loads(vfile.read_text())
|
||||
bg = data["visual"]["visualContainerObjects"]["background"]
|
||||
val = bg[0]["properties"]["show"]["expr"]["Literal"]["Value"]
|
||||
assert val == "false"
|
||||
|
||||
|
||||
def test_visual_set_container_title_text(
|
||||
page_with_bar_visual: tuple[Path, str],
|
||||
) -> None:
|
||||
defn, vname = page_with_bar_visual
|
||||
visual_set_container(defn, "test_page", vname, title="Revenue by Month")
|
||||
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
|
||||
data = json.loads(vfile.read_text())
|
||||
title = data["visual"]["visualContainerObjects"]["title"]
|
||||
val = title[0]["properties"]["text"]["expr"]["Literal"]["Value"]
|
||||
assert val == "'Revenue by Month'"
|
||||
|
||||
|
||||
def test_visual_set_container_preserves_other_keys(
|
||||
page_with_bar_visual: tuple[Path, str],
|
||||
) -> None:
|
||||
defn, vname = page_with_bar_visual
|
||||
visual_set_container(defn, "test_page", vname, border_show=False)
|
||||
visual_set_container(defn, "test_page", vname, title="My Chart")
|
||||
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
|
||||
data = json.loads(vfile.read_text())
|
||||
vco = data["visual"]["visualContainerObjects"]
|
||||
assert "border" in vco
|
||||
assert "title" in vco
|
||||
|
||||
|
||||
def test_visual_set_container_border_show(
|
||||
page_with_bar_visual: tuple[Path, str],
|
||||
) -> None:
|
||||
defn, vname = page_with_bar_visual
|
||||
visual_set_container(defn, "test_page", vname, border_show=True)
|
||||
vfile = defn / "pages" / "test_page" / "visuals" / vname / "visual.json"
|
||||
data = json.loads(vfile.read_text())
|
||||
val = data["visual"]["visualContainerObjects"]["border"][0][
|
||||
"properties"]["show"]["expr"]["Literal"]["Value"]
|
||||
assert val == "true"
|
||||
|
||||
|
||||
def test_visual_set_container_raises_for_missing_visual(
|
||||
report_with_page: Path,
|
||||
) -> None:
|
||||
with pytest.raises(PbiCliError):
|
||||
visual_set_container(
|
||||
report_with_page, "test_page", "nonexistent_visual", border_show=False
|
||||
)
|
||||
```
|
||||
|
||||
- [ ] **Step 4b: Run to verify failure**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_visual_backend.py::test_visual_set_container_border_hide -v
|
||||
```
|
||||
|
||||
Expected: FAIL with `ImportError`.
|
||||
|
||||
- [ ] **Step 4c: Implement visual_set_container in visual_backend.py**
|
||||
|
||||
Add after `visual_update()`:
|
||||
|
||||
```python
|
||||
def visual_set_container(
|
||||
definition_path: Path,
|
||||
page_name: str,
|
||||
visual_name: str,
|
||||
border_show: bool | None = None,
|
||||
background_show: bool | None = None,
|
||||
title: str | None = None,
|
||||
) -> dict[str, Any]:
|
||||
"""Set container-level properties (border, background, title) on a visual.
|
||||
|
||||
Only the keyword arguments that are provided (not None) are updated.
|
||||
Other ``visualContainerObjects`` keys are preserved unchanged.
|
||||
|
||||
The ``visualContainerObjects`` key is separate from ``visual.objects`` --
|
||||
it controls the container chrome (border, background, header title) rather
|
||||
than the visual's own formatting.
|
||||
"""
|
||||
visual_dir = get_visual_dir(definition_path, page_name, visual_name)
|
||||
visual_json_path = visual_dir / "visual.json"
|
||||
if not visual_json_path.exists():
|
||||
raise PbiCliError(
|
||||
f"Visual '{visual_name}' not found on page '{page_name}'."
|
||||
)
|
||||
|
||||
data = _read_json(visual_json_path)
|
||||
visual = data["visual"]
|
||||
vco: dict[str, Any] = dict(visual.get("visualContainerObjects", {}))
|
||||
|
||||
def _bool_entry(value: bool) -> list[dict[str, Any]]:
|
||||
return [{
|
||||
"properties": {
|
||||
"show": {
|
||||
"expr": {"Literal": {"Value": str(value).lower()}}
|
||||
}
|
||||
}
|
||||
}]
|
||||
|
||||
if border_show is not None:
|
||||
vco = {**vco, "border": _bool_entry(border_show)}
|
||||
if background_show is not None:
|
||||
vco = {**vco, "background": _bool_entry(background_show)}
|
||||
if title is not None:
|
||||
vco = {**vco, "title": [{
|
||||
"properties": {
|
||||
"text": {
|
||||
"expr": {"Literal": {"Value": f"'{title}'"}}
|
||||
}
|
||||
}
|
||||
}]}
|
||||
|
||||
updated_visual = {**visual, "visualContainerObjects": vco}
|
||||
_write_json(visual_json_path, {**data, "visual": updated_visual})
|
||||
|
||||
return {
|
||||
"status": "updated",
|
||||
"visual": visual_name,
|
||||
"page": page_name,
|
||||
"border_show": border_show,
|
||||
"background_show": background_show,
|
||||
"title": title,
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4d: Add set-container CLI command in visual.py**
|
||||
|
||||
Look at the existing pattern in `src/pbi_cli/commands/visual.py` for how commands use `--page` and a `NAME` argument. Add:
|
||||
|
||||
```python
|
||||
@visual.command(name="set-container")
|
||||
@click.argument("name")
|
||||
@click.option("--page", "-g", required=True, help="Page name or display name.")
|
||||
@click.option(
|
||||
"--border-show/--border-hide",
|
||||
default=None,
|
||||
is_flag=False,
|
||||
flag_value=None,
|
||||
help="Show or hide the visual border.",
|
||||
)
|
||||
@click.option(
|
||||
"--background-show/--background-hide",
|
||||
default=None,
|
||||
is_flag=False,
|
||||
flag_value=None,
|
||||
help="Show or hide the visual background.",
|
||||
)
|
||||
@click.option("--title", default=None, help="Set container title text.")
|
||||
@pass_context
|
||||
def set_container(
|
||||
ctx: PbiContext,
|
||||
name: str,
|
||||
page: str,
|
||||
border_show: bool | None,
|
||||
background_show: bool | None,
|
||||
title: str | None,
|
||||
) -> None:
|
||||
"""Set container-level border, background, or title on a visual."""
|
||||
from pbi_cli.core.pbir_path import resolve_report_path
|
||||
from pbi_cli.core.visual_backend import visual_set_container
|
||||
|
||||
definition_path = resolve_report_path(None)
|
||||
run_command(
|
||||
ctx,
|
||||
visual_set_container,
|
||||
definition_path=definition_path,
|
||||
page_name=page,
|
||||
visual_name=name,
|
||||
border_show=border_show,
|
||||
background_show=background_show,
|
||||
title=title,
|
||||
)
|
||||
```
|
||||
|
||||
Note: Click's `--flag/--no-flag` with `default=None` requires a small workaround. Check how the existing `visual.py` handles similar boolean flags (e.g. `--hidden/--visible` in `visual_update`). Mirror that pattern exactly.
|
||||
|
||||
- [ ] **Step 4e: Run tests**
|
||||
|
||||
```bash
|
||||
python -m pytest tests/test_visual_backend.py -k "container" -v
|
||||
```
|
||||
|
||||
Expected: all 6 PASS.
|
||||
|
||||
- [ ] **Step 4f: Run full suite + ruff**
|
||||
|
||||
```bash
|
||||
python -m pytest -m "not e2e" -q && python -m ruff check src/ tests/
|
||||
```
|
||||
|
||||
- [ ] **Step 4g: Commit**
|
||||
|
||||
```bash
|
||||
git add src/pbi_cli/core/visual_backend.py src/pbi_cli/commands/visual.py tests/test_visual_backend.py
|
||||
git commit -m "feat: add visual_set_container and pbi visual set-container command"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 5: Version Bump to 3.4.0
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/pbi_cli/__init__.py`
|
||||
- Modify: `pyproject.toml`
|
||||
|
||||
---
|
||||
|
||||
- [ ] **Step 5a: Bump versions**
|
||||
|
||||
In `src/pbi_cli/__init__.py`, change:
|
||||
```python
|
||||
__version__ = "3.3.0"
|
||||
```
|
||||
to:
|
||||
```python
|
||||
__version__ = "3.4.0"
|
||||
```
|
||||
|
||||
In `pyproject.toml`, change:
|
||||
```toml
|
||||
version = "3.3.0"
|
||||
```
|
||||
to:
|
||||
```toml
|
||||
version = "3.4.0"
|
||||
```
|
||||
|
||||
- [ ] **Step 5b: Verify final test count and coverage**
|
||||
|
||||
```bash
|
||||
python -m pytest -m "not e2e" -v --tb=short 2>&1 | tail -20
|
||||
```
|
||||
|
||||
Expected: 420+ tests passing (397 before + ~23 new), zero failures.
|
||||
|
||||
- [ ] **Step 5c: Final ruff check**
|
||||
|
||||
```bash
|
||||
python -m ruff check src/ tests/
|
||||
```
|
||||
|
||||
Expected: no output (clean).
|
||||
|
||||
- [ ] **Step 5d: Commit**
|
||||
|
||||
```bash
|
||||
git add src/pbi_cli/__init__.py pyproject.toml
|
||||
git commit -m "chore: bump version to 3.4.0"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verification Summary
|
||||
|
||||
After all tasks complete:
|
||||
|
||||
```bash
|
||||
# All tests pass
|
||||
python -m pytest -m "not e2e" -q
|
||||
|
||||
# CLI smoke tests
|
||||
pbi visual add cardVisual --page p1 --x 10 --y 10 # succeeds
|
||||
pbi visual add actionButton --page p1 --x 0 --y 0 # succeeds, no query
|
||||
pbi report set-background page1 --color '#F8F9FA' # updates objects.background
|
||||
pbi report set-visibility page1 --hidden # adds visibility key
|
||||
pbi report set-visibility page1 --visible # removes visibility key
|
||||
pbi visual set-container Chart1 --page p1 --border-hide # sets border show=false
|
||||
pbi visual set-container Chart1 --page p1 --title "Revenue" # sets title text
|
||||
```
|
||||
|
|
@ -1,187 +0,0 @@
|
|||
"""
|
||||
Generate 4K marketing PNG images for pbi-cli.
|
||||
|
||||
Each feature SVG already has the Vibe BI header baked in.
|
||||
This script:
|
||||
1. Reads each feature SVG as-is
|
||||
2. Adds a footer with mina-saad.com/pbi-cli
|
||||
3. Renders at 4K width (3840px) via Playwright
|
||||
4. Saves as PNG to marketing/images/
|
||||
"""
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
ASSETS_DIR = Path(__file__).parent.parent / "assets"
|
||||
OUTPUT_DIR = Path(__file__).parent / "images"
|
||||
TARGET_WIDTH = 3840 # 4K width
|
||||
|
||||
# Feature SVGs to process (filename -> output name)
|
||||
FEATURE_SVGS = {
|
||||
"before-after.svg": "before-after",
|
||||
"architecture-flow.svg": "architecture-flow",
|
||||
"backup-restore.svg": "backup-restore",
|
||||
"bulk-operations.svg": "bulk-operations",
|
||||
"chat-demo.svg": "chat-demo",
|
||||
"dax-debugging.svg": "dax-debugging",
|
||||
"feature-grid.svg": "feature-grid",
|
||||
"model-health-check.svg": "model-health-check",
|
||||
"rls-testing.svg": "rls-testing",
|
||||
"skills-hub.svg": "skills-hub",
|
||||
"token-cost.svg": "token-cost",
|
||||
"how-it-works.svg": "how-it-works",
|
||||
"dax-skill.svg": "dax-skill",
|
||||
"modeling-skill.svg": "modeling-skill",
|
||||
"deploy-secure.svg": "deploy-secure",
|
||||
"docs-diagnostics.svg": "docs-diagnostics",
|
||||
"cta-start.svg": "cta-start",
|
||||
# Report layer (v3)
|
||||
"report-layer.svg": "report-layer",
|
||||
"dual-layer.svg": "dual-layer",
|
||||
"visual-types.svg": "visual-types",
|
||||
"report-workflow.svg": "report-workflow",
|
||||
"auto-sync.svg": "auto-sync",
|
||||
"chat-demo-report.svg": "chat-demo-report",
|
||||
# Additional assets
|
||||
"commands.svg": "commands",
|
||||
"layers.svg": "layers",
|
||||
"release-vibe-bi.svg": "release-vibe-bi",
|
||||
"stats.svg": "stats",
|
||||
"workflow.svg": "workflow",
|
||||
}
|
||||
|
||||
FOOTER_HEIGHT = 60
|
||||
SVG_WIDTH = 850
|
||||
|
||||
|
||||
def read_svg_content(filepath: Path) -> str:
|
||||
return filepath.read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def get_svg_height(svg_text: str) -> int:
|
||||
"""Extract height from SVG viewBox or height attribute."""
|
||||
match = re.search(r'viewBox="0 0 \d+ (\d+)"', svg_text)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
match = re.search(r'height="(\d+)"', svg_text)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
return 400
|
||||
|
||||
|
||||
def extract_svg_inner(svg_text: str) -> str:
|
||||
"""Extract everything between <svg ...> and </svg> tags."""
|
||||
inner = re.sub(r"<\?xml[^>]*\?>\s*", "", svg_text)
|
||||
inner = re.sub(r"<svg[^>]*>", "", inner, count=1)
|
||||
inner = re.sub(r"</svg>\s*$", "", inner)
|
||||
return inner
|
||||
|
||||
|
||||
def extract_defs(svg_text: str) -> str:
|
||||
"""Extract <defs>...</defs> block if present."""
|
||||
match = re.search(r"<defs>.*?</defs>", svg_text, re.DOTALL)
|
||||
return match.group(0) if match else ""
|
||||
|
||||
|
||||
def build_final_svg(feature_svg: str, feature_height: int) -> str:
|
||||
"""Build final SVG: feature content (with baked header) + footer."""
|
||||
total_height = feature_height + FOOTER_HEIGHT
|
||||
|
||||
feature_inner = extract_svg_inner(feature_svg)
|
||||
feature_defs = extract_defs(feature_svg)
|
||||
# Remove defs from inner since we place them at top level
|
||||
feature_inner_clean = re.sub(
|
||||
r"<defs>.*?</defs>", "", feature_inner, flags=re.DOTALL
|
||||
)
|
||||
|
||||
defs_block = ""
|
||||
if feature_defs:
|
||||
defs_content = re.search(
|
||||
r"<defs>(.*?)</defs>", feature_defs, re.DOTALL
|
||||
)
|
||||
if defs_content:
|
||||
defs_block = f" <defs>{defs_content.group(1)}</defs>"
|
||||
|
||||
footer_y = feature_height + 40
|
||||
|
||||
return f"""<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="{SVG_WIDTH}" height="{total_height}" viewBox="0 0 {SVG_WIDTH} {total_height}">
|
||||
{defs_block}
|
||||
|
||||
<!-- Full background -->
|
||||
<rect width="100%" height="100%" fill="#0d1117"/>
|
||||
|
||||
<!-- Feature section (header already baked in) -->
|
||||
<svg x="0" y="0" width="{SVG_WIDTH}" height="{feature_height}" viewBox="0 0 {SVG_WIDTH} {feature_height}">
|
||||
{feature_inner_clean}
|
||||
</svg>
|
||||
|
||||
<!-- Footer -->
|
||||
<rect x="0" y="{feature_height}" width="{SVG_WIDTH}" height="{FOOTER_HEIGHT}" fill="#0d1117"/>
|
||||
<line x1="60" y1="{feature_height + 8}" x2="790" y2="{feature_height + 8}" stroke="#F2C811" stroke-opacity="0.25" stroke-width="2"/>
|
||||
<text x="425" y="{footer_y}" font-family="'Segoe UI', Arial, sans-serif" font-size="18" fill="#58a6ff" text-anchor="middle" font-weight="bold">mina-saad.com/pbi-cli</text>
|
||||
</svg>"""
|
||||
|
||||
|
||||
def render_svg_to_png(svg_content: str, output_path: Path, page) -> None:
|
||||
"""Render an SVG string to a 4K PNG using Playwright."""
|
||||
match = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg_content)
|
||||
svg_w, svg_h = int(match.group(1)), int(match.group(2))
|
||||
|
||||
scale = TARGET_WIDTH / svg_w
|
||||
target_h = int(svg_h * scale)
|
||||
|
||||
html = f"""<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
* {{ margin: 0; padding: 0; }}
|
||||
body {{ background: #0d1117; width: {TARGET_WIDTH}px; height: {target_h}px; overflow: hidden; }}
|
||||
svg {{ display: block; width: {TARGET_WIDTH}px; height: {target_h}px; }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{svg_content}
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
page.set_viewport_size({"width": TARGET_WIDTH, "height": target_h})
|
||||
page.set_content(html, wait_until="networkidle")
|
||||
page.screenshot(path=str(output_path), full_page=True, type="png")
|
||||
|
||||
|
||||
def main():
|
||||
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with sync_playwright() as p:
|
||||
browser = p.chromium.launch(headless=True)
|
||||
page = browser.new_page()
|
||||
|
||||
for svg_file, output_name in FEATURE_SVGS.items():
|
||||
svg_path = ASSETS_DIR / svg_file
|
||||
if not svg_path.exists():
|
||||
print(f" SKIP {svg_file} (not found)")
|
||||
continue
|
||||
|
||||
feature_svg = read_svg_content(svg_path)
|
||||
feature_height = get_svg_height(feature_svg)
|
||||
|
||||
composite = build_final_svg(feature_svg, feature_height)
|
||||
|
||||
output_path = OUTPUT_DIR / f"{output_name}.png"
|
||||
render_svg_to_png(composite, output_path, page)
|
||||
|
||||
total_h = feature_height + FOOTER_HEIGHT
|
||||
scale = TARGET_WIDTH / SVG_WIDTH
|
||||
print(
|
||||
f" OK {output_name}.png "
|
||||
f"({TARGET_WIDTH}x{int(total_h * scale)})"
|
||||
)
|
||||
|
||||
browser.close()
|
||||
|
||||
print(f"\nDone! {len(FEATURE_SVGS)} images saved to {OUTPUT_DIR}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:06197024146790a435df9df5b1e3d92411ba91d9e10d838b1c5cb0454db30412
|
||||
size 325045
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b695582857e6973c41e132f965f3b5482ccf8d4c1706c91e0135e6b185b39e92
|
||||
size 428734
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:af234a800d37e0dc6ef678cd8be4f121761a19a17ae8a89e71e874d31ccccd37
|
||||
size 510647
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b9a8870d69511c79250e73ed97c7a341f9f5e6bab8f56be3bc0c07d4b658ad9c
|
||||
size 396878
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:216df8b05012f32ab08b9b324d8b6cc3ed6e7e9a260d22e40551bfde2dd6560b
|
||||
size 496543
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:16370f39d88819cd2ebbeeef388d4dbb4a74d2e27806541cf22405588eab9bec
|
||||
size 494548
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:68d66c38405f639830546c28a67f4b6661918db8eb1a2e62987ab308a343ac11
|
||||
size 477232
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:228792a25890628147488724cfc0ae70d519dba2ec6d245ece14f17fe793d5ed
|
||||
size 376799
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:321721da311ef30e92200fa2b054adf8871b5b20aa28c42593f20c1cd63e2ed9
|
||||
size 338421
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9db7013eb897bbb0192a5875eff334990b6d822a37bc1be7e01fbbeb557b236c
|
||||
size 519290
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:068efbffa6996fb29e162275cf4f4a599d27ccb41212bb47f82124de0bb5e702
|
||||
size 459129
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:78425c8a90796e9c34166d9c52fb5f739c22712c02c9c42ecb114379a146d235
|
||||
size 464443
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a58af21589a5a42480d5c0fa0f79d59bd0b2e5be2545cddc61d257675d80c250
|
||||
size 522021
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ac4141e141604242072b56d788e6244519c681e5115a1b6f815f9bee2b078f0e
|
||||
size 430420
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b7abc15cfefab3e2e6024f542df3d7fef885b46a30a845e13f3eb09830b139ad
|
||||
size 534414
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a877f87ab6156cc879edd16764150b89c1cda7f5f63cbb4ba17dfb2c987302c1
|
||||
size 378908
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fbf81d066fd27aa38b82f371bf34154dd7cefe98e1a34b536d4ff61249b1908d
|
||||
size 345944
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b46f6f8b61a562408e571e442fb2bd40502c6c4f8b9eef9bda8b20972e889b99
|
||||
size 525757
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:dd521a25791eb6f492f97f797c20ea066b6315a939ba47efb24c29858340ef50
|
||||
size 477694
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e46430adbe37f97fcc03305a429924449e0dc9255027454b69f08b106177e9ed
|
||||
size 1191659
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f5a0596d5760e01ad55ceea261353070a6d7beaf0a32d5f11ae6b069e11f3a27
|
||||
size 358366
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:544dae4b02f5baf7dde1599d6b9b34af234e325a3f297113e9a297e48feaaee1
|
||||
size 360196
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4804a7a74dfc7df1d9f200cca3eb985ea6d999d284062d03b5609852592fb7c4
|
||||
size 485307
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:38cddcbe4ca8bb2f2429ad861603f0498280aedf7442f3b1a0674fb480b3188e
|
||||
size 521526
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ac1747c2de360727fc5b6b5840ebe683e2bcfb2ba94b7e9ba4b4d0806f8447f8
|
||||
size 286663
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0bc54a4040abcf22ee6942ed5c69f1a571fca02ff239753cd3e43219e545ac46
|
||||
size 286221
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0e2f009f6a1bf04a562642d3068c2a3ad0cd3e81ab90f4705f23f8835ca73a62
|
||||
size 481789
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8e8dd2e17ad6fb400f0d9e09efbbbedc365830a5e8a817adaf6a9e017ea0b7b0
|
||||
size 367239
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
<!-- Post 01 | Phase 1: Hook & Educate | Day 1 -->
|
||||
<!-- Image: pbi-cli-vibe-modeling.pdf (10-slide carousel) -->
|
||||
<!-- Posting note: Upload the PDF as a document so it renders as a swipeable carousel -->
|
||||
|
||||
Two days ago I shared the idea of 𝘃𝗶𝗯𝗲 𝗺𝗼𝗱𝗲𝗹𝗶𝗻𝗴. The response blew me away.
|
||||
|
||||
So here's the full breakdown. 10 slides covering everything about 𝗽𝗯𝗶-𝗰𝗹𝗶, the open-source CLI that gives Claude Code full Power BI skills.
|
||||
|
||||
What you'll find inside:
|
||||
|
||||
- What vibe modeling actually means
|
||||
- The 7 skill areas (DAX, modeling, deployment, diagnostics, docs, partitions, security)
|
||||
- How it works in 3 steps: install, connect, chat
|
||||
- Why it uses 130x fewer tokens than MCP servers
|
||||
- Real examples of Claude writing DAX, creating measures, and querying your model
|
||||
|
||||
No GUI. No copy-paste. Just describe what you need in plain English.
|
||||
|
||||
Swipe through the carousel and let me know which slide hits hardest. I'd love to hear what resonates with your workflow.
|
||||
|
||||
Star it on GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Full details: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DataModeling #OpenSource #VIbeModeling #ClaudeCode #DAX #DataAnalytics #AI
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
<!-- Post 02 | Phase 1: Hook & Educate | Day 2 -->
|
||||
<!-- Image: before-after.png (WITHOUT vs WITH pbi-cli comparison) -->
|
||||
|
||||
Power BI development in 2024 looked like this:
|
||||
|
||||
- Click through 6 menus to create one measure
|
||||
- Copy-paste DAX from Stack Overflow and hope it works
|
||||
- No version control. No undo beyond Ctrl+Z
|
||||
- Manual documentation that's outdated the moment you write it
|
||||
|
||||
Now picture this instead:
|
||||
|
||||
- "Create a YTD Revenue measure" and it's done
|
||||
- Claude writes the DAX, validates it, and adds it to your model
|
||||
- TMDL export gives you real version control with git
|
||||
- ~30 tokens per command instead of 4,000+ with MCP servers
|
||||
|
||||
That's 𝗽𝗯𝗶-𝗰𝗹𝗶. Not a wrapper around an MCP server. A purpose-built CLI where Claude has native Power BI skills.
|
||||
|
||||
The left side of this image is where most teams still are. The right side is where you could be this afternoon.
|
||||
|
||||
Which side are you on? Drop a comment, I'm curious.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DataModeling #VIbeModeling #ClaudeCode #DAX #OpenSource #DataEngineering #AI
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
<!-- Post 03 | Phase 1: Hook & Educate | Day 3 -->
|
||||
<!-- Image: token-cost.png (MCP vs CLI + Skills bar chart) -->
|
||||
|
||||
MCP tools have a hidden cost most people don't talk about: 𝘀𝗰𝗵𝗲𝗺𝗮 𝗯𝗹𝗼𝗮𝘁.
|
||||
|
||||
Every MCP tool definition (name, parameters, descriptions) gets loaded into your context window. Not when you call it. On 𝗲𝘃𝗲𝗿𝘆 𝘀𝗶𝗻𝗴𝗹𝗲 𝘁𝘂𝗿𝗻. A single tool schema costs anywhere from 400 to 3,500 tokens just to be available.
|
||||
|
||||
Real benchmarks back this up:
|
||||
→ A 5-server MCP setup burns ~55K tokens before you type anything (JD Hodges)
|
||||
→ GitHub's MCP server with 43 tools: a simple repo query costs 44K tokens vs 1,365 for CLI (Scalekit)
|
||||
→ Anthropic themselves measured 134K tokens of tool definitions internally
|
||||
|
||||
Now imagine a Power BI MCP server with 20-40 tools for all the TOM operations. At 2,000-3,000 tokens per schema, that's 𝟲𝟬𝗞-𝟭𝟮𝟬𝗞 𝘁𝗼𝗸𝗲𝗻𝘀 of overhead eating your context window before you do any actual work.
|
||||
|
||||
pbi-cli avoids this entirely. CLI commands cost ~30 tokens to invoke, and only when used. No schemas loaded. No per-turn tax. Skills load on-demand, not on every turn.
|
||||
|
||||
That's why I built it as a CLI with skills instead of wrapping an MCP server. The architecture isn't just a preference. Real benchmarks show CLI is 4-32x more efficient per task, and for schema overhead specifically, the difference is even larger.
|
||||
|
||||
Check the chart. The difference speaks for itself.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Details: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #ClaudeCode #MCP #TokenEfficiency #OpenSource #VibeModeling #AI #DataModeling
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<!-- Post 04 | Phase 2: Show the Magic | Day 4 -->
|
||||
<!-- Image: how-it-works.png (3-step: Install, Connect, Chat) -->
|
||||
|
||||
Two commands. That's all it takes.
|
||||
|
||||
𝗦𝘁𝗲𝗽 𝟭: Install
|
||||
`pipx install pbi-cli`
|
||||
One line. No dependencies to chase.
|
||||
|
||||
𝗦𝘁𝗲𝗽 𝟮: Connect
|
||||
`pbi connect`
|
||||
Auto-detects your running Power BI Desktop instance. No config files, no port numbers, no setup wizards.
|
||||
|
||||
𝗦𝘁𝗲𝗽 𝟯: Chat
|
||||
Open Claude Code and start talking. "Show me all measures." "Create a YTD calculation." "Export this model to TMDL."
|
||||
|
||||
That's it. Claude discovers all 7 skills automatically. No registration, no API keys, no YAML to write.
|
||||
|
||||
𝗭𝗲𝗿𝗼 𝗰𝗼𝗻𝗳𝗶𝗴𝘂𝗿𝗮𝘁𝗶𝗼𝗻. Just install, connect, and describe what you need.
|
||||
|
||||
Try it in 30 seconds:
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Full walkthrough: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #ClaudeCode #OpenSource #VIbeModeling #DAX #DataModeling #DeveloperTools
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<!-- Post 05 | Phase 2: Show the Magic | Day 5 -->
|
||||
<!-- Image: chat-demo.png (Just Ask Claude conversation) -->
|
||||
|
||||
No DAX syntax to memorize. No GUI menus to navigate.
|
||||
|
||||
Look at this conversation:
|
||||
|
||||
"Connect to my Power BI model."
|
||||
Done. Claude finds it automatically.
|
||||
|
||||
"Create a Total Revenue measure that sums the Amount column."
|
||||
Done. Measure created, validated, added to your model.
|
||||
|
||||
"Query the top 10 products by revenue."
|
||||
Done. Results returned right in the terminal.
|
||||
|
||||
Three requests. Three results. All in plain English.
|
||||
|
||||
This is what working with 𝗽𝗯𝗶-𝗰𝗹𝗶 actually looks like. You don't learn commands. You don't read documentation. You just 𝗱𝗲𝘀𝗰𝗿𝗶𝗯𝗲 what you want.
|
||||
|
||||
Claude handles the DAX syntax, the model object references, the column names, the formatting. You handle the thinking.
|
||||
|
||||
That's the whole point of vibe modeling. The model is a conversation, not a spreadsheet.
|
||||
|
||||
Just describe what you need:
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DAX #ClaudeCode #VIbeModeling #OpenSource #DataAnalytics #AI #DataModeling
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<!-- Post 06 | Phase 2: Show the Magic | Day 6 -->
|
||||
<!-- Image: bulk-operations.png (One Prompt, Five Measures) -->
|
||||
|
||||
One prompt. Five measures. 3.2 seconds.
|
||||
|
||||
"Create YTD Revenue, QTD Revenue, MTD Revenue, Prior Year Revenue, and YoY Growth measures for the Sales table."
|
||||
|
||||
That's it. One sentence. Claude writes all five DAX expressions, creates each measure, and confirms they're added to your model.
|
||||
|
||||
Now compare that to the GUI approach:
|
||||
|
||||
- Open the measure editor
|
||||
- Write the DAX (or Google it)
|
||||
- Test it
|
||||
- Repeat 4 more times
|
||||
- ~10 minutes and 50+ clicks per measure
|
||||
- Total: nearly an hour of clicking
|
||||
|
||||
With 𝗽𝗯𝗶-𝗰𝗹𝗶, all five measures land in your model before you finish your coffee.
|
||||
|
||||
This isn't a demo trick. This is the daily workflow. Need 12 KPIs for a new report? Describe them in a paragraph. Need to rename 30 measures to match a naming convention? One prompt.
|
||||
|
||||
𝗕𝗮𝘁𝗰𝗵 𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝗼𝗻𝘀 are where the productivity gap becomes impossible to ignore.
|
||||
|
||||
Stop clicking. Start describing.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Details: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DAX #Productivity #ClaudeCode #VIbeModeling #OpenSource #DataModeling #DataEngineering
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<!-- Post 07 | Phase 3: Skill Deep Dives | Day 7 -->
|
||||
<!-- Image: dax-skill.png (DAX Skill: plain English to results table) -->
|
||||
|
||||
What if you could query your Power BI model in plain English?
|
||||
|
||||
With 𝗽𝗯𝗶-𝗰𝗹𝗶, you can. I asked Claude: "What are the top 5 products by revenue?" and got a formatted results table in seconds.
|
||||
|
||||
Here's what happened behind the scenes:
|
||||
|
||||
1. Claude 𝗯𝘂𝗶𝗹𝘁 the DAX query (TOPN, SUMMARIZE, the works)
|
||||
2. 𝗩𝗮𝗹𝗶𝗱𝗮𝘁𝗲𝗱 the syntax before executing
|
||||
3. 𝗘𝘅𝗲𝗰𝘂𝘁𝗲𝗱 it against the live semantic model
|
||||
4. 𝗙𝗼𝗿𝗺𝗮𝘁𝘁𝗲𝗱 the results into a clean table
|
||||
|
||||
No EVALUATE statement to remember. No SUMMARIZECOLUMNS vs SUMMARIZE debate. No syntax errors to debug. Just a question and an answer. 🎯
|
||||
|
||||
The DAX skill covers query execution, syntax validation, and result formatting. You focus on the business question. Claude handles the rest.
|
||||
|
||||
Follow-up questions work too. "Now filter that by region" or "Show me the trend over the last 12 months." It's a conversation, not a query editor. 💬
|
||||
|
||||
Try it yourself. Ask any question about your data.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DAX #ClaudeCode #DataAnalytics #VIbeModeling #OpenSource #AI #DataModeling
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<!-- Post 08 | Phase 3: Skill Deep Dives | Day 8 -->
|
||||
<!-- Image: dax-debugging.png (Debug DAX Like Never Before) -->
|
||||
|
||||
Your YTD Revenue measure is returning blank. What do you do?
|
||||
|
||||
Most people start guessing. Comment out lines. Add variables. Stare at CALCULATE filters. Waste 45 minutes before finding it was a date table issue the whole time.
|
||||
|
||||
With 𝗽𝗯𝗶-𝗰𝗹𝗶, I told Claude: "My YTD Revenue measure returns blank. Can you investigate?"
|
||||
|
||||
Claude traced the problem like a senior developer would 🔍
|
||||
|
||||
- Checked the measure definition. Syntax was fine.
|
||||
- Checked the DAX logic. TOTALYTD looked correct.
|
||||
- Checked the Calendar table. Found it. The table wasn't 𝗺𝗮𝗿𝗸𝗲𝗱 𝗮𝘀 𝗮 𝗱𝗮𝘁𝗲 𝘁𝗮𝗯𝗹𝗲.
|
||||
- Fixed it with one command. Measure started working immediately.
|
||||
|
||||
Systematic. Methodical. No guessing.
|
||||
|
||||
That's the difference. Claude doesn't just write DAX. It 𝗱𝗲𝗯𝘂𝗴𝘀 it. It reads your model structure, understands context, and traces root causes.
|
||||
|
||||
Stop guessing. Let Claude trace it. 🛠️
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DAX #Debugging #ClaudeCode #VIbeModeling #OpenSource #DataModeling #AI
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<!-- Post 09 | Phase 3: Skill Deep Dives | Day 9 -->
|
||||
<!-- Image: model-health-check.png (Model Health Check audit) -->
|
||||
|
||||
When was the last time you audited your semantic model?
|
||||
|
||||
Be honest. Most teams ship models to production and never look back. Until something breaks.
|
||||
|
||||
I asked Claude to run a 𝗳𝘂𝗹𝗹 𝗵𝗲𝗮𝗹𝘁𝗵 𝗰𝗵𝗲𝗰𝗸 on a production model. One prompt. Here's what came back:
|
||||
|
||||
❌ 𝗘𝗿𝗿𝗼𝗿𝘀: Circular dependency between two calculated tables. Missing relationship between Sales and Store.
|
||||
|
||||
⚠️ 𝗪𝗮𝗿𝗻𝗶𝗻𝗴𝘀: 12 unused measures. Bidirectional filter on a fact table. Calendar table missing continuous date coverage.
|
||||
|
||||
✅ 𝗣𝗮𝘀𝘀𝗲𝘀: Star schema structure. Single-direction relationships on dimensions. Date table properly marked.
|
||||
|
||||
Then Claude offered to fix each issue, one by one. "Want me to remove the unused measures?" Yes. "Set the bidirectional filter to single direction?" Yes. Done.
|
||||
|
||||
Manual review? 30+ minutes if you know what to look for. With 𝗽𝗯𝗶-𝗰𝗹𝗶? Instant. And it catches things you'd miss.
|
||||
|
||||
Catch issues before production. Not after.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DataModeling #DataQuality #ClaudeCode #VIbeModeling #OpenSource #SemanticModel #AI
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<!-- Post 10 | Phase 3: Skill Deep Dives | Day 10 -->
|
||||
<!-- Image: modeling-skill.png (Describe schema, Claude builds it) -->
|
||||
|
||||
Describe your schema in plain English. Claude builds it.
|
||||
|
||||
I told Claude: "Create a star schema with Sales as the fact table, and Products, Calendar, Customers, and Store as dimensions."
|
||||
|
||||
In seconds, Claude created:
|
||||
|
||||
- 📦 𝟱 𝘁𝗮𝗯𝗹𝗲𝘀 with appropriate columns and data types
|
||||
- 🔗 𝟰 𝗿𝗲𝗹𝗮𝘁𝗶𝗼𝗻𝘀𝗵𝗶𝗽𝘀, all one-to-many, single direction
|
||||
- 📅 Calendar 𝗱𝗮𝘁𝗲 𝘁𝗮𝗯𝗹𝗲 properly configured
|
||||
- 📐 Properly structured for performance and usability
|
||||
|
||||
No drag-and-drop. No switching between diagram view and table properties. No manual relationship setup where you pick the wrong cardinality and spend 20 minutes figuring out why your numbers are doubled.
|
||||
|
||||
The modeling skill handles tables, relationships, measures, and date table configuration. All from conversation.
|
||||
|
||||
Need to iterate? "Add a Geography dimension" or "Create a Total Revenue measure on the Sales table." Claude keeps building on what's already there. 🔧
|
||||
|
||||
From description to working schema in one prompt.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DataModeling #StarSchema #ClaudeCode #VIbeModeling #OpenSource #SemanticModel #AI
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<!-- Post 11 | Phase 3: Skill Deep Dives | Day 11 -->
|
||||
<!-- Image: backup-restore.png (Undo Anything. Instantly.) -->
|
||||
|
||||
"I messed up the relationships and now half my measures are showing blank."
|
||||
|
||||
We've all been there. You restructure a few things, feel confident, test one report, and everything's broken. Ctrl+Z won't help you. There's no undo for relationship changes in Power BI.
|
||||
|
||||
Unless you have a 𝘀𝗻𝗮𝗽𝘀𝗵𝗼𝘁.
|
||||
|
||||
Here's my workflow with 𝗽𝗯𝗶-𝗰𝗹𝗶:
|
||||
|
||||
1. 𝗦𝗮𝘃𝗲 a snapshot before risky changes (`pbi database export-tmdl`)
|
||||
2. 𝗠𝗮𝗸𝗲 changes. Restructure relationships, rename columns, update measures.
|
||||
3. Something breaks? 𝗥𝗲𝘀𝘁𝗼𝗿𝗲 the snapshot (`pbi database import-tmdl`)
|
||||
4. Everything's back. Like it never happened. 🔄
|
||||
|
||||
It's the safety net that Power BI Desktop never gave you. Experiment freely. Try bold restructures. Refactor without fear. Pair it with git and you have full version history of your semantic model.
|
||||
|
||||
Because the worst that can happen is a 5-second rollback.
|
||||
|
||||
Never lose work again. ✅
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #TMDL #VersionControl #ClaudeCode #VIbeModeling #OpenSource #DataModeling #DataEngineering
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
<!-- Post 12 | Phase 3: Skill Deep Dives | Day 12 -->
|
||||
<!-- Image: rls-testing.png (Test Row-Level Security in Seconds) -->
|
||||
|
||||
Setting up Row-Level Security in Power BI Desktop means clicking through multiple dialogs, switching tabs, testing manually.
|
||||
|
||||
Create a role. Switch to the DAX editor. Write the filter. Go to "View as Roles." Pick the role. Check the visuals. Repeat for every role.
|
||||
|
||||
With 𝗽𝗯𝗶-𝗰𝗹𝗶, I did this in one conversation:
|
||||
|
||||
1. "Create an RLS role called Europe Sales" ✅
|
||||
2. "Filter the Region table where Continent = Europe" ✅
|
||||
3. "Run a query as that role to verify" ✅
|
||||
|
||||
Claude created the role, added the filter expression, then executed a DAX query 𝗮𝘀 𝘁𝗵𝗮𝘁 𝗿𝗼𝗹𝗲 to validate it. Result: 12 of 48 regions visible. Exactly right. 🔒
|
||||
|
||||
Build, test, and validate. All from one place. No tab switching, no dialog hunting, no manual verification. Add more roles the same way. Scale security without scaling complexity.
|
||||
|
||||
Build and validate security from conversation.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #RowLevelSecurity #RLS #ClaudeCode #VIbeModeling #OpenSource #DataSecurity #AI
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
<!-- Post 13 | Phase 4: Enterprise & Architecture | Day 13 -->
|
||||
<!-- Image: deploy-secure.png (Deploy + Secure: TMDL versioning + RLS) -->
|
||||
|
||||
Two things every Power BI model needs: version control and access control.
|
||||
|
||||
Most teams have neither. Models get overwritten with no rollback. Security rules get configured by clicking through menus and hoping nothing breaks.
|
||||
|
||||
pbi-cli handles both from a single conversation.
|
||||
|
||||
On the 𝗱𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁 side, you get full TMDL export and import. Every change becomes a version snapshot you can track in git:
|
||||
|
||||
- v1: Baseline schema
|
||||
- v2: +Revenue measures
|
||||
- v3: +RLS roles applied
|
||||
|
||||
Need to roll back? One command. No guesswork.
|
||||
|
||||
On the 𝘀𝗲𝗰𝘂𝗿𝗶𝘁𝘆 side, Claude configures role-based filters directly on your model. Per-user data visibility, row-level security rules, all defined in plain English and applied through the TOM API.
|
||||
|
||||
Both skills work from conversation. Describe what you need, Claude builds it. 🔐
|
||||
|
||||
Version control your models. Secure them with one prompt.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DataSecurity #RLS #VersionControl #TMDL #OpenSource #ClaudeCode #VIbeModeling
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
<!-- Post 14 | Phase 4: Enterprise & Architecture | Day 14 -->
|
||||
<!-- Image: docs-diagnostics.png (Docs + Diagnostics combined) -->
|
||||
|
||||
How well do you know your own model?
|
||||
|
||||
I've seen models with 200+ measures where nobody can explain what half of them do. Tables with columns that aren't used anywhere. Relationships that create circular dependencies nobody notices until a report breaks.
|
||||
|
||||
pbi-cli gives you two skills to fix this. 📋
|
||||
|
||||
The 𝗱𝗼𝗰𝘀 skill generates a complete data dictionary with one command: `pbi model document`. Every table, every column, every data type, every measure expression. Documented and organized. No more tribal knowledge trapped in someone's head.
|
||||
|
||||
The 𝗱𝗶𝗮𝗴𝗻𝗼𝘀𝘁𝗶𝗰𝘀 skill runs health checks across your entire model. Relationship validation, circular dependency detection, unused measure identification. It also traces query execution with duration metrics and performance recommendations. 🔍
|
||||
|
||||
One tells you what your model contains. The other tells you how healthy it is.
|
||||
|
||||
Know your model inside out.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #DataModeling #Documentation #DataQuality #OpenSource #ClaudeCode #VIbeModeling #DAX
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<!-- Post 15 | Phase 4: Enterprise & Architecture | Day 15 -->
|
||||
<!-- Image: architecture-flow.png (Architecture: Claude Code -> pbi-cli -> pythonnet -> .NET TOM -> Power BI) -->
|
||||
|
||||
No MCP server. No REST API. No external binaries.
|
||||
|
||||
Here's how pbi-cli actually works, end to end. ⚙️
|
||||
|
||||
Claude Code calls 𝗽𝗯𝗶-𝗰𝗹𝗶, a Python CLI installed via pipx. pbi-cli uses 𝗽𝘆𝘁𝗵𝗼𝗻𝗻𝗲𝘁 to bridge into .NET. From there, the .NET 𝗧𝗮𝗯𝘂𝗹𝗮𝗿 𝗢𝗯𝗷𝗲𝗰𝘁 𝗠𝗼𝗱𝗲𝗹 (TOM) and ADOMD.NET talk directly to Power BI Desktop over the local XMLA endpoint.
|
||||
|
||||
The full chain:
|
||||
|
||||
```
|
||||
Claude Code -> pbi-cli -> pythonnet -> .NET TOM/ADOMD -> XMLA -> Power BI
|
||||
```
|
||||
|
||||
Everything runs in-process on your machine. No network hops. No middleware. Sub-second execution for most operations.
|
||||
|
||||
Why does the architecture matter? Because direct access means 𝗳𝗮𝘀𝘁𝗲𝗿 execution, 𝗺𝗼𝗿𝗲 𝗿𝗲𝗹𝗶𝗮𝗯𝗹𝗲 results, and 𝟭𝟯𝟬𝘅 𝗰𝗵𝗲𝗮𝗽𝗲𝗿 than MCP tool calls. No JSON-RPC schema bloat. No server process to manage. Just a CLI that does exactly what you ask. 🏗️
|
||||
|
||||
Open source. MIT License.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #SoftwareArchitecture #Python #DotNET #OpenSource #ClaudeCode #VIbeModeling #DataEngineering
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
<!-- Post 16 | Phase 4: Enterprise & Architecture | Day 16 -->
|
||||
<!-- Images: feature-grid.png + skills-hub.png (22 Command Groups + 7 Skills) -->
|
||||
|
||||
22 command groups. 100+ subcommands. 7 AI skills. Zero memorization.
|
||||
|
||||
Here's what pbi-cli covers: 📦
|
||||
|
||||
𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗴𝗿𝗼𝘂𝗽𝘀: connect, dax, measure, table, column, relationship, model, database, security-role, calc-group, partition, perspective, hierarchy, expression, calendar, trace, transaction, advanced, repl, skills, disconnect, connections, setup.
|
||||
|
||||
That's full TOM coverage. Every object you can touch in a Power BI semantic model, accessible from the terminal.
|
||||
|
||||
But here's what makes it different from a regular CLI. 🧠
|
||||
|
||||
Claude 𝗮𝘂𝘁𝗼-𝗱𝗶𝘀𝗰𝗼𝘃𝗲𝗿𝘀 7 specialized skills the moment you install pbi-cli:
|
||||
|
||||
- 𝗗𝗔𝗫: queries, measures, calculations
|
||||
- 𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴: tables, columns, relationships
|
||||
- 𝗗𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁: TMDL export/import, transactions
|
||||
- 𝗦𝗲𝗰𝘂𝗿𝗶𝘁𝘆: RLS roles, perspectives
|
||||
- 𝗗𝗼𝗰𝘀: data dictionary, model documentation
|
||||
- 𝗣𝗮𝗿𝘁𝗶𝘁𝗶𝗼𝗻𝘀: M expressions, data sources
|
||||
- 𝗗𝗶𝗮𝗴𝗻𝗼𝘀𝘁𝗶𝗰𝘀: tracing, health checks
|
||||
|
||||
You don't memorize commands. You describe what you want. Claude picks the right skill and runs the right commands.
|
||||
|
||||
`pbi <group> <command>`. That's the pattern. Claude handles the rest.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #CLI #DataModeling #DAX #OpenSource #ClaudeCode #VIbeModeling #AI
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
<!-- Post 17 | Phase 5: CTA & Wrap | Day 17 -->
|
||||
<!-- Image: cta-start.png (Start Vibe Modeling CTA) -->
|
||||
|
||||
Two commands to transform your Power BI workflow. 🚀
|
||||
|
||||
```
|
||||
pipx install pbi-cli-tool
|
||||
pbi connect
|
||||
```
|
||||
|
||||
That's it. Claude auto-discovers 7 Power BI skills the moment pbi-cli is installed. You describe what you want in plain English. It builds.
|
||||
|
||||
Open source. MIT License. Python 3.10+. Windows.
|
||||
|
||||
No MCP server. No REST API. No configuration files. Just install, connect, and start modeling. ✨
|
||||
|
||||
Like it? Star it on GitHub. Share it with your Power BI team.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Learn more: mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #OpenSource #VIbeModeling #ClaudeCode #DAX #DataModeling #AI
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<!-- Post 18 | Video companion | After Phase 5 -->
|
||||
<!-- Asset: PbiCliVideo.mp4 — upload as native LinkedIn video -->
|
||||
|
||||
Ever wonder what 𝗩𝗶𝗯𝗲 𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴 actually looks like?
|
||||
|
||||
Here it is. 🎬
|
||||
|
||||
From the problem with MCP overhead, to install, connect, chat. DAX, modeling, RLS, deployment, diagnostics. All in one short watch.
|
||||
|
||||
If you've followed along this past month, this is the summary reel.
|
||||
|
||||
If this is your first time seeing 𝗽𝗯𝗶-𝗰𝗹𝗶, start here. ✨
|
||||
|
||||
Free and open source. Windows + Python 3.10+.
|
||||
|
||||
Details: https://mina-saad.com/pbi-cli
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
|
||||
#PowerBI #VIbeModeling #ClaudeCode #OpenSource #DataModeling #DAX #AI
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
<!-- Comments for Post 19 | Release Announcement: v3.10.1 Vibe BI -->
|
||||
<!-- Post each comment with its corresponding image under the main release post -->
|
||||
|
||||
---
|
||||
|
||||
### Comment 1 — Report Layer Overview
|
||||
<!-- Image: report-layer.png -->
|
||||
|
||||
Here's the new 𝗥𝗲𝗽𝗼𝗿𝘁 𝗟𝗮𝘆𝗲𝗿 at a glance.
|
||||
|
||||
32 visual types, data binding, themes, and filters. All from the terminal.
|
||||
|
||||
No connection needed. It reads and writes PBIR JSON directly, auto-syncs with Desktop, and supports bulk operations.
|
||||
|
||||
One command to add a chart. One command to bind data. One command to apply your brand theme.
|
||||
|
||||
---
|
||||
|
||||
### Comment 2 — 32 Visual Types
|
||||
<!-- Image: visual-types.png -->
|
||||
|
||||
𝟯𝟮 𝘃𝗶𝘀𝘂𝗮𝗹 𝘁𝘆𝗽𝗲𝘀 you can add from one command.
|
||||
|
||||
Bar, line, column, area, scatter, combo, donut, waterfall, treemap, funnel. Cards, KPIs, gauges. Tables and matrices. Slicers for every use case. Azure Maps. Even decorative elements like shapes, images, and textboxes.
|
||||
|
||||
`pbi visual add --type bar --page overview --name my_chart`
|
||||
|
||||
That's it. Claude picks the right type, you describe what you need.
|
||||
|
||||
---
|
||||
|
||||
### Comment 3 — Build a Report in 6 Steps
|
||||
<!-- Image: report-workflow.png -->
|
||||
|
||||
Full report from an empty folder in 𝟲 𝘀𝘁𝗲𝗽𝘀:
|
||||
|
||||
1. Scaffold the project
|
||||
2. Add pages
|
||||
3. Add visuals
|
||||
4. Bind data
|
||||
5. Apply theme
|
||||
6. Validate
|
||||
|
||||
All steps work offline on PBIR files. Desktop auto-syncs when it's open. You can chain these in a single prompt and Claude handles the sequence.
|
||||
|
||||
---
|
||||
|
||||
### Comment 4 — Desktop Auto-Sync
|
||||
<!-- Image: auto-sync.png -->
|
||||
|
||||
The part that makes this actually usable: 𝗗𝗲𝘀𝗸𝘁𝗼𝗽 𝗔𝘂𝘁𝗼-𝗦𝘆𝗻𝗰.
|
||||
|
||||
CLI writes PBIR files, takes a snapshot of your modeling work, then reopens Desktop with everything intact. Both layers preserved.
|
||||
|
||||
No more closing Desktop manually. No risk of losing unsaved model changes. It just works.
|
||||
|
||||
---
|
||||
|
||||
### Comment 5 — Just Ask Claude
|
||||
<!-- Image: chat-demo-report.png -->
|
||||
|
||||
This is what it actually looks like in practice.
|
||||
|
||||
"Add a bar chart showing revenue by region to the overview page, and apply our corporate brand theme."
|
||||
|
||||
Claude runs the commands: adds the visual, binds the data, applies the theme, syncs Desktop. Then you say "filter it to top 10 regions" and it adds a TopN filter.
|
||||
|
||||
No drag-and-drop. No manual binding. Just describe what you want on the page.
|
||||
|
||||
---
|
||||
|
||||
### Comment 6 — Two Layers, One CLI
|
||||
<!-- Image: dual-layer.png -->
|
||||
|
||||
The full picture: 𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴 + 𝗥𝗲𝗽𝗼𝗿𝘁𝗶𝗻𝗴 side by side.
|
||||
|
||||
Semantic Model Layer uses live .NET interop for measures, tables, relationships, DAX. Report Layer uses PBIR file operations for visuals, pages, themes, filters.
|
||||
|
||||
7 Claude skills for modeling. 5 for reporting. 27 command groups. 125+ subcommands total.
|
||||
|
||||
---
|
||||
|
||||
### Comment 7 — Architecture
|
||||
<!-- Image: layers.png -->
|
||||
|
||||
How the dual-layer architecture works under the hood.
|
||||
|
||||
Modeling side: TMDL export/import, DAX engine, schema control. All through direct .NET TOM interop.
|
||||
|
||||
Reporting side: Visual builder, data binding, theme engine. All through PBIR JSON file operations.
|
||||
|
||||
One CLI bridges both. Claude picks the right layer automatically based on your request.
|
||||
|
||||
---
|
||||
|
||||
### Comment 8 — Command Showcase
|
||||
<!-- Image: commands.png -->
|
||||
|
||||
Side-by-side command showcase for both layers.
|
||||
|
||||
𝗠𝗼𝗱𝗲𝗹𝗶𝗻𝗴: model export, dax run, add-measure, table list, relationship list, model import.
|
||||
|
||||
𝗥𝗲𝗽𝗼𝗿𝘁𝗶𝗻𝗴: add-visual, bind-data, add-page, list-visuals, update-theme, export.
|
||||
|
||||
30+ commands across both layers. AI-native from the start.
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<!-- Post 19 | Release Announcement: v3.10.1 Vibe BI -->
|
||||
<!-- Image: release-vibe-bi.png -->
|
||||
|
||||
It started as vibe modeling. Now it's 𝗩𝗶𝗯𝗲 𝗕𝗜. 🔥
|
||||
|
||||
𝗽𝗯𝗶-𝗰𝗹𝗶 v3.10.1 is out, and it's no longer just about semantic models. You can now build full Power BI reports from the terminal too.
|
||||
|
||||
𝗪𝗵𝗮𝘁'𝘀 𝗻𝗲𝘄:
|
||||
|
||||
→ 𝗥𝗲𝗽𝗼𝗿𝘁 𝗟𝗮𝘆𝗲𝗿: pages, visuals, themes, filters, bookmarks
|
||||
→ 𝟯𝟮 𝘃𝗶𝘀𝘂𝗮𝗹 𝘁𝘆𝗽𝗲𝘀 supported out of the box
|
||||
→ 𝟭𝟮 𝗖𝗹𝗮𝘂𝗱𝗲 𝘀𝗸𝗶𝗹𝗹𝘀: 7 for modeling, 5 for reporting
|
||||
→ 𝟯𝟬+ 𝗰𝗼𝗺𝗺𝗮𝗻𝗱𝘀 across both layers
|
||||
→ 𝟰𝟴𝟴 𝘁𝗲𝘀𝘁𝘀 passing
|
||||
|
||||
Same workflow. Install, connect, chat. Tell Claude "add a bar chart for revenue by region" and it writes the PBIR JSON for you. No clicks. No drag and drop.
|
||||
|
||||
Modeling + Reporting. Both layers. One CLI.
|
||||
|
||||
```
|
||||
pipx install pbi-cli-tool
|
||||
pbi connect
|
||||
```
|
||||
|
||||
Free, open source, MIT licensed. If you've been following along, this is the update I've been building toward. ✨
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Details: https://mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #VibeBi #VIbeModeling #ClaudeCode #OpenSource #DataModeling #DAX #PBIR #AI
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<!-- Post 20 | Technical Showcase: Auto-Sync | Post after #19 -->
|
||||
<!-- Image: auto-sync-ai.png -->
|
||||
|
||||
The biggest problem with editing Power BI reports from code: Desktop doesn't detect file changes on disk.
|
||||
|
||||
You edit the PBIR JSON, Desktop ignores it. You save in Desktop, it overwrites your changes. The workaround? Close Desktop, edit files, reopen manually. Every single time. About 45 seconds of friction per edit, plus the risk of losing unsaved work.
|
||||
|
||||
So I built 𝗗𝗲𝘀𝗸𝘁𝗼𝗽 𝗔𝘂𝘁𝗼-𝗦𝘆𝗻𝗰 Technique into 𝗽𝗯𝗶-𝗰𝗹𝗶 v3.10.1.
|
||||
|
||||
𝗛𝗼𝘄 𝗶𝘁 𝘄𝗼𝗿𝗸𝘀:
|
||||
|
||||
1️⃣ Claude executes the CLI to write your PBIR files (page.json, visual.json, filters.json)
|
||||
2️⃣ Claude snapshots the changes from the last 5 seconds
|
||||
3️⃣ Claude closes Desktop for you: sends a WM_CLOSE message via pywin32 and auto-accepts the save dialog so nothing is lost
|
||||
4️⃣ Claude re-applies the snapshots and reopens your .pbip file automatically
|
||||
|
||||
~2-5 seconds. Fully automated. You never touch Desktop yourself.
|
||||
|
||||
Your unsaved modeling work (measures, relationships) stays safe because Desktop saves before closing. Your report-layer changes (visuals, filters, themes) survive because they're snapshotted and rewritten after Desktop's save. Then Desktop launches right back with everything in place.
|
||||
|
||||
This is what makes 𝗩𝗶𝗯𝗲 𝗕𝗜 actually usable. Without it, you'd close Desktop, edit files, reopen manually, every single time. With Auto-Sync, Claude handles the entire close-reopen cycle for you. You just ask for the change and keep working. ✨
|
||||
|
||||
GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
Details: https://mina-saad.com/pbi-cli
|
||||
|
||||
#PowerBI #VibeBi #PBIR #ClaudeCode #OpenSource #PowerBIDeveloper #DataModeling #AI
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
# LinkedIn Post Campaign: pbi-cli Vibe BI
|
||||
|
||||
## Context
|
||||
- Post 0 (DONE, March 28): Launch announcement, performed well
|
||||
- Campaign goal: Set the land for "vibe modeling" as a concept, build awareness for pbi-cli + Claude Code + Power BI
|
||||
|
||||
## Posting Strategy
|
||||
|
||||
**Phase 1: Hook & Educate** (Days 1-3 after launch)
|
||||
Build on the launch momentum. Give people the full picture, then hit them with the "why."
|
||||
|
||||
| # | File | Image/Asset | Angle |
|
||||
|---|------|-------------|-------|
|
||||
| 01 | 01-carousel-overview.md | pbi-cli-vibe-modeling.pdf | Full carousel walkthrough |
|
||||
| 02 | 02-why-pbi-cli.md | before-after.png | Problem/solution framing |
|
||||
| 03 | 03-token-cost.md | token-cost.png | Technical argument vs MCP |
|
||||
|
||||
**Phase 2: Show the Magic** (Days 4-6)
|
||||
Remove friction. Show how simple it is and the "aha" moments.
|
||||
|
||||
| # | File | Image/Asset | Angle |
|
||||
|---|------|-------------|-------|
|
||||
| 04 | 04-how-it-works.md | how-it-works.png | 3-step onboarding |
|
||||
| 05 | 05-chat-demo.md | chat-demo.png | The conversational UX |
|
||||
| 06 | 06-bulk-operations.md | bulk-operations.png | Productivity proof |
|
||||
|
||||
**Phase 3: Skill Deep Dives** (Days 7-12)
|
||||
One post per major capability. Each stands alone.
|
||||
|
||||
| # | File | Image/Asset | Angle |
|
||||
|---|------|-------------|-------|
|
||||
| 07 | 07-dax-skill.md | dax-skill.png | DAX without memorizing syntax |
|
||||
| 08 | 08-dax-debugging.md | dax-debugging.png | Claude as debug partner |
|
||||
| 09 | 09-model-health.md | model-health-check.png | Instant model audit |
|
||||
| 10 | 10-modeling-skill.md | modeling-skill.png | Schema from description |
|
||||
| 11 | 11-backup-restore.md | backup-restore.png | Safety net for risky changes |
|
||||
| 12 | 12-rls-testing.md | rls-testing.png | Security without the GUI |
|
||||
|
||||
**Phase 4: Enterprise & Architecture** (Days 13-16)
|
||||
For the more technical audience. Builds credibility.
|
||||
|
||||
| # | File | Image/Asset | Angle |
|
||||
|---|------|-------------|-------|
|
||||
| 13 | 13-deploy-secure.md | deploy-secure.png | Version control + RLS combined |
|
||||
| 14 | 14-docs-diagnostics.md | docs-diagnostics.png | Documentation + performance |
|
||||
| 15 | 15-architecture.md | architecture-flow.png | Under the hood |
|
||||
| 16 | 16-feature-scope.md | feature-grid.png + skills-hub.png | Full scope: 22 groups, 7 skills |
|
||||
|
||||
**Phase 5: CTA & Wrap** (Day 17)
|
||||
Close the loop. Drive installs.
|
||||
|
||||
| # | File | Image/Asset | Angle |
|
||||
|---|------|-------------|-------|
|
||||
| 17 | 17-cta-start.md | cta-start.png | Final CTA |
|
||||
|
||||
**Phase 6: Vibe BI Release** (1 week after Phase 5)
|
||||
Announce the evolution from Vibe Modeling to Vibe BI with the report layer.
|
||||
|
||||
| # | File | Image/Asset | Angle |
|
||||
|---|------|-------------|-------|
|
||||
| 19 | 19-release-vibe-bi.md | release-vibe-bi.png | v3.10.1 release, Modeling + Reporting |
|
||||
| 20 | 20-auto-sync.md | auto-sync-ai.png | Desktop Auto-Sync technique |
|
||||
|
||||
## Links (include in every post)
|
||||
- Landing page: mina-saad.com/pbi-cli
|
||||
- GitHub: https://github.com/MinaSaad1/pbi-cli
|
||||
|
|
@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||
|
||||
[project]
|
||||
name = "pbi-cli-tool"
|
||||
version = "3.10.3"
|
||||
version = "3.10.10"
|
||||
description = "CLI for Power BI semantic models and PBIR reports - direct .NET connection for token-efficient AI agent usage"
|
||||
readme = "README.pypi.md"
|
||||
license = "MIT AND LicenseRef-Microsoft-AS-Client-Libraries"
|
||||
|
|
|
|||
220
scripts/generate_downloads_chart.py
Normal file
|
|
@ -0,0 +1,220 @@
|
|||
"""Regenerate assets/downloads-chart.svg from pypistats.org data.
|
||||
|
||||
Fetches daily download counts for pbi-cli-tool (mirrors excluded), computes a
|
||||
cumulative series, and writes a dark-theme SVG line chart that matches the
|
||||
visual style of the other assets in this repo.
|
||||
|
||||
Runs with stdlib only so it works in CI without extra dependencies.
|
||||
|
||||
Usage:
|
||||
python scripts/generate_downloads_chart.py
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
from datetime import date, datetime
|
||||
from pathlib import Path
|
||||
|
||||
PACKAGE = "pbi-cli-tool"
|
||||
API_URL = f"https://pypistats.org/api/packages/{PACKAGE}/overall?mirrors=false"
|
||||
OUTPUT_PATH = Path(__file__).resolve().parent.parent / "assets" / "downloads-chart.svg"
|
||||
|
||||
# Chart geometry
|
||||
WIDTH = 850
|
||||
HEIGHT = 340
|
||||
PLOT_LEFT = 70
|
||||
PLOT_RIGHT = 810
|
||||
PLOT_TOP = 78
|
||||
PLOT_BOTTOM = 280
|
||||
|
||||
# Colors (match stats.svg / banner.svg palette)
|
||||
BG = "#0d1117"
|
||||
ACCENT_YELLOW = "#F2C811"
|
||||
LINE_BLUE = "#58a6ff"
|
||||
GRID = "#21262d"
|
||||
TEXT_PRIMARY = "#c9d1d9"
|
||||
TEXT_SECONDARY = "#8b949e"
|
||||
CARD_BG = "#0d1a2a"
|
||||
|
||||
|
||||
def fetch_downloads() -> list[tuple[date, int]]:
|
||||
"""Return sorted list of (date, daily_downloads) from pypistats."""
|
||||
with urllib.request.urlopen(API_URL, timeout=30) as resp:
|
||||
payload = json.loads(resp.read())
|
||||
|
||||
rows = [
|
||||
(datetime.strptime(r["date"], "%Y-%m-%d").date(), int(r["downloads"]))
|
||||
for r in payload["data"]
|
||||
if r["category"] == "without_mirrors"
|
||||
]
|
||||
rows.sort(key=lambda item: item[0])
|
||||
return rows
|
||||
|
||||
|
||||
def to_cumulative(rows: list[tuple[date, int]]) -> list[tuple[date, int]]:
|
||||
total = 0
|
||||
out: list[tuple[date, int]] = []
|
||||
for d, n in rows:
|
||||
total += n
|
||||
out.append((d, total))
|
||||
return out
|
||||
|
||||
|
||||
def nice_ceiling(value: int) -> int:
|
||||
"""Round up to a nice axis maximum (1-2-5 * 10^n)."""
|
||||
if value <= 0:
|
||||
return 10
|
||||
import math
|
||||
|
||||
exp = math.floor(math.log10(value))
|
||||
base = 10**exp
|
||||
for step in (1, 2, 2.5, 5, 10):
|
||||
candidate = int(step * base)
|
||||
if candidate >= value:
|
||||
return candidate
|
||||
return int(10 * base)
|
||||
|
||||
|
||||
def build_svg(series: list[tuple[date, int]]) -> str:
|
||||
if not series:
|
||||
raise RuntimeError("No download data returned from pypistats")
|
||||
|
||||
n = len(series)
|
||||
max_val = series[-1][1]
|
||||
y_max = nice_ceiling(int(max_val * 1.15))
|
||||
|
||||
plot_width = PLOT_RIGHT - PLOT_LEFT
|
||||
plot_height = PLOT_BOTTOM - PLOT_TOP
|
||||
|
||||
def x_at(i: int) -> float:
|
||||
if n == 1:
|
||||
return PLOT_LEFT + plot_width / 2
|
||||
return PLOT_LEFT + (i / (n - 1)) * plot_width
|
||||
|
||||
def y_at(v: int) -> float:
|
||||
return PLOT_BOTTOM - (v / y_max) * plot_height
|
||||
|
||||
points = [(x_at(i), y_at(v)) for i, (_, v) in enumerate(series)]
|
||||
|
||||
line_path = "M " + " L ".join(f"{x:.2f},{y:.2f}" for x, y in points)
|
||||
area_path = (
|
||||
f"M {points[0][0]:.2f},{PLOT_BOTTOM} "
|
||||
+ "L "
|
||||
+ " L ".join(f"{x:.2f},{y:.2f}" for x, y in points)
|
||||
+ f" L {points[-1][0]:.2f},{PLOT_BOTTOM} Z"
|
||||
)
|
||||
|
||||
# Y-axis gridlines (5 steps)
|
||||
gridlines = []
|
||||
y_labels = []
|
||||
for step in range(6):
|
||||
v = y_max * step / 5
|
||||
y = PLOT_BOTTOM - (v / y_max) * plot_height
|
||||
gridlines.append(
|
||||
f'<line x1="{PLOT_LEFT}" y1="{y:.1f}" x2="{PLOT_RIGHT}" y2="{y:.1f}" '
|
||||
f'stroke="{GRID}" stroke-width="1" stroke-dasharray="2,3"/>'
|
||||
)
|
||||
label = f"{int(v):,}"
|
||||
y_labels.append(
|
||||
f'<text x="{PLOT_LEFT - 8}" y="{y + 4:.1f}" font-family="\'Segoe UI\', Arial, sans-serif" '
|
||||
f'font-size="10" fill="{TEXT_SECONDARY}" text-anchor="end">{label}</text>'
|
||||
)
|
||||
|
||||
# X-axis labels: first, last, and ~3 intermediate
|
||||
label_indices = sorted({0, n - 1, n // 4, n // 2, (3 * n) // 4})
|
||||
x_labels = []
|
||||
for i in label_indices:
|
||||
d, _ = series[i]
|
||||
x = x_at(i)
|
||||
x_labels.append(
|
||||
f'<text x="{x:.1f}" y="{PLOT_BOTTOM + 18}" font-family="\'Segoe UI\', Arial, sans-serif" '
|
||||
f'font-size="10" fill="{TEXT_SECONDARY}" text-anchor="middle">{d.strftime("%b %d")}</text>'
|
||||
)
|
||||
|
||||
# Data point dots + highlight on last
|
||||
dots = []
|
||||
for i, (x, y) in enumerate(points):
|
||||
is_last = i == n - 1
|
||||
r = 4 if is_last else 2.5
|
||||
fill = ACCENT_YELLOW if is_last else LINE_BLUE
|
||||
dots.append(f'<circle cx="{x:.2f}" cy="{y:.2f}" r="{r}" fill="{fill}"/>')
|
||||
|
||||
# Last-value callout
|
||||
last_x, last_y = points[-1]
|
||||
last_val = series[-1][1]
|
||||
callout_x = min(last_x + 10, PLOT_RIGHT - 90)
|
||||
callout_y = max(last_y - 28, PLOT_TOP + 14)
|
||||
|
||||
# Summary stats
|
||||
first_date = series[0][0].strftime("%b %d, %Y")
|
||||
last_date = series[-1][0].strftime("%b %d, %Y")
|
||||
total_str = f"{max_val:,}"
|
||||
|
||||
svg = f"""<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}">
|
||||
<defs>
|
||||
<linearGradient id="areaFill" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="{LINE_BLUE}" stop-opacity="0.45"/>
|
||||
<stop offset="100%" stop-color="{LINE_BLUE}" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="100%" height="100%" fill="{BG}" rx="8"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="{WIDTH // 2}" y="33" font-family="'Segoe UI', Arial, sans-serif" font-size="17" fill="{ACCENT_YELLOW}" text-anchor="middle" font-weight="bold">pbi-cli Downloads Over Time</text>
|
||||
<text x="{WIDTH // 2}" y="52" font-family="'Segoe UI', Arial, sans-serif" font-size="11" fill="{TEXT_SECONDARY}" text-anchor="middle">Cumulative installs from PyPI \u2022 mirrors excluded \u2022 source: pypistats.org</text>
|
||||
|
||||
<!-- Gridlines & y-labels -->
|
||||
{"".join(gridlines)}
|
||||
{"".join(y_labels)}
|
||||
|
||||
<!-- Area fill -->
|
||||
<path d="{area_path}" fill="url(#areaFill)"/>
|
||||
|
||||
<!-- Line -->
|
||||
<path d="{line_path}" fill="none" stroke="{LINE_BLUE}" stroke-width="2.5" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
|
||||
<!-- Data points -->
|
||||
{"".join(dots)}
|
||||
|
||||
<!-- Last-value callout -->
|
||||
<rect x="{callout_x:.1f}" y="{callout_y:.1f}" width="82" height="24" rx="4" fill="{CARD_BG}" stroke="{ACCENT_YELLOW}" stroke-width="1"/>
|
||||
<text x="{callout_x + 41:.1f}" y="{callout_y + 16:.1f}" font-family="'Segoe UI', Arial, sans-serif" font-size="12" fill="{ACCENT_YELLOW}" text-anchor="middle" font-weight="bold">{total_str} total</text>
|
||||
|
||||
<!-- X-axis labels -->
|
||||
{"".join(x_labels)}
|
||||
|
||||
<!-- Footer: date range -->
|
||||
<text x="{PLOT_LEFT}" y="{HEIGHT - 12}" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="{TEXT_SECONDARY}">{first_date} \u2192 {last_date}</text>
|
||||
<text x="{PLOT_RIGHT}" y="{HEIGHT - 12}" font-family="'Segoe UI', Arial, sans-serif" font-size="10" fill="{TEXT_SECONDARY}" text-anchor="end">{n} days of data</text>
|
||||
</svg>
|
||||
"""
|
||||
return svg
|
||||
|
||||
|
||||
def main() -> int:
|
||||
try:
|
||||
daily = fetch_downloads()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(f"Failed to fetch pypistats data: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
if not daily:
|
||||
print("pypistats returned no rows", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
cumulative = to_cumulative(daily)
|
||||
svg = build_svg(cumulative)
|
||||
|
||||
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
||||
OUTPUT_PATH.write_text(svg, encoding="utf-8")
|
||||
print(f"Wrote {OUTPUT_PATH} ({len(cumulative)} days, {cumulative[-1][1]:,} total downloads)")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
"""pbi-cli: CLI for Power BI semantic models via direct .NET interop."""
|
||||
|
||||
__version__ = "3.10.3"
|
||||
__version__ = "3.10.10"
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ def run_command(
|
|||
|
||||
|
||||
def _is_report_write(result: Any) -> bool:
|
||||
"""Check if the result indicates a report-layer write."""
|
||||
"""Check if the result indicates a report-layer write that should trigger sync."""
|
||||
if not isinstance(result, dict):
|
||||
return False
|
||||
status = result.get("status", "")
|
||||
|
|
@ -74,11 +74,13 @@ def _is_report_write(result: Any) -> bool:
|
|||
if click_ctx is None:
|
||||
return False
|
||||
|
||||
# Walk up to the group to find report_path
|
||||
# Walk up to the group to find report_path; also check for --no-sync flag
|
||||
parent = click_ctx.parent
|
||||
while parent is not None:
|
||||
obj = parent.obj
|
||||
if isinstance(obj, dict) and "report_path" in obj:
|
||||
if obj.get("no_sync", False):
|
||||
return False
|
||||
return True
|
||||
parent = parent.parent
|
||||
return False
|
||||
|
|
|
|||
|
|
@ -15,11 +15,18 @@ from pbi_cli.main import PbiContext, pass_context
|
|||
default=None,
|
||||
help="Path to .Report folder (auto-detected from CWD if omitted).",
|
||||
)
|
||||
@click.option(
|
||||
"--no-sync",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help="Skip Desktop auto-sync after write commands. Use for scripted multi-step builds.",
|
||||
)
|
||||
@click.pass_context
|
||||
def bookmarks(ctx: click.Context, path: str | None) -> None:
|
||||
def bookmarks(ctx: click.Context, path: str | None, no_sync: bool) -> None:
|
||||
"""Manage report bookmarks."""
|
||||
ctx.ensure_object(dict)
|
||||
ctx.obj["report_path"] = path
|
||||
ctx.obj["no_sync"] = no_sync
|
||||
|
||||
|
||||
@bookmarks.command(name="list")
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ from __future__ import annotations
|
|||
|
||||
import click
|
||||
|
||||
from pbi_cli.commands.skills_cmd import _get_bundled_skills, _is_installed
|
||||
from pbi_cli.core.connection_store import (
|
||||
ConnectionInfo,
|
||||
add_connection,
|
||||
|
|
@ -74,8 +75,6 @@ def connect(
|
|||
)
|
||||
else:
|
||||
print_success(f"Connected: {effective_name} ({data_source})")
|
||||
from pbi_cli.commands.skills_cmd import _is_installed, _get_bundled_skills
|
||||
|
||||
bundled = _get_bundled_skills()
|
||||
any_missing = any(not _is_installed(name) for name in bundled)
|
||||
if any_missing:
|
||||
|
|
@ -191,6 +190,3 @@ def _auto_discover_data_source() -> str:
|
|||
data_source = f"localhost:{port}"
|
||||
print_info(f"Auto-detected Power BI Desktop on {data_source}")
|
||||
return data_source
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,11 +15,18 @@ from pbi_cli.main import PbiContext, pass_context
|
|||
default=None,
|
||||
help="Path to .Report folder (auto-detected from CWD if omitted).",
|
||||
)
|
||||
@click.option(
|
||||
"--no-sync",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help="Skip Desktop auto-sync after write commands. Use for scripted multi-step builds.",
|
||||
)
|
||||
@click.pass_context
|
||||
def filters(ctx: click.Context, path: str | None) -> None:
|
||||
def filters(ctx: click.Context, path: str | None, no_sync: bool) -> None:
|
||||
"""Manage page and visual filters."""
|
||||
ctx.ensure_object(dict)
|
||||
ctx.obj["report_path"] = path
|
||||
ctx.obj["no_sync"] = no_sync
|
||||
|
||||
|
||||
@filters.command(name="list")
|
||||
|
|
|
|||
|
|
@ -17,11 +17,18 @@ from pbi_cli.main import PbiContext, pass_context
|
|||
default=None,
|
||||
help="Path to .Report folder (auto-detected from CWD if omitted).",
|
||||
)
|
||||
@click.option(
|
||||
"--no-sync",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help="Skip Desktop auto-sync after write commands. Use for scripted multi-step builds.",
|
||||
)
|
||||
@click.pass_context
|
||||
def report(ctx: click.Context, path: str | None) -> None:
|
||||
def report(ctx: click.Context, path: str | None, no_sync: bool) -> None:
|
||||
"""Manage Power BI PBIR reports (pages, themes, validation)."""
|
||||
ctx.ensure_object(dict)
|
||||
ctx.obj["report_path"] = path
|
||||
ctx.obj["no_sync"] = no_sync
|
||||
|
||||
|
||||
@report.command()
|
||||
|
|
@ -195,9 +202,19 @@ def diff_theme(ctx: PbiContext, click_ctx: click.Context, file: str) -> None:
|
|||
@report.command(name="set-background")
|
||||
@click.argument("page_name")
|
||||
@click.option("--color", "-c", required=True, help="Hex color e.g. '#F8F9FA'.")
|
||||
@click.option(
|
||||
"--transparency",
|
||||
"-t",
|
||||
default=0,
|
||||
show_default=True,
|
||||
type=click.IntRange(0, 100),
|
||||
help="Transparency 0 (opaque) to 100 (invisible). Defaults to 0 so the color is visible.",
|
||||
)
|
||||
@click.pass_context
|
||||
@pass_context
|
||||
def set_background(ctx: PbiContext, click_ctx: click.Context, page_name: str, color: str) -> None:
|
||||
def set_background(
|
||||
ctx: PbiContext, click_ctx: click.Context, page_name: str, color: str, transparency: int
|
||||
) -> None:
|
||||
"""Set the background color of a page."""
|
||||
from pbi_cli.core.pbir_path import resolve_report_path
|
||||
from pbi_cli.core.report_backend import page_set_background
|
||||
|
|
@ -210,6 +227,7 @@ def set_background(ctx: PbiContext, click_ctx: click.Context, page_name: str, co
|
|||
definition_path=definition_path,
|
||||
page_name=page_name,
|
||||
color=color,
|
||||
transparency=transparency,
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||