import{_ as l}from"./plugin-vue_export-helper-DlAUqK2U.js";import{c as e,a as t,b as i,d as a,e as h,f as p,r as k,o as d}from"./app-YeL2FPh5.js";const r={};function c(g,s){const n=k("RouteLink");return d(),e("div",null,[s[5]||(s[5]=t(`

Contributing to @ocelot-social/ui

Thank you for contributing to the ocelot.social UI library!

Development Setup

# Install dependencies
npm install

# Start development server
npm run dev

# Run tests
npm test

# Run linter
npm run lint

Creating a New Component

File Structure

src/components/
└── OsButton/
    ├── OsButton.vue       # Component
    ├── OsButton.spec.ts   # Tests
    └── index.ts           # Export

Naming Convention

Component Template

<script setup lang="ts">
import { computed } from 'vue-demi'

import type { Size, Variant } from '@/types'

interface Props {
  /** Button size */
  size?: Size
  /** Visual variant */
  variant?: Variant
}

const props = withDefaults(defineProps<Props>(), {
  size: 'md',
  variant: 'primary',
})

const classes = computed(() => [
  'os-button',
  \`os-button--\${props.size}\`,
  \`os-button--\${props.variant}\`,
])
</script>

<template>
  <button :class="classes">
    <slot />
  </button>
</template>

Code Standards

TypeScript

Props

Use the complete Tailwind-based scales:

PropValues
sizexs, sm, md, lg, xl, 2xl
roundednone, sm, md, lg, xl, 2xl, 3xl, full
shadownone, sm, md, lg, xl, 2xl
variantprimary, secondary, danger, warning, success, info

Styling

<template>
  <button class="bg-[--button-primary-bg] dark:bg-[--button-primary-bg-dark]">
    <slot />
  </button>
</template>

Vue 2/3 Compatibility

Always import from vue-demi, not vue:

// Correct
import { ref, computed } from 'vue-demi'

// Wrong
import { ref, computed } from 'vue'

Testing

Requirements

Writing Tests

import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest'

import OsButton from './OsButton.vue'

describe('OsButton', () => {
  it('renders slot content', () => {
    const wrapper = mount(OsButton, {
      slots: { default: 'Click me' },
    })
    expect(wrapper.text()).toBe('Click me')
  })

  it('applies size class', () => {
    const wrapper = mount(OsButton, {
      props: { size: 'lg' },
    })
    expect(wrapper.classes()).toContain('os-button--lg')
  })
})

Running Tests

# Run once
npm test

# Watch mode
npm run test:watch

# With coverage
npm run test:coverage

Commit Conventions

We use Conventional Commits for automatic releases:

# Features (minor version bump)
feat(button): add loading state

# Bug fixes (patch version bump)
fix(modal): correct focus trap behavior

# Breaking changes (major version bump)
feat(input)!: rename value prop to modelValue

# Other types
docs: update README
test: add button accessibility tests
chore: update dependencies
refactor: simplify dropdown logic

Pull Request Checklist

Before submitting a PR, ensure:

Example Apps

Test your changes in the example apps:

# Vue 3 + Tailwind
cd examples/vue3-tailwind && npm install && npm run dev

# Vue 3 + CSS
cd examples/vue3-css && npm install && npm run dev

# Vue 2 + Tailwind
cd examples/vue2-tailwind && npm install && npm run dev

# Vue 2 + CSS
cd examples/vue2-css && npm install && npm run dev

Questions?

`,40)),i("ul",null,[i("li",null,[s[1]||(s[1]=a("Check the ")),h(n,{to:"/CONTRIBUTING.html"},{default:p(()=>s[0]||(s[0]=[a("main CONTRIBUTING.md")])),_:1}),s[2]||(s[2]=a(" for general guidelines"))]),s[3]||(s[3]=i("li",null,[a("Join the "),i("a",{href:"https://discord.gg/AJSX9DCSUA",target:"_blank",rel:"noopener noreferrer"},"Discord"),a(" for questions")],-1)),s[4]||(s[4]=i("li",null,"Open an issue for bugs or feature requests",-1))])])}const y=l(r,[["render",c],["__file","CONTRIBUTING.html.vue"]]),u=JSON.parse('{"path":"/packages/ui/CONTRIBUTING.html","title":"Contributing to @ocelot-social/ui","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Development Setup","slug":"development-setup","link":"#development-setup","children":[]},{"level":2,"title":"Creating a New Component","slug":"creating-a-new-component","link":"#creating-a-new-component","children":[{"level":3,"title":"File Structure","slug":"file-structure","link":"#file-structure","children":[]},{"level":3,"title":"Naming Convention","slug":"naming-convention","link":"#naming-convention","children":[]},{"level":3,"title":"Component Template","slug":"component-template","link":"#component-template","children":[]}]},{"level":2,"title":"Code Standards","slug":"code-standards","link":"#code-standards","children":[{"level":3,"title":"TypeScript","slug":"typescript","link":"#typescript","children":[]},{"level":3,"title":"Props","slug":"props","link":"#props","children":[]},{"level":3,"title":"Styling","slug":"styling","link":"#styling","children":[]},{"level":3,"title":"Vue 2/3 Compatibility","slug":"vue-2-3-compatibility","link":"#vue-2-3-compatibility","children":[]}]},{"level":2,"title":"Testing","slug":"testing","link":"#testing","children":[{"level":3,"title":"Requirements","slug":"requirements","link":"#requirements","children":[]},{"level":3,"title":"Writing Tests","slug":"writing-tests","link":"#writing-tests","children":[]},{"level":3,"title":"Running Tests","slug":"running-tests","link":"#running-tests","children":[]}]},{"level":2,"title":"Commit Conventions","slug":"commit-conventions","link":"#commit-conventions","children":[]},{"level":2,"title":"Pull Request Checklist","slug":"pull-request-checklist","link":"#pull-request-checklist","children":[]},{"level":2,"title":"Example Apps","slug":"example-apps","link":"#example-apps","children":[]},{"level":2,"title":"Questions?","slug":"questions","link":"#questions","children":[]}],"git":{"createdTime":1775388691000,"updatedTime":1775388691000,"contributors":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":1.7,"words":511},"filePathRelative":"packages/ui/CONTRIBUTING.md","localizedDate":"April 5, 2026","excerpt":"\\n

Thank you for contributing to the ocelot.social UI library!

\\n

Development Setup

\\n
# Install dependencies\\nnpm install\\n\\n# Start development server\\nnpm run dev\\n\\n# Run tests\\nnpm test\\n\\n# Run linter\\nnpm run lint
\\n
"}');export{y as comp,u as data};