Erscheinungsbild
Lassen Sie den Angebotsrechner so aussehen, als hätte Ihr eigenes Produktteam ihn gebaut.
Die Appearance-API
Ein einziges appearance-Objekt steuert das Aussehen des eingebetteten Angebotsrechners und der
nativen Komponenten. Es besteht aus fünf Teilen: theme, variables, rules, layout und fonts.
Dasselbe Objekt, zwei Mechanismen. Beim iframe (embed.js, <cord-quote>, <CordCotizador>)
wird das Objekt an den Server von Cord übertragen, der es validiert und das CSS innerhalb seines eigenen
Origins erzeugt: Ihre Seite schreibt nie Styles in das iframe. Bei den nativen Komponenten
(<CordBuilder> über <CordProvider appearance={...}>) wendet das SDK die Variablen als CSS
auf Ihrer Seite an. rules und layout gelten nur für das iframe, elements und baseTheme nur für
die nativen Komponenten.
<script src="https://cordhq.app/embed.js" async></script>
<div
data-cord-token="a1b2c3d4e5f60718"
data-cord-appearance='{
"theme": "flat",
"variables": {
"colorPrimary": "#0f766e",
"colorText": "#0b1220",
"borderRadius": "10px",
"borderRadiusButton": "999px"
},
"rules": {
"Button": { "text-transform": "uppercase", "letter-spacing": "0.04em" },
"Total": { "font-weight": "700" }
},
"layout": { "compact": true, "hideChat": true },
"fonts": [{ "cssSrc": "https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap" }]
}'>
</div>
Beim Web Component kommt dasselbe JSON in das Attribut appearance oder in die Eigenschaft
element.appearance; in React in die Prop appearance von <CordCotizador>.
Themes (theme)
| Theme | Was es bewirkt |
|---|---|
light |
Standard. |
dark |
Vollständige dunkle Palette: Hintergrund, Flächen, Text, Rahmen und Felder. night ist ein Alias. |
auto |
Folgt der Einstellung prefers-color-scheme des Besuchers. |
flat |
Ohne Schatten und mit sichtbaren Rahmen, für Websites ohne Elevation. |
Das Theme wird zuerst angewendet, und Ihre variables haben immer Vorrang.
Variablen (variables)
Sie werden in camelCase geschrieben. Jede wirkt auf eine echte Fläche des Angebotsrechners; eine
Variable, die Sie nicht setzen, behält den Wert von Cord.
| Variable | Typ | Wo sie sichtbar ist |
|---|---|---|
colorPrimary |
Farbe | Hauptschaltfläche, Akzente, eigene Chat-Blasen |
colorOnPrimary |
Farbe | Text auf der Primärfarbe |
colorBackground |
Farbe | Hintergrund der Karte |
colorSurface |
Farbe | Innere Bereiche: Notizen, Gesamtbetrag, Chat, Hinweise |
colorText |
Farbe | Haupttext und Beträge |
colorTextSecondary |
Farbe | Beschriftungen, Steuernummer, Notizen |
colorTextPlaceholder |
Farbe | Tabellenköpfe, Hilfetexte, Platzhalter |
colorBorder |
Farbe | Trennlinien und Rahmen |
colorDanger |
Farbe | Ablehnen und Fehler |
colorSuccess |
Farbe | Bestätigungen |
colorInput |
Farbe | Hintergrund der Felder |
colorInputText |
Farbe | Text der Felder |
colorInputBorder |
Farbe | Rahmen der Felder |
colorFocus |
Farbe | Rahmen des fokussierten Felds |
fontFamily |
Schriftfamilie | Die gesamte Karte |
fontSize |
Länge | Positionen |
fontWeightBold |
Schriftstärke | Schaltflächen |
borderRadius |
Länge | Karte |
borderRadiusButton |
Länge | Schaltflächen |
borderRadiusInput |
Länge | Felder |
spacingCard |
Abstand | Innenabstand der Karte (2rem oder 1.5rem 2rem) |
shadowCard |
none oder default |
Schatten der Karte |
Eine Farbe akzeptiert Hexadezimalwerte, rgb(), hsl(), oklch(), oklab(), lab(), lch() oder einen
Namen. Eine Länge akzeptiert px, rem, em oder %.
Regeln pro Komponente (rules)
Wo Variablen nicht ausreichen, wendet rules Eigenschaften auf Komponenten mit öffentlichem Namen an.
Das sind keine CSS-Selektoren: Es sind stabile Namen, die Cord auf sein Markup abbildet. Deshalb
brechen sie nicht, wenn sich das Markup ändert.
"rules": {
"Button": { "text-transform": "uppercase" },
"Button:hover": { "opacity": "0.9" },
"Input:focus": { "border-color": "#0f766e" },
"Bubble--mine": { "background-color": "#0f766e" }
}
Komponenten: Card, Header, Total, Table, Row, SummaryRow, Notes, Button,
Button:hover, ButtonSecondary, ButtonSecondary:hover, Input, Input:focus, Chat,
Bubble, Bubble--mine.
Eigenschaften: color, background-color, border-color, border-width, border-style,
border-radius, font-size, font-weight, letter-spacing, text-transform, padding,
box-shadow (none oder default) und opacity.
Layout (layout)
| Option | Wirkung |
|---|---|
compact: true |
Weniger Weißraum in der Karte, für schmale Spalten. |
hideChat: true |
Blendet die Unterhaltung und die Kommentare pro Position aus. |
hideNotes: true |
Blendet den Notizblock des Angebots aus. |
Ausblenden betrifft nur die Darstellung: Das Angebot und seine Aktionen bleiben im öffentlichen Link dieselben.
Schriften (fonts)
Bis zu vier Stylesheets von fonts.googleapis.com oder fonts.bunny.net über https. Wenn Sie
fontFamily nicht festlegen, verwendet Cord die erste Schriftfamilie des ersten Stylesheets.
Was Cord validiert und warum
Jeder Wert, der als CSS endet, durchläuft einen Validator mit geschlossenen Listen von Schlüsseln,
Komponenten und Eigenschaften sowie einer Grammatik pro Werttyp. url(), expression(), @,
!important, ;, geschweifte Klammern und < werden verworfen, und das gesamte Objekt wird ignoriert,
wenn es größer als 8 KB ist. Verworfene Werte beeinträchtigen den Rest nicht: Sie werden ignoriert,
das SDK meldet sie während der Entwicklung in der Konsole, und sie erscheinen mit einem Testschlüssel
in der Debug-Leiste.
So lässt sich das Erscheinungsbild nicht missbrauchen, um Schaltflächen auszublenden, den Gesamtbetrag zu verdecken oder Ressourcen Dritter in das iframe zu laden: Das Design gehört Ihnen, die Integrität des Angebots gehört Cord.
Native Komponenten
Headless-Modus (baseTheme: 'none')
Mit <CordBuilder> oder useQuoteBuilder und Ihrer eigenen UI deaktiviert appearance={{ baseTheme: 'none' }}
in <CordProvider> das Basis-Stylesheet. Die Klassen .cord-* bleiben im Markup, und das
Aussehen liegt in Ihrer Hand (Tailwind, CSS Modules oder was immer Sie verwenden).
Overrides pro Element (elements)
Jeder Knoten von <CordBuilder> trägt eine stabile Klasse .cord-<key> (builderRoot, formField,
itemRow, summaryRoot, submitButton…). appearance.elements ergänzt Ihren className und Ihren
style:
<CordProvider
publishableKey={pk}
appearance={{
variables: { colorPrimary: '#0f766e', borderRadiusInput: '6px' },
elements: {
submitButton: 'my-button',
itemRow: { style: { gap: '18px' } },
},
}}
>
<CordBuilder />
</CordProvider>
Die Basisklasse .cord-<key> wird nie ersetzt; Ihre Klasse kommt hinzu.