Asset management
Keep a live inventory of every domain, subdomain and technology your organisation runs.
Read moreThis is the Dataprovider design system. It is the single source of truth for how Dataprovider interfaces look and behave.
Every component here is a real, working component. The same files power three things at once: the live previews on this site, the components developers copy into their work, and a registry that AI coding tools read directly.
Because everything comes from one source, the three never drift apart. What you see on this page is exactly what a developer builds with, and exactly what an AI tool generates.
Browse the components below. Each one shows a live preview, the source code, and the variants it supports.
The registry is served as JSON at /registry.json. Point
Cursor or Claude Code at it, and they build with real Dataprovider
components instead of guessing markup. The rules files in the repo
tell the AI how the system works: how variants, state and theming are
expressed.
One source. Two audiences. No drift.
https://ds.dataprovider.dev/registry.json
npx shadcn@latest add https://ds.dataprovider.dev/r/button.json
Every colour, type, spacing, radius and shadow value
lives in tokens.css as a CSS custom property. Components
read these variables, so theming happens in one place.
tokens.css
View source
The web app uses
its own system. tokens-console.css layers a
[data-theme="console"] scope on top, so the same
components render in the console look. The Console and Blocks sections
below use it.
tokens-console.css
View source
Clickable action with brand variants and three sizes. Set the look with data-variant (primary, cta, secondary, outline, ghost, danger) and the size with data-size.
npx shadcn@latest add https://ds.dataprovider.dev/r/button.json
Registry JSON
<!-- Button
Variants: primary (default), cta, secondary, outline, ghost, danger, ai
Sizes: sm, default, lg (set with data-size)
Use a <button> for actions and an <a> for navigation. -->
<!-- Variants -->
<button class="dp-btn" type="button">Primary</button>
<button class="dp-btn" type="button" data-variant="cta">Book a demo</button>
<button class="dp-btn" type="button" data-variant="secondary">Secondary</button>
<button class="dp-btn" type="button" data-variant="outline">Read more</button>
<button class="dp-btn" type="button" data-variant="ghost">Ghost</button>
<button class="dp-btn" type="button" data-variant="danger">Delete</button>
<button class="dp-btn" type="button" data-variant="ai">
Create with AI
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 3l1.9 4.6L18.5 9l-4.6 1.9L12 15l-1.9-4.1L5.5 9l4.6-1.4z"></path></svg>
</button>
<!-- Sizes -->
<button class="dp-btn" type="button" data-size="sm">Small</button>
<button class="dp-btn" type="button">Default</button>
<button class="dp-btn" type="button" data-size="lg">Large</button>
<!-- With a leading icon (inline SVG, no icon font) -->
<button class="dp-btn" type="button" data-variant="cta">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="11" cy="11" r="7"></circle>
<path d="m21 21-4.3-4.3"></path>
</svg>
Search
</button>
<!-- Disabled -->
<button class="dp-btn" type="button" disabled>Disabled</button>
<!-- As a link -->
<a class="dp-btn" data-variant="primary" href="#">Link button</a>
/* Button
Variants are selected with data-variant, sizes with data-size.
All colour, radius and type come from tokens.css. */
.dp-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--dp-space-2);
font-family: var(--dp-font-sans);
font-weight: var(--dp-weight-bold);
font-size: var(--dp-text-base);
line-height: 1;
text-decoration: none;
white-space: nowrap;
border: 1px solid transparent;
border-radius: var(--dp-radius-xs);
padding: var(--dp-space-2) var(--dp-space-5);
cursor: pointer;
user-select: none;
transition: background-color var(--dp-transition),
border-color var(--dp-transition), color var(--dp-transition),
box-shadow var(--dp-transition);
}
.dp-btn:focus-visible {
outline: none;
box-shadow: var(--dp-shadow-focus);
}
.dp-btn[disabled],
.dp-btn[aria-disabled="true"] {
opacity: 0.55;
cursor: not-allowed;
pointer-events: none;
}
/* Icons sit inline and scale with the text */
.dp-btn svg {
width: 1.15em;
height: 1.15em;
flex: none;
}
/* ---- Sizes ----------------------------------------------------------- */
.dp-btn[data-size="sm"] {
font-size: var(--dp-text-sm);
padding: var(--dp-space-1) var(--dp-space-3);
}
.dp-btn[data-size="lg"] {
font-size: var(--dp-text-lg);
padding: var(--dp-space-3) var(--dp-space-6);
}
/* ---- Variants -------------------------------------------------------- */
/* primary (default): brand blue */
.dp-btn,
.dp-btn[data-variant="primary"] {
background: var(--dp-primary-bg);
border-color: var(--dp-primary-border);
color: var(--dp-primary-text);
}
.dp-btn:hover,
.dp-btn[data-variant="primary"]:hover {
background: var(--dp-primary-bg-hover);
box-shadow: inset 0 1px 0.75px rgba(255, 255, 255, 0.12),
0 1px 3px rgba(0, 0, 0, 0.1);
}
/* cta: brand gold, navy text (the most prominent action) */
.dp-btn[data-variant="cta"] {
background: var(--dp-cta-bg);
border-color: var(--dp-cta-border);
color: var(--dp-cta-text);
}
.dp-btn[data-variant="cta"]:hover {
background: var(--dp-cta-bg-hover);
box-shadow: inset 0 1px 0.75px rgba(255, 255, 255, 0.12),
0 1px 3px rgba(0, 0, 0, 0.1);
}
/* secondary: navy */
.dp-btn[data-variant="secondary"] {
background: var(--dp-secondary-bg);
border-color: var(--dp-secondary-border);
color: var(--dp-secondary-text);
}
.dp-btn[data-variant="secondary"]:hover {
background: var(--dp-secondary-bg-hover);
}
/* outline: light surface, neutral border, navy text */
.dp-btn[data-variant="outline"] {
background: var(--dp-neutral-50);
border-color: var(--dp-border-neutral);
color: var(--dp-navy);
}
.dp-btn[data-variant="outline"]:hover {
border-color: var(--dp-primary-bg);
color: var(--dp-primary-bg);
}
/* ghost: text only until hovered */
.dp-btn[data-variant="ghost"] {
background: transparent;
border-color: transparent;
color: var(--dp-navy);
}
.dp-btn[data-variant="ghost"]:hover {
background: var(--dp-surface-soft);
}
/* ai: gradient action for AI features */
.dp-btn[data-variant="ai"] {
background: var(--dp-gradient-ai, linear-gradient(135deg, #8b5cf6, #3049dc));
border-color: transparent;
color: var(--dp-white);
}
.dp-btn[data-variant="ai"]:hover {
filter: brightness(1.06);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
}
/* danger: destructive action */
.dp-btn[data-variant="danger"] {
background: var(--dp-danger);
border-color: var(--dp-danger);
color: var(--dp-white);
}
.dp-btn[data-variant="danger"]:hover {
filter: brightness(0.93);
}
Labelled text field with optional hint, error text, sizes and a leading-icon group. Mark an invalid field with aria-invalid.
npx shadcn@latest add https://ds.dataprovider.dev/r/input.json
Registry JSON
<!-- Input
Wrap a label, the input and any hint or error in .dp-field.
Sizes: sm, default, lg (data-size on the input).
Invalid state: aria-invalid="true" on the input. -->
<!-- Default with hint -->
<div class="dp-field">
<label class="dp-label" for="company">Company name</label>
<input class="dp-input" id="company" type="text" placeholder="Acme B.V." />
<span class="dp-hint">Use the registered legal name.</span>
</div>
<!-- Optional field -->
<div class="dp-field">
<label class="dp-label" data-optional for="vat">VAT number</label>
<input class="dp-input" id="vat" type="text" placeholder="NL000000000B00" />
</div>
<!-- Invalid -->
<div class="dp-field">
<label class="dp-label" for="email">Email address</label>
<input class="dp-input" id="email" type="email" value="not-an-email"
aria-invalid="true" aria-describedby="email-error" />
<span class="dp-error" id="email-error">Enter a valid email address.</span>
</div>
<!-- Disabled -->
<div class="dp-field">
<label class="dp-label" for="account">Account ID</label>
<input class="dp-input" id="account" type="text" value="DP-49210" disabled />
</div>
<!-- Search with a leading icon -->
<div class="dp-field">
<label class="dp-label" for="search">Search domains</label>
<div class="dp-input-group">
<svg class="dp-input-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="11" cy="11" r="7"></circle>
<path d="m21 21-4.3-4.3"></path>
</svg>
<input class="dp-input" id="search" type="search" placeholder="example.com" />
</div>
</div>
<!-- Sizes -->
<div class="dp-field">
<label class="dp-label" for="small">Small</label>
<input class="dp-input" id="small" type="text" data-size="sm" placeholder="Small field" />
</div>
<div class="dp-field">
<label class="dp-label" for="large">Large</label>
<input class="dp-input" id="large" type="text" data-size="lg" placeholder="Large field" />
</div>
/* Input
A labelled text field with optional hint and error text.
Sizes are set with data-size on the input. Mark an invalid field with
aria-invalid="true". All colour, radius and type come from tokens.css. */
.dp-field {
display: flex;
flex-direction: column;
gap: var(--dp-space-2);
}
.dp-label {
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-navy);
}
.dp-label[data-optional]::after {
content: " (optional)";
font-weight: var(--dp-weight-regular);
color: var(--dp-text-subtle);
}
.dp-input {
width: 100%;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-base);
color: var(--dp-navy);
background: var(--dp-white);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
padding: var(--dp-space-2) var(--dp-space-3);
height: 2.5rem;
transition: border-color var(--dp-transition), box-shadow var(--dp-transition);
}
.dp-input::placeholder {
color: var(--dp-text-subtle);
}
.dp-input:hover {
border-color: var(--dp-blue-400);
}
.dp-input:focus {
outline: none;
border-color: var(--dp-primary-bg);
box-shadow: var(--dp-shadow-focus);
}
.dp-input:disabled {
background: var(--dp-neutral-200);
color: var(--dp-text-subtle);
cursor: not-allowed;
}
.dp-input[aria-invalid="true"] {
border-color: var(--dp-danger);
}
.dp-input[aria-invalid="true"]:focus {
box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.25);
}
/* ---- Sizes ----------------------------------------------------------- */
.dp-input[data-size="sm"] {
height: 2.125rem;
font-size: var(--dp-text-sm);
}
.dp-input[data-size="lg"] {
height: 3rem;
font-size: var(--dp-text-lg);
}
/* ---- Hint and error text -------------------------------------------- */
.dp-hint {
font-size: var(--dp-text-sm);
color: var(--dp-text-subtle);
}
.dp-error {
font-size: var(--dp-text-sm);
color: var(--dp-danger);
}
/* ---- Input with a leading icon (e.g. search) ------------------------ */
.dp-input-group {
position: relative;
display: flex;
align-items: center;
}
.dp-input-group .dp-input-icon {
position: absolute;
left: var(--dp-space-3);
width: 1.15rem;
height: 1.15rem;
color: var(--dp-text-subtle);
pointer-events: none;
}
.dp-input-group .dp-input {
padding-left: calc(var(--dp-space-3) * 2 + 1.15rem);
}
Multiline text field that mirrors the input styling. Supports a hint, an error and an invalid state set with aria-invalid.
npx shadcn@latest add https://ds.dataprovider.dev/r/textarea.json
Registry JSON
<!-- Textarea
Wrap label, textarea and hint in .dp-field.
Invalid state: aria-invalid="true". -->
<div class="dp-field">
<label class="dp-label" for="notes">Notes</label>
<textarea class="dp-textarea" id="notes" placeholder="Add context for this query"></textarea>
<span class="dp-hint">Markdown is not supported.</span>
</div>
<div class="dp-field">
<label class="dp-label" for="reason">Reason</label>
<textarea class="dp-textarea" id="reason" aria-invalid="true"
aria-describedby="reason-error">x</textarea>
<span class="dp-error" id="reason-error">Give at least 10 characters.</span>
</div>
/* Textarea
Multiline text field. Mirrors the input field styling. Wrap label, control
and hint in .dp-field. Mark an invalid field with aria-invalid="true".
All colour, radius and type come from tokens.css. */
.dp-textarea {
width: 100%;
min-height: 6rem;
resize: vertical;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-base);
line-height: var(--dp-leading-normal);
color: var(--dp-navy);
background: var(--dp-white);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
padding: var(--dp-space-3);
transition: border-color var(--dp-transition), box-shadow var(--dp-transition);
}
.dp-textarea::placeholder {
color: var(--dp-text-subtle);
}
.dp-textarea:hover {
border-color: var(--dp-blue-400);
}
.dp-textarea:focus {
outline: none;
border-color: var(--dp-primary-bg);
box-shadow: var(--dp-shadow-focus);
}
.dp-textarea:disabled {
background: var(--dp-neutral-200);
color: var(--dp-text-subtle);
cursor: not-allowed;
}
.dp-textarea[aria-invalid="true"] {
border-color: var(--dp-danger);
}
.dp-textarea[aria-invalid="true"]:focus {
box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.25);
}
Native select styled to match the input, with a custom chevron and three sizes set with data-size.
npx shadcn@latest add https://ds.dataprovider.dev/r/select.json
Registry JSON
<!-- Select
Native select with a custom chevron. Sizes: sm, default, lg (data-size).
Wrap label, select and hint in .dp-field. -->
<div class="dp-field">
<label class="dp-label" for="tld">Top level domain</label>
<select class="dp-select" id="tld">
<option value="">Choose a TLD</option>
<option>.com</option>
<option>.nl</option>
<option>.org</option>
<option>.io</option>
</select>
</div>
<div class="dp-field">
<label class="dp-label" for="rows">Rows per page</label>
<select class="dp-select" id="rows" data-size="sm">
<option>25</option>
<option>50</option>
<option>100</option>
</select>
</div>
<div class="dp-field">
<label class="dp-label" for="region">Region</label>
<select class="dp-select" id="region" disabled>
<option>Europe</option>
</select>
</div>
/* Select
Native select styled to match the input field, with a custom chevron.
Sizes are set with data-size. Wrap label, control and hint in .dp-field.
All colour, radius and type come from tokens.css. */
.dp-select {
width: 100%;
height: 2.5rem;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-base);
color: var(--dp-navy);
background-color: var(--dp-white);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
padding: 0 calc(var(--dp-space-3) * 2 + 1rem) 0 var(--dp-space-3);
appearance: none;
cursor: pointer;
/* Chevron drawn as an inline SVG, tinted to the muted text colour */
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236f6f6f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right var(--dp-space-3) center;
transition: border-color var(--dp-transition), box-shadow var(--dp-transition);
}
.dp-select:hover {
border-color: var(--dp-blue-400);
}
.dp-select:focus {
outline: none;
border-color: var(--dp-primary-bg);
box-shadow: var(--dp-shadow-focus);
}
.dp-select:disabled {
background-color: var(--dp-neutral-200);
color: var(--dp-text-subtle);
cursor: not-allowed;
}
.dp-select[aria-invalid="true"] {
border-color: var(--dp-danger);
}
.dp-select[data-size="sm"] {
height: 2.125rem;
font-size: var(--dp-text-sm);
}
.dp-select[data-size="lg"] {
height: 3rem;
font-size: var(--dp-text-lg);
}
Native checkbox with a custom box and tick. Supports checked, indeterminate and disabled states, with optional helper text.
npx shadcn@latest add https://ds.dataprovider.dev/r/checkbox.json
Registry JSON
<!-- Checkbox
Pair a native checkbox with a label inside .dp-check.
Use the indeterminate property (set in JS) for a partial state. -->
<label class="dp-check">
<input class="dp-checkbox" type="checkbox" checked />
<span>Include subdomains</span>
</label>
<label class="dp-check">
<input class="dp-checkbox" type="checkbox" />
<span>
Refresh monthly
<span class="dp-check-text">Re-run this query on the first of each month.</span>
</span>
</label>
<label class="dp-check">
<input class="dp-checkbox" type="checkbox" disabled checked />
<span>Locked option</span>
</label>
/* Checkbox
Native checkbox styled with a custom box and tick. Pair with a label inside
.dp-check. All colour, radius and type come from tokens.css. */
.dp-check {
display: inline-flex;
align-items: flex-start;
gap: var(--dp-space-3);
font-size: var(--dp-text-base);
color: var(--dp-navy);
cursor: pointer;
}
.dp-checkbox {
appearance: none;
flex: none;
width: 1.125rem;
height: 1.125rem;
margin: 0;
background: var(--dp-white);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
cursor: pointer;
transition: background-color var(--dp-transition),
border-color var(--dp-transition), box-shadow var(--dp-transition);
}
.dp-checkbox:hover {
border-color: var(--dp-blue-400);
}
.dp-checkbox:checked,
.dp-checkbox:indeterminate {
background-color: var(--dp-primary-bg);
border-color: var(--dp-primary-bg);
background-repeat: no-repeat;
background-position: center;
}
.dp-checkbox:checked {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
}
.dp-checkbox:indeterminate {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E");
}
.dp-checkbox:focus-visible {
outline: none;
box-shadow: var(--dp-shadow-focus);
}
.dp-checkbox:disabled {
background-color: var(--dp-neutral-200);
border-color: var(--dp-neutral-400);
cursor: not-allowed;
}
.dp-check:has(.dp-checkbox:disabled) {
color: var(--dp-text-subtle);
cursor: not-allowed;
}
/* Optional helper text under the label */
.dp-check-text {
display: block;
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
Native radio with a custom ring and dot. Group options with a shared name and add optional helper text.
npx shadcn@latest add https://ds.dataprovider.dev/r/radio.json
Registry JSON
<!-- Radio
Group radios with a shared name. Pair each with a label inside .dp-radio. -->
<label class="dp-radio">
<input class="dp-radio-input" type="radio" name="export" checked />
<span>CSV</span>
</label>
<label class="dp-radio">
<input class="dp-radio-input" type="radio" name="export" />
<span>
JSON
<span class="dp-radio-text">One object per record.</span>
</span>
</label>
<label class="dp-radio">
<input class="dp-radio-input" type="radio" name="export" disabled />
<span>Parquet</span>
</label>
/* Radio
Native radio styled with a custom ring and dot. Pair with a label inside
.dp-radio. Group radios with a shared name. Colour and type from tokens.css. */
.dp-radio {
display: inline-flex;
align-items: flex-start;
gap: var(--dp-space-3);
font-size: var(--dp-text-base);
color: var(--dp-navy);
cursor: pointer;
}
.dp-radio-input {
appearance: none;
flex: none;
width: 1.125rem;
height: 1.125rem;
margin: 0;
background: var(--dp-white);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-full);
cursor: pointer;
transition: border-color var(--dp-transition), box-shadow var(--dp-transition);
}
.dp-radio-input:hover {
border-color: var(--dp-blue-400);
}
.dp-radio-input:checked {
border-color: var(--dp-primary-bg);
border-width: 5px;
}
.dp-radio-input:focus-visible {
outline: none;
box-shadow: var(--dp-shadow-focus);
}
.dp-radio-input:disabled {
background-color: var(--dp-neutral-200);
border-color: var(--dp-neutral-400);
cursor: not-allowed;
}
.dp-radio:has(.dp-radio-input:disabled) {
color: var(--dp-text-subtle);
cursor: not-allowed;
}
.dp-radio-text {
display: block;
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
A toggle built from a native checkbox with a sliding track. Use for on and off settings.
npx shadcn@latest add https://ds.dataprovider.dev/r/switch.json
Registry JSON
<!-- Switch
A toggle built from a native checkbox. Pair with a label inside .dp-switch. -->
<label class="dp-switch">
<input class="dp-switch-input" type="checkbox" checked />
<span>Live updates</span>
</label>
<label class="dp-switch">
<input class="dp-switch-input" type="checkbox" />
<span>Email alerts</span>
</label>
<label class="dp-switch">
<input class="dp-switch-input" type="checkbox" disabled />
<span>Beta features</span>
</label>
/* Switch
A toggle built from a native checkbox and a sliding track. Pair with a label
inside .dp-switch. All colour and motion come from tokens.css. */
.dp-switch {
display: inline-flex;
align-items: center;
gap: var(--dp-space-3);
font-size: var(--dp-text-base);
color: var(--dp-navy);
cursor: pointer;
}
.dp-switch-input {
appearance: none;
position: relative;
flex: none;
width: 2.5rem;
height: 1.375rem;
margin: 0;
background: var(--dp-neutral-500);
border-radius: var(--dp-radius-full);
cursor: pointer;
transition: background-color var(--dp-transition);
}
.dp-switch-input::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
width: 1.125rem;
height: 1.125rem;
background: var(--dp-white);
border-radius: var(--dp-radius-full);
box-shadow: var(--dp-shadow-sm);
transition: transform var(--dp-transition);
}
.dp-switch-input:checked {
background: var(--dp-primary-bg);
}
.dp-switch-input:checked::after {
transform: translateX(1.125rem);
}
.dp-switch-input:focus-visible {
outline: none;
box-shadow: var(--dp-shadow-focus);
}
.dp-switch-input:disabled {
opacity: 0.55;
cursor: not-allowed;
}
.dp-switch:has(.dp-switch-input:disabled) {
color: var(--dp-text-subtle);
cursor: not-allowed;
}
An underline-style form field (label plus borderless input) used by the marketing forms.
npx shadcn@latest add https://ds.dataprovider.dev/r/field.json
Registry JSON
<!-- Field
An underline-style form field: a bold label above a borderless input with
a single bottom rule. Use for marketing forms (contact, newsletter). For
boxed inputs inside the app, use the input component instead. -->
<div class="dp-field">
<label class="dp-field-label" for="field-name">Work email</label>
<input class="dp-field-input" id="field-name" type="email" placeholder="you@company.com">
</div>
<div class="dp-field">
<label class="dp-field-label" for="field-source">How did you hear about us?</label>
<select class="dp-field-input" id="field-source">
<option value="">Please select</option>
<option value="search">Search engine</option>
<option value="referral">Referral</option>
</select>
</div>
<div class="dp-field">
<label class="dp-field-label" for="field-msg">Message</label>
<textarea class="dp-field-input" id="field-msg" rows="2"></textarea>
</div>
/* Field
An underline-style form field used by the marketing forms: a bold label
above a borderless input that carries only a bottom rule. Works for text
inputs, textareas and selects. Colour and type from tokens.css. */
.dp-field {
display: flex;
flex-direction: column;
gap: var(--dp-space-2);
}
.dp-field-label {
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-field-input {
width: 100%;
padding: var(--dp-space-2) 0;
font: inherit;
font-size: var(--dp-text-base);
color: var(--dp-text);
background: transparent;
border: none;
border-bottom: 1px solid var(--dp-border-strong);
border-radius: 0;
outline: none;
transition: border-color 0.15s ease;
}
.dp-field-input::placeholder { color: var(--dp-text-subtle); }
.dp-field-input:focus { border-bottom-color: var(--dp-link); }
textarea.dp-field-input { resize: vertical; }
select.dp-field-input {
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23101a50' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0 center;
background-size: 1.1rem;
padding-right: 1.6rem;
}
Surface that groups related content. Variants are set with data-variant (default, subtle, elevated, flat). Compose with header, body and footer sections.
Updated monthly across every TLD.
The complete web, structured in one place.
Lower contrast for secondary content.
Read more about the use case.
npx shadcn@latest add https://ds.dataprovider.dev/r/card.json
Registry JSON
<!-- Card
Variants: default, subtle, elevated, flat (data-variant).
Add data-interactive for a clickable card that lifts on hover.
Compose with .dp-card-header, .dp-card-body and .dp-card-footer. -->
<!-- Card with header, body and footer -->
<div class="dp-card">
<div class="dp-card-header">
<h3 class="dp-card-title">Domain coverage</h3>
<p class="dp-card-description">Updated monthly across every TLD.</p>
</div>
<div class="dp-card-body">
Track companies and technologies across 99% of all registered domains
worldwide. Every record is structured and queryable.
</div>
<div class="dp-card-footer">
<button class="dp-btn" type="button" data-size="sm">View report</button>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Export</button>
</div>
</div>
<!-- Simple body-only card -->
<div class="dp-card">
<div class="dp-card-body">
<h3 class="dp-card-title">400M+ domains</h3>
<p class="dp-card-description">The complete web, structured in one place.</p>
</div>
</div>
<!-- Subtle variant -->
<div class="dp-card" data-variant="subtle">
<div class="dp-card-body">
<h3 class="dp-card-title">Subtle surface</h3>
<p class="dp-card-description">Lower contrast for secondary content.</p>
</div>
</div>
<!-- Interactive (clickable) card -->
<a class="dp-card" data-interactive href="#"
style="text-decoration: none; max-width: 22rem;">
<div class="dp-card-body">
<h3 class="dp-card-title">Asset management</h3>
<p class="dp-card-description">Read more about the use case.</p>
</div>
</a>
/* Card
A surface that groups related content. Variants are set with data-variant.
Compose with .dp-card-header, .dp-card-body and .dp-card-footer.
All colour, radius and shadow come from tokens.css. */
.dp-card {
display: flex;
flex-direction: column;
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
box-shadow: var(--dp-shadow-md);
color: var(--dp-text);
overflow: hidden;
}
/* ---- Variants -------------------------------------------------------- */
.dp-card[data-variant="subtle"] {
background: var(--dp-surface-subtle);
box-shadow: var(--dp-shadow-sm);
}
.dp-card[data-variant="elevated"] {
border-color: var(--dp-border-strong);
box-shadow: var(--dp-shadow-lg);
}
.dp-card[data-variant="flat"] {
box-shadow: none;
}
/* Interactive cards lift on hover */
.dp-card[data-interactive] {
cursor: pointer;
transition: transform var(--dp-transition), box-shadow var(--dp-transition),
border-color var(--dp-transition);
}
.dp-card[data-interactive]:hover {
transform: translateY(-2px);
box-shadow: var(--dp-shadow-lg);
border-color: var(--dp-border-strong);
}
.dp-card[data-interactive]:focus-visible {
outline: none;
box-shadow: var(--dp-shadow-focus);
}
/* ---- Sections -------------------------------------------------------- */
.dp-card-header {
padding: var(--dp-space-5) var(--dp-space-6);
border-bottom: 1px solid var(--dp-border);
}
.dp-card-body {
padding: var(--dp-space-6);
}
.dp-card-footer {
display: flex;
align-items: center;
gap: var(--dp-space-3);
padding: var(--dp-space-4) var(--dp-space-6);
border-top: 1px solid var(--dp-border);
background: var(--dp-surface-subtle);
}
/* ---- Content --------------------------------------------------------- */
.dp-card-title {
margin: 0;
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-card-description {
margin: var(--dp-space-2) 0 0;
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
Data table with a sticky-style header, row hover and right-aligned numeric columns. Wrap it to scroll on narrow screens.
| Domain | Country | Pages | Visits |
|---|---|---|---|
| example.com | United States | 1.204 | 98.430 |
| dataprovider.nl | Netherlands | 312 | 24.108 |
| acme.io | Germany | 87 | 5.642 |
npx shadcn@latest add https://ds.dataprovider.dev/r/table.json
Registry JSON
<!-- Table
Wrap the table in .dp-table-wrap so it scrolls on narrow screens.
Use data-align="end" on numeric cells and data-sortable on headers. -->
<div class="dp-table-wrap">
<table class="dp-table">
<thead>
<tr>
<th data-sortable>
Domain
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m7 15 5 5 5-5"></path><path d="m7 9 5-5 5 5"></path>
</svg>
</th>
<th>Country</th>
<th data-align="end">Pages</th>
<th data-align="end">Visits</th>
</tr>
</thead>
<tbody>
<tr>
<td>example.com</td>
<td>United States</td>
<td data-align="end">1.204</td>
<td data-align="end">98.430</td>
</tr>
<tr>
<td>dataprovider.nl</td>
<td>Netherlands</td>
<td data-align="end">312</td>
<td data-align="end">24.108</td>
</tr>
<tr>
<td>acme.io</td>
<td>Germany</td>
<td data-align="end">87</td>
<td data-align="end">5.642</td>
</tr>
</tbody>
</table>
</div>
/* Table
A data table in the console style. Wrap in .dp-table-wrap for horizontal
scroll on narrow screens. All colour and type come from tokens.css. */
.dp-table-wrap {
width: 100%;
overflow-x: auto;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
background: var(--dp-surface);
}
.dp-table {
width: 100%;
border-collapse: collapse;
font-size: var(--dp-text-sm);
color: var(--dp-text);
}
.dp-table thead th {
text-align: left;
font-weight: var(--dp-weight-bold);
color: var(--dp-text-muted);
background: var(--dp-surface-subtle);
padding: var(--dp-space-3) var(--dp-space-4);
border-bottom: 1px solid var(--dp-border);
white-space: nowrap;
}
.dp-table tbody td {
padding: var(--dp-space-3) var(--dp-space-4);
border-bottom: 1px solid var(--dp-border);
}
.dp-table tbody tr:last-child td {
border-bottom: 0;
}
.dp-table tbody tr:hover {
background: var(--dp-surface-subtle);
}
/* Numeric columns align right */
.dp-table [data-align="end"] {
text-align: right;
font-variant-numeric: tabular-nums;
}
/* Sortable header */
.dp-table th[data-sortable] {
cursor: pointer;
}
.dp-table th[data-sortable]:hover {
color: var(--dp-navy);
}
.dp-table th[data-sortable] svg {
width: 0.875em;
height: 0.875em;
vertical-align: -2px;
opacity: 0.6;
}
A single metric with a large value, a label and an optional trend. Set the trend direction with data-tone.
npx shadcn@latest add https://ds.dataprovider.dev/r/stat.json
Registry JSON
<!-- Stat
Group metrics in .dp-stat-row. Set the trend direction with data-tone
(up or down) on .dp-stat-trend. -->
<div class="dp-stat-row">
<div class="dp-stat">
<span class="dp-stat-value">412M</span>
<span class="dp-stat-label">Domains tracked</span>
</div>
<div class="dp-stat">
<span class="dp-stat-value">99%</span>
<span class="dp-stat-label">Registered domains covered</span>
<span class="dp-stat-trend" data-tone="up">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M7 17 17 7"></path><path d="M7 7h10v10"></path>
</svg>
2.1% this month
</span>
</div>
<div class="dp-stat">
<span class="dp-stat-value">1.8s</span>
<span class="dp-stat-label">Median query time</span>
<span class="dp-stat-trend" data-tone="down">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M17 7 7 17"></path><path d="M17 17H7V7"></path>
</svg>
0.3s faster
</span>
</div>
</div>
/* Stat
A single metric: a large value with a label and an optional trend.
Group stats in a .dp-stat-row. Status tone is set with data-tone on the
trend. All colour and type come from tokens.css. */
.dp-stat-row {
display: flex;
flex-wrap: wrap;
gap: var(--dp-space-6);
}
.dp-stat {
display: flex;
flex-direction: column;
gap: var(--dp-space-1);
min-width: 8rem;
}
.dp-stat-value {
font-size: var(--dp-text-3xl);
font-weight: var(--dp-weight-extrabold);
line-height: 1;
color: var(--dp-navy);
font-variant-numeric: tabular-nums;
}
.dp-stat-label {
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-stat-trend {
display: inline-flex;
align-items: center;
gap: var(--dp-space-1);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-text-muted);
}
.dp-stat-trend svg {
width: 1em;
height: 1em;
}
.dp-stat-trend[data-tone="up"] {
color: var(--dp-success);
}
.dp-stat-trend[data-tone="down"] {
color: var(--dp-danger);
}
Small status or category label. Tone is set with data-tone and style with data-variant (soft is the default, solid for high emphasis).
npx shadcn@latest add https://ds.dataprovider.dev/r/badge.json
Registry JSON
<!-- Badge
Tone: neutral, primary (default), success, warning, danger, info.
Variant: soft (default) or solid (data-variant="solid"). -->
<!-- Soft (default) -->
<span class="dp-badge" data-tone="primary">Primary</span>
<span class="dp-badge" data-tone="neutral">Neutral</span>
<span class="dp-badge" data-tone="success">Active</span>
<span class="dp-badge" data-tone="warning">Pending</span>
<span class="dp-badge" data-tone="danger">Blocked</span>
<span class="dp-badge" data-tone="info">Info</span>
<!-- With a leading dot icon -->
<span class="dp-badge" data-tone="success">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="12" r="6"></circle></svg>
Online
</span>
<!-- Solid -->
<span class="dp-badge" data-variant="solid" data-tone="primary">Primary</span>
<span class="dp-badge" data-variant="solid" data-tone="success">Success</span>
<span class="dp-badge" data-variant="solid" data-tone="warning">Warning</span>
<span class="dp-badge" data-variant="solid" data-tone="danger">Danger</span>
/* Badge
A small status or category label. Tone is set with data-tone (neutral,
primary, success, warning, danger, info). Style is set with data-variant
(soft is the default, solid for high emphasis). Colour from tokens.css. */
.dp-badge {
display: inline-flex;
align-items: center;
gap: var(--dp-space-1);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
line-height: 1;
padding: 4px var(--dp-space-2);
border-radius: var(--dp-radius-full);
white-space: nowrap;
}
.dp-badge svg {
width: 0.875em;
height: 0.875em;
}
/* ---- Soft (default): tinted background, strong text ------------------ */
.dp-badge,
.dp-badge[data-tone="primary"] {
background: var(--dp-primary-soft);
color: var(--dp-blue-700);
}
.dp-badge[data-tone="neutral"] {
background: var(--dp-neutral-soft);
color: var(--dp-text-muted);
}
.dp-badge[data-tone="success"] {
background: var(--dp-success-soft);
color: var(--dp-success);
}
.dp-badge[data-tone="warning"] {
background: var(--dp-warning-soft);
color: var(--dp-warning);
}
.dp-badge[data-tone="danger"] {
background: var(--dp-danger-soft);
color: var(--dp-danger);
}
.dp-badge[data-tone="info"] {
background: var(--dp-info-soft);
color: var(--dp-info);
}
/* ---- Solid: filled background, light text ---------------------------- */
.dp-badge[data-variant="solid"] {
color: var(--dp-white);
}
.dp-badge[data-variant="solid"],
.dp-badge[data-variant="solid"][data-tone="primary"] {
background: var(--dp-primary-bg);
}
.dp-badge[data-variant="solid"][data-tone="neutral"] {
background: var(--dp-navy);
}
.dp-badge[data-variant="solid"][data-tone="success"] {
background: var(--dp-success);
}
.dp-badge[data-variant="solid"][data-tone="warning"] {
background: var(--dp-warning);
}
.dp-badge[data-variant="solid"][data-tone="danger"] {
background: var(--dp-danger);
}
.dp-badge[data-variant="solid"][data-tone="info"] {
background: var(--dp-info);
}
Circular image or initials in three sizes. Stack several in a group for an overlapping row.
npx shadcn@latest add https://ds.dataprovider.dev/r/avatar.json
Registry JSON
<!-- Avatar
Initials or an image. Sizes: sm, default, lg (data-size).
Use .dp-avatar-group for an overlapping row. -->
<!-- Initials -->
<span class="dp-avatar" data-size="sm" aria-label="Bram Bergen">BB</span>
<span class="dp-avatar" aria-label="Bram Bergen">BB</span>
<span class="dp-avatar" data-size="lg" aria-label="Bram Bergen">BB</span>
<!-- Image -->
<span class="dp-avatar">
<img src="https://www.dataprovider.com/favicon.ico" alt="" />
</span>
<!-- Overlapping group -->
<span class="dp-avatar-group">
<span class="dp-avatar" aria-label="User one">A1</span>
<span class="dp-avatar" aria-label="User two">B2</span>
<span class="dp-avatar" aria-label="User three">C3</span>
<span class="dp-avatar" style="background: var(--dp-neutral-300); color: var(--dp-text-muted);">+5</span>
</span>
/* Avatar
A circular image or initials. Sizes are set with data-size (sm, default,
lg). Stack avatars in .dp-avatar-group for an overlapping row.
Colour and type from tokens.css. */
.dp-avatar {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.5rem;
height: 2.5rem;
border-radius: var(--dp-radius-full);
background: var(--dp-blue-200);
color: var(--dp-blue-700);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
overflow: hidden;
user-select: none;
flex: none;
}
.dp-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.dp-avatar[data-size="sm"] {
width: 2rem;
height: 2rem;
font-size: var(--dp-text-xs);
}
.dp-avatar[data-size="lg"] {
width: 3.5rem;
height: 3.5rem;
font-size: var(--dp-text-xl);
}
/* Overlapping group */
.dp-avatar-group {
display: inline-flex;
}
.dp-avatar-group .dp-avatar {
border: 2px solid var(--dp-surface);
margin-left: -0.625rem;
}
.dp-avatar-group .dp-avatar:first-child {
margin-left: 0;
}
Inline message with an icon, title and text. Tone is set with data-tone (info, success, warning, danger).
npx shadcn@latest add https://ds.dataprovider.dev/r/alert.json
Registry JSON
<!-- Alert
Tone: info (default), success, warning, danger.
Compose an icon, a title and text inside .dp-alert-body. -->
<div class="dp-alert" role="status">
<svg class="dp-alert-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path>
</svg>
<div class="dp-alert-body">
<span class="dp-alert-title">Data refreshed</span>
<span class="dp-alert-text">The dataset was last updated on the first of this month.</span>
</div>
</div>
<div class="dp-alert" data-tone="success" role="status">
<svg class="dp-alert-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M20 6 9 17l-5-5"></path>
</svg>
<div class="dp-alert-body">
<span class="dp-alert-title">Export ready</span>
<span class="dp-alert-text">Your CSV download has finished.</span>
</div>
</div>
<div class="dp-alert" data-tone="warning" role="status">
<svg class="dp-alert-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z"></path>
<path d="M12 9v4"></path><path d="M12 17h.01"></path>
</svg>
<div class="dp-alert-body">
<span class="dp-alert-title">Approaching limit</span>
<span class="dp-alert-text">You have used 90% of this month's queries.</span>
</div>
</div>
<div class="dp-alert" data-tone="danger" role="alert">
<svg class="dp-alert-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="12" cy="12" r="10"></circle><path d="m15 9-6 6"></path><path d="m9 9 6 6"></path>
</svg>
<div class="dp-alert-body">
<span class="dp-alert-title">Query failed</span>
<span class="dp-alert-text">The filter could not be parsed. Check the syntax and try again.</span>
</div>
</div>
/* Alert
An inline message. Tone is set with data-tone (info (default), success,
warning, danger). Compose with an icon, .dp-alert-body, a title and text.
All colour and type come from tokens.css. */
.dp-alert {
display: flex;
align-items: flex-start;
gap: var(--dp-space-3);
padding: var(--dp-space-4) var(--dp-space-5);
border: 1px solid transparent;
border-radius: var(--dp-radius-md);
color: var(--dp-text);
background: var(--dp-info-soft);
border-color: var(--dp-blue-300);
}
.dp-alert-icon {
flex: none;
width: 1.25rem;
height: 1.25rem;
margin-top: 1px;
color: var(--dp-info);
}
.dp-alert-body {
display: flex;
flex-direction: column;
gap: 2px;
}
.dp-alert-title {
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-alert-text {
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
/* ---- Tones ----------------------------------------------------------- */
.dp-alert[data-tone="success"] {
background: var(--dp-success-soft);
border-color: #bbf7d0;
}
.dp-alert[data-tone="success"] .dp-alert-icon { color: var(--dp-success); }
.dp-alert[data-tone="warning"] {
background: var(--dp-warning-soft);
border-color: #fde68a;
}
.dp-alert[data-tone="warning"] .dp-alert-icon { color: var(--dp-warning); }
.dp-alert[data-tone="danger"] {
background: var(--dp-danger-soft);
border-color: #fecaca;
}
.dp-alert[data-tone="danger"] .dp-alert-icon { color: var(--dp-danger); }
Horizontal progress bar with tone variants and an indeterminate mode for unknown durations. Set the fill width inline.
npx shadcn@latest add https://ds.dataprovider.dev/r/progress.json
Registry JSON
<!-- Progress
Set the fill width inline and mirror it on aria-valuenow.
Tone: default, success, warning, danger. Add data-indeterminate for an
unknown-duration bar. -->
<div class="dp-progress" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="35">
<div class="dp-progress-bar" style="width: 35%;"></div>
</div>
<div class="dp-progress" data-tone="success" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100">
<div class="dp-progress-bar" style="width: 100%;"></div>
</div>
<div class="dp-progress" data-tone="warning" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="70">
<div class="dp-progress-bar" style="width: 70%;"></div>
</div>
<div class="dp-progress" data-indeterminate role="progressbar" aria-label="Loading">
<div class="dp-progress-bar"></div>
</div>
/* Progress
A horizontal progress bar. Set the fill width inline (or from JS) and mirror
it on the aria-valuenow attribute. Tone is set with data-tone on the track.
Add data-indeterminate for an unknown-duration bar. Colour from tokens.css. */
.dp-progress {
width: 100%;
height: 0.5rem;
background: var(--dp-blue-200);
border-radius: var(--dp-radius-full);
overflow: hidden;
}
.dp-progress-bar {
height: 100%;
width: 0;
background: var(--dp-primary-bg);
border-radius: inherit;
transition: width var(--dp-transition);
}
.dp-progress[data-tone="success"] .dp-progress-bar { background: var(--dp-success); }
.dp-progress[data-tone="warning"] .dp-progress-bar { background: var(--dp-warning); }
.dp-progress[data-tone="danger"] .dp-progress-bar { background: var(--dp-danger); }
/* Indeterminate: a sliding sliver for unknown duration */
.dp-progress[data-indeterminate] .dp-progress-bar {
width: 40%;
animation: dp-progress-slide 1.2s ease-in-out infinite;
}
@keyframes dp-progress-slide {
0% { transform: translateX(-100%); }
100% { transform: translateX(250%); }
}
Spinning loading indicator in three sizes. Inherits the current colour or takes a neutral tone, and slows under reduced-motion.
npx shadcn@latest add https://ds.dataprovider.dev/r/spinner.json
Registry JSON
<!-- Spinner
Sizes: sm, default, lg (data-size). Tone: default (blue) or neutral.
Include a label for screen readers. -->
<span class="dp-spinner" data-size="sm" role="status" aria-label="Loading"></span>
<span class="dp-spinner" role="status" aria-label="Loading"></span>
<span class="dp-spinner" data-size="lg" role="status" aria-label="Loading"></span>
<span class="dp-spinner" data-tone="neutral" role="status" aria-label="Loading"></span>
/* Spinner
A spinning loading indicator. Sizes are set with data-size (sm, default,
lg). Inherits the current text colour, or set data-tone. Add a visually
hidden label for screen readers. Colour from tokens.css. */
.dp-spinner {
display: inline-block;
width: 1.5rem;
height: 1.5rem;
border: 2px solid var(--dp-blue-200);
border-top-color: var(--dp-primary-bg);
border-radius: var(--dp-radius-full);
animation: dp-spin 0.7s linear infinite;
}
.dp-spinner[data-size="sm"] {
width: 1rem;
height: 1rem;
border-width: 2px;
}
.dp-spinner[data-size="lg"] {
width: 2.5rem;
height: 2.5rem;
border-width: 3px;
}
.dp-spinner[data-tone="neutral"] {
border-color: var(--dp-neutral-300);
border-top-color: var(--dp-text-muted);
}
@keyframes dp-spin {
to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
.dp-spinner { animation-duration: 2s; }
}
Animated placeholder shown while content loads. Shapes are set with data-shape (default, text, circle).
npx shadcn@latest add https://ds.dataprovider.dev/r/skeleton.json
Registry JSON
<!-- Skeleton
A loading placeholder. Set size inline. Shapes: default, text, circle. -->
<!-- A loading card: avatar, two lines of text and a wider block -->
<div style="display: flex; gap: var(--dp-space-4); align-items: center; max-width: 24rem;">
<span class="dp-skeleton" data-shape="circle" style="width: 2.5rem; height: 2.5rem;"></span>
<div style="flex: 1; display: flex; flex-direction: column; gap: var(--dp-space-2);">
<span class="dp-skeleton" data-shape="text" style="width: 60%;"></span>
<span class="dp-skeleton" data-shape="text" style="width: 90%;"></span>
</div>
</div>
<span class="dp-skeleton" style="height: 8rem; max-width: 24rem; border-radius: var(--dp-radius-lg);"></span>
/* Skeleton
A placeholder shown while content loads. Set width and height inline or with
utility classes. Use data-shape="circle" for avatars and data-shape="text"
for lines. Colour and motion come from tokens.css. */
.dp-skeleton {
display: block;
width: 100%;
height: 1rem;
border-radius: var(--dp-radius-sm);
background: linear-gradient(
90deg,
var(--dp-blue-200) 25%,
var(--dp-blue-100) 37%,
var(--dp-blue-200) 63%
);
background-size: 400% 100%;
animation: dp-skeleton-shimmer 1.4s ease infinite;
}
.dp-skeleton[data-shape="text"] {
height: 0.75rem;
border-radius: var(--dp-radius-xs);
}
.dp-skeleton[data-shape="circle"] {
border-radius: var(--dp-radius-full);
}
@keyframes dp-skeleton-shimmer {
0% { background-position: 100% 50%; }
100% { background-position: 0 50%; }
}
@media (prefers-reduced-motion: reduce) {
.dp-skeleton { animation: none; }
}
Label shown on hover or keyboard focus. Position is set with data-side. Add data-open to force it visible.
npx shadcn@latest add https://ds.dataprovider.dev/r/tooltip.json
Registry JSON
<!-- Tooltip
Wrap the trigger and .dp-tooltip-content in .dp-tooltip. Shows on hover
and keyboard focus. Position with data-side (top, bottom). The third
example uses data-open so it stays visible. -->
<span class="dp-tooltip" tabindex="0">
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Hover me</button>
<span class="dp-tooltip-content" role="tooltip">Refreshed monthly</span>
</span>
<span class="dp-tooltip" data-side="bottom" tabindex="0">
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Below</button>
<span class="dp-tooltip-content" role="tooltip">Shown beneath the trigger</span>
</span>
<span class="dp-tooltip" data-open>
<button class="dp-btn" type="button" data-size="sm">Always on</button>
<span class="dp-tooltip-content" role="tooltip">This tooltip is forced open</span>
</span>
/* Tooltip
A label shown on hover or focus. Wrap the trigger and .dp-tooltip-content in
.dp-tooltip. Position is set with data-side (top (default), bottom).
Add data-open to force it visible. Colour and type from tokens.css. */
.dp-tooltip {
position: relative;
display: inline-flex;
}
.dp-tooltip-content {
position: absolute;
left: 50%;
bottom: calc(100% + 8px);
transform: translateX(-50%);
z-index: 20;
background: var(--dp-navy);
color: var(--dp-white);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-semibold);
line-height: 1.3;
padding: var(--dp-space-2) var(--dp-space-3);
border-radius: var(--dp-radius-sm);
box-shadow: var(--dp-shadow-md);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity var(--dp-transition);
}
/* Arrow */
.dp-tooltip-content::after {
content: "";
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 5px solid transparent;
border-top-color: var(--dp-navy);
}
.dp-tooltip[data-side="bottom"] .dp-tooltip-content {
bottom: auto;
top: calc(100% + 8px);
}
.dp-tooltip[data-side="bottom"] .dp-tooltip-content::after {
top: auto;
bottom: 100%;
border-top-color: transparent;
border-bottom-color: var(--dp-navy);
}
/* Shown on hover, keyboard focus, or when forced open */
.dp-tooltip:hover .dp-tooltip-content,
.dp-tooltip:focus-within .dp-tooltip-content,
.dp-tooltip[data-open] .dp-tooltip-content {
opacity: 1;
}
Tabbed panels that switch without JavaScript, driven by hidden radios. Supports up to five tabs.
npx shadcn@latest add https://ds.dataprovider.dev/r/tabs.json
Registry JSON
<!-- Tabs
Works without JavaScript. Put the radios first (shared name, one checked),
then the labels in .dp-tablist, then the panels in .dp-tabpanels. Keep
label and panel order in step. Use a unique name per tabs instance. -->
<div class="dp-tabs">
<input class="dp-tab-radio" type="radio" name="dp-tabs-demo" id="dp-tab-1" checked />
<input class="dp-tab-radio" type="radio" name="dp-tabs-demo" id="dp-tab-2" />
<input class="dp-tab-radio" type="radio" name="dp-tabs-demo" id="dp-tab-3" />
<div class="dp-tablist" role="tablist">
<label class="dp-tab" for="dp-tab-1">Discover</label>
<label class="dp-tab" for="dp-tab-2">Map</label>
<label class="dp-tab" for="dp-tab-3">Analyze</label>
</div>
<div class="dp-tabpanels">
<div class="dp-tabpanel" role="tabpanel">
Search 400M domains by technology, content and company attributes.
</div>
<div class="dp-tabpanel" role="tabpanel">
Plot company and technology adoption across regions.
</div>
<div class="dp-tabpanel" role="tabpanel">
Build reports on trends, links and ownership over time.
</div>
</div>
</div>
/* Tabs
A tabbed panel that works without JavaScript. Hidden radios (one group via a
shared name) drive which label is active and which panel shows. Supports up
to five tabs. Colour and type come from tokens.css.
Structure: radios first, then .dp-tablist (labels), then .dp-tabpanels
(panels). Match each label's `for` to a radio id, and keep label and panel
order in step. */
.dp-tabs {
display: block;
}
.dp-tab-radio {
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
pointer-events: none;
}
.dp-tablist {
display: flex;
flex-wrap: wrap;
gap: var(--dp-space-1);
border-bottom: 1px solid var(--dp-border);
}
.dp-tab {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
padding: var(--dp-space-3) var(--dp-space-4);
font-weight: var(--dp-weight-bold);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
cursor: pointer;
border-bottom: 2px solid transparent;
margin-bottom: -1px;
transition: color var(--dp-transition), border-color var(--dp-transition);
}
.dp-tab:hover {
color: var(--dp-navy);
}
.dp-tabpanels {
padding-top: var(--dp-space-5);
}
.dp-tabpanel {
display: none;
color: var(--dp-text-muted);
}
/* Show the panel whose index matches the checked radio */
.dp-tab-radio:nth-of-type(1):checked ~ .dp-tabpanels .dp-tabpanel:nth-child(1),
.dp-tab-radio:nth-of-type(2):checked ~ .dp-tabpanels .dp-tabpanel:nth-child(2),
.dp-tab-radio:nth-of-type(3):checked ~ .dp-tabpanels .dp-tabpanel:nth-child(3),
.dp-tab-radio:nth-of-type(4):checked ~ .dp-tabpanels .dp-tabpanel:nth-child(4),
.dp-tab-radio:nth-of-type(5):checked ~ .dp-tabpanels .dp-tabpanel:nth-child(5) {
display: block;
}
/* Mark the matching label active */
.dp-tab-radio:nth-of-type(1):checked ~ .dp-tablist .dp-tab:nth-child(1),
.dp-tab-radio:nth-of-type(2):checked ~ .dp-tablist .dp-tab:nth-child(2),
.dp-tab-radio:nth-of-type(3):checked ~ .dp-tablist .dp-tab:nth-child(3),
.dp-tab-radio:nth-of-type(4):checked ~ .dp-tablist .dp-tab:nth-child(4),
.dp-tab-radio:nth-of-type(5):checked ~ .dp-tablist .dp-tab:nth-child(5) {
color: var(--dp-navy);
border-bottom-color: var(--dp-blue-700);
}
/* Keyboard focus ring on the matching label */
.dp-tab-radio:nth-of-type(1):focus-visible ~ .dp-tablist .dp-tab:nth-child(1),
.dp-tab-radio:nth-of-type(2):focus-visible ~ .dp-tablist .dp-tab:nth-child(2),
.dp-tab-radio:nth-of-type(3):focus-visible ~ .dp-tablist .dp-tab:nth-child(3),
.dp-tab-radio:nth-of-type(4):focus-visible ~ .dp-tablist .dp-tab:nth-child(4),
.dp-tab-radio:nth-of-type(5):focus-visible ~ .dp-tablist .dp-tab:nth-child(5) {
outline: none;
box-shadow: var(--dp-shadow-focus);
border-radius: var(--dp-radius-xs) var(--dp-radius-xs) 0 0;
}
Trail of links showing the current location. Mark the last item with aria-current. Separators are inline SVG.
npx shadcn@latest add https://ds.dataprovider.dev/r/breadcrumb.json
Registry JSON
<!-- Breadcrumb
An ordered list inside a labelled nav. Mark the last item with
aria-current="page". Separators are inline SVG between items. -->
<nav class="dp-breadcrumb" aria-label="Breadcrumb">
<ol>
<li>
<a href="#">Home</a>
<svg class="dp-breadcrumb-sep" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m9 18 6-6-6-6"></path>
</svg>
</li>
<li>
<a href="#">Datasets</a>
<svg class="dp-breadcrumb-sep" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m9 18 6-6-6-6"></path>
</svg>
</li>
<li><span aria-current="page">Domains</span></li>
</ol>
</nav>
/* Breadcrumb
A trail of links showing the current location. Use an ordered list inside a
nav with aria-label. Mark the last item with aria-current="page". Separators
are drawn with inline SVG. Colour and type from tokens.css. */
.dp-breadcrumb ol {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--dp-space-2);
margin: 0;
padding: 0;
list-style: none;
font-size: var(--dp-text-sm);
}
.dp-breadcrumb li {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
}
.dp-breadcrumb a {
color: var(--dp-text-muted);
text-decoration: none;
font-weight: var(--dp-weight-semibold);
}
.dp-breadcrumb a:hover {
color: var(--dp-link);
}
.dp-breadcrumb [aria-current="page"] {
color: var(--dp-navy);
font-weight: var(--dp-weight-bold);
}
.dp-breadcrumb-sep {
width: 1rem;
height: 1rem;
color: var(--dp-text-subtle);
flex: none;
}
Page navigation with previous and next controls, a current page and an ellipsis for skipped ranges.
npx shadcn@latest add https://ds.dataprovider.dev/r/pagination.json
Registry JSON
<!-- Pagination
Mark the current page with aria-current="page". Disable prev or next with
the disabled attribute. Use .dp-page-ellipsis to skip a range. -->
<nav class="dp-pagination" aria-label="Pagination">
<button class="dp-page" type="button" disabled aria-label="Previous page">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m15 18-6-6 6-6"></path>
</svg>
</button>
<a class="dp-page" href="#" aria-current="page">1</a>
<a class="dp-page" href="#">2</a>
<a class="dp-page" href="#">3</a>
<span class="dp-page-ellipsis" aria-hidden="true">…</span>
<a class="dp-page" href="#">24</a>
<button class="dp-page" type="button" aria-label="Next page">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m9 18 6-6-6-6"></path>
</svg>
</button>
</nav>
/* Pagination
Page navigation. Mark the current page with aria-current="page". Disable the
previous or next control with the disabled attribute (on a button) or
aria-disabled (on a link). Colour and type from tokens.css. */
.dp-pagination {
display: inline-flex;
align-items: center;
gap: var(--dp-space-1);
}
.dp-page {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 2.25rem;
height: 2.25rem;
padding: 0 var(--dp-space-2);
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-text-muted);
background: transparent;
border: 1px solid transparent;
border-radius: var(--dp-radius-xs);
cursor: pointer;
text-decoration: none;
transition: background-color var(--dp-transition), color var(--dp-transition),
border-color var(--dp-transition);
}
.dp-page svg {
width: 1.1em;
height: 1.1em;
}
.dp-page:hover {
background: var(--dp-surface-soft);
color: var(--dp-navy);
}
.dp-page[aria-current="page"] {
background: var(--dp-primary-bg);
border-color: var(--dp-primary-border);
color: var(--dp-white);
}
.dp-page:focus-visible {
outline: none;
box-shadow: var(--dp-shadow-focus);
}
.dp-page[disabled],
.dp-page[aria-disabled="true"] {
color: var(--dp-text-subtle);
cursor: not-allowed;
pointer-events: none;
}
.dp-page-ellipsis {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 2.25rem;
height: 2.25rem;
color: var(--dp-text-subtle);
}
Divider between content. Horizontal by default, vertical inside a flex row, or labelled with centred text.
Above the line
Below the line
npx shadcn@latest add https://ds.dataprovider.dev/r/separator.json
Registry JSON
<!-- Separator
Horizontal by default. Use data-orientation="vertical" inside a flex row.
Use .dp-separator-labelled for a divider with centred text. -->
<!-- Horizontal -->
<p style="margin: 0; color: var(--dp-text-muted);">Above the line</p>
<hr class="dp-separator" />
<p style="margin: 0; color: var(--dp-text-muted);">Below the line</p>
<!-- Labelled -->
<div class="dp-separator-labelled">OR</div>
<!-- Vertical, inside a row -->
<div style="display: flex; align-items: center; height: 2rem; color: var(--dp-text-muted);">
<span>Pages</span>
<span class="dp-separator" data-orientation="vertical" role="separator"></span>
<span>Visits</span>
<span class="dp-separator" data-orientation="vertical" role="separator"></span>
<span>Owner</span>
</div>
/* Separator
A divider between content. Horizontal by default; set
data-orientation="vertical" for a vertical rule inside a flex row. Use
.dp-separator-labelled for a divider with centred text. Colour from
tokens.css. */
.dp-separator {
border: 0;
height: 1px;
background: var(--dp-border);
margin: var(--dp-space-4) 0;
}
.dp-separator[data-orientation="vertical"] {
width: 1px;
height: auto;
align-self: stretch;
margin: 0 var(--dp-space-4);
}
.dp-separator-labelled {
display: flex;
align-items: center;
gap: var(--dp-space-3);
color: var(--dp-text-subtle);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
}
.dp-separator-labelled::before,
.dp-separator-labelled::after {
content: "";
flex: 1;
height: 1px;
background: var(--dp-border);
}
Expandable sections built from native details and summary, so they work without JavaScript. The chevron rotates when open.
npx shadcn@latest add https://ds.dataprovider.dev/r/accordion.json
Registry JSON
<!-- Accordion
Native details and summary, so it works without JavaScript. Add the open
attribute to a details to start it expanded. Group sections in
.dp-accordion. -->
<div class="dp-accordion">
<details open>
<summary>
What is in the dataset
<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m6 9 6 6 6-6"></path>
</svg>
</summary>
<div class="dp-accordion-content">
Structured records for 400M domains, refreshed monthly across every TLD.
</div>
</details>
<details>
<summary>
How often is it updated
<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m6 9 6 6 6-6"></path>
</svg>
</summary>
<div class="dp-accordion-content">
The full dataset is rebuilt on the first of each month.
</div>
</details>
<details>
<summary>
Which formats can I export
<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m6 9 6 6 6-6"></path>
</svg>
</summary>
<div class="dp-accordion-content">
CSV and JSON are available on every plan.
</div>
</details>
</div>
/* Accordion
Expandable sections built from native details and summary, so they work
without JavaScript. Group sections in .dp-accordion. Colour and type from
tokens.css. */
.dp-accordion {
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
overflow: hidden;
background: var(--dp-surface);
}
.dp-accordion details {
border-bottom: 1px solid var(--dp-border);
}
.dp-accordion details:last-child {
border-bottom: 0;
}
.dp-accordion summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dp-space-3);
padding: var(--dp-space-4) var(--dp-space-5);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
cursor: pointer;
list-style: none;
}
.dp-accordion summary::-webkit-details-marker {
display: none;
}
.dp-accordion summary:hover {
background: var(--dp-surface-subtle);
}
.dp-accordion summary:focus-visible {
outline: none;
box-shadow: inset 0 0 0 2px var(--dp-blue-300);
}
.dp-accordion-icon {
width: 1.25rem;
height: 1.25rem;
flex: none;
color: var(--dp-text-muted);
transition: transform var(--dp-transition);
}
.dp-accordion details[open] summary .dp-accordion-icon {
transform: rotate(180deg);
}
.dp-accordion-content {
padding: 0 var(--dp-space-5) var(--dp-space-5);
color: var(--dp-text-muted);
font-size: var(--dp-text-sm);
}
Modal dialog panel with a header, body and footer. Wrap it in the modal backdrop, or place it inside a native dialog element.
npx shadcn@latest add https://ds.dataprovider.dev/r/dialog.json
Registry JSON
<!-- Dialog
.dp-dialog is the panel. Shown here on its own so it renders in place.
In use, wrap it in <div class="dp-modal"> for the centred backdrop and
toggle that wrapper from JS, or place this panel inside a native <dialog>
element and call showModal(). -->
<div class="dp-dialog" role="dialog" aria-modal="true" aria-labelledby="dlg-title">
<div class="dp-dialog-header">
<h2 class="dp-dialog-title" id="dlg-title">Delete this query</h2>
<button class="dp-dialog-close" type="button" aria-label="Close">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M18 6 6 18"></path><path d="m6 6 12 12"></path>
</svg>
</button>
</div>
<div class="dp-dialog-body">
This removes the saved query and its schedule. Exported files are not
affected. This cannot be undone.
</div>
<div class="dp-dialog-footer">
<button class="dp-btn" type="button" data-variant="outline">Cancel</button>
<button class="dp-btn" type="button" data-variant="danger">Delete query</button>
</div>
</div>
/* Dialog
A modal dialog. .dp-dialog is the panel; wrap it in .dp-modal for the
centred backdrop. Toggle the backdrop's visibility from JS, or use a native
<dialog> element with this panel inside. Colour, radius and shadow from
tokens.css. */
.dp-modal {
position: fixed;
inset: 0;
z-index: 50;
display: flex;
align-items: center;
justify-content: center;
padding: var(--dp-space-6);
background: var(--dp-overlay);
}
.dp-dialog {
display: flex;
flex-direction: column;
width: 100%;
max-width: 28rem;
background: var(--dp-surface);
border-radius: var(--dp-radius-xl);
box-shadow: var(--dp-shadow-lg);
overflow: hidden;
}
.dp-dialog-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--dp-space-4);
padding: var(--dp-space-5) var(--dp-space-6);
border-bottom: 1px solid var(--dp-border);
}
.dp-dialog-title {
margin: 0;
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-dialog-close {
appearance: none;
border: 0;
background: transparent;
color: var(--dp-text-muted);
cursor: pointer;
padding: 4px;
line-height: 0;
border-radius: var(--dp-radius-xs);
}
.dp-dialog-close:hover {
background: var(--dp-surface-soft);
color: var(--dp-navy);
}
.dp-dialog-close svg {
width: 1.25rem;
height: 1.25rem;
}
.dp-dialog-body {
padding: var(--dp-space-6);
color: var(--dp-text-muted);
}
.dp-dialog-footer {
display: flex;
justify-content: flex-end;
gap: var(--dp-space-3);
padding: var(--dp-space-4) var(--dp-space-6);
border-top: 1px solid var(--dp-border);
background: var(--dp-surface-subtle);
}
Console navigation with a brand header, grouped items with icons and an active state, and a user block. Pair with the app shell for a full screen.
npx shadcn@latest add https://ds.dataprovider.dev/r/sidebar.json
Registry JSON
<!-- Sidebar
The console navigation. Mark the current item with data-active. Inactive
items are muted; the active item is brand purple and bold on a soft fill.
Group labels carry a divider; collapsed groups use data-collapsed and a
right chevron. Best shown under the console theme. Pair with .dp-shell +
.dp-shell-main for a full screen. -->
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com">
<g fill="currentColor">
<path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path>
<path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path>
<circle cx="77.71" cy="71.82" r="9.55"></circle>
<path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path>
</g>
</svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 15h2a2 2 0 1 0 0-4h-3l-3 3"></path><path d="m7 18 1-1h4"></path><path d="M2 21h2.5L8 17.5"></path><circle cx="16" cy="6" r="3"></circle></svg>
Value Assistant
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"></path><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"></path></svg>
Monitoring <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="14" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path><path d="M12 18v3"></path></svg>
Dashboards
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M9 13h6"></path><path d="M9 17h3"></path></svg>
Recipes
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Products
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
Search Engine
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7V5a2 2 0 0 1 2-2h2"></path><path d="M17 3h2a2 2 0 0 1 2 2v2"></path><path d="M21 17v2a2 2 0 0 1-2 2h-2"></path><path d="M7 21H5a2 2 0 0 1-2-2v-2"></path><circle cx="12" cy="11" r="2"></circle><path d="M9 16a3 3 0 0 1 6 0"></path></svg>
Know Your Business
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M2 12h20"></path><path d="M12 2a15 15 0 0 1 0 20 15 15 0 0 1 0-20"></path></svg>
Reverse DNS
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"></path></svg>
SSL Catalog
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M5.5 16.5C2 13 1 8 3 6s7-1 10.5 2.5S19 17 17 19s-8 1-11.5-2.5"></path></svg>
Universe <span class="dp-nav-beta">Beta</span>
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v3"></path><path d="M5 5h11l3 3-3 3H5z"></path><path d="M12 11v3"></path><path d="M8 17h11l-3-3"></path><path d="M12 17v5"></path></svg>
Traffic
</a>
<div class="dp-nav-group" data-collapsed>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg>
Account
</div>
<div class="dp-nav-group" data-collapsed>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg>
Support
</div>
<div class="dp-nav-group" data-collapsed>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg>
Admin
</div>
<div class="dp-nav-group" data-collapsed>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg>
Legal
</div>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
/* Sidebar
The console app navigation: a brand header, grouped nav items with icons and
an active state, and a user block with a sign-out action. Pair with
.dp-shell to lay it out beside the main content. Best used under the console
theme (data-theme="console"). Colour and type come from tokens.css. */
/* App shell: sidebar beside scrolling content */
.dp-shell {
display: flex;
align-items: stretch;
min-height: 100%;
background: var(--dp-bg);
}
.dp-shell-main {
flex: 1;
min-width: 0;
padding: var(--dp-space-8);
overflow: auto;
}
.dp-sidebar {
display: flex;
flex-direction: column;
width: 16rem;
flex: none;
padding: var(--dp-space-4);
background: var(--dp-surface);
border-right: 1px solid var(--dp-border);
}
/* Header: wordmark and collapse control */
.dp-sidebar-head {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--dp-space-2) var(--dp-space-2) var(--dp-space-5);
}
.dp-sidebar-logo {
display: inline-flex;
color: var(--dp-brand-purple, var(--dp-navy));
}
.dp-sidebar-logo svg {
height: 30px;
width: auto;
display: block;
}
.dp-sidebar-collapse {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.75rem;
height: 1.75rem;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-full);
background: var(--dp-surface);
color: var(--dp-text-muted);
cursor: pointer;
}
.dp-sidebar-collapse:hover {
background: var(--dp-surface-soft);
}
/* Nav */
.dp-sidebar-nav {
display: flex;
flex-direction: column;
gap: 2px;
flex: 1;
overflow-y: auto;
}
.dp-nav-item {
display: flex;
align-items: center;
gap: var(--dp-space-3);
min-height: 2.5rem;
padding: 0 var(--dp-space-3);
border-radius: var(--dp-radius-md);
color: var(--dp-text-muted);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-regular);
text-decoration: none;
cursor: pointer;
}
.dp-nav-item svg {
width: 1.25rem;
height: 1.25rem;
flex: none;
}
.dp-nav-item:hover {
background: var(--dp-surface-soft);
}
.dp-nav-item[data-active] {
background: var(--dp-surface-soft);
color: var(--dp-navy);
font-weight: var(--dp-weight-bold);
}
.dp-nav-item .dp-nav-beta {
margin-left: auto;
}
/* Small beta tag */
.dp-nav-beta {
font-size: 9px;
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--dp-beta-text, #665400);
background: var(--dp-beta-bg, #ffed99);
padding: 2px 5px;
border-radius: var(--dp-radius-xs);
line-height: 1;
}
/* Group label with a collapse chevron, with a divider above */
.dp-nav-group {
display: flex;
align-items: center;
gap: var(--dp-space-2);
margin: var(--dp-space-2) calc(-1 * var(--dp-space-4)) 0;
padding: var(--dp-space-4) var(--dp-space-4) var(--dp-space-1);
border-top: 1px solid var(--dp-border);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--dp-text-subtle);
}
.dp-nav-group svg {
width: 0.875rem;
height: 0.875rem;
flex: none;
}
/* Collapsed group: a clickable row with a right chevron */
.dp-nav-group[data-collapsed] {
cursor: pointer;
}
.dp-nav-group[data-collapsed]:hover {
color: var(--dp-text-muted);
}
/* User block */
.dp-sidebar-foot {
display: flex;
align-items: center;
gap: var(--dp-space-3);
padding-top: var(--dp-space-4);
margin-top: var(--dp-space-2);
border-top: 1px solid var(--dp-border);
}
.dp-sidebar-user {
display: flex;
flex-direction: column;
min-width: 0;
line-height: 1.2;
}
.dp-sidebar-user-name {
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.dp-sidebar-user-org {
font-size: var(--dp-text-xs);
color: var(--dp-text-muted);
}
.dp-sidebar-foot .dp-btn {
margin-left: auto;
}
A letter grade from A to F on a fixed colour scale. Circle by default, large, or a labelled pill.
npx shadcn@latest add https://ds.dataprovider.dev/r/grade.json
Registry JSON
<!-- Trust grade
Set the grade with data-grade (a to f). Circle by default, lg for larger,
or data-variant="pill" for a labelled pill. Shown under the console theme. -->
<!-- Circles -->
<span class="dp-grade" data-grade="a" aria-label="Grade A">A</span>
<span class="dp-grade" data-grade="b" aria-label="Grade B">B</span>
<span class="dp-grade" data-grade="c" aria-label="Grade C">C</span>
<span class="dp-grade" data-grade="d" aria-label="Grade D">D</span>
<span class="dp-grade" data-grade="e" aria-label="Grade E">E</span>
<span class="dp-grade" data-grade="f" aria-label="Grade F">F</span>
<!-- Large -->
<span class="dp-grade" data-grade="a" data-size="lg" aria-label="Grade A">A</span>
<!-- Pill with label -->
<span class="dp-grade" data-grade="a" data-variant="pill">A Trust grade</span>
/* Trust grade
A letter grade from A to F, coloured on a fixed scale. Set the grade with
data-grade (a, b, c, d, e, f). Use the circle by default or data-variant="pill"
for a labelled pill. Grade colours come from the console theme in tokens.css. */
.dp-grade {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.75rem;
height: 1.75rem;
border-radius: var(--dp-radius-full);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-extrabold);
color: var(--dp-white);
background: var(--dp-grade-c);
text-transform: uppercase;
}
.dp-grade[data-grade="a"] { background: var(--dp-grade-a); }
.dp-grade[data-grade="b"] { background: var(--dp-grade-b); }
.dp-grade[data-grade="c"] { background: var(--dp-grade-c); color: var(--dp-brand-purple, #2d145f); }
.dp-grade[data-grade="d"] { background: var(--dp-grade-d); }
.dp-grade[data-grade="e"] { background: var(--dp-grade-e); }
.dp-grade[data-grade="f"] { background: var(--dp-grade-f); }
.dp-grade[data-size="lg"] {
width: 2.5rem;
height: 2.5rem;
font-size: var(--dp-text-lg);
}
/* Pill variant: letter plus a label */
.dp-grade[data-variant="pill"] {
width: auto;
height: auto;
gap: var(--dp-space-2);
padding: 4px var(--dp-space-3);
border-radius: var(--dp-radius-full);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
}
Marketing navigation: a white rounded bar with the logo, menu items with dropdown carets, log-in and a gold Contact CTA.
npx shadcn@latest add https://ds.dataprovider.dev/r/site-header.json
Registry JSON
<!-- Site header
Marketing navigation. Menu items with a dropdown open a mega-menu (wire the
panel with the menu component or a details element). The Contact CTA uses
the gold button. Marketing theme (no data-theme). -->
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
/* Site header
The marketing navigation: a white rounded bar with the logo, menu items
(some with a dropdown caret) and log-in plus a CTA. Colour and type from
tokens.css (marketing theme). */
.dp-site-header {
padding: var(--dp-space-4) var(--dp-space-6);
}
.dp-site-nav {
display: flex;
align-items: center;
gap: var(--dp-space-6);
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-3) var(--dp-space-5);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
box-shadow: var(--dp-shadow-sm);
}
.dp-site-logo {
display: inline-flex;
color: var(--dp-navy);
flex: none;
}
.dp-site-logo svg { height: 24px; width: auto; display: block; }
.dp-site-menu {
display: flex;
align-items: center;
gap: var(--dp-space-5);
margin: 0 auto;
padding: 0;
list-style: none;
}
.dp-site-menu > li > a,
.dp-site-menu > li > button {
display: inline-flex;
align-items: center;
gap: 4px;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
text-decoration: none;
background: transparent;
border: 0;
cursor: pointer;
}
.dp-site-menu > li > a:hover,
.dp-site-menu > li > button:hover { color: var(--dp-link); }
.dp-site-menu svg { width: 1rem; height: 1rem; }
.dp-site-actions {
display: flex;
align-items: center;
gap: var(--dp-space-4);
flex: none;
}
.dp-site-login {
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
text-decoration: none;
}
.dp-site-login:hover { color: var(--dp-link); }
@media (max-width: 860px) {
.dp-site-menu { display: none; }
}
A call-to-action band with an eyebrow, two-tone heading, a checklist, an avatar group and a gold CTA button.
Book a free demo
npx shadcn@latest add https://ds.dataprovider.dev/r/cta-band.json
Registry JSON
<!-- CTA band
A call-to-action band. Two-tone heading (bold + light), a checklist, an
avatar group and the gold CTA button. Marketing theme. -->
<section class="dp-cta-band">
<div class="dp-cta-lead">
<p class="dp-cta-eyebrow">Book a free demo</p>
<h2 class="dp-cta-heading">And move from guesswork <span class="light">to data-driven decisions</span></h2>
</div>
<ul class="dp-cta-list">
<li class="dp-cta-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg>
A personalised demo, not a sales pitch
</li>
<li class="dp-cta-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg>
Completely free, zero obligations
</li>
<li class="dp-cta-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg>
30 to 60 minutes based on your needs
</li>
</ul>
<div class="dp-cta-action">
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<a class="dp-btn" data-variant="cta" href="/contact/">
Get your data advantage
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg>
</a>
</div>
</section>
/* CTA band
A call-to-action band: eyebrow, two-tone heading, a checklist, an avatar
group and a CTA button. Colour and type from tokens.css (marketing theme). */
.dp-cta-band {
display: flex;
align-items: center;
gap: var(--dp-space-8);
flex-wrap: wrap;
padding: var(--dp-space-8) var(--dp-space-10);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
}
.dp-cta-lead {
flex: 1 1 18rem;
padding-right: var(--dp-space-8);
border-right: 1px solid var(--dp-border);
}
.dp-cta-eyebrow {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-cta-heading {
margin: 0;
font-size: var(--dp-text-3xl);
line-height: var(--dp-leading-tight);
color: var(--dp-navy);
font-weight: var(--dp-weight-bold);
}
.dp-cta-heading .light { font-weight: var(--dp-weight-light); }
.dp-cta-list {
flex: 1 1 16rem;
display: flex;
flex-direction: column;
gap: var(--dp-space-3);
margin: 0;
padding: 0;
list-style: none;
}
.dp-cta-item {
display: flex;
align-items: center;
gap: var(--dp-space-3);
color: var(--dp-text);
}
.dp-cta-item svg {
width: 1.15rem;
height: 1.15rem;
flex: none;
color: var(--dp-success);
}
.dp-cta-action {
display: flex;
align-items: center;
gap: var(--dp-space-5);
margin-left: auto;
}
Marketing hero: a two-tone heading, a subtitle and a tabbed product preview with a floating stat card.
Track companies and technologies across 99% of all registered domains worldwide; every TLD, every ccTLD, refreshed monthly.
npx shadcn@latest add https://ds.dataprovider.dev/r/hero.json
Registry JSON
<!-- Hero
Marketing hero: two-tone heading, subtitle and a tabbed product preview.
The preview stage renders an interactive map at runtime; here it shows a
heatmap-style backdrop with a floating stat card. Marketing theme. -->
<section class="dp-hero">
<h1 class="dp-hero-title"><span class="light">The complete web,</span><br>structured in one place</h1>
<p class="dp-hero-sub">Track companies and technologies across 99% of all registered domains worldwide; every TLD, every ccTLD, refreshed monthly.</p>
<div class="dp-hero-preview">
<div class="dp-hero-tabs" role="tablist">
<button class="dp-hero-tab" type="button">Discover</button>
<button class="dp-hero-tab" type="button" data-active>Map</button>
<button class="dp-hero-tab" type="button">Analyze</button>
<button class="dp-hero-tab" type="button">Automate</button>
</div>
<div class="dp-hero-stage">
<div class="dp-hero-card">
<div class="dp-hero-card-label">Online stores in California</div>
<div class="dp-hero-card-row">
<span class="dp-hero-card-val">13.217</span>
<span class="dp-hero-card-pct">12.0%</span>
</div>
</div>
</div>
</div>
</section>
/* Hero
The marketing hero: a two-tone heading, a subtitle and a tabbed product
preview. Colour and type from tokens.css (marketing theme). */
.dp-hero {
max-width: 64rem;
margin: 0 auto;
padding: var(--dp-space-16) var(--dp-space-6) var(--dp-space-12);
text-align: center;
}
.dp-hero-title {
margin: 0 0 var(--dp-space-5);
font-size: var(--dp-text-5xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-hero-title .light { font-weight: var(--dp-weight-light); }
.dp-hero-sub {
max-width: 46ch;
margin: 0 auto var(--dp-space-10);
font-size: var(--dp-text-xl);
line-height: var(--dp-leading-snug);
color: var(--dp-blue-600);
}
.dp-hero-preview {
max-width: 60rem;
margin: 0 auto;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
background: var(--dp-surface);
overflow: hidden;
box-shadow: var(--dp-shadow-lg);
}
.dp-hero-tabs {
display: flex;
border-bottom: 1px solid var(--dp-border);
}
.dp-hero-tab {
flex: 1;
padding: var(--dp-space-4);
appearance: none;
background: transparent;
border: 0;
border-bottom: 2px solid transparent;
margin-bottom: -1px;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-base);
font-weight: var(--dp-weight-bold);
color: var(--dp-text-muted);
cursor: pointer;
}
.dp-hero-tab:hover { color: var(--dp-navy); }
.dp-hero-tab[data-active] { color: var(--dp-navy); border-bottom-color: var(--dp-blue-700); }
.dp-hero-stage {
position: relative;
height: 24rem;
background: var(--dp-blue-200);
overflow: hidden;
}
/* Heatmap-style backdrop suggesting the map preview */
.dp-hero-stage::before {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(circle at 24% 46%, rgba(239, 68, 68, 0.7) 0, rgba(239, 68, 68, 0) 12%),
radial-gradient(circle at 30% 40%, rgba(250, 204, 21, 0.55) 0, rgba(250, 204, 21, 0) 8%),
radial-gradient(circle at 55% 42%, rgba(239, 68, 68, 0.75) 0, rgba(239, 68, 68, 0) 15%),
radial-gradient(circle at 72% 46%, rgba(45, 75, 255, 0.45) 0, rgba(45, 75, 255, 0) 10%),
radial-gradient(circle at 48% 64%, rgba(239, 68, 68, 0.6) 0, rgba(239, 68, 68, 0) 9%);
filter: blur(3px);
}
.dp-hero-card {
position: absolute;
right: var(--dp-space-6);
bottom: var(--dp-space-6);
min-width: 12rem;
padding: var(--dp-space-4) var(--dp-space-5);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
box-shadow: var(--dp-shadow-md);
text-align: left;
}
.dp-hero-card-label { font-size: var(--dp-text-sm); font-weight: var(--dp-weight-bold); color: var(--dp-navy); margin-bottom: var(--dp-space-2); }
.dp-hero-card-row { display: flex; align-items: baseline; gap: var(--dp-space-3); }
.dp-hero-card-val { font-size: var(--dp-text-2xl); font-weight: var(--dp-weight-extrabold); color: var(--dp-navy); font-variant-numeric: tabular-nums; }
.dp-hero-card-pct { font-size: var(--dp-text-base); font-weight: var(--dp-weight-bold); color: var(--dp-blue-700); }
A marketing section: a centred heading and a grid of cards with an icon, title, description and read-more link.
Put structured web data to work across your organisation.
Keep a live inventory of every domain, subdomain and technology your organisation runs.
Read moreDetect look-alike domains and infringements before they reach your customers.
Read moreEnrich company records with technographics, contact data and firmographics.
Read morenpx shadcn@latest add https://ds.dataprovider.dev/r/feature-cards.json
Registry JSON
<!-- Feature cards
A marketing section: centred heading and a grid of cards (icon, title,
description, read-more). Marketing theme. -->
<section class="dp-fsection">
<div class="dp-fsection-head">
<h2 class="dp-fsection-title">One dataset, many use cases</h2>
<p class="dp-fsection-sub">Put structured web data to work across your organisation.</p>
</div>
<div class="dp-fc-grid">
<article class="dp-fc">
<span class="dp-fc-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 7h-9"></path><path d="M14 17H5"></path><circle cx="17" cy="17" r="3"></circle><circle cx="7" cy="7" r="3"></circle></svg>
</span>
<h3 class="dp-fc-title">Asset management</h3>
<p class="dp-fc-desc">Keep a live inventory of every domain, subdomain and technology your organisation runs.</p>
<a class="dp-btn" data-variant="outline" href="/cases/assets/">Read more</a>
</article>
<article class="dp-fc">
<span class="dp-fc-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"></path></svg>
</span>
<h3 class="dp-fc-title">Online brand protection</h3>
<p class="dp-fc-desc">Detect look-alike domains and infringements before they reach your customers.</p>
<a class="dp-btn" data-variant="outline" href="/cases/brand-protection/">Read more</a>
</article>
<article class="dp-fc">
<span class="dp-fc-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="4" height="7" x="7" y="10"></rect><rect width="4" height="12" x="15" y="5"></rect></svg>
</span>
<h3 class="dp-fc-title">Business information</h3>
<p class="dp-fc-desc">Enrich company records with technographics, contact data and firmographics.</p>
<a class="dp-btn" data-variant="outline" href="/cases/business-information/">Read more</a>
</article>
</div>
</section>
/* Feature cards
A marketing section: a centred heading and a grid of cards with an icon,
title, description and a read-more link. Colour and type from tokens.css
(marketing theme). */
.dp-fsection {
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
.dp-fsection-head {
max-width: 44rem;
margin: 0 auto var(--dp-space-8);
text-align: center;
}
.dp-fsection-title {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-3xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-fsection-sub {
margin: 0;
font-size: var(--dp-text-lg);
color: var(--dp-text-muted);
}
.dp-fc-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: var(--dp-space-6);
}
.dp-fc {
display: flex;
flex-direction: column;
padding: var(--dp-space-6);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
}
.dp-fc-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 3rem;
height: 3rem;
margin-bottom: var(--dp-space-5);
border-radius: var(--dp-radius-lg);
background: var(--dp-blue-200);
color: var(--dp-blue-700);
}
.dp-fc-icon svg { width: 1.5rem; height: 1.5rem; }
.dp-fc-title {
margin: 0 0 var(--dp-space-2);
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-fc-desc {
flex: 1;
margin: 0 0 var(--dp-space-5);
font-size: var(--dp-text-base);
color: var(--dp-text-muted);
}
.dp-fc-more { align-self: flex-start; }
A row of large headline numbers with labels.
npx shadcn@latest add https://ds.dataprovider.dev/r/stats-band.json
Registry JSON
<!-- Stats band
A row of headline numbers with labels. Marketing theme. -->
<section class="dp-stats-band">
<div class="dp-stat-big">
<div class="dp-stat-big-val">400M+</div>
<div class="dp-stat-big-label">Domains tracked</div>
</div>
<div class="dp-stat-big">
<div class="dp-stat-big-val">99%</div>
<div class="dp-stat-big-label">Of registered domains covered</div>
</div>
<div class="dp-stat-big">
<div class="dp-stat-big-val">Monthly</div>
<div class="dp-stat-big-label">Full dataset refresh</div>
</div>
<div class="dp-stat-big">
<div class="dp-stat-big-val">700+</div>
<div class="dp-stat-big-label">Data points per domain</div>
</div>
</section>
/* Stats band
A row of large headline numbers with labels. Colour and type from tokens.css
(marketing theme). */
.dp-stats-band {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: var(--dp-space-8);
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
text-align: center;
}
.dp-stat-big-val {
font-size: var(--dp-text-4xl);
font-weight: var(--dp-weight-extrabold);
line-height: 1;
color: var(--dp-navy);
font-variant-numeric: tabular-nums;
}
.dp-stat-big-label {
margin-top: var(--dp-space-2);
font-size: var(--dp-text-base);
color: var(--dp-text-muted);
}
A trusted-by strip: a label above a row of logos.
Trusted by the most data-driven enterprises
npx shadcn@latest add https://ds.dataprovider.dev/r/logo-cloud.json
Registry JSON
<!-- Logo cloud
A "trusted by" strip. Replace the placeholder wordmarks with real logo
assets (inline SVG or img). Marketing theme. -->
<section class="dp-logos">
<p class="dp-logos-label">Trusted by the most data-driven enterprises</p>
<div class="dp-logos-row">
<span class="dp-logo-item">Northwind</span>
<span class="dp-logo-item">Meridian</span>
<span class="dp-logo-item">Kolibri</span>
<span class="dp-logo-item">Vantage</span>
<span class="dp-logo-item">Everest</span>
<span class="dp-logo-item">Lumen</span>
</div>
</section>
/* Logo cloud
A "trusted by" strip: a label above a row of logos. Placeholder wordmarks
here; swap in real logo assets. Colour and type from tokens.css. */
.dp-logos {
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-10) var(--dp-space-6);
text-align: center;
}
.dp-logos-label {
margin-bottom: var(--dp-space-6);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-text-muted);
}
.dp-logos-row {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: var(--dp-space-10);
}
.dp-logo-item {
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-extrabold);
letter-spacing: -0.01em;
color: var(--dp-neutral-600);
}
A two-column section with text beside a media panel. Add data-reverse to swap sides.
Technology detection
Detect the platforms, payment providers, analytics and hosting used across 400M domains, and track how adoption shifts over time.
npx shadcn@latest add https://ds.dataprovider.dev/r/split-section.json
Registry JSON
<!-- Split section
Text beside a media panel. Add data-reverse on .dp-split to swap sides.
The media panel is a placeholder; drop in a screenshot or illustration.
Marketing theme. -->
<section class="dp-split">
<div class="dp-split-body">
<p class="dp-split-eyebrow">Technology detection</p>
<h2 class="dp-split-title">Know the full stack behind every website</h2>
<p class="dp-split-text">Detect the platforms, payment providers, analytics and hosting used across 400M domains, and track how adoption shifts over time.</p>
<ul class="dp-split-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 9,000+ technologies detected</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Historical adoption trends</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Refreshed every month</li>
</ul>
<a class="dp-btn" data-variant="primary" href="/our-data/technology/">Explore technology data</a>
</div>
<div class="dp-split-media">
<div class="dp-split-media-card"><b>Shopify</b> detected on 4.1M shops · <b>+2.1%</b> this month</div>
</div>
</section>
/* Split section
A two-column section: text on one side, a media panel on the other. Add
data-reverse to swap sides. Colour and type from tokens.css (marketing). */
.dp-split {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--dp-space-10);
align-items: center;
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
@media (max-width: 760px) { .dp-split { grid-template-columns: 1fr; } }
.dp-split[data-reverse] .dp-split-body { order: 2; }
.dp-split-eyebrow {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-split-title {
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-3xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-split-text {
margin: 0 0 var(--dp-space-6);
font-size: var(--dp-text-lg);
color: var(--dp-text-muted);
}
.dp-split-list {
margin: 0 0 var(--dp-space-6);
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: var(--dp-space-3);
}
.dp-split-list li {
display: flex;
align-items: center;
gap: var(--dp-space-3);
color: var(--dp-text);
}
.dp-split-list svg { width: 1.15rem; height: 1.15rem; flex: none; color: var(--dp-success); }
.dp-split-media {
position: relative;
height: 22rem;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
background: var(--dp-blue-100);
overflow: hidden;
}
.dp-split-media::before {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(circle at 30% 30%, rgba(45, 75, 255, 0.14) 0, rgba(45, 75, 255, 0) 45%),
radial-gradient(circle at 75% 70%, rgba(255, 199, 1, 0.16) 0, rgba(255, 199, 1, 0) 45%);
}
.dp-split-media-card {
position: absolute;
inset: auto var(--dp-space-6) var(--dp-space-6) var(--dp-space-6);
padding: var(--dp-space-4) var(--dp-space-5);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
box-shadow: var(--dp-shadow-md);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-split-media-card b { color: var(--dp-navy); }
A frequently-asked-questions section built on the accordion component.
npx shadcn@latest add https://ds.dataprovider.dev/r/faq.json
Registry JSON
<!-- FAQ
A frequently-asked-questions section using the accordion component. Native
details/summary, so it works without JavaScript. Marketing theme. -->
<section class="dp-faq">
<h2 class="dp-faq-title">Frequently asked questions</h2>
<div class="dp-accordion">
<details open>
<summary>
How often is the data refreshed?
<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</summary>
<div class="dp-accordion-content">The full dataset is rebuilt on the first of every month, covering every registered domain worldwide.</div>
</details>
<details>
<summary>
Which formats can I export?
<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</summary>
<div class="dp-accordion-content">Export to CSV and JSON on every plan, or connect directly through the API and data warehouse integrations.</div>
</details>
<details>
<summary>
Can I access the data through AI tools?
<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</summary>
<div class="dp-accordion-content">Yes. The MCP server lets Claude, Cursor and ChatGPT query the dataset directly using everyday language.</div>
</details>
</div>
</section>
/* FAQ
A frequently-asked-questions section built on the accordion component.
Colour and type from tokens.css (marketing theme). */
.dp-faq {
max-width: 48rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
.dp-faq-title {
margin: 0 0 var(--dp-space-8);
text-align: center;
font-size: var(--dp-text-3xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
A leadership-team grid with member photos, roles, names and LinkedIn links.
Team
npx shadcn@latest add https://ds.dataprovider.dev/r/team.json
Registry JSON
<!-- Team
A leadership-team grid: an eyebrow, a heading and a grid of member cards
with a photo, a role, a name and a LinkedIn link. Swap the placeholder
photos for real portraits. Marketing theme. -->
<section class="dp-team">
<p class="dp-team-eyebrow">Team</p>
<h2 class="dp-team-title">Meet our leadership team</h2>
<div class="dp-team-grid">
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="MN" aria-hidden="true"></div>
<p class="dp-team-role">Co-founder</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Marc Noël</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Marc Noël on LinkedIn">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg>
</a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="CB" aria-hidden="true"></div>
<p class="dp-team-role">Co-founder</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Christian Branbergen</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Christian Branbergen on LinkedIn">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg>
</a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="GB" aria-hidden="true"></div>
<p class="dp-team-role">Co-founder</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Gijs Barends</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Gijs Barends on LinkedIn">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg>
</a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="MP" aria-hidden="true"></div>
<p class="dp-team-role">Privacy officer</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Martin Plak</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Martin Plak on LinkedIn">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg>
</a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="RM" aria-hidden="true"></div>
<p class="dp-team-role">Legal counsel</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Rutger Middendorf</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Rutger Middendorf on LinkedIn">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg>
</a>
</div>
</article>
</div>
</section>
/* Team
A leadership-team grid with a heading and member cards. The photo is a
placeholder that shows the person's initials; replace with a real portrait.
Colour and type from tokens.css (marketing theme). */
.dp-team {
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
.dp-team-eyebrow {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-team-title {
margin: 0 0 var(--dp-space-8);
font-size: var(--dp-text-3xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-team-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--dp-space-8) var(--dp-space-6);
}
.dp-team-card {
display: flex;
flex-direction: column;
}
.dp-team-photo {
position: relative;
aspect-ratio: 1 / 1;
margin-bottom: var(--dp-space-4);
border-radius: var(--dp-radius-lg);
background:
linear-gradient(135deg, var(--dp-blue-200), var(--dp-blue-100));
overflow: hidden;
}
.dp-team-photo::after {
content: attr(data-initials);
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: var(--dp-text-3xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-blue-700);
opacity: 0.55;
}
.dp-team-role {
margin: 0 0 var(--dp-space-1);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-text-muted);
}
.dp-team-name-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dp-space-3);
}
.dp-team-name {
margin: 0;
font-size: var(--dp-text-lg);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-team-social {
flex: none;
display: inline-flex;
color: var(--dp-navy);
transition: color 0.15s ease;
}
.dp-team-social:hover { color: var(--dp-link); }
.dp-team-social svg { width: 1.15rem; height: 1.15rem; }
A vertical milestone track with alternating entries and a centre line.
2012
After three years of development, Dataprovider.com launches with one mission: make the internet searchable, measurable and explainable.
2017
The platform expands to crawl the entire web, covering hundreds of millions of domains every month.
2023
We launch the largest continuously updated SSL dataset and open direct access through Snowflake and Google Cloud.
2024
In partnership with Quad9 we introduce the Connection Index, a signal measuring real user engagement across the web.
npx shadcn@latest add https://ds.dataprovider.dev/r/timeline.json
Registry JSON
<!-- Timeline
A vertical list of milestones with a year, a title and a description.
Entries alternate sides of a centre line on wide screens and stack into a
single column on narrow screens. Marketing theme. -->
<section class="dp-timeline">
<ol class="dp-timeline-track">
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2012</p>
<h3 class="dp-timeline-heading">Dataprovider.com starts</h3>
<p class="dp-timeline-text">After three years of development, Dataprovider.com launches with one mission: make the internet searchable, measurable and explainable.</p>
</div>
</li>
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2017</p>
<h3 class="dp-timeline-heading">Global monthly coverage</h3>
<p class="dp-timeline-text">The platform expands to crawl the entire web, covering hundreds of millions of domains every month.</p>
</div>
</li>
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2023</p>
<h3 class="dp-timeline-heading">SSL Catalog and warehouse access</h3>
<p class="dp-timeline-text">We launch the largest continuously updated SSL dataset and open direct access through Snowflake and Google Cloud.</p>
</div>
</li>
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2024</p>
<h3 class="dp-timeline-heading">Quad9 Connection Index</h3>
<p class="dp-timeline-text">In partnership with Quad9 we introduce the Connection Index, a signal measuring real user engagement across the web.</p>
</div>
</li>
</ol>
</section>
/* Timeline
A vertical milestone track. A centre line runs the full height, with a dot
marking each entry; cards alternate left and right on wide screens and stack
into one column on narrow screens. Colour and type from tokens.css. */
.dp-timeline {
max-width: 60rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
.dp-timeline-track {
position: relative;
margin: 0;
padding: 0;
list-style: none;
}
/* the centre line */
.dp-timeline-track::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 50%;
width: 2px;
transform: translateX(-1px);
background: var(--dp-border);
}
.dp-timeline-item {
position: relative;
width: 50%;
padding: 0 var(--dp-space-8) var(--dp-space-8);
box-sizing: border-box;
}
.dp-timeline-item:last-child { padding-bottom: 0; }
/* odd items on the left, even items on the right */
.dp-timeline-item:nth-child(odd) {
left: 0;
text-align: right;
}
.dp-timeline-item:nth-child(even) {
left: 50%;
text-align: left;
}
/* the dot sits on the centre line */
.dp-timeline-marker {
position: absolute;
top: 0.35rem;
width: 0.85rem;
height: 0.85rem;
border-radius: var(--dp-radius-full);
background: var(--dp-blue-700);
border: 3px solid var(--dp-bg);
}
.dp-timeline-item:nth-child(odd) .dp-timeline-marker {
right: calc(var(--dp-space-8) * -1 - 0.425rem);
transform: translateX(1px);
}
.dp-timeline-item:nth-child(even) .dp-timeline-marker {
left: calc(var(--dp-space-8) * -1 - 0.425rem);
transform: translateX(-1px);
}
.dp-timeline-year {
margin: 0 0 var(--dp-space-1);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-timeline-heading {
margin: 0 0 var(--dp-space-2);
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-timeline-text {
margin: 0;
font-size: var(--dp-text-base);
color: var(--dp-text-muted);
}
@media (max-width: 720px) {
.dp-timeline-track::before { left: 0.425rem; }
.dp-timeline-item,
.dp-timeline-item:nth-child(odd),
.dp-timeline-item:nth-child(even) {
width: 100%;
left: 0;
text-align: left;
padding: 0 0 var(--dp-space-8) var(--dp-space-8);
}
.dp-timeline-item:nth-child(odd) .dp-timeline-marker,
.dp-timeline-item:nth-child(even) .dp-timeline-marker {
left: 0;
right: auto;
transform: none;
}
}
A two-column editorial section with a large statement and supporting copy.
It started in 2009, when Christian Branbergen, Gijs Barends and Marc Noël set out to do what seemed almost impossible: summarise and structure the entire web.
What began as a small team of data enthusiasts has grown into a trusted partner for organisations like PayPal, GoDaddy and MarkMonitor. We collect and structure all our data ourselves, running a powerful hosting cluster in the Netherlands.
npx shadcn@latest add https://ds.dataprovider.dev/r/statement.json
Registry JSON
<!-- Statement
A two-column editorial section: a large statement on the left and
supporting copy on the right. Use it for mission, vision or context.
Marketing theme. -->
<section class="dp-statement">
<h2 class="dp-statement-lead">The web is the world's greatest source of information chaos.</h2>
<div class="dp-statement-body">
<p>It started in 2009, when Christian Branbergen, Gijs Barends and Marc Noël set out to do what seemed almost impossible: summarise and structure the entire web.</p>
<p>What began as a small team of data enthusiasts has grown into a trusted partner for organisations like PayPal, GoDaddy and MarkMonitor. We collect and structure all our data ourselves, running a powerful hosting cluster in the Netherlands.</p>
</div>
</section>
/* Statement
A two-column editorial section. The left column carries a large statement;
the right column carries supporting paragraphs. Colour and type from
tokens.css (marketing theme). */
.dp-statement {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--dp-space-10);
align-items: start;
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
@media (max-width: 760px) { .dp-statement { grid-template-columns: 1fr; gap: var(--dp-space-6); } }
.dp-statement-lead {
margin: 0;
font-size: var(--dp-text-4xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-statement-body {
display: flex;
flex-direction: column;
gap: var(--dp-space-4);
}
.dp-statement-body p {
margin: 0;
font-size: var(--dp-text-base);
line-height: var(--dp-leading-normal);
color: var(--dp-text-muted);
}
A demo-request section with an underline-style form and an expectations rail.
Contact
npx shadcn@latest add https://ds.dataprovider.dev/r/contact-form.json
Registry JSON
<!-- Contact form
A demo-request section: a centred two-tone heading, a form with
underline-style fields on the left, and an expectations rail with a
checklist, an avatar group and office locations on the right. The form
posts nowhere by default; wire up the action attribute. Marketing theme. -->
<section class="dp-cform">
<div class="dp-cform-head">
<p class="dp-cform-eyebrow">Contact</p>
<h2 class="dp-cform-title">Your competitive edge awaits <span class="light">Book a personalised demo</span></h2>
</div>
<div class="dp-cform-panel">
<form class="dp-cform-form" action="#" method="post">
<div class="dp-cform-row">
<div class="dp-field">
<label class="dp-field-label" for="cf-first">First name</label>
<input class="dp-field-input" id="cf-first" name="first_name" type="text" autocomplete="given-name">
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-last">Last name</label>
<input class="dp-field-input" id="cf-last" name="last_name" type="text" autocomplete="family-name">
</div>
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-email">Work email</label>
<input class="dp-field-input" id="cf-email" name="email" type="email" autocomplete="email">
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-company">Company or organisation name</label>
<input class="dp-field-input" id="cf-company" name="company" type="text" autocomplete="organization">
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-why">Why would you like to try Dataprovider.com?</label>
<textarea class="dp-field-input" id="cf-why" name="reason" rows="3"></textarea>
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-source">How did you hear about us?</label>
<select class="dp-field-input" id="cf-source" name="source">
<option value="">Please select</option>
<option value="search">Search engine</option>
<option value="social">Social media</option>
<option value="referral">Referral</option>
<option value="event">Event or conference</option>
<option value="other">Other</option>
</select>
</div>
<label class="dp-cform-check">
<input type="checkbox" name="newsletter" value="yes">
<span>Subscribe to our newsletter.</span>
</label>
<button class="dp-btn" data-variant="cta" type="submit">Request a free demo</button>
</form>
<aside class="dp-cform-aside">
<h3 class="dp-cform-aside-title">What can you expect?</h3>
<ul class="dp-cform-list">
<li>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg>
A personalised demo, not a sales pitch
</li>
<li>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg>
Completely free, zero obligations
</li>
<li>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg>
30 to 60 minutes based on your needs
</li>
</ul>
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<div class="dp-cform-locations">
<p class="dp-cform-loc-label">Locations</p>
<div class="dp-cform-loc-grid">
<address class="dp-cform-loc">
<span class="dp-cform-loc-name">Operations</span>
Van Elmptstraat 10<br>
9723 ZL Groningen<br>
The Netherlands
</address>
<address class="dp-cform-loc">
<span class="dp-cform-loc-name">International</span>
Weesperplein 4b<br>
1018 XA Amsterdam<br>
The Netherlands
</address>
</div>
</div>
</aside>
</div>
</section>
/* Contact form
A demo-request section with a centred two-tone heading and a two-column
panel: an underline-style form on the left and an expectations rail on the
right. Colour and type from tokens.css (marketing theme). */
.dp-cform {
max-width: 66rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
.dp-cform-head {
margin: 0 auto var(--dp-space-10);
max-width: 40rem;
text-align: center;
}
.dp-cform-eyebrow {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-cform-title {
margin: 0;
font-size: var(--dp-text-4xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-cform-title .light {
display: block;
font-weight: var(--dp-weight-light);
}
.dp-cform-panel {
display: grid;
grid-template-columns: 1.4fr 1fr;
gap: var(--dp-space-10);
padding: var(--dp-space-8);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
box-shadow: var(--dp-shadow-md);
}
@media (max-width: 800px) { .dp-cform-panel { grid-template-columns: 1fr; gap: var(--dp-space-8); } }
/* form */
.dp-cform-form {
display: flex;
flex-direction: column;
gap: var(--dp-space-5);
}
.dp-cform-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--dp-space-5);
}
@media (max-width: 480px) { .dp-cform-row { grid-template-columns: 1fr; } }
/* The underline fields come from the field component. */
.dp-cform-check {
display: flex;
align-items: center;
gap: var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
cursor: pointer;
}
.dp-cform-check input {
width: 1.1rem;
height: 1.1rem;
accent-color: var(--dp-link);
}
.dp-cform-form .dp-btn { align-self: flex-start; }
/* aside */
.dp-cform-aside {
display: flex;
flex-direction: column;
gap: var(--dp-space-5);
}
.dp-cform-aside-title {
margin: 0;
font-size: var(--dp-text-lg);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-cform-list {
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: var(--dp-space-3);
}
.dp-cform-list li {
display: flex;
align-items: center;
gap: var(--dp-space-3);
font-size: var(--dp-text-sm);
color: var(--dp-text);
}
.dp-cform-list svg { width: 1rem; height: 1rem; flex: none; color: var(--dp-success); }
.dp-cform-locations {
margin-top: var(--dp-space-2);
padding-top: var(--dp-space-5);
border-top: 1px solid var(--dp-border);
}
.dp-cform-loc-label {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-text-muted);
}
.dp-cform-loc-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--dp-space-4);
}
.dp-cform-loc {
font-style: normal;
font-size: var(--dp-text-sm);
line-height: var(--dp-leading-normal);
color: var(--dp-text-muted);
}
.dp-cform-loc-name {
display: block;
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
A two-column subscribe section with benefit copy and a name and email capture form.
npx shadcn@latest add https://ds.dataprovider.dev/r/newsletter.json
Registry JSON
<!-- Newsletter
A subscribe section: an eyebrow and two-tone heading with a short benefit
list on the left, and a name and email capture form on the right. Uses the
underline field component. The form posts nowhere by default; wire up the
action attribute. Marketing theme. -->
<section class="dp-newsletter">
<div class="dp-newsletter-body">
<p class="dp-newsletter-eyebrow">Newsletter</p>
<h2 class="dp-newsletter-title">Subscribe to get monthly <span class="light">web data insights</span></h2>
<p class="dp-newsletter-expect">What can you expect?</p>
<ul class="dp-newsletter-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> The latest tech news</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Exclusive insights from data experts</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> One email a month, no spam</li>
</ul>
</div>
<form class="dp-newsletter-form" action="#" method="post">
<div class="dp-field">
<label class="dp-field-label" for="nl-first">First name</label>
<input class="dp-field-input" id="nl-first" name="first_name" type="text" autocomplete="given-name">
</div>
<div class="dp-field">
<label class="dp-field-label" for="nl-last">Last name</label>
<input class="dp-field-input" id="nl-last" name="last_name" type="text" autocomplete="family-name">
</div>
<div class="dp-field">
<label class="dp-field-label" for="nl-email">Email</label>
<input class="dp-field-input" id="nl-email" name="email" type="email" autocomplete="email">
</div>
<button class="dp-btn" data-variant="cta" type="submit">Subscribe</button>
</form>
</section>
/* Newsletter
A two-column subscribe section: benefit copy on the left, a name and email
capture form on the right. Underline fields come from the field component.
Colour and type from tokens.css (marketing theme). */
.dp-newsletter {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--dp-space-10);
align-items: start;
max-width: 66rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
@media (max-width: 760px) { .dp-newsletter { grid-template-columns: 1fr; gap: var(--dp-space-8); } }
.dp-newsletter-eyebrow {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-newsletter-title {
margin: 0 0 var(--dp-space-6);
font-size: var(--dp-text-4xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-newsletter-title .light {
display: block;
font-weight: var(--dp-weight-light);
}
.dp-newsletter-expect {
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-lg);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-newsletter-list {
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: var(--dp-space-3);
}
.dp-newsletter-list li {
display: flex;
align-items: center;
gap: var(--dp-space-3);
font-size: var(--dp-text-base);
color: var(--dp-text);
}
.dp-newsletter-list svg { width: 1.1rem; height: 1.1rem; flex: none; color: var(--dp-success); }
.dp-newsletter-form {
display: flex;
flex-direction: column;
gap: var(--dp-space-5);
}
.dp-newsletter-form .dp-btn { align-self: flex-start; }
A responsive grid of horizontal article cards with a cover image, reading time, title, author and date.
npx shadcn@latest add https://ds.dataprovider.dev/r/blog-grid.json
Registry JSON
<!-- Blog grid
A grid of article cards. Each card is a horizontal layout: a cover image
with a reading-time chip on the left and the title, author and date on the
right. Swap the placeholder covers for real images. Marketing theme. -->
<section class="dp-blog-grid">
<a class="dp-blog-card" href="/blog/saas-to-ai-transition/">
<div class="dp-blog-card-media" data-tint="a" aria-hidden="true"><span class="dp-blog-card-time">6 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Reading the SaaS to AI transition through web data</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Mathijs Baas</span><span class="dp-blog-card-date">29 days ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/getting-started-mcp/">
<div class="dp-blog-card-media" data-tint="b" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Getting started with the Dataprovider MCP: let AI query 350 million domains for you</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Gijs Barends</span><span class="dp-blog-card-date">2 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/cloudflare-hosting/">
<div class="dp-blog-card-media" data-tint="c" aria-hidden="true"><span class="dp-blog-card-time">6 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Cloudflare hides the hosting company. We found it anyway.</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Christian Branbergen</span><span class="dp-blog-card-date">3 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/hidden-prompts-html/">
<div class="dp-blog-card-media" data-tint="d" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Hidden prompts in HTML: the invisible threat exploiting AI browsers</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Lucia Baldassini</span><span class="dp-blog-card-date">6 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/billion-records-ai-navigator/">
<div class="dp-blog-card-media" data-tint="e" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">How we talk to a billion records with our AI Navigator</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Tim Kreutz</span><span class="dp-blog-card-date">7 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/websites-per-capita/">
<div class="dp-blog-card-media" data-tint="a" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Websites per capita: how many websites does each EU country have per 1,000 inhabitants?</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Gijs Barends</span><span class="dp-blog-card-date">8 months ago</span></p>
</div>
</a>
</section>
/* Blog grid
A responsive grid of horizontal article cards: a cover image with a
reading-time chip beside the title, author and date. Colour and type from
tokens.css (marketing theme). */
.dp-blog-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
gap: var(--dp-space-6);
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6);
}
.dp-blog-card {
display: grid;
grid-template-columns: 40% 1fr;
overflow: hidden;
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
text-decoration: none;
transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
}
.dp-blog-card:hover {
border-color: var(--dp-border-strong);
box-shadow: var(--dp-shadow-md);
transform: translateY(-2px);
}
@media (max-width: 520px) { .dp-blog-card { grid-template-columns: 1fr; } }
.dp-blog-card-media {
position: relative;
min-height: 10rem;
background: linear-gradient(135deg, var(--dp-blue-200), var(--dp-blue-100));
}
.dp-blog-card-media[data-tint="b"] { background: linear-gradient(135deg, var(--dp-navy), var(--dp-blue-700)); }
.dp-blog-card-media[data-tint="c"] { background: linear-gradient(135deg, var(--dp-navy), #0b1236); }
.dp-blog-card-media[data-tint="d"] { background: linear-gradient(135deg, #0b1236, var(--dp-blue-700)); }
.dp-blog-card-media[data-tint="e"] { background: linear-gradient(135deg, var(--dp-gold-300), var(--dp-blue-200)); }
@media (max-width: 520px) { .dp-blog-card-media { min-height: 9rem; } }
.dp-blog-card-time {
position: absolute;
left: var(--dp-space-3);
bottom: var(--dp-space-3);
display: inline-flex;
align-items: center;
padding: var(--dp-space-1) var(--dp-space-2);
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
color: var(--dp-text);
background: var(--dp-surface);
border-radius: var(--dp-radius-full);
box-shadow: var(--dp-shadow-sm);
}
.dp-blog-card-body {
display: flex;
flex-direction: column;
justify-content: space-between;
gap: var(--dp-space-6);
padding: var(--dp-space-5);
}
.dp-blog-card-title {
margin: 0;
font-size: var(--dp-text-lg);
line-height: var(--dp-leading-snug);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-blog-card-meta {
display: flex;
flex-direction: column;
gap: var(--dp-space-1);
margin: 0;
}
.dp-blog-card-author {
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-blog-card-date {
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
A centred sign-in card with an email field, a primary action, a separator and social sign-in buttons.
npx shadcn@latest add https://ds.dataprovider.dev/r/login.json
Registry JSON
<!-- Login block
A sign-in screen composed from input, button and separator, under the
console theme. Replace the wordmark with the real logo asset in use. -->
<div class="dp-block-login">
<div class="dp-login-card">
<div class="dp-login-logo">Dataprovider.com</div>
<div class="dp-field">
<label class="dp-label" for="login-email">Email address</label>
<input class="dp-input" id="login-email" type="email" placeholder="you@company.com" />
</div>
<button class="dp-btn" type="button" data-variant="primary">Continue</button>
<div class="dp-separator-labelled dp-login-sep">OR</div>
<div class="dp-login-social">
<button class="dp-btn" type="button" data-variant="outline">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path fill="#4285F4" d="M21.6 12.2c0-.6-.1-1.2-.2-1.8H12v3.4h5.4a4.6 4.6 0 0 1-2 3v2.5h3.2c1.9-1.7 3-4.3 3-7.1"/>
<path fill="#34A853" d="M12 22c2.7 0 5-1 6.6-2.7l-3.2-2.5c-.9.6-2 1-3.4 1-2.6 0-4.8-1.7-5.6-4.1H3.1v2.6A10 10 0 0 0 12 22"/>
<path fill="#FBBC05" d="M6.4 13.7a6 6 0 0 1 0-3.8V7.3H3.1a10 10 0 0 0 0 9z"/>
<path fill="#EA4335" d="M12 5.9c1.5 0 2.8.5 3.8 1.5l2.8-2.8A10 10 0 0 0 3.1 7.3l3.3 2.6C7.2 7.5 9.4 5.9 12 5.9"/>
</svg>
Continue with Google
</button>
<button class="dp-btn" type="button" data-variant="outline">
<svg viewBox="0 0 24 24" aria-hidden="true">
<rect width="24" height="24" rx="3" fill="#0a66c2"/>
<path fill="#fff" d="M7 9.5H4.6V19H7zM5.8 8.2A1.4 1.4 0 1 0 5.8 5.4a1.4 1.4 0 0 0 0 2.8M19.4 19H17v-4.6c0-1.1-.4-1.9-1.4-1.9-.8 0-1.2.5-1.4 1-.1.2-.1.5-.1.8V19h-2.4s.03-8 0-8.8h2.4v1.2c.3-.5.9-1.2 2.2-1.2 1.6 0 2.8 1 2.8 3.3z"/>
</svg>
Continue with LinkedIn
</button>
<button class="dp-btn" type="button" data-variant="outline">
<svg viewBox="0 0 24 24" aria-hidden="true">
<rect x="2" y="2" width="9" height="9" fill="#f25022"/>
<rect x="13" y="2" width="9" height="9" fill="#7fba00"/>
<rect x="2" y="13" width="9" height="9" fill="#00a4ef"/>
<rect x="13" y="13" width="9" height="9" fill="#ffb900"/>
</svg>
Continue with Microsoft Account
</button>
</div>
</div>
</div>
/* Login block
A centred sign-in card composed from the input, button and separator
components. Shown under the console theme. */
.dp-block-login {
display: flex;
align-items: center;
justify-content: center;
min-height: 100%;
padding: var(--dp-space-12) var(--dp-space-6);
background: var(--dp-bg);
}
.dp-login-card {
width: 100%;
max-width: 25rem;
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
box-shadow: var(--dp-shadow-lg);
padding: var(--dp-space-10) var(--dp-space-8);
}
.dp-login-logo {
margin: 0 0 var(--dp-space-8);
text-align: center;
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-extrabold);
letter-spacing: 0.02em;
text-transform: uppercase;
color: var(--dp-brand-purple, var(--dp-navy));
}
.dp-login-card .dp-field {
margin-bottom: var(--dp-space-4);
}
.dp-login-card > .dp-btn {
width: 100%;
}
.dp-login-sep {
margin: var(--dp-space-5) 0;
}
.dp-login-social {
display: flex;
flex-direction: column;
gap: var(--dp-space-3);
}
.dp-login-social .dp-btn {
width: 100%;
justify-content: flex-start;
gap: var(--dp-space-3);
font-weight: var(--dp-weight-semibold);
}
.dp-login-social .dp-btn svg {
width: 1.15rem;
height: 1.15rem;
}
The app home: sidebar, a welcome heading, feature cards and an AI prompt with suggestions.
Search through (y)our data
Choose relevant filters and build your dataset.
Personalised data, presented in interactive dashboards.
Get tailored insights from the websites of your clients.
Powerful does not have to mean complicated. Get expert web analysis through everyday language.
npx shadcn@latest add https://ds.dataprovider.dev/r/dashboard.json
Registry JSON
<!-- Dashboard block
The app home screen: sidebar plus welcome, feature cards and an AI prompt.
Composed from sidebar, card, input and badge under the console theme. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"></path><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"></path></svg>
Monitoring <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 9h6v6H9z"></path></svg>
Dashboards
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg>
Recipes
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Products
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
Search Engine
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M2 12h20"></path><path d="M12 2a15 15 0 0 1 0 20 15 15 0 0 1 0-20"></path></svg>
Reverse DNS
</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main">
<h1 class="dp-welcome">Welcome back, Christian Branbergen</h1>
<p class="dp-dash-label">Search through (y)our data</p>
<div class="dp-feature-grid">
<article class="dp-feature">
<span class="dp-feature-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
</span>
<h3 class="dp-feature-title">Search Engine</h3>
<p class="dp-feature-desc">Choose relevant filters and build your dataset.</p>
</article>
<article class="dp-feature">
<span class="dp-feature-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v4"></path><path d="M5 10a7 7 0 0 1 14 0v6H5z"></path><path d="M3 16h18"></path></svg>
</span>
<h3 class="dp-feature-title">Dashboards</h3>
<p class="dp-feature-desc">Personalised data, presented in interactive dashboards.</p>
</article>
<article class="dp-feature">
<span class="dp-feature-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg>
</span>
<h3 class="dp-feature-title">Know Your Business</h3>
<p class="dp-feature-desc">Get tailored insights from the websites of your clients.</p>
</article>
</div>
<section class="dp-ai-card">
<div class="dp-ai-head">
<span class="dp-ai-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v4"></path><path d="m5 7 2 2"></path><path d="M3 14h3"></path><path d="M9 21h6"></path><path d="M19 7l-2 2"></path><path d="M21 14h-3"></path><path d="M12 11v10"></path></svg>
</span>
<div>
<div class="dp-ai-title">Ask AI Navigator <span class="dp-nav-beta">Beta</span></div>
<p class="dp-ai-desc">Powerful does not have to mean complicated. Get expert web analysis through everyday language.</p>
</div>
</div>
<input class="dp-input" type="text" placeholder="Ask me anything..." />
<div class="dp-ai-suggestions">
<button class="dp-suggest" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg>
How many websites use Shopify as a shopping cart system in North America?
</button>
<button class="dp-suggest" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg>
How many websites use Stripe as a payment service provider in Europe?
</button>
<button class="dp-suggest" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg>
Can you make me a list with all hosting companies in Germany?
</button>
</div>
</section>
</main>
</div>
/* Dashboard block
The app home: sidebar plus a welcome, feature cards and an AI prompt.
Composed from sidebar, card, input and badge under the console theme. */
.dp-welcome {
margin: 0 0 var(--dp-space-8);
font-size: var(--dp-text-4xl);
font-weight: var(--dp-weight-extrabold);
color: var(--dp-navy);
line-height: var(--dp-leading-tight);
}
.dp-dash-label {
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-base);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--dp-space-5);
}
.dp-feature {
display: flex;
flex-direction: column;
padding: var(--dp-space-6);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
}
.dp-feature-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 3rem;
height: 3rem;
margin-bottom: var(--dp-space-5);
border-radius: var(--dp-radius-full);
background: var(--dp-surface-soft);
color: var(--dp-link);
}
.dp-feature-icon svg {
width: 1.5rem;
height: 1.5rem;
}
.dp-feature-title {
margin: 0 0 var(--dp-space-2);
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-feature-desc {
margin: 0;
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-ai-card {
margin-top: var(--dp-space-8);
padding: var(--dp-space-6);
background: var(--dp-surface);
border: 1px solid var(--dp-border-strong);
border-radius: var(--dp-radius-xl);
}
.dp-ai-head {
display: flex;
align-items: center;
gap: var(--dp-space-4);
margin-bottom: var(--dp-space-5);
}
.dp-ai-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 3rem;
height: 3rem;
flex: none;
border-radius: var(--dp-radius-full);
background: var(--dp-surface-soft);
color: var(--dp-link);
}
.dp-ai-title {
display: flex;
align-items: center;
gap: var(--dp-space-2);
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-ai-desc {
margin: 2px 0 0;
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-ai-suggestions {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--dp-space-3);
margin-top: var(--dp-space-4);
}
.dp-suggest {
display: flex;
align-items: flex-start;
gap: var(--dp-space-2);
padding: var(--dp-space-3) var(--dp-space-4);
background: var(--dp-surface-subtle);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-md);
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
text-align: left;
cursor: pointer;
}
.dp-suggest:hover {
border-color: var(--dp-border-strong);
}
.dp-suggest svg {
width: 1rem;
height: 1rem;
flex: none;
margin-top: 1px;
color: var(--dp-link);
}
A data screen: sidebar, a hero panel, a search and sort toolbar, a data table and pagination.
Access all your data from across our products. You can personalise your archive by creating folders and reorganising the structure to fit your needs.
Need to recover a deleted file? View Trash
| Name | Records | Date created | ||
|---|---|---|---|---|
| Dataprovider BV (7) | -- | -- | ||
| Exports (474) | -- | -- | ||
| Sent to me (66) | -- | -- | ||
| Migration insights (1) | -- | -- | ||
| Important data sets (1) | -- | May 7, 2025, 11:05 | ||
| KYC Markmonitor Dashboards (3) | -- | Apr 9, 2024, 17:17 | ||
| Upsell and new customer ideas (12) | -- | -- | ||
| Research (5) | -- | Sep 27, 2021, 12:22 | ||
| ZoomInfo enrichment Search Engine | 43.67M | Jun 11, 2026, 13:43 | ||
| Migration insights Hosting company is OVH Search Engine | 6.57M | Jun 4, 2026, 08:28 |
npx shadcn@latest add https://ds.dataprovider.dev/r/files.json
Registry JSON
<!-- Files block
A data screen: sidebar plus a hero panel, a toolbar and a data table.
Composed from sidebar, input, button, table and pagination under the
console theme. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 9h6v6H9z"></path></svg>
Dashboards
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg>
Recipes
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Products
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
Search Engine
</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main">
<div class="dp-files-hero">
<div class="dp-files-eyebrow">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</div>
<h1 class="dp-files-title">All your data in one place</h1>
<p class="dp-files-desc">Access all your data from across our products. You can personalise your archive by creating folders and reorganising the structure to fit your needs.</p>
<button class="dp-btn" type="button" data-variant="primary">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path><path d="M12 10v6"></path><path d="M9 13h6"></path></svg>
Create folder
</button>
<p class="dp-files-trash">Need to recover a deleted file? <a href="#">View Trash</a></p>
</div>
<div class="dp-files-toolbar-head">
<div class="dp-files-count">All files <span>(1486)</span></div>
<a class="dp-files-create" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path><path d="M12 10v6"></path><path d="M9 13h6"></path></svg>
Create folder
</a>
</div>
<div class="dp-files-toolbar">
<div class="dp-input-group">
<svg class="dp-input-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
<input class="dp-input" type="search" placeholder="Search files" />
</div>
<button class="dp-btn" type="button" data-variant="outline">
Sort: Date created
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</button>
</div>
<table class="dp-files-list">
<thead>
<tr>
<th style="width: 1%;"><input class="dp-checkbox" type="checkbox" aria-label="Select all" /></th>
<th class="dp-col-name">Name</th>
<th data-align="end">Records</th>
<th>
<span class="dp-sort">Date created
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m18 15-6-6-6 6"></path></svg>
</span>
</th>
<th style="width: 1%;"></th>
</tr>
</thead>
<tbody>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<span class="dp-file-chip">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z"></path><path d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2"></path><path d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2"></path><path d="M10 6h4M10 10h4M10 14h4M10 18h4"></path></svg>
</span>
<b>Dataprovider BV</b> <span class="dp-files-count">(7)</span>
</span>
</td>
<td data-align="end">--</td>
<td>--</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<span class="dp-file-chip">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M14 2v5h5"></path><path d="M12 18v-6"></path><path d="m9 15 3 3 3-3"></path></svg>
</span>
<b>Exports</b> <span class="dp-files-count">(474)</span>
</span>
</td>
<td data-align="end">--</td>
<td>--</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<span class="dp-file-chip">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16 3 4 4-4 4"></path><path d="M20 7H4"></path><path d="m8 21-4-4 4-4"></path><path d="M4 17h16"></path></svg>
</span>
<b>Sent to me</b> <span class="dp-files-count">(66)</span>
</span>
</td>
<td data-align="end">--</td>
<td>--</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<span class="dp-file-chip">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="18" cy="18" r="3"></circle><circle cx="6" cy="6" r="3"></circle><path d="M6 9v6a9 9 0 0 0 9 9"></path></svg>
</span>
<b>Migration insights</b> <span class="dp-files-count">(1)</span>
</span>
</td>
<td data-align="end">--</td>
<td>--</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<svg class="dp-file-folder" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M2 6a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H20a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z"></path></svg>
<b>Important data sets</b> <span class="dp-files-count">(1)</span>
</span>
</td>
<td data-align="end">--</td>
<td>May 7, 2025, 11:05</td>
<td>
<div class="dp-menu" data-open>
<button class="dp-icon-btn" type="button" aria-label="More actions" aria-haspopup="true" aria-expanded="true"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button>
<ul class="dp-menu-list" role="menu">
<li role="none"><a class="dp-menu-item" role="menuitem" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 14 5-5-5-5"></path><path d="M4 20v-7a4 4 0 0 1 4-4h12"></path></svg> Move</a></li>
<li role="none"><button class="dp-menu-item" role="menuitem" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z"></path><path d="M10 6h4M10 10h4M10 14h4M10 18h4"></path></svg> Move to company</button></li>
<li role="none"><a class="dp-menu-item" role="menuitem" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg> Rename</a></li>
<li role="none"><button class="dp-menu-item" role="menuitem" type="button" data-tone="danger"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg> Trash</button></li>
</ul>
</div>
</td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<svg class="dp-file-folder" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M2 6a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H20a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z"></path></svg>
<b>KYC Markmonitor Dashboards</b> <span class="dp-files-count">(3)</span>
</span>
</td>
<td data-align="end">--</td>
<td>Apr 9, 2024, 17:17</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<svg class="dp-file-folder" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M2 6a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H20a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z"></path></svg>
<b>Upsell and new customer ideas</b> <span class="dp-files-count">(12)</span>
</span>
</td>
<td data-align="end">--</td>
<td>--</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<svg class="dp-file-folder" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M2 6a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H20a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z"></path></svg>
<b>Research</b> <span class="dp-files-count">(5)</span>
</span>
</td>
<td data-align="end">--</td>
<td>Sep 27, 2021, 12:22</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<svg class="dp-file-doc" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M14 2v5h5"></path><circle cx="9.5" cy="14.5" r="2.5"></circle><path d="m13 18-1.8-1.8"></path></svg>
<span class="dp-files-filetext">
<b>ZoomInfo enrichment</b>
<span class="dp-files-sub">Search Engine</span>
</span>
</span>
</td>
<td data-align="end">43.67M</td>
<td>Jun 11, 2026, 13:43</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
<tr>
<td><input class="dp-checkbox" type="checkbox" aria-label="Select row" /></td>
<td>
<span class="dp-files-folder">
<svg class="dp-file-doc" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M14 2v5h5"></path><circle cx="9.5" cy="14.5" r="2.5"></circle><path d="m13 18-1.8-1.8"></path></svg>
<span class="dp-files-filetext">
<b>Migration insights Hosting company is OVH</b>
<span class="dp-files-sub">Search Engine</span>
</span>
</span>
</td>
<td data-align="end">6.57M</td>
<td>Jun 4, 2026, 08:28</td>
<td><button class="dp-icon-btn" type="button" aria-label="More actions"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="12" cy="5" r="1.6"></circle><circle cx="12" cy="12" r="1.6"></circle><circle cx="12" cy="19" r="1.6"></circle></svg></button></td>
</tr>
</tbody>
</table>
<div class="dp-files-pagination">
<nav class="dp-pagination" aria-label="Pagination">
<button class="dp-page" type="button" disabled aria-label="Previous page">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"></path></svg>
</button>
<a class="dp-page" href="#" aria-current="page">1</a>
<a class="dp-page" href="#">2</a>
<a class="dp-page" href="#">3</a>
<span class="dp-page-ellipsis" aria-hidden="true">…</span>
<a class="dp-page" href="#">60</a>
<button class="dp-page" type="button" aria-label="Next page">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg>
</button>
</nav>
</div>
</main>
</div>
/* Files block
A data screen: sidebar plus a hero panel, a toolbar and a data table.
Composed from sidebar, input, button, table and pagination under the console
theme. */
.dp-files-hero {
margin-bottom: var(--dp-space-8);
padding: var(--dp-space-10);
text-align: center;
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
}
.dp-files-eyebrow {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
margin-bottom: var(--dp-space-3);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-files-eyebrow svg {
width: 1.1rem;
height: 1.1rem;
}
.dp-files-title {
margin: 0 0 var(--dp-space-3);
font-size: var(--dp-text-3xl);
font-weight: var(--dp-weight-extrabold);
color: var(--dp-navy);
}
.dp-files-desc {
max-width: 48ch;
margin: 0 auto var(--dp-space-6);
color: var(--dp-text-muted);
}
.dp-files-trash {
margin: var(--dp-space-4) 0 0;
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-files-trash a {
color: var(--dp-link);
font-weight: var(--dp-weight-semibold);
}
.dp-files-toolbar-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dp-space-4);
margin-bottom: var(--dp-space-4);
}
.dp-files-count {
font-size: var(--dp-text-lg);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-files-count span {
color: var(--dp-text-muted);
font-weight: var(--dp-weight-regular);
}
.dp-files-create {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
color: var(--dp-link);
font-weight: var(--dp-weight-semibold);
font-size: var(--dp-text-sm);
text-decoration: none;
}
.dp-files-create svg {
width: 1.1rem;
height: 1.1rem;
}
.dp-files-toolbar {
display: flex;
gap: var(--dp-space-3);
margin-bottom: var(--dp-space-4);
}
.dp-files-toolbar .dp-input-group {
flex: 1;
}
/* Flat data list, like the console Files table (no outer card) */
.dp-files-list {
width: 100%;
border-collapse: collapse;
}
.dp-files-list thead th {
text-align: left;
padding: var(--dp-space-3) var(--dp-space-4);
font-size: var(--dp-text-base);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
border-bottom: 1px solid var(--dp-border);
white-space: nowrap;
}
/* Name column takes the remaining width, pushing the rest to the right */
.dp-files-list thead th.dp-col-name {
width: 100%;
}
.dp-files-list .dp-sort {
display: inline-flex;
align-items: center;
gap: 4px;
}
.dp-files-list .dp-sort svg {
width: 0.9rem;
height: 0.9rem;
}
.dp-files-list tbody td {
padding: var(--dp-space-4);
border-bottom: 1px solid var(--dp-border);
font-size: var(--dp-text-base);
color: var(--dp-text-muted);
vertical-align: middle;
white-space: nowrap;
}
.dp-files-list tbody tr:hover {
background: var(--dp-surface-subtle);
}
.dp-files-folder {
display: flex;
align-items: center;
gap: var(--dp-space-4);
}
.dp-files-folder b {
color: var(--dp-navy);
font-weight: var(--dp-weight-bold);
font-size: var(--dp-text-base);
}
.dp-files-folder .dp-files-count {
color: var(--dp-text-muted);
}
/* System folder: icon in a grey rounded chip */
.dp-file-chip {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
flex: none;
border-radius: var(--dp-radius-sm);
background: var(--dp-neutral-300);
color: var(--dp-neutral-600);
}
.dp-file-chip svg {
width: 1.25rem;
height: 1.25rem;
}
/* User folder: filled periwinkle folder */
.dp-file-folder {
width: 2.25rem;
height: 2.25rem;
flex: none;
color: #8b93f0;
}
/* File: document with a search badge */
.dp-file-doc {
width: 2.25rem;
height: 2.25rem;
flex: none;
color: var(--dp-text-subtle);
}
/* Stacked name + source subtitle for dataset files */
.dp-files-filetext {
display: flex;
flex-direction: column;
line-height: 1.3;
}
.dp-files-sub {
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-regular);
color: var(--dp-text-muted);
}
/* Right-aligned numeric column */
.dp-files-list th[data-align="end"],
.dp-files-list td[data-align="end"] {
text-align: right;
font-variant-numeric: tabular-nums;
}
/* The row action menu opens from the right edge */
.dp-files-list .dp-menu-list {
right: 0;
left: auto;
}
/* Kebab action button: a bordered square */
.dp-icon-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-sm);
background: var(--dp-surface);
color: var(--dp-text-muted);
cursor: pointer;
}
.dp-icon-btn:hover {
background: var(--dp-surface-soft);
color: var(--dp-navy);
}
.dp-icon-btn svg {
width: 1.1rem;
height: 1.1rem;
}
.dp-files-pagination {
display: flex;
justify-content: flex-end;
margin-top: var(--dp-space-5);
}
The shared product workspace used by Search Engine, Reverse DNS, SSL Catalog, Universe and Traffic: a toolbar, a filter builder, view tabs, a data sheet and a record toolbar.
npx shadcn@latest add https://ds.dataprovider.dev/r/workspace.json
Registry JSON
<!-- Dataset workspace block
The shared product workspace (Search Engine, Reverse DNS, SSL Catalog,
Universe, Traffic): toolbar, filter builder, view tabs, data sheet and a
record toolbar. Composed under the console theme. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="14" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path><path d="M12 18v3"></path></svg>
Dashboards
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Products
</div>
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
Search Engine
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M2 12h20"></path><path d="M12 2a15 15 0 0 1 0 20 15 15 0 0 1 0-20"></path></svg>
Reverse DNS
</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main" style="padding: 0;">
<div class="dp-ws">
<!-- Toolbar + filters -->
<section class="dp-ws-card">
<div class="dp-ws-bar">
<div class="dp-ws-title">
<span class="dp-ws-title-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
</span>
Untitled dataset
</div>
<div class="dp-ws-actions">
<span class="dp-ws-product">Search Engine</span>
<a class="dp-ws-link" href="#">Monitor</a>
<a class="dp-ws-link" href="#">Send</a>
<span class="dp-ws-sep"></span>
<button class="dp-ws-textbtn" type="button">New</button>
<button class="dp-ws-textbtn" type="button">Save</button>
<button class="dp-btn" type="button" data-variant="secondary">Export</button>
</div>
</div>
<div class="dp-ws-filters">
<div class="dp-ws-filters-head">
<span class="dp-ws-filters-title">Filters</span>
<span class="dp-ws-sep"></span>
<span class="dp-ws-records">416,128,812 Records</span>
<button class="dp-ws-iconbtn" type="button" aria-label="Undo"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7v6h6"></path><path d="M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13"></path></svg></button>
<button class="dp-ws-iconbtn" type="button" aria-label="Redo"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 7v6h-6"></path><path d="M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13"></path></svg></button>
<span class="dp-ws-spacer"></span>
<button class="dp-ws-datepill" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18M8 2v4M16 2v4"></path></svg>
May 2026
</button>
<button class="dp-btn" type="button" data-variant="ai">
Create dataset with AI
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 3l1.9 4.6L18.5 9l-4.6 1.9L12 15l-1.9-4.1L5.5 9l4.6-1.4z"></path></svg>
</button>
</div>
<div class="dp-ws-filter-row">
<select class="dp-select" aria-label="Field"><option>Field</option></select>
<select class="dp-select" aria-label="Operator"><option>Select...</option></select>
<input class="dp-input" type="text" placeholder="Value" />
</div>
<div class="dp-ws-filter-actions">
<button class="dp-btn" type="button" data-variant="secondary" data-size="sm">Add filter</button>
<button class="dp-ws-action" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 16 4 4 4-4"></path><path d="M7 20V4"></path><path d="m21 8-4-4-4 4"></path><path d="M17 4v16"></path></svg>
Rearrange
</button>
<button class="dp-ws-action" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>
Clear All
</button>
<button class="dp-ws-action" type="button" style="margin-left: auto;">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>
Copy Query
</button>
</div>
</div>
</section>
<!-- View tabs + sheet -->
<section class="dp-ws-card">
<div class="dp-ws-tabs" role="tablist">
<button class="dp-ws-tab" type="button" data-active>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14a9 3 0 0 0 18 0V5"></path><path d="M3 12a9 3 0 0 0 18 0"></path></svg>
Sheet
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12A9 9 0 1 1 12 3v9z"></path><path d="M12 3a9 9 0 0 1 9 9h-9z" opacity="0"></path><path d="M16 8a5 5 0 0 0-4-4"></path></svg>
Statistics
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><path d="m19 9-5 5-4-4-3 3"></path></svg>
Trends
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="3" height="7" x="7" y="11"></rect><rect width="3" height="11" x="13" y="7"></rect></svg>
Migration insights
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3 3 5v16l6-2 6 2 6-2V3l-6 2-6-2z"></path><path d="M9 3v16M15 5v16"></path></svg>
Maps
</button>
</div>
<table class="dp-ws-sheet">
<thead>
<tr>
<th class="dp-ws-rownum"></th>
<th class="dp-ws-colhost">
<span class="dp-ws-colhost-head">
Hostname
<span class="dp-ws-colicons">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 17v5"></path><path d="M9 10.76V5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v5.76l1.5 2.4A1 1 0 0 1 17.6 15H6.4a1 1 0 0 1-.9-1.84z"></path></svg>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m7 15 5 5 5-5"></path><path d="m7 9 5-5 5 5"></path></svg>
</span>
</span>
</th>
</tr>
</thead>
<tbody>
<tr><td class="dp-ws-rownum">1</td><td>www.virginiemahe.fr</td></tr>
<tr><td class="dp-ws-rownum">2</td><td>www.cavallin.ch</td></tr>
<tr><td class="dp-ws-rownum">3</td><td>9ofanessence.co.uk</td></tr>
<tr><td class="dp-ws-rownum">4</td><td>www.nudecakes.co.uk</td></tr>
<tr><td class="dp-ws-rownum">5</td><td>yasminstore.it</td></tr>
<tr><td class="dp-ws-rownum">6</td><td>www.charlesjacobs.co.uk</td></tr>
<tr><td class="dp-ws-rownum">7</td><td>barista-corner.ch</td></tr>
<tr><td class="dp-ws-rownum">8</td><td>www.getquipus.com</td></tr>
</tbody>
</table>
<div class="dp-ws-foot">
<button class="dp-ws-foot-ctrl" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line></svg>
50 Records
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</button>
<button class="dp-ws-foot-ctrl" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"></circle></svg>
Uniform
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</button>
<button class="dp-ws-foot-ctrl" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m8 18 4 4 4-4"></path><path d="m8 6 4-4 4 4"></path></svg>
Comfortable
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</button>
<button class="dp-ws-foot-ctrl" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="4" x2="20" y1="6" y2="6"></line><line x1="4" x2="14" y1="12" y2="12"></line><line x1="4" x2="18" y1="18" y2="18"></line></svg>
Rich text
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
</button>
<div class="dp-ws-pager">
<a href="#" aria-disabled="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"></path></svg> Prev</a>
<input class="dp-ws-pagebox" type="text" value="1" aria-label="Page" />
<span>of 8,322,577</span>
<a href="#">Next <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></a>
</div>
</div>
</section>
</div>
</main>
</div>
/* Dataset workspace block
The shared product workspace used by Search Engine, Reverse DNS, SSL Catalog,
Universe and Traffic: a toolbar, a filter builder, view tabs, a data sheet
and a record toolbar. Composed under the console theme. */
.dp-ws {
display: flex;
flex-direction: column;
gap: var(--dp-space-6);
padding: var(--dp-space-6);
}
.dp-ws-card {
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
overflow: hidden;
}
/* ---- Toolbar -------------------------------------------------------- */
.dp-ws-bar {
display: flex;
align-items: center;
gap: var(--dp-space-4);
padding: var(--dp-space-4) var(--dp-space-5);
border-bottom: 1px solid var(--dp-border);
}
.dp-ws-title {
display: flex;
align-items: center;
gap: var(--dp-space-3);
font-size: var(--dp-text-2xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-ws-title-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-md);
color: var(--dp-text-muted);
}
.dp-ws-title-icon svg { width: 1.25rem; height: 1.25rem; }
.dp-ws-actions {
display: flex;
align-items: center;
gap: var(--dp-space-4);
margin-left: auto;
}
.dp-ws-product {
color: var(--dp-text-muted);
font-weight: var(--dp-weight-semibold);
font-size: var(--dp-text-sm);
}
.dp-ws-link {
color: var(--dp-text-muted);
font-weight: var(--dp-weight-semibold);
font-size: var(--dp-text-sm);
text-decoration: none;
cursor: pointer;
}
.dp-ws-actions .dp-btn { font-size: var(--dp-text-sm); }
.dp-ws-link:hover { color: var(--dp-navy); }
.dp-ws-sep {
width: 1px;
height: 1.5rem;
background: var(--dp-border);
}
.dp-ws-textbtn {
appearance: none;
border: 0;
background: transparent;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
padding: var(--dp-space-2) var(--dp-space-2);
border-radius: var(--dp-radius-xs);
cursor: pointer;
}
.dp-ws-textbtn:hover { background: var(--dp-surface-soft); }
/* ---- Filters -------------------------------------------------------- */
.dp-ws-filters { padding: var(--dp-space-5); }
.dp-ws-filters-head {
display: flex;
align-items: center;
gap: var(--dp-space-3);
margin-bottom: var(--dp-space-4);
}
.dp-ws-filters-title {
font-size: var(--dp-text-base);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-ws-records {
color: var(--dp-text-muted);
font-weight: var(--dp-weight-bold);
font-size: var(--dp-text-sm);
}
.dp-ws-iconbtn {
appearance: none;
border: 0;
background: transparent;
color: var(--dp-text-subtle);
cursor: pointer;
padding: 2px;
line-height: 0;
}
.dp-ws-iconbtn:hover { color: var(--dp-navy); }
.dp-ws-iconbtn svg { width: 1.1rem; height: 1.1rem; }
.dp-ws-spacer { margin-left: auto; }
.dp-ws-datepill {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
padding: var(--dp-space-2) var(--dp-space-3);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
background: var(--dp-surface);
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-navy);
cursor: pointer;
}
.dp-ws-datepill svg { width: 1rem; height: 1rem; color: var(--dp-text-muted); }
.dp-ws-filter-row {
display: flex;
gap: var(--dp-space-3);
}
.dp-ws-filter-row .dp-select { flex: 0 0 14rem; }
.dp-ws-filter-row .dp-input { flex: 1; }
.dp-ws-filter-actions {
display: flex;
align-items: center;
gap: var(--dp-space-4);
margin-top: var(--dp-space-4);
}
.dp-ws-action {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
appearance: none;
border: 0;
background: transparent;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-text-muted);
cursor: pointer;
}
.dp-ws-action:hover { color: var(--dp-navy); }
.dp-ws-action svg { width: 1.1rem; height: 1.1rem; }
/* ---- View tabs ------------------------------------------------------ */
.dp-ws-tabs {
display: flex;
gap: var(--dp-space-5);
padding: 0 var(--dp-space-5);
border-bottom: 1px solid var(--dp-border);
}
.dp-ws-tab {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
appearance: none;
border: 0;
background: transparent;
padding: var(--dp-space-4) 0;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-text-muted);
border-bottom: 2px solid transparent;
margin-bottom: -1px;
cursor: pointer;
}
.dp-ws-tab svg { width: 1.15rem; height: 1.15rem; }
.dp-ws-tab:hover { color: var(--dp-navy); }
.dp-ws-tab[data-active] {
color: var(--dp-navy);
border-bottom-color: var(--dp-blue-700);
}
.dp-ws-tab[data-active] svg { color: var(--dp-blue-700); }
/* ---- Sheet ---------------------------------------------------------- */
.dp-ws-sheet {
border-collapse: collapse;
font-size: var(--dp-text-sm);
color: var(--dp-navy);
}
.dp-ws-sheet th,
.dp-ws-sheet td {
border-bottom: 1px solid var(--dp-border);
padding: var(--dp-space-4);
text-align: left;
}
.dp-ws-sheet thead th {
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-ws-rownum {
width: 64px;
min-width: 64px;
text-align: center;
color: var(--dp-text-subtle);
font-size: var(--dp-text-sm);
border-right: 1px solid var(--dp-border);
}
.dp-ws-colhost {
min-width: 24rem;
border-right: 1px solid var(--dp-border);
}
.dp-ws-colhost-head {
display: flex;
align-items: center;
gap: var(--dp-space-2);
}
.dp-ws-colicons {
margin-left: auto;
display: inline-flex;
gap: var(--dp-space-2);
color: var(--dp-text-subtle);
}
.dp-ws-colicons svg { width: 1rem; height: 1rem; }
.dp-ws-sheet tbody tr:hover { background: var(--dp-surface-subtle); }
/* ---- Record toolbar ------------------------------------------------- */
.dp-ws-foot {
display: flex;
align-items: center;
gap: var(--dp-space-4);
padding: var(--dp-space-3) var(--dp-space-5);
border-top: 1px solid var(--dp-border);
}
.dp-ws-foot-ctrl {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
appearance: none;
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xs);
padding: var(--dp-space-2) var(--dp-space-3);
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-navy);
cursor: pointer;
}
.dp-ws-foot-ctrl svg { width: 1rem; height: 1rem; color: var(--dp-text-muted); }
.dp-ws-pager {
margin-left: auto;
display: inline-flex;
align-items: center;
gap: var(--dp-space-3);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-ws-pager a {
display: inline-flex;
align-items: center;
gap: 4px;
color: var(--dp-link);
font-weight: var(--dp-weight-semibold);
text-decoration: none;
}
.dp-ws-pager a[aria-disabled="true"] {
color: var(--dp-text-subtle);
pointer-events: none;
}
.dp-ws-pager svg { width: 1rem; height: 1rem; }
.dp-ws-pagebox {
width: 3rem;
height: 2rem;
text-align: center;
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
color: var(--dp-navy);
}
A card-grid screen with a page header, a large search and category sections of recipe cards. Logos are placeholder tiles to swap for the real brand logo.
Complex filter combinations made for you to get the best results
Bubble.io is the leading no-code platform for building fully functional, data-driven web applications through a visual drag-and-drop interface.
CloudFlutterFlow is a visual low-code platform built on Google's Flutter framework that enables anyone to design, build and deploy cross-platform apps.
CloudBolt.new is an AI-powered full-stack web development agent by StackBlitz that turns natural language prompts into deployable applications.
CloudThuiswinkel Waarborg is a Dutch e-commerce trust mark for online stores.
One.com Webshop is a user-friendly e-commerce builder for small businesses.
Tray is a Brazilian e-commerce platform for building online stores.
Web.com Websitebuilder offers a hosted store and site building service.
npx shadcn@latest add https://ds.dataprovider.dev/r/recipes.json
Registry JSON
<!-- Recipes block
A card-grid screen: page header, a large search, and category sections of
recipe cards. Logos are placeholder tiles; swap in the real brand logo.
Composed under the console theme. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="14" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path><path d="M12 18v3"></path></svg>
Dashboards
</a>
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M9 13h6"></path><path d="M9 17h3"></path></svg>
Recipes
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Products
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
Search Engine
</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main">
<h1 class="dp-recipes-title">Recipes</h1>
<p class="dp-recipes-desc">Complex filter combinations made for you to get the best results</p>
<div class="dp-recipes-search">
<svg class="dp-recipes-search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
<input type="search" placeholder="e.g.: Google, WordPress, NYSE" />
<svg class="dp-recipes-search-info" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg>
</div>
<section class="dp-recipes-section">
<div class="dp-recipes-section-head">
<span class="dp-recipes-section-title">Highlighted</span>
</div>
<div class="dp-recipe-grid">
<article class="dp-recipe-card">
<div class="dp-recipe-logo"><span class="dp-recipe-logo-tile">B</span></div>
<h3 class="dp-recipe-title">Bubble.io</h3>
<p class="dp-recipe-desc">Bubble.io is the leading no-code platform for building fully functional, data-driven web applications through a visual drag-and-drop interface.</p>
<span class="dp-badge" data-tone="neutral">Cloud</span>
</article>
<article class="dp-recipe-card">
<div class="dp-recipe-logo"><span class="dp-recipe-logo-tile">F</span></div>
<h3 class="dp-recipe-title">Flutterflow APP</h3>
<p class="dp-recipe-desc">FlutterFlow is a visual low-code platform built on Google's Flutter framework that enables anyone to design, build and deploy cross-platform apps.</p>
<span class="dp-badge" data-tone="neutral">Cloud</span>
</article>
<article class="dp-recipe-card">
<div class="dp-recipe-logo"><span class="dp-recipe-logo-tile">B</span></div>
<h3 class="dp-recipe-title">Bolt</h3>
<p class="dp-recipe-desc">Bolt.new is an AI-powered full-stack web development agent by StackBlitz that turns natural language prompts into deployable applications.</p>
<span class="dp-badge" data-tone="neutral">Cloud</span>
</article>
</div>
</section>
<section class="dp-recipes-section">
<div class="dp-recipes-section-head">
<span class="dp-recipes-section-title">E-commerce <span>(48)</span></span>
<a class="dp-recipes-seeall" href="#">See all</a>
</div>
<div class="dp-recipe-grid" data-compact>
<article class="dp-recipe-card" data-compact>
<div class="dp-recipe-head">
<h3 class="dp-recipe-title">Thuiswinkel</h3>
<span class="dp-recipe-logo-tile">T</span>
</div>
<p class="dp-recipe-desc">Thuiswinkel Waarborg is a Dutch e-commerce trust mark for online stores.</p>
</article>
<article class="dp-recipe-card" data-compact>
<div class="dp-recipe-head">
<h3 class="dp-recipe-title">One.com</h3>
<span class="dp-recipe-logo-tile">O</span>
</div>
<p class="dp-recipe-desc">One.com Webshop is a user-friendly e-commerce builder for small businesses.</p>
</article>
<article class="dp-recipe-card" data-compact>
<div class="dp-recipe-head">
<h3 class="dp-recipe-title">Tray</h3>
<span class="dp-recipe-logo-tile">Y</span>
</div>
<span class="dp-badge" data-tone="warning" style="margin-bottom: var(--dp-space-2);">B3:LWSA3</span>
<p class="dp-recipe-desc">Tray is a Brazilian e-commerce platform for building online stores.</p>
</article>
<article class="dp-recipe-card" data-compact>
<div class="dp-recipe-head">
<h3 class="dp-recipe-title">Websitebuilder</h3>
<span class="dp-recipe-logo-tile">W</span>
</div>
<p class="dp-recipe-desc">Web.com Websitebuilder offers a hosted store and site building service.</p>
</article>
</div>
</section>
</main>
</div>
/* Recipes block
A card-grid screen: page header, a large search, and category sections of
recipe cards. Composed under the console theme. */
.dp-recipes-title {
margin: 0 0 var(--dp-space-2);
font-size: var(--dp-text-4xl);
font-weight: var(--dp-weight-extrabold);
color: var(--dp-navy);
}
.dp-recipes-desc {
margin: 0 0 var(--dp-space-6);
font-size: var(--dp-text-lg);
color: var(--dp-text-muted);
}
/* Large search */
.dp-recipes-search {
position: relative;
margin-bottom: var(--dp-space-10);
}
.dp-recipes-search input {
width: 100%;
height: 3.25rem;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-base);
color: var(--dp-navy);
background: var(--dp-surface);
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-lg);
padding: 0 3rem;
}
.dp-recipes-search input::placeholder { color: var(--dp-text-subtle); }
.dp-recipes-search input:focus {
outline: none;
border-color: var(--dp-primary-bg);
box-shadow: var(--dp-shadow-focus);
}
.dp-recipes-search .dp-recipes-search-icon {
position: absolute;
left: var(--dp-space-4);
top: 50%;
transform: translateY(-50%);
width: 1.25rem;
height: 1.25rem;
color: var(--dp-text-subtle);
pointer-events: none;
}
.dp-recipes-search .dp-recipes-search-info {
position: absolute;
right: var(--dp-space-4);
top: 50%;
transform: translateY(-50%);
width: 1.25rem;
height: 1.25rem;
color: var(--dp-text-subtle);
}
/* Section */
.dp-recipes-section { margin-top: var(--dp-space-10); }
.dp-recipes-section-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--dp-space-4);
margin-bottom: var(--dp-space-5);
}
.dp-recipes-section-title {
font-size: var(--dp-text-2xl);
font-weight: var(--dp-weight-extrabold);
color: var(--dp-navy);
}
.dp-recipes-section-title span {
font-weight: var(--dp-weight-regular);
color: var(--dp-text-muted);
}
.dp-recipes-seeall {
color: var(--dp-navy);
font-weight: var(--dp-weight-semibold);
font-size: var(--dp-text-base);
text-decoration: none;
}
.dp-recipes-seeall:hover { color: var(--dp-link); }
/* Cards */
.dp-recipe-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--dp-space-5);
}
.dp-recipe-grid[data-compact] {
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}
.dp-recipe-card {
display: flex;
flex-direction: column;
padding: var(--dp-space-6);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
}
.dp-recipe-logo {
display: flex;
align-items: center;
justify-content: center;
height: 8rem;
margin-bottom: var(--dp-space-5);
}
.dp-recipe-logo-tile {
display: inline-flex;
align-items: center;
justify-content: center;
width: 4.5rem;
height: 4.5rem;
border-radius: var(--dp-radius-lg);
background: var(--dp-surface-soft);
color: var(--dp-brand-purple, var(--dp-navy));
font-size: var(--dp-text-3xl);
font-weight: var(--dp-weight-extrabold);
}
.dp-recipe-title {
margin: 0 0 var(--dp-space-2);
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-recipe-desc {
flex: 1;
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
/* Compact card: title and logo on one row */
.dp-recipe-card[data-compact] { padding: var(--dp-space-5); }
.dp-recipe-card[data-compact] .dp-recipe-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dp-space-3);
margin-bottom: var(--dp-space-3);
}
.dp-recipe-card[data-compact] .dp-recipe-title { margin: 0; font-size: var(--dp-text-lg); }
.dp-recipe-card[data-compact] .dp-recipe-logo-tile {
width: 2.75rem;
height: 2.75rem;
font-size: var(--dp-text-lg);
border-radius: var(--dp-radius-md);
}
A settings screen: two columns of cards with user-info form fields, security and social sign-in setting rows, MCP settings and access tokens.
Your personal details
To enhance security, Dataprovider does not store user email addresses. Please contact our team if you require an email address update.
Configure your MCP-related sessions
https://mcp.dataprovider.com/mcp?api-key=
Visualization settings
Change password Request password reset Two-factor authentication Two-factor authentication is disabled.
Activate sign-in with one of the following services
Link account to Google Link account to LinkedIn Link account to MicrosoftManage your MCP and API tokens
npx shadcn@latest add https://ds.dataprovider.dev/r/account.json
Registry JSON
<!-- Account / Profile block
A settings screen: two columns of cards with form fields, setting rows,
social sign-in and access tokens. Composed under the console theme. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg>
Recipes
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Account
</div>
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="8" r="4"></circle><path d="M6 21v-1a6 6 0 0 1 12 0v1"></path></svg>
Profile
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><path d="m19 9-5 5-4-4-3 3"></path></svg>
Usage
</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main">
<h1 class="dp-account-title">Profile</h1>
<div class="dp-account-grid">
<!-- Left column -->
<div class="dp-account-col">
<section class="dp-settings-card">
<h2 class="dp-settings-title">User info</h2>
<p class="dp-settings-sub">Your personal details</p>
<div class="dp-field">
<label class="dp-label" for="first">First name</label>
<input class="dp-input" id="first" type="text" value="Christian" />
</div>
<div class="dp-field">
<label class="dp-label" for="last">Last name</label>
<input class="dp-input" id="last" type="text" value="Branbergen" />
</div>
<div class="dp-field">
<label class="dp-label" for="email">Email address</label>
<input class="dp-input" id="email" type="email" value="branbergen@dataprovider.com" disabled />
</div>
<p class="dp-settings-note">To enhance security, Dataprovider does not
store user email addresses. Please <a href="#">contact our team</a> if
you require an email address update.</p>
<label class="dp-option-box dp-check">
<input class="dp-checkbox" type="checkbox" checked />
<span class="dp-option-text">
<span class="dp-option-title">Subscribe to marketing emails</span>
<span class="dp-option-desc">Get updates about new products, helpful tips, and exclusive offers.</span>
</span>
</label>
</section>
<section class="dp-settings-card">
<div class="dp-settings-head">
<h2 class="dp-settings-title">MCP Settings</h2>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Read more about our MCP</button>
</div>
<p class="dp-settings-sub">Configure your MCP-related sessions</p>
<div class="dp-mcp-url-label">MCP URL</div>
<div class="dp-mcp-url">
<code>https://mcp.dataprovider.com/mcp?api-key=</code>
<button class="dp-mcp-copy" type="button" aria-label="Copy URL">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>
</button>
</div>
<p class="dp-settings-subhead">Visualization settings</p>
<label class="dp-option-box dp-radio">
<input class="dp-radio-input" type="radio" name="viz" />
<span class="dp-option-text">
<span class="dp-option-title">Automatic</span>
<span class="dp-option-desc">Show visualisations in MCP sessions depending on context</span>
</span>
</label>
<label class="dp-option-box dp-radio">
<input class="dp-radio-input" type="radio" name="viz" />
<span class="dp-option-text">
<span class="dp-option-title">Always on</span>
<span class="dp-option-desc">Always show visualisations in MCP sessions</span>
</span>
</label>
</section>
</div>
<!-- Right column -->
<div class="dp-account-col">
<section class="dp-settings-card">
<h2 class="dp-settings-title">Security</h2>
<p class="dp-settings-sub"> </p>
<a class="dp-setting-row" href="#">
<span class="dp-setting-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="7.5" cy="15.5" r="3.5"></circle><path d="m10 13 7-7"></path><path d="m14 6 2 2 3-3-2-2z"></path></svg>
</span>
<span class="dp-setting-text">
<span class="dp-setting-title">Change password</span>
<span class="dp-setting-sub">Request password reset</span>
</span>
<span class="dp-setting-chevron"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></span>
</a>
<a class="dp-setting-row" href="#">
<span class="dp-setting-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"></path><path d="m9 12 2 2 4-4"></path></svg>
</span>
<span class="dp-setting-text">
<span class="dp-setting-title">Two-factor authentication</span>
<span class="dp-setting-sub">Two-factor authentication is disabled.</span>
</span>
<span class="dp-setting-chevron"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></span>
</a>
</section>
<section class="dp-settings-card">
<h2 class="dp-settings-title">Social sign-in</h2>
<p class="dp-settings-sub">Activate sign-in with one of the following services</p>
<a class="dp-setting-row" href="#">
<span class="dp-setting-icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="#4285F4" d="M21.6 12.2c0-.6-.1-1.2-.2-1.8H12v3.4h5.4a4.6 4.6 0 0 1-2 3v2.5h3.2c1.9-1.7 3-4.3 3-7.1"/><path fill="#34A853" d="M12 22c2.7 0 5-1 6.6-2.7l-3.2-2.5c-.9.6-2 1-3.4 1-2.6 0-4.8-1.7-5.6-4.1H3.1v2.6A10 10 0 0 0 12 22"/><path fill="#FBBC05" d="M6.4 13.7a6 6 0 0 1 0-3.8V7.3H3.1a10 10 0 0 0 0 9z"/><path fill="#EA4335" d="M12 5.9c1.5 0 2.8.5 3.8 1.5l2.8-2.8A10 10 0 0 0 3.1 7.3l3.3 2.6C7.2 7.5 9.4 5.9 12 5.9"/></svg>
</span>
<span class="dp-setting-text"><span class="dp-setting-title">Link account to Google</span></span>
<span class="dp-setting-chevron"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></span>
</a>
<a class="dp-setting-row" href="#">
<span class="dp-setting-icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><rect width="24" height="24" rx="3" fill="#0a66c2"/><path fill="#fff" d="M7 9.5H4.6V19H7zM5.8 8.2A1.4 1.4 0 1 0 5.8 5.4a1.4 1.4 0 0 0 0 2.8M19.4 19H17v-4.6c0-1.1-.4-1.9-1.4-1.9-.8 0-1.2.5-1.4 1-.1.2-.1.5-.1.8V19h-2.4s.03-8 0-8.8h2.4v1.2c.3-.5.9-1.2 2.2-1.2 1.6 0 2.8 1 2.8 3.3z"/></svg>
</span>
<span class="dp-setting-text"><span class="dp-setting-title">Link account to LinkedIn</span></span>
<span class="dp-setting-chevron"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></span>
</a>
<a class="dp-setting-row" href="#">
<span class="dp-setting-icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="8" height="8" fill="#f25022"/><rect x="13" y="3" width="8" height="8" fill="#7fba00"/><rect x="3" y="13" width="8" height="8" fill="#00a4ef"/><rect x="13" y="13" width="8" height="8" fill="#ffb900"/></svg>
</span>
<span class="dp-setting-text"><span class="dp-setting-title">Link account to Microsoft</span></span>
<span class="dp-setting-chevron"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></span>
</a>
</section>
<section class="dp-settings-card">
<div class="dp-settings-head">
<h2 class="dp-settings-title">Access tokens</h2>
<button class="dp-btn" type="button" data-variant="secondary" data-size="sm">Create access token</button>
</div>
<p class="dp-settings-sub">Manage your MCP and API tokens</p>
<div class="dp-token-row">
<span>
<span class="dp-token-name">RevealVisitor</span><br>
<span class="dp-token-meta">MCP · Expires 20/05/2027, 20:29</span>
</span>
<button class="dp-token-del" type="button" aria-label="Delete token">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg>
</button>
</div>
<div class="dp-token-row">
<span>
<span class="dp-token-name">BrandScout</span><br>
<span class="dp-token-meta">MCP · Expires 14/04/2027, 09:10</span>
</span>
<button class="dp-token-del" type="button" aria-label="Delete token">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg>
</button>
</div>
</section>
</div>
</div>
</main>
</div>
/* Account / Profile block
A settings screen: two columns of cards with form fields, setting rows,
social sign-in rows and access tokens. Composed under the console theme. */
.dp-account-title {
margin: 0 0 var(--dp-space-6);
font-size: var(--dp-text-4xl);
font-weight: var(--dp-weight-extrabold);
color: var(--dp-navy);
}
.dp-account-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--dp-space-6);
align-items: start;
}
@media (max-width: 980px) { .dp-account-grid { grid-template-columns: 1fr; } }
.dp-account-col {
display: flex;
flex-direction: column;
gap: var(--dp-space-6);
}
.dp-settings-card {
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-xl);
padding: var(--dp-space-6);
}
.dp-settings-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--dp-space-4);
}
.dp-settings-title {
margin: 0;
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-settings-sub {
margin: var(--dp-space-1) 0 var(--dp-space-5);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-settings-card .dp-field { margin-bottom: var(--dp-space-4); }
.dp-settings-note {
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-settings-note a { color: var(--dp-link); }
.dp-settings-subhead {
margin: var(--dp-space-2) 0 var(--dp-space-3);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
/* Soft box holding a checkbox or radio option */
.dp-option-box {
display: flex;
align-items: flex-start;
gap: var(--dp-space-3);
padding: var(--dp-space-4);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
background: var(--dp-surface-subtle);
}
.dp-option-box + .dp-option-box { margin-top: var(--dp-space-3); }
.dp-option-text { display: flex; flex-direction: column; gap: 2px; }
.dp-option-title { font-weight: var(--dp-weight-bold); color: var(--dp-navy); font-size: var(--dp-text-sm); }
.dp-option-desc { font-size: var(--dp-text-sm); color: var(--dp-text-muted); }
/* A setting row: icon, text and a chevron */
.dp-setting-row {
display: flex;
align-items: center;
gap: var(--dp-space-4);
padding: var(--dp-space-4);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
background: var(--dp-surface-subtle);
text-decoration: none;
cursor: pointer;
}
.dp-setting-row + .dp-setting-row { margin-top: var(--dp-space-3); }
.dp-setting-row:hover { border-color: var(--dp-border-strong); }
.dp-setting-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.75rem;
height: 2.75rem;
flex: none;
border-radius: var(--dp-radius-md);
background: var(--dp-surface-soft);
color: var(--dp-blue-700);
}
.dp-setting-icon svg { width: 1.35rem; height: 1.35rem; }
.dp-setting-text { flex: 1; min-width: 0; }
.dp-setting-title { font-weight: var(--dp-weight-bold); color: var(--dp-navy); }
.dp-setting-sub { font-size: var(--dp-text-sm); color: var(--dp-text-muted); }
.dp-setting-chevron { color: var(--dp-text-subtle); flex: none; }
.dp-setting-chevron svg { width: 1.25rem; height: 1.25rem; }
/* MCP URL field */
.dp-mcp-url-label {
margin-bottom: var(--dp-space-2);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-semibold);
color: var(--dp-navy);
}
.dp-mcp-url {
display: flex;
align-items: center;
gap: var(--dp-space-3);
padding: var(--dp-space-3) var(--dp-space-4);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-md);
background: var(--dp-surface-subtle);
}
.dp-mcp-url code {
flex: 1;
font-family: var(--dp-font-mono);
font-size: var(--dp-text-sm);
color: var(--dp-navy);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dp-mcp-copy {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2rem;
height: 2rem;
flex: none;
border: 1px solid var(--dp-border-neutral);
border-radius: var(--dp-radius-xs);
background: var(--dp-surface);
color: var(--dp-text-muted);
cursor: pointer;
}
.dp-mcp-copy svg { width: 1rem; height: 1rem; }
/* Access token rows */
.dp-token-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dp-space-3);
padding: var(--dp-space-4);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-lg);
background: var(--dp-surface-subtle);
}
.dp-token-row + .dp-token-row { margin-top: var(--dp-space-3); }
.dp-token-name { font-weight: var(--dp-weight-bold); color: var(--dp-navy); }
.dp-token-meta { font-size: var(--dp-text-sm); color: var(--dp-text-muted); }
.dp-token-del {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
flex: none;
border: 1px solid #f3c0c0;
border-radius: var(--dp-radius-xs);
background: var(--dp-surface);
color: var(--dp-danger);
cursor: pointer;
}
.dp-token-del svg { width: 1.1rem; height: 1.1rem; }
The Statistics tab of the dataset workspace: a chart panel with a chart-type select, a bar chart, a legend and a data table. Shares the workspace chrome.
Top-level domain (Coverage 100.0%) | Count: Absolute counts from total detected/filled
| Name | Percentage | Count |
|---|---|---|
| com | 100% | 181.78M |
npx shadcn@latest add https://ds.dataprovider.dev/r/statistics.json
Registry JSON
<!-- Statistics view (workspace)
The Statistics tab of the dataset workspace: chart panel with a chart-type
select, a bar chart, a legend and a data table. Reuses the workspace chrome
(.dp-ws-*). Composed under the console theme. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg>
Home
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg>
AI Navigator <span class="dp-nav-beta">Beta</span>
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Library
</div>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
Files
</a>
<a class="dp-nav-item" href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg>
Recipes
</a>
<div class="dp-nav-group">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg>
Products
</div>
<a class="dp-nav-item" data-active href="#">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg>
Search Engine
</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user">
<span class="dp-sidebar-user-name">Christian Branbergen</span>
<span class="dp-sidebar-user-org">Dataprovider BV</span>
</span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main" style="padding: 0;">
<div class="dp-ws">
<section class="dp-ws-card">
<div class="dp-ws-bar">
<div class="dp-ws-title">
<span class="dp-ws-title-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg>
</span>
Untitled dataset
</div>
<div class="dp-ws-actions">
<span class="dp-ws-product">Search Engine</span>
<a class="dp-ws-link" href="#">Monitor</a>
<a class="dp-ws-link" href="#">Send</a>
<span class="dp-ws-sep"></span>
<button class="dp-ws-textbtn" type="button">New</button>
<button class="dp-ws-textbtn" type="button">Save</button>
<button class="dp-btn" type="button" data-variant="secondary">Export</button>
</div>
</div>
<div class="dp-ws-filters">
<div class="dp-ws-filters-head">
<span class="dp-ws-filters-title">Filters</span>
<span class="dp-ws-sep"></span>
<span class="dp-ws-records">181,776,249 Records</span>
<button class="dp-ws-iconbtn" type="button" aria-label="Undo"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7v6h6"></path><path d="M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13"></path></svg></button>
<button class="dp-ws-iconbtn" type="button" aria-label="Redo"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 7v6h-6"></path><path d="M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13"></path></svg></button>
<span class="dp-ws-spacer"></span>
<button class="dp-ws-datepill" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18M8 2v4M16 2v4"></path></svg>
Jun 2026
</button>
<button class="dp-btn" type="button" data-variant="ai">
Create dataset with AI
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 3l1.9 4.6L18.5 9l-4.6 1.9L12 15l-1.9-4.1L5.5 9l4.6-1.4z"></path></svg>
</button>
</div>
<div class="dp-ws-filter-row">
<select class="dp-select" aria-label="Field"><option>Top-level domain</option></select>
<select class="dp-select" aria-label="Operator"><option>is</option></select>
<input class="dp-input" type="text" value="com" />
</div>
<div class="dp-ws-filter-actions">
<button class="dp-btn" type="button" data-variant="secondary" data-size="sm">Add filter</button>
<button class="dp-ws-action" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 16 4 4 4-4"></path><path d="M7 20V4"></path><path d="m21 8-4-4-4 4"></path><path d="M17 4v16"></path></svg>
Rearrange
</button>
<button class="dp-ws-action" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>
Clear All
</button>
<button class="dp-ws-action" type="button" style="margin-left: auto;">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>
Copy Query
</button>
</div>
</div>
</section>
<section class="dp-ws-card">
<div class="dp-ws-tabs" role="tablist">
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14a9 3 0 0 0 18 0V5"></path><path d="M3 12a9 3 0 0 0 18 0"></path></svg>
Sheet
</button>
<button class="dp-ws-tab" type="button" data-active>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12A9 9 0 1 1 12 3v9z"></path><path d="M16 8a5 5 0 0 0-4-4"></path></svg>
Statistics
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><path d="m19 9-5 5-4-4-3 3"></path></svg>
Trends
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="3" height="7" x="7" y="11"></rect><rect width="3" height="11" x="13" y="7"></rect></svg>
Migration insights
</button>
<button class="dp-ws-tab" type="button">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3 3 5v16l6-2 6 2 6-2V3l-6 2-6-2z"></path><path d="M9 3v16M15 5v16"></path></svg>
Maps
</button>
</div>
<div class="dp-stat-chart">
<div class="dp-stat-chart-head">
<div class="dp-stat-chart-title">
Top-level domain
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg>
</div>
<div class="dp-stat-chart-controls">
<select class="dp-select" data-size="sm" aria-label="Chart type"><option>Vertical bar</option></select>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Download</button>
</div>
</div>
<div class="dp-stat-plot">
<div class="dp-stat-yaxis">
<span>240M</span><span>200M</span><span>160M</span><span>120M</span><span>80M</span><span>40M</span><span>0</span>
</div>
<div class="dp-stat-bars">
<div class="dp-stat-toolbar">
<button type="button" aria-label="Zoom in"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3M11 8v6M8 11h6"></path></svg></button>
<button type="button" aria-label="Zoom out"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3M8 11h6"></path></svg></button>
<button type="button" aria-label="Pan"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 11V6a2 2 0 0 0-4 0v5"></path><path d="M14 10V4a2 2 0 0 0-4 0v6"></path><path d="M10 10.5V6a2 2 0 0 0-4 0v8"></path><path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2a8 8 0 0 1-8-8"></path></svg></button>
<button type="button" aria-label="Settings"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-2.82 1.17V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 8 19.4l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.6 15H4.5a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 6 8.6l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 11 4.6V4.5a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 2.82 1.17l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9z"></path></svg></button>
<button type="button" aria-label="Reset"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 3-6.7L3 8"></path><path d="M3 3v5h5"></path></svg></button>
</div>
<div class="dp-stat-bar" style="height: 75.7%;"></div>
</div>
</div>
<p class="dp-stat-legend">Top-level domain <a href="#">(Coverage 100.0%)</a> | <b>Count:</b> Absolute counts from total detected/filled</p>
<table class="dp-stat-table">
<thead>
<tr>
<th>Name</th>
<th class="dp-stat-num">Percentage</th>
<th class="dp-stat-num">Count</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="dp-stat-name"><span class="dp-stat-dot"></span> com</span></td>
<td class="dp-stat-num">100%</td>
<td class="dp-stat-num">181.78M</td>
</tr>
</tbody>
</table>
<button class="dp-btn dp-stat-copy" type="button" data-variant="outline">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>
Copy data to clipboard
</button>
</div>
</section>
</div>
</main>
</div>
/* Statistics view (workspace)
The Statistics tab of the dataset workspace: a chart panel with a chart-type
select, a bar chart, a legend and a data table. Reuses the workspace chrome
(.dp-ws-*) and the console theme. */
.dp-stat-chart { padding: var(--dp-space-6); }
.dp-stat-chart-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dp-space-4);
margin-bottom: var(--dp-space-5);
}
.dp-stat-chart-title {
display: flex;
align-items: center;
gap: var(--dp-space-2);
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-stat-chart-title svg { width: 1.1rem; height: 1.1rem; color: var(--dp-text-subtle); }
.dp-stat-chart-controls {
display: flex;
align-items: center;
gap: var(--dp-space-3);
}
.dp-stat-chart-controls .dp-select { width: 12rem; }
/* Plot area */
.dp-stat-plot {
display: flex;
gap: var(--dp-space-3);
height: 22rem;
margin-bottom: var(--dp-space-4);
}
.dp-stat-yaxis {
display: flex;
flex-direction: column;
justify-content: space-between;
text-align: right;
width: 3.5rem;
padding-bottom: 1.25rem;
font-size: var(--dp-text-xs);
color: var(--dp-text-subtle);
font-variant-numeric: tabular-nums;
}
.dp-stat-bars {
position: relative;
flex: 1;
border-left: 1px solid var(--dp-border);
border-bottom: 1px solid var(--dp-border);
background-image: repeating-linear-gradient(
to top,
transparent 0,
transparent calc(16.666% - 1px),
var(--dp-border) calc(16.666% - 1px),
var(--dp-border) 16.666%
);
}
.dp-stat-bar {
position: absolute;
bottom: 0;
left: 6%;
right: 6%;
background: var(--dp-blue-700);
border-radius: 2px 2px 0 0;
}
.dp-stat-toolbar {
position: absolute;
top: var(--dp-space-3);
right: var(--dp-space-3);
display: inline-flex;
align-items: center;
gap: var(--dp-space-1);
padding: var(--dp-space-1) var(--dp-space-2);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-md);
box-shadow: var(--dp-shadow-sm);
}
.dp-stat-toolbar button {
display: inline-flex;
border: 0;
background: transparent;
color: var(--dp-text-muted);
cursor: pointer;
padding: 3px;
}
.dp-stat-toolbar svg { width: 1rem; height: 1rem; }
/* Legend */
.dp-stat-legend {
padding-top: var(--dp-space-4);
border-top: 1px solid var(--dp-border);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-stat-legend a { color: var(--dp-link); text-decoration: none; }
.dp-stat-legend b { color: var(--dp-navy); }
/* Data table */
.dp-stat-table {
width: 100%;
border-collapse: collapse;
margin-top: var(--dp-space-4);
font-size: var(--dp-text-sm);
}
.dp-stat-table th {
text-align: left;
padding: var(--dp-space-3) var(--dp-space-2);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
border-bottom: 1px solid var(--dp-border);
}
.dp-stat-table th.dp-stat-num,
.dp-stat-table td.dp-stat-num { text-align: right; font-variant-numeric: tabular-nums; }
.dp-stat-table td {
padding: var(--dp-space-3) var(--dp-space-2);
border-bottom: 1px solid var(--dp-border);
color: var(--dp-text-muted);
}
.dp-stat-name {
display: inline-flex;
align-items: center;
gap: var(--dp-space-2);
color: var(--dp-navy);
}
.dp-stat-dot {
width: 0.6rem;
height: 0.6rem;
border-radius: var(--dp-radius-full);
background: var(--dp-blue-700);
}
.dp-stat-copy { margin-top: var(--dp-space-5); }
The Trends tab of the dataset workspace: a line/area chart over time, shown here in the empty state that appears before a filter is set. Shares the workspace chrome.
npx shadcn@latest add https://ds.dataprovider.dev/r/trends.json
Registry JSON
<!-- Trends view (workspace)
The Trends tab of the dataset workspace. Without a filter it shows an empty
state: a faded area chart with a message. Reuses the workspace chrome. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg> Home</a>
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg> AI Navigator <span class="dp-nav-beta">Beta</span></a>
<div class="dp-nav-group"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg> Library</div>
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg> Files</a>
<div class="dp-nav-group"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg> Products</div>
<a class="dp-nav-item" data-active href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg> Search Engine</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user"><span class="dp-sidebar-user-name">Christian Branbergen</span><span class="dp-sidebar-user-org">Dataprovider BV</span></span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main" style="padding: 0;">
<div class="dp-ws">
<section class="dp-ws-card">
<div class="dp-ws-bar">
<div class="dp-ws-title">
<span class="dp-ws-title-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg></span>
Untitled dataset
</div>
<div class="dp-ws-actions">
<span class="dp-ws-product">Search Engine</span>
<a class="dp-ws-link" href="#">Monitor</a>
<a class="dp-ws-link" href="#">Send</a>
<span class="dp-ws-sep"></span>
<button class="dp-ws-textbtn" type="button">New</button>
<button class="dp-ws-textbtn" type="button">Save</button>
<button class="dp-btn" type="button" data-variant="secondary">Export</button>
</div>
</div>
<div class="dp-ws-filters">
<div class="dp-ws-filters-head">
<span class="dp-ws-filters-title">Filters</span>
<span class="dp-ws-sep"></span>
<span class="dp-ws-records">422,214,685 Records</span>
<span class="dp-ws-spacer"></span>
<button class="dp-ws-datepill" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18M8 2v4M16 2v4"></path></svg> Jun 2026</button>
<button class="dp-btn" type="button" data-variant="ai">Create dataset with AI <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 3l1.9 4.6L18.5 9l-4.6 1.9L12 15l-1.9-4.1L5.5 9l4.6-1.4z"></path></svg></button>
</div>
<div class="dp-ws-filter-row">
<select class="dp-select" aria-label="Field"><option>Field</option></select>
<select class="dp-select" aria-label="Operator"><option>Select...</option></select>
<input class="dp-input" type="text" placeholder="Value" />
</div>
<div class="dp-ws-filter-actions">
<button class="dp-btn" type="button" data-variant="secondary" data-size="sm">Add filter</button>
<button class="dp-ws-action" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 16 4 4 4-4"></path><path d="M7 20V4"></path><path d="m21 8-4-4-4 4"></path><path d="M17 4v16"></path></svg> Rearrange</button>
<button class="dp-ws-action" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg> Clear All</button>
<button class="dp-ws-action" type="button" style="margin-left: auto;"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg> Copy Query</button>
</div>
</div>
</section>
<section class="dp-ws-card">
<div class="dp-ws-tabs" role="tablist">
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14a9 3 0 0 0 18 0V5"></path><path d="M3 12a9 3 0 0 0 18 0"></path></svg> Sheet</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12A9 9 0 1 1 12 3v9z"></path><path d="M16 8a5 5 0 0 0-4-4"></path></svg> Statistics</button>
<button class="dp-ws-tab" type="button" data-active><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><path d="m19 9-5 5-4-4-3 3"></path></svg> Trends</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="3" height="7" x="7" y="11"></rect><rect width="3" height="11" x="13" y="7"></rect></svg> Migration insights</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3 3 5v16l6-2 6 2 6-2V3l-6 2-6-2z"></path><path d="M9 3v16M15 5v16"></path></svg> Maps</button>
</div>
<div class="dp-trends">
<div class="dp-trends-skel">
<div class="dp-skel" style="width: 30%;"></div>
<div class="dp-skel" style="width: 55%;"></div>
</div>
<div class="dp-trends-plot">
<div class="dp-trends-yaxis">
<div class="dp-skel"></div><div class="dp-skel"></div><div class="dp-skel"></div><div class="dp-skel"></div><div class="dp-skel"></div><div class="dp-skel"></div>
</div>
<div class="dp-trends-area">
<svg viewBox="0 0 100 40" preserveAspectRatio="none" aria-hidden="true"><polygon fill="#e6e9f6" points="0,40 0,24 8,18 16,10 24,9 32,20 40,26 48,17 56,15 64,10 72,14 80,12 88,20 96,22 100,9 100,40"></polygon></svg>
</div>
<div class="dp-trends-msg">In order to view Trends, you must set a filter.</div>
</div>
<div class="dp-trends-legend">
<div class="dp-trends-legend-row"><div class="dp-skel"></div><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg></div>
<div class="dp-trends-legend-row"><div class="dp-skel"></div><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg></div>
<div class="dp-trends-legend-row"><div class="dp-skel"></div><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg></div>
<div class="dp-trends-legend-row"><div class="dp-skel"></div><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg></div>
<div class="dp-trends-legend-row"><div class="dp-skel"></div><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg></div>
<div class="dp-trends-legend-row"><div class="dp-skel"></div><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7"></path><circle cx="12" cy="12" r="3"></circle></svg></div>
</div>
</div>
</section>
</div>
</main>
</div>
/* Trends view (workspace)
The Trends tab: a line/area chart. Without a filter it shows an empty state,
a faded chart with a message. Reuses the workspace chrome (.dp-ws-*). */
.dp-trends { padding: var(--dp-space-6); }
.dp-trends-skel { display: flex; flex-direction: column; gap: var(--dp-space-3); margin-bottom: var(--dp-space-5); }
.dp-skel { background: var(--dp-surface-soft); border-radius: var(--dp-radius-sm); height: 0.9rem; }
.dp-trends-plot {
position: relative;
height: 20rem;
padding-left: 3rem;
}
.dp-trends-yaxis {
position: absolute;
left: 0;
top: 0;
bottom: 1.5rem;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 2.5rem;
}
.dp-trends-yaxis .dp-skel { height: 0.55rem; width: 100%; }
.dp-trends-area {
height: 100%;
border-left: 1px solid var(--dp-border);
border-bottom: 1px solid var(--dp-border);
background-image: repeating-linear-gradient(to top, transparent 0, transparent calc(20% - 1px), var(--dp-border) calc(20% - 1px), var(--dp-border) 20%);
}
.dp-trends-area svg { width: 100%; height: 100%; display: block; }
.dp-trends-msg {
position: absolute;
inset: 0 0 1.5rem 3rem;
display: flex;
align-items: center;
justify-content: center;
color: var(--dp-text-muted);
font-size: var(--dp-text-base);
}
.dp-trends-legend {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--dp-space-3) var(--dp-space-6);
margin-top: var(--dp-space-5);
padding-top: var(--dp-space-5);
border-top: 1px solid var(--dp-border);
}
.dp-trends-legend-row { display: flex; align-items: center; gap: var(--dp-space-3); }
.dp-trends-legend-row .dp-skel { flex: 1; height: 0.8rem; }
.dp-trends-legend-row svg { width: 1.1rem; height: 1.1rem; color: var(--dp-text-subtle); flex: none; }
The Migration insights tab of the dataset workspace: churn and growth over time with Overview and Custom comparison sub-tabs, shown in the empty state. Shares the workspace chrome.
Discover churn and growth movements within your dataset overtime
npx shadcn@latest add https://ds.dataprovider.dev/r/churn.json
Registry JSON
<!-- Migration insights view (workspace)
The Migration insights tab: churn and growth over time, with Overview and
Custom comparison sub-tabs. Empty state without a filter. Reuses the
workspace chrome. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg> Home</a>
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg> AI Navigator <span class="dp-nav-beta">Beta</span></a>
<div class="dp-nav-group"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg> Library</div>
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg> Files</a>
<div class="dp-nav-group"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg> Products</div>
<a class="dp-nav-item" data-active href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg> Search Engine</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user"><span class="dp-sidebar-user-name">Christian Branbergen</span><span class="dp-sidebar-user-org">Dataprovider BV</span></span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main" style="padding: 0;">
<div class="dp-ws">
<section class="dp-ws-card">
<div class="dp-ws-bar">
<div class="dp-ws-title">
<span class="dp-ws-title-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg></span>
Untitled dataset
</div>
<div class="dp-ws-actions">
<span class="dp-ws-product">Search Engine</span>
<a class="dp-ws-link" href="#">Monitor</a>
<a class="dp-ws-link" href="#">Send</a>
<span class="dp-ws-sep"></span>
<button class="dp-ws-textbtn" type="button">New</button>
<button class="dp-ws-textbtn" type="button">Save</button>
<button class="dp-btn" type="button" data-variant="secondary">Export</button>
</div>
</div>
<div class="dp-ws-filters">
<div class="dp-ws-filters-head">
<span class="dp-ws-filters-title">Filters</span>
<span class="dp-ws-sep"></span>
<span class="dp-ws-records">422,214,685 Records</span>
<span class="dp-ws-spacer"></span>
<button class="dp-ws-datepill" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18M8 2v4M16 2v4"></path></svg> Jun 2026</button>
<button class="dp-btn" type="button" data-variant="ai">Create dataset with AI <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 3l1.9 4.6L18.5 9l-4.6 1.9L12 15l-1.9-4.1L5.5 9l4.6-1.4z"></path></svg></button>
</div>
<div class="dp-ws-filter-row">
<select class="dp-select" aria-label="Field"><option>Field</option></select>
<select class="dp-select" aria-label="Operator"><option>Select...</option></select>
<input class="dp-input" type="text" placeholder="Value" />
</div>
<div class="dp-ws-filter-actions">
<button class="dp-btn" type="button" data-variant="secondary" data-size="sm">Add filter</button>
<button class="dp-ws-action" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 16 4 4 4-4"></path><path d="M7 20V4"></path><path d="m21 8-4-4-4 4"></path><path d="M17 4v16"></path></svg> Rearrange</button>
<button class="dp-ws-action" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg> Clear All</button>
<button class="dp-ws-action" type="button" style="margin-left: auto;"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg> Copy Query</button>
</div>
</div>
</section>
<section class="dp-ws-card">
<div class="dp-ws-tabs" role="tablist">
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14a9 3 0 0 0 18 0V5"></path><path d="M3 12a9 3 0 0 0 18 0"></path></svg> Sheet</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12A9 9 0 1 1 12 3v9z"></path><path d="M16 8a5 5 0 0 0-4-4"></path></svg> Statistics</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><path d="m19 9-5 5-4-4-3 3"></path></svg> Trends</button>
<button class="dp-ws-tab" type="button" data-active><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="3" height="7" x="7" y="11"></rect><rect width="3" height="11" x="13" y="7"></rect></svg> Migration insights</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3 3 5v16l6-2 6 2 6-2V3l-6 2-6-2z"></path><path d="M9 3v16M15 5v16"></path></svg> Maps</button>
</div>
<div class="dp-churn">
<h2 class="dp-churn-title">Migration insights</h2>
<p class="dp-churn-sub">Discover churn and growth movements within your dataset overtime</p>
<div class="dp-churn-tabs">
<button class="dp-churn-tab" type="button" data-active>Overview</button>
<button class="dp-churn-tab" type="button">Custom comparison</button>
</div>
<div class="dp-churn-empty">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12A9 9 0 1 1 12 3v9z"></path><path d="M12 3a9 9 0 0 1 9 9h-9z"></path></svg>
In order to view Churn, you must set a filter.
</div>
</div>
</section>
</div>
</main>
</div>
/* Migration insights view (workspace)
The Migration insights tab: churn and growth over time, with Overview and
Custom comparison sub-tabs. Without a filter it shows an empty state. Reuses
the workspace chrome (.dp-ws-*). */
.dp-churn { padding: var(--dp-space-6); }
.dp-churn-title {
margin: 0 0 var(--dp-space-1);
font-size: var(--dp-text-2xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-churn-sub {
margin: 0 0 var(--dp-space-5);
font-size: var(--dp-text-sm);
color: var(--dp-text-muted);
}
.dp-churn-tabs {
display: flex;
gap: var(--dp-space-6);
border-bottom: 1px solid var(--dp-border);
margin-bottom: var(--dp-space-6);
}
.dp-churn-tab {
appearance: none;
border: 0;
background: transparent;
padding: var(--dp-space-2) 0;
font-family: var(--dp-font-sans);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-text-muted);
border-bottom: 2px solid transparent;
margin-bottom: -1px;
cursor: pointer;
}
.dp-churn-tab[data-active] {
color: var(--dp-navy);
border-bottom-color: var(--dp-navy);
}
.dp-churn-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--dp-space-4);
height: 22rem;
border-radius: var(--dp-radius-lg);
background: var(--dp-surface-subtle);
color: var(--dp-text-muted);
font-size: var(--dp-text-base);
}
.dp-churn-empty svg { width: 5rem; height: 5rem; color: var(--dp-neutral-500); }
The Maps tab of the dataset workspace: a world map with a domain-density heatmap and zoom controls. Shares the workspace chrome.
npx shadcn@latest add https://ds.dataprovider.dev/r/maps.json
Registry JSON
<!-- Maps view (workspace)
The Maps tab: a world map with a domain-density heatmap and zoom controls.
The map is rendered by a mapping library at runtime; this block shows the
panel, zoom controls and a heatmap-style backdrop. Reuses the workspace
chrome. -->
<div class="dp-shell">
<nav class="dp-sidebar">
<div class="dp-sidebar-head">
<span class="dp-sidebar-logo">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</span>
<button class="dp-sidebar-collapse" type="button" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m11 17-5-5 5-5"></path><path d="m18 17-5-5 5-5"></path></svg>
</button>
</div>
<div class="dp-sidebar-nav">
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><path d="M9 22V12h6v10"></path></svg> Home</a>
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16 8-6 2-2 6 6-2z"></path></svg> AI Navigator <span class="dp-nav-beta">Beta</span></a>
<div class="dp-nav-group"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg> Library</div>
<a class="dp-nav-item" href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg> Files</a>
<div class="dp-nav-group"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg> Products</div>
<a class="dp-nav-item" data-active href="#"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path></svg> Search Engine</a>
</div>
<div class="dp-sidebar-foot">
<span class="dp-avatar" data-size="sm" style="background: var(--dp-accent-yellow, #ffd200); color: var(--dp-brand-purple, #2d145f);">CB</span>
<span class="dp-sidebar-user"><span class="dp-sidebar-user-name">Christian Branbergen</span><span class="dp-sidebar-user-org">Dataprovider BV</span></span>
<button class="dp-btn" type="button" data-variant="outline" data-size="sm">Log out</button>
</div>
</nav>
<main class="dp-shell-main" style="padding: 0;">
<div class="dp-ws">
<section class="dp-ws-card">
<div class="dp-ws-bar">
<div class="dp-ws-title">
<span class="dp-ws-title-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path></svg></span>
Untitled dataset
</div>
<div class="dp-ws-actions">
<span class="dp-ws-product">Search Engine</span>
<a class="dp-ws-link" href="#">Monitor</a>
<a class="dp-ws-link" href="#">Send</a>
<span class="dp-ws-sep"></span>
<button class="dp-ws-textbtn" type="button">New</button>
<button class="dp-ws-textbtn" type="button">Save</button>
<button class="dp-btn" type="button" data-variant="secondary">Export</button>
</div>
</div>
<div class="dp-ws-filters">
<div class="dp-ws-filters-head">
<span class="dp-ws-filters-title">Filters</span>
<span class="dp-ws-sep"></span>
<span class="dp-ws-records">422,214,685 Records</span>
<span class="dp-ws-spacer"></span>
<button class="dp-ws-datepill" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18M8 2v4M16 2v4"></path></svg> Jun 2026</button>
<button class="dp-btn" type="button" data-variant="ai">Create dataset with AI <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 3l1.9 4.6L18.5 9l-4.6 1.9L12 15l-1.9-4.1L5.5 9l4.6-1.4z"></path></svg></button>
</div>
<div class="dp-ws-filter-row">
<select class="dp-select" aria-label="Field"><option>Field</option></select>
<select class="dp-select" aria-label="Operator"><option>Select...</option></select>
<input class="dp-input" type="text" placeholder="Value" />
</div>
<div class="dp-ws-filter-actions">
<button class="dp-btn" type="button" data-variant="secondary" data-size="sm">Add filter</button>
<button class="dp-ws-action" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m3 16 4 4 4-4"></path><path d="M7 20V4"></path><path d="m21 8-4-4-4 4"></path><path d="M17 4v16"></path></svg> Rearrange</button>
<button class="dp-ws-action" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg> Clear All</button>
<button class="dp-ws-action" type="button" style="margin-left: auto;"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg> Copy Query</button>
</div>
</div>
</section>
<section class="dp-ws-card">
<div class="dp-ws-tabs" role="tablist">
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14a9 3 0 0 0 18 0V5"></path><path d="M3 12a9 3 0 0 0 18 0"></path></svg> Sheet</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12A9 9 0 1 1 12 3v9z"></path><path d="M16 8a5 5 0 0 0-4-4"></path></svg> Statistics</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><path d="m19 9-5 5-4-4-3 3"></path></svg> Trends</button>
<button class="dp-ws-tab" type="button"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="3" height="7" x="7" y="11"></rect><rect width="3" height="11" x="13" y="7"></rect></svg> Migration insights</button>
<button class="dp-ws-tab" type="button" data-active><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3 3 5v16l6-2 6 2 6-2V3l-6 2-6-2z"></path><path d="M9 3v16M15 5v16"></path></svg> Maps</button>
</div>
<div class="dp-map">
<div class="dp-map-zoom">
<button type="button" aria-label="Zoom in"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14M5 12h14"></path></svg></button>
<button type="button" aria-label="Zoom out"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"></path></svg></button>
</div>
<span class="dp-map-note">Heatmap rendered by the mapping library at runtime.</span>
</div>
</section>
</div>
</main>
</div>
/* Maps view (workspace)
The Maps tab: a full-bleed world map with a density heatmap and zoom
controls. The map itself is rendered by a mapping library at runtime; this
block shows the panel, zoom controls and a heatmap-style backdrop. Reuses the
workspace chrome (.dp-ws-*). */
.dp-map {
position: relative;
height: 30rem;
overflow: hidden;
background: var(--dp-blue-200);
}
/* A heatmap-style backdrop approximating domain density */
.dp-map::before {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(circle at 22% 42%, rgba(239, 68, 68, 0.75) 0, rgba(239, 68, 68, 0) 12%),
radial-gradient(circle at 30% 38%, rgba(250, 204, 21, 0.6) 0, rgba(250, 204, 21, 0) 9%),
radial-gradient(circle at 52% 40%, rgba(239, 68, 68, 0.8) 0, rgba(239, 68, 68, 0) 16%),
radial-gradient(circle at 58% 36%, rgba(45, 75, 255, 0.5) 0, rgba(45, 75, 255, 0) 10%),
radial-gradient(circle at 70% 44%, rgba(239, 68, 68, 0.7) 0, rgba(239, 68, 68, 0) 13%),
radial-gradient(circle at 47% 62%, rgba(239, 68, 68, 0.65) 0, rgba(239, 68, 68, 0) 9%),
radial-gradient(circle at 82% 66%, rgba(250, 204, 21, 0.55) 0, rgba(250, 204, 21, 0) 8%),
radial-gradient(circle at 40% 30%, rgba(34, 211, 238, 0.4) 0, rgba(34, 211, 238, 0) 8%);
filter: blur(2px);
}
.dp-map-zoom {
position: absolute;
top: var(--dp-space-4);
right: var(--dp-space-4);
display: flex;
flex-direction: column;
gap: var(--dp-space-2);
z-index: 1;
}
.dp-map-zoom button {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-full);
background: var(--dp-surface);
color: var(--dp-navy);
cursor: pointer;
}
.dp-map-zoom svg { width: 1.1rem; height: 1.1rem; }
.dp-map-note {
position: absolute;
left: var(--dp-space-4);
bottom: var(--dp-space-4);
z-index: 1;
font-size: var(--dp-text-xs);
color: var(--dp-text-muted);
background: rgba(255, 255, 255, 0.8);
padding: 2px var(--dp-space-2);
border-radius: var(--dp-radius-xs);
}
A marketing homepage composed from site-header, hero, feature-cards, cta-band and site-footer. A template for building new pages in the Dataprovider style.
Track companies and technologies across 99% of all registered domains worldwide; every TLD, every ccTLD, refreshed monthly.
Put structured web data to work across your organisation.
Keep a live inventory of every domain, subdomain and technology your organisation runs.
Read moreDetect look-alike domains and infringements before they reach your customers.
Read moreEnrich company records with technographics, contact data and firmographics.
Read moreBook a free demo
npx shadcn@latest add https://ds.dataprovider.dev/r/home.json
Registry JSON
<!-- Home page block
A marketing homepage composed from site-header, hero, feature-cards,
cta-band and site-footer. Marketing theme (no data-theme). Swap the section
content to build any new page in the Dataprovider style. -->
<div class="dp-page">
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
<main>
<section class="dp-hero">
<h1 class="dp-hero-title"><span class="light">The complete web,</span><br>structured in one place</h1>
<p class="dp-hero-sub">Track companies and technologies across 99% of all registered domains worldwide; every TLD, every ccTLD, refreshed monthly.</p>
<div class="dp-hero-preview">
<div class="dp-hero-tabs" role="tablist">
<button class="dp-hero-tab" type="button">Discover</button>
<button class="dp-hero-tab" type="button" data-active>Map</button>
<button class="dp-hero-tab" type="button">Analyze</button>
<button class="dp-hero-tab" type="button">Automate</button>
</div>
<div class="dp-hero-stage">
<div class="dp-hero-card">
<div class="dp-hero-card-label">Online stores in California</div>
<div class="dp-hero-card-row">
<span class="dp-hero-card-val">13.217</span>
<span class="dp-hero-card-pct">12.0%</span>
</div>
</div>
</div>
</div>
</section>
<section class="dp-fsection">
<div class="dp-fsection-head">
<h2 class="dp-fsection-title">One dataset, many use cases</h2>
<p class="dp-fsection-sub">Put structured web data to work across your organisation.</p>
</div>
<div class="dp-fc-grid">
<article class="dp-fc">
<span class="dp-fc-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 7h-9"></path><path d="M14 17H5"></path><circle cx="17" cy="17" r="3"></circle><circle cx="7" cy="7" r="3"></circle></svg></span>
<h3 class="dp-fc-title">Asset management</h3>
<p class="dp-fc-desc">Keep a live inventory of every domain, subdomain and technology your organisation runs.</p>
<a class="dp-btn" data-variant="outline" href="/cases/assets/">Read more</a>
</article>
<article class="dp-fc">
<span class="dp-fc-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"></path></svg></span>
<h3 class="dp-fc-title">Online brand protection</h3>
<p class="dp-fc-desc">Detect look-alike domains and infringements before they reach your customers.</p>
<a class="dp-btn" data-variant="outline" href="/cases/brand-protection/">Read more</a>
</article>
<article class="dp-fc">
<span class="dp-fc-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="4" height="7" x="7" y="10"></rect><rect width="4" height="12" x="15" y="5"></rect></svg></span>
<h3 class="dp-fc-title">Business information</h3>
<p class="dp-fc-desc">Enrich company records with technographics, contact data and firmographics.</p>
<a class="dp-btn" data-variant="outline" href="/cases/business-information/">Read more</a>
</article>
</div>
</section>
<div class="dp-page-section">
<section class="dp-cta-band">
<div class="dp-cta-lead">
<p class="dp-cta-eyebrow">Book a free demo</p>
<h2 class="dp-cta-heading">And move from guesswork <span class="light">to data-driven decisions</span></h2>
</div>
<ul class="dp-cta-list">
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> A personalised demo, not a sales pitch</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Completely free, zero obligations</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 30 to 60 minutes based on your needs</li>
</ul>
<div class="dp-cta-action">
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<a class="dp-btn" data-variant="cta" href="/contact/">Get your data advantage <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></a>
</div>
</section>
</div>
</main>
<footer class="dp-site-footer">
<div class="dp-footer-inner">
<div class="dp-footer-cols">
<div class="dp-footer-col">
<h4>Our data</h4>
<ul>
<li><a href="/our-data/domain/">Domain</a></li>
<li><a href="/our-data/business/">Business</a></li>
<li><a href="/our-data/technology/">Technology detection</a></li>
<li><a href="/our-data/classifications/">Classifications</a></li>
<li><a href="/our-data/engagement/">Engagement</a></li>
<li><a href="/our-data/risk/">Risk</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Data Access</h4>
<ul>
<li><a href="/data-access/search-engine/">Search engine</a></li>
<li><a href="/data-access/ai-navigator-mcp/">AI navigator + MCP</a></li>
<li><a href="/data-access/dashboards/">Dashboards</a></li>
<li><a href="/data-access/data-warehouses/">Data warehouses</a></li>
<li><a href="/data-access/know-your-business/">Know your business</a></li>
<li><a href="/recipes/">Recipes</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Use Cases</h4>
<ul>
<li><a href="/cases/assets/">Asset management</a></li>
<li><a href="/cases/brand-protection/">Online brand protection</a></li>
<li><a href="/cases/business-information/">Business information</a></li>
<li><a href="/cases/registries-registrars/">Registries & registrars</a></li>
<li><a href="/cases/public/">Public sector</a></li>
<li><a href="/cases/psp/">Payment service providers</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Company</h4>
<ul>
<li><a href="/about/">About us</a></li>
<li><a href="/contact/">Contact</a></li>
<li><a href="/crawler/">Crawler</a></li>
</ul>
</div>
</div>
<div class="dp-footer-mcp">
<div class="dp-footer-mcp-head">MCP <span class="dp-footer-new">New</span></div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: var(--dp-navy);"><circle cx="12" cy="12" r="10"></circle></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>ChatGPT</b></span>
</div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: #d97757;"><path d="M12 2v20M2 12h20M5 5l14 14M19 5 5 19"></path></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>Claude</b></span>
</div>
</div>
</div>
</footer>
</div>
/* Home page block
A marketing homepage composed from site-header, hero, feature-cards, cta-band
and site-footer. Marketing theme. */
.dp-page {
min-height: 100%;
background: var(--dp-bg);
}
.dp-page-section {
max-width: 72rem;
margin: 0 auto;
padding: 0 var(--dp-space-6) var(--dp-space-12);
}
A marketing use-case page composed from site-header, split sections, a stats band, an FAQ, a CTA band and site-footer. A second page template in the Dataprovider style.
Use case · Asset management
Discover forgotten subdomains, track the technologies your teams run, and keep a single source of truth for your entire web estate.
Continuous discovery
Match your brand and infrastructure against the full web to surface shadow IT, expired certificates and unmanaged subdomains before they become a risk.
Book a free demo
npx shadcn@latest add https://ds.dataprovider.dev/r/use-case.json
Registry JSON
<!-- Use case page block
A marketing use-case page (Asset management) composed from site-header,
split sections, a stats band, an FAQ, a CTA band and site-footer. Shows how
the same section components build a different page. Marketing theme. -->
<div style="min-height: 100%; background: var(--dp-bg);">
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
<main>
<!-- Intro (split used as page hero) -->
<section class="dp-split">
<div class="dp-split-body">
<p class="dp-split-eyebrow">Use case · Asset management</p>
<h1 class="dp-split-title">Every domain and technology you own, in one live inventory</h1>
<p class="dp-split-text">Discover forgotten subdomains, track the technologies your teams run, and keep a single source of truth for your entire web estate.</p>
<div style="display: flex; gap: var(--dp-space-4);">
<a class="dp-btn" data-variant="cta" href="/contact/">Book a free demo</a>
<a class="dp-btn" data-variant="outline" href="/data-access/search-engine/">See the data</a>
</div>
</div>
<div class="dp-split-media">
<div class="dp-split-media-card"><b>1.204</b> assets found · <b>37</b> new this month</div>
</div>
</section>
<!-- Stats -->
<section class="dp-stats-band">
<div class="dp-stat-big"><div class="dp-stat-big-val">400M+</div><div class="dp-stat-big-label">Domains to match against</div></div>
<div class="dp-stat-big"><div class="dp-stat-big-val">700+</div><div class="dp-stat-big-label">Attributes per asset</div></div>
<div class="dp-stat-big"><div class="dp-stat-big-val">Monthly</div><div class="dp-stat-big-label">Automatic refresh</div></div>
<div class="dp-stat-big"><div class="dp-stat-big-val">CSV / API</div><div class="dp-stat-big-label">Export anywhere</div></div>
</section>
<!-- Reversed split -->
<section class="dp-split" data-reverse>
<div class="dp-split-body">
<p class="dp-split-eyebrow">Continuous discovery</p>
<h2 class="dp-split-title">Find the assets you did not know you had</h2>
<p class="dp-split-text">Match your brand and infrastructure against the full web to surface shadow IT, expired certificates and unmanaged subdomains before they become a risk.</p>
<ul class="dp-split-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Subdomain and certificate discovery</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Ownership and hosting mapping</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Alerts on new or changed assets</li>
</ul>
</div>
<div class="dp-split-media">
<div class="dp-split-media-card"><b>3</b> expired SSL certificates flagged</div>
</div>
</section>
<!-- FAQ -->
<section class="dp-faq">
<h2 class="dp-faq-title">Asset management FAQ</h2>
<div class="dp-accordion">
<details open>
<summary>How do you match assets to my organisation?<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></summary>
<div class="dp-accordion-content">Match on brand terms, registrant details, hosting and technology fingerprints across the full dataset.</div>
</details>
<details>
<summary>Can I get alerts on new assets?<svg class="dp-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></summary>
<div class="dp-accordion-content">Yes. Save a query and receive monthly alerts when new matching assets appear.</div>
</details>
</div>
</section>
<!-- CTA -->
<div style="max-width: 72rem; margin: 0 auto; padding: 0 var(--dp-space-6) var(--dp-space-12);">
<section class="dp-cta-band">
<div class="dp-cta-lead">
<p class="dp-cta-eyebrow">Book a free demo</p>
<h2 class="dp-cta-heading">And move from guesswork <span class="light">to data-driven decisions</span></h2>
</div>
<ul class="dp-cta-list">
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> A personalised demo, not a sales pitch</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Completely free, zero obligations</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 30 to 60 minutes based on your needs</li>
</ul>
<div class="dp-cta-action">
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<a class="dp-btn" data-variant="cta" href="/contact/">Get your data advantage <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></a>
</div>
</section>
</div>
</main>
<footer class="dp-site-footer">
<div class="dp-footer-inner">
<div class="dp-footer-cols">
<div class="dp-footer-col">
<h4>Our data</h4>
<ul>
<li><a href="/our-data/domain/">Domain</a></li>
<li><a href="/our-data/business/">Business</a></li>
<li><a href="/our-data/technology/">Technology detection</a></li>
<li><a href="/our-data/risk/">Risk</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Data Access</h4>
<ul>
<li><a href="/data-access/search-engine/">Search engine</a></li>
<li><a href="/data-access/ai-navigator-mcp/">AI navigator + MCP</a></li>
<li><a href="/data-access/dashboards/">Dashboards</a></li>
<li><a href="/recipes/">Recipes</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Use Cases</h4>
<ul>
<li><a href="/cases/assets/">Asset management</a></li>
<li><a href="/cases/brand-protection/">Online brand protection</a></li>
<li><a href="/cases/business-information/">Business information</a></li>
<li><a href="/cases/public/">Public sector</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Company</h4>
<ul>
<li><a href="/about/">About us</a></li>
<li><a href="/contact/">Contact</a></li>
<li><a href="/crawler/">Crawler</a></li>
</ul>
</div>
</div>
<div class="dp-footer-mcp">
<div class="dp-footer-mcp-head">MCP <span class="dp-footer-new">New</span></div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: var(--dp-navy);"><circle cx="12" cy="12" r="10"></circle></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>ChatGPT</b></span>
</div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: #d97757;"><path d="M12 2v20M2 12h20M5 5l14 14M19 5 5 19"></path></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>Claude</b></span>
</div>
</div>
</div>
</footer>
</div>
A marketing company page composed from a hero, a statement, a logo cloud, a split section, a timeline, a team grid, a CTA band and site-footer.
About us
Headquartered in the Netherlands, we combine European roots with global reach, fully independent and free from external investors.
It started in 2009, when Christian Branbergen, Gijs Barends and Marc Noël set out to do what seemed almost impossible: summarise and structure the entire web.
What began as a small team of data enthusiasts has grown into a trusted partner for organisations like PayPal, GoDaddy and MarkMonitor. We collect and structure all our data ourselves, running a powerful hosting cluster in the Netherlands.
Trusted by the most data-driven enterprises
Dutch datastructurers
From the air, the Netherlands looks like a blueprint: every field, road and canal perfectly measured. We have always believed in order and clarity, so it is no coincidence that we set out to bring the same structure to the internet.
2012
After three years of development, Dataprovider.com launches with one mission: make the internet searchable, measurable and explainable.
2017
The platform expands to crawl the entire web, covering hundreds of millions of domains every month.
2023
We launch the largest continuously updated SSL dataset and open direct access through Snowflake and Google Cloud.
2024
In partnership with Quad9 we introduce the Connection Index, a signal measuring real user engagement across the web.
Team
Book a free demo
npx shadcn@latest add https://ds.dataprovider.dev/r/about.json
Registry JSON
<!-- About page block
A marketing company page composed from a hero with an inline stat row and
photo strip, a statement, a logo cloud, a split section, a timeline, a
team grid, a CTA band and site-footer. Shows the same section components
building a company page. Marketing theme. -->
<div style="min-height: 100%; background: var(--dp-bg);">
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
<main>
<!-- Hero with inline stat row and photo strip -->
<section class="dp-about-hero">
<p class="dp-about-eyebrow">About us</p>
<h1 class="dp-about-title">Founded in the Netherlands, <span class="bold">structuring the world</span></h1>
<p class="dp-about-sub">Headquartered in the Netherlands, we combine European roots with global reach, fully independent and free from external investors.</p>
<dl class="dp-about-stats">
<div><dt>Founded in</dt><dd>2012</dd></div>
<div><dt>Location</dt><dd>The Netherlands</dd></div>
<div><dt>Employees</dt><dd>30+</dd></div>
</dl>
<div class="dp-about-gallery" aria-hidden="true">
<span class="dp-about-tile" data-tint="a"></span>
<span class="dp-about-tile" data-tint="b"></span>
<span class="dp-about-tile" data-tint="c"></span>
<span class="dp-about-tile" data-tint="d"></span>
<span class="dp-about-tile" data-tint="e"></span>
</div>
</section>
<!-- Statement -->
<section class="dp-statement">
<h2 class="dp-statement-lead">The web is the world's greatest source of information chaos.</h2>
<div class="dp-statement-body">
<p>It started in 2009, when Christian Branbergen, Gijs Barends and Marc Noël set out to do what seemed almost impossible: summarise and structure the entire web.</p>
<p>What began as a small team of data enthusiasts has grown into a trusted partner for organisations like PayPal, GoDaddy and MarkMonitor. We collect and structure all our data ourselves, running a powerful hosting cluster in the Netherlands.</p>
</div>
</section>
<!-- Logo cloud -->
<section class="dp-logos">
<p class="dp-logos-label">Trusted by the most data-driven enterprises</p>
<div class="dp-logos-row">
<span class="dp-logo-item">Meta</span>
<span class="dp-logo-item">PayPal</span>
<span class="dp-logo-item">GoDaddy</span>
<span class="dp-logo-item">M Science</span>
<span class="dp-logo-item">Dun & Bradstreet</span>
<span class="dp-logo-item">Nominet</span>
</div>
</section>
<!-- Split -->
<section class="dp-split">
<div class="dp-split-media">
<div class="dp-split-media-card"><b>Verified</b> search engine at Cloudflare</div>
</div>
<div class="dp-split-body">
<p class="dp-split-eyebrow">Dutch datastructurers</p>
<h2 class="dp-split-title">Structure is our nature</h2>
<p class="dp-split-text">From the air, the Netherlands looks like a blueprint: every field, road and canal perfectly measured. We have always believed in order and clarity, so it is no coincidence that we set out to bring the same structure to the internet.</p>
<ul class="dp-split-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Transparent, identifiable crawlers</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> We respect robots.txt</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Data collected and structured in house</li>
</ul>
</div>
</section>
<!-- Timeline -->
<section class="dp-timeline">
<ol class="dp-timeline-track">
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2012</p>
<h3 class="dp-timeline-heading">Dataprovider.com starts</h3>
<p class="dp-timeline-text">After three years of development, Dataprovider.com launches with one mission: make the internet searchable, measurable and explainable.</p>
</div>
</li>
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2017</p>
<h3 class="dp-timeline-heading">Global monthly coverage</h3>
<p class="dp-timeline-text">The platform expands to crawl the entire web, covering hundreds of millions of domains every month.</p>
</div>
</li>
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2023</p>
<h3 class="dp-timeline-heading">SSL Catalog and warehouse access</h3>
<p class="dp-timeline-text">We launch the largest continuously updated SSL dataset and open direct access through Snowflake and Google Cloud.</p>
</div>
</li>
<li class="dp-timeline-item">
<div class="dp-timeline-marker" aria-hidden="true"></div>
<div class="dp-timeline-card">
<p class="dp-timeline-year">2024</p>
<h3 class="dp-timeline-heading">Quad9 Connection Index</h3>
<p class="dp-timeline-text">In partnership with Quad9 we introduce the Connection Index, a signal measuring real user engagement across the web.</p>
</div>
</li>
</ol>
</section>
<!-- Team -->
<section class="dp-team">
<p class="dp-team-eyebrow">Team</p>
<h2 class="dp-team-title">Meet our leadership team</h2>
<div class="dp-team-grid">
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="MN" aria-hidden="true"></div>
<p class="dp-team-role">Co-founder</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Marc Noël</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Marc Noël on LinkedIn"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg></a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="CB" aria-hidden="true"></div>
<p class="dp-team-role">Co-founder</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Christian Branbergen</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Christian Branbergen on LinkedIn"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg></a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="GB" aria-hidden="true"></div>
<p class="dp-team-role">Co-founder</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Gijs Barends</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Gijs Barends on LinkedIn"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg></a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="MP" aria-hidden="true"></div>
<p class="dp-team-role">Privacy officer</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Martin Plak</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Martin Plak on LinkedIn"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg></a>
</div>
</article>
<article class="dp-team-card">
<div class="dp-team-photo" data-initials="RM" aria-hidden="true"></div>
<p class="dp-team-role">Legal counsel</p>
<div class="dp-team-name-row">
<h3 class="dp-team-name">Rutger Middendorf</h3>
<a class="dp-team-social" href="https://www.linkedin.com/company/dataprovidercom/" aria-label="Rutger Middendorf on LinkedIn"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.22.79 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg></a>
</div>
</article>
</div>
</section>
<!-- CTA -->
<div style="max-width: 72rem; margin: 0 auto; padding: 0 var(--dp-space-6) var(--dp-space-12);">
<section class="dp-cta-band">
<div class="dp-cta-lead">
<p class="dp-cta-eyebrow">Book a free demo</p>
<h2 class="dp-cta-heading">And move from guesswork <span class="light">to data-driven decisions</span></h2>
</div>
<ul class="dp-cta-list">
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> A personalised demo, not a sales pitch</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Completely free, zero obligations</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 30 to 60 minutes based on your needs</li>
</ul>
<div class="dp-cta-action">
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<a class="dp-btn" data-variant="cta" href="/contact/">Get your data advantage <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></a>
</div>
</section>
</div>
</main>
<footer class="dp-site-footer">
<div class="dp-footer-inner">
<div class="dp-footer-cols">
<div class="dp-footer-col">
<h4>Our data</h4>
<ul>
<li><a href="/our-data/domain/">Domain</a></li>
<li><a href="/our-data/business/">Business</a></li>
<li><a href="/our-data/technology/">Technology detection</a></li>
<li><a href="/our-data/risk/">Risk</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Data Access</h4>
<ul>
<li><a href="/data-access/search-engine/">Search engine</a></li>
<li><a href="/data-access/ai-navigator-mcp/">AI navigator + MCP</a></li>
<li><a href="/data-access/dashboards/">Dashboards</a></li>
<li><a href="/recipes/">Recipes</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Use Cases</h4>
<ul>
<li><a href="/cases/assets/">Asset management</a></li>
<li><a href="/cases/brand-protection/">Online brand protection</a></li>
<li><a href="/cases/business-information/">Business information</a></li>
<li><a href="/cases/public/">Public sector</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Company</h4>
<ul>
<li><a href="/about/">About us</a></li>
<li><a href="/contact/">Contact</a></li>
<li><a href="/crawler/">Crawler</a></li>
</ul>
</div>
</div>
<div class="dp-footer-mcp">
<div class="dp-footer-mcp-head">MCP <span class="dp-footer-new">New</span></div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: var(--dp-navy);"><circle cx="12" cy="12" r="10"></circle></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>ChatGPT</b></span>
</div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: #d97757;"><path d="M12 2v20M2 12h20M5 5l14 14M19 5 5 19"></path></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>Claude</b></span>
</div>
</div>
</div>
</footer>
</div>
/* About page
Page-specific styles for the About hero (eyebrow, two-tone title, inline
stat row and photo strip). Every other section on the page reuses its own
component CSS. Colour and type from tokens.css (marketing theme). */
.dp-about-hero {
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6) var(--dp-space-8);
}
.dp-about-eyebrow {
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-link);
}
.dp-about-title {
max-width: 20ch;
margin: 0 0 var(--dp-space-5);
font-size: var(--dp-text-5xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-light);
color: var(--dp-navy);
}
.dp-about-title .bold { font-weight: var(--dp-weight-bold); }
.dp-about-sub {
max-width: 46ch;
margin: 0 0 var(--dp-space-8);
font-size: var(--dp-text-lg);
color: var(--dp-text-muted);
}
.dp-about-stats {
display: flex;
flex-wrap: wrap;
gap: var(--dp-space-10);
margin: 0 0 var(--dp-space-10);
padding: 0;
}
.dp-about-stats div {
display: flex;
flex-direction: column;
gap: var(--dp-space-1);
}
.dp-about-stats dt {
font-size: var(--dp-text-xs);
font-weight: var(--dp-weight-bold);
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--dp-text-muted);
}
.dp-about-stats dd {
margin: 0;
font-size: var(--dp-text-xl);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-about-gallery {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: var(--dp-space-4);
}
@media (max-width: 720px) { .dp-about-gallery { grid-template-columns: repeat(2, 1fr); } }
.dp-about-tile {
aspect-ratio: 4 / 5;
border-radius: var(--dp-radius-lg);
background: linear-gradient(135deg, var(--dp-blue-200), var(--dp-blue-100));
}
.dp-about-tile[data-tint="b"] { background: linear-gradient(135deg, var(--dp-navy), var(--dp-blue-700)); }
.dp-about-tile[data-tint="c"] { background: linear-gradient(135deg, var(--dp-gold-300), var(--dp-gold-50)); }
.dp-about-tile[data-tint="d"] { background: linear-gradient(135deg, var(--dp-blue-100), var(--dp-blue-200)); }
.dp-about-tile[data-tint="e"] { background: linear-gradient(135deg, var(--dp-neutral-200), var(--dp-neutral-100)); }
A marketing contact page composed from site-header, the contact-form section, a logo cloud, a CTA band and site-footer.
Contact
Trusted by the most data-driven enterprises
Book a free demo
npx shadcn@latest add https://ds.dataprovider.dev/r/contact.json
Registry JSON
<!-- Contact page block
A marketing contact page composed from site-header, the contact-form
section, a logo cloud, a CTA band and site-footer. Marketing theme. -->
<div style="min-height: 100%; background: var(--dp-bg);">
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
<main>
<!-- Contact form -->
<section class="dp-cform">
<div class="dp-cform-head">
<p class="dp-cform-eyebrow">Contact</p>
<h2 class="dp-cform-title">Your competitive edge awaits <span class="light">Book a personalised demo</span></h2>
</div>
<div class="dp-cform-panel">
<form class="dp-cform-form" action="#" method="post">
<div class="dp-cform-row">
<div class="dp-field">
<label class="dp-field-label" for="cf-first">First name</label>
<input class="dp-field-input" id="cf-first" name="first_name" type="text" autocomplete="given-name">
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-last">Last name</label>
<input class="dp-field-input" id="cf-last" name="last_name" type="text" autocomplete="family-name">
</div>
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-email">Work email</label>
<input class="dp-field-input" id="cf-email" name="email" type="email" autocomplete="email">
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-company">Company or organisation name</label>
<input class="dp-field-input" id="cf-company" name="company" type="text" autocomplete="organization">
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-why">Why would you like to try Dataprovider.com?</label>
<textarea class="dp-field-input" id="cf-why" name="reason" rows="3"></textarea>
</div>
<div class="dp-field">
<label class="dp-field-label" for="cf-source">How did you hear about us?</label>
<select class="dp-field-input" id="cf-source" name="source">
<option value="">Please select</option>
<option value="search">Search engine</option>
<option value="social">Social media</option>
<option value="referral">Referral</option>
<option value="event">Event or conference</option>
<option value="other">Other</option>
</select>
</div>
<label class="dp-cform-check">
<input type="checkbox" name="newsletter" value="yes">
<span>Subscribe to our newsletter.</span>
</label>
<button class="dp-btn" data-variant="cta" type="submit">Request a free demo</button>
</form>
<aside class="dp-cform-aside">
<h3 class="dp-cform-aside-title">What can you expect?</h3>
<ul class="dp-cform-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> A personalised demo, not a sales pitch</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Completely free, zero obligations</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 30 to 60 minutes based on your needs</li>
</ul>
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<div class="dp-cform-locations">
<p class="dp-cform-loc-label">Locations</p>
<div class="dp-cform-loc-grid">
<address class="dp-cform-loc">
<span class="dp-cform-loc-name">Operations</span>
Van Elmptstraat 10<br>
9723 ZL Groningen<br>
The Netherlands
</address>
<address class="dp-cform-loc">
<span class="dp-cform-loc-name">International</span>
Weesperplein 4b<br>
1018 XA Amsterdam<br>
The Netherlands
</address>
</div>
</div>
</aside>
</div>
</section>
<!-- Logo cloud -->
<section class="dp-logos">
<p class="dp-logos-label">Trusted by the most data-driven enterprises</p>
<div class="dp-logos-row">
<span class="dp-logo-item">Meta</span>
<span class="dp-logo-item">PayPal</span>
<span class="dp-logo-item">GoDaddy</span>
<span class="dp-logo-item">M Science</span>
<span class="dp-logo-item">Dun & Bradstreet</span>
<span class="dp-logo-item">Nominet</span>
</div>
</section>
<!-- CTA -->
<div style="max-width: 72rem; margin: 0 auto; padding: 0 var(--dp-space-6) var(--dp-space-12);">
<section class="dp-cta-band">
<div class="dp-cta-lead">
<p class="dp-cta-eyebrow">Book a free demo</p>
<h2 class="dp-cta-heading">And move from guesswork <span class="light">to data-driven decisions</span></h2>
</div>
<ul class="dp-cta-list">
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> A personalised demo, not a sales pitch</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Completely free, zero obligations</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 30 to 60 minutes based on your needs</li>
</ul>
<div class="dp-cta-action">
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<a class="dp-btn" data-variant="cta" href="/contact/">Get your data advantage <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></a>
</div>
</section>
</div>
</main>
<footer class="dp-site-footer">
<div class="dp-footer-inner">
<div class="dp-footer-cols">
<div class="dp-footer-col">
<h4>Our data</h4>
<ul>
<li><a href="/our-data/domain/">Domain</a></li>
<li><a href="/our-data/business/">Business</a></li>
<li><a href="/our-data/technology/">Technology detection</a></li>
<li><a href="/our-data/risk/">Risk</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Data Access</h4>
<ul>
<li><a href="/data-access/search-engine/">Search engine</a></li>
<li><a href="/data-access/ai-navigator-mcp/">AI navigator + MCP</a></li>
<li><a href="/data-access/dashboards/">Dashboards</a></li>
<li><a href="/recipes/">Recipes</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Use Cases</h4>
<ul>
<li><a href="/cases/assets/">Asset management</a></li>
<li><a href="/cases/brand-protection/">Online brand protection</a></li>
<li><a href="/cases/business-information/">Business information</a></li>
<li><a href="/cases/public/">Public sector</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Company</h4>
<ul>
<li><a href="/about/">About us</a></li>
<li><a href="/contact/">Contact</a></li>
<li><a href="/crawler/">Crawler</a></li>
</ul>
</div>
</div>
<div class="dp-footer-mcp">
<div class="dp-footer-mcp-head">MCP <span class="dp-footer-new">New</span></div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: var(--dp-navy);"><circle cx="12" cy="12" r="10"></circle></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>ChatGPT</b></span>
</div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: #d97757;"><path d="M12 2v20M2 12h20M5 5l14 14M19 5 5 19"></path></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>Claude</b></span>
</div>
</div>
</div>
</footer>
</div>
A marketing product page (Domain data) composed from a split hero, a statement, a feature-cards grid, a reversed split, a stats band, a CTA band and site-footer. The dominant page template on the site.
Our data · Domain
Every domain is a starting point. Resolve it to the company, technology, contact details and risk signals behind it, across the entire web.
We crawl every registered domain worldwide and rebuild the full dataset every month, so the picture you work with is complete and current.
Each domain carries more than 700 structured attributes, from hosting and technology to company details and engagement signals, all linked back to a single record.
One record ties together everything the web reveals about a business.
Names, registration numbers, contact data and firmographics resolved from the domain.
Read morePlatforms, payment providers, analytics and hosting detected across the site.
Read moreCertificate health, look-alike domains and other indicators for compliance teams.
Read moreFrom detection to context
Combine raw detections with classifications and history to answer the questions that matter: who owns this, what do they sell, and how is it changing.
Book a free demo
npx shadcn@latest add https://ds.dataprovider.dev/r/data-product.json
Registry JSON
<!-- Data product page block
A marketing product page (Domain data) composed from site-header, a split
hero, a statement, a feature-cards grid, a reversed split, a stats band, a
CTA band and site-footer. This is the dominant page template on the site:
every "Our data" and "Data access" page follows the same skeleton.
Marketing theme. -->
<div style="min-height: 100%; background: var(--dp-bg);">
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
<main>
<!-- Hero -->
<section class="dp-split">
<div class="dp-split-body">
<p class="dp-split-eyebrow">Our data · Domain</p>
<h1 class="dp-split-title">Start with a domain, discover the business behind it</h1>
<p class="dp-split-text">Every domain is a starting point. Resolve it to the company, technology, contact details and risk signals behind it, across the entire web.</p>
<div style="display: flex; gap: var(--dp-space-4);">
<a class="dp-btn" data-variant="cta" href="/contact/">Book a free demo</a>
<a class="dp-btn" data-variant="outline" href="/data-access/search-engine/">See the data</a>
</div>
</div>
<div class="dp-split-media">
<div class="dp-split-media-card"><b>example.com</b> resolved to 42 data points</div>
</div>
</section>
<!-- Concept statement -->
<section class="dp-statement">
<h2 class="dp-statement-lead">Structuring the web: turning chaos into clarity.</h2>
<div class="dp-statement-body">
<p>We crawl every registered domain worldwide and rebuild the full dataset every month, so the picture you work with is complete and current.</p>
<p>Each domain carries more than 700 structured attributes, from hosting and technology to company details and engagement signals, all linked back to a single record.</p>
</div>
</section>
<!-- Feature grid -->
<section class="dp-fsection">
<div class="dp-fsection-head">
<h2 class="dp-fsection-title">Insights from every domain</h2>
<p class="dp-fsection-sub">One record ties together everything the web reveals about a business.</p>
</div>
<div class="dp-fc-grid">
<article class="dp-fc">
<span class="dp-fc-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"></path><rect width="4" height="7" x="7" y="10"></rect><rect width="4" height="12" x="15" y="5"></rect></svg></span>
<h3 class="dp-fc-title">Company details</h3>
<p class="dp-fc-desc">Names, registration numbers, contact data and firmographics resolved from the domain.</p>
<a class="dp-btn" data-variant="outline" href="/our-data/business/">Read more</a>
</article>
<article class="dp-fc">
<span class="dp-fc-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 7h-9"></path><path d="M14 17H5"></path><circle cx="17" cy="17" r="3"></circle><circle cx="7" cy="7" r="3"></circle></svg></span>
<h3 class="dp-fc-title">Technology stack</h3>
<p class="dp-fc-desc">Platforms, payment providers, analytics and hosting detected across the site.</p>
<a class="dp-btn" data-variant="outline" href="/our-data/technology/">Read more</a>
</article>
<article class="dp-fc">
<span class="dp-fc-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"></path></svg></span>
<h3 class="dp-fc-title">Risk signals</h3>
<p class="dp-fc-desc">Certificate health, look-alike domains and other indicators for compliance teams.</p>
<a class="dp-btn" data-variant="outline" href="/our-data/risk/">Read more</a>
</article>
</div>
</section>
<!-- Detail split -->
<section class="dp-split" data-reverse>
<div class="dp-split-body">
<p class="dp-split-eyebrow">From detection to context</p>
<h2 class="dp-split-title">Not just what a site runs, but what it means</h2>
<p class="dp-split-text">Combine raw detections with classifications and history to answer the questions that matter: who owns this, what do they sell, and how is it changing.</p>
<ul class="dp-split-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Industry and product classifications</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Historical change tracking</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Ownership and hosting links</li>
</ul>
</div>
<div class="dp-split-media">
<div class="dp-split-media-card"><b>Shopify</b> detected · retail · <b>+2.1%</b> this month</div>
</div>
</section>
<!-- Stats -->
<section class="dp-stats-band">
<div class="dp-stat-big"><div class="dp-stat-big-val">400M+</div><div class="dp-stat-big-label">Domains tracked</div></div>
<div class="dp-stat-big"><div class="dp-stat-big-val">700+</div><div class="dp-stat-big-label">Attributes per domain</div></div>
<div class="dp-stat-big"><div class="dp-stat-big-val">Monthly</div><div class="dp-stat-big-label">Full dataset refresh</div></div>
<div class="dp-stat-big"><div class="dp-stat-big-val">CSV / API</div><div class="dp-stat-big-label">Export anywhere</div></div>
</section>
<!-- CTA -->
<div style="max-width: 72rem; margin: 0 auto; padding: 0 var(--dp-space-6) var(--dp-space-12);">
<section class="dp-cta-band">
<div class="dp-cta-lead">
<p class="dp-cta-eyebrow">Book a free demo</p>
<h2 class="dp-cta-heading">And move from guesswork <span class="light">to data-driven decisions</span></h2>
</div>
<ul class="dp-cta-list">
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> A personalised demo, not a sales pitch</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Completely free, zero obligations</li>
<li class="dp-cta-item"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> 30 to 60 minutes based on your needs</li>
</ul>
<div class="dp-cta-action">
<span class="dp-avatar-group">
<span class="dp-avatar" data-size="sm" aria-label="Team member">AK</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">RV</span>
<span class="dp-avatar" data-size="sm" aria-label="Team member">MB</span>
</span>
<a class="dp-btn" data-variant="cta" href="/contact/">Get your data advantage <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></a>
</div>
</section>
</div>
</main>
<footer class="dp-site-footer">
<div class="dp-footer-inner">
<div class="dp-footer-cols">
<div class="dp-footer-col">
<h4>Our data</h4>
<ul>
<li><a href="/our-data/domain/">Domain</a></li>
<li><a href="/our-data/business/">Business</a></li>
<li><a href="/our-data/technology/">Technology detection</a></li>
<li><a href="/our-data/risk/">Risk</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Data Access</h4>
<ul>
<li><a href="/data-access/search-engine/">Search engine</a></li>
<li><a href="/data-access/ai-navigator-mcp/">AI navigator + MCP</a></li>
<li><a href="/data-access/dashboards/">Dashboards</a></li>
<li><a href="/recipes/">Recipes</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Use Cases</h4>
<ul>
<li><a href="/cases/assets/">Asset management</a></li>
<li><a href="/cases/brand-protection/">Online brand protection</a></li>
<li><a href="/cases/business-information/">Business information</a></li>
<li><a href="/cases/public/">Public sector</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Company</h4>
<ul>
<li><a href="/about/">About us</a></li>
<li><a href="/contact/">Contact</a></li>
<li><a href="/crawler/">Crawler</a></li>
</ul>
</div>
</div>
<div class="dp-footer-mcp">
<div class="dp-footer-mcp-head">MCP <span class="dp-footer-new">New</span></div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: var(--dp-navy);"><circle cx="12" cy="12" r="10"></circle></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>ChatGPT</b></span>
</div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: #d97757;"><path d="M12 2v20M2 12h20M5 5l14 14M19 5 5 19"></path></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>Claude</b></span>
</div>
</div>
</div>
</footer>
</div>
A marketing blog index composed from site-header, a hero with a tab bar, category filter chips, the blog-grid article cards, a newsletter section and site-footer.
Articles, research and product news from the team structuring the web.
npx shadcn@latest add https://ds.dataprovider.dev/r/blog.json
Registry JSON
<!-- Blog page block
A marketing blog index composed from site-header, a hero with a tab bar,
a category filter chip row, the blog-grid article cards, a newsletter
section and site-footer. Marketing theme. -->
<div style="min-height: 100%; background: var(--dp-bg);">
<header class="dp-site-header">
<nav class="dp-site-nav" aria-label="Primary">
<a class="dp-site-logo" href="/" aria-label="Dataprovider.com">
<svg viewBox="0 0 294 82" role="img" aria-label="Dataprovider.com"><g fill="currentColor"><path d="M121.52.73h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.39-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM157.17.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L150.8.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM162.08.7h18.84v4.85h-6.34v19.64h-6.13V5.55h-6.37zM192.16.73l9.01 24.45h-6.51l-1.21-3.91h-9.01l-1.21 3.91h-6.51L185.79.73zm-3.29 5.82c-.31 1.25-.66 2.53-1 3.78-.52 1.84-1.45 4.71-2.01 6.55h6.2zM121.52 28.82h9.84c4.02 0 7.59 0 9.73 3.08.94 1.39 1.39 3.36 1.39 5.02 0 1.35-.28 2.67-.83 3.81-2.11 4.36-6.62 4.47-9.94 4.54h-4.05v8h-6.13V28.82zm6.13 4.51v7.41h3.67c2.29 0 5.06-.07 5.06-3.84 0-3.57-3.08-3.57-4.85-3.57zM143.84 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM177.79 53.97c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.96-5.17 2.55-7.69 2.55m4.22-19.02c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M204.9 28.82h6.51l-8.49 24.45h-6.23l-8.38-24.45h6.51l5.06 17.39zM218.22 28.82v24.45h-6.1V28.82zM220.82 28.82h7.79c2.98.04 7.48.1 10.6 2.88 2.53 2.29 3.5 5.72 3.5 9.14 0 2.11-.31 3.67-.62 4.71-2.25 7.55-9.08 7.69-11.64 7.72h-9.63zm6.17 5.16v14.37h1.87c3.26-.07 7.76-.24 7.76-7.27 0-1.7-.17-3.4-1.28-4.92-1.66-2.22-4.02-2.18-5.89-2.18zM244.28 28.82h18.08v4.75h-11.98V38h11.19v4.64h-11.19v5.82h13.06v4.81h-19.15zM265.05 28.82h11.01c2.56.04 5.75.07 8 2.49 1.14 1.28 1.94 3.22 1.94 5.44 0 4.92-3.36 6.13-5.02 6.75l5.65 9.77h-6.75l-4.85-8.73h-3.84v8.73h-6.13V28.82zm6.13 4.57v6.62h5.06c.87-.03 3.67-.1 3.67-3.36 0-3.12-2.25-3.22-3.53-3.26zM287.75 47.49h5.47v5.78h-5.47zM142.79 75.21c-.9 1.42-1.77 2.81-3.71 4.16-1.04.73-3.43 2.15-6.82 2.15-6.48 0-11.71-4.71-11.71-12.99 0-7.24 4.92-12.95 11.85-12.95 2.81 0 5.3.97 7.14 2.42 1.7 1.35 2.49 2.7 3.19 3.91l-4.85 2.42c-.35-.8-.76-1.63-1.84-2.53-1.18-.94-2.36-1.21-3.36-1.21-3.95 0-6.03 3.67-6.03 7.76 0 5.37 2.74 8.04 6.03 8.04 3.19 0 4.47-2.22 5.3-3.64z"></path><path d="M154.48 81.48c-7.76 0-12.16-5.96-12.16-13.02 0-6.62 4.19-12.88 12.05-12.88 1.45 0 2.98.21 4.47.73 7.48 2.6 7.97 10.74 7.97 12.4 0 4.23-1.94 8.04-4.64 10.22-2.39 1.97-5.16 2.55-7.69 2.55m4.22-19.01c-1.04-1.11-2.63-1.8-4.3-1.8-3.71 0-6.06 3.26-6.06 7.69 0 5.82 3.26 7.97 6.13 7.97 2.91 0 6.03-2.08 6.2-7.2.11-2.57-.58-5.17-1.97-6.66M195.27 56.34v24.45h-5.85l.38-17.42.07-2.46-.21.87c-.31 1.39-.35 1.56-.62 2.6l-4.61 16.42h-5.26l-4.43-15.73-1.07-4.36c.1 1.94.1 2.36.21 4.68l.31 15.41h-5.92V56.35h8.94l3.74 13.72.87 3.91c.35-1.7.38-1.87.66-3.01l3.91-14.62h8.88z"></path><circle cx="77.71" cy="71.82" r="9.55"></circle><path d="M34.86.72c5.16 0 9.96.82 14.41 2.47s8.3 4.11 11.55 7.4 5.79 7.4 7.62 12.33 2.75 10.73 2.75 17.38c0 5.83-.75 11.21-2.24 16.15q-2.25 7.395-6.78 12.78c-3.03 3.59-6.8 6.41-11.33 8.46-4.52 2.06-9.85 3.08-15.98 3.08H.33V.72z"></path></g></svg>
</a>
<ul class="dp-site-menu">
<li><button type="button">Our data <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Data Access <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><button type="button">Use Cases <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/about/">Company</a></li>
</ul>
<div class="dp-site-actions">
<a class="dp-site-login" href="#">Log in</a>
<a class="dp-btn" data-variant="cta" href="/contact/">Contact</a>
</div>
</nav>
</header>
<main>
<!-- Hero with tabs -->
<section class="dp-blog-hero">
<h1 class="dp-blog-hero-title">Web data insights that drive action</h1>
<p class="dp-blog-hero-sub">Articles, research and product news from the team structuring the web.</p>
<div class="dp-blog-tabs">
<a class="dp-blog-tab" href="/blog/" aria-current="true">Articles</a>
<a class="dp-blog-tab" href="/blog/videos/">Videos</a>
<a class="dp-blog-tab" href="/blog/press/">Press</a>
</div>
</section>
<!-- Category filters -->
<nav class="dp-blog-filters" aria-label="Filter by topic">
<a class="dp-blog-chip" href="/blog/" aria-current="true">All</a>
<a class="dp-blog-chip" href="/blog/asset-management/">Asset Management</a>
<a class="dp-blog-chip" href="/blog/brand-protection/">Brand Protection</a>
<a class="dp-blog-chip" href="/blog/business-information/">Business Information</a>
<a class="dp-blog-chip" href="/blog/domains/">Domains</a>
<a class="dp-blog-chip" href="/blog/public-sector/">Public Sector</a>
<a class="dp-blog-chip" href="/blog/security/">Security</a>
<a class="dp-blog-chip" href="/blog/tech/">Tech</a>
</nav>
<!-- Article grid -->
<section class="dp-blog-grid">
<a class="dp-blog-card" href="/blog/saas-to-ai-transition/">
<div class="dp-blog-card-media" data-tint="a" aria-hidden="true"><span class="dp-blog-card-time">6 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Reading the SaaS to AI transition through web data</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Mathijs Baas</span><span class="dp-blog-card-date">29 days ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/getting-started-mcp/">
<div class="dp-blog-card-media" data-tint="b" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Getting started with the Dataprovider MCP: let AI query 350 million domains for you</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Gijs Barends</span><span class="dp-blog-card-date">2 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/cloudflare-hosting/">
<div class="dp-blog-card-media" data-tint="c" aria-hidden="true"><span class="dp-blog-card-time">6 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Cloudflare hides the hosting company. We found it anyway.</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Christian Branbergen</span><span class="dp-blog-card-date">3 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/hidden-prompts-html/">
<div class="dp-blog-card-media" data-tint="d" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Hidden prompts in HTML: the invisible threat exploiting AI browsers</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Lucia Baldassini</span><span class="dp-blog-card-date">6 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/billion-records-ai-navigator/">
<div class="dp-blog-card-media" data-tint="e" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">How we talk to a billion records with our AI Navigator</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Tim Kreutz</span><span class="dp-blog-card-date">7 months ago</span></p>
</div>
</a>
<a class="dp-blog-card" href="/blog/websites-per-capita/">
<div class="dp-blog-card-media" data-tint="a" aria-hidden="true"><span class="dp-blog-card-time">5 min</span></div>
<div class="dp-blog-card-body">
<h3 class="dp-blog-card-title">Websites per capita: how many websites does each EU country have per 1,000 inhabitants?</h3>
<p class="dp-blog-card-meta"><span class="dp-blog-card-author">Gijs Barends</span><span class="dp-blog-card-date">8 months ago</span></p>
</div>
</a>
</section>
<!-- Newsletter -->
<section class="dp-newsletter">
<div class="dp-newsletter-body">
<p class="dp-newsletter-eyebrow">Newsletter</p>
<h2 class="dp-newsletter-title">Subscribe to get monthly <span class="light">web data insights</span></h2>
<p class="dp-newsletter-expect">What can you expect?</p>
<ul class="dp-newsletter-list">
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> The latest tech news</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> Exclusive insights from data experts</li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg> One email a month, no spam</li>
</ul>
</div>
<form class="dp-newsletter-form" action="#" method="post">
<div class="dp-field">
<label class="dp-field-label" for="bnl-first">First name</label>
<input class="dp-field-input" id="bnl-first" name="first_name" type="text" autocomplete="given-name">
</div>
<div class="dp-field">
<label class="dp-field-label" for="bnl-last">Last name</label>
<input class="dp-field-input" id="bnl-last" name="last_name" type="text" autocomplete="family-name">
</div>
<div class="dp-field">
<label class="dp-field-label" for="bnl-email">Email</label>
<input class="dp-field-input" id="bnl-email" name="email" type="email" autocomplete="email">
</div>
<button class="dp-btn" data-variant="cta" type="submit">Subscribe</button>
</form>
</section>
</main>
<footer class="dp-site-footer">
<div class="dp-footer-inner">
<div class="dp-footer-cols">
<div class="dp-footer-col">
<h4>Our data</h4>
<ul>
<li><a href="/our-data/domain/">Domain</a></li>
<li><a href="/our-data/business/">Business</a></li>
<li><a href="/our-data/technology/">Technology detection</a></li>
<li><a href="/our-data/risk/">Risk</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Data Access</h4>
<ul>
<li><a href="/data-access/search-engine/">Search engine</a></li>
<li><a href="/data-access/ai-navigator-mcp/">AI navigator + MCP</a></li>
<li><a href="/data-access/dashboards/">Dashboards</a></li>
<li><a href="/recipes/">Recipes</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Use Cases</h4>
<ul>
<li><a href="/cases/assets/">Asset management</a></li>
<li><a href="/cases/brand-protection/">Online brand protection</a></li>
<li><a href="/cases/business-information/">Business information</a></li>
<li><a href="/cases/public/">Public sector</a></li>
</ul>
</div>
<div class="dp-footer-col">
<h4>Company</h4>
<ul>
<li><a href="/about/">About us</a></li>
<li><a href="/contact/">Contact</a></li>
<li><a href="/crawler/">Crawler</a></li>
</ul>
</div>
</div>
<div class="dp-footer-mcp">
<div class="dp-footer-mcp-head">MCP <span class="dp-footer-new">New</span></div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: var(--dp-navy);"><circle cx="12" cy="12" r="10"></circle></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>ChatGPT</b></span>
</div>
<div class="dp-footer-mcp-card">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" style="color: #d97757;"><path d="M12 2v20M2 12h20M5 5l14 14M19 5 5 19"></path></svg>
<span class="dp-footer-mcp-label"><small>MCP available on</small><b>Claude</b></span>
</div>
</div>
</div>
</footer>
</div>
/* Blog page
Page-specific styles for the blog hero, its tab bar and the category filter
chips. The article grid and newsletter use their own component CSS. Colour
and type from tokens.css (marketing theme). */
.dp-blog-hero {
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-12) var(--dp-space-6) var(--dp-space-6);
}
.dp-blog-hero-title {
margin: 0 0 var(--dp-space-4);
font-size: var(--dp-text-5xl);
line-height: var(--dp-leading-tight);
font-weight: var(--dp-weight-bold);
color: var(--dp-navy);
}
.dp-blog-hero-sub {
max-width: 44ch;
margin: 0 0 var(--dp-space-8);
font-size: var(--dp-text-lg);
color: var(--dp-text-muted);
}
.dp-blog-tabs {
display: flex;
gap: var(--dp-space-6);
border-bottom: 1px solid var(--dp-border);
}
.dp-blog-tab {
padding: 0 0 var(--dp-space-3);
margin-bottom: -1px;
font-size: var(--dp-text-base);
font-weight: var(--dp-weight-bold);
color: var(--dp-text-muted);
text-decoration: none;
border-bottom: 2px solid transparent;
}
.dp-blog-tab[aria-current="true"] {
color: var(--dp-navy);
border-bottom-color: var(--dp-navy);
}
.dp-blog-filters {
display: flex;
flex-wrap: wrap;
gap: var(--dp-space-2);
max-width: 72rem;
margin: 0 auto;
padding: var(--dp-space-6) var(--dp-space-6) 0;
}
.dp-blog-chip {
padding: var(--dp-space-2) var(--dp-space-4);
font-size: var(--dp-text-sm);
font-weight: var(--dp-weight-bold);
color: var(--dp-text-muted);
background: var(--dp-surface);
border: 1px solid var(--dp-border);
border-radius: var(--dp-radius-full);
text-decoration: none;
transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
}
.dp-blog-chip:hover { border-color: var(--dp-border-strong); color: var(--dp-navy); }
.dp-blog-chip[aria-current="true"] {
color: var(--dp-surface);
background: var(--dp-navy);
border-color: var(--dp-navy);
}