Cycles
Design · c32

Security Policy Pages

archivedcreated 2026-09-11· last activity 2026-09-11

Why

The design site has a security overview page mock (c31), but security policies — the listing and detail views — are not yet represented. These pages are a core part of the security workflow and need clean reference mocks.

Objective

Add policy listing and policy detail page mocks to the design site's Pages section, driven by Figma designs.

Scope

  • Populate policy detail page mock from Figma policies/policy-2 frame
  • Populate policy listing page mock (Figma frame TBD — couldn't locate node ID in this session)
  • Maximize reuse of existing layer components
  • Extract new components to layer only if reusable

Key Changes

  • Page registry: Two entries already exist (policy-listing, policy-detail)
  • Stub pages: app/pages/pages/policy-listing.vue, app/pages/pages/policy-detail.vue (both created, need content)

Outcome

  • /pages/policy-detail renders a static, data-complete recreation of the policy detail page using 17 existing layer components and zero new ones
  • /pages/policy-listing stub exists, pending Figma frame confirmation
  • Built /figma-to-vue skill (.claude/skills/figma-to-vue.md) — codifies the Figma→component-map→Vue workflow that emerged from this cycle's policy-detail work

Figma Source

  • File: WmU8tsRKnhTEbYy0l74lKD (app.qpoint.io---4.1.filter)
  • Policy detail frame: node 6429:16195 (name: policies/policy-2)
  • Policy listing frame: Not yet located — need node ID from Mark

Component Mapping — Policy Detail

Analysis of Figma frame policies/policy-2. The page has 6 sections. Ignoring left nav and breadcrumb per Mark's instruction.

1. Policy Header

Top card area with policy name, description, metadata, stats, and ribbon.

ElementComponentStatus
Card wrapper with border + ribbonSecurityPolicySkin + SecurityPolicyRibbonExists (c21)
Stats (Flows Prevented: 1.2k, Compliance: 98%, Violations: 3)DataMetric_SimpleExists
Metadata (Last Updated: 2026-01-15, Regulations: CCPA, state privacy Laws)DataKeyVal or plain textExists

2. Rules

Sentence-builder-style rule rows with tag pill selects.

ElementComponentStatus
Section header "Rules" with "+ Add"Hairline + bold text + add patternExisting pattern
Tag pills with dropdowns (allowed_regions, any of, amsterdam-2, london-1)SentenceSelectExists (c20)
Row of pills per ruleSentenceRowExists (c20)
Close/X on each rule rowUxCloseExists
Plus button to add tagIconPlusExists
"Auto Enforce Policy" toggle + "Learn more" linkUxToggleExists

3. Violations

Table of policy violations + map visualization.

ElementComponentStatus
Section title "Violations"Hairline + bold textPattern
Table (Source, Dataflow, Destination, Violation, Time)UxTableListExists
Dataflow column (●--{PII}-->)SecurityDataFlowExists (c19)
Map visualizationImage placeholderNot a component — static mock image
"Disallowed Data Flows / PII Data found leaving EU" calloutPositioned text overlay on mapCustom layout

4. Data Masking

Three toggles + a data transformation visualization.

ElementComponentStatus
Section titleHairline + bold textPattern
Three toggles (Enable Data Mask, Anonymize Data, Redact Data)UxToggleExists
Masking visualization (William Obrien → John Doe → *** ******)New — mock onlyThree-column text with arrow separators. Not complex enough for a component — inline layout in the mock.

5. Policy Whitelist

Three columns of whitelisted endpoints with add/remove.

ElementComponentStatus
Section title "Policy Whitelist"Hairline + bold textPattern
Three columns: Apps/Services, Datastores, VendorsGrid layout
Column headers with "+ Add"Small section header + add patternPattern matches FormSmallHeader
Endpoint items (e.g., "secondary.feeder", "fake-data-dev-db") with X removeText + UxCloseSimple inline row
Ribbon decorations on some columnsSecurityPolicyRibbonExists

6. Notifications

Multiple notification configs using sentence builder pattern. This is essentially the AlertConfig pattern (c20) repeated with variations.

ElementComponentStatus
Section title "Notifications" with "+ Add"Hairline + bold text + addPattern
Active/Inactive toggle per notificationUxToggleExists
Condition row (for every violation / if total violations exceed 100...)SentenceRow + SentenceSelect + SentenceNumberExists (c20)
Action row (Send HTTP Request, POST, http:// / send a message, to Slack)SentenceRow + SentenceSelect + SentenceTextExists (c20)
Throttling row (No Throttling / collate & summarize, send no more than...)SentenceRow + SentenceSelect + SentenceNumberExists (c20)
Close/remove button per notificationUxCloseExists
"Mute for X time" / "Unmute" buttonsUxButtonExists
"Active - Muted" state with "Muted for the next 2 days"Text + icon indicatorInline layout
"Mute All Notifications for X time" buttonUxButtonExists

Component Mapping — Policy Listing

Figma frame not yet located. Based on existing SecurityPolicyCard (extracted in c15 from the same Figma file, node 6419:28548), the listing page likely uses:

ElementComponentStatus
Grid/list of policy cardsSecurityPolicyCardExists (c15) — 4 sizes, 2 states (cool/hot), stats + spark
Card wrapperSecurityPolicySkinExists (c21)
Section headersExisting patterns

Next step: Get the "policies" list frame node ID from Mark to confirm layout and any additional elements.

Summary

Heavy reuse — the vast majority maps to existing layer components:

  • Security family (6): SecurityPolicySkin, SecurityPolicyRibbon, SecurityPolicyCard, SecurityDataFlow, SecurityViolationsTable, SecuritySeverity
  • Sentence builder (4): SentenceRow, SentenceSelect, SentenceNumber, SentenceText
  • Core UX (3): UxToggle, UxClose, UxButton
  • Data (2): DataMetric_Simple, DataKeyVal
  • Table (1): UxTableList
  • Icons (1): IconPlus

Nothing new needed for the layer. The data masking visualization and whitelist item rows are simple enough to be inline layout in the mock page — no extraction warranted.

Build Order

  1. Policy detail first — more complex, better test of component reuse
  2. Policy listing second — pending Figma frame confirmation

Learnings

  • Bob-wire vs design site: Bob-wire's pipeline (brief→build→review→iterate) solves exploration — "what should this look like?" The design site's page mocks solve transcription — "replicate this Figma frame with real components." Different starting points, different tools. When you have a Figma design, bob-wire is redundant.
  • Component detection is the skill: The hard part isn't writing the Vue file — it's mapping every Figma element to the right existing component. The component map table (Step 2 of /figma-to-vue) is the real deliverable; the code follows mechanically from it.
  • 126 components cover most things: The policy detail page used 17 existing components across 6 families with zero new extractions needed. The layer is more complete than it feels.

Visual record

7 captures — heroes, page slices, and full-page renders. Click to view.

Security policy listing with status and enforcement summary
Security policy listing with status and enforcement summary
c32 hero
c32 slice
c32 slice
c32 slice
c32 full
c32 full

In the archive

Artifacts

  • initial-prompt.md
  • initial-prompt.md

Qpoint Brand Style Guide