# Changelog

## 3.0.2

### Patch Changes

- aaa0719: Fixed components and hooks to correctly utilize the audio reference for playback and analysis.

  - Updated **Player** component to ensure it uses the audio ref properly for playback control.
  - Updated **useAudioAnalyser** hook to ensure it correctly accesses the audio element for analysis.
  - Updated **Waveform** component to ensure it uses the audio ref for waveform rendering.

- 0fac93a: Fixed the style of the progress input bar
- f8eedaa: Added sub components section within documentation for pages for each component
- cbe9ae1: Added homepage

## 3.1.0

### Minor Changes

- 836e785: Finished mono-repo move

### Patch Changes

- 87f8047: - Updated documentation to include changelog
  - Created `prebuild` script to copy the changelog to the docs
  - Updated `README.md` to include changelog link
- 1bedd1f: Re-wrote [CONTRIBUTING.md](https://github.com/clxrityy/react-audio/blob/main/CONTRIBUTING.md) to encapsulate the new structure of the repository and the development workflow.

## 3.0.0

### Major Changes

- Switched structure to a [turborepo](https://turbo.build/repo/docs) structure.
  - The main package is now in the `packages/main` directory.
  - The documentation is now in the `packages/docs` directory.
    - The documentation is now built with [Next.js](https://nextjs.org/) & [nextra](https://nextra.site/).
- The package is now built with [tsup](https://tsup.dev/) instead of [vite](https://vitejs.dev/).
  - Refactored the build process to use `tsup` for building the package.
  - Removed many unnecessary dependencies that were used for the previous build process.
- Additional utility packages (pre-included by turbo) are utilized thourghout the codebase:
  - `@repo/typescript-config` - Shared TypeScript configurations
  - `@repo/eslint-config` - Shared ESLint configurations

## 2.5.1

### Patch Changes

- 04149cb: fix docs favicon

## 2.5.0

### Minor Changes

- 4ce0d12: Add eslint
- 79bad00: Add sitemap

  - Created `scripts/generate-sitemap.cjs` that runs after building the docs
  - Utilizes `ladle`'s `meta.json` to get the routes

- fc5d270: add SECURITY.md
- 8f4fc86: add CODE_OF_CONDUCT.md
- fb89952: add vscode extension recommendations
- b90bc02: add robots.txt
- 75fd845: update node version 23.6.0 -> 23.6.1
- 1ab91ae: add CONTRIBUTING.md
- 1574dd6: add code coverage

### Patch Changes

- 5ca96a9: changed prettier tab width to 2
- 624ed09: fix all eslint errors
- dfadccd: Fix play/pause button for autoplay
- 226e7d6: Remove @mui packages - replace with lucide-react for icons
- eae2ee1: remove unnecessary props from Spectrogram (realTime & logarithmicScale)

## 2.4.0

### Minor Changes

- 96b7a45: Add `<Oscillator />` component

  This produces periodic signal with the type of wave specified by the `type` ([`OscillatorType`](https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode/type)) prop. The component is a wrapper around the Web Audio API's [`OscillatorNode`](https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode).

  You must pass the `isPlaying` boolean prop to start and stop the oscillator.

  ### Parameters

  | Param             | Type                          | Description                              | Default  | Required |
  | ----------------- | ----------------------------- | ---------------------------------------- | -------- | -------- |
  | type              | `OscillatorType`              | The type of wave to produce              | `'sine'` | ❌       |
  | isPlaying         | `boolean`                     | Whether the oscillator should be playing | `false`  | ✅       |
  | frequency         | `number`                      | The frequency of the oscillator in hertz | `440`    | ❌       |
  | gain              | `number`                      | The gain of the oscillator               | `0.5`    | ❌       |
  | onFrequencyChange | `(frequency: number) => void` | Callback when the frequency changes      | N/A      | ❌       |
  | onGainChange      | `(gain: number) => void`      | Callback when the gain changes           | N/A      | ❌       |

  #### Example with Next.js

  ```tsx
  "use client";
  import { Oscillator, type OscillatorProps } from "@clxrity/react-audio";

  export default function Home() {
    const [isPlaying, setIsPlaying] = useState(false);

    return (
      <div>
        <button onClick={() => setIsPlaying(!isPlaying)}>
          {isPlaying ? "Stop" : "Start"}
        </button>
        <Oscillator type="sine" isPlaying={isPlaying} />
      </div>
    );
  }
  ```

### Patch Changes

- 72089dd: Fix development environment to support the latest version of pnpm

## 2.2.1

### Patch Changes

- 6959472: fix spectrogram

## 2.2.0

### Minor Changes

- 13b68de: Add the `<Spectrogram />` component.

  #### Parameters

  | Param                 | Type              | Description                                                                                                | Default                                        | Required |
  | --------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -------- |
  | track                 | `Track`           | The track to display the spectrogram of.                                                                   | N/A                                            | ✅       |
  | fftSize               | `FFTSize`         | The size of the FFT to use.                                                                                | `1024`                                         | ❌       |
  | width                 | `number`/`string` | The width of the spectrogram.                                                                              | `100%`                                         | ❌       |
  | height                | `number`/`string` | The height of the spectrogram.                                                                             | `25%`                                          | ❌       |
  | minDecibels           | `number`          | The minimum decibels to display.                                                                           | `-100`                                         | ❌       |
  | maxDecibels           | `number`          | The maximum decibels to display.                                                                           | `-30`                                          | ❌       |
  | colorMap              | `Array<string>`   | The color map to use.                                                                                      | `["#000000", "#ff0000", "#ffff00", "#ffffff"]` | ❌       |
  | smoothingTimeConstant | `number`          | The smoothing time constant to use.                                                                        | `0.8`                                          | ❌       |
  | realTime              | `boolean`         | Whether to display the spectrogram in real time.                                                           | `true`                                         | ❌       |
  | logarithmicScale      | `boolean`         | Whether to use a logarithmic scale.                                                                        | `true`                                         | ❌       |
  | onFrameUpdate         | `Function`        | A callback to be called when a new frame is available. Accepts a data array (`Uint8Array`) as a parameter. | N/A                                            | ❌       |
  | loop                  | `boolean`         | Whether to loop the audio.                                                                                 | `false`                                        | ❌       |
  | fillStyle             | `string`          | The background fill of the canvas                                                                          | `#000000`                                      | ❌       |

  #### Example

  ```tsx
  <Spectrogram
    track={track}
    fftSize={1024}
    width={500}
    height={300}
    minDecibels={-100}
    maxDecibels={-30}
    colorMap={["#000000", "#ff0000", "#ffff00", "#ffffff"]}
    smoothingTimeConstant={0.8}
    realTime={true}
    logarithmicScale={true}
    onFrameUpdate={() => {}}
    loop={true}
    fillStyle="rgba(0, 0, 0, 0.5)"
  />
  ```

- 9540893: Update dependencies

## 2.1.0

### Minor Changes

- 910a28d: Add a **border** prop to ShufflePlayer
- ed9308c: Add more stories for `<ShufflePlayer />`

  - **Dont show tracks** - Example not displaying the track information
  - **Custom color** - Example of changing the color of the player
  - **Custom border** - Example of changing the border of the player

- c802826: Add some development dependencies to optimize the visibility of the docs, make the default mode dark.

  **New Dependencies:**

  - [`baseui`](https://github.com/uber/baseweb#readme)
  - [`styletron-react`](https://www.npmjs.com/package/styletron-react)
  - [`styletron-engine-monolithic`](https://www.npmjs.com/package/styletron-engine-monolithic)

  **Changes:**

  ```mjs
  // .ladle/config.mjs

  /** @type {import('@ladle/react').UserConfig} */
  export default {
    // ...
    addons: {
      // ...
      theme: {
        enabled: true,
        defaultState: "dark",
      },
    },
  };
  ```

  ```tsx
  // .ladle/components.tsx
  import { Provider as StyletronProvider } from "styletron-react";
  import { Client as Styletron } from "styletron-engine-monolithic";
  import { LightTheme, DarkTheme, BaseProvider } from "baseui";
  import type { GlobalProvider } from "@ladle/react";

  const engine = new Styletron();

  export const Provider: GlobalProvider = ({ children, globalState }) => (
    <StyletronProvider value={engine}>
      <BaseProvider
        theme={{
          ...(globalState.theme === "dark" ? DarkTheme : LightTheme),
          direction: globalState.rtl ? "rtl" : "ltr",
        }}
      >
        <div className="docs-container">
          <div className="docs-main">{children}</div>
        </div>
      </BaseProvider>
    </StyletronProvider>
  );
  ```

- 1f6297b: Update **ShufflePlayer** props to include showTracks which can optionally hide the display of all the tracks

### Patch Changes

- 218df0a: Fix docs output (default story, output directory)
- 11ec0e2: Add a script to run after building the documentation to fix the metadata.

  Before, the `<link />` tags were being generated with the wrong `href` attribute. This script will fix the `href` attribute to point to the correct location.

  - The `href` attribute was being generated as `/assets/...` instead of `./assets/...`

  ```json
  {
    "scripts": {
      "build:ladle": "ladle build && node scripts/docs-postbuild.cjs"
    }
  }
  ```

  ```cjs
  const fs = require("fs");
  const path = require("path");

  const indexPath = path.join(__dirname, "../docs", "index.html");

  fs.readFile(indexPath, "utf8", (err, data) => {
    if (err) {
      console.error("Error reading index.html", err);
      process.exit(1);
    }

    // Replace absolute asset paths with relative ones (e.g., '/assets' to './assets')
    let updatedData = data
      .replace(/href="\/assets/g, 'href="./assets')
      .replace(/src="\/assets/g, 'src="./assets');

    updatedData = updatedData.replace(
      /<meta name="dscription"[^>]*>/,
      '<meta name="description" content="A collection of audio components for React applications" />',
    );
    updatedData = updatedData.replace(/<link rel="icon"[^>]*>/, "");
    updatedData = updatedData.replace(/<link rel="apple-touch-icon"[^>]*>/, "");
    updatedData = updatedData.replace(/<link rel="manifest"[^>]*>/, "");
    updatedData = updatedData.replace(/<title>Ladle<\/title>/, "");

    fs.writeFile(indexPath, updatedData, "utf-8", (err) => {
      if (err) {
        console.error("Error writing index.html", err);
        process.exit(1);
      } else {
        console.log("index.html updated successfully");
      }
    });
  });
  ```

## 2.0.2

### Patch Changes

- 4853714: Fix the ability to import the package's css file.

  Before it was bundling into `dist/src/index.css` which was not being imported correctly.
  Upon trying to fix it, it would bundle as `react-audio.css` which was not the desired output.

  - Altered `vite.config.ts` to output the css to `dist/index.css`

    - Added a custom `rename-css-plugin` to vite plugins:

    ```ts
    import { UserConfigExport } from "vite";
    import { renameSync } from "fs"; // NEW
    import path from "path";
    import { defineConfig } from "vitest/config";
    // ...

    const app = async (): Promise<UserConfigExport> => {
      return defineConfig({
        plugins: [
          //.. prev plugins,
          {
            name: "rename-css-plugin",
            closeBundle() {
              const oldPath = path.resolve(__dirname, "dist/react-audio.css");
              const newPath = path.resolve(__dirname, "dist/index.css");

              try {
                renameSync(oldPath, newPath); // FIX
              } catch (error) {
                console.error(error);
              }
            },
          },
        ],
      });
    };
    ```

  - Also added a way to import within css by updating `css.preprocessorOptions` in `vite.config.ts`:
    ```ts
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@import "@clxrity/react-audio/index.css";`;
        }
      }
    }
    ```

  You can now import within your css file like so:

  ```css
  @import "@clxrity/react-audio/index.css";
  ```

  And within your js/ts file like so:

  ```ts
  import "@clxrity/react-audio/index.css";
  ```

## 2.0.0

### Major Changes

- b82ecec: - Switched from [storybook](https://storybook.js.org/) to [ladle](https://ladle.dev/) - Much more lightweight and faster - A lot more of a simple UI to work with

  - Text and colors are automatically inherited by the theme.
    - Dark background = white text
    - Light background = black text
  - Components in new working new version so far:
    - `<Player />` - Replaces `<JustPlayer />` & `<AudioPlayer />`
    - `<ShufflePlayer />` - Replaces `<LibraryPlayer />`
    - `<Waveform />`

  Working structure:

  ```yaml
  ~:
      __tests__/: # Tests with vitest
      .changeset/: # Changeset version management
      .github/: # Github workflows
      .ladle/: # Ladle setup for documenation
      docs/: # Output from ladle for github pages
      public/: # Public static directory
      src/:
          components/ui/: # Reusable UI components
          hooks/: # Reusable hooks
          lib/: # The package exports
              - ...
              - index.ts # Main entry point
          stories/: # Ladle stories
          util/: # Utility functions
          - config.ts # Default configurations
          - index.css # Global CSS
      ...
  ```

- 22f001e: - Update all dependencies
  - Begin restructuring code
  - Switch to Vite
  - Switch from styled components to tailwind
  - Add new logo
  - Add new landing page
  - Add new documentation
  - Add new examples
  - Add new audio player

### Minor Changes

- e8d4166: update all packages to latest version
- 149e841: Added the Player component which will replace JustPlayer & AudioPlayer into one component (with props for customization)
- e155be4: add functionality to EQ & volume knobs (**AudioInputVisualizer**)
- 6f1c415: Added a code coverage workflow that indicates whether all [`vitest`](https://vitest.dev/) tests are passing.

  - Utilizes [Codecov](https://about.codecov.io/) to provide an interactive UI for test coverage.
  - Added an environment variable `CODECOV_TOKEN` to the repository's secrets and local `.env` file.
  - Added a new script `npm run coverage` to generate and upload the coverage report.

- 8172042: added the Waveform component, working perfectly. might need some style tweaks and configurations down the road
- f1a1c48: Add a new \***\*tests\*\*** directory to contain public tests
- f102a1f: Finished the Player component with a progress bar, autoplay feature, ability to disable progress bar and track info display

## 1.7.0

### Minor Changes

- f5abd36: added **AudioUploader** functional with no UI display yet
- d89e093: add **resize()** function to **Waveform**'s canvas if no size prop is present
- 23839c0: **AudioInputVisualizer** works fully functional
- ba70a93: began **AudioInput** component where you can input audio mic/guitar
- bb9f2b5: added prop to **Waveform** & **AudioInputVisualizer**: fftsize

### Patch Changes

- be63b43: re-added imports for libraryplayer & librarytrackitem

## 1.6.0

### Minor Changes

- 9ba3169: update props setup, all now have specific inherited props
- 0422a54: update storybook

### Patch Changes

- ad13785: fix imports and props passing on

## 1.5.0

### Minor Changes

- dbc2980: add docs
- 7d930b0: add nextjs app to docs
- e56a5f9: added a script that generates an api route for creating a waveform image

## 1.4.0

### Minor Changes

- 832989e: added jest, testing ffmpeg features to create waveforms
- f7f4d6f: restructure files (exports in src/lib/)

### Patch Changes

- c650b27: make all exports default
- 610d33d: fixed jest interfering with rollup build
- 3a33cf0: ability to change color in waveforms actually works now

## 1.3.0

### Minor Changes

- 48caa05: change styled-components to devDependency
- 7560f63: update packages
- 0dff7df: add **showTrackInfo** prop to **Waveform**

### Patch Changes

- aa2aaa1: remove tailwindcss dependency
- 3bd6fe5: fix progress bar on waveform

## 0.14.0

### Minor Changes

- cd32bde: more styling updates to library
- 2061b0b: update readme
- 596d485: add other components to **Waveform**
- e95dde9: updated styles for **AudioPlayer** (removed unused thumbnail)

### Patch Changes

- cb432a6: **Waveform** is functional, no errors, need to add other component parts
- 8ef7746: waveform now works
- ce890a9: fix dom errors

## 0.13.0

### Minor Changes

- 1659bd6: begin **Waveform** component, existing error: "Uncaught DOMException: Failed to execute 'createMediaElementSource' on 'AudioContext': HTMLMediaElement already connected previously to a different MediaElementSourceNode."
- fdf559b: style updates to library player

## 0.11.0

### Minor Changes

- 39ed441: add loading states to every component

### Patch Changes

- 7a5aca2: fix error "rounded is not defined" prop with **Button**

## 0.10.0

### Minor Changes

- c1c9610: removed **AudioPlayer** for now
- 9bb0c8d: added (begun) **`<AudioPlayer />`**

### Patch Changes

- 8cd2ac2: fix "Audio is not defined" error in **`<JustPlayer />`**
- 4af6757: fix **JustPlayer**: no more useEffect issue
- 213a90c: fixed "variant" unknown prop in **`<Button /`>**, will find better ways to update styles and theming

## 0.9.0

### Minor Changes

- 4f368d5: **AudioLibrary** is fully functional and styled nicely for now, updated readme & package.json
- 1f5711c: change library component to **AudioLibrary** with states and styles inside

## 0.8.0

### Minor Changes

- 469f488: add / begin `<LibraryPlayer />` component
- aec2e66: add styled-components

### Patch Changes

- 60d76fd: `<LibraryPlayer />` now works (somewhat)

## 0.7.0

### Minor Changes

- 62c85bf: update packages

### Patch Changes

- 443185b: `<JustPlayer />` now works (plays audio)

## 0.6.0

### Minor Changes

- 6e7d46f: updated visuals to `<AudioPlayer />`, began `<JustPlayer />`

## 0.5.0

### Minor Changes

- 3dc1f94: add background color param
- df5f580: add license and npmignore

### Patch Changes

- fc106f5: it works now
- df5f580: make changeset a dev dependency

## 0.4.0

### Minor Changes

- d184bff: made component export & import into applications properly, `<AudioPlayer />` component is now (semi) functional and visible
- f5c0d15: structuring `AudioPlayer` component. began exporting compatible types for the (optional) options (styling so far)

## 0.3.0

### Minor Changes

- af6c419: test tailwindcss
- 7cacb07: begin functionality of audio component

### Patch Changes

- 7cacb07: change name of `Player` to `AudioPlayer`

## 0.2.0

### Minor Changes

- begin testing, add changeset, begin development process
