From a1312e4a086a36e711ac9de5f9614e0bec8137aa Mon Sep 17 00:00:00 2001 From: aybvip Date: Sun, 10 May 2026 21:21:42 +0100 Subject: [PATCH] feat: add PiRC4 - Pi Visual Builder (AI-Driven No-Code Platform) - 6 documentation files (components, logic blocks, code generation, marketplace, examples, editor UI) - 4 interactive mobile-optimized mockups with Lucide Icons - Preview image - Idea & Proposal License (original concept by Ayoub/aybvip, implementation rights for Pi Network) --- image.png | Bin 0 -> 68453 bytes pirc4/CONTRIBUTING.md | 41 ++++ pirc4/LICENSE | 56 +++++ pirc4/ReadMe.md | 120 ++++++++++ pirc4/SECURITY.md | 46 ++++ pirc4/assets/preview.png | Bin 0 -> 68453 bytes pirc4/docs/1-components.md | 267 +++++++++++++++++++++ pirc4/docs/2-logic-blocks.md | 196 ++++++++++++++++ pirc4/docs/3-code-generation.md | 276 ++++++++++++++++++++++ pirc4/docs/4-marketplace.md | 194 ++++++++++++++++ pirc4/docs/5-examples.md | 213 +++++++++++++++++ pirc4/docs/6-editor-ui-layout.md | 373 ++++++++++++++++++++++++++++++ pirc4/mockups/1-design-tab.html | 217 +++++++++++++++++ pirc4/mockups/2-workflow-tab.html | 235 +++++++++++++++++++ pirc4/mockups/3-data-tab.html | 274 ++++++++++++++++++++++ pirc4/mockups/4-styles-tab.html | 288 +++++++++++++++++++++++ 16 files changed, 2796 insertions(+) create mode 100644 image.png create mode 100644 pirc4/CONTRIBUTING.md create mode 100644 pirc4/LICENSE create mode 100644 pirc4/ReadMe.md create mode 100644 pirc4/SECURITY.md create mode 100644 pirc4/assets/preview.png create mode 100644 pirc4/docs/1-components.md create mode 100644 pirc4/docs/2-logic-blocks.md create mode 100644 pirc4/docs/3-code-generation.md create mode 100644 pirc4/docs/4-marketplace.md create mode 100644 pirc4/docs/5-examples.md create mode 100644 pirc4/docs/6-editor-ui-layout.md create mode 100644 pirc4/mockups/1-design-tab.html create mode 100644 pirc4/mockups/2-workflow-tab.html create mode 100644 pirc4/mockups/3-data-tab.html create mode 100644 pirc4/mockups/4-styles-tab.html diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..85d523456e1ebb4371fddce4253286c98377297b GIT binary patch literal 68453 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

dt2}g`W*=;1?(S1#t6Gm-B9;6g+H$x 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 UG4*S@7l1z%MU9sw^5%j62Q6XdcmMzZ literal 0 HcmV?d00001 diff --git a/pirc4/CONTRIBUTING.md b/pirc4/CONTRIBUTING.md new file mode 100644 index 000000000..35ef11228 --- /dev/null +++ b/pirc4/CONTRIBUTING.md @@ -0,0 +1,41 @@ +# Contributing to Pi Visual Builder + +Thank you for your interest in contributing to the Pi Visual Builder specification. + +## How to Contribute + +### Specification Improvements +1. Open an Issue describing the proposed change +2. Reference the specific document (e.g., "docs/1-components.md: PiCard component") +3. Provide rationale and any supporting research + +### New Component Proposals +1. Open an Issue with the component name and use case +2. Define props, events, and visual behavior +3. Provide a sketch or reference implementation +4. Follow the existing component format in `docs/1-components.md` + +### Plugin Proposals +1. Open an Issue with plugin name and category +2. Define actions, components, and permissions +3. Follow the plugin format in `docs/4-marketplace.md` + +### Documentation Standards +- Use Markdown with proper headings and tables +- Include code examples for all components and blocks +- Reference PiDCTP module names when applicable +- Keep language clear and accessible for non-technical Pioneers + +## Pull Request Process +1. Fork the repository +2. Create a feature branch +3. Make changes following existing document style +4. Submit PR with clear description of changes + +## Reporting Issues +- **Bugs/Errors**: Open an Issue with the document name and section +- **Feature Requests**: Open an Issue with use case and rationale +- **Security vulnerabilities**: Email security@pivisualbuilder.org + +## License +By contributing, you agree that your contributions will be licensed under the MIT License. diff --git a/pirc4/LICENSE b/pirc4/LICENSE new file mode 100644 index 000000000..dc6f08839 --- /dev/null +++ b/pirc4/LICENSE @@ -0,0 +1,56 @@ +Pi Visual Builder β€” Idea & Proposal License + +Original Concept and Idea by: Ayoub (aybvip) +Implementation Rights: Pi Network (PiCore Team) + +This project represents an original idea and proposal created by Ayoub (aybvip) +and submitted to Pi Network for adoption and implementation. + +TERMS AND CONDITIONS: + +1. IDEA OWNERSHIP: The original concept, idea, and proposal for Pi Visual Builder + were created by Ayoub (aybvip). The idea is submitted to Pi Network for the + purpose of enhancing Pi App Studio. + +2. IMPLEMENTATION RIGHTS: Pi Network (PiCore Team) has the exclusive right to + adopt, implement, modify, and integrate this idea into Pi App Studio or any + Pi Network product. Upon adoption by Pi Network, all implementation rights + belong to Pi Network. + +3. ATTRIBUTION: If Pi Network adopts this idea, the original contributor + (Ayoub / aybvip) should be credited as the original idea author in any + official announcement or documentation. + +4. RESTRICTIONS: No person or entity other than Pi Network may: + - Claim ownership of this idea or proposal + - Copy, reproduce, or distribute this project for commercial purposes + - Implement this concept under a different name without permission + - Use any part of this project without explicit written permission + - Modify, adapt, or create derivative works from this project + - Remove or alter this license or the attribution to the original creator + +5. DERIVATIVE WORKS: Any modification, adaptation, or derivative work based + on this project remains subject to this license. Changing the name, + rebranding, or altering parts of the idea does not create a new work + free from this license. The original idea author (Ayoub / aybvip) and + Pi Network retain all rights over any derivative works. + +6. INTELLECTUAL PROPERTY: This project is protected under intellectual + property laws including copyright and trade secret protections. Any + unauthorized use, reproduction, or implementation constitutes a + violation of these rights and may be subject to legal action. + +7. PROPOSAL STATUS: This project is a voluntary proposal submitted to + Pi Network. The original contributor grants Pi Network the right to + adopt and implement this idea. No other entity has this right. + +8. COMMUNITY USE: Community members may view, discuss, and provide feedback + on this project for the purpose of improving Pi Network's ecosystem, + but may not appropriate, fork, or commercialize any part of it. + +THIS PROJECT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY. + +For permissions and inquiries, contact Pi Network through official channels +at https://minepi.com diff --git a/pirc4/ReadMe.md b/pirc4/ReadMe.md new file mode 100644 index 000000000..725c03980 --- /dev/null +++ b/pirc4/ReadMe.md @@ -0,0 +1,120 @@ +# Pi Visual Builder β€” PiRC4: The Ultimate AI-Driven No-Code Platform + +![Pi Visual Builder Preview](assets/preview.png) + +> **The Power of Visual Development + The Intelligence of Pi AI** β€” A next-generation visual development platform with a native **AI Agent (Orchestrator)**. Build complex, relational database web apps with step-by-step visual workflows, all powered by natural language prompts. + +## πŸ“š Documentation Index + +| # | Document | Description | +|---|----------|-------------| +| 1 | [Component Specification](docs/1-components.md) | 20+ visual components (Layout, Display, Input, Navigation, Pi-Native) | +| 2 | [Logic Blocks](docs/2-logic-blocks.md) | Event blocks, logic blocks, data blocks, Pi SDK blocks | +| 3 | [Code Generation](docs/3-code-generation.md) | React/TS + HTML/CSS output, Pi SDK API, build pipeline | +| 4 | [Component Marketplace](docs/4-marketplace.md) | Publishing, monetization, verification, discovery | +| 5 | [Example Apps](docs/5-examples.md) | 5 complete app examples (e-commerce, services, community, loyalty, HTML) | +| 6 | [Editor UI Layout](docs/6-editor-ui-layout.md) | Professional editor: canvas, property editor, AI assistant panel, workflow canvas, data tab, styles tab | + +## πŸ“± Interactive Mockups (Mobile-Optimized) + +| Mockup | Preview | +|--------|---------| +| [🎨 Design Tab](mockups/1-design-tab.html) | Visual canvas with elements tree, property editor, and AI assistant | +| [⚑ Workflow Tab](mockups/2-workflow-tab.html) | Step-by-step logic chains with Pi payment & escrow actions | +| [πŸ—„οΈ Data Tab](mockups/3-data-tab.html) | Relational database with PiDCTP-linked fields and privacy rules | +| [🎭 Styles Tab](mockups/4-styles-tab.html) | Color/font variables, element styles, live preview with dark theme AI | + +## πŸ€– The Pi AI Agent (BETA) + +The **Pi AI Agent** is the heart of the platform. It's not just a chatbot; it's an **Active Orchestrator** that performs actions across the environment: + +1. **Instant UI Implementation**: "Build a form so users can apply to jobs" β†’ AI creates popup, adds input fields, styles them to match your theme. +2. **Logic & Workflow Generation**: "When the user clicks apply, save the data and send a confirmation" β†’ AI builds a 3-step visual workflow: `Show Popup` β†’ `Display Data` β†’ `Send Confirmation`. +3. **Real-time Design Reworking**: "Rework the design to be more professional" β†’ AI adjusts padding, typography, and color schemes across the active screen. +4. **Database Auto-Schema**: AI automatically suggests and creates data types (e.g., `Job Application`) based on the form fields it just built. + +## πŸ›οΈ Professional Development Workspace + +### 1. Design Tab (Visual Canvas) +- **Pixel-Perfect Canvas**: Drag-and-drop elements with absolute or flexbox positioning. +- **Elements Tree**: Organize components hierarchically (Groups, Text, Buttons, Icons, Shapes). +- **Responsive Engine**: Toggle between Mobile, Tablet, and Desktop views instantly. +- **Property Editor**: Full control over fonts, colors, animations, and conditional states. + +### 2. Workflow Tab (Step-by-Step Logic) +- **Visual Logic Chains**: A clear, vertical flow of actions triggered by events. +- **Event Triggers**: `Button is clicked`, `Page is loaded`, `Payment is confirmed`. +- **Action Steps**: Show/Hide elements β†’ Data operations β†’ Ecosystem actions (Send Pi, Award Badge, Open Dispute). + +### 3. Data Tab (Relational Manager) +- **Data Types**: Build complex objects like `Merchant`, `EscrowTransaction`, `Job`. +- **Field Mapping**: Link fields directly to PiDCTP on-chain states for verified reputation. +- **Privacy Rules**: Define who can see or modify specific data points. + +### 4. API Connector +- **Visual API Builder**: Connect any external REST API without writing code. +- **Native Pi SDK integration**: Visual blocks for all Pi Network core functions. + +### 5. Plugins & Marketplace +- **Community Plugins**: Discovery of community-built logic blocks and UI components. +- **Monetization**: Authors earn Pi for their premium plugins. + +### 6. Styles Tab +- **Style Variables**: Colors, fonts, spacing β€” define once, apply everywhere. +- **Element Styles**: Reusable style presets (Button-primary, Card-default, etc.). +- **Pi Design System**: Built-in theme tokens for consistent Pi ecosystem branding. + +## πŸ—οΈ Technical Architecture (AI-First) + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ PI VISUAL BUILDER (VB) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ€– PI AI AGENT (Orchestrator: Generates UI, Logic, Data) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ DESIGN β”‚ WORKFLOW β”‚ DATA β”‚ API β”‚ PLUGINS β”‚ +β”‚ CANVAS β”‚ ENGINE β”‚ MANAGER β”‚ CONNECTOR β”‚ MARKETPLACE β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ β”‚ β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β” + β”‚ PI SDK & PiDCTP LAYER β”‚ + β”‚ (On-Chain Auth, Payments, Escrow, Reputation) β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ PI BROWSER RUNTIME β”‚ + β”‚ (React/TS Dynamic Web App) β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## πŸ”— PiRC3 (PiDCTP) Visual Integration + +Pi Visual Builder turns complex smart contract calls into simple visual steps: + +| Visual Workflow Step | PiRC3 Backend Action | +| :--- | :--- | +| `Verify Seller` | `pi.reputation.getEffectiveScore()` | +| `Create Milestone` | `pi.escrow.createMilestoneEscrow()` | +| `Release Payment` | `pi.escrow.confirmReceipt()` | +| `Lodge Complaint` | `pi.dispute.open()` | +| `Award Verified Badge` | `pi.reputation.awardBadge()` | + +## πŸ“… Roadmap + +| Phase | Feature | Status | +|-------|---------|--------| +| **Phase 1** | Visual Foundation (UI Canvas + Basic Workflows) | Proposed | +| **Phase 2** | Data Intelligence (Relational Database + Privacy Rules) | Proposed | +| **Phase 3** | AI Integration (Pi AI Agent for natural language app building) | Proposed | +| **Phase 4** | Global Ecosystem (Plugin Marketplace + Pi App Studio Sync) | Proposed | + +## πŸ“„ License + +Idea & Proposal License β€” Original concept by **Ayoub (aybvip)**. Implementation rights belong exclusively to **Pi Network**. No other entity may claim, copy, or implement this idea. See [LICENSE](LICENSE) for full terms. + +--- + +### Links +- **PiRC3 (PiDCTP)**: [PR #378](https://github.com/PiNetwork/PiRC/pull/378) +- **Platform Discussion**: [Issue #381](https://github.com/PiNetwork/PiRC/issues/381) +- **Pi App Studio**: Available in Pi Browser diff --git a/pirc4/SECURITY.md b/pirc4/SECURITY.md new file mode 100644 index 000000000..8be827763 --- /dev/null +++ b/pirc4/SECURITY.md @@ -0,0 +1,46 @@ +# Security Policy + +## Reporting a Vulnerability + +**Do NOT report security vulnerabilities through public GitHub Issues.** + +Email security@pivisualbuilder.org with: +- Description of the vulnerability +- Steps to reproduce +- Potential impact +- Suggested fix (if any) + +We will acknowledge receipt within 48 hours and provide a detailed response within 7 days. + +## Security Considerations + +### Plugin Security +- All plugins are sandboxed β€” cannot access other plugin state +- External network requests require explicit permission in manifest +- No direct DOM manipulation (use framework APIs only) +- Obfuscated code is rejected during review + +### Data Security +- Privacy rules enforced at runtime β€” no bypass possible +- PiDCTP on-chain state is immutable β€” visual builder cannot alter it +- API keys stored encrypted, never exposed to client-side code + +### AI Agent Security +- AI actions require user confirmation before execution +- AI cannot modify privacy rules without explicit approval +- AI-generated code is reviewed before deployment +- Rate limiting prevents AI abuse + +## Scope + +### In Scope +- Plugin system and sandboxing +- Data privacy rules enforcement +- AI Agent action boundaries +- API connector security +- PiDCTP integration correctness + +### Out of Scope +- Pi Network core protocol (report to Pi team) +- Pi Browser vulnerabilities (report to Pi team) +- Third-party API security (report upstream) diff --git a/pirc4/assets/preview.png b/pirc4/assets/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..85d523456e1ebb4371fddce4253286c98377297b GIT binary patch literal 68453 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

dt2}g`W*=;1?(S1#t6Gm-B9;6g+H$x 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 UG4*S@7l1z%MU9sw^5%j62Q6XdcmMzZ literal 0 HcmV?d00001 diff --git a/pirc4/docs/1-components.md b/pirc4/docs/1-components.md new file mode 100644 index 000000000..0c62eb059 --- /dev/null +++ b/pirc4/docs/1-components.md @@ -0,0 +1,267 @@ +# Pi Visual Builder β€” Component Specification + +## Layout Components + +### `` +Vertical layout container. +```tsx + + Title + Description + +``` +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| gap | number | 0 | Spacing between children (px) | +| padding | number | 0 | Inner padding | +| align | "start" \| "center" \| "end" | "start" | Horizontal alignment | +| crossAlign | "start" \| "center" \| "end" | "stretch" | Vertical alignment | +| scrollable | boolean | false | Enable vertical scroll | + +### `` +Horizontal layout container. +```tsx + + + + {product.name} + {product.price} Pi + + + +``` + +### `` +Responsive grid layout. +```tsx + + + + + + +``` + +### `` +Scrollable container with pull-to-refresh. +```tsx + + {items.map(item => )} + +``` + +### `` +Tab navigation container. +```tsx + + + + + +``` + +## Display Components + +### `` +Styled text with Pi Design System typography. +```tsx +Welcome, Pioneer! +Browse trusted merchants +Payment failed +``` +| Style | Size | Weight | +|-------|------|--------| +| display | 32px | Bold | +| headline | 24px | SemiBold | +| title | 20px | SemiBold | +| subtitle | 16px | Medium | +| body | 14px | Regular | +| caption | 12px | Regular | +| overline | 10px | Medium | + +### `` +Image with placeholder and error states. +```tsx + +``` + +### `` +Content container with elevation and radius. +```tsx + + {merchant.name} + + +``` + +### `` +User avatar with online indicator. +```tsx + +``` + +### `` +Status badge (reputation tier, verification level). +```tsx +Gold Seller +Verified Merchant +``` + +### `` +Data visualization (bar, line, pie). +```tsx + +``` + +## Input Components + +### `` +Text input with validation. +```tsx + +``` + +### `` +Action button with variants. +```tsx +Buy Now β€” 10 Pi +Cancel +Open Dispute +Skip +``` + +### `` / `` / `` +Standard input controls. + +## Navigation Components + +### `` +Top navigation bar. +```tsx + +``` + +### `` +Modal bottom sheet. +```tsx + + + +``` + +### `` +Side navigation drawer. +```tsx + + + + {pioneer.name} + + Settings + + +``` + +## Pi-Specific Components + +### `` +One-tap Pi payment button with escrow option. +```tsx + +``` +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| amount | number | required | Payment amount in Pi | +| recipient | Address | required | Seller address | +| escrow | boolean | false | Use PiDCTP escrow protection | +| milestone | boolean | false | Use milestone escrow | +| onSuccess | function | β€” | Called on successful payment | +| onError | function | β€” | Called on payment failure | + +### `` +Pioneer profile card with reputation. +```tsx + +``` + +### `` +Escrow transaction status tracker. +```tsx + +``` + +### `` +Reputation tier visual indicator. +```tsx + +``` +| Tier | Color | Icon | +|------|-------|------| +| Bronze | #CD7F32 | shield | +| Silver | #C0C0C0 | shield | +| Gold | #FFD700 | star | +| Platinum | #E5E4E2 | diamond | +| Diamond | #B9F2FF | diamond | + +### `` +Merchant verification card. +```tsx + +``` + +## Theme System + +### Pi Design Tokens +```json +{ + "colors": { + "primary": "#6B46F5", + "secondary": "#9F7AEA", + "success": "#48BB78", + "warning": "#ECC94B", + "error": "#F56565", + "background": "#FFFFFF", + "surface": "#F7FAFC", + "text": "#1A202C", + "textSecondary": "#718096" + }, + "spacing": { "xs": 4, "sm": 8, "md": 12, "lg": 16, "xl": 24, "2xl": 32 }, + "radius": { "sm": 4, "md": 8, "lg": 12, "xl": 16, "full": 9999 }, + "elevation": { "none": 0, "sm": 1, "md": 2, "lg": 4 } +} +``` diff --git a/pirc4/docs/2-logic-blocks.md b/pirc4/docs/2-logic-blocks.md new file mode 100644 index 000000000..d51c88d66 --- /dev/null +++ b/pirc4/docs/2-logic-blocks.md @@ -0,0 +1,196 @@ +# Pi Visual Builder β€” Logic Blocks Specification + +## Event Blocks + +### UI Events +| Block | Trigger | Properties | +|-------|---------|------------| +| `onTap` | User taps component | target, tapCount | +| `onLongPress` | Long press (500ms) | target | +| `onSwipe` | Swipe gesture | target, direction (left/right/up/down) | +| `onScroll` | Scroll event | target, position, direction | +| `onTextChange` | Text input changes | target, value | +| `onFocus` / `onBlur` | Focus events | target | +| `onSubmit` | Form submission | target, values | + +### Lifecycle Events +| Block | Trigger | Properties | +|-------|---------|------------| +| `onScreenLoad` | Screen enters view | params | +| `onScreenUnload` | Screen leaves view | β€” | +| `onPullRefresh` | Pull-to-refresh triggered | β€” | +| `onTimer` | Periodic timer (ms) | interval, repeat | + +### Pi Events +| Block | Trigger | Properties | +|-------|---------|------------| +| `onPaymentSuccess` | Pi payment completed | txHash, amount | +| `onPaymentError` | Pi payment failed | error, code | +| `onEscrowStateChange` | Escrow state updated | escrowId, newState | +| `onAuthComplete` | Pioneer authenticated | address, profile | +| `onDisputeRuling` | Dispute ruling issued | disputeId, ruling | + +## Logic Blocks + +### Conditional +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ if/else β”‚ +β”‚ condition β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€ +β”‚ then β”‚ else β”‚ +β””β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜ +``` +```json +{ "type": "if", "condition": "${cart.total} > 100", "then": [...actions], "else": [...actions] } +``` + +### Loop +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ forEach β”‚ +β”‚ ${items} β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ item body β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` +```json +{ "type": "forEach", "collection": "${products}", "itemVar": "product", "body": [...actions] } +``` + +### Switch +```json +{ "type": "switch", "value": "${escrow.state}", "cases": { "Funded": [...], "Completed": [...], "Disputed": [...] }, "default": [...] } +``` + +### Try/Catch +```json +{ "type": "try", "body": [...actions], "catch": [{ "type": "showToast", "message": "${error.message}" }] } +``` + +## Data Blocks + +### Variables +| Block | Description | +|-------|-------------| +| `setVar` | Set variable value | +| `getVar` | Get variable value | +| `setList` | Add/remove list items | +| `getList` | Get list item by index | +| `setMap` | Set map key/value | +| `getMap` | Get map value by key | + +### API Calls +```json +{ "type": "apiCall", "method": "GET", "url": "https://api.example.com/products", "headers": {"Authorization": "Bearer ${token}"}, "onSuccess": [...actions], "onError": [...actions] } +``` + +### Local Storage +| Block | Description | +|-------|-------------| +| `storeSave` | Save key/value to Pi Browser storage | +| `storeLoad` | Load value by key | +| `storeDelete` | Delete key | + +## Navigation Blocks + +| Block | Description | +|-------|-------------| +| `navigate` | Go to screen | +| `goBack` | Return to previous screen | +| `openUrl` | Open external URL in Pi Browser | +| `showToast` | Show toast notification | +| `showAlert` | Show alert dialog | +| `closeSheet` | Close bottom sheet | + +## Pi-Specific Blocks + +### Authentication +```json +{ "type": "pi.auth", "action": "login", "onSuccess": [{ "type": "setVar", "name": "pioneer", "value": "${auth.profile}" }], "onError": [{ "type": "showToast", "message": "Login failed" }] } +``` + +### Payments +```json +{ "type": "pi.pay", "amount": "${product.price}", "recipient": "${seller}", "escrow": true, "onSuccess": [{ "type": "navigate", "screen": "receipt" }], "onError": [{ "type": "showToast", "message": "Payment failed" }] } +``` + +### Escrow (PiDCTP) +```json +{ "type": "pi.createEscrow", "buyer": "${pioneer}", "seller": "${merchant}", "amount": "${total}", "token": "PI", "deliveryDeadline": "${deadline}", "onSuccess": [{ "type": "setVar", "name": "escrowId", "value": "${result.escrowId}" }] } +``` + +```json +{ "type": "pi.confirmReceipt", "escrowId": "${escrowId}", "onSuccess": [{ "type": "showToast", "message": "Receipt confirmed!" }] } +``` + +### Milestone Escrow +```json +{ "type": "pi.createMilestoneEscrow", "buyer": "${pioneer}", "seller": "${merchant}", "totalAmount": "${total}", "milestones": [ { "amount": 30, "description": "Design phase" }, { "amount": 40, "description": "Development phase" }, { "amount": 30, "description": "Delivery phase" } ] } +``` + +### Reputation +```json +{ "type": "pi.getReputation", "address": "${seller}", "onSuccess": [{ "type": "setVar", "name": "sellerRep", "value": "${result}" }] } +``` + +### Dispute +```json +{ "type": "pi.openDispute", "escrowId": "${escrowId}", "category": "NotAsDescribed", "evidence": "${evidenceHash}", "onSuccess": [{ "type": "navigate", "screen": "dispute_status" }] } +``` + +### Merchant +```json +{ "type": "pi.verifyMerchant", "address": "${merchant}", "onSuccess": [{ "type": "setVar", "name": "isVerified", "value": "${result.verified}" }] } +``` + +### Loyalty +```json +{ "type": "pi.earnLoyalty", "pioneer": "${pioneer}", "action": "escrow_complete", "amount": 15 } +``` + +### Subscription (PiRC2) +```json +{ "type": "pi.subscribe", "planId": "${plan.id}", "onSuccess": [{ "type": "showToast", "message": "Subscribed!" }] } +``` + +## Full Example: E-Commerce App Logic + +```json +{ + "screen": "product_detail", + "events": [ + { + "trigger": "onScreenLoad", + "actions": [ + { "type": "pi.getReputation", "address": "${product.seller}", "onSuccess": [{ "type": "setVar", "name": "sellerRep", "value": "${result}" }] }, + { "type": "apiCall", "method": "GET", "url": "/api/products/${productId}", "onSuccess": [{ "type": "setVar", "name": "product", "value": "${result}" }] } + ] + }, + { + "trigger": "onTap", + "target": "buyButton", + "actions": [ + { "type": "if", "condition": "${sellerRep.score} >= 200", "then": [ + { "type": "pi.createEscrow", "buyer": "${pioneer}", "seller": "${product.seller}", "amount": "${product.price}", "onSuccess": [ + { "type": "showToast", "message": "Escrow created! Funds protected." }, + { "type": "navigate", "screen": "escrow_status" } + ]} + ], "else": [ + { "type": "showAlert", "title": "Low Reputation", "message": "This seller has low reputation. Continue without escrow?" } + ]} + ] + }, + { + "trigger": "onTap", + "target": "disputeButton", + "actions": [ + { "type": "pi.openDispute", "escrowId": "${escrowId}", "category": "NotAsDescribed", "evidence": "${screenshotHash}", "onSuccess": [ + { "type": "showToast", "message": "Dispute opened. Jurors will review." }, + { "type": "navigate", "screen": "dispute_status" } + ]} + ] + } + ] +} +``` diff --git a/pirc4/docs/3-code-generation.md b/pirc4/docs/3-code-generation.md new file mode 100644 index 000000000..1716a3730 --- /dev/null +++ b/pirc4/docs/3-code-generation.md @@ -0,0 +1,276 @@ +# Pi Visual Builder β€” Code Generation Specification + +## React/TypeScript Output + +### Generated App Structure +``` +dist/pibrowser/ +β”œβ”€β”€ index.html # Pi Browser entry point +β”œβ”€β”€ manifest.json # Pi app metadata +β”œβ”€β”€ assets/ +β”‚ β”œβ”€β”€ index.js # Bundled React app (Vite) +β”‚ β”œβ”€β”€ index.css # Compiled styles +β”‚ └── images/ +└── pi-sdk/ + └── pi.js # Pi SDK bundle +``` + +### Screen Generation Example + +**Visual Design β†’ React/TS Code:** + +```tsx +// screens/ProductDetail.tsx +import React, { useState, useEffect } from 'react'; +import { PiColumn, PiRow, PiText, PiImage, PiCard, PiPayButton, ReputationBadge, EscrowStatus } from '@pi/components'; +import { usePiAuth, usePiPayment, usePiReputation } from '@pi/sdk'; + +interface ProductDetailProps { + productId: string; +} + +export const ProductDetail: React.FC = ({ productId }) => { + const [product, setProduct] = useState(null); + const [escrowId, setEscrowId] = useState(null); + const { pioneer } = usePiAuth(); + const { createEscrow } = usePiPayment(); + const { getReputation } = usePiReputation(); + const [sellerRep, setSellerRep] = useState(null); + + useEffect(() => { + // Generated from onScreenLoad logic block + fetch(`/api/products/${productId}`) + .then(res => res.json()) + .then(data => { + setProduct(data); + getReputation(data.seller).then(setSellerRep); + }); + }, [productId]); + + const handleBuy = async () => { + // Generated from onTap β†’ pi.createEscrow logic block + if (sellerRep && sellerRep.score >= 200) { + const result = await createEscrow({ + buyer: pioneer.address, + seller: product.seller, + amount: product.price, + token: 'PI', + }); + setEscrowId(result.escrowId); + } + }; + + if (!product) return Loading...; + + return ( + + + + + {product.name} + {product.price} Pi + + {sellerRep && } + + + {product.description} + + + {escrowId && } + + ); +}; +``` + +### HTML/CSS Mode Output + +For simple pages, the builder generates pure HTML/CSS: + +```html + + + + + + My Pi Shop + + + + +

+ + +``` + +```css +/* styles.css β€” Pi Design System */ +:root { + --pi-primary: #6B46F5; + --pi-secondary: #9F7AEA; + --pi-success: #48BB78; + --pi-error: #F56565; + --pi-bg: #FFFFFF; + --pi-surface: #F7FAFC; + --pi-text: #1A202C; + --pi-text-secondary: #718096; + --pi-radius: 8px; + --pi-spacing: 16px; +} + +.pi-column { display: flex; flex-direction: column; } +.pi-row { display: flex; flex-direction: row; align-items: center; } +.pi-headline { font-size: 24px; font-weight: 600; color: var(--pi-text); } +.pi-body { font-size: 14px; color: var(--pi-text-secondary); } +.pi-button { + padding: 12px 24px; border-radius: var(--pi-radius); border: none; + font-weight: 600; cursor: pointer; transition: all 0.2s; +} +.pi-button--primary { background: var(--pi-primary); color: white; } +.pi-button--primary:active { transform: scale(0.97); } +``` + +## Pi SDK (`@pi/sdk`) + +### Authentication +```tsx +import { usePiAuth } from '@pi/sdk'; + +const { pioneer, login, logout, isAuthenticated } = usePiAuth(); +// pioneer.address, pioneer.name, pioneer.avatar +``` + +### Payments +```tsx +import { usePiPayment } from '@pi/sdk'; + +const { pay, createEscrow, confirmReceipt } = usePiPayment(); + +// Direct payment +await pay({ amount: 10, recipient: sellerAddress }); + +// Escrow payment (PiDCTP) +const escrow = await createEscrow({ + buyer: pioneer.address, + seller: sellerAddress, + amount: 100, + token: 'PI', + deliveryDeadline: Date.now() + 86400000, +}); + +// Confirm receipt +await confirmReceipt({ escrowId: escrow.escrowId }); +``` + +### Reputation +```tsx +import { usePiReputation } from '@pi/sdk'; + +const { getReputation, getEffectiveScore, awardBadge } = usePiReputation(); + +const rep = await getReputation(sellerAddress); +// rep.score, rep.tier, rep.badgeCount, rep.isVerifiedMerchant + +const effective = await getEffectiveScore(sellerAddress); +// Adjusted for Sybil score +``` + +### Dispute +```tsx +import { usePiDispute } from '@pi/sdk'; + +const { openDispute, submitEvidence } = usePiDispute(); + +await openDispute({ + escrowId: '123', + category: 'NotAsDescribed', + evidence: evidenceHash, +}); +``` + +### Merchant +```tsx +import { usePiMerchant } from '@pi/sdk'; + +const { verifyMerchant, getMerchantProfile } = usePiMerchant(); + +const merchant = await getMerchantProfile(address); +// merchant.level, merchant.status, merchant.category, merchant.avgRating +``` + +### Loyalty +```tsx +import { usePiLoyalty } from '@pi/sdk'; + +const { earnPoints, getProfile } = usePiLoyalty(); + +await earnPoints({ pioneer: pioneer.address, action: 'escrow_complete', amount: 15 }); +const loyalty = await getProfile(pioneer.address); +// loyalty.points, loyalty.tier, loyalty.redeemablePoints +``` + +## Build Pipeline + +``` +Visual Design (.ui.json + .logic.json) + β”‚ + β–Ό + AST Generator + β”‚ + β”œβ”€β”€β–Ί React/TS Code (.tsx + .ts) + β”‚ β”‚ + β”‚ β–Ό + β”‚ Vite Bundler + β”‚ β”‚ + β”‚ β–Ό + β”‚ Pi Browser Package (dist/) + β”‚ + └──► HTML/CSS Code (.html + .css) + β”‚ + β–Ό + Pi Browser Package (dist/) +``` + +### Vite Configuration +```ts +// vite.config.ts β€” Auto-generated +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + build: { + outDir: 'dist/pibrowser', + target: 'es2020', + minify: true, + }, + define: { + 'process.env.PI_NETWORK': '"mainnet"', + }, +}); +``` + +### Pi Browser Manifest +```json +{ + "name": "My Pi Shop", + "version": "1.0.0", + "author": "pioneer_address", + "description": "Trusted commerce on Pi Network", + "permissions": ["pi.auth", "pi.pay", "pi.escrow", "pi.reputation"], + "entry": "index.html", + "icon": "assets/icon.png", + "category": "commerce", + "minPiBrowserVersion": "2.0" +} +``` diff --git a/pirc4/docs/4-marketplace.md b/pirc4/docs/4-marketplace.md new file mode 100644 index 000000000..64b51924b --- /dev/null +++ b/pirc4/docs/4-marketplace.md @@ -0,0 +1,194 @@ +# Pi Visual Builder β€” Component Marketplace + +## Overview + +The Component Marketplace enables Pioneers to publish, discover, and monetize custom visual components for Pi Visual Builder. + +## Component Lifecycle + +``` +Create β†’ Test β†’ Publish β†’ Discover β†’ Install β†’ Use β†’ Rate β†’ Update +``` + +## Publishing a Component + +### Component Package Format +``` +my-component/ +β”œβ”€β”€ component.json # Metadata & props definition +β”œβ”€β”€ ui.json # Visual layout template +β”œβ”€β”€ logic.json # Default logic blocks +β”œβ”€β”€ styles.css # Component styles +β”œβ”€β”€ preview.png # 320x180 preview image +β”œβ”€β”€ README.md # Usage documentation +└── tests/ + └── basic.test.json # Visual regression test +``` + +### component.json +```json +{ + "name": "ProductCard", + "version": "1.2.0", + "author": "pioneer:GBCX...XYZ", + "description": "E-commerce product card with Pi payment integration", + "category": "commerce", + "tags": ["product", "card", "payment", "escrow"], + "piVersion": ">=0.1", + "props": { + "title": { "type": "string", "required": true, "default": "" }, + "price": { "type": "number", "required": true, "default": 0 }, + "image": { "type": "uri", "required": false }, + "seller": { "type": "address", "required": true }, + "showReputation": { "type": "boolean", "default": true }, + "escrowEnabled": { "type": "boolean", "default": true }, + "onBuy": { "type": "event" }, + "onDetail": { "type": "event" } + }, + "dependencies": { + "@pi/components": ">=1.0.0" + }, + "license": "MIT", + "price": 0, + "verified": false +} +``` + +## Categories + +| Category | Description | Examples | +|----------|-------------|----------| +| **commerce** | Buying & selling | ProductCard, CartView, OrderTracker | +| **social** | Social features | CommentThread, FollowButton, ShareSheet | +| **finance** | Payments & tracking | PiWalletCard, TransactionList, EscrowTracker | +| **content** | Media & information | ArticleView, VideoPlayer, PodcastPlayer | +| **games** | Gaming | Leaderboard, ScoreCard, AchievementBadge | +| **utility** | Tools & helpers | QrScanner, Calculator, TimerWidget | +| **navigation** | App navigation | SideMenu, TabBar, BreadcrumbNav | +| **data** | Data display | DataTable, ChartWidget, StatCard | + +## Monetization + +### Pricing Models +| Model | Price | Description | +|-------|-------|-------------| +| **Free** | 0 Pi | Open-source, community contribution | +| **One-time** | 1-100 Pi | Single purchase, lifetime updates | +| **Subscription** | 0.5-10 Pi/month | Monthly access with premium support | +| **Freemium** | Free + Premium | Basic free, advanced features paid | + +### Revenue Split +| Party | Percentage | +|-------|-----------| +| Component Author | 85% | +| Pi Network (platform fee) | 10% | +| Pi Visual Builder (maintenance) | 5% | + +### Payment Flow +``` +Pioneer clicks "Install" + β†’ Pi.pay({ amount: component.price, recipient: marketplace }) + β†’ Component unlocked in builder + β†’ Revenue split executed automatically + β†’ Component appears in palette +``` + +## Verification System + +### Pi-Verified Badge +Components can receive a **Pi-Verified** badge after review: + +| Criteria | Requirement | +|----------|------------| +| Security | No malicious code, no data exfiltration | +| Performance | Renders in <100ms, <50KB bundle | +| Compatibility | Works with current Pi Browser version | +| Documentation | Complete README with examples | +| Tests | At least 1 visual regression test | + +### Verification Process +1. Author submits verification request (free) +2. Pi team reviews code & behavior +3. Component tested on Pi Browser +4. Badge awarded or feedback provided +5. Re-verification required on major updates + +## Discovery + +### Search & Filter +``` +Search: "product card" +Filters: category=commerce, verified=true, price=free, rating>=4 +Sort: popular | newest | highest-rated +``` + +### Rankings +| Signal | Weight | +|--------|--------| +| Install count | 40% | +| Average rating | 30% | +| Verification status | 15% | +| Update recency | 10% | +| Author reputation | 5% | + +### Featured Components +Curated by Pi team, rotated weekly. Featured components get: +- Homepage placement +- Pi social media promotion +- 2x visibility in search + +## Rating System + +```json +{ + "rating": 4.5, + "count": 128, + "breakdown": { + "5_star": 72, + "4_star": 38, + "3_star": 12, + "2_star": 4, + "1_star": 2 + }, + "reviews": [ + { + "pioneer": "GBCX...ABC", + "stars": 5, + "comment": "Perfect for my Pi shop! Escrow integration works great.", + "date": "2026-04-15" + } + ] +} +``` + +## Version Management + +### Semantic Versioning +- **Major** (1.x.x): Breaking prop changes +- **Minor** (x.1.x): New props, backward compatible +- **Patch** (x.x.1): Bug fixes, no new props + +### Update Flow +``` +Author publishes v1.2.0 + β†’ Existing users notified: "Update available" + β†’ User clicks "Update" + β†’ Changelog displayed + β†’ Props migration auto-applied + β†’ Component updated in builder +``` + +## Security + +### Code Review +- All published components scanned for: + - External network requests (blocked unless whitelisted) + - Local storage access (sandboxed per component) + - Pi SDK misuse (only declared permissions) + - Obfuscated code (rejected) + +### Sandboxing +- Components run in isolated scope +- Cannot access other component state +- Pi SDK calls require explicit permission in manifest +- No direct DOM manipulation (use framework APIs only) diff --git a/pirc4/docs/5-examples.md b/pirc4/docs/5-examples.md new file mode 100644 index 000000000..ff244ee10 --- /dev/null +++ b/pirc4/docs/5-examples.md @@ -0,0 +1,213 @@ +# Pi Visual Builder β€” Example Apps + +## Example 1: Pi Marketplace (E-Commerce) + +A full marketplace app with escrow protection and merchant reputation. + +### Screens +1. **Home** β€” Featured products, categories, search +2. **Product Detail** β€” Images, price, seller reputation, buy button +3. **Cart** β€” Items list, total, checkout with escrow +4. **Orders** β€” Active escrows, completed purchases +5. **Escrow Status** β€” Milestone tracker, confirm receipt, dispute +6. **Seller Dashboard** β€” My products, sales, reputation score + +### Key Logic Blocks +``` +onTap(buyButton) β†’ + if(sellerRep.score >= 200) β†’ + pi.createEscrow(buyer, seller, amount) β†’ + showToast("Escrow created! Funds protected.") β†’ + navigate(escrow_status) + else β†’ + showAlert("Low Reputation", "Seller has low reputation. Continue?") + +onTap(confirmReceipt) β†’ + pi.confirmReceipt(escrowId) β†’ + pi.earnLoyalty(pioneer, "escrow_complete", 15) β†’ + showToast("Confirmed! +15 loyalty points") β†’ + navigate(orders) + +onTap(disputeButton) β†’ + pi.openDispute(escrowId, "NotAsDescribed", evidence) β†’ + showToast("Dispute opened. Jurors will review.") β†’ + navigate(dispute_status) +``` + +### Generated React Code +```tsx +import { PiColumn, PiRow, PiText, PiImage, PiCard, PiPayButton, ReputationBadge, EscrowStatus } from '@pi/components'; +import { usePiAuth, usePiPayment, usePiReputation, usePiLoyalty } from '@pi/sdk'; + +export const ProductDetail = ({ productId }: { productId: string }) => { + const { pioneer } = usePiAuth(); + const { createEscrow, confirmReceipt } = usePiPayment(); + const { getReputation } = usePiReputation(); + const { earnPoints } = usePiLoyalty(); + const [product, setProduct] = useState(null); + const [sellerRep, setSellerRep] = useState(null); + const [escrowId, setEscrowId] = useState(null); + + const handleBuy = async () => { + if (sellerRep?.score >= 200) { + const result = await createEscrow({ + buyer: pioneer.address, seller: product.seller, amount: product.price, + }); + setEscrowId(result.escrowId); + } + }; + + return ( + + + + + {product.name} + {product.price} Pi + + + + + {escrowId && } + + ); +}; +``` + +--- + +## Example 2: Pi Services Hub + +A platform for booking services (freelance, tutoring, consulting) with milestone escrow. + +### Screens +1. **Home** β€” Service categories, top-rated providers +2. **Service Detail** β€” Provider profile, reputation, booking form +3. **Booking** β€” Milestone escrow creation (design β†’ develop β†’ deliver) +4. **Progress** β€” Milestone tracker with submit/confirm flow +5. **Reviews** β€” Provider reviews and attestations + +### Key Logic Blocks +``` +onTap(bookService) β†’ + pi.createMilestoneEscrow(buyer, provider, total, [ + { amount: 30%, description: "Design phase" }, + { amount: 40%, description: "Development phase" }, + { amount: 30%, description: "Delivery & review" } + ]) β†’ + navigate(progress) + +onTap(submitMilestone) β†’ + pi.submitMilestone(escrowId, milestoneId) β†’ + showToast("Milestone submitted! Awaiting buyer confirmation.") + +onTap(confirmMilestone) β†’ + pi.confirmMilestone(escrowId, milestoneId) β†’ + pi.earnLoyalty(pioneer, "milestone_confirm", 10) β†’ + if(allMilestonesComplete) β†’ + showToast("Project complete! All milestones released.") +``` + +--- + +## Example 3: Pi Community Board + +A community forum with reputation-gated posting and Sybil-resistant voting. + +### Screens +1. **Feed** β€” Posts sorted by reputation-weighted votes +2. **Post Detail** β€” Content, comments, vote buttons +3. **New Post** β€” Create post (min Silver reputation required) +4. **Profile** β€” User reputation, badges, attestation score + +### Key Logic Blocks +``` +onTap(upvote) β†’ + if(pioneer.sybilScore < 3000) β†’ + apiCall("POST", "/api/vote", { post, weight: tierWeight(pioneer.tier) }) + else β†’ + showToast("Vote not counted: Sybil score too high") + +onTap(newPost) β†’ + if(pioneer.tier != "Bronze") β†’ + navigate(new_post_form) + else β†’ + showAlert("Min Silver Required", "You need Silver reputation to post.") + +onTap(attestUser) β†’ + if(pioneer.tier != "Bronze") β†’ + pi.createAttestation(attester, attested, "CommunityVouch") + else β†’ + showToast("Min Silver tier to attest other Pioneers") +``` + +--- + +## Example 4: Pi Loyalty Rewards Store + +A rewards store where Pioneers redeem loyalty points for perks. + +### Screens +1. **Rewards Catalog** β€” Available rewards by tier +2. **My Points** β€” Current points, tier, streak +3. **Redeem** β€” Confirm redemption, points deducted +4. **History** β€” Earned/spent points log + +### Key Logic Blocks +``` +onScreenLoad β†’ + pi.getLoyaltyProfile(pioneer) β†’ + setVar("points", result.redeemablePoints) β†’ + setVar("tier", result.tier) + +onTap(redeemReward) β†’ + if(points >= reward.cost) β†’ + pi.redeemReward(pioneer, reward.type, reward.cost) β†’ + showToast("Reward redeemed! Enjoy your perk.") + else β†’ + showToast("Not enough points. Keep earning!") +``` + +--- + +## Example 5: Simple Pi Landing Page (HTML Mode) + +A basic landing page using HTML/CSS mode β€” no React needed. + +### HTML Output +```html + + + + + + Pi Coffee Shop + + + + +
+

β˜• Pi Coffee

+
+
+ Fresh coffee +

Fresh roasted, Pi-powered

+

Order specialty coffee with Pi. Escrow-protected delivery.

+
+
+

Ethiopian Single

+

5 Pi / bag

+ +
+
+

Colombian Blend

+

4 Pi / bag

+ +
+
+
+ + +``` + +This demonstrates the **HTML mode** for simple pages β€” no build step, no React, just HTML + CSS + Pi SDK. diff --git a/pirc4/docs/6-editor-ui-layout.md b/pirc4/docs/6-editor-ui-layout.md new file mode 100644 index 000000000..10d967b4f --- /dev/null +++ b/pirc4/docs/6-editor-ui-layout.md @@ -0,0 +1,373 @@ +# Pi Visual Builder β€” Editor UI Layout + +## Editor Overview + +The Pi Visual Builder editor provides a professional, intuitive layout adapted for the Pi Browser environment. + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ [Pi Logo] My Pi Shop β–Ύ β”‚ Design β”‚ Workflow β”‚ Data β”‚ Styles β”‚ Plugins β”‚ πŸ€– AI β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ β”‚ β”‚ +β”‚ ELEMENTS β”‚ β”‚ PROPS β”‚ +β”‚ TREE β”‚ CANVAS β”‚ EDITOR β”‚ +β”‚ β”‚ (WYSIWYG Preview) β”‚ β”‚ +β”‚ β–Ύ Page β”‚ β”‚ ────── β”‚ +β”‚ β–Ύ Headerβ”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Layout β”‚ +β”‚ Logo β”‚ β”‚ β˜• Pi Coffee Shop β”‚ β”‚ Appearanceβ”‚ +β”‚ Nav β”‚ β”‚ β”‚ β”‚ Contentβ”‚ +β”‚ β–Ύ Body β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”‚ β”‚ Conditionalβ”‚ +β”‚ Hero β”‚ β”‚ β”‚Eth. β”‚ β”‚Col. β”‚ β”‚ β”‚ Custom β”‚ +β”‚ Grid β”‚ β”‚ β”‚ 5Pi β”‚ β”‚ 4Pi β”‚ β”‚ β”‚ β”‚ +β”‚ β–Ύ Footerβ”‚ β”‚ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ +β”‚ Links β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ [πŸ›’ Order with Escrow] β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ NEW + β”‚ πŸ“± Mobile πŸ“± Tablet πŸ’» Desktop β–Ά Preview β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ€– Pi AI Assistant: "How can I help? Type a prompt or ask me to..." β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## Top Navigation Bar + +| Button | Icon | Function | +|--------|------|----------| +| **App Name** | πŸ“± | Dropdown: switch pages, backend workflows, settings | +| **Design** | 🎨 | Switch to visual canvas editor | +| **Workflow** | ⚑ | Switch to event/action logic editor | +| **Data** | πŸ—„οΈ | Switch to database types & privacy rules | +| **Styles** | 🎭 | Switch to style variables & element styles | +| **Plugins** | 🧩 | Switch to plugin marketplace & API connector | +| **πŸ€– AI** | πŸ€– | Toggle AI Assistant panel | +| **β–Ά Preview** | β–Ά | Live preview in Pi Browser simulator | +| **πŸš€ Deploy** | πŸš€ | Publish app to Pi ecosystem | + +## Left Panel: Elements Tree + +### Structure +``` +β–Ύ index (Page) + β–Ύ Header (Group) + Logo (Image) + NavLinks (Group) + Home (Text) + Shop (Text) + Orders (Text) + Profile (Text) + CartBadge (Icon) + β–Ύ Body (Group) + HeroSection (Group) + HeroImage (Image) + HeroTitle (Text) + HeroSubtitle (Text) + ProductGrid (RepeatingGroup) + β–Ύ ProductCard (Group) + ProductImage (Image) + ProductName (Text) + ProductPrice (Text) + BuyButton (PiPayButton) + ReputationBadge (ReputationBadge) + β–Ύ Footer (Group) + Links (Group) + Copyright (Text) +``` + +### Elements Tree Buttons +| Button | Function | +|--------|----------| +| **+ New Element** | Add element to canvas (opens element picker) | +| **⬆ ⬇** | Move element up/down in hierarchy | +| **πŸ‘** | Show/hide element on canvas | +| **πŸ”’** | Lock element position | +| **πŸ“‹** | Duplicate element | +| **πŸ—‘** | Delete element | + +### Element Picker (Popup) +When clicking **+ New Element**, a categorized picker appears: + +| Category | Elements | +|----------|----------| +| **Layout** | Group (Container), Column, Row, RepeatingGroup, TabGroup, ScrollView | +| **Text** | Text, Heading, Paragraph, Link, RichText | +| **Input** | TextInput, TextArea, Dropdown, Checkbox, DatePicker, Slider, FileUpload | +| **Button** | Button, IconButton, PiPayButton, LinkButton | +| **Image** | Image, Icon, Avatar, Logo | +| **Media** | Video, Audio, Map, Chart | +| **Navigation** | NavBar, TabBar, Sidebar, BottomSheet, Modal | +| **Pi-Native** | PioneerCard, ReputationBadge, EscrowStatus, MerchantProfile, LoyaltyCard | +| **Custom** | Your custom components from marketplace | + +## Center: Canvas (WYSIWYG) + +### Canvas Toolbar +| Button | Function | +|--------|----------| +| **πŸ“± Mobile** | Preview at 375px width | +| **πŸ“± Tablet** | Preview at 768px width | +| **πŸ’» Desktop** | Preview at 1280px width | +| **πŸ” Zoom** | Zoom in/out on canvas | +| **↩ β†ͺ** | Undo / Redo | +| **πŸ“ Snap** | Toggle snap-to-grid | +| **πŸ“ Guides** | Show alignment guides | +| **β–Ά Run** | Live preview with working logic | + +### Canvas Interactions +- **Click**: Select element β†’ show Property Editor +- **Double-click**: Select element + open Property Editor focused +- **Drag**: Move element on canvas +- **Drag from panel**: Add new element from Elements Tree +- **Right-click**: Context menu (Copy, Paste, Delete, Move to front/back) +- **Ctrl+Z**: Undo +- **Ctrl+S**: Save (auto-save enabled by default) + +## Right Panel: Property Editor + +### Layout Section +| Field | Type | Description | +|-------|------|-------------| +| **Width** | px / % / fit | Element width | +| **Height** | px / % / fit | Element height | +| **Margin** | top/right/bottom/left | Outer spacing | +| **Padding** | top/right/bottom/left | Inner spacing | +| **Align** | left/center/right/stretch | Horizontal alignment within parent | +| **Float** | none/left/right | Float behavior | +| **Overflow** | visible/hidden/scroll | Content overflow handling | + +### Appearance Section +| Field | Type | Description | +|-------|------|-------------| +| **Background** | color / gradient / image | Element background | +| **Border** | width / style / color / radius | Border properties | +| **Shadow** | offset / blur / spread / color | Box shadow | +| **Opacity** | 0-100% | Element transparency | +| **Font** | family / size / weight / color | Typography | +| **Transition** | property / duration / easing | Animation on state change | + +### Content Section (Dynamic Data) +| Field | Type | Description | +|-------|------|-------------| +| **Static Text** | string | Fixed text content | +| **Dynamic Data** | πŸ“Ž button | Insert data from Data Tab (e.g., `Product's name`) | +| **Conditional** | πŸ”„ button | Show different content based on condition | + +### Conditional Tab +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Condition 1: When Product's stock = 0 β”‚ +β”‚ β†’ Background: #FF0000 (Red) β”‚ +β”‚ β†’ Text: "Out of Stock" β”‚ +β”‚ β†’ Button: Hidden β”‚ +β”‚ β”‚ +β”‚ Condition 2: When Product's stock < 5 β”‚ +β”‚ β†’ Text: "Only {stock} left!" β”‚ +β”‚ β†’ Background: #FFA500 (Orange) β”‚ +β”‚ β”‚ +β”‚ [+ Add Condition] β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## πŸ€– AI Assistant Panel (Bottom Bar) + +### Layout +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ πŸ€– Pi AI Assistant [βœ• Close] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ€– Hi! I'm your Pi AI Assistant. I can: β”‚ +β”‚ β€’ Build UI elements and pages β”‚ +β”‚ β€’ Create workflows and logic β”‚ +β”‚ β€’ Set up database schemas β”‚ +β”‚ β€’ Connect APIs and plugins β”‚ +β”‚ β€’ Fix bugs and optimize performance β”‚ +β”‚ β”‚ +β”‚ πŸ§‘ "Build a product listing page with escrow payment" β”‚ +β”‚ β”‚ +β”‚ πŸ€– I'll create that for you! Here's what I'm doing: β”‚ +β”‚ βœ… Created RepeatingGroup "ProductGrid" β”‚ +β”‚ βœ… Added ProductCard with Image, Name, Price β”‚ +β”‚ βœ… Added PiPayButton with escrow enabled β”‚ +β”‚ βœ… Created "Product" data type with fields β”‚ +β”‚ βœ… Added "When BuyButton clicked β†’ Create Escrow" workflow β”‚ +β”‚ β”‚ +β”‚ πŸ§‘ "Make it look more professional" β”‚ +β”‚ β”‚ +β”‚ πŸ€– I've updated the design: β”‚ +β”‚ βœ… Applied Pi Design System theme β”‚ +β”‚ βœ… Added card shadows and rounded corners β”‚ +β”‚ βœ… Improved spacing and typography β”‚ +β”‚ βœ… Added ReputationBadge next to each seller β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Type your request here... ➀ Sendβ”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### AI Quick Actions +| Button | Action | +|--------|--------| +| **🎨 Build UI** | "Describe what you want to build" | +| **⚑ Add Logic** | "What should happen when..." | +| **πŸ—„οΈ Create Data** | "What data does your app need?" | +| **πŸ”— Connect API** | "What external service to connect?" | +| **πŸ› Fix Issue** | "Describe the problem you're seeing" | +| **✨ Improve Design** | "Make it look better / more professional" | + +### AI Capabilities by Tab +| Tab | What AI Can Do | +|-----|----------------| +| **Design** | Create elements, apply styles, build responsive layouts, add Pi components | +| **Workflow** | Build event-action chains, add conditional logic, create custom workflows | +| **Data** | Create data types, define fields, set up relations, configure privacy rules | +| **Styles** | Generate theme colors, create style variables, apply consistent branding | +| **Plugins** | Recommend plugins, configure API connections, set up Pi SDK integration | + +## Workflow Tab Layout + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ [Pi Logo] My Pi Shop β–Ύ β”‚ Design β”‚ ⚑Workflowβ”‚ Data β”‚ ... β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ β”‚ +β”‚ EVENTS β”‚ WORKFLOW CANVAS β”‚ +β”‚ β”‚ β”‚ +β”‚ πŸ“„ Page β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ Events β”‚ β”‚ When: BuyButton is clicked β”‚ β”‚ +β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ πŸ–±οΈ Elementβ”‚ β”‚ β”‚ Step 1: Show element "LoadingSpinner" β”‚ β”‚ β”‚ +β”‚ Events β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ ⏰ Custom β”‚ β”‚ β”‚ Step 2: Pi β†’ Create Escrow β”‚ β”‚ β”‚ +β”‚ Workflows β”‚ β”‚ β”‚ buyer = Current Pioneer β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ seller = Product's owner β”‚ β”‚ β”‚ +β”‚ πŸ“… Sched. β”‚ β”‚ β”‚ amount = Product's price β”‚ β”‚ β”‚ +β”‚ Workflows β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ πŸ”— API β”‚ β”‚ β”‚ Step 3: Navigate to "EscrowStatus" page β”‚ β”‚ β”‚ +β”‚ Workflows β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ πŸͺ™ Pi β”‚ β”‚ [+ Add Step] β”‚ β”‚ +β”‚ Workflows β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ [+ New] β”‚ ───────────────────────────────────────────────────── β”‚ +β”‚ β”‚ πŸ€– "I need a workflow that handles expired escrows" β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ€– Pi AI: "How can I help with your workflows?" β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Workflow Step Types +| Category | Steps Available | +|----------|----------------| +| **Element** | Show/Hide, Animate, Scroll to, Set state | +| **Data** | Create record, Update record, Delete record, Make changes to list | +| **Navigation** | Go to page, Go to page with data, Open popup, Close popup | +| **Pi Payments** | Send Pi, Create Escrow, Confirm Receipt, Create Milestone Escrow | +| **Pi Trust** | Get Reputation, Award Badge, Create Attestation, Verify Merchant | +| **Pi Dispute** | Open Dispute, Submit Evidence, Execute Ruling | +| **Pi Loyalty** | Earn Points, Redeem Reward | +| **API** | Call API, Call Pi SDK method | +| **Logic** | If/Else, Custom Event, Pause, Resume, Cancel | +| **Utility** | Set variable, Run JavaScript, Send email, Show toast | + +## Data Tab Layout + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ [Pi Logo] My Pi Shop β–Ύ β”‚ Design β”‚ Workflow β”‚ πŸ—„οΈDataβ”‚ ... β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ β”‚ +β”‚ DATA β”‚ DATA TYPE: Product β”‚ +β”‚ TYPES β”‚ β”‚ +β”‚ β”‚ Fields: β”‚ +β”‚ πŸ“¦ Productβ”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ πŸ“¦ Order β”‚ β”‚ Field β”‚ Type β”‚ Linked β”‚ Privacy β”‚ β”‚ +β”‚ πŸ“¦ Review β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ +β”‚ πŸ“¦ Merchantβ”‚ β”‚ name β”‚ text β”‚ β€” β”‚ Public (read) β”‚ β”‚ +β”‚ πŸ“¦ Pioneerβ”‚ β”‚ price β”‚ number β”‚ β€” β”‚ Public (read) β”‚ β”‚ +β”‚ β”‚ β”‚ image β”‚ image β”‚ β€” β”‚ Public (read) β”‚ β”‚ +β”‚ [+ New β”‚ β”‚ stock β”‚ number β”‚ β€” β”‚ Seller (write) β”‚ β”‚ +β”‚ Type] β”‚ β”‚ seller β”‚ Pioneer β”‚ πŸ”— β”‚ Public (read) β”‚ β”‚ +β”‚ β”‚ β”‚ category β”‚ option β”‚ β€” β”‚ Public (read) β”‚ β”‚ +β”‚ β”‚ β”‚ escrow β”‚ Escrow β”‚ πŸ”— β”‚ Owner (read) β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ β”‚ [+ Add Field] β”‚ +β”‚ β”‚ β”‚ +β”‚ β”‚ πŸ€– "I need a review system for products" β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ€– Pi AI: "I'll create a Review data type linked to Product" β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Field Types +| Type | Icon | Description | PiDCTP Link | +|------|------|-------------|-------------| +| **text** | Aa | Short text string | β€” | +| **number** | # | Numeric value | β€” | +| **boolean** | βœ“ | True/false | β€” | +| **date** | πŸ“… | Date/time | β€” | +| **image** | πŸ–ΌοΈ | Image file | β€” | +| **address** | πŸ“ | Pi wallet address | Pioneer/Merchant | +| **option** | πŸ“‹ | Predefined choice | EscrowState, Tier, Category | +| **relation** | πŸ”— | Link to another type | Order β†’ Escrow, Product β†’ Merchant | +| **geographic** | 🌍 | Lat/lng coordinates | β€” | +| **file** | πŸ“Ž | File attachment | β€” | + +## Styles Tab Layout + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ [Pi Logo] My Pi Shop β–Ύ β”‚ Design β”‚ ... β”‚ 🎭Stylesβ”‚ ... β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ β”‚ +β”‚ STYLE β”‚ STYLE VARIABLES β”‚ +β”‚ VARIABLES β”‚ β”‚ +β”‚ β”‚ 🎨 Colors β”‚ +β”‚ 🎨 Colors β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ πŸ”€ Fonts β”‚ β”‚ Variable β”‚ Value β”‚ Used By β”‚ β”‚ +β”‚ πŸ“ Spacingβ”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ +β”‚ πŸ“ Radius β”‚ β”‚ pi-primary β”‚ #6B46F5 β”‚ Buttons, Links β”‚ β”‚ +β”‚ β”‚ β”‚ pi-success β”‚ #48BB78 β”‚ Confirmations β”‚ β”‚ +β”‚ [+ New] β”‚ β”‚ pi-error β”‚ #F56565 β”‚ Errors, Disputes β”‚ β”‚ +β”‚ β”‚ β”‚ pi-bg β”‚ #FFFFFF β”‚ Page backgrounds β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ ELEMENT β”‚ πŸ”€ Fonts β”‚ +β”‚ STYLES β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ Variable β”‚ Value β”‚ Used By β”‚ β”‚ +β”‚ πŸ“¦ Button β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ +β”‚ πŸ“¦ Card β”‚ β”‚ pi-heading β”‚ 24px/600 β”‚ Page titles β”‚ β”‚ +β”‚ πŸ“¦ Input β”‚ β”‚ pi-body β”‚ 14px/400 β”‚ Body text β”‚ β”‚ +β”‚ πŸ“¦ Badge β”‚ β”‚ pi-caption β”‚ 12px/400 β”‚ Labels, hints β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ [+ New] β”‚ β”‚ +β”‚ β”‚ πŸ€– "Generate a dark theme for my app" β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ€– Pi AI: "I've created dark theme variables. Apply them?" β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## Keyboard Shortcuts + +| Shortcut | Action | +|----------|--------| +| **Ctrl+Z** | Undo | +| **Ctrl+Y** | Redo | +| **Ctrl+S** | Save | +| **Ctrl+C** | Copy element | +| **Ctrl+V** | Paste element | +| **Delete** | Delete selected | +| **Ctrl+D** | Duplicate element | +| **Ctrl+G** | Group selected elements | +| **Ctrl+Shift+G** | Ungroup | +| **Ctrl+Enter** | Preview app | +| **Ctrl+/ ** | Toggle AI Assistant | +| **Ctrl+1** | Switch to Design tab | +| **Ctrl+2** | Switch to Workflow tab | +| **Ctrl+3** | Switch to Data tab | +| **Ctrl+4** | Switch to Styles tab | +| **Ctrl+5** | Switch to Plugins tab | diff --git a/pirc4/mockups/1-design-tab.html b/pirc4/mockups/1-design-tab.html new file mode 100644 index 000000000..6506a731d --- /dev/null +++ b/pirc4/mockups/1-design-tab.html @@ -0,0 +1,217 @@ + + + + + +Pi Visual Builder β€” Design Tab + + + + + +
+ + Pi Coffee β–Ύ + + + + + +
+ + +
+
+ +
+
+
Elements
+
index
+
Header
+
Logo
+
Nav
+
Cart
+
Body
+
Hero
+
Grid
+
Card
+
Img
+
Name
+
Price
+
Badge
+
Buy
+
Footer
+
New Element
+ +
+
Props β€” Grid
+
Width
+
Cols
+
Gap
+
Conditional
+
+
stock = 0
+ Buy β†’ Hidden, BG β†’ Red +
+
+
stock < 5
+ Text β†’ "Only {n} left!" +
+
+
+ +
+
+ + +
+ + + +
+
+
+
+

Pi Coffee

+ 2 +
+
+
+
+
+
+
Ethiopian
+
5 Pi
+ Gold + +
+
+
+
Colombian
+
4 Pi
+ Gold + +
+
+
+
Matcha
+
3 Pi
+ Silver + +
+
+
+
Mocha
+
4 Pi
+ Gold + +
+
+
+
+
+
+ +
+
+
+
+ Pi AI + ● Online + +
+
+
"Add a search bar above the products"
+
βœ… Created SearchBar above ProductGrid
βœ… Added filter workflow
βœ… Applied Pi Design System
+
+
+ + +
+
+ + + + diff --git a/pirc4/mockups/2-workflow-tab.html b/pirc4/mockups/2-workflow-tab.html new file mode 100644 index 000000000..3069fcad5 --- /dev/null +++ b/pirc4/mockups/2-workflow-tab.html @@ -0,0 +1,235 @@ + + + + + +Pi Visual Builder β€” Workflow Tab + + + + + +
+ + Pi Coffee β–Ύ + + + + + +
+ +
+
+ +
+
Current Event
+
+ WHEN + BuyButton clicked + +
+
+ +
+
+
+ 1 + Show Element + Element + +
+
+
+ Element + LoadingSpinner +
+
+ Action + Show +
+
+
+
+ +
+
+ 2 + Pi β†’ Create Escrow + Pi Payment + +
+
+
+ Buyer + Current Pioneer +
+
+ Seller + Product's seller +
+
+ Amount + Product's price +
+
+ Token + PI +
+
+
+
+ +
+
+ 3 + Update Record + Data + +
+
+
+ Type + Product +
+
+ Field + stock = stock - 1 +
+
+
+
+ +
+
+ 4 + Navigate + Navigation + +
+
+
+ Page + EscrowStatus +
+
+ Data + escrowId +
+
+
+ +
Add Step
+
+ +
+ + + + + + + + +
+ +
+
+
+
+ Pi AI + +
+
+
"When buy clicked, create escrow and go to status"
+
βœ… Built 4-step workflow
βœ… Linked dynamic data
βœ… Added error handling
+
+
+ + +
+
+ + + + diff --git a/pirc4/mockups/3-data-tab.html b/pirc4/mockups/3-data-tab.html new file mode 100644 index 000000000..37c78c764 --- /dev/null +++ b/pirc4/mockups/3-data-tab.html @@ -0,0 +1,274 @@ + + + + + +Pi Visual Builder β€” Data Tab + + + + + +
+ + Pi Coffee β–Ύ + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ +
+
+
Product PiDCTP: Escrow
+ +
+ +
+
+ name + text +
+
+ Public read +
+
+ +
+
+ price + number +
+
+ Public read +
+
+ +
+
+ image + image +
+
+ Public read +
+
+ +
+
+ stock + number +
+
+ Seller write +
+
+ +
+
+ seller + Pioneer +
+
+ Linked + Public read +
+
+ +
+
+ category + option +
+
+ Public read +
+
+ +
+
+ escrow + Escrow +
+
+ Linked + Owner read + Escrow.state +
+
+ +
+
+ reputation + address +
+
+ Public read + Rep.score +
+
+ +
+
Relations
+
+ Product + 1:N + Order +
+
+ Product + N:1 + Pioneer +
+
+ Order + 1:1 + Escrow +
+
+ +
+
Privacy Rules
+
+
Everyone
+
+ βœ“ Read: name, price, image, category
+ βœ— Write: all fields +
+
+
+
Seller (Owner)
+
+ βœ“ Read: all fields
+ βœ“ Write: stock, image, price +
+
+
+
PiDCTP Contract
+
+ βœ“ Write: escrow (state only) +
+
+
+
+ +
+
+
+
+ Pi AI + +
+
+
"I need a review system for products"
+
βœ… Created "Review" data type
βœ… Added relation: Product β†’ 1:N β†’ Review
βœ… Set privacy: Only author can write
+
+
+ + +
+
+ + + + diff --git a/pirc4/mockups/4-styles-tab.html b/pirc4/mockups/4-styles-tab.html new file mode 100644 index 000000000..4b52459a3 --- /dev/null +++ b/pirc4/mockups/4-styles-tab.html @@ -0,0 +1,288 @@ + + + + + +Pi Visual Builder β€” Styles Tab + + + + + +
+ + Pi Coffee β–Ύ + + + + + +
+ +
+
+ +
+
+
Style Variables
+ +
+ + +
+
Colors
+
+
+ pi-primary +
+
+
+ +
+
Used by: Buttons, Links, Active tabs
+
+
+
+ pi-success +
+
+
+ +
+
Used by: Confirmations, Verified badges
+
+
+
+ pi-error +
+
+
+ +
+
Used by: Errors, Disputes, Alerts
+
+
+
+ pi-warning +
+
+
+ +
+
Used by: PiDCTP links, Warnings
+
+
+
+ pi-bg +
+
+
+ +
+
Used by: Page backgrounds, Cards
+
+
+ + +
+
Fonts
+
+
+ pi-heading +
+
+ +
+
Pi Coffee Shop
+
Used by: Page titles, Hero text
+
+
+
+ pi-body +
+
+ +
+
Fresh roasted, Pi-powered coffee
+
Used by: Body text, Descriptions
+
+
+
+ pi-caption +
+
+ +
+
5 Pi per bag Β· Escrow protected
+
Used by: Labels, Hints, Captions
+
+
+ + +
+
+
Element Styles
+ +
+
+
+ Button-primary + base: button +
+
+ pi-primary + 14px/600 + 8px radius + 8px 16px +
+
+
+
+ Button-outline + base: button +
+
+ pi-primary border + 14px/600 + 8px radius +
+
+
+
+ Card-default + base: group +
+
+ #f7f7fc + 10px radius + 10px + shadow-sm +
+
+
+
+ Badge-gold + base: text +
+
+ #FFD700 + 9px/600 + 4px radius +
+
+
+ + +
+
Live Preview
+
+
Pi Coffee Shop
+
Fresh roasted, Pi-powered coffee with escrow protection.
+ + +

+ Gold Seller + Silver +
+
+
+ +
+
+
+
+ Pi AI + +
+
+
"Generate a dark theme for my app"
+
βœ… Created dark theme variables
βœ… pi-bg β†’ #1a1a2e, pi-text β†’ #e0e0e0
βœ… Updated Card-default to dark surface
βœ… Preview updated β€” Apply changes?
+
+
+ + +
+
+ + + +