> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twine.se/llms.txt
> Use this file to discover all available pages before exploring further.

# Sp Payroll

export const IntegrationMeta = ({homepageUrl, apiReferenceUrls, contactEmail, transport, status, domains, capabilities, notes}) => {
  const hasLinks = homepageUrl || apiReferenceUrls && apiReferenceUrls.length > 0 || contactEmail;
  const hasDomains = domains && domains.length > 0;
  const hasTransport = !!transport;
  const hasStatus = status === 'planned' || status === 'deprecated';
  const hasCapabilities = capabilities && capabilities.length > 0;
  const hasNotes = !!notes;
  if (!hasLinks && !hasDomains && !hasTransport && !hasStatus && !hasCapabilities && !hasNotes) return null;
  const pill = (bg, color, text) => <span style={{
    display: 'inline-flex',
    alignItems: 'center',
    fontSize: '11px',
    fontWeight: 600,
    lineHeight: 1,
    padding: '3px 8px',
    borderRadius: '999px',
    background: bg,
    color: color,
    whiteSpace: 'nowrap'
  }}>
  {text}
</span>;
  const capabilityColors = {
    'read/write': ['var(--colors-accent-light, #ede9fe)', 'var(--colors-accent, #7c3aed)'],
    'read-write': ['var(--colors-accent-light, #ede9fe)', 'var(--colors-accent, #7c3aed)'],
    'read': ['rgb(var(--primary-light) / .15)', 'var(--colors-content-secondary, #6b7280)'],
    'write': ['rgb(var(--primary-light) / .15)', 'var(--colors-content-secondary, #6b7280)']
  };
  const transportColors = {
    'file': ['var(--colors-warning-light, #fef3c7)', 'var(--colors-warning, #b45309)'],
    'api': ['var(--colors-accent-light, #ede9fe)', 'var(--colors-accent, #7c3aed)'],
    'webhook': ['var(--colors-success-light, #dcfce7)', 'var(--colors-success, #16a34a)']
  };
  const statusConfig = {
    'planned': {
      colors: ['var(--colors-warning-light, #fef3c7)', 'var(--colors-warning, #b45309)'],
      text: 'Planned'
    },
    'deprecated': {
      colors: ['rgb(var(--primary-light) / .15)', 'var(--colors-content-secondary, #6b7280)'],
      text: 'Deprecated'
    }
  };
  const label = text => <span style={{
    fontSize: '11px',
    fontWeight: 600,
    textTransform: 'uppercase',
    letterSpacing: '0.05em',
    color: 'var(--colors-content-secondary, #6b7280)',
    whiteSpace: 'nowrap',
    alignSelf: 'start',
    paddingTop: '2px'
  }}>
  {text}
</span>;
  const cell = children => <div style={{
    display: 'flex',
    alignItems: 'center',
    flexWrap: 'wrap',
    gap: '8px'
  }}>
  {children}
</div>;
  return <>
<style>{`
  .integration-meta-link {
    font-size: 13px;
    color: var(--colors-primary);
    text-decoration: none !important;
    border-bottom: none !important;
    box-shadow: none !important;
    position: relative;
  }
  .integration-meta-link:hover {
    text-decoration: none !important;
    border-bottom: none !important;
    box-shadow: none !important;
  }
  .integration-meta-link::after {
    content: '';
    position: absolute;
    left: 0;
    bottom: -1px;
    width: 100%;
    height: 1px;
    background: rgb(var(--primary-light));
    opacity: 0.5;
    transition: opacity 0.15s;
  }
  .integration-meta-link:hover::after {
    opacity: 1;
  }
`}</style>
<div style={{
    display: 'grid',
    gridTemplateColumns: 'max-content 1fr',
    alignItems: 'center',
    gap: '8px 16px',
    padding: '14px 16px',
    borderRadius: '8px',
    background: 'rgb(var(--primary-light) / .05)',
    border: '1px solid rgb(var(--primary-light) / .1)',
    marginBottom: '32px'
  }}>
{hasLinks && <>
{label('Links')}
{cell(<>
{homepageUrl && <a href={homepageUrl} target="\_blank" rel="noopener noreferrer" className="integration-meta-link">
Website
</a>}
{apiReferenceUrls && apiReferenceUrls.map(({url, label: l}) => <a key={url} href={url} target="\_blank" rel="noopener noreferrer" className="integration-meta-link">
{l || 'API Reference'}
</a>)}
{contactEmail && <a href={`mailto:${contactEmail}`} className="integration-meta-link">
{contactEmail}
</a>}
</>)}
</>}

      {hasStatus && <>
        {label('Status')}
        {cell(pill(...statusConfig[status].colors, statusConfig[status].text))}
      </>}

      {hasTransport && <>
        {label('Transport')}
        {cell(pill(...transportColors[transport] || transportColors['api'], transport === 'file' ? 'File' : transport === 'webhook' ? 'Webhook' : 'API'))}
      </>}

      {hasDomains && <>
        {label('Domains')}
        {cell(domains.map(({domain, capability}) => {
    const [capBg, capColor] = capabilityColors[capability] || capabilityColors['read'];
    return <span key={domain} style={{
      display: 'inline-flex',
      alignItems: 'stretch',
      borderRadius: '999px',
      overflow: 'hidden',
      whiteSpace: 'nowrap',
      fontSize: '12px',
      fontWeight: 600,
      lineHeight: 1
    }}>
              <span style={{
      padding: '4px 8px',
      background: 'rgb(var(--primary-light) / .3)',
      color: 'inherit',
      fontFamily: 'monospace'
    }}>{domain}</span>
              <span style={{
      padding: '4px 8px',
      background: capBg,
      color: capColor
    }}>{capability}</span>
            </span>;
  }))}
      </>}

      {hasCapabilities && <>
        {label('Capabilities')}
        <div style={{
    display: 'flex',
    flexDirection: 'column',
    gap: '4px'
  }}>
          {capabilities.map(({label: capLabel, supported}) => <div key={capLabel} style={{
    display: 'flex',
    alignItems: 'center',
    gap: '8px',
    fontSize: '13px'
  }}>
              <span style={{
    fontWeight: 700,
    fontSize: '12px',
    color: supported ? 'var(--colors-success, #16a34a)' : 'var(--colors-error, #dc2626)',
    width: '12px',
    flexShrink: 0
  }}>{supported ? '✓' : '✗'}</span>
              <span style={{
    color: 'inherit'
  }}>{capLabel}</span>
            </div>)}
        </div>
      </>}

      {hasNotes && <>
        {label('Notes')}
        <span style={{
    fontSize: '13px',
    color: 'var(--colors-content-secondary, #6b7280)',
    fontStyle: 'italic'
  }}>{notes}</span>
      </>}
    </div>

</>;
};

export const IntegrationHeader = ({name, category, logoUrl}) => <div style={{
  display: 'flex',
  alignItems: 'center',
  gap: '16px',
  marginBottom: '24px'
}}>
    {logoUrl && <div style={{
  width: '64px',
  height: '64px',
  borderRadius: '12px',
  background: '#ffffff',
  display: 'flex',
  alignItems: 'center',
  justifyContent: 'center',
  flexShrink: 0,
  boxShadow: '0 0 0 1px rgba(0,0,0,0.08)'
}}>
        <img src={logoUrl} alt={`${name} logo`} style={{
  width: '40px',
  height: '40px',
  objectFit: 'contain'
}} />
      </div>}
    <div>
      <h1 style={{
  margin: 0
}}>{name}</h1>
      <span style={{
  color: 'var(--colors-content-secondary)',
  fontSize: '14px'
}}>
        {category}
      </span>
    </div>
  </div>;

<IntegrationHeader name="Sp Payroll" category="Payroll" logoUrl="data:image/png;base64,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" />

<IntegrationMeta
  status="planned"
  homepageUrl=""
  apiReferenceUrls={[
{
  label: 'API',
  url: '',
},
]}
  transport="api"
  domains={[{ domain: 'employee', capability: 'read-write' }]}
  capabilities={[]}
/>

<Note>
  This page is part of an early release. Detailed information about Twine's integration with this system is being prepared and will be filled in shortly.
</Note>
