open-index/open-npm huggingface dataset:
npm package: @hotwired-sh/playbooks
Description: Playbook definitions for Hotwired multi-agent workflows
Author: Hotwired
Latest version: 2.4.0

# @hotwired-sh/playbooks

[![Hotwired](hotwired-sh.png)](https://hotwired.sh)

Playbook definitions for [Hotwired](https://hotwired.sh) multi-agent workflows.

## Installation

```bash
npm install @hotwired-sh/playbooks
```

## Usage

### TypeScript/JavaScript

```typescript
import { loadAllPlaybooks, loadPlaybook, type Playbook } from '@hotwired-sh/playbooks';

// Load all active playbooks
const playbooks = loadAllPlaybooks();

// Load a specific playbook
const playbook = loadPlaybook('plan-build');
```

### Direct file access

The playbook files are included in the package and can be accessed directly:

```typescript
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const packagePath = require.resolve('@hotwired-sh/playbooks/package.json');
// Playbooks are in ./playbooks/ relative to package root
```

## Playbook Structure

Each playbook is a directory containing:

- `playbook.json` - Metadata (name, roles, flow, etc.)
- `protocol.md` - Shared protocol/rules for all agents
- `*.md` - Role-specific prompts

## Available Playbooks

- **plan-build** - Planning and building features (Strategist + Builder)
- **doc-editor** - Documentation writing and editing (Writer + Critiquer)

## Creating Custom Playbooks

Fork this repository and add your own playbook directories following the same structure in `./playbooks/`.

## License

MIT
npm package: @hotwired/hotwire-native-bridge
Description: Web library for building Bridge Components in Hotwire Native apps.
Author: 37signals LLC
Latest version: 1.2.2

# Hotwire Native Bridge for web

[Hotwire Native](https://native.hotwired.dev) is a high-level native framework, available for iOS and Android, that provides you with all the tools you need to leverage your web app and build great mobile apps.

This web javascript library integrates with your [Hotwire](https://hotwired.dev) web app to build [Bridge Components](https://native.hotwired.dev/overview/bridge-components) in `WebView` screens in your mobile apps. It's designed to work seamlessly with your [Hotwire Native](https://native.hotwired.dev) iOS and Android apps.


Read more on [native.hotwired.dev](https://native.hotwired.dev).


## Contributing

Hotwire Native Bridge is open-source software, freely distributable under the terms of an [MIT-style license](LICENSE). The [source code is hosted on GitHub](https://github.com/hotwired/hotwire-native-bridge). Development is sponsored by [37signals](https://37signals.com/).

We welcome contributions in the form of bug reports, pull requests, or thoughtful discussions in the [GitHub issue tracker](https://github.com/hotwired/hotwire-native-bridge/issues).

---------

© 2024 37signals LLC
npm package: @hotwired/stimulus-webpack-helpers
Description: Webpack helpers for Stimulus.
Author: Basecamp, LLC
Latest version: 1.0.1

# <img src="assets/logo.svg?sanitize=true" width="24" height="24" alt="Stimulus"> Stimulus Webpack Helpers

## Using Stimulus Webpack Helpers

Call webpack's [`require.context`](https://webpack.js.org/api/module-methods/#require-context) helper with the path to the folder containing your Stimulus controllers. Then, pass the resulting context to the `Application#load` method using the `definitionsFromContext` helper:

```js
// src/application.js
import { Application } from "@hotwired/stimulus"
import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers"

window.Stimulus = Application.start()
const context = require.context("./controllers", true, /\.js$/)
Stimulus.load(definitionsFromContext(context))
```

## Getting Help & Contributing Back

Looking for the docs? Once you've read through the Handbook, consult the [Stimulus Reference](https://stimulus.hotwired.dev/reference/controllers) for API details.

Have a question about Stimulus? Connect with other Stimulus developers on the [Hotwire Discourse](https://discuss.hotwired.dev/) community forum.

Find a bug? Head over to our [issue tracker](https://github.com/hotwired/stimulus-webpack-helpers/issues) and we'll do our best to help. We love pull requests, too!

We expect all Stimulus contributors to abide by the terms of our [Code of Conduct](CODE_OF_CONDUCT.md).

## Acknowledgments

Stimulus is [MIT-licensed](LICENSE.md) open-source software from [Basecamp](https://basecamp.com/), the creators of [Ruby on Rails](http://rubyonrails.org).

Continuous integration VMs generously provided by [Sauce Labs](https://saucelabs.com/open-source).

---

© 2021 Basecamp, LLC.
npm package: @hotwired/strada
Description: Create fully native controls, driven by your web app.
Author: 37signals LLC
Latest version: 1.0.0-beta1

# Strada

[Strada](https://strada.hotwired.dev) enables you to create native controls in your hybrid mobile apps, driven by the web. Build web components and native components that work together in `WebView` screens to elevate your [Turbo Native](https://turbo.hotwired.dev/handbook/native) apps to the next level.

Strada works seamlessly with your [Turbo Native](https://turbo.hotwired.dev/handbook/native) apps and leverages [Stimulus]((https://stimulus.hotwired.dev)) to create web components with your existing HTML. The `strada-web` library is designed to work together with the [strada-ios](https://github.com/hotwired/strada-ios) and [strada-android](https://github.com/hotwired/strada-android) native libraries.


Read more on [strada.hotwired.dev](https://strada.hotwired.dev).


## Contributing

Strada is open-source software, freely distributable under the terms of an [MIT-style license](LICENSE). The [source code is hosted on GitHub](https://github.com/hotwired/strada-web). Development is sponsored by [37signals](https://37signals.com/).

We welcome contributions in the form of bug reports, pull requests, or thoughtful discussions in the [GitHub issue tracker](https://github.com/hotwired/strada-web/issues).

Please note that this project is released with a [Contributor Code of Conduct](docs/CONDUCT.md). By participating in this project you agree to abide by its terms.

---------

© 2023 37signals LLC
npm package: @hotwired/turbo
Description: The speed of a single-page web application without having to write any JavaScript
Author: 37signals LLC
Latest version: 8.0.23

# Turbo

Turbo uses complementary techniques to dramatically reduce the amount of custom JavaScript that most web applications will need to write:

* Turbo Drive accelerates links and form submissions by negating the need for full page reloads.
* Turbo Frames decompose pages into independent contexts, which scope navigation and can be lazily loaded.
* Turbo Streams deliver page changes over WebSocket or in response to form submissions using just HTML and a set of CRUD-like actions.
* Turbo Native lets your majestic monolith form the center of your native iOS and Android apps, with seamless transitions between web and native sections.

It's all done by sending HTML over the wire. And for those instances when that's not enough, you can reach for the other side of Hotwire, and finish the job with [Stimulus](https://github.com/hotwired/stimulus).

Read more on [turbo.hotwired.dev](https://turbo.hotwired.dev).

## Contributing

Please read [CONTRIBUTING.md](./CONTRIBUTING.md).

© 2026 37signals LLC.
npm package: @hotwyl/init-docker-minimal-dev
Description: Automatize a configuração do seu ambiente Docker inicial de desenvolvimento (PHP/Apache/MySQL).
Author: hotwyl
Latest version: 1.0.0

��# docker-minimal-dev

Automatize a configura��o do seu ambiente Docker inicial de desenvolvimento (PHP/Apache/MySQL).

## O que este pacote faz?
Ao iniciar um projeto, este pacote gera instantaneamente uma estrutura de cont�ineres Docker pronta para uso com as ferramentas essenciais (Apache, PHP, MySQL).

## Como instalar e usar?
### 1. Inicie seu projeto e abra o terminal
### 2. Execute o comando abaixo via npx:
```bash
npx docker-minimal-dev
```
*Nota: Use `--force` para sobrescrever.*

## Estrutura gerada
- `docker-compose.yml`: Orquestra��o
- `Dockerfile`: Imagem customizada
- `www/`: Pasta raiz
- `config/`: Configura��es de servi�os
- `logs/`: Logs dos servi�os

## Como iniciar
Inicie execu��o docker e execute o comando abaixo:
```bash
docker-compose up -d --build
```

## License
Licen�a MIT - veja a [LICENSE](LICENSE)

## Developer
Developed by **HOTWYL** - GitHub: https://github.com/hotwyl
npm package: @hou5emd/email-validator
Description: JavaScript library for email validation
Author: hou5emd
Latest version: 1.0.3

# email-validator
JavaScript library for email validation

## Usage

```typescript

import { isValidEmail } from 'email-validator';

isValidEmail("test@email.com"); // true


```

## Contribute

Contributions welcome!

## Setup

### Install the dependencies:

```bash
npm install
```

### Build the app:

```bash
npm run build
```

### Test the app:

```bash
npm run test
```
npm package: @hou5emd/react-ts-utils
Description: utils for react & typescript
Author: hou5emd
Latest version: 0.1.0

# Rslib Project

## Setup

Install the dependencies:

```bash
pnpm install
```

## Get Started

Build the library:

```bash
pnpm build
```

Build the library in watch mode:

```bash
pnpm dev
```
npm package: @hou5emd/typed-path-builder
Description: This Build type-safe paths from a simple config object.
Author: https://github.com/hou5emd
Latest version: 0.6.5

# typed-path-builder

Generate statically typed path and route builders from a simple config object. This is useful when working with routers such as `react-router`, where you want predefined URL structures without string typos.

This project is a fork of [y-hiraoka/typed-path-builder](https://github.com/y-hiraoka/typed-path-builder).

[Русский](./README-ru.md)
[日本語](./README-ja.md)

## Usage

### Define config object

Define your URLs as an object.

For example, if your application has the following URLs:

```
/foo
/foo/:fooId
/foo/:fooId/bar
/fizz
/fizz/buzz/
/100
```

Prepare an object like the following and pass it to `createTypedPathBuilder` function.

```ts
import createTypedPathBuilder from "typed-path-builder";

const routeConfig = {
  foo: {
    ":fooId": {
      bar: {},
    },
  },
  fizz: {
    buzz: {},
  },
  100: {},
};

const [path, route] = createTypedPathBuilder(routeConfig);
```

Use an empty object (`{}`) for terminal segments. If you need path parameters, start the property name with `":"`.

### Path builder

The `path` object generates template paths from the config.

```ts
path.foo.fooId.bar._build(); // => "/foo/:fooId/bar"
path.relativeTo(path.foo).fooId.bar._build(); // => ":fooId/bar"
```

`relativeTo(base)` starts a relative path builder from `base`, so only descendants of `base` are available afterwards.

### Route builder

The `route` object generates concrete routes from the config.
Properties that start with `":"`, such as `":fooId"`, become functions in the route builder.

```ts
route.foo.fooId("id")._build(); // => "/foo/id"
```

## Query parameters

To include query parameters, add a `_queries` property.

```ts
const withQueries = {
  foo: {
    ":fooId": {
      _queries: {
        param1: {},
        param2: {},
        param3: {},
      },
    },
  },
};

const [, route] = createTypedPathBuilder(withQueries);

route.foo.fooId("id")._queries({ param1: "value1", param3: "value3" })._build(); // => "/foo/id?param1=value1&param3=value3"
```

`_queries` becomes a function in the route builder and accepts a query parameter object in a type-safe way.
npm package: @houbeb/git-rev-sync
Description: Synchronously get the current git commit hash, tag, or branch
Author: hubuntub
Latest version: 3.0.3

git-rev-sync [![Build Status](https://travis-ci.org/kurttheviking/git-rev-sync-js.svg?branch=master)](https://travis-ci.org/kurttheviking/git-rev-sync-js)
============

Synchronously get the current git commit hash, tag, count, branch or commit message. Forked from [git-rev-sync-js](https://github.com/kurttheviking/git-rev-sync-js). Supports Node 4+.


## Example

```js
var git = require('git-rev-sync');

console.log(git.short());
// 75bf4ee

console.log(git.long());
// 75bf4eea9aa1a7fd6505d0d0aa43105feafa92ef

console.log(git.branch());
// master
```

You can also run these examples via: `npm run examples`


## Install

`npm install git-rev-sync --save`


## API

``` js
var git = require('git-rev-sync');
```

#### `git.short([filePath], [length])` &rarr; &lt;String&gt;

return the result of `git rev-parse --short HEAD`

- optional `filePath` parameter can be used to run the command against a repo outside the current working directory
- optional `length` parameter can be used to set the desired hash length (defaults to `7`)

#### `git.long([filePath])` &rarr; &lt;String&gt;

return the result of `git rev-parse HEAD`; optional `filePath` parameter can be used to run the command against a repo outside the current working directory

#### `git.branch([filePath])` &rarr; &lt;String&gt;

return the current branch; optional `filePath` parameter can be used to run the command against a repo outside the current working directory

#### `git.count()` &rarr; &lt;Number&gt;

return the count of commits across all branches; this method will fail if the `git` command is not found in `PATH`

#### `git.date()` &rarr; &lt;Date&gt;

returns the date of the current commit; this method will fail if the `git` command is not found in `PATH`

#### `git.hasUnstagedChanges()` &rarr; &lt;Boolean&gt;

returns true if there are unstaged changes; this method will fail if the `git` command is not found in `PATH`

#### `git.isDirty()` &rarr; &lt;Boolean&gt;

returns true if there are uncommitted changes; this method will fail if the `git` command is not found in `PATH`

#### `git.isTagDirty()` &rarr; &lt;Boolean&gt;

returns true if the current tag is dirty; this method will fail if the `git` command is not found in `PATH`

#### `git.message()` &rarr; &lt;String&gt;

return the current commit message; this method will fail if the `git` command is not found in `PATH`

#### `git.remoteUrl()` &rarr; &lt;String&gt;

return the current remote URL; this method will fail if the `git` command is not found in `PATH`

#### `git.tag([markDirty])` &rarr; &lt;String&gt;

return the current tag and mark as dirty if markDirty is truthful; this method will fail if the `git` command is not found in `PATH`


## License

[MIT](https://github.com/kurttheviking/git-rev-sync/blob/master/LICENSE)


## Donations

[We're all in this together](https://cash.me/$kurttheviking)
npm package: @houchenyang/nexus
Description: OpenClaw channel plugin for connecting to Nexus Gateway
Latest version: 1.0.2

# Nexus Channel

OpenClaw 插件，用于连接 [Nexus Gateway](https://github.com/hcy050617/openclaw-nexus) 网关服务。

> 这是 [OpenClaw Nexus](https://github.com/hcy050617/openclaw-nexus) 项目的客户端插件组件。

## 功能

- WebSocket 长连接，自动重连
- 心跳保活
- 消息收发与回复
- 支持流式回复

## 安装

### 方式一：npm 安装

```bash
openclaw plugins install @houchenyang/nexus
```

### 方式二：本地安装

```bash
# 克隆或下载到 extensions 目录
git clone https://github.com/hcy050617/openclaw-nexus.git ~/.openclaw/extensions/nexus

# 安装依赖并编译
cd ~/.openclaw/extensions/nexus
pnpm install
pnpm build
```

## 配置

在 `~/.openclaw/openclaw.json` 中添加配置：

```json
{
  "channels": {
    "nexus": {
      "enabled": true,
      "serverUrl": "ws://your-server:17392/bot-ws",
      "botId": "my-bot",
      "botName": "My Bot",
      "token": ""
    }
  },
  "plugins": {
    "entries": {
      "nexus": {
        "enabled": true
      }
    }
  }
}
```

### 配置说明

| 字段 | 类型 | 说明 |
|------|------|------|
| `enabled` | boolean | 是否启用 |
| `serverUrl` | string | Nexus Gateway WebSocket 地址 |
| `botId` | string | Bot 唯一标识 |
| `botName` | string | Bot 显示名称 |
| `token` | string | 连接令牌（可选） |

## 使用命令

```bash
# 启用插件
openclaw config set plugins.entries.nexus.enabled true

# 配置连接
openclaw config set channels.nexus.enabled true
openclaw config set channels.nexus.serverUrl "ws://your-server:17392/bot-ws"
openclaw config set channels.nexus.botId "my-bot"
openclaw config set channels.nexus.botName "My Bot"
openclaw config set channels.nexus.token "your-bot-token"

# 重启
openclaw gateway restart
```

## WebSocket 协议

### 注册

Bot 连接后发送注册消息：

```json
{
  "type": "register",
  "botId": "my-bot",
  "botName": "My Bot",
  "token": ""
}
```

### 接收消息

Gateway 转发用户消息：

```json
{
  "type": "chat",
  "id": "msg-xxx",
  "content": "你好",
  "from": "用户名",
  "timestamp": 1706600000000
}
```

### 回复消息

Bot 发送回复：

```json
{
  "type": "reply",
  "id": "reply-xxx",
  "replyTo": "msg-xxx",
  "content": "回复内容",
  "done": true,
  "timestamp": 1706600001000
}
```

支持流式回复，`done: false` 表示未完成。

### 心跳

```json
// Gateway -> Bot
{"type": "ping"}

// Bot -> Gateway
{"type": "pong"}
```

## 文件结构

```
nexus-channel/
├── index.ts              # 插件入口
├── package.json          # 包配置
├── openclaw.plugin.json  # 插件元数据
├── tsconfig.json         # TypeScript 配置
└── src/
    ├── accounts.ts       # 账户解析
    ├── bot.ts            # 消息处理
    ├── channel.ts        # Channel 插件定义
    ├── openclaw.d.ts     # 类型声明
    ├── monitor.ts        # WebSocket 连接监控
    ├── outbound.ts       # 出站适配器
    ├── probe.ts          # 连接探测
    ├── reply-dispatcher.ts # 回复分发器
    ├── runtime.ts        # 运行时管理
    ├── send.ts           # 发送消息
    └── types.ts          # 类型定义
```

## 相关项目

- [OpenClaw Nexus](https://github.com/hcy050617/openclaw-nexus) - 主项目
- [Nexus Gateway](https://github.com/hcy050617/openclaw-nexus/tree/master/nexus-gateway) - 网关服务端

## License

MIT
npm package: @houd1ni/koa-compress
Description: Compress middleware for koa
Author: Jonathan Ong, Michael Akiliev
Latest version: 5.2.11

# Koa Compress

[![Node.js CI](https://github.com/koajs/compress/workflows/Node.js%20CI/badge.svg?branch=master)](https://github.com/koajs/compress/actions?query=workflow%3A%22Node.js+CI%22+branch%3Amaster)
[![codecov](https://codecov.io/gh/koajs/compress/branch/master/graph/badge.svg)](https://codecov.io/gh/koajs/compress)

Compress middleware for Koa

## Example

```js
const compress = require('koa-compress')
const Koa = require('koa')

const app = new Koa()
app.use(compress({
  filter (content_type) {
  	return /text/i.test(content_type)
  },
  threshold: 2048,
  gzip: {
    flush: require('zlib').constants.Z_SYNC_FLUSH
  },
  deflate: {
    flush: require('zlib').constants.Z_SYNC_FLUSH,
  },
  br: false // disable brotli
}))
```

## Maintainers

- Lead: @jonathanong [@jongleberry](https://twitter.com/jongleberry)
- Team: @koajs/compress

## Options

### filter\<Function\>

```ts
function (mimeType: string): Boolean {

}
```

An optional function that checks the response content type to decide whether to compress.
By default, it uses [compressible](https://github.com/jshttp/compressible).

### options.threshold\<String|Number\>

Minimum response size in bytes to compress.
Default `1024` bytes or `1kb`.

### options[encoding]\<Object\>

The current encodings are, in order of preference: `br`, `gzip`, `deflate`.
Setting `options[encoding] = {}` will pass those options to the encoding function.
Setting `options[encoding] = false` will disable that encoding.

#### options<span></span>.br

[Brotli compression](https://en.wikipedia.org/wiki/Brotli) is supported in node v11.7.0+, which includes it natively.
As of v5.1.0, the default quality level is 4 for performance reasons.

### options.defaultEncoding\<String\>

An optional string, which specifies what encoders to use for requests without
[Accept-Encoding](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding).
Default `identity`.

The standard dictates to treat such requests as `*` meaning that all compressions are permissible,
yet it causes very practical problems when debugging servers with manual tools like `curl`, `wget`, and so on.
If you want to enable the standard behavior, just set `defaultEncoding` to `*`.

## Manually turning compression on and off

You can always enable compression by setting `ctx.compress = true`.
You can always disable compression by setting `ctx.compress = false`.
This bypasses the filter check.

```js
app.use((ctx, next) => {
  ctx.compress = true
  ctx.body = fs.createReadStream(file)
})
```
npm package: @houdini-css-paint/deep-sea
Description: CSS Paintlet for drawing stylised 2D sea floor
Author: Georgi Nikolov
Latest version: 0.1.3

# CSS Houdini Deep Sea

A CSS Houdini Paintlet to render stylised 2D sea floor.

![Deep Sea Paintlet Render](https://css-houdini-dojo.georgi-nikolov.com/images/deep-sea-paintlet-export.png)

Demo Page - [http://css-houdini-dojo.georgi-nikolov.com](http://css-houdini-dojo.georgi-nikolov.com/)

## 1. Load the Worklet

Using CDN is the easiest way to add this Worklet:

```
if ('paintWorklet' in CSS) {
  CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/deep-sea/index.js');
}
```

## 2. Polyfill

To add support for all modern browsers, you can load the worklet with [css-paint-polyfill](https://github.com/GoogleChromeLabs/css-paint-polyfill) fallback.

```
<script>
  ;(async function() {
    if (CSS['paintWorklet'] === undefined)
      await import('https://unpkg.com/css-paint-polyfill')

    CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/deep-sea/index.js')
  })()
</script>
```

## 3. Using the Paintlet

To use this Paintlet after you have succesffuly loaded it, you need to add `background(-image): paint(deep-sea)` to any HTML element on your page. You can control its appearance just like any other regular image referenced in CSS with properties such as `background-size`, `background-repeat`, `background-position` and so on.

```
.my-element {
  --deep-sea-bubbles-count: 36;
  --deep-sea-grass-count: 100;
  --deep-sea-background-color: #110755;
  --deep-sea-grass-color: #639c5b;
  --deep-sea-grass-height: 50%;

  background-image: paint(deep-sea);
}
```

| Property                    | Description                               | Default Value |
| --------------------------- | ----------------------------------------- | ------------- |
| --deep-sea-bubbles-count    | How many bubbles to render                | 100           |
| --deep-sea-grass-count      | How much individual grass stems to render | 100           |
| --deep-sea-background-color | Background color                          | #6ab04c       |
| --deep-sea-grass-color      | Grass color                               | #639c5b       |
| --deep-sea-grass-height     | Grass height in percentage                | 60%           |

# License

MIT License
npm package: @houdini-css-paint/depth-spiral
Description: CSS Paintlet for drawing a 2D spiral
Author: Georgi Nikolov
Latest version: 0.1.1

# CSS Houdini Deep Sea

A CSS Houdini Paintlet to render configurable 2D spiral.

![Depth Spiral Paintlet Render](https://css-houdini-dojo.georgi-nikolov.com/images/depth-spiral-paintlet-export.png)

Demo Page - [http://css-houdini-dojo.georgi-nikolov.com](http://css-houdini-dojo.georgi-nikolov.com/)

## 1. Load the Worklet

Using CDN is the easiest way to add this Worklet:

```
if ('paintWorklet' in CSS) {
  CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/depth-spiral/index.js');
}
```

## 2. Polyfill

To add support for all modern browsers, you can load the worklet with [css-paint-polyfill](https://github.com/GoogleChromeLabs/css-paint-polyfill) fallback.

```
<script>
  ;(async function() {
    if (CSS['paintWorklet'] === undefined)
      await import('https://unpkg.com/css-paint-polyfill')

    CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/depth-spiral/index.js')
  })()
</script>
```

## 3. Using the Paintlet

To use this Paintlet after you have succesffuly loaded it, you need to add `background(-image): paint(depth-spiral)` to any HTML element on your page. You can control its appearance just like any other regular image referenced in CSS with properties such as `background-size`, `background-repeat`, `background-position` and so on.

```
.my-element {
  --depth-spiral-min-radius: 10%;
  --depth-spiral-max-radius: 100%;
  --depth-spiral-num-points: 200;
  --depth-spiral-angle: 183deg;
  --depth-spiral-line-width: 1;
  --depth-spiral-color: #aaaaaa;

  background-image: paint(depth-spiral);
}
```

| Property                  | Description                                     | Default Value |
| ------------------------- | ----------------------------------------------- | ------------- |
| --depth-spiral-min-radius | Minimum radius of the spiral in percentages     | 10%           |
| --depth-spiral-max-radius | Maximum radius of the spiral in percentages     | 100%          |
| --depth-spiral-num-points | How many point to add to the spiral             | 10            |
| --depth-spiral-angle      | The spiral angle expressed in degrees / radians | 0deg          |
| --depth-spiral-color      | The color to use for stroke                     | #333          |
| --depth-spiral-line-width | The line-width to use for stroke                | 1             |

# License

MIT License
npm package: @houdini-css-paint/loop
Description: A CSS Houdini Paintlet to render configurable 2D loop around a circle.
Author: Georgi Nikolov
Latest version: 0.1.1

# CSS Houdini Deep Sea

A CSS Houdini Paintlet to render configurable 2D loop around a circle.

![Depth Spiral Paintlet Render](https://css-houdini-dojo.georgi-nikolov.com/images/loop-paintlet-export.png)

Demo Page - [http://css-houdini-dojo.georgi-nikolov.com](http://css-houdini-dojo.georgi-nikolov.com/)

## 1. Load the Worklet

Using CDN is the easiest way to add this Worklet:

```
if ('paintWorklet' in CSS) {
  CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/loop/index.js');
}
```

## 2. Polyfill

To add support for all modern browsers, you can load the worklet with [css-paint-polyfill](https://github.com/GoogleChromeLabs/css-paint-polyfill) fallback.

```
<script>
  ;(async function() {
    if (CSS['paintWorklet'] === undefined)
      await import('https://unpkg.com/css-paint-polyfill')

    CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/loop/index.js')
  })()
</script>
```

## 3. Using the Paintlet

To use this Paintlet after you have succesffuly loaded it, you need to add `background(-image): paint(loop)` to any HTML element on your page. You can control its appearance just like any other regular image referenced in CSS with properties such as `background-size`, `background-repeat`, `background-position` and so on.

```
.my-element {
  --loop-number-sides: 6;
  --loop-rotation: 0deg;
  --loop-size: 100%;
  --loop-stroke-color: #444444;
  --loop-stroke-width: 1;

  background-image: paint(loop);
}
```

| Property            | Description                         | Default Value |
| ------------------- | ----------------------------------- | ------------- |
| --loop-number-sides | The number of generated sides       | 6             |
| --loop-rotation     | Rotation expressed as deg / radians | 0deg          |
| --loop-size         | Size expressed as percentage        | 100%          |
| --loop-stroke-color | The stroke color                    | #eee          |
| --loop-stroke-width | The stroke width                    | 1             |

# License

MIT License
npm package: @houdini-css-paint/quadratic-curve
Description: CSS Paintlet for drawing a 2D quadratic bezier curve
Author: Georgi Nikolov
Latest version: 0.1.1

# CSS Houdini Deep Sea

A CSS Houdini Paintlet to render configurable 2D quadratic curve.

![Depth Spiral Paintlet Render](https://css-houdini-dojo.georgi-nikolov.com/images/quadratic-curve-paintlet-export.png)

Demo Page - [http://css-houdini-dojo.georgi-nikolov.com](http://css-houdini-dojo.georgi-nikolov.com/)

## 1. Load the Worklet

Using CDN is the easiest way to add this Worklet:

```
if ('paintWorklet' in CSS) {
  CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/quadratic-curve/index.js');
}
```

## 2. Polyfill

To add support for all modern browsers, you can load the worklet with [css-paint-polyfill](https://github.com/GoogleChromeLabs/css-paint-polyfill) fallback.

```
<script>
  ;(async function() {
    if (CSS['paintWorklet'] === undefined)
      await import('https://unpkg.com/css-paint-polyfill')

    CSS.paintWorklet.addModule('https://unpkg.com/@houdini-css-paint/quadratic-curve/index.js')
  })()
</script>
```

## 3. Using the Paintlet

To use this Paintlet after you have succesffuly loaded it, you need to add `background(-image): paint(quadratic-curve)` to any HTML element on your page. You can control its appearance just like any other regular image referenced in CSS with properties such as `background-size`, `background-repeat`, `background-position` and so on.

```
.my-element {
  --quadratic-curve-number-points: 6;
  --quadratic-curve-stroke-width: 3;
  --quadratic-curve-stroke-color: #d35400;
  --quadratic-curve-helper-stroke-color: #999999;
  --quadratic-curve-helper-radius: 5;
  --quadratic-curve-helper-background-color: #c0392b;
  --quadratic-curve-helper-accent-color: #f1c40f;

  background-image: paint(quadratic-curve);
}
```

| Property                                  | Description                                 | Default Value       |
| ----------------------------------------- | ------------------------------------------- | ------------------- |
| --quadratic-curve-number-points           | The number of points in the curve           | 3                   |
| --quadratic-curve-stroke-width            | The stroke width for the bezier curve       | 3                   |
| --quadratic-curve-stroke-color            | The stroke color for the bezier curve       | orange              |
| --quadratic-curve-helper-stroke-color     | The stroke color for the helper line        | rgba(0, 0, 0, 0.15) |
| --quadratic-curve-helper-radius           | The radius for the helper circles           | 5                   |
| --quadratic-curve-helper-background-color | The background color for the helper circles | #c0392b             |
| --quadratic-curve-helper-accent-color     | The accent color for the helper circles     | #f1c40f             |

# License

MIT License
npm package: @houdiniproject/noticeme
Description: A NOTICE.txt generator for npm
Author: Houdini Project and Microsoft Open Source Programs Office
Latest version: 1.3.0

# NOTICEME

A NOTICE generator and verifier for npm packages.

This is modified slightly to better meet the needs of the Houdini Project.

## Usage

```sh
# verifies that your NOTICE file is up to date
npx @houdiniproject/noticeme

# updates or creates your NOTICE file
npx @houdiniproject/noticeme -u
```

## Features

This uses the https://clearlydefined.io/ service and data to generate the
NOTICE.txt file from a package.json and an optional "included.json" file.

### included.json

It's common for open source developers to either vendor a package or copy in a portion of the package's code but
not add the originating package as a dependency. noticeme allows you to describe those packages using an `included.json`
file. The included.json file has the following format:

```json
//strictly speaking, the __explanation property is unneeded but it's helpful if you don't know what you're looking at.
{
    "__explanation": "packages where code was included from but isn't an NPM dependency. 'packages' is the list of packages",
    "packages": [
        {
            "name": "package1",
            "version": "0.6.3"
        },
        {
            "name": "package2",
            "version": "3.0.1"
        }
    ]
}
```

If you place the `included.json` file next to your `package.json` noticeme will automatically find it.

## DISCLAIMER

noticeme is helpful for creating NOTICE files but we make no warranty that it's accurate. It's your responsibility to comply with
any applicable licenses of the package you use.
npm package: @houdoku/extension-anatanomotokare
Description: id: cd578394-5662-4a33-a5cc-43a4494f0ed5
name: Anata no Motokare
url: https://motokare.xyz
version: 1.3.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-deathtollscans
Description: id: c683d87b-21b5-4ca6-ac1e-e03c5a9353c6
name: Death Toll Scans
url: https://www.deathtollscans.net
version: 1.4.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-disasterscans
Description: id: 62bf1a27-9e9a-463d-a6ac-1a14f98a3b8f
name: Disaster Scans
url: https://disasterscans.com
version: 1.7.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.7.1

ERROR: No README data found!
npm package: @houdoku/extension-hniscantrad
Description: id: 71fe47cd-770e-4b92-9db9-40aabf661d0c
name: HNI-SCANTRAD
url: http://hni-scantrad.com
version: 1.3.0
translatedLanguage: FRENCH
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-immortalupdates
Description: id: 351cd86f-10b8-4505-840c-bec6ee322f19
name: Immortal Updates
url: https://immortalupdates.com
version: 1.7.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.7.1

ERROR: No README data found!
npm package: @houdoku/extension-isekaiscan
Description: id: 29fb9be0-3933-4b75-bd59-3a6a9d21d83b
name: IsekaiScan
url: https://isekaiscan.com
version: 1.7.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.7.1

ERROR: No README data found!
npm package: @houdoku/extension-kireicake
Description: id: bc764bae-d7b1-4ef1-b6c7-87826300636f
name: Kirei Cake
url: https://kireicake.com
version: 1.4.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-komikcast
Description: id: e1fafe57-abe4-49d1-bf85-34cf6b2fef2a
name: Komikcast
url: https://komikcast.site
version: 1.3.1
translatedLanguage: INDONESIAN
hasSettings: no
Latest version: 1.3.1

ERROR: No README data found!
npm package: @houdoku/extension-lecercleduscan
Description: id: 0cd3f703-2dc2-41a7-98fa-ff79e40fc049
name: Le Cercle du Scan
url: http://www.lecercleduscan.com
version: 1.3.0
translatedLanguage: FRENCH
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-leviatanscans
Description: id: 1cf2993c-2219-4534-9bca-0231181e40ba
name: LeviatanScans
url: https://leviatanscans.com
version: 1.7.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.7.1

ERROR: No README data found!
npm package: @houdoku/extension-lilyreader
Description: id: ea51b5da-3d32-47ca-b210-af6ac1a32b13
name: Lilyreader
url: https://manga.smuglo.li
version: 1.4.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-mangabat
Description: id: 6c1a28bb-f7d9-4769-9053-136ef5bfaafc
name: Mangabat
url: https://m.mangabat.com
version: 1.2.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.2.0

ERROR: No README data found!
npm package: @houdoku/extension-mangadex
Description: id: 6b4e9df1-b369-4adc-8d36-fe954dd793e3
name: MangaDex
url: https://mangadex.org
version: 1.6.1
translatedLanguage: MULTI
hasSettings: yes
Latest version: 1.6.1

ERROR: No README data found!
npm package: @houdoku/extension-mangakakalot
Description: id: 974adb64-ec5d-4fee-8539-effc465456bd
name: Mangakakalot
url: https://mangakakalot.com
version: 1.2.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.2.0

ERROR: No README data found!
npm package: @houdoku/extension-mangakatana
Description: id: 5d6308d9-9afd-4567-8005-5c2f402e7e77
name: MangaKatana
url: https://mangakatana.com
version: 1.4.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-mangalife
Description: id: 859e5a3d-8ee4-4e38-b270-c8c3c80771d2
name: MangaLife
url: https://manga4life.com
version: 1.4.2
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.2

ERROR: No README data found!
npm package: @houdoku/extension-mangapill
Description: id: aa693b84-49bd-4b8f-8f3e-1ef53a3bb8e0
name: Mangapill
url: https://mangapill.com
version: 1.3.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-mangasee
Description: id: d57a50b2-d0e1-4edd-9790-932e721a2330
name: MangaSee
url: https://mangasee123.com
version: 1.4.2
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.2

ERROR: No README data found!
npm package: @houdoku/extension-menudofansub
Description: id: cb8a44b7-2c8b-46cd-817c-ecbb36b48c2a
name: Menudo-Fansub
url: http://www.menudo-fansub.com
version: 1.3.0
translatedLanguage: SPANISH_ES
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-nana
Description: id: 090ac5a7-c53e-41bf-8e7a-e7a6c5010b0f
name: Nana
url: https://nana.my.id
version: 1.0.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.0.0

ERROR: No README data found!
npm package: @houdoku/extension-nhentai
Description: id: 4e4f267e-e787-43e3-9697-6ef7adc8f4ee
name: nhentai
url: https://nhentai.net
version: 1.4.0
translatedLanguage: MULTI
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-nifteam
Description: id: 79b322b0-2d0e-490c-89ec-a46bbdbd8445
name: NIF Team
url: https://nifteam.info
version: 1.3.0
translatedLanguage: ITALIAN
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-phoenixscans
Description: id: 09b167ef-3325-4293-b971-8ada4b3bc76e
name: Phoenix Scans
url: https://www.phoenixscans.com
version: 1.3.0
translatedLanguage: ITALIAN
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-readcomiconline
Description: id: 3519e029-4355-474f-89dd-d0be29c2b2d6
name: ReadComicOnline
url: https://readcomiconline.li/
version: 1.3.0
translatedLanguage: ENGLISH
hasSettings: yes
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-sensescans
Description: id: 2f94ffbc-905d-4c37-b038-b44f5130d7ce
name: Sense-Scans
url: https://www.sensescans.com
version: 1.4.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-silentsky
Description: id: 5c36ddc9-e9e5-4528-9fa1-a64bbd5ee466
name: Silent Sky
url: https://www.silentsky-scans.net
version: 1.4.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.0

ERROR: No README data found!
npm package: @houdoku/extension-sleepingknightscans
Description: id: cd649429-6b6a-4874-96cd-4914b64e5002
name: Sleeping Knight Scans
url: https://skscans.com
version: 1.7.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.7.1

ERROR: No README data found!
npm package: @houdoku/extension-tcb-scans
Description: id: 7dc33cee-e023-11ed-b5ea-0242ac120002
name: TCB - Scans
url: https://onepiecechapters.com
version: 1.0.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.0.1

ERROR: No README data found!
npm package: @houdoku/extension-tortugaceviri
Description: id: 2641b63d-8260-41a5-91ea-29163e6bf663
name: Tortuga Çeviri
url: https://tortuga-ceviri.com
version: 1.3.1
translatedLanguage: TURKISH
hasSettings: no
Latest version: 1.3.1

ERROR: No README data found!
npm package: @houdoku/extension-tritiniascans
Description: id: d7d78a43-0bef-4fb8-ae56-dc761470f0a3
name: Tritinia Scans
url: https://tritinia.com
version: 1.7.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.7.1

ERROR: No README data found!
npm package: @houdoku/extension-tuttoanimemanga
Description: id: eafdaafb-4e39-4cc9-a555-c0d3af31674e
name: Tutto Anime Manga
url: https://tuttoanimemanga.net
version: 1.3.0
translatedLanguage: ITALIAN
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-yuriism
Description: id: b93eb11e-bfa7-4911-b531-5bbcb25ca11e
name: Yuri-ism
url: https://yuri-ism.com
version: 1.3.0
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.3.0

ERROR: No README data found!
npm package: @houdoku/extension-zandynofansub
Description: id:  35d81ff4-8a58-413f-a6de-d29a4afa611c 
name: Zandy no Fansub
url: https://zandynofansub.aishiteru.org
version: 1.4.1
translatedLanguage: ENGLISH
hasSettings: no
Latest version: 1.4.1

ERROR: No README data found!
npm package: @houheaven/eslint-config-prettier
Description: 为 Eslint 添加 Prettier 功能
Author: 立树
Latest version: 1.0.1

# @houheaven/eslint-config-prettier

> 为 Eslint 添加 Prettier 功能


## 安装

```sh
npm install --dev @houheaven/eslint-config-prettier
```

请确保你已经安装了 `eslint` 、`prettier`

## 用法

在 Eslint 配置文件中的 `"extends"` 数组里添加 `"@houheaven/eslint-config-prettier"`，
一定要放在数组的**最后**，这样才能覆盖掉其他的配置。

```js
// .eslintrc.js

module.exports = {
  extends: [
    // ... 其他配置
    "@houheaven/eslint-config-prettier"
  ]
}
```

## 修改 Prettier 格式化规则

Prettier 格式化规则详见官网：https://prettier.io/

### 方式一：创建 prettier 配置文件  

```js
// .prettierrc.js

module.exports = {
  useTabs: true,
  singleQuote: true,
  // ... 其他配置
};
```

### 方式二：修改 rules

在 Eslint 配置文件中的 `"rules"` 里添加 prettier 规则。  

```js
// .eslintrc.js

module.exports = {
  rules: {
    "prettier/prettier": [
      "error", {
        useTabs: true,
        singleQuote: true,
      }
    ]
  }
};
```

## 更多

功能依赖：
- [`eslint-plugin-prettier`](https://github.com/prettier/eslint-plugin-prettier/#recommended-configuration)  
- [`eslint-config-prettier`](https://github.com/prettier/eslint-config-prettier)
npm package: @houheaven/stylelint-config-helper
Description: Stylelint 规则助手
Author: 立树
Latest version: 1.2.0


# @houheaven/stylelint-config-helper

> Stylelint 规则助手  
> 主要功能是处理 css、less 中的语法校验、代码格式化  

## 特点  
- 内置了 `stylelint` 全部规则，并对其规则进行了优化
- 默认支持 CSS 文件，可直接修改规则
- 默认支持 Less 文件，可直接修改规则，无需配置（依赖于 `postcss-less`）
- 默认支持 Vue 文件，可直接修改规则，无需配置（依赖于 `postcss-html`）
- 默认支持 html 文件，可直接修改规则，无需配置（依赖于 `postcss-html`）

## 安装

```sh
npm install --dev @houheaven/stylelint-config-helper
```

## 用法

在 Stylelint 配置文件中的 `"extends"` 数组里添加 `"@houheaven/stylelint-config-helper"`

```js
// .stylelintrc.js

module.exports = {
  extends: [
    // ... 其他配置
    "@houheaven/stylelint-config-helper"
  ]
};
```

## 修改 Stylelint 规则

在 Stylelint 配置文件中的 `"rules"` 里添加规则。  

```js
// .stylelintrc.js

module.exports = {
  rules: {
    "indentation": "2",
    "linebreaks": "unix",
    "color-hex-case": "lower",
    "color-hex-length": "short",
    "number-leading-zero": "always",
    "unit-no-unknown": [true, {
      ignoreUnits: ["rpx"],
    }],
  }
};
```

- 查看 [`Stylelint 官网`](https://stylelint.io/)  
- 查看 [`Stylelint 规则文档`](https://stylelint.io/user-guide/rules/list)  

## 更多

功能依赖：
- [`stylelint`](https://www.npmjs.com/package/stylelint)  
- [`stylelint-config-standard`](https://www.npmjs.com/package/stylelint-config-standard)  
- [`postcss-html`](https://www.npmjs.com/package/postcss-html)  
- [`postcss-less`](https://www.npmjs.com/package/postcss-less)
npm package: @houhoucoop/go-abbr
Description: A text converter that generate minimal abbreviations for every word following rules, like internationalization -> i18n). 
Author: @houhoucoop
Latest version: 1.0.0

# Go abbr
[![Build Status](https://travis-ci.org/qq7886/go-abbr.svg?branch=master)](https://travis-ci.org/qq7886/go-abbr)
A text converter that generate minimal abbreviations for every word following rules. [DEMO](https://codepen.io/qq7886/full/deYLeY/)

## Rules
* Turn any words within that string of length 4 or greater into an abbreviation.
* The format includes first letter, then the number of removed characters, then the last letter.
* Space or hyphen will split up a series of letters into two words.

## Usage
```bash
npm i go-abbr --save
```

```js
const goAbbr = require('go-abbr');

goAbbr('abb'); // abb
goAbbr('abbr'); // a2r
goAbbr('abbreviation'); // a10n
goAbbr('go-abbreviation'); // go-a10n
```
npm package: @houhoucoop/react-i18n
Description: i18n for React handling translations.
Author: @houhoucoop
Latest version: 1.0.1

# react-i18n

> i18n utilities for React handling translations.

[![NPM](https://img.shields.io/npm/v/react-i18n.svg)](https://www.npmjs.com/package/react-i18n) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)

## Install

```bash
npm install --save react-i18n
```

## Example
```jsx
import { IntlProvider, useIntl } from 'react-i18n'

const translations = {
    EN: {
      sample: {
        hello: 'Hello World!'
      },
    },
    FR: {
      sample: {
        hello: 'Bonjour Monde!'
      },
    },
};

const Example = () => (
  <IntlProvider locale='en' translations={translations}>
    <MyComponent />
  </IntlProvider>
)

const MyComponent = () => {
  const { t, setLocale } = useIntl()

  return (
    <>
      <p>{t('sample.hello')}</p>
      <button onClick={() => setLocale('fr')}>Switch to `FR`</button>
    </>
  )
}
```
## Usage
### IntlProvider

> Component used to provide i18n context to child components.

-   `locale` - The locale language, it will be converted to uppercase in order to matches the keys in translations.
-   `translations` - This should be an object
    where keys are locales, and values are maps of message keys to translated
    strings.

### useIntl

> Provides a React hook which lets you
call into the translate function directly.

-   `t` - The locale to translate things into.
-   `setLocale` - Set current locale to another.

```jsx
import { Intl } from 'react-i18n'

const Component = () => {
  const { t, setLocale } = useIntl()
  return (
    <>
      <p>{t('sample.hello')}</p>
      <button onClick={() => setLocale('fr')}>Switch to `FR`</button>
    </>
  );
}
```
### Intal

> Get the translate function in render props way.

-   `t` - The locale to translate things into.
-   `setLocale` - Set current locale to another.

```jsx
import { useIntl } from 'react-i18n'

const Component = () => (
  <Intl>
    {({ t, setLocale }) => {
      return (
        <p>{t('sample.hello')}</p>
        <button onClick={() => setLocale('fr')}>Switch to `FR`</button>
      )
    }}
  <Intl />
)
```
## License

MIT © [@houhoucoop](https://github.com/@houhoucoop)
npm package: @houhoucoop/react-router
Description: A simple react router implementation
Author: @houhoucoop
Latest version: 1.0.1

# react-router

> A simple react router implementation

[![NPM](https://img.shields.io/npm/v/react-router.svg)](https://www.npmjs.com/package/react-router) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)

## Install

```bash
npm install --save @houhoucoop/react-router
```

## Usage

```jsx
import React from 'react'
import { Router, Switch, Route, Link } from 'react-router'

const App = () => {
  return (
    <>
      <Router>
        <ul>
          <li><Link to='/'>Home</Link></li>
          <li><Link to='/story'>Story</Link></li>
          <li><Link to='/about/houhou'>About Houhou</Link></li>
        </ul>
        <Switch>
          <Route path='/'>Home</Route>
          <Route path='/story'>Story</Route>
          <Route path='/about/:id'>
            <About />
          </Route>
          <Route>No match</Route>
        </Switch>
      </Router>
    </>
  )
}
```

## License

MIT © [@houhoucoop](https://github.com/@houhoucoop)
npm package: @houhuayuan/link-handbook
Description: Periodic link bulletin (data snapshot) for internal/reference use.
Latest version: 0.1.3

更新于 2025/08/27

## 不要使用国内浏览器

1. 经证实，国内浏览器如 UC 等会在用户未主动同意的情况下屏蔽部分“不合规”网站，后花园和黑沼泽就在内。
2. 如果下文的地址无法访问，iOS 设备用户请使用 Safari，Android 设备用户请使用 Chrome，Firefox 或 Edge 等任意国际领先的知名浏览器访问。

## 说明

1. 把 “censor:” 换成 “https://”
2. 把 “-“ 换成 “.”
3. 收藏本页面以获取最新地址

## 蔷薇后花园

censor:houhuayuan-vip

## 黑沼泽俱乐部

censor:zhaoze-net

## 组织和联系方式

- 站长 Telegram: @iamisamu
- 真·蔷薇后花园 Telegram 群: @shin_houhuayuan