Skip to content

Form Styling: Enklere og mer fleksibel stilsetting av forms ​

Problem ​

Form-blokken har begrenset stilsettingsfleksibilitet i builder-config. Flere vanlige bruksscenarier krever custom CSS som burde vart tilgjengelig som config-opsjoner. Dette gjor det vanskelig for ikke-tekniske brukere a lage enkle form-layouts.

I tillegg er templatene tungt pre-stylet, slik at brukere som vil ha en enkel form (bare inputs uten pynt) ma bruke mye tid pa a fjerne standardstyling.

Konkrete mangler i dag ​

BehovStatus i dagWorkaround
Hojde per inputIkke mulig i config. Styres av padding/line-height/font-size globaltCustom CSS: .ft1 .form-input-field { height: 36px }
Skjule labelMulig ved a la label-feltet sta tomt. Men ingen template uten labels, sa brukere ma fjerne dem manuelt per inputSett label til tom streng per input
Skjule required-stjerneIkke mulig. Hardkodet rod stjerne (#ef4444) nar required er paCustom CSS: .form-input .required-asterisk { display: none }
Required-stjerne farge/stilHardkodet #ef4444, bold, 16pxCustom CSS
Per-input typografilabelStyle finnes i types.ts men er ikke eksponert i UICustom CSS
Per-input paddingIkke tilgjengelig i configCustom CSS
Template uten labelsIkke tilgjengelig. Alle templates har labels satt, ma fjernes manuelt per inputSlett label-tekst per input
Enkel/blank form template"Empty" template har fortsatt mye styling (bakgrunn, border, hover states)Manuell fjerning av all styling
Rekkefoljendring av inputsKun via context menu (Bring Forward/Send Backward)Ingen drag-and-drop
Submit-knapp ikke midtstiltNar width < 100%, legger wrapperen seg til venstre (mangler margin: 0 auto)Custom CSS: .form-submit-button-wrapper { margin: 0 auto }
Autofill-stylingNettleser overstyrer input-bakgrunn med bla farge via :-webkit-autofillCustom CSS med -webkit-box-shadow: inset hack

Template-problemet ​

Alle 5 eksisterende templates (Empty, Contact, Lead Gen, Survey, Contest) har tung pre-styling:

Default-propertyVerdiKonsekvens
Form bakgrunn#FFFFFF33 (semi-transparent)Ma endres eller fjernes
Form border1px solid svartMa fjernes for enkel look
Input bakgrunn#D1D1D1FF (gra) / #FFFFFF (white)Feil farge for de fleste designs
Input hover stateBla bakgrunn #8AB0FF + border #0056B3 + shadowOverveldende for enkle forms
Input focus stateBla bakgrunn #A4C1FF + glowOverveldende for enkle forms
Submit-knappBla med hover-scale, shadow, 4 statesMa styres helt om
Border radius4-12px overaltMa nullstilles for skarpe hjorner

"Empty Form" er den reneste, men den har fortsatt full styling pa inputs, hover/focus states, submit-knapp med shadow og scale-animasjon. Det er ingen mate a starte fra scratch.

Sammenligning med andre blokktyper ​

Form-inputs mangler mange config-opsjoner som finnes i Text og Button:

FunksjonTextButtonForm Input
Typografi (font, size, weight)JaJa (per state)Kun globalt
PaddingJaJaKun globalt
Border radiusJaJaKun globalt
Box shadowJaJa (per state)Kun globalt
Text shadowJaNeiNei
Filter/backdrop filterNeiJaNei
Scale/transformNeiJa (per state)Nei
Per-element hojdeVia paddingheight propertyNei
RotationJaJaNei

Foreslatte endringer ​

Fase 1: Quick wins (lav kompleksitet) ​

Minimalt invasive endringer som loser de mest akutte problemene.

1.1 Submit-knapp midtstilling (bug) ​

Submit-knapp wrapperen far width fra config men mangler margin: 0 auto, sa den legger seg til venstre nar bredden er under 100%.

Engine (CE):

  • I styles() linje ~877, legg til margin: '0 auto' pa submitButtonWrapper-stilen

Kompleksitet: Triviell. En linje.

1.2 Disabled submit-knapp hover (bug) ​

Nar submit-knappen er disabled (under innsending, etter submit, etc.) viser den fortsatt hover-effekter (bakgrunn, border, shadow, cursor pointer). Hover-stiler bor ikke gjelde nar knappen er disabled.

Engine (CE):

  • I styles(), legg til .form-submit-button:disabled:hover og .form-submit-button:disabled som overstyrer hover-stilen
  • Sett cursor: 'not-allowed', fjern hover-bakgrunn/shadow/transform, behold disabled-stilene

Kompleksitet: Triviell. Noen linjer i styles().

1.3 Required asterisk visibility ​

Frontend (AF):

  • Legg til showRequiredIndicator: boolean (default true) i FormInputProperties eller globalt i globalInputStyling
  • Toggle i RequiredFieldSection: "Show required indicator" (synlig bare nar required er pa)

Engine (CE):

  • Wrap .required-asterisk rendering med sjekk pa showRequiredIndicator

Kompleksitet: Lav. Samme monster som label toggle.

1.4 Input height (global) ​

Frontend (AF):

  • Legg til inputHeight: number | null i GlobalInputLayoutStyling (types.ts)
  • Ny seksjon i FormConfiguration "Inputs"-tab: "Input height" med InputField (number, px)
  • null = auto (styrt av padding/font som i dag)

Engine (CE):

  • I styles(): Sett height pa .form-input-field nar verdi er satt

Kompleksitet: Lav. En property, en seksjon, en linje i styles().

1.5 Autofill-styling fix ​

Nettlesere (Chrome/Safari) overstyrer input-bakgrunn med bla farge via :-webkit-autofill. Dette bor fikses i engine slik at autofill respekterer input-bakgrunnsfargen.

Engine (CE):

  • I styles(), legg til autofill-override pa .form-input-field:
    '&:-webkit-autofill, &:-webkit-autofill:hover, &:-webkit-autofill:focus': {
      '-webkit-box-shadow': `0 0 0 1000px ${bgColor} inset`,
      '-webkit-text-fill-color': textColor,
      'transition': 'background-color 5000s ease-in-out 0s',
    }
  • bgColor og textColor hentes fra globalInputStyling.layout.background / .style.color

Kompleksitet: Lav. Noen linjer i styles(), ingen frontend-endringer.

1.6 "Blank" form template ​

Ny template: blankForm.ts med FormTemplate.BLANK:

  • Ingen bakgrunn pa form-container (background: false)
  • Ingen border pa form-container (border: false)
  • Gjennomsiktige inputs med tynn border (background: false, border: true, 1px solid #ccc)
  • Ingen labels -- bare placeholders (label-felt satt til tom streng)
  • Ingen hover/focus state-effekter (bare border-color endring)
  • Ingen box-shadow noe sted
  • Enkel submit-knapp uten shadow/scale
  • 2-3 text-inputs + email
  • Minimal padding og margin

Kompleksitet: Lav. Ny template-fil, registrer i registry. Ingen engine-endringer.

Fase 2: Per-input overrides (medium kompleksitet) ​

2.1 Per-input height override ​

Frontend (AF):

  • Legg til height: number | null i FormInputProperties
  • Seksjon i BaseInputConfiguration: "Height" med InputField (px)
  • null = bruk global height

Engine (CE):

  • I per-input styles: Override .{shortCode} .form-input-field { height } nar satt

Kompleksitet: Medium. Krever at per-input styles merger med global styles riktig.

2.2 Per-input styling panel ​

Utvid per-input config med egne seksjoner for:

  • Background (override global)
  • Border (override global)
  • Border radius (override global)
  • Padding (override global)

Mye av dette er allerede delvis pa plass via customCSS per input og eksisterende properties i FormInputProperties (background, backgroundSettings, border, borderStyle), men det finnes ingen UI-seksjoner for dem i BaseInputConfiguration.vue. De eksisterer i typesystemet uten a vare eksponert.

Kompleksitet: Medium. Legge til eksisterende seksjonskomponenter (BackgroundStyleSection, BorderStyleSection osv.) i BaseInputConfiguration.

2.3 Fractional indexing for form input ordering ​

Form-inputs bruker i dag order-property og "Bring Forward"/"Send Backward" via context menu. Dette er tungvint og upresist. Block ordering i builder bruker allerede fractional indexing (PR under review, branch improve-change-operators), og form-inputs bor bruke samme system.

Tilnerming:

  • Bytt fra heltalls order til fractional index (same som blokk-ordering)
  • Gjenbruk generateFractionalIndex() / getOrderBetween() fra block ordering
  • Muliggjor drag-and-drop reordning i config-panelet (ordnet liste av inputs)
  • Alternativt: visuell DnD direkte i form-blokken i canvas

Fordeler:

  • Konsistent ordering-system pa tvers av blokker og form-inputs
  • Unnga race conditions og reordning-bugs som block ordering allerede har lost
  • Naturlig stotte for "flytt mellom" to inputs uten a reindeksere alle

Kompleksitet: Medium. Mesteparten av logikken finnes allerede i block ordering. Krever UI for DnD i config-panel.

2.4 Opprydding av form-kode ​

Form-koden er tung og vanskelig a vedlikeholde. Konkrete oppryddingsomrader:

Engine (CreativeFormBlock.vue):

  • styles() computed er svart stor (200+ linjer). Brekk opp i mindre metoder: getInputBaseStyles(), getLabelStyles(), getRequiredStyles(), getPerInputStyles(), getStateStyles()
  • Hardkodede verdier (asterisk-farge #ef4444, placeholder-farge #9ca3af, focus ring #3B82F6) bor trekkes ut som konfigurerbare properties
  • Required asterisk-logikk (label vs input-plassering) er duplisert og knotete

Frontend config:

  • FormConfiguration.vue (529 linjer) gjor for mye. Tabs-logikken kan forenkles
  • BaseInputConfiguration.vue har ubrukte slots og mangler UI for properties som finnes i typesystemet
  • 11 type-spesifikke config-filer har mye duplisert kode (validering, label, placeholder). Vurder a samle mer i BaseInputConfiguration
  • formInputDefaults i defaults.ts har tunge hover/focus defaults som sjelden brukes som de er

Kompleksitet: Medium. Refaktorering, ingen funksjonelle endringer. Kan gjores inkrementelt.

Fase 3: Avansert (hoy kompleksitet, fremtidig) ​

3.1 Required indicator customization ​

  • Endre tekst (f.eks. "*" til "(required)" eller "(obligatorisk)")
  • Endre farge, storrelse, posisjon
  • Velge mellom inline (ved label) og floating (i input-feltet)

3.2 Label styling per input ​

  • Per-input font, farge, storrelse for label (override global labelStyle)
  • labelStyle eksisterer allerede i FormInputProperties men er ikke eksponert i UI
  • Label posisjon: over input, ved siden av, floating label (material design-stil)

3.3 Form layout presets ​

  • Preset layouts: "Stacked" (standard), "Compact" (liten padding, ingen labels), "Inline" (label ved siden av input), "Material" (floating labels)
  • Preset velges i FormConfiguration, setter fornuftige defaults for label/height/padding
  • Bruker kan overstyre enkeltinnstillinger etter valg av preset

3.4 Per-input state styling UI ​

stateConfig finnes allerede i FormInputProperties (types.ts linje 835), men det finnes ingen UI for a konfigurere det. Legg til hover/focus config-tabs per input, lik button-konfigurasjon.

3.5 Form submission event / success-state ​

Tre nivaer av post-submit-opplevelse:

Niva 1: Innebygd success-state (enklest)

  • Form-blokken bytter innhold etter vellykket submit: skjuler inputs, viser en konfigurerbar "thank you"-melding
  • Allerede delvis der med success-state pa submit-knappen, men ingen innholdsbytte
  • Konfigurerbart i FormConfiguration: success-melding tekst, styling, auto-skjul etter X sekunder
  • Krever: ny property successContent i formProperties, rendering-logikk i engine

Niva 2: Signal/event til flow (fleksibelt)

  • Form sender en event (formSubmitted) som flow-systemet kan lytte pa
  • Fungerer akkurat som button clicks trigger flow-steg (show/hide operatorer)
  • Brukeren kan sette opp: "nar form er sendt inn, skjul form-operator og vis avslutningsskjerm-operator"
  • Passer naturlig med eksisterende flow-arkitektur og operator show/hide
  • Krever: event-emitting i engine etter submit, ny event-type i flow-systemet

Niva 3: Multipage form (avansert)

  • Form-blokken handterer flere "sider" internt
  • Neste/forrige-knapper mellom sider
  • Validering per side (ikke submit for siste side)
  • Progress-indikator (steg 1/3, 2/3, 3/3)
  • Krever: ny datastruktur for sider, ny navigasjons-UI, per-side validering

Niva 1 og 2 kan implementeres uavhengig. Niva 2 er mest fleksibelt og gjenbruker eksisterende flow-infrastruktur. Niva 3 er en storre feature som kan bygges pa toppen av 1 og 2.


Pafirte filer ​

Frontend (Application-Frontend) ​

FilEndring
Blocks/data/types.tsNye properties i FormInputProperties og GlobalInputLayoutStyling
Blocks/data/defaults.tsDefault-verdier for nye properties
Configuration/configs/FormConfiguration.vueGlobal input height seksjon
Configuration/configs/FormInputConfiguration.vuePer-input height seksjon
Configuration/components/Form/BaseInputConfiguration.vueLabel toggle, height override, per-input styling seksjoner
Configuration/components/Form/RequiredFieldSection.vueAsterisk visibility toggle
templates/form/blankForm.tsNy blank template
templates/form/index.tsEksporter blank template
templates/index.tsRegistrer i templateRegistry
Nye seksjoner (evt.)InputHeightSection.vue, LabelVisibilitySection.vue

Engine (Creative-Engine) ​

FilEndring
CreativeFormBlock.vuev-if for label, asterisk; height i styles()

Backend ​

Ingen endringer nodvendig. Properties lagres som del av blokkdata (JSON) som allerede stotter vilkarlige felter.


Estimert scope ​

FaseOppgaverRisiko
Fase 16 features (submit midtstilling, disabled hover, required toggle, global height, autofill fix, blank template)Lav. Isolerte endringer, ingen breaking changes
Fase 24 features (per-input height, styling panel, fractional ordering, kode-opprydding)Medium. Per-input override-logikk, refaktorering
Fase 35 features (required customization, label styling, layout presets, per-input states, submission event/success)Hoy. Krever redesign av form-rendering, flow-integrasjon og ny UI

Bakoverkompatibilitet ​

Alle nye properties har defaults som matcher dagens oppforsel:

  • showRequiredIndicator: true (stjerne vises som for)
  • inputHeight: null (auto-hojde som for)
  • height: null per input (bruker global)

Eksisterende creatives pavirkes ikke.

Prioritet ​

Fase 1 bor prioriteres forst. De fire oppgavene loser de vanligste frustrasjonene med minimal innsats:

  • Required toggle lar brukere ha required-validering uten synlig stjerne
  • Global input height gir kontroll over form-layout uten custom CSS
  • Autofill fix fjerner nettleserens bla autofill-bakgrunn for alle creatives
  • Blank template lar brukere starte fra scratch -- ingen labels, ingen styling, bare inputs med placeholders

Fase 2.2 (per-input styling panel) er saerlig interessant fordi FormInputProperties allerede har background, backgroundSettings, border, borderStyle og stateConfig i typesystemet - de mangler bare UI-seksjoner. Dette er lavthengende frukt.

Fase 2.3 (fractional indexing) bor gjores sammen med eller rett etter at block ordering PR-en merges, sa logikken er fersk og kan gjenbrukes direkte.

Fase 2.4 (opprydding) bor gjores for eller parallelt med fase 2-features, sa ny kode bygges pa et renere fundament.

Internal documentation