open-index/open-npm huggingface dataset:
npm package: @021-projects/vue-button
Description: Button component for Vue 3
Author: 021
Latest version: 0.3.2

# Button for Vue 3

![demo](demo/img.png)

## Project setup
```
yarn add @021-projects/vue-button
```

### Usage
```vue
import VueButton from '@021-projects/vue-button'
import '@021-projects/vue-button/dist/style.css'

...
components: { VueButton }
...
```

```vue
<vue-button label="Test" />
<vue-button label="No caps" no-caps />
<vue-button label="Test" class="custom-btn" />
<vue-button label="Rounded" rounded />
<vue-button label="Rounded ripple" rounded ripple />
<vue-button label="Ripple flat" ripple flat />

<vue-button label="Small" size="sm" />
<vue-button label="Medium" size="md" />
<vue-button label="Large" size="lg" />

<vue-button label="Dark" color="black" text-color="white" />

<vue-button color="black" text-color="white" @click="showAlert"><b>Click me</b></vue-button>

<!-- loading is var from component data -->
<vue-button :loading="loading" label="LOad" @click="loading = !loading" />
<vue-button loading label="Custom loading" @click="showAlert">
  <template #loading="{ spinnerStyle }">
    <spring-spinner v-bind="spinnerStyle" />
    <span style="padding-left: 10px">Loading</span>
  </template>
</vue-button>

<vue-button label="Left" align="left" style="width: 150px" rounded />
<vue-button label="Center" align="center" style="width: 150px" rounded />
<vue-button label="Right" align="right" style="width: 150px" rounded />
```

### Properties
```typescript
/**
 * Text alignment for label
 */
align: {
  type: String as PropType<'left' | 'center' | 'right'>,
  default: 'center'
},

/**
 * Button title 
 */
label: {
  type: String,
  default: ''
},

/**
 * Button size. Allowed xs, sm, md, lg, xl
 */
size: {
  type: String as PropType<TSize>,
  default: 'md'
},

/**
 * Button (background) color
 */
color: {
  type: String,
  default: '#27ae60'
},

/**
 * Button text color
 */
textColor: {
  type: String,
  default: '#fff'
},

/**
 * Rounded borders for button
 */
rounded: {
  type: Boolean,
  default: false
},

/**
 * Ripple effect on click
 */
ripple: {
  type: Boolean,
  default: false
},

/**
 * No shadow 
 */
flat: {
  type: Boolean,
  default: false
},

/**
 * No upppercase text transform 
 */
noCaps: {
  type: Boolean,
  default: false
},

/**
 * Disabled state
 * If true, button will ignore click event
 * And will look like disabled
 */
disabled: {
  type: Boolean,
  default: false
}

/**
 * Loading state
 * If true, button will ignore click event
 * And will show loading spinner instead of label
 * 
 * Spinner can be replaced in "loading" slot
 */
loading: {
  type: Boolean,
  default: false
},

/**
 * Duration of loading spinner animation
 * Works only if spinner was not replaced in "loading" slot
 */
loadingAnimationDuration: {
  type: Number,
  default: 2500
}
```
npm package: @03gibbss/remix-auth-twitch
Description: A TwitchStrategy for Remix Auth, based on the OAuth2Strategy
Author: Sam Gibbs
Latest version: 1.0.1

# TwitchStrategy

The Twitch strategy is used to authenticate users against a Twitch account. It extends the OAuth2Strategy.

## Supported runtimes

| Runtime    | Has Support |
| ---------- | ----------- |
| Node.js    | ✅          |
| Cloudflare | ✅          |

## Usage

### Create an OAuth application

Follow the steps on [the Twitch documentation](https://dev.twitch.tv/docs/authentication/register-app) to create a new application and get a client ID and secret.

### Install via npm

```tsx
npm i @03gibbss/remix-auth-twitch
```

### Create the strategy instance

```ts
import { TwitchStrategy } from "@03gibbss/remix-auth-twitch";

let twitchStrategy = new TwitchStrategy(
  {
    clientID: "YOUR_CLIENT_ID",
    clientSecret: "YOUR_CLIENT_SECRET",
    callbackURL: "https://example.com/auth/twitch/callback",
  },
  async ({ accessToken, extraParams, profile }) => {
    // Get the user data from your DB or API using the tokens and profile
    const user = await db.user.findUnique({
      where: { twitchId: profile.id },
    });

    if (user) {
      return { id: user.id, displayName: user.displayName };
    }

    const newUser = await db.user.create({
      data: { twitchId: profile.id, displayName: profile.display_name },
    });

    return { id: newUser.id, displayName: newUser.displayName };
  }
);

authenticator.use(twitchStrategy);
```

### Setup your routes

```tsx
// app/routes/login.tsx
export default function Login() {
  return (
    <Form action="/auth/twitch" method="post">
      <button>Login with Twitch</button>
    </Form>
  );
}
```

```tsx
// app/routes/auth/twitch.tsx
import { ActionFunction, LoaderFunction, redirect } from "remix";
import { authenticator } from "~/auth.server";

export let loader: LoaderFunction = () => redirect("/login");

export let action: ActionFunction = ({ request }) => {
  return authenticator.authenticate("twitch", request);
};
```

```tsx
// app/routes/auth/twitch/callback.tsx
import { LoaderFunction } from "remix";
import { authenticator } from "~/auth.server";

export let loader: LoaderFunction = ({ request }) => {
  return authenticator.authenticate("twitch", request, {
    successRedirect: "/dashboard",
    failureRedirect: "/login",
  });
};
```
npm package: @03matteo/combinatorics
Description: Gives back the result of the type of combinatoric given.
Author: 03Matteo
Latest version: 3.0.1

# What is this?

Gives back the result of the type of combinatorics given.

# Installation

`npm i @03matteo/combinatorics`

Then...

```
const {
    Disposition,
    Permutation,
    Combination,
    getFactorial
} = require('@03matteo/combinatorics');

const disp = new Disposition(n, k).reps(<true|false>)
const perm = new Permutation(n, [h1, h2, h3, ...]).reps(<true|false>)
const comb = new Combination(n, k).reps(<true|false>)

const fact = getFactorial(number)
```
npm package: @0610studio/rn-layout
Description: https://github.com/0610studio/rn-layout/assets/39161206/722a938f-6298-4149-91bf-2996aeffea4a
Author: KimJeonghun91
Latest version: 0.0.60
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.


https://github.com/0610studio/rn-layout/assets/39161206/722a938f-6298-4149-91bf-2996aeffea4a


## 설치

```bash
"react-native-gesture-handler": "^2.16.0",
"react-native-reanimated": "^3.8.1",
"react-native-safe-area-context": "^4.9.0"

npm i @0610studio/rn-layout
```

## 사용법

- App.tsx

```tsx
<SafeAreaProvider>
    <ThemeProvider
        themeFonts={{
            100: 'Pretendard-Thin',
            200: 'Pretendard-ExtraLight',
            300: 'Pretendard-Light',
            400: 'Pretendard-Regular',
            500: 'Pretendard-Medium',
            600: 'Pretendard-SemiBold',
            700: 'Pretendard-Bold',
            800: 'Pretendard-ExtraBold',
            900: 'Pretendard-Black',
        }}>
        ...
    </ThemeProvider>
</SafeAreaProvider>
```

- target component.tsx

```tsx
const { palette, typography } = useTheme();

<ZSContainer
    edges={['bottom']}
    bottomComponent={
        <BottomButton
            buttonStyle={{ paddingVertical: 16, backgroundColor: buttonDisabled ? '#ff0000' : '#0000ff' }}
            disabled={buttonDisabled}
            isLoading={false}
            loadingComponent={
                <ActivityIndicator /> // default
            }
            labelComponent={
                <Text>등록</Text>
            }
            onPress={() => {
                console.log('등록');
            }}
        />
    }
>

    <Text
        style={[{ marginBottom: 15, marginTop: 30, color: palette.primary.main }, typography.display.large]}
    >
        {'회원 가입'}
    </Text>

    <TextField
        label='휴대폰 번호'
        value={phoneNumber}
        keyboardType="number-pad"
        status='error'
        errorMessage="번호가 일치하지 않아요."
        onChangeText={text => {
            console.log('체인지 : ', text);
        }}
    />
</ZSContainer>

```
npm package: @0610studio/zs-ui
Description: EXPO ZS-UI
Author: righthot
Latest version: 0.14.2


<img width="100%" alt="zsui" src="https://0610studio.github.io/zs-ui/img/zs-banner.png">

This library was created using [create-expo-module](https://docs.expo.dev/modules/get-started/), a tool for creating native modules for Expo projects.

# ZS-ui

ZS-ui는 JavaScript만으로 구현된 Expo용 UI 컴포넌트 라이브러리입니다.

다크 모드, 테마, 타이포그래피, Alert, BottomSheet와 같은 주요 UI 요소가 포함되어 있으며, 직관적이고 일관된 사용자 인터페이스를 구현할 수 있습니다.

<br />

## 설치

```bash
npx expo install @0610studio/zs-ui
```

<br />

## 사용법

사용법은 [문서](https://0610studio.github.io/zs-ui/docs/intro)를 확인해주세요.

<br />

### playground

[EXPO snack](https://snack.expo.dev/@studio0610/zs-ui_13_playground)에서 확인 가능합니다.

<br />

### TODO

- [] Modality 웹 미동작

<br />

<!-- TEST_RESULTS -->
## 테스트 결과

| 항목 | 값 |
|------|-----|
| **상태** | ✅ 성공 |
| **실행 시간** | 2025. 10. 31 |
| **전체 테스트** | 123 |
| **성공** | ✅ 123 |
| **실패** | ✅ 0 |
| **성공률** | 100.0% |

### 📊 코드 커버리지

| 항목 | 커버리지 | 상태 |
|------|---------|------|
| **Statements** | 94.0% | 🟢 |
| **Branches** | 79.8% | 🟡 |
| **Functions** | 77.2% | 🟡 |
| **Lines** | 94.0% | 🟢 |

### ✅ 모든 테스트 통과

<!-- TEST_RESULTS -->
npm package: @0ahz/prettier-config
Description: My personal prettier config
Author: Mark1
Latest version: 1.0.0

# @0ahz/prettier-config

> My personal [Prettier](https://prettier.io/) config.

## Install

```bash
pnpm i @0ahz/prettier-config -D
# or npm
# or yarn
```

## Usage

In `package.json`:

```json
{
  "prettier": "@0ahz/prettier-config"
}
```

or `.prettierrc`:

```json
"@0ahz/prettier-config"
```

or `.prettierrc.js`
or `prettier.config.js`:

```js
// cjs
module.exports = {
  ...require("@wfkit/prettier-config"),
  // other override
};

// esm
import config from "@0ahz/prettier-config";
export default {
  ...config,
  // other override
};
```

## License

MIT License - [0ahz](https://github.com/0ahz)
npm package: @0b1.org/yaml-reader
Description: Ultra Lean yaml reader with no external dependencies
Author: David Pither
Latest version: 1.0.1

# Yaml Parser 

A minimalistic YAML parser with zero external dependencies.

Based on **js-yaml** by **Vitaly Puzrin**. Forked, heavily pruned, condensed and refactored.

## Requirements

NodeJS v20 or higher.

## Installing

Install from within your project, like this:
```sh
npm install 0bone/yaml-reader
```

## Using

The file must be read into a string before calling the parser.

Example

```js
const fs = require("node:fs");
const path = require("node:path");
const Parser = require("@0b1.org/yaml-reader/lib/parser");

const inputPath = path.join(__dirname, "./valid.yaml");
const inputData = fs.readFileSync(inputPath, "utf-8");
const result = Parser.Parse(inputData);

console.log(result);
```
npm package: @0b5vr/imtweakpane
Description: Tweakpane but with immediate-y interface (actually not)
Author: 0b5vr
Latest version: 0.2.0

# imtweakpane

[![Latest NPM release](https://img.shields.io/npm/v/@0b5vr/imtweakpane.svg)](https://www.npmjs.com/package/@0b5vr/imtweakpane)

[Tweakpane](https://cocopon.github.io/tweakpane/) but with immediate-y interface (actually not)

Rough, experimental, made for myself

```html
<script src="https://unpkg.com/tweakpane@3.0.5/dist/tweakpane.js"></script>
<script src="https://unpkg.com/@0b5vr/imtweakpane@0.1.1/dist/imtweakpane.js"></script>

<script>
  const gui = new IMTWEAKPANE.ImPane();

  const update = () => {
    requestAnimationFrame(update);

    const folder = gui.folder("folder");
    const value = folder.value("value", 1.0, { min: 0.0, max: 1.0 });
  };
  update();
</script>
```

- [Docs](https://0b5vr.github.io/imtweakpane/docs/)
npm package: @0b5vr/scrapbox-parser-to-markdown
Description: Convert @progfay/scrapbox-parser parsed result to Markdown
Author: 0b5vr
Latest version: 0.2.1

# @0b5vr/scrapbox-parser-to-markdown

[![@0b5vr/scrapbox-parser-to-markdown on npm](https://img.shields.io/npm/v/%400b5vr%2Fscrapbox-parser-to-markdown?style=flat-square&logo=npm)](https://www.npmjs.com/package/@0b5vr/scrapbox-parser-to-markdown)

Convert [@progfay/scrapbox-parser](https://github.com/progfay/scrapbox-parser) parsed result to Markdown

https://0b5vr.com/scrapbox-parser-to-markdown/example.html

```js
import { parse } from '@progfay/scrapbox-parser';
import { scrapboxParserToMarkdown } from '@0b5vr/scrapbox-parser-to-markdown';

const sb = `Title

[* Hello!]`;

const parsed = parse(sb);
const md = scrapboxParserToMarkdown(parsed, { projectName: '0b5vr' });
```
npm package: @0b5vr/tweakpane-plugin-rotation
Description: 3D rotation input plugin for Tweakpane
Author: 0b5vr
Latest version: 0.2.0

# `@0b5vr/tweakpane-plugin-rotation`

[![npm](https://img.shields.io/npm/v/@0b5vr/tweakpane-plugin-rotation?logo=npm&style=flat-square)](https://www.npmjs.com/package/@0b5vr/tweakpane-plugin-rotation)

Rotation input plugin for Tweakpane

![@0b5vr/tweakpane-plugin-rotation, Rotation input plugin for tweakpane. A working screenshot of the plugin on the right](https://github.com/0b5vr/tweakpane-plugin-rotation/raw/dev/readme-images/rotation.png)

[Sandbox](https://0b5vr.github.io/tweakpane-plugin-rotation)

```html
<script type="module">
  import * as Tweakpane from 'https://unpkg.com/tweakpane@4.0.1/dist/tweakpane.js';
  import * as TweakpaneRotationInputPlugin from './tweakpane-plugin-rotation.js';

  const pane = new Tweakpane.Pane();

  pane.registerPlugin(TweakpaneRotationInputPlugin);

  const params = {
    euler: { x: 0.0, y: 0.0, z: 0.0 },
    quat: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 },
  };

  // euler
  const guiEuler = pane.addBinding(params, 'euler', {
    view: 'rotation',
    rotationMode: 'euler',
    order: 'XYZ', // Extrinsic rotation order. optional, 'XYZ' by default
    unit: 'deg', // or 'rad' or 'turn'. optional, 'rad' by default
  });

  // quaternion
  const guiQuat = pane.addBinding(params, 'quat', {
    view: 'rotation',
    rotationMode: 'quaternion', // optional, 'quaternion' by default
    picker: 'inline', // or 'popup'. optional, 'popup' by default
    expanded: true, // optional, false by default
  });

  guiEuler.on('change', ({ value }) => {
    console.log(value); // do something
  });
</script>
```
npm package: @0bdx/ainta
Description: Utilities for validating values in apps, libraries and websites.
Author: 0bdx
Latest version: 0.0.20

# @0bdx/ainta

__Utilities for validating values in apps, libraries and websites.__

∅&nbsp; __Version:__ 0.0.20  
∅&nbsp; __NPM:__ <https://www.npmjs.com/package/@0bdx/ainta>  
∅&nbsp; __Repo:__ <https://github.com/0bdx/ainta>  
∅&nbsp; __Homepage:__ <https://0bdx.com/ainta>

@TODO add an overview

## Examples

### Basic usage:

```js
import { aintaBoolean } from '@0bdx/ainta';

aintaBoolean(true);
// false

aintaBoolean(1234);
// "A value is type 'number' not 'boolean'"

aintaBoolean(null, 'isDone', { begin:'doThings()' });
// "doThings(): `isDone` is null not type 'boolean'"
```

### Using the `narrowAintas()` helper:

In the example below, `narrowAintas()` is used to narrow `aintaNumber()`
into `aintaNatural()`, and then capture its validation results:

- `begin:'bothNatural()'` sets a prefix, added to all explanations
- `gte:0` checks that the value is not negative
- `mod:1` checks that the value is an integer
- `lte:1000` and `lte:50` specify different maximum values for each argument
- `if (results.length)` checks whether there were any problems

```js
import narrowAintas, { aintaNumber } from '@0bdx/ainta';

function bothNatural(a, b) {
    const [ results, aintaNatural ] = narrowAintas(
        { begin:'bothNatural()', gte:0, mod:1 },
        aintaNumber
    );
    aintaNatural(a, 'a', { lte:1000 });
    aintaNatural(b, 'b', { lte:50 });
    if (results.length) return results;
    return "a and b are both natural numbers, in range!";
}

bothNatural(-5, 12.34);
// [ "bothNatural(): `a` -5 is not gte 0",
//   "bothNatural(): `b` 23.45 is not divisible by 1" ]

bothNatural(99, 200);
// [ "bothNatural(): `b` 200 is not lte 50" ]

bothNatural(12, 3);
// "a and b are both natural numbers, in range!"
```
npm package: @0bdx/are
Description: Synchronous utilities for unit testing apps, libraries and websites.
Author: 0bdx
Latest version: 0.0.8

# @0bdx/are

__Synchronous utilities for unit testing apps, libraries and websites.__

⨂ __Version:__ 0.0.8  
⨂ __NPM:__ <https://www.npmjs.com/package/@0bdx/are>  
⨂ __Repo:__ <https://github.com/0bdx/are>  
⨂ __Homepage:__ <https://0bdx.com/are>

TODO add an overview

## Examples

Example scripts can be found in the 'examples/' directory.

You can run __Example 1,__ for example, using:  
`node examples/example-1.js`

### Example 1

```js
import { isDeeplyLike as isLike } from '@0bdx/are';

// Compare two numbers.
console.log(isLike(0, -0, 'Zero and minus-zero are alike.'));
// PASS: Zero and minus-zero are alike.
//     : `actually` is `0` as expected

// Compare two booleans.
try { isLike(true, false, 'true and false are not alike.');
} catch (err) { console.log(err.message) }
// FAIL: true and false are not alike.
//     : `actually` is `true`
//     : `expected` is `false`

// Compare two plain objects.
console.log(isLike({a:1}, {a:1}, 'Similar objects are alike.'));
// PASS: Similar objects are alike.
//     : `actually` is `{ a:1 }` as expected
```

### Example 2

```js
import { bind1, isDeeplyLike } from '@0bdx/are';

// Create a test suite with a title, and bind one function to it.
const [ isLike, testSuite ] = bind1(isDeeplyLike, 'fact()');

// Or a test suite from a previous test could be passed in instead.
// const [ isLike ] = bind1(isDeeplyLike, testSuite);

// Optionally, begin a new section.
testSuite.addSection('Check that fact() works');

// Run the tests. The third argument, `notes`, is optional.
isLike(fact(0), 1);
isLike(fact(5), 120,
    ['`fact(5)` 5! = 5 * 4 * 3 * 2 * 1']);

// Output a test results summary to the console, as plain text.
console.log(testSuite.render());

// Calculates the factorial of a given integer.
function fact(n) {
    if (n === 0 || n === 1) return 1;
    for (let i=n-1; i>0; i--) n *= i;
    return n;
}
```

### Example 3

```js
import { bind2, isDeeplyLike, throwsError } from '@0bdx/are';

// Create a test suite with a title, and bind two functions to it.
const [ isLike, throws, testSuite ] = bind2(isDeeplyLike, throwsError, 'fact()');

// Or a test suite from a previous test could be passed in instead.
// const [ isLike, throws ] = bind2(isDeeplyLike, throwsError, testSuite);

// Optionally, begin a new section.
testSuite.addSection('Check that fact() works');

// Run the tests. The third argument, `notes`, is optional.
throws(()=>fact(), "`n` is not type 'number'");
throws(()=>fact(NaN), '`n` is NaN!',
    ['`fact(NaN)` cannot factorialise the special `NaN` number']);
isLike(fact(0), 1);
isLike(fact(5), 120,
    ['`fact(5)` 5! = 5 * 4 * 3 * 2 * 1']);

// Output a test results summary to the console, as plain text.
console.log(testSuite.render());

// Calculates the factorial of a given integer.
function fact(n) {
    if (typeof n !== 'number') throw Error("`n` is not type 'number'");
    if (isNaN(n)) throw Error('`n` is NaN!');
    if (n === 0 || n === 1) return 1;
    for (let i=n-1; i>0; i--) n *= i;
    return n;
}
```
npm package: @0bdx/cli
Description: Command line utility for initialising and upgrading 0bdx apps, libraries and websites.
Author: 0bdx
Latest version: 0.0.3

# @0bdx/cli

__Command line utility for initialising and upgrading 0bdx apps, libraries and websites.__

∅&nbsp; __Version:__ 0.0.3  
∅&nbsp; __NPM:__ <https://www.npmjs.com/package/@0bdx/cli>  
∅&nbsp; __Repo:__ <https://github.com/0bdx/cli>  
∅&nbsp; __Homepage:__ <https://0bdx.com/cli>

@TODO add an overview
npm package: @0bdx/cli-upgrade
Description: Command line utility for upgrading 0bdx apps, libraries and websites.
Author: 0bdx
Latest version: 0.0.3

# @0bdx/cli-upgrade

Command line utility for upgrading 0bdx apps, libraries and websites.

∅&nbsp; __Version:__ 0.0.3  
∅&nbsp; __NPM:__ <https://www.npmjs.com/package/@0bdx/cli-upgrade>  
∅&nbsp; __Repo:__ <https://github.com/0bdx/cli-upgrade>  
∅&nbsp; __Homepage:__ <https://0bdx.com/cli-upgrade>

When installed as a global package, `@0bdx/cli-upgrade` is available as:  
`0bdx-upgrade`

For a more user friendly CLI experience, try installing `@0bdx/cli` globally.  
`@0bdx/cli` actually installs `@0bdx/cli-upgrade` as a local dependency, and
invokes it when you’ve completed the ‘Upgrade’ wizard.

@TODO add an overview
npm package: @0bie/pattern-lib-react
Description: A collection of reusable UI components
Author: Obie
Latest version: 1.0.0

# Pattern Library

> A collection of reusable UI components.

The purpose of this project is to enhance the client-side development process by providing a core base of reusable code (components).

This project is based on [pattern-lib](https://bit.ly/2P8F5ZI). [Components](https://bit.ly/2wqmOiO) have been rewritten in [ReactJS](https://bit.ly/2B7E1yR).

## Usage

To use a component in your project import it as a named module.

```js
import {Accordion} from 'pattern-lib-react';
```

## Documentation

[Pattern Library Docs](https://bit.ly/2Pa6n1O)
npm package: @0bipinnata0/heap
Description: A TypeScript implementation of a min heap data structure
Author: 0bipinnata0
Latest version: 1.0.3

# @0bipinnata0/heap

A high-performance TypeScript implementation of a min heap data structure that supports both ESM and CommonJS. This implementation is optimized for handling large datasets and provides stable ordering for elements with equal priorities.

## Installation

```bash
pnpm add @0bipinnata0/heap
```

## Features

- 🚀 High performance implementation
- 🔄 Stable ordering for equal priorities
- 💪 Handles large datasets efficiently
- 📦 Support for both ESM and CommonJS
- 🎯 Type-safe with TypeScript
- 🧪 Comprehensive test coverage

## Usage

```typescript
import { push, pop, peek } from '@0bipinnata0/heap'

// Create a min heap array for objects with sortIndex
const heap: Array<{id: number, sortIndex: number}> = []

// Push elements
push(heap, { id: 1, sortIndex: 5 })
push(heap, { id: 2, sortIndex: 3 })
push(heap, { id: 3, sortIndex: 7 })
push(heap, { id: 4, sortIndex: 1 })

// Peek at minimum element without removing it
console.log(peek(heap)) // { id: 4, sortIndex: 1 }

// Pop elements in ascending order
console.log(pop(heap)) // { id: 4, sortIndex: 1 }
console.log(pop(heap)) // { id: 2, sortIndex: 3 }
console.log(pop(heap)) // { id: 1, sortIndex: 5 }
console.log(pop(heap)) // { id: 3, sortIndex: 7 }
```

## API

### Functions

- `push(heap: T[], value: T): void`
  - Adds a new element to the heap
  - Time complexity: O(log n)

- `peek(heap: T[]): T | null`
  - Returns the minimum element without removing it
  - Returns null if heap is empty
  - Time complexity: O(1)

- `pop(heap: T[]): T | null`
  - Removes and returns the minimum element
  - Returns null if heap is empty
  - Time complexity: O(log n)

## Performance Characteristics

- Push operation: O(log n)
- Pop operation: O(log n)
- Peek operation: O(1)
- Space complexity: O(n)

## Edge Cases Handling

- Empty heap operations return null
- Stable ordering for elements with equal priorities
- Supports negative priority values
- Handles very large priority values (up to Number.MAX_SAFE_INTEGER)

## Use Cases

- Priority queues
- Task scheduling systems
- Graph algorithms (Dijkstra's, Prim's)
- Event scheduling
- Real-time data processing

## Testing

The package includes comprehensive test coverage for:
- Basic operations (push, pop, peek)
- Edge cases and boundary conditions
- Performance with large datasets
- Stability of ordering
- Stress testing with random operations

Run tests with:
```bash
pnpm test
```

## License

MIT