{"_id":"@ali.camargo/tournament-brackets","_rev":"3-9cb79e852ba5d7787e0a2f1f9aa4bfbb","name":"@ali.camargo/tournament-brackets","dist-tags":{"latest":"1.5.0"},"versions":{"1.3.0":{"name":"@ali.camargo/tournament-brackets","version":"1.3.0","keywords":["tournament","brackets","single-elimination","vanilla-js","jquery"],"author":{"name":"Ali Camargo"},"license":"SEE LICENSE IN LICENSE","_id":"@ali.camargo/tournament-brackets@1.3.0","maintainers":[{"name":"ali.camargo","email":"ali.camargo@hotmail.com"}],"homepage":"https://github.com/aliCamargo/tournament-brackets#readme","bugs":{"url":"https://github.com/aliCamargo/tournament-brackets/issues"},"dist":{"shasum":"b3e763988d3625d18b0d3956c4faf2aab9bd2132","tarball":"https://registry.npmjs.org/@ali.camargo/tournament-brackets/-/tournament-brackets-1.3.0.tgz","fileCount":80,"integrity":"sha512-t0HNVnB27A7gzsHV1jXJ6h1IDFxbd1jKUvXqnOTXz1/rsIYoMq0rLczZTNcVtSfiC6/s3I/TBeZnS7gUpnoGWA==","signatures":[{"sig":"MEQCIAbCKW2vblr/P997+GcbQpAgEaHow4hizcGQGW7B3Q1XAiBeWtWU3tGH4yVvfudSrQm/zIK/wvqSA8s0bWl6AWbAMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239056},"main":"./dist/brackets.umd.cjs","type":"module","_from":"file:ali.camargo-tournament-brackets-1.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/brackets.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/brackets.js","require":"./dist/brackets.umd.cjs"},"./types":{"types":"./dist/types.d.ts"},"./jquery":{"types":"./dist/adapters/jquery.d.ts","import":"./dist/jquery-adapter.js","require":"./dist/jquery-adapter.umd.cjs"},"./style.css":"./dist/brackets.css"},"scripts":{"dev":"vite --config vite.demo.config.js","test":"vitest run","build":"vite build && vite build --config vite.jquery.config.js && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"ali.camargo","email":"ali.camargo@hotmail.com"},"_resolved":"/private/var/folders/x_/nwy_sjp50yb4mm7cglv3wjjh0000gn/T/194d1f32d38849c2c5882f8d37811132/ali.camargo-tournament-brackets-1.3.0.tgz","_integrity":"sha512-t0HNVnB27A7gzsHV1jXJ6h1IDFxbd1jKUvXqnOTXz1/rsIYoMq0rLczZTNcVtSfiC6/s3I/TBeZnS7gUpnoGWA==","repository":{"url":"git+https://github.com/aliCamargo/tournament-brackets.git","type":"git"},"_npmVersion":"10.8.2","description":"Reusable single-elimination tournament brackets — vanilla ESM core with optional jQuery adapter (React/Vue/Angular planned)","directories":{},"_nodeVersion":"20.18.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","jquery":"^3.7.1","vitest":"^2.0.0","typescript":"^7.0.2","@types/jquery":"^4.0.1"},"peerDependencies":{"jquery":">=3.0.0"},"peerDependenciesMeta":{"jquery":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tournament-brackets_1.3.0_1785016365974_0.5661239160221143","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@ali.camargo/tournament-brackets","version":"1.4.0","keywords":["tournament","brackets","single-elimination","vanilla-js","jquery","react","angular"],"author":{"name":"Ali Camargo"},"license":"SEE LICENSE IN LICENSE","_id":"@ali.camargo/tournament-brackets@1.4.0","maintainers":[{"name":"ali.camargo","email":"ali.camargo@hotmail.com"}],"homepage":"https://alicamargo.github.io/tournament-brackets/","bugs":{"url":"https://github.com/aliCamargo/tournament-brackets/issues"},"dist":{"shasum":"9c5023ed32586305aee52529641331f2740e954d","tarball":"https://registry.npmjs.org/@ali.camargo/tournament-brackets/-/tournament-brackets-1.4.0.tgz","fileCount":90,"integrity":"sha512-URFHOAKUFyKQUUGaOG5iFU4ryN1sl6baHLhUTB8JYRrWz38Yw7KlqMkgYfzBP5z9mmyuGXpG5fClNbMVYGBsgA==","signatures":[{"sig":"MEYCIQC0EByknfpDTePQg3n3QaDCSmOnsjKMq7kgo8b64iziiQIhAI8WVPog+2P6sxduM8Wdz0fhk4DXbNB+WsYTy9xODW4X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":398481},"main":"./dist/brackets.umd.cjs","type":"module","_from":"file:ali.camargo-tournament-brackets-1.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/brackets.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/brackets.js","require":"./dist/brackets.umd.cjs"},"./react":{"types":"./dist/adapters/react.adapter.d.ts","import":"./dist/react-adapter.js","require":"./dist/react-adapter.umd.cjs"},"./types":{"types":"./dist/types.d.ts"},"./jquery":{"types":"./dist/adapters/jquery.d.ts","import":"./dist/jquery-adapter.js","require":"./dist/jquery-adapter.umd.cjs"},"./angular":{"types":"./dist/adapters/angular.adapter.d.ts","import":"./dist/angular-adapter.js","require":"./dist/angular-adapter.umd.cjs"},"./style.css":"./dist/brackets.css"},"scripts":{"dev":"vite --config vite.demo.config.js","test":"vitest run --config vite.config.js && vitest run --config vitest.angular.config.js","build":"vite build && vite build --config vite.jquery.config.js && vite build --config vite.react.config.js && ngc -p tsconfig.ngc.json && vite build --config vite.angular.config.js && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","build:demo":"vite build --config vite.demo.config.js && ngc -p tsconfig.demo-ngc.json && vite build --config vite.demo-angular.config.js","test:watch":"vitest"},"_npmUser":{"name":"ali.camargo","email":"ali.camargo@hotmail.com"},"_resolved":"/private/var/folders/x_/nwy_sjp50yb4mm7cglv3wjjh0000gn/T/98d8ec15aec712184a4e71c47d607a76/ali.camargo-tournament-brackets-1.4.0.tgz","_integrity":"sha512-URFHOAKUFyKQUUGaOG5iFU4ryN1sl6baHLhUTB8JYRrWz38Yw7KlqMkgYfzBP5z9mmyuGXpG5fClNbMVYGBsgA==","repository":{"url":"git+https://github.com/aliCamargo/tournament-brackets.git","type":"git"},"_npmVersion":"11.12.1","description":"Reusable single-elimination tournament brackets — vanilla ESM core with optional jQuery, React, and Angular adapters","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"~7.8.2","vite":"^6.4.3","jsdom":"^24.0.0","react":"^17.0.2","jquery":"^3.7.1","vitest":"^2.0.0","zone.js":"~0.15.1","react-dom":"^17.0.2","typescript":"^5.8.3","@types/react":"^17.0.93","@angular/core":"19.2.14","@types/jquery":"^4.0.1","@angular/build":"19.2.14","@angular/common":"19.2.14","@types/react-dom":"^17.0.26","@angular/compiler":"19.2.14","@testing-library/dom":"^8.20.1","@vitejs/plugin-react":"^4.7.0","@angular/compiler-cli":"19.2.14","@testing-library/react":"^12.1.5","@analogjs/vitest-angular":"^2.6.4","@angular/platform-browser":"19.2.14","@analogjs/vite-plugin-angular":"^1.22.5","@angular/platform-browser-dynamic":"19.2.14"},"peerDependencies":{"react":">=17.0.0","jquery":">=3.0.0","react-dom":">=17.0.0","@angular/core":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"jquery":{"optional":true},"react-dom":{"optional":true},"@angular/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tournament-brackets_1.4.0_1785254138060_0.8388201210220352","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@ali.camargo/tournament-brackets","version":"1.5.0","type":"module","description":"Reusable single-elimination tournament brackets — vanilla ESM core with optional jQuery, React, Angular, and Vue adapters","main":"./dist/brackets.umd.cjs","module":"./dist/brackets.js","types":"./dist/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/aliCamargo/tournament-brackets.git"},"homepage":"https://alicamargo.github.io/tournament-brackets/","bugs":{"url":"https://github.com/aliCamargo/tournament-brackets/issues"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/brackets.js","require":"./dist/brackets.umd.cjs"},"./jquery":{"types":"./dist/adapters/jquery.d.ts","import":"./dist/jquery-adapter.js","require":"./dist/jquery-adapter.umd.cjs"},"./react":{"types":"./dist/adapters/react.adapter.d.ts","import":"./dist/react-adapter.js","require":"./dist/react-adapter.umd.cjs"},"./angular":{"types":"./dist/adapters/angular.adapter.d.ts","import":"./dist/angular-adapter.js","require":"./dist/angular-adapter.umd.cjs"},"./vue":{"types":"./dist/adapters/vue.adapter.d.ts","import":"./dist/vue-adapter.js","require":"./dist/vue-adapter.umd.cjs"},"./types":{"types":"./dist/types.d.ts"},"./style.css":"./dist/brackets.css"},"peerDependencies":{"@angular/core":">=17.0.0","jquery":">=3.0.0","react":">=17.0.0","react-dom":">=17.0.0","vue":">=3.5.0"},"peerDependenciesMeta":{"jquery":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@angular/core":{"optional":true},"vue":{"optional":true}},"devDependencies":{"@analogjs/vite-plugin-angular":"^1.22.5","@analogjs/vitest-angular":"^2.6.4","@angular/build":"19.2.14","@angular/common":"19.2.14","@angular/compiler":"19.2.14","@angular/compiler-cli":"19.2.14","@angular/core":"19.2.14","@angular/platform-browser":"19.2.14","@angular/platform-browser-dynamic":"19.2.14","@testing-library/dom":"^8.20.1","@testing-library/react":"^12.1.5","@types/jquery":"^4.0.1","@types/react":"^17.0.93","@types/react-dom":"^17.0.26","@vitejs/plugin-react":"^4.7.0","@vue/test-utils":"^2.4.11","jquery":"^3.7.1","jsdom":"^24.0.0","react":"^17.0.2","react-dom":"^17.0.2","rxjs":"~7.8.2","typescript":"^5.8.3","vite":"^6.4.3","vitest":"^2.0.0","vue":"^3.5.40","zone.js":"~0.15.1"},"keywords":["tournament","brackets","single-elimination","vanilla-js","jquery","react","angular","vue"],"license":"SEE LICENSE IN LICENSE","author":{"name":"Ali Camargo"},"scripts":{"dev":"vite --config vite.demo.config.js","build:demo":"vite build --config vite.demo.config.js && ngc -p tsconfig.demo-ngc.json && vite build --config vite.demo-angular.config.js","typecheck":"tsc --noEmit","build":"vite build && vite build --config vite.jquery.config.js && vite build --config vite.react.config.js && ngc -p tsconfig.ngc.json && vite build --config vite.angular.config.js && vite build --config vite.vue.config.js && tsc --emitDeclarationOnly","test":"vitest run --config vite.config.js && vitest run --config vitest.angular.config.js","test:watch":"vitest"},"_id":"@ali.camargo/tournament-brackets@1.5.0","_integrity":"sha512-O1fRvDmrzrxpcWJje9tdJIsM0WR/8rprJFCUl4zmfmtgWho+QnYoen8fT55ath7oQEmvD4WtgnZuOAdxuKmEYg==","_resolved":"/private/var/folders/x_/nwy_sjp50yb4mm7cglv3wjjh0000gn/T/77597e597af097459110cc18268390f2/ali.camargo-tournament-brackets-1.5.0.tgz","_from":"file:ali.camargo-tournament-brackets-1.5.0.tgz","_nodeVersion":"22.14.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-O1fRvDmrzrxpcWJje9tdJIsM0WR/8rprJFCUl4zmfmtgWho+QnYoen8fT55ath7oQEmvD4WtgnZuOAdxuKmEYg==","shasum":"8c2b6b2fe71d24ef7aece55484c4d576e3defb30","tarball":"https://registry.npmjs.org/@ali.camargo/tournament-brackets/-/tournament-brackets-1.5.0.tgz","fileCount":95,"unpackedSize":479095,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAQQnGpdrZ/pSIBnjkslPmFG+rAYBdXrOCveV8nh4j3XAiB0KzqU675ih/phxbXg05Ij2RqFdjx0+YeIgRbxz/H+Cw=="}]},"_npmUser":{"name":"ali.camargo","email":"ali.camargo@hotmail.com"},"directories":{},"maintainers":[{"name":"ali.camargo","email":"ali.camargo@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tournament-brackets_1.5.0_1786111656464_0.21344089248444242"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-25T21:52:45.871Z","modified":"2026-08-07T14:07:36.840Z","1.3.0":"2026-07-25T21:52:46.124Z","1.4.0":"2026-07-28T15:55:38.233Z","1.5.0":"2026-08-07T14:07:36.617Z"},"bugs":{"url":"https://github.com/aliCamargo/tournament-brackets/issues"},"author":{"name":"Ali Camargo"},"license":"SEE LICENSE IN LICENSE","homepage":"https://alicamargo.github.io/tournament-brackets/","keywords":["tournament","brackets","single-elimination","vanilla-js","jquery","react","angular","vue"],"repository":{"type":"git","url":"git+https://github.com/aliCamargo/tournament-brackets.git"},"description":"Reusable single-elimination tournament brackets — vanilla ESM core with optional jQuery, React, Angular, and Vue adapters","maintainers":[{"name":"ali.camargo","email":"ali.camargo@hotmail.com"}],"readme":"# tournament-brackets\n\nReusable **single-elimination** tournament brackets. Vanilla ESM core, optional jQuery adapter, CSS-variable themes. Display-only (read-only) — winners come from your data.\n\n**Live demo:** [alicamargo.github.io/tournament-brackets](https://alicamargo.github.io/tournament-brackets/) ([jQuery](https://alicamargo.github.io/tournament-brackets/jquery.html) · [React](https://alicamargo.github.io/tournament-brackets/react.html) · [Angular](https://alicamargo.github.io/tournament-brackets/angular.html) · [Vue](https://alicamargo.github.io/tournament-brackets/vue.html))\n\n> Evolved from [jquery-brackets](https://github.com/aliCamargo/jquery-brackets). This project is framework-agnostic; thin React, Vue, and Angular adapters are available.\n\n## Install\n\n```bash\nnpm install @ali.camargo/tournament-brackets\n```\n\n## Usage (ESM)\n\n```js\nimport { Brackets } from '@ali.camargo/tournament-brackets';\nimport '@ali.camargo/tournament-brackets/style.css';\n\nconst el = document.querySelector('#bracket');\nconst api = Brackets.create(el, {\n  rounds,\n  titles: true,           // or string[]\n  thirdPlace: true,       // optional 3rd-place game (semifinal losers)\n  radius: 8,              // 0 = square corners\n  matchWidth: 200,        // column width in px (optional)\n  roundNav: true,         // clickable rounds; bracket starts from selected stage\n  theme: 'default',       // 'default' | 'dark'\n  onChange(state) {\n    console.log(state);\n  },\n});\n\napi.getState();\napi.setRounds(rounds);\napi.destroy();\n```\n\nLive `setRounds` updates reuse the existing `.jb-root` element and replace its contents. Any sibling nodes in the mount element are cleared during the paint.\n\n### TypeScript\n\n```ts\nimport { Brackets, create } from '@ali.camargo/tournament-brackets';\nimport type { BracketsOptions, Match, Player } from '@ali.camargo/tournament-brackets/types';\nimport '@ali.camargo/tournament-brackets/style.css';\n\nconst options: BracketsOptions = { rounds, theme: 'dark' };\nconst api = Brackets.create(el, options);\n```\n\nTypes also ship on the main entry (`import type { BracketsOptions } from '@ali.camargo/tournament-brackets'`).\n\nInternals use a layered class architecture (services + controller); the public API above is unchanged.\n\n### Rounds data\n\n```js\nconst rounds = [\n  [\n    {\n      player1: { name: 'Player 1', id: 1, winner: true, url: 'https://example.com' },\n      player2: { name: 'Player 2', id: 2 },\n    },\n  ],\n  [{ player1: { name: 'Player 1', id: 1 } }],\n];\n```\n\nPlayers use `id`. Non–power-of-two first rounds are padded with byes.\n\n```js\n{ name: 'J. Sinner', id: 1, image: 'https://example.com/it.svg' }\n// Image column auto-appears when any player has image; others get a default avatar.\n```\n\n### Match scores\n\n```js\n// Football / single result — shown on each player row\n{ player1: {…}, player2: {…}, score: [2, 1] }\n\n// Tennis / multi-period — each player's set scores on their row\n{ player1: {…}, player2: {…}, score: [[6, 4], [3, 6], [7, 5]], scoreType: 'sets' }\n// → Player 1: 6 3 7   |   Player 2: 4 6 5\n\n// Tie-break / extra (nested pair) — superscript on each player row\n{\n  score: [\n    [[6, 7], [7, 9]], // → 6⁷ / 7⁹\n    [[7, 6], [7, 2]], // → 7⁷ / 6²\n    [6, 3],\n    [6, 4],\n  ],\n  scoreType: 'sets',\n}\n\n// Or per-player\n{ player1: { name: 'A', score: 2 }, player2: { name: 'B', score: 1 } }\n```\n\n### Match status badge\n\n```js\n{ player1: {…}, player2: {…}, status: 'in_progress' }\n// scheduled | in_progress | final | retired | walkover\n// Auto: winner → final, score without winner → in_progress, else scheduled\n```\n\n## jQuery adapter\n\n```html\n<script src=\"https://code.jquery.com/jquery-3.7.1.min.js\"></script>\n<script src=\"dist/jquery-adapter.umd.cjs\"></script>\n```\n\n```js\nimport $ from 'jquery';\nimport '@ali.camargo/tournament-brackets/jquery';\nimport '@ali.camargo/tournament-brackets/style.css';\n\n$('.brackets').brackets({\n  rounds,\n  titles: true,\n  theme: 'default',\n});\n\nconst api = $('.brackets').data('brackets');\n```\n\nSee the [jQuery demo](https://alicamargo.github.io/tournament-brackets/jquery.html) (or `demo/jquery.html` locally).\n\n## Usage (React)\n\nPeer dependencies: `react` and `react-dom` >= 17.\n\n```tsx\nimport { useRef } from 'react';\nimport { Brackets } from '@ali.camargo/tournament-brackets/react';\nimport type { BracketsApi } from '@ali.camargo/tournament-brackets';\nimport '@ali.camargo/tournament-brackets/style.css';\n\nfunction Tournament({ rounds }) {\n  const apiRef = useRef<BracketsApi>(null);\n\n  return (\n    <Brackets\n      ref={apiRef}\n      rounds={rounds}\n      theme=\"dark\"\n      titles\n      thirdPlace\n      roundNav\n      onChange={(state) => console.log(state)}\n    />\n  );\n}\n```\n\nProps mirror vanilla `BracketsOptions`, plus `className` / `style` on the host element. The `ref` exposes `getState`, `setRounds`, `setViewFromRound`, and `destroy`.\n\nKeep `rounds` referentially stable (for example, memoize derived data) when `onChange` updates parent state; a new `rounds` identity triggers a live `setRounds` update. `viewFromRound` is an initial and imperative-synced value rather than a fully controlled prop: round-nav clicks may diverge from it until you pass a new value or call `setViewFromRound` through the ref.\n\nSee the [React demo](https://alicamargo.github.io/tournament-brackets/react.html) (or `demo/react.html` locally).\n\n## Usage (Angular)\n\nPeer dependency: `@angular/core` >= 17 (standalone apps).\n\n```typescript\nimport { Component, ViewChild } from '@angular/core';\nimport { BracketsComponent } from '@ali.camargo/tournament-brackets/angular';\nimport type { BracketsState } from '@ali.camargo/tournament-brackets';\nimport '@ali.camargo/tournament-brackets/style.css';\n\n@Component({\n  standalone: true,\n  imports: [BracketsComponent],\n  template: `\n    <tb-brackets\n      [rounds]=\"rounds\"\n      theme=\"dark\"\n      [titles]=\"true\"\n      [thirdPlace]=\"true\"\n      [roundNav]=\"true\"\n      (change)=\"onChange($event)\"\n      (roundChange)=\"onRoundChange($event)\"\n    />\n  `,\n})\nexport class TournamentPage {\n  @ViewChild(BracketsComponent) brackets!: BracketsComponent;\n  rounds = /* ... */;\n\n  onChange(state: BracketsState) {\n    console.log(state);\n  }\n\n  onRoundChange(index: number) {\n    console.log(index);\n  }\n}\n```\n\nInputs mirror vanilla `BracketsOptions`, plus `class` / `style` on the host wrapper. Outputs: `change`, `roundChange`. `@ViewChild(BracketsComponent)` exposes `getState`, `setRounds`, `setViewFromRound`, and `destroy`.\n\nSee the [Angular demo](https://alicamargo.github.io/tournament-brackets/angular.html) (or `demo/angular.html` locally).\n\n## Usage (Vue)\n\nPeer dependency: `vue` >= 3.5.\n\n```vue\n<script setup>\nimport { ref } from 'vue'\nimport { Brackets } from '@ali.camargo/tournament-brackets/vue'\nimport '@ali.camargo/tournament-brackets/style.css'\n\nconst api = ref(null)\n</script>\n\n<template>\n  <Brackets\n    ref=\"api\"\n    :rounds=\"rounds\"\n    theme=\"dark\"\n    :titles=\"true\"\n    :third-place=\"true\"\n    :round-nav=\"true\"\n    @change=\"onChange\"\n    @round-change=\"onRoundChange\"\n  />\n</template>\n```\n\nProps mirror vanilla `BracketsOptions` (minus callbacks), plus `class` / `className` / `style` on the host element. Emits: `change`, `roundChange`. The template `ref` exposes `getState`, `setRounds`, `setViewFromRound`, and `destroy`.\n\nKeep `rounds` referentially stable when `@change` updates parent state; a new `rounds` identity triggers a live `setRounds` update. `viewFromRound` is an initial and imperative-synced value rather than a fully controlled prop (same caveat as React).\n\nSee the [Vue demo](https://alicamargo.github.io/tournament-brackets/vue.html) (or `demo/vue.html` locally).\n\n## Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `rounds` | required | Nested match arrays |\n| `titles` | `false` | `true` for auto labels, or `string[]` |\n| `thirdPlace` | `false` | Show 3rd-place match (semifinal losers); or pass a match object to seed it. Also `data-third-place` |\n| `radius` | `8` | Corner radius in px (`0` = square). Also `data-radius` |\n| `matchWidth` | — | Match card column width in px (or CSS length). Also `data-match-width`. Default 168px / 200px with scores |\n| `showScores` | `'auto'` | `true` \\| `false` \\| `'auto'` (show when any match has `score`) |\n| `roundNav` | `false` | Clickable round pills; late stages collapse into “Semifinals & Championship”. Also `data-round-nav` |\n| `viewFromRound` | `0` | Initial stage index when `roundNav` is on |\n| `theme` | `'default'` | `'default'` \\| `'dark'` |\n| `labels` | Round / Semifinal / Final / Champion / 3rd Place | Auto title strings |\n| `onChange` | — | Fired after `setRounds` / data updates |\n\n## Theming\n\n```css\n.jb-root {\n  --jb-bg: #f4f6f8;\n  --jb-surface: #fff;\n  --jb-border: #c5ced6;\n  --jb-text: #1a2330;\n  --jb-accent: #0b6e4f;\n  --jb-winner: #0b6e4f;\n  --jb-radius: 8px;\n}\n```\n\n## Motion\n\nShort left-to-right entrance on paint (including round-nav changes). Matches with `status: 'in_progress'` show a soft badge pulse. Disabled under `prefers-reduced-motion: reduce`.\n\n## Scripts\n\n```bash\npnpm install\npnpm test\npnpm dev          # vanilla, jQuery, React, Angular, and Vue demos (/vue.html)\npnpm build        # dist/ ESM + UMD + CSS\npnpm build:demo   # static demo site (GitHub Pages)\n```\n\n\n## Roadmap\n\nThin framework adapters on the same core (no UI rewrite):\n\n1. ~~React~~ — available via `@ali.camargo/tournament-brackets/react`\n2. ~~Vue~~ — available via `@ali.camargo/tournament-brackets/vue`\n3. ~~Angular~~ — available via `@ali.camargo/tournament-brackets/angular`\n## Predecessor\n\nActive development moved here from **jquery-brackets**. The old repo remains as a historical reference.\n\n## Author\n\n* [Ali Camargo](https://github.com/aliCamargo)\n","readmeFilename":"README.md"}