/* Visual editor */ /* * FunnelFork brand tokens (design system "FunnelFork", light theme). * Exposed as custom properties on the editor screen so FunnelFork Pro and * popovers rendered outside .fs-editor use the same colours. */ body.funnelfork-editor-screen { --ff-board: #f2f6f4; --ff-board-raised: #fff; --ff-board-sunken: #e7eeeb; --ff-wire: #c6d4cf; --ff-wire-strong: #748c85; --ff-ink: #10201f; --ff-ink-muted: #4d605c; --ff-teal: #0d7a69; --ff-teal-soft: #e3f4f0; --ff-on-teal: #fff; --ff-teal-bright: #5fd3be; --ff-amber: #f2a93b; --ff-amber-soft: #fcebcf; --ff-amber-ink: #8a5300; --ff-on-amber: #10201f; --ff-circuit: #10201f; --ff-on-circuit: #f2f6f4; --ff-on-circuit-muted: #a9bdb8; --ff-danger: #b42318; --ff-danger-soft: #fde7e4; --ff-radius-s: 6px; --ff-radius-m: 10px; --ff-radius-l: 16px; --ff-shadow-node: 0 1px 2px #10201f14, 0 4px 12px #10201f12; --ff-shadow-pop: 0 2px 4px #10201f14, 0 12px 32px #10201f1f; --ff-font-display: "Bricolage Grotesque", -apple-system, "Segoe UI", system-ui, sans-serif; --ff-font-body: "IBM Plex Sans", -apple-system, "Segoe UI", system-ui, sans-serif; --ff-font-mono: "IBM Plex Mono", ui-monospace, Consolas, monospace; /* WordPress components (buttons, tabs, toggles, focus rings) in teal. */ --wp-admin-theme-color: #0d7a69; --wp-admin-theme-color--rgb: 13, 122, 105; --wp-admin-theme-color-darker-10: #0a6658; --wp-admin-theme-color-darker-10--rgb: 10, 102, 88; --wp-admin-theme-color-darker-20: #08544a; --wp-admin-theme-color-darker-20--rgb: 8, 84, 74; } /* Label style: mono, uppercase, tracked. */ @mixin ff-label { font-family: var(--ff-font-mono); font-size: 10px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.08em; } /* Use the full screen below the admin bar. */ body.funnelfork-editor-screen { #wpbody-content { padding-bottom: 0; } #wpfooter, #wpbody-content > .notice, #wpbody-content > .update-nag { display: none; } // Freemius shows its notices with display: block !important. #wpbody-content > .fs-notice { display: none !important; } #wpcontent { padding-left: 0; } } .funnelfork-editor-root { height: calc(100vh - 32px); @media (max-width: 782px) { height: calc(100vh - 46px); } } .funnelfork-editor-loading { padding: 24px; } .fs-editor { display: flex; flex-direction: column; height: 100%; background: var(--ff-board-raised); color: var(--ff-ink); font-family: var(--ff-font-body); position: relative; &--loading, &--error { align-items: center; justify-content: center; } } /* Top bar */ .fs-topbar { display: flex; align-items: center; gap: 12px; height: 60px; padding: 0 16px; border-bottom: 1px solid var(--ff-wire); background: var(--ff-board-raised); flex-shrink: 0; &__back { font-size: 20px; text-decoration: none; color: var(--ff-ink); width: 36px; height: 36px; display: grid; place-items: center; border-radius: var(--ff-radius-s); &:hover { background: var(--ff-board); color: var(--ff-ink); } &:focus-visible { outline: 2px solid var(--ff-teal); outline-offset: 2px; box-shadow: none; } } &__logo { display: flex; align-items: center; gap: 6px; padding-right: 12px; border-right: 1px solid var(--ff-wire); font-family: var(--ff-font-display); font-size: 18px; font-weight: 800; letter-spacing: -0.03em; line-height: 1; color: var(--ff-ink); white-space: nowrap; svg { width: 26px; height: 26px; flex: none; } b { color: var(--ff-teal); font-weight: inherit; } @media (max-width: 960px) { span { display: none; } } } &__title { font-family: var(--ff-font-display); font-size: 17px; font-weight: 700; letter-spacing: -0.01em; color: var(--ff-ink); border: 1px solid transparent !important; border-radius: var(--ff-radius-s) !important; box-shadow: none !important; min-width: 120px; max-width: 420px; flex: 1; padding: 4px 8px; &:hover { border-color: var(--ff-wire) !important; } &:focus { border-color: var(--ff-wire-strong) !important; } } &__state { color: var(--ff-ink-muted); font-size: 12px; white-space: nowrap; } &__actions { margin-left: auto; display: flex; gap: 8px; } } .fs-editor .components-button { border-radius: var(--ff-radius-s); font-family: var(--ff-font-body); font-weight: 600; } .fs-status { @include ff-label; padding: 3px 8px; border-radius: var(--ff-radius-s); background: var(--ff-board-sunken); color: var(--ff-ink-muted); &.is-publish { background: var(--ff-teal-soft); color: var(--ff-teal); } } /* Not .fs-notice: Freemius uses that class for its admin notices. */ .fs-editor-notice { position: absolute; top: 68px; left: 50%; transform: translateX(-50%); z-index: 20; min-width: 320px; box-shadow: var(--ff-shadow-pop); border-radius: var(--ff-radius-m); overflow: hidden; .components-notice { margin: 0; } } .fs-body { display: flex; flex: 1; min-height: 0; } /* Canvas: the board with a wire dot grid. */ .fs-canvas { flex: 1; position: relative; background: var(--ff-board); .react-flow { --xy-background-color: var(--ff-board); --xy-background-pattern-dots-color-default: var(--ff-wire); --xy-minimap-background-color-default: var(--ff-board-raised); --xy-minimap-mask-background-color-default: rgba(16, 32, 31, 0.08); --xy-controls-button-background-color-default: var(--ff-board-raised); --xy-controls-button-background-color-hover-default: var(--ff-board); --xy-controls-button-color-default: var(--ff-ink); --xy-controls-button-border-color-default: var(--ff-wire); --xy-edge-stroke-default: var(--ff-wire-strong); --xy-edge-stroke-selected-default: var(--ff-teal); --xy-connectionline-stroke-default: var(--ff-teal); font-family: var(--ff-font-body); } .react-flow__controls, .react-flow__minimap { border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-m); box-shadow: var(--ff-shadow-node); overflow: hidden; } } .fs-toolbar { display: flex; flex-wrap: wrap; gap: 6px; background: var(--ff-board-raised); padding: 6px; border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-m); box-shadow: var(--ff-shadow-node); .components-button.is-secondary { background: var(--ff-board-raised); } } .fs-hint { font-size: 12px; color: var(--ff-ink-muted); background: rgba(255, 255, 255, 0.9); border: 1px solid var(--ff-wire); padding: 4px 12px; border-radius: 9999px; } /* Nodes */ .fs-node { background: var(--ff-board-raised); color: var(--ff-ink); border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-m); width: 260px; box-shadow: var(--ff-shadow-node); font-size: 13px; position: relative; transition: border-color 0.15s ease, box-shadow 0.15s ease; &.is-selected { border-color: var(--ff-teal); box-shadow: 0 0 0 1px var(--ff-teal), var(--ff-shadow-node); } &__kind { @include ff-label; color: var(--ff-ink-muted); padding: 12px 12px 0; display: flex; align-items: center; gap: 6px; } &__title { font-family: var(--ff-font-body); font-size: 14px; font-weight: 600; padding: 4px 12px 12px; line-height: 1.35; word-break: break-word; em { font-weight: 400; color: var(--ff-ink-muted); } } &__meta { font-size: 11px; color: var(--ff-ink-muted); padding: 0 12px 12px; } &__issue { position: absolute; top: -9px; right: -9px; width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--ff-board-raised); box-sizing: content-box; color: #fff; font-weight: 700; font-size: 12px; display: grid; place-items: center; &.is-error { background: var(--ff-danger); } &.is-warning { background: var(--ff-amber); color: var(--ff-on-amber); } } /* Start: the dark start point of the logo. */ &--start { background: var(--ff-circuit); border-color: var(--ff-circuit); color: var(--ff-on-circuit); width: 200px; .fs-node__kind { color: var(--ff-on-circuit-muted); } &.is-selected { box-shadow: 0 0 0 2px var(--ff-board), 0 0 0 4px var(--ff-teal); } } /* Result: the amber end point of the logo. */ &--end { border-color: var(--ff-amber); .fs-node__kind { color: var(--ff-amber-ink); font-weight: 600; } &.is-selected { border-color: var(--ff-teal); } } } .fs-badge { background: var(--ff-teal-soft); color: var(--ff-teal); border-radius: var(--ff-radius-s); padding: 1px 6px; font-size: 9px; margin-left: auto; text-transform: uppercase; } .fs-answers { margin: 0; padding: 0; list-style: none; border-top: 1px solid var(--ff-wire); } .fs-answer { position: relative; display: flex; align-items: center; gap: 6px; margin: 0; padding: 8px 18px 8px 12px; border-bottom: 1px solid var(--ff-board-sunken); &:last-child { border-bottom: 0; } &__text { flex: 1; em { color: var(--ff-ink-muted); } } &__fallback { color: var(--ff-ink-muted); font-size: 11px; } &.is-open .fs-handle { background: var(--ff-board-raised); } } .fs-dots { display: inline-flex; gap: 2px; } .fs-dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; box-shadow: 0 0 0 1px rgba(16, 32, 31, 0.15); } /* Ports: amber fill with a wire-strong ring. */ .react-flow .fs-handle { width: 12px; height: 12px; background: var(--ff-amber); border: 2px solid var(--ff-board-raised); box-shadow: 0 0 0 1px var(--ff-wire-strong); &--target { width: 10px; height: 24px; border-radius: 4px; background: var(--ff-board-raised); border: 2px solid var(--ff-wire-strong); box-shadow: none; } } .react-flow .fs-node--start .fs-handle { border-color: var(--ff-circuit); box-shadow: 0 0 0 1px var(--ff-on-circuit-muted); } /* Wires: wire-strong at rest, solid teal when chosen. */ .react-flow__edge-path { stroke: var(--ff-wire-strong); stroke-width: 2; } .react-flow__edge.selected .react-flow__edge-path, .react-flow__edge:hover .react-flow__edge-path { stroke: var(--ff-teal); stroke-width: 2.5; } .fs-edge-delete { position: absolute; pointer-events: all; width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--ff-board-raised); background: var(--ff-danger); color: #fff; cursor: pointer; font-size: 14px; line-height: 1; box-shadow: var(--ff-shadow-node); } .fs-drop-menu { position: absolute; z-index: 10; background: var(--ff-board-raised); border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-m); box-shadow: var(--ff-shadow-pop); padding: 6px; display: flex; flex-direction: column; min-width: 170px; &__title { @include ff-label; color: var(--ff-ink-muted); padding: 6px 8px; } button { background: none; border: 0; text-align: left; padding: 8px; border-radius: var(--ff-radius-s); color: var(--ff-ink); font: inherit; cursor: pointer; &:hover, &:focus { background: var(--ff-teal-soft); color: var(--ff-teal); } &:focus-visible { outline: 2px solid var(--ff-teal); outline-offset: -2px; } &.is-cancel { color: var(--ff-ink-muted); font-size: 12px; } } } /* Inspector */ .fs-inspector { width: 360px; flex-shrink: 0; border-left: 1px solid var(--ff-wire); overflow-y: auto; background: var(--ff-board-raised); display: flex; flex-direction: column; &__tabs { flex: 1; .components-tab-panel__tabs { border-bottom: 1px solid var(--ff-wire); position: sticky; top: 0; background: var(--ff-board-raised); z-index: 1; } .components-tab-panel__tabs-item { padding: 0 10px; font-size: 12px; font-weight: 600; } } &__section { padding: 16px; display: flex; flex-direction: column; gap: 14px; } &__heading { @include ff-label; font-size: 11px; margin: 8px 0 0; color: var(--ff-ink-muted); } &__footer { display: flex; justify-content: space-between; border-top: 1px solid var(--ff-wire); padding-top: 12px; } } .fs-help { font-size: 12px; color: var(--ff-ink-muted); margin: 0; &--pro::before { content: "PRO"; font-family: var(--ff-font-mono); font-size: 9px; font-weight: 500; letter-spacing: 0.08em; background: var(--ff-circuit); color: var(--ff-teal-bright); border-radius: 4px; padding: 1px 5px; margin-right: 6px; } } .fs-answer-edit { border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-m); padding: 12px; display: flex; flex-direction: column; gap: 8px; &__actions { display: flex; justify-content: flex-end; } } .fs-label-picker { display: flex; flex-wrap: wrap; gap: 4px; } .fs-chip { border: 1px solid; background: var(--ff-board-raised); border-radius: 9999px; padding: 2px 10px; font-size: 12px; cursor: pointer; &.is-active { color: #fff; text-shadow: 0 0 2px rgba(0, 0, 0, 0.4); } } .fs-label-edit { border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-m); padding: 12px; display: flex; flex-direction: column; gap: 6px; &__row { display: flex; align-items: center; gap: 6px; > .components-base-control { flex: 1; } input[type="color"] { width: 36px; height: 36px; padding: 2px; border: 1px solid var(--ff-wire-strong); border-radius: var(--ff-radius-s); } } } .fs-endpoint-list { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 6px; button { width: 100%; text-align: left; background: var(--ff-board-raised); color: var(--ff-ink); border: 1px solid var(--ff-wire); border-radius: var(--ff-radius-s); padding: 8px 10px; font: inherit; cursor: pointer; display: flex; flex-direction: column; gap: 4px; &:hover { border-color: var(--ff-amber); } &:focus-visible { outline: 2px solid var(--ff-teal); outline-offset: 2px; } } &__title { font-weight: 600; } &__meta { font-size: 11px; color: var(--ff-ink-muted); } } .fs-shortcode { display: block; padding: 8px; font-family: var(--ff-font-mono); background: var(--ff-board-sunken); border-radius: var(--ff-radius-s); user-select: all; } .fs-issues-wrap { border-top: 1px solid var(--ff-wire); padding: 10px 16px; position: sticky; bottom: 0; background: var(--ff-board-raised); max-height: 40%; overflow-y: auto; summary { cursor: pointer; font-weight: 600; font-size: 12px; } } .fs-issues { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; .components-notice { margin: 0; font-size: 12px; } &__link { background: none; border: 0; padding: 0; text-align: left; cursor: pointer; font: inherit; color: inherit; } } /* Score mode */ .fs-node__number { background: var(--ff-teal); color: var(--ff-on-teal); border-radius: var(--ff-radius-s); min-width: 16px; padding: 1px 5px; text-align: center; font-weight: 500; letter-spacing: 0; } /* Score pills: amber fill, like the + pt pills in the brand. */ .fs-points { font-family: var(--ff-font-mono); font-size: 11px; font-weight: 500; color: var(--ff-on-amber); background: var(--ff-amber); border-radius: 9999px; padding: 0 7px; &.is-zero { color: var(--ff-ink-muted); background: var(--ff-board-sunken); } } .fs-answer__fallback.is-next { color: var(--ff-teal); } .fs-range { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; &__fields { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .fs-help { margin: 0; } }