diff --git a/.gitignore b/.gitignore index 57eb077..d7883e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,35 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# dependencies (bun install) +node_modules -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz +# output +out +*.tgz -# testing -/coverage +# code coverage +coverage +*.lcov -# next.js -/.next/ -/out/ +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json -# production -/build +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript +# caches +.eslintcache +.cache *.tsbuildinfo -next-env.d.ts -# Remove test -/pages -/public +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store +# build output +dist diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..6bc2539 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +@moduletrace:registry=https://git.tben.me/api/packages/moduletrace/npm/ +//git.tben.me/api/packages/moduletrace/npm/:_authToken=${GITBEN_NPM_TOKEN} diff --git a/CLAUDE.md b/AGENTS.md similarity index 100% rename from CLAUDE.md rename to AGENTS.md diff --git a/README.md b/README.md index b3de987..e82ca1e 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,88 @@ -# Tailwind CSS UI +# @moduletrace/twui -A modular skeletal framework for tailwind css +A modular skeletal React component framework for Tailwind CSS v4. -## Perequisites +## Install -You need a couple of packages and settings to integrate this package +The package is published to the Moduletrace Gitea registry. Add this to your project's `.npmrc`: -### Packages +```ini +@moduletrace:registry=https://git.tben.me/api/packages/moduletrace/npm/ +``` -- React -- React Dom -- Tailwind CSS **version 4** +Then install the package with its required peers: -### CSS Base +```sh +bun add @moduletrace/twui react react-dom lucide-react tailwindcss +``` -This package contains a `base.css` file which has all the base css rules required to run. This css file must be imported in your base project, and it can be update in a separate `.css` file. +### Optional peers + +Only install these if you use the matching components: + +| Feature | Packages | +| ------------------------------------------------------- | ------------------------------------------------ | +| `editors/AceEditor` | `ace-builds` | +| `elements/RemoteCodeBlock`, `mdx/markdown/*` | `next-mdx-remote`, `remark-gfm`, `rehype-prism-plus` | +| `mdx/mdx-components`, `next-js/hooks/useMDXComponents` | `@types/mdx` (dev) | +| `elements/ai/*` | `openai` (types), `react-markdown` | + +`editors/TinyMCE` loads TinyMCE from a URL at runtime. Set it with the `base_url` prop, or with the `NEXT_PUBLIC_TINYMCE_BASE_URL` / `BUNEXT_PUBLIC_TINYMCE_BASE_URL` public env vars. + +## CSS + +Import `base.css` once in your main stylesheet. It includes `@import "tailwindcss"`, the default theme tokens, and an `@source` rule so Tailwind generates the classes the components use. Override tokens in your own `@theme inline` block: ```css -@import "../path/to/twui/base.css"; +@import "@moduletrace/twui/base.css"; @theme inline { - --breakpoint-xs: 350px; - - --color-background-light: #ffffff; - --color-foreground-light: #171717; - --color-background-dark: #0c0e11; - --color-foreground-dark: #ededed; - --color-primary: #e2b433; --color-primary-hover: #9e7503; - --color-primary-outline: #29292b; - --color-primary-text: #29292b; --color-primary-dark: #e2b433; --color-primary-dark-hover: #f7cc59; - --color-primary-dark-outline: #e2b433; - --color-primary-dark-text: #f7cc59; - --color-secondary: #128b63; - --color-secondary-hover: #128b63; - --color-secondary-outline: #128b63; - --color-secondary-text: #128b63; - --color-secondary-dark: #128b63; - --color-secondary-dark-hover: #128b63; - --color-secondary-dark-outline: #128b63; - --color-secondary-dark-text: #128b63; - --color-accent: #000000; - --color-accent-hover: #dddddd; - --color-accent-outline: #dddddd; - --color-accent-text: #dddddd; - --color-accent-dark: #000000; - --color-accent-dark-hover: #dddddd; - --color-accent-dark-outline: #dddddd; - --color-accent-dark-text: #dddddd; - - --color-price: #16946a; - --color-price-dark: #77ceb1; + /* ...see base.css for the full list of tokens */ } -.styles { - @apply text-sm; +.twui-button-general { + @apply rounded-full; } ``` -### Install packages +## Usage -```sh -bun add lucide-react tailwind-merge html-to-react gray-matter mdx typescript lodash react-code-blocks react-responsive-modal next-mdx-remote remark-gfm rehype-prism-plus openai +Import from the root entry: + +```tsx +import { Button, Stack, Row, useStatus } from "@moduletrace/twui"; ``` -```sh -bun add -D @types/ace @types/react @types/react-dom tailwindcss @types/mdx @next/mdx +Or use deep imports, which mirror the source folder layout: + +```tsx +import Button from "@moduletrace/twui/layout/Button"; +import Input from "@moduletrace/twui/form/Input"; +import TinyMCEEditor from "@moduletrace/twui/editors/TinyMCE"; ``` + +Editors, MDX, Next.js helpers, the AI blocks and `RemoteCodeBlock` are **deep-import only**, so the root entry never pulls in optional peers. + +Component modules are marked `"use client"`, so they work in the Next.js App Router. + +## Development + +```sh +bun install +bun run typecheck +bun test src +bun run compile # tsc → dist/, then scripts/post-compile.ts +``` + +### Publishing + +```sh +export GITBEN_NPM_TOKEN=... +./publish.sh "Commit message" +``` + +`publish.sh` typechecks, tests, compiles, commits, pushes, and runs `bun publish`. Bump `version` in `package.json` first. diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..187f813 --- /dev/null +++ b/bun.lock @@ -0,0 +1,407 @@ +{ + "lockfileVersion": 2, + "configVersion": 1, + "workspaces": { + "": { + "name": "@moduletrace/twui", + "dependencies": { + "lodash": "^4.18.1", + "tailwind-merge": "^3.7.0", + }, + "devDependencies": { + "@types/ace": "^0.0.52", + "@types/bun": "^1.4.3", + "@types/lodash": "^4.17.26", + "@types/mdx": "^2.0.14", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "ace-builds": "^1.45.0", + "lucide-react": "^1.59.0", + "next-mdx-remote": "^6.0.0", + "openai": "^7.38.0", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-markdown": "^10.1.0", + "rehype-prism-plus": "^2.0.2", + "remark-gfm": "^4.0.1", + "tailwindcss": "^4.3.3", + "typescript": "^5.9.3", + }, + "peerDependencies": { + "ace-builds": "^1.40.0", + "lucide-react": ">=0.577.0", + "next-mdx-remote": "^6.0.0", + "openai": ">=6.0.0", + "react": ">=18", + "react-dom": ">=18", + "react-markdown": ">=9.0.0", + "rehype-prism-plus": "^2.0.0", + "remark-gfm": "^4.0.0", + "tailwindcss": "^4", + }, + "optionalPeers": [ + "ace-builds", + "next-mdx-remote", + "openai", + "react-markdown", + "rehype-prism-plus", + "remark-gfm", + ], + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + + "@types/ace": ["@types/ace@0.0.52", "", {}, "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ=="], + + "@types/bun": ["@types/bun@1.4.3", "", { "dependencies": { "bun-types": "1.4.3" } }, "sha512-N67Pqy8JXbAY/j0tNraS3V5mubGvc6rrrNDmDCtZLlFzccbUJPDb0tvgUBC5q4m8ybkP93Jcn1QB+RYQ6PvBhw=="], + + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.5", "", { "dependencies": { "@types/unist": "*" } }, "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g=="], + + "@types/lodash": ["@types/lodash@4.17.26", "", {}, "sha512-48NWfiY6oNcKOh47Z4h+sIvwcQR91h6KPhaYKgeMIrkT2jV82Gy90SErj60vW8jQbeMSOSbhIv3bZ7JoqPPVhA=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.14", "", {}, "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@26.6.5", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg=="], + + "@types/prismjs": ["@types/prismjs@1.26.6", "", {}, "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw=="], + + "@types/react": ["@types/react@19.3.0", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg=="], + + "@types/react-dom": ["@types/react-dom@19.3.0", "", { "peerDependencies": { "@types/react": "^19.3.0" } }, "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.4.0", "", {}, "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ=="], + + "ace-builds": ["ace-builds@1.45.0", "", {}, "sha512-tAAorvbQRlsdDeuf4RnBLgaRk4HVT9td2D4QKEqXyuQkZmFoqHxl9JuV2o1XkuDT+zOreooGPiG1tU/Y+pNFkg=="], + + "acorn": ["acorn@8.19.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "bun-types": ["bun-types@1.4.3", "", { "dependencies": { "@types/node": "*", "undici-types": "*" } }, "sha512-tinRJNGOmUN+tEAsn2y2e942n9JHRHR42iUYzDH75NmhJqVBokGSQkkfSFdNWwsANIdrK6ACH9t01M452YyTwg=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], + + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lucide-react": ["lucide-react@1.59.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-5qgMyyCPU6OvnKpLS2t693+ZtiqA8oaSweWoUows0BLFKFf6V75m4+CptpmohZHpD5IuOVIBXHBBiv2vpLJmtw=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-xPgpDNl0/OXHsI7TlaIs22lWnH3KlpvZdXG1ET/m/YT2Hhdkx8lJV4kLphE6l9simyM4KPDFBwas08BgEob6Jw=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.2.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-character": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "micromark": ["micromark@4.0.3", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.4", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.1.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.3" } }, "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.2", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-edit-map": ["micromark-util-edit-map@1.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.3", "", {}, "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "next-mdx-remote": ["next-mdx-remote@6.0.0", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@mdx-js/mdx": "^3.0.1", "@mdx-js/react": "^3.0.1", "unist-util-remove": "^4.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.1", "vfile-matter": "^5.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-cJEpEZlgD6xGjB4jL8BnI8FaYdN9BzZM4NwadPe1YQr7pqoWjg9EBCMv3nXBkuHqMRfv2y33SzUsuyNh9LFAQQ=="], + + "openai": ["openai@7.38.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", "@smithy/hash-node": ">=4.3.0 <5", "@smithy/signature-v4": ">=5.4.0 <6", "undici": ">=5 <9", "ws": "^8.21.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@aws-sdk/credential-provider-node", "@smithy/hash-node", "@smithy/signature-v4", "undici", "ws", "zod"] }, "sha512-Ef+YyIeoiisZLP/tV4F4/RieJAl4OEJTyJg6gV0AXOb0T9CDkvYJoU224OY5CTmQ4zDJeku4jEHjz2b3/6Ndhw=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-numeric-range": ["parse-numeric-range@1.3.0", "", {}, "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], + + "react": ["react@19.3.1", "", {}, "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw=="], + + "react-dom": ["react-dom@19.3.1", "", { "dependencies": { "scheduler": "^0.28.0" }, "peerDependencies": { "react": "^19.3.1" } }, "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ=="], + + "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "refractor": ["refractor@5.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^9.0.0", "parse-entities": "^4.0.0" } }, "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw=="], + + "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], + + "rehype-prism-plus": ["rehype-prism-plus@2.0.2", "", { "dependencies": { "hast-util-to-string": "^3.0.1", "parse-numeric-range": "^1.3.0", "refractor": "^5.0.0", "rehype-parse": "^9.0.1", "unist-util-filter": "^5.0.1", "unist-util-visit": "^5.1.0" } }, "sha512-jTHb8ZtQHd2VWAAKeCINgv/8zNEF0+LesmwJak69GemoPVN9/8fGEARTvqOpKqmN57HwaM9z8UKBVNVJe8zggw=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "scheduler": ["scheduler@0.28.0", "", {}, "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "tailwind-merge": ["tailwind-merge@3.7.0", "", {}, "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA=="], + + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@8.12.2", "", {}, "sha512-VoMeD2O0KdHhcn+oPqOrpivN+7aDOklVSwOLD7JNjbzV1CboAFek9IFOXnreoufTUtAsCsOK0iETiERPNR/fDA=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-util-filter": ["unist-util-filter@5.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-matter": ["vfile-matter@5.0.1", "", { "dependencies": { "vfile": "^6.0.0", "yaml": "^2.0.0" } }, "sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@types/node/undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 7f7418e..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/components/(utils)/ejson.ts b/components/(utils)/ejson.ts deleted file mode 100644 index b4f0528..0000000 --- a/components/(utils)/ejson.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * # EJSON parse string - */ -function parse( - string: string | null | number, - reviver?: (this: any, key: string, value: any) => any -): { [s: string]: any } | { [s: string]: any }[] | undefined { - if (!string) return undefined; - if (typeof string == "object") return string; - if (typeof string !== "string") return undefined; - try { - return JSON.parse(string, reviver); - } catch (error) { - return undefined; - } -} - -/** - * # EJSON stringify object - */ -function stringify( - value: any, - replacer?: ((this: any, key: string, value: any) => any) | null, - space?: string | number -): string | undefined { - try { - return JSON.stringify(value, replacer || undefined, space); - } catch (error) { - return undefined; - } -} - -const EJSON = { - parse, - stringify, -}; - -export default EJSON; diff --git a/components/Readme.md b/components/Readme.md deleted file mode 100644 index ac57f17..0000000 --- a/components/Readme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Tailwind CSS UI - -A modular skeletal framework for tailwind css - -## Perequisites - -You need a couple of packages and settings to integrate this package - -### Packages - -- React -- React Dom -- Tailwind CSS **version 4** - -### CSS Base - -This package contains a `base.css` file which has all the base css rules required to run. This css file must be imported in your base project, and it can be update in a separate `.css` file. - -### Install packages - -```sh -bun add lucide-react tailwind-merge html-to-react gray-matter mdx typescript lodash react-code-blocks react-responsive-modal next-mdx-remote remark-gfm rehype-prism-plus openai ace-builds -``` - -```sh -bun add -D @types/ace @types/react @types/react-dom tailwindcss @types/mdx @next/mdx -``` diff --git a/components/bun.lock b/components/bun.lock deleted file mode 100644 index 24c7d85..0000000 --- a/components/bun.lock +++ /dev/null @@ -1,193 +0,0 @@ -{ - "lockfileVersion": 1, - "workspaces": { - "": { - "name": "tailwind-ui", - "dependencies": { - "@xterm/xterm": "latest", - "html-to-react": "^1.7.0", - "lodash": "latest", - "lucide-react": "latest", - "react-code-blocks": "latest", - "react-responsive-modal": "latest", - "tailwind-merge": "latest", - "typescript": "latest", - }, - "devDependencies": { - "@next/mdx": "latest", - "@types/ace": "latest", - "@types/bun": "latest", - "@types/lodash": "latest", - "@types/mdx": "latest", - "@types/node": "latest", - "@types/react": "latest", - "@types/react-dom": "latest", - "postcss": "latest", - "tailwindcss": "^4", - }, - }, - }, - "packages": { - "@babel/runtime": ["@babel/runtime@7.27.1", "", {}, "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog=="], - - "@bedrock-layout/use-forwarded-ref": ["@bedrock-layout/use-forwarded-ref@1.6.1", "", { "dependencies": { "@bedrock-layout/use-stateful-ref": "^1.4.1" }, "peerDependencies": { "react": "^16.8 || ^17 || ^18" } }, "sha512-GD9A9AFLzFNjr7k6fgerSqxfwDWl+wsPS11PErOKe1zkVz0y7RGC9gzlOiX/JrgpyB3NFHWIuGtoOQqifJQQpw=="], - - "@bedrock-layout/use-stateful-ref": ["@bedrock-layout/use-stateful-ref@1.4.1", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18" } }, "sha512-4eKO2KdQEXcR5LI4QcxqlJykJUDQJWDeWYAukIn6sRQYoabcfI5kDl61PUi6FR6o8VFgQ8IEP7HleKqWlSe8SQ=="], - - "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.2.2", "", { "dependencies": { "@emotion/memoize": "^0.8.1" } }, "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw=="], - - "@emotion/memoize": ["@emotion/memoize@0.8.1", "", {}, "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="], - - "@emotion/unitless": ["@emotion/unitless@0.8.1", "", {}, "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="], - - "@next/mdx": ["@next/mdx@15.3.2", "", { "dependencies": { "source-map": "^0.7.0" }, "peerDependencies": { "@mdx-js/loader": ">=0.15.0", "@mdx-js/react": ">=0.15.0" }, "optionalPeers": ["@mdx-js/loader", "@mdx-js/react"] }, "sha512-D6lSSbVzn1EiPwrBKG5QzXClcgdqiNCL8a3/6oROinzgZnYSxbVmnfs0UrqygtGSOmgW7sdJJSEOy555DoAwvw=="], - - "@types/ace": ["@types/ace@0.0.52", "", {}, "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ=="], - - "@types/bun": ["@types/bun@1.2.13", "", { "dependencies": { "bun-types": "1.2.13" } }, "sha512-u6vXep/i9VBxoJl3GjZsl/BFIsvML8DfVDO0RYLEwtSZSp981kEO1V5NwRcO1CPJ7AmvpbnDCiMKo3JvbDEjAg=="], - - "@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="], - - "@types/lodash": ["@types/lodash@4.17.16", "", {}, "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="], - - "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], - - "@types/node": ["@types/node@22.15.19", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw=="], - - "@types/react": ["@types/react@19.1.4", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g=="], - - "@types/react-dom": ["@types/react-dom@19.1.5", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg=="], - - "@types/stylis": ["@types/stylis@4.2.5", "", {}, "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="], - - "@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - - "@xterm/xterm": ["@xterm/xterm@5.5.0", "", {}, "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="], - - "body-scroll-lock": ["body-scroll-lock@3.1.5", "", {}, "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg=="], - - "bun-types": ["bun-types@1.2.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-rRjA1T6n7wto4gxhAO/ErZEtOXyEZEmnIHQfl0Dt1QQSB4QV0iP6BZ9/YB5fZaHFQ2dwHFrmPaRQ9GGMX01k9Q=="], - - "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], - - "character-entities": ["character-entities@1.2.4", "", {}, "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="], - - "character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="], - - "character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="], - - "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], - - "comma-separated-tokens": ["comma-separated-tokens@1.0.8", "", {}, "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="], - - "css-color-keywords": ["css-color-keywords@1.0.0", "", {}, "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="], - - "css-to-react-native": ["css-to-react-native@3.2.0", "", { "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^4.0.2" } }, "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ=="], - - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - - "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], - - "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], - - "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], - - "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], - - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - - "fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="], - - "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], - - "hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="], - - "hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="], - - "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], - - "highlightjs-vue": ["highlightjs-vue@1.0.0", "", {}, "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA=="], - - "html-to-react": ["html-to-react@1.7.0", "", { "dependencies": { "domhandler": "^5.0", "htmlparser2": "^9.0", "lodash.camelcase": "^4.3.0" }, "peerDependencies": { "react": "^0.13.0 || ^0.14.0 || >=15" } }, "sha512-b5HTNaTGyOj5GGIMiWVr1k57egAZ/vGy0GGefnCQ1VW5hu9+eku8AXHtf2/DeD95cj/FKBKYa1J7SWBOX41yUQ=="], - - "htmlparser2": ["htmlparser2@9.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.1.0", "entities": "^4.5.0" } }, "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ=="], - - "is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="], - - "is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="], - - "is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="], - - "is-hexadecimal": ["is-hexadecimal@1.0.4", "", {}, "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="], - - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], - - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - - "lowlight": ["lowlight@1.20.0", "", { "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" } }, "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw=="], - - "lucide-react": ["lucide-react@0.511.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "parse-entities": ["parse-entities@2.0.0", "", { "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], - - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - - "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], - - "property-information": ["property-information@5.6.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="], - - "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], - - "react-code-blocks": ["react-code-blocks@0.1.6", "", { "dependencies": { "@babel/runtime": "^7.10.4", "react-syntax-highlighter": "^15.5.0", "styled-components": "^6.1.0", "tslib": "^2.6.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-ENNuxG07yO+OuX1ChRje3ieefPRz6yrIpHmebQlaFQgzcAHbUfVeTINpOpoI9bSRSObeYo/OdHsporeToZ7fcg=="], - - "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], - - "react-responsive-modal": ["react-responsive-modal@6.4.2", "", { "dependencies": { "@bedrock-layout/use-forwarded-ref": "^1.3.1", "body-scroll-lock": "^3.1.5", "classnames": "^2.3.1" }, "peerDependencies": { "react": "^16.8.0 || ^17 || ^18", "react-dom": "^16.8.0 || ^17 || ^18" } }, "sha512-ARjGEKE5Gu5CSvyA8U9ARVbtK4SMAtdXsjtzwtxRlQIHC99RQTnOUctLpl7+/sp1Kg1OJZ6yqvp6ivd4TBueEw=="], - - "react-syntax-highlighter": ["react-syntax-highlighter@15.6.1", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg=="], - - "refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="], - - "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - - "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], - - "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "space-separated-tokens": ["space-separated-tokens@1.1.5", "", {}, "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="], - - "styled-components": ["styled-components@6.1.18", "", { "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", "@types/stylis": "4.2.5", "css-to-react-native": "3.2.0", "csstype": "3.1.3", "postcss": "8.4.49", "shallowequal": "1.1.0", "stylis": "4.3.2", "tslib": "2.6.2" }, "peerDependencies": { "react": ">= 16.8.0", "react-dom": ">= 16.8.0" } }, "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw=="], - - "stylis": ["stylis@4.3.2", "", {}, "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="], - - "tailwind-merge": ["tailwind-merge@3.3.0", "", {}, "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ=="], - - "tailwindcss": ["tailwindcss@4.1.7", "", {}, "sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - - "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], - - "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - - "refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="], - - "styled-components/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], - - "styled-components/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], - } -} diff --git a/components/package.json b/components/package.json deleted file mode 100644 index 016ef6d..0000000 --- a/components/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "tailwind-ui", - "type": "module", - "dependencies": { - "@xterm/xterm": "latest", - "lodash": "latest", - "lucide-react": "latest", - "react-code-blocks": "latest", - "react-responsive-modal": "latest", - "tailwind-merge": "latest", - "typescript": "latest", - "mdx/types": "latest", - "gray-matter": "latest", - "next-mdx-remote": "latest", - "remark-gfm": "latest", - "rehype-prism-plus": "latest" - }, - "devDependencies": { - "@types/ace": "latest", - "@types/bun": "latest", - "@types/lodash": "latest", - "@types/node": "latest", - "@types/react": "latest", - "@types/react-dom": "latest", - "postcss": "latest", - "tailwindcss": "^4", - "@types/mdx": "latest", - "@next/mdx": "latest" - } -} diff --git a/next.config.mjs b/next.config.mjs deleted file mode 100644 index d5456a1..0000000 --- a/next.config.mjs +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: true, -}; - -export default nextConfig; diff --git a/package.json b/package.json index bfa2a20..80517ef 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,121 @@ { - "name": "tailwind-ui-library", + "name": "@moduletrace/twui", "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev -p 3270", - "build": "next build", - "start": "next start", - "lint": "next lint" + "description": "A modular skeletal React component framework for Tailwind CSS v4", + "author": "Benjamin Toby", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "sideEffects": [ + "*.css" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./base.css": "./dist/base.css", + "./form/Input": { + "types": "./dist/form/Input/index.d.ts", + "import": "./dist/form/Input/index.js", + "default": "./dist/form/Input/index.js" + }, + "./editors/TinyMCE": { + "types": "./dist/editors/TinyMCE/index.d.ts", + "import": "./dist/editors/TinyMCE/index.js", + "default": "./dist/editors/TinyMCE/index.js" + }, + "./composites/docs": { + "types": "./dist/composites/docs/index.d.ts", + "import": "./dist/composites/docs/index.js", + "default": "./dist/composites/docs/index.js" + }, + "./*": { + "types": "./dist/*.d.ts", + "import": "./dist/*.js", + "default": "./dist/*.js" + } }, + "scripts": { + "dev": "tsc --watch", + "compile": "rm -rf dist tsconfig.tsbuildinfo && tsc -p tsconfig.json && bun scripts/post-compile.ts", + "typecheck": "tsc -p tsconfig.json --noEmit", + "test": "bun test src", + "prepublishOnly": "bun run compile" + }, + "files": [ + "dist", + "README.md", + "package.json" + ], + "repository": { + "type": "git", + "url": "git+https://git.tben.me/Moduletrace/tailwind-ui-library.git" + }, + "publishConfig": { + "registry": "https://git.tben.me/api/packages/moduletrace/npm/" + }, + "keywords": [ + "react", + "tailwind", + "tailwindcss", + "ui", + "components" + ], "dependencies": { - "gray-matter": "^4.0.3", - "html-to-react": "^1.7.0", - "lodash": "^4.17.23", - "lucide-react": "^0.577.0", - "mdx": "^0.3.1", + "lodash": "^4.18.1", + "tailwind-merge": "^3.7.0" + }, + "peerDependencies": { + "ace-builds": "^1.40.0", + "lucide-react": ">=0.577.0", "next-mdx-remote": "^6.0.0", - "openai": "^6.25.0", - "postcss": "^8", - "react-code-blocks": "^0.1.6", - "react-responsive-modal": "^7.1.0", - "rehype-prism-plus": "^2.0.2", - "remark-gfm": "^4.0.1", - "tailwind-merge": "^3.5.0", - "tailwindcss": "^4.2.1" + "openai": ">=6.0.0", + "react": ">=18", + "react-dom": ">=18", + "react-markdown": ">=9.0.0", + "rehype-prism-plus": "^2.0.0", + "remark-gfm": "^4.0.0", + "tailwindcss": "^4" + }, + "peerDependenciesMeta": { + "ace-builds": { + "optional": true + }, + "next-mdx-remote": { + "optional": true + }, + "openai": { + "optional": true + }, + "react-markdown": { + "optional": true + }, + "rehype-prism-plus": { + "optional": true + }, + "remark-gfm": { + "optional": true + } }, "devDependencies": { - "@next/mdx": "^16.1.6", "@types/ace": "^0.0.52", - "@types/bun": "latest", - "@types/mdx": "^2.0.13", - "@types/node": "^20", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "typescript": "^5.9.3", - "@types/lodash": "^4.17.23" - }, - "exports": { - ".": "./components" + "@types/bun": "^1.4.3", + "@types/lodash": "^4.17.26", + "@types/mdx": "^2.0.14", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "ace-builds": "^1.45.0", + "lucide-react": "^1.59.0", + "next-mdx-remote": "^6.0.0", + "openai": "^7.38.0", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-markdown": "^10.1.0", + "rehype-prism-plus": "^2.0.2", + "remark-gfm": "^4.0.1", + "tailwindcss": "^4.3.3", + "typescript": "^5.9.3" } } diff --git a/postcss.config.mjs b/postcss.config.mjs deleted file mode 100644 index 1a69fd2..0000000 --- a/postcss.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { - tailwindcss: {}, - }, -}; - -export default config; diff --git a/publish.sh b/publish.sh new file mode 100755 index 0000000..708b922 --- /dev/null +++ b/publish.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set -euo pipefail + +cd "$(dirname "$0")" + +if [ -z "${1:-}" ]; then + msg="Updates" +else + msg="$1" +fi + +# Always use the project's TypeScript (global `tsc` may not emit) +export PATH="$(pwd)/node_modules/.bin:$PATH" + +if [ ! -x "./node_modules/.bin/tsc" ]; then + echo "Installing dependencies..." + bun install +fi + +echo "Typechecking..." +tsc -p tsconfig.json --noEmit + +echo "Testing..." +bun test src + +echo "Compiling..." +# Clear emit output AND incremental cache. Otherwise a prior --noEmit run leaves +# tsbuildinfo "up to date" and tsc emits nothing after `rm -rf dist`. +rm -rf dist tsconfig.tsbuildinfo +tsc -p tsconfig.json +bun scripts/post-compile.ts + +for f in dist/index.js dist/index.d.ts dist/base.css; do + if [ ! -f "$f" ]; then + echo "ERROR: compile failed — $f was not produced" + exit 1 + fi +done + +echo "Build OK" + +echo "Publishing package..." +git add -A +git commit -m "$msg" || true +git push || true +bun publish + +echo "Done." diff --git a/scripts/post-compile.ts b/scripts/post-compile.ts new file mode 100644 index 0000000..9c94c5f --- /dev/null +++ b/scripts/post-compile.ts @@ -0,0 +1,80 @@ +/** + * Runs after `tsc`: + * 1. Copies `src/base.css` into `dist/` (tsc only emits TS output). + * 2. Adds file extensions to relative imports (see addExtensions). + * 3. Prepends `"use client"` to component/hook modules so they work as + * client components under the Next.js App Router. Pure modules (utils, + * types, the barrel) are left alone so they stay usable on the server. + */ +import { Glob } from "bun"; +import path from "node:path"; + +const root = path.resolve(import.meta.dir, ".."); +const dist = path.join(root, "dist"); + +await Bun.write( + path.join(dist, "base.css"), + Bun.file(path.join(root, "src", "base.css")), +); + +/** + * tsc keeps extensionless relative specifiers ("./layout/Button"), which only + * bundlers resolve. Rewrite them to full paths so plain Node ESM (e.g. SSR + * with the package left external) can load the output too. + */ +async function resolveSpecifier(fromFile: string, specifier: string) { + if (/\.(js|css|json)$/.test(specifier)) return specifier; + + const base = path.resolve(path.dirname(fromFile), specifier); + + if (await Bun.file(`${base}.js`).exists()) return `${specifier}.js`; + if (await Bun.file(path.join(base, "index.js")).exists()) { + return `${specifier}/index.js`; + } + + return specifier; +} + +const RELATIVE_IMPORT = + /(\bfrom\s*|\bimport\s*\(\s*|\bimport\s+)(["'])(\.{1,2}\/[^"']*)\2/g; + +async function addExtensions(filePath: string, content: string) { + let result = ""; + let lastIndex = 0; + + for (const match of content.matchAll(RELATIVE_IMPORT)) { + const [full, prefix, quote, specifier] = match; + const resolved = await resolveSpecifier(filePath, specifier!); + result += content.slice(lastIndex, match.index); + result += `${prefix}${quote}${resolved}${quote}`; + lastIndex = match.index! + full.length; + } + + return result + content.slice(lastIndex); +} + +const SERVER_SAFE = [/^index\.js$/, /^types\.js$/, /^utils\//, /^\(utils\)\//]; + +let count = 0; + +for (const file of new Glob("**/*.{js,d.ts}").scanSync(dist)) { + const filePath = path.join(dist, file); + let content = await addExtensions( + filePath, + await Bun.file(filePath).text(), + ); + + const isClientModule = + file.endsWith(".js") && + !SERVER_SAFE.some((pattern) => pattern.test(file)) && + !content.startsWith('"use client"'); + + if (isClientModule) { + content = `"use client";\n${content}`; + count++; + } + + await Bun.write(filePath, content); +} + +console.log(`post-compile: copied base.css, marked ${count} client modules`); diff --git a/components/(functions)/popver/grab-popover-styles.ts b/src/(functions)/popver/grab-popover-styles.ts similarity index 100% rename from components/(functions)/popver/grab-popover-styles.ts rename to src/(functions)/popver/grab-popover-styles.ts diff --git a/components/(partials)/ModalComponent.tsx b/src/(partials)/ModalComponent.tsx similarity index 100% rename from components/(partials)/ModalComponent.tsx rename to src/(partials)/ModalComponent.tsx diff --git a/components/(partials)/PopoverComponent.tsx b/src/(partials)/PopoverComponent.tsx similarity index 100% rename from components/(partials)/PopoverComponent.tsx rename to src/(partials)/PopoverComponent.tsx diff --git a/components/(utils)/search-select/keyboard-ops.ts b/src/(utils)/search-select/keyboard-ops.ts similarity index 100% rename from components/(utils)/search-select/keyboard-ops.ts rename to src/(utils)/search-select/keyboard-ops.ts diff --git a/components/base.css b/src/base.css similarity index 98% rename from components/base.css rename to src/base.css index 87c18f2..f7e4c35 100644 --- a/components/base.css +++ b/src/base.css @@ -1,5 +1,8 @@ @import "tailwindcss"; +/* Lets Tailwind generate the classes used by the compiled components */ +@source "./"; + @theme inline { --breakpoint-xs: 350px; --breakpoint-xxs: 300px; diff --git a/components/composites/docs/TWUIDocsAside.tsx b/src/composites/docs/TWUIDocsAside.tsx similarity index 100% rename from components/composites/docs/TWUIDocsAside.tsx rename to src/composites/docs/TWUIDocsAside.tsx diff --git a/components/composites/docs/TWUIDocsLink.tsx b/src/composites/docs/TWUIDocsLink.tsx similarity index 100% rename from components/composites/docs/TWUIDocsLink.tsx rename to src/composites/docs/TWUIDocsLink.tsx diff --git a/components/composites/docs/TWUIDocsRightAside.tsx b/src/composites/docs/TWUIDocsRightAside.tsx similarity index 100% rename from components/composites/docs/TWUIDocsRightAside.tsx rename to src/composites/docs/TWUIDocsRightAside.tsx diff --git a/components/composites/docs/index.tsx b/src/composites/docs/index.tsx similarity index 100% rename from components/composites/docs/index.tsx rename to src/composites/docs/index.tsx diff --git a/components/editors/AceEditor.tsx b/src/editors/AceEditor.tsx similarity index 100% rename from components/editors/AceEditor.tsx rename to src/editors/AceEditor.tsx diff --git a/src/editors/TinyMCE/default-base-url.ts b/src/editors/TinyMCE/default-base-url.ts new file mode 100644 index 0000000..a79fece --- /dev/null +++ b/src/editors/TinyMCE/default-base-url.ts @@ -0,0 +1,22 @@ +const FALLBACK_BASE_URL = "https://www.datasquirel.com/tinymce-public"; + +/** + * Resolves the TinyMCE base URL from public env vars. Each lookup is wrapped + * in try/catch rather than a `typeof process` check: bundlers inline the full + * `process.env.X` expression, so the global `process` may still be undefined + * in the browser even when the value is available. + */ +export default function getTinyMCEDefaultBaseUrl(): string { + let nextUrl: string | undefined; + let bunextUrl: string | undefined; + + try { + nextUrl = process.env.NEXT_PUBLIC_TINYMCE_BASE_URL; + } catch {} + + try { + bunextUrl = process.env.BUNEXT_PUBLIC_TINYMCE_BASE_URL; + } catch {} + + return nextUrl || bunextUrl || FALLBACK_BASE_URL; +} diff --git a/components/editors/TinyMCE/index.tsx b/src/editors/TinyMCE/index.tsx similarity index 97% rename from components/editors/TinyMCE/index.tsx rename to src/editors/TinyMCE/index.tsx index cdf4cd3..b0b8b7c 100644 --- a/components/editors/TinyMCE/index.tsx +++ b/src/editors/TinyMCE/index.tsx @@ -4,6 +4,7 @@ import { twMerge } from "tailwind-merge"; import twuiSlugToNormalText from "../../utils/slug-to-normal-text"; import Border from "../../elements/Border"; import useTinyMCE from "./useTinyMCE"; +import getTinyMCEDefaultBaseUrl from "./default-base-url"; export type TinyMCEEditorProps = { options?: RawEditorOptions; @@ -102,9 +103,7 @@ export default function TinyMCEEditor({ const baseUrl = base_url || - process.env.NEXT_PUBLIC_TINYMCE_BASE_URL || - process.env.BUNEXT_PUBLIC_TINYMCE_BASE_URL || - "https://www.datasquirel.com/tinymce-public"; + getTinyMCEDefaultBaseUrl(); tinyMCE.init({ height: FINAL_HEIGHT, diff --git a/components/editors/TinyMCE/tinymce.d.ts b/src/editors/TinyMCE/tinymce.d.ts similarity index 100% rename from components/editors/TinyMCE/tinymce.d.ts rename to src/editors/TinyMCE/tinymce.d.ts diff --git a/components/editors/TinyMCE/tinymce.ts b/src/editors/TinyMCE/tinymce.ts similarity index 100% rename from components/editors/TinyMCE/tinymce.ts rename to src/editors/TinyMCE/tinymce.ts diff --git a/components/editors/TinyMCE/useTinyMCE.tsx b/src/editors/TinyMCE/useTinyMCE.tsx similarity index 88% rename from components/editors/TinyMCE/useTinyMCE.tsx rename to src/editors/TinyMCE/useTinyMCE.tsx index 1a0af59..de66924 100644 --- a/components/editors/TinyMCE/useTinyMCE.tsx +++ b/src/editors/TinyMCE/useTinyMCE.tsx @@ -1,5 +1,6 @@ import React from "react"; import type { TinyMCE } from "./tinymce"; +import getTinyMCEDefaultBaseUrl from "./default-base-url"; let interval: any; @@ -26,9 +27,7 @@ export default function useTinyMCE(params?: Params) { const baseUrl = params?.base_url || - process.env.NEXT_PUBLIC_TINYMCE_BASE_URL || - process.env.BUNEXT_PUBLIC_TINYMCE_BASE_URL || - "https://www.datasquirel.com/tinymce-public"; + getTinyMCEDefaultBaseUrl(); script.src = `${baseUrl}/tinymce.min.js`; script.async = true; diff --git a/components/editors/ace-editor-modes.ts b/src/editors/ace-editor-modes.ts similarity index 100% rename from components/editors/ace-editor-modes.ts rename to src/editors/ace-editor-modes.ts diff --git a/components/elements/Border.tsx b/src/elements/Border.tsx similarity index 100% rename from components/elements/Border.tsx rename to src/elements/Border.tsx diff --git a/components/elements/Breadcrumbs.tsx b/src/elements/Breadcrumbs.tsx similarity index 100% rename from components/elements/Breadcrumbs.tsx rename to src/elements/Breadcrumbs.tsx diff --git a/components/elements/Card.tsx b/src/elements/Card.tsx similarity index 100% rename from components/elements/Card.tsx rename to src/elements/Card.tsx diff --git a/components/elements/CheckBulletPoints.tsx b/src/elements/CheckBulletPoints.tsx similarity index 100% rename from components/elements/CheckBulletPoints.tsx rename to src/elements/CheckBulletPoints.tsx diff --git a/components/elements/CodeBlock.tsx b/src/elements/CodeBlock.tsx similarity index 100% rename from components/elements/CodeBlock.tsx rename to src/elements/CodeBlock.tsx diff --git a/components/elements/ColorSchemeSelector.tsx b/src/elements/ColorSchemeSelector.tsx similarity index 100% rename from components/elements/ColorSchemeSelector.tsx rename to src/elements/ColorSchemeSelector.tsx diff --git a/components/elements/CopySlug.tsx b/src/elements/CopySlug.tsx similarity index 100% rename from components/elements/CopySlug.tsx rename to src/elements/CopySlug.tsx diff --git a/components/elements/Dropdown.tsx b/src/elements/Dropdown.tsx similarity index 100% rename from components/elements/Dropdown.tsx rename to src/elements/Dropdown.tsx diff --git a/components/elements/EmptyContent.tsx b/src/elements/EmptyContent.tsx similarity index 95% rename from components/elements/EmptyContent.tsx rename to src/elements/EmptyContent.tsx index d0f3508..05b2029 100644 --- a/components/elements/EmptyContent.tsx +++ b/src/elements/EmptyContent.tsx @@ -7,9 +7,6 @@ import Row from "../layout/Row"; import Span from "../layout/Span"; import Link from "../layout/Link"; -export const ToastStyles = ["normal", "success", "error"] as const; -export const ToastColors = ToastStyles; - export type TWUIEmptyContentProps = ComponentProps & { title: string; url?: string; diff --git a/components/elements/HeaderLink.tsx b/src/elements/HeaderLink.tsx similarity index 100% rename from components/elements/HeaderLink.tsx rename to src/elements/HeaderLink.tsx diff --git a/components/elements/HeaderNav.tsx b/src/elements/HeaderNav.tsx similarity index 100% rename from components/elements/HeaderNav.tsx rename to src/elements/HeaderNav.tsx diff --git a/components/elements/HeaderNavLinkComponent.tsx b/src/elements/HeaderNavLinkComponent.tsx similarity index 100% rename from components/elements/HeaderNavLinkComponent.tsx rename to src/elements/HeaderNavLinkComponent.tsx diff --git a/components/elements/HtmlToReactComponent.tsx b/src/elements/HtmlToReactComponent.tsx similarity index 91% rename from components/elements/HtmlToReactComponent.tsx rename to src/elements/HtmlToReactComponent.tsx index 86bc526..8fdffc3 100644 --- a/components/elements/HtmlToReactComponent.tsx +++ b/src/elements/HtmlToReactComponent.tsx @@ -1,7 +1,7 @@ import type { DetailedHTMLProps, HTMLAttributes } from "react"; import { twMerge } from "tailwind-merge"; -export type TWUI_TOGGLE_PROPS = Omit< +export type TWUI_HTML_TO_REACT_PROPS = Omit< DetailedHTMLProps, HTMLDivElement>, "dangerouslySetInnerHTML" > & { @@ -20,7 +20,7 @@ export default function HtmlToReactComponent({ html, componentRef, ...props -}: TWUI_TOGGLE_PROPS) { +}: TWUI_HTML_TO_REACT_PROPS) { return (
& { +export type TWUI_TABS_PROPS = React.ComponentProps & { tabsContentArray: (TWUITabsObject | TWUITabsObject[] | undefined | null)[]; tabsBorderProps?: React.ComponentProps; tabsButtonsWrapperProps?: React.DetailedHTMLProps< @@ -52,7 +52,7 @@ export default function Tabs({ defaultValue, hrefUpdate, ...props -}: TWUI_TOGGLE_PROPS) { +}: TWUI_TABS_PROPS) { const finalTabsContentArray = tabsContentArray .flat() .filter((ct) => Boolean(ct?.title)) as TWUITabsObject[]; diff --git a/components/elements/Tag.tsx b/src/elements/Tag.tsx similarity index 95% rename from components/elements/Tag.tsx rename to src/elements/Tag.tsx index 80da5bb..044802f 100644 --- a/components/elements/Tag.tsx +++ b/src/elements/Tag.tsx @@ -6,7 +6,7 @@ import { type TWUIButtonVariantType, } from "../layout/Button"; -export type TWUI_TOGGLE_PROPS = PropsWithChildren & +export type TWUI_TAG_PROPS = PropsWithChildren & React.DetailedHTMLProps< React.HTMLAttributes, HTMLDivElement @@ -34,7 +34,7 @@ export default function Tag({ newTab, linkProps, ...props -}: TWUI_TOGGLE_PROPS) { +}: TWUI_TAG_PROPS) { const finalClassName = ButtonClasses[variant || "normal"]?.[color || "primary"] ?? ""; diff --git a/components/elements/Toast.tsx b/src/elements/Toast.tsx similarity index 100% rename from components/elements/Toast.tsx rename to src/elements/Toast.tsx diff --git a/components/elements/Toggle.tsx b/src/elements/Toggle.tsx similarity index 100% rename from components/elements/Toggle.tsx rename to src/elements/Toggle.tsx diff --git a/components/elements/ai/AIPromptActionSection.tsx b/src/elements/ai/AIPromptActionSection.tsx similarity index 100% rename from components/elements/ai/AIPromptActionSection.tsx rename to src/elements/ai/AIPromptActionSection.tsx diff --git a/components/elements/ai/AIPromptBlock.tsx b/src/elements/ai/AIPromptBlock.tsx similarity index 100% rename from components/elements/ai/AIPromptBlock.tsx rename to src/elements/ai/AIPromptBlock.tsx diff --git a/components/elements/ai/AIPromptBlockInputSection.tsx b/src/elements/ai/AIPromptBlockInputSection.tsx similarity index 100% rename from components/elements/ai/AIPromptBlockInputSection.tsx rename to src/elements/ai/AIPromptBlockInputSection.tsx diff --git a/components/elements/ai/AIPromptHistoryAssistantCard.tsx b/src/elements/ai/AIPromptHistoryAssistantCard.tsx similarity index 100% rename from components/elements/ai/AIPromptHistoryAssistantCard.tsx rename to src/elements/ai/AIPromptHistoryAssistantCard.tsx diff --git a/components/elements/ai/AIPromptHistoryModal.tsx b/src/elements/ai/AIPromptHistoryModal.tsx similarity index 100% rename from components/elements/ai/AIPromptHistoryModal.tsx rename to src/elements/ai/AIPromptHistoryModal.tsx diff --git a/components/elements/ai/AIPromptHistoryUserCard.tsx b/src/elements/ai/AIPromptHistoryUserCard.tsx similarity index 100% rename from components/elements/ai/AIPromptHistoryUserCard.tsx rename to src/elements/ai/AIPromptHistoryUserCard.tsx diff --git a/components/elements/ai/AIPromptPreview.tsx b/src/elements/ai/AIPromptPreview.tsx similarity index 100% rename from components/elements/ai/AIPromptPreview.tsx rename to src/elements/ai/AIPromptPreview.tsx diff --git a/components/elements/ai/AIVoiceTranscription.tsx b/src/elements/ai/AIVoiceTranscription.tsx similarity index 100% rename from components/elements/ai/AIVoiceTranscription.tsx rename to src/elements/ai/AIVoiceTranscription.tsx diff --git a/components/elements/ai/types.ts b/src/elements/ai/types.ts similarity index 100% rename from components/elements/ai/types.ts rename to src/elements/ai/types.ts diff --git a/components/elements/lucide-icon.tsx b/src/elements/lucide-icon.tsx similarity index 100% rename from components/elements/lucide-icon.tsx rename to src/elements/lucide-icon.tsx diff --git a/components/form/Checkbox.tsx b/src/form/Checkbox.tsx similarity index 100% rename from components/form/Checkbox.tsx rename to src/form/Checkbox.tsx diff --git a/components/form/FileUpload.tsx b/src/form/FileUpload.tsx similarity index 100% rename from components/form/FileUpload.tsx rename to src/form/FileUpload.tsx diff --git a/components/form/Form.tsx b/src/form/Form.tsx similarity index 100% rename from components/form/Form.tsx rename to src/form/Form.tsx diff --git a/components/form/ImageUpload.tsx b/src/form/ImageUpload.tsx similarity index 100% rename from components/form/ImageUpload.tsx rename to src/form/ImageUpload.tsx diff --git a/components/form/Input/NumberInputButtons.tsx b/src/form/Input/NumberInputButtons.tsx similarity index 100% rename from components/form/Input/NumberInputButtons.tsx rename to src/form/Input/NumberInputButtons.tsx diff --git a/components/form/Input/index.tsx b/src/form/Input/index.tsx similarity index 100% rename from components/form/Input/index.tsx rename to src/form/Input/index.tsx diff --git a/components/form/Radios.tsx b/src/form/Radios.tsx similarity index 100% rename from components/form/Radios.tsx rename to src/form/Radios.tsx diff --git a/components/form/SearchSelect.tsx b/src/form/SearchSelect.tsx similarity index 100% rename from components/form/SearchSelect.tsx rename to src/form/SearchSelect.tsx diff --git a/components/form/Select.tsx b/src/form/Select.tsx similarity index 100% rename from components/form/Select.tsx rename to src/form/Select.tsx diff --git a/components/form/Textarea.tsx b/src/form/Textarea.tsx similarity index 100% rename from components/form/Textarea.tsx rename to src/form/Textarea.tsx diff --git a/components/hooks/useCustomEventDispatch.tsx b/src/hooks/useCustomEventDispatch.tsx similarity index 100% rename from components/hooks/useCustomEventDispatch.tsx rename to src/hooks/useCustomEventDispatch.tsx diff --git a/components/hooks/useCustomEventListener.tsx b/src/hooks/useCustomEventListener.tsx similarity index 100% rename from components/hooks/useCustomEventListener.tsx rename to src/hooks/useCustomEventListener.tsx diff --git a/components/hooks/useIntersectionObserver.tsx b/src/hooks/useIntersectionObserver.tsx similarity index 100% rename from components/hooks/useIntersectionObserver.tsx rename to src/hooks/useIntersectionObserver.tsx diff --git a/components/hooks/useLocalStorage.tsx b/src/hooks/useLocalStorage.tsx similarity index 100% rename from components/hooks/useLocalStorage.tsx rename to src/hooks/useLocalStorage.tsx diff --git a/components/hooks/useReady.tsx b/src/hooks/useReady.tsx similarity index 100% rename from components/hooks/useReady.tsx rename to src/hooks/useReady.tsx diff --git a/components/hooks/useStatus.tsx b/src/hooks/useStatus.tsx similarity index 100% rename from components/hooks/useStatus.tsx rename to src/hooks/useStatus.tsx diff --git a/components/hooks/useWebSocket.tsx b/src/hooks/useWebSocket.tsx similarity index 100% rename from components/hooks/useWebSocket.tsx rename to src/hooks/useWebSocket.tsx diff --git a/components/hooks/useWebSocketEventHandler.tsx b/src/hooks/useWebSocketEventHandler.tsx similarity index 100% rename from components/hooks/useWebSocketEventHandler.tsx rename to src/hooks/useWebSocketEventHandler.tsx diff --git a/components/hooks/userWindowFocus.tsx b/src/hooks/userWindowFocus.tsx similarity index 100% rename from components/hooks/userWindowFocus.tsx rename to src/hooks/userWindowFocus.tsx diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..6967b9b --- /dev/null +++ b/src/index.ts @@ -0,0 +1,140 @@ +/** + * Root entry. Editors (Ace, TinyMCE), MDX, Next.js helpers, the AI blocks and + * RemoteCodeBlock rely on optional peer dependencies, so they are only + * available through deep imports, e.g. `@moduletrace/twui/editors/TinyMCE`. + */ + +// layout +export { default as ArrowedLink } from "./layout/ArrowedLink"; +export { default as Button } from "./layout/Button"; +export * from "./layout/Button"; +export { default as Center } from "./layout/Center"; +export { default as Container } from "./layout/Container"; +export { default as Divider } from "./layout/Divider"; +export { default as DocsImg } from "./layout/DocsImg"; +export { default as Footer } from "./layout/Footer"; +export { default as H1 } from "./layout/H1"; +export { default as H2 } from "./layout/H2"; +export { default as H3 } from "./layout/H3"; +export { default as H4 } from "./layout/H4"; +export { default as H5 } from "./layout/H5"; +export { default as HR } from "./layout/HR"; +export { default as Header } from "./layout/Header"; +export { default as IconLink } from "./layout/IconLink"; +export { default as Img } from "./layout/Img"; +export * from "./layout/Img"; +export { default as Link } from "./layout/Link"; +export { default as List } from "./layout/List"; +export { default as LoadingRectangleBlock } from "./layout/LoadingRectangleBlock"; +export * from "./layout/LoadingRectangleBlock"; +export { default as Main } from "./layout/Main"; +export { default as P } from "./layout/P"; +export { default as Row } from "./layout/Row"; +export { default as Section } from "./layout/Section"; +export { default as Spacer } from "./layout/Spacer"; +export { default as Span } from "./layout/Span"; +export { default as Stack } from "./layout/Stack"; + +// elements +export { default as Border } from "./elements/Border"; +export * from "./elements/Border"; +export { default as Breadcrumbs } from "./elements/Breadcrumbs"; +export * from "./elements/Breadcrumbs"; +export { default as Card } from "./elements/Card"; +export { default as CheckBulletPoints } from "./elements/CheckBulletPoints"; +export * from "./elements/CheckBulletPoints"; +export { default as CodeBlock } from "./elements/CodeBlock"; +export * from "./elements/CodeBlock"; +export { default as ColorSchemeSelector } from "./elements/ColorSchemeSelector"; +export { default as CopySlug } from "./elements/CopySlug"; +export { default as Dropdown } from "./elements/Dropdown"; +export * from "./elements/Dropdown"; +export { default as EmptyContent } from "./elements/EmptyContent"; +export * from "./elements/EmptyContent"; +export { default as HeaderLink } from "./elements/HeaderLink"; +export * from "./elements/HeaderLink"; +export { default as HeaderNav } from "./elements/HeaderNav"; +export * from "./elements/HeaderNav"; +export { default as HeaderNavLinkComponent } from "./elements/HeaderNavLinkComponent"; +export { default as HtmlToReactComponent } from "./elements/HtmlToReactComponent"; +export * from "./elements/HtmlToReactComponent"; +export { default as LinkList } from "./elements/LinkList"; +export * from "./elements/LinkList"; +export { default as Loading } from "./elements/Loading"; +export { default as LoadingBlock } from "./elements/LoadingBlock"; +export { default as LoadingOverlay } from "./elements/LoadingOverlay"; +export { default as Modal } from "./elements/Modal"; +export * from "./elements/Modal"; +export { default as Pagination } from "./elements/Pagination"; +export { default as Paper } from "./elements/Paper"; +export { default as Popover } from "./elements/Popover"; +export { default as Search } from "./elements/Search"; +export * from "./elements/Search"; +export { default as SingleLineCodeBlock } from "./elements/SingleLineCodeBlock"; +export { default as StarRating } from "./elements/StarRating"; +export * from "./elements/StarRating"; +export { default as Table } from "./elements/Table"; +export { default as Tabs } from "./elements/Tabs"; +export * from "./elements/Tabs"; +export { default as Tag } from "./elements/Tag"; +export * from "./elements/Tag"; +export { default as Toast } from "./elements/Toast"; +export * from "./elements/Toast"; +export { default as Toggle } from "./elements/Toggle"; +export * from "./elements/Toggle"; +export { default as LucideIcon } from "./elements/lucide-icon"; +export * from "./elements/lucide-icon"; + +// form +export { default as Checkbox } from "./form/Checkbox"; +export * from "./form/Checkbox"; +export { default as FileUpload } from "./form/FileUpload"; +export { default as Form } from "./form/Form"; +export { default as ImageUpload } from "./form/ImageUpload"; +export { default as NumberInputButtons } from "./form/Input/NumberInputButtons"; +export { default as Input } from "./form/Input"; +export * from "./form/Input"; +export { default as Radios } from "./form/Radios"; +export * from "./form/Radios"; +export { default as SearchSelect } from "./form/SearchSelect"; +export * from "./form/SearchSelect"; +export { default as Select } from "./form/Select"; +export * from "./form/Select"; +export { default as Textarea } from "./form/Textarea"; + +// hooks +export { default as useCustomEventDispatch } from "./hooks/useCustomEventDispatch"; +export { default as useCustomEventListener } from "./hooks/useCustomEventListener"; +export { default as useIntersectionObserver } from "./hooks/useIntersectionObserver"; +export { default as useLocalStorage } from "./hooks/useLocalStorage"; +export * from "./hooks/useLocalStorage"; +export { default as useReady } from "./hooks/useReady"; +export { default as useStatus } from "./hooks/useStatus"; +export * from "./hooks/useStatus"; +export { default as useWebSocket } from "./hooks/useWebSocket"; +export * from "./hooks/useWebSocket"; +export { default as useWebSocketEventHandler } from "./hooks/useWebSocketEventHandler"; +export { default as useWindowFocus } from "./hooks/userWindowFocus"; + +// utils +export { default as twuiCamelToNormalCase } from "./utils/camel-to-normal-case"; +export { default as TWUIEJSON } from "./utils/ejson"; +export { default as fetchApi } from "./utils/fetch/fetchApi"; +export * from "./utils/fetch/fetchApi"; +export { default as fileInputToBase64 } from "./utils/form/fileInputToBase64"; +export * from "./utils/form/fileInputToBase64"; +export { default as imageInputToBase64 } from "./utils/form/imageInputToBase64"; +export * from "./utils/form/imageInputToBase64"; +export { default as lowerToTitleCase } from "./utils/lower-to-title-case"; +export { default as twuiNormalizeText } from "./utils/normalize-text"; +export { default as twuiNumberfy } from "./utils/numberfy"; +export { default as TWUIRoundToNearestMagnitude } from "./utils/round-to-nearest-magnitude"; +export { default as twuiSerializeQuery } from "./utils/serialize-query"; +export { default as twuiSlugToNormalText } from "./utils/slug-to-normal-text"; +export { default as twuiSlugify } from "./utils/slugify"; + +// svgs +export { default as CheckMarkSVG } from "./svgs/CheckMarkSVG"; + +// types +export * from "./types"; diff --git a/components/layout/ArrowedLink.tsx b/src/layout/ArrowedLink.tsx similarity index 100% rename from components/layout/ArrowedLink.tsx rename to src/layout/ArrowedLink.tsx diff --git a/components/layout/Button.tsx b/src/layout/Button.tsx similarity index 100% rename from components/layout/Button.tsx rename to src/layout/Button.tsx diff --git a/components/layout/Center.tsx b/src/layout/Center.tsx similarity index 100% rename from components/layout/Center.tsx rename to src/layout/Center.tsx diff --git a/components/layout/Container.tsx b/src/layout/Container.tsx similarity index 100% rename from components/layout/Container.tsx rename to src/layout/Container.tsx diff --git a/components/layout/Divider.tsx b/src/layout/Divider.tsx similarity index 100% rename from components/layout/Divider.tsx rename to src/layout/Divider.tsx diff --git a/components/layout/DocsImg.tsx b/src/layout/DocsImg.tsx similarity index 100% rename from components/layout/DocsImg.tsx rename to src/layout/DocsImg.tsx diff --git a/components/layout/Footer.tsx b/src/layout/Footer.tsx similarity index 100% rename from components/layout/Footer.tsx rename to src/layout/Footer.tsx diff --git a/components/layout/H1.tsx b/src/layout/H1.tsx similarity index 100% rename from components/layout/H1.tsx rename to src/layout/H1.tsx diff --git a/components/layout/H2.tsx b/src/layout/H2.tsx similarity index 100% rename from components/layout/H2.tsx rename to src/layout/H2.tsx diff --git a/components/layout/H3.tsx b/src/layout/H3.tsx similarity index 100% rename from components/layout/H3.tsx rename to src/layout/H3.tsx diff --git a/components/layout/H4.tsx b/src/layout/H4.tsx similarity index 100% rename from components/layout/H4.tsx rename to src/layout/H4.tsx diff --git a/components/layout/H5.tsx b/src/layout/H5.tsx similarity index 100% rename from components/layout/H5.tsx rename to src/layout/H5.tsx diff --git a/components/layout/HR.tsx b/src/layout/HR.tsx similarity index 100% rename from components/layout/HR.tsx rename to src/layout/HR.tsx diff --git a/components/layout/Header.tsx b/src/layout/Header.tsx similarity index 100% rename from components/layout/Header.tsx rename to src/layout/Header.tsx diff --git a/components/layout/IconLink.tsx b/src/layout/IconLink.tsx similarity index 100% rename from components/layout/IconLink.tsx rename to src/layout/IconLink.tsx diff --git a/components/layout/Img.tsx b/src/layout/Img.tsx similarity index 100% rename from components/layout/Img.tsx rename to src/layout/Img.tsx diff --git a/components/layout/Link.tsx b/src/layout/Link.tsx similarity index 100% rename from components/layout/Link.tsx rename to src/layout/Link.tsx diff --git a/components/layout/List.tsx b/src/layout/List.tsx similarity index 100% rename from components/layout/List.tsx rename to src/layout/List.tsx diff --git a/components/layout/LoadingRectangleBlock.tsx b/src/layout/LoadingRectangleBlock.tsx similarity index 100% rename from components/layout/LoadingRectangleBlock.tsx rename to src/layout/LoadingRectangleBlock.tsx diff --git a/components/layout/Main.tsx b/src/layout/Main.tsx similarity index 100% rename from components/layout/Main.tsx rename to src/layout/Main.tsx diff --git a/components/layout/P.tsx b/src/layout/P.tsx similarity index 100% rename from components/layout/P.tsx rename to src/layout/P.tsx diff --git a/components/layout/Row.tsx b/src/layout/Row.tsx similarity index 100% rename from components/layout/Row.tsx rename to src/layout/Row.tsx diff --git a/components/layout/Section.tsx b/src/layout/Section.tsx similarity index 100% rename from components/layout/Section.tsx rename to src/layout/Section.tsx diff --git a/components/layout/Spacer.tsx b/src/layout/Spacer.tsx similarity index 100% rename from components/layout/Spacer.tsx rename to src/layout/Spacer.tsx diff --git a/components/layout/Span.tsx b/src/layout/Span.tsx similarity index 100% rename from components/layout/Span.tsx rename to src/layout/Span.tsx diff --git a/components/layout/Stack.tsx b/src/layout/Stack.tsx similarity index 100% rename from components/layout/Stack.tsx rename to src/layout/Stack.tsx diff --git a/components/mdx/markdown/MarkdownEditor.tsx b/src/mdx/markdown/MarkdownEditor.tsx similarity index 100% rename from components/mdx/markdown/MarkdownEditor.tsx rename to src/mdx/markdown/MarkdownEditor.tsx diff --git a/components/mdx/markdown/MarkdownEditorComponent.tsx b/src/mdx/markdown/MarkdownEditorComponent.tsx similarity index 100% rename from components/mdx/markdown/MarkdownEditorComponent.tsx rename to src/mdx/markdown/MarkdownEditorComponent.tsx diff --git a/components/mdx/markdown/MarkdownEditorPreviewComponent.tsx b/src/mdx/markdown/MarkdownEditorPreviewComponent.tsx similarity index 100% rename from components/mdx/markdown/MarkdownEditorPreviewComponent.tsx rename to src/mdx/markdown/MarkdownEditorPreviewComponent.tsx diff --git a/components/mdx/markdown/MarkdownEditorSelectorButtons.tsx b/src/mdx/markdown/MarkdownEditorSelectorButtons.tsx similarity index 100% rename from components/mdx/markdown/MarkdownEditorSelectorButtons.tsx rename to src/mdx/markdown/MarkdownEditorSelectorButtons.tsx diff --git a/components/mdx/mdx-components.tsx b/src/mdx/mdx-components.tsx similarity index 100% rename from components/mdx/mdx-components.tsx rename to src/mdx/mdx-components.tsx diff --git a/components/next-js/hooks/useMDXComponents.tsx b/src/next-js/hooks/useMDXComponents.tsx similarity index 100% rename from components/next-js/hooks/useMDXComponents.tsx rename to src/next-js/hooks/useMDXComponents.tsx diff --git a/components/svgs/CheckMarkSVG.tsx b/src/svgs/CheckMarkSVG.tsx similarity index 100% rename from components/svgs/CheckMarkSVG.tsx rename to src/svgs/CheckMarkSVG.tsx diff --git a/components/types.ts b/src/types.ts similarity index 97% rename from components/types.ts rename to src/types.ts index e152d5b..d2e385c 100644 --- a/components/types.ts +++ b/src/types.ts @@ -1,5 +1,3 @@ -import type { Ace } from "ace-builds"; - export const AutocompleteOptions = [ // Personal Information "name", @@ -109,7 +107,7 @@ export interface AceEditorOptions { minLines?: number; mode?: string; navigateWithinSoftTabs?: boolean; - newLineMode?: Ace.NewLineMode; + newLineMode?: "auto" | "unix" | "windows"; overwrite?: boolean; placeholder?: string; printMargin?: number | boolean; diff --git a/components/utils/camel-to-normal-case.test.ts b/src/utils/camel-to-normal-case.test.ts similarity index 100% rename from components/utils/camel-to-normal-case.test.ts rename to src/utils/camel-to-normal-case.test.ts diff --git a/components/utils/camel-to-normal-case.ts b/src/utils/camel-to-normal-case.ts similarity index 100% rename from components/utils/camel-to-normal-case.ts rename to src/utils/camel-to-normal-case.ts diff --git a/components/utils/ejson.test.ts b/src/utils/ejson.test.ts similarity index 100% rename from components/utils/ejson.test.ts rename to src/utils/ejson.test.ts diff --git a/components/utils/ejson.ts b/src/utils/ejson.ts similarity index 100% rename from components/utils/ejson.ts rename to src/utils/ejson.ts diff --git a/components/utils/fetch/fetchApi.ts b/src/utils/fetch/fetchApi.ts similarity index 100% rename from components/utils/fetch/fetchApi.ts rename to src/utils/fetch/fetchApi.ts diff --git a/components/utils/form/fileInputToBase64.ts b/src/utils/form/fileInputToBase64.ts similarity index 100% rename from components/utils/form/fileInputToBase64.ts rename to src/utils/form/fileInputToBase64.ts diff --git a/components/utils/form/imageInputToBase64.ts b/src/utils/form/imageInputToBase64.ts similarity index 100% rename from components/utils/form/imageInputToBase64.ts rename to src/utils/form/imageInputToBase64.ts diff --git a/components/utils/lower-to-title-case.test.ts b/src/utils/lower-to-title-case.test.ts similarity index 100% rename from components/utils/lower-to-title-case.test.ts rename to src/utils/lower-to-title-case.test.ts diff --git a/components/utils/lower-to-title-case.ts b/src/utils/lower-to-title-case.ts similarity index 100% rename from components/utils/lower-to-title-case.ts rename to src/utils/lower-to-title-case.ts diff --git a/components/utils/normalize-text.test.ts b/src/utils/normalize-text.test.ts similarity index 100% rename from components/utils/normalize-text.test.ts rename to src/utils/normalize-text.test.ts diff --git a/components/utils/normalize-text.ts b/src/utils/normalize-text.ts similarity index 100% rename from components/utils/normalize-text.ts rename to src/utils/normalize-text.ts diff --git a/components/utils/numberfy.test.ts b/src/utils/numberfy.test.ts similarity index 100% rename from components/utils/numberfy.test.ts rename to src/utils/numberfy.test.ts diff --git a/components/utils/numberfy.ts b/src/utils/numberfy.ts similarity index 100% rename from components/utils/numberfy.ts rename to src/utils/numberfy.ts diff --git a/components/utils/round-to-nearest-magnitude.ts b/src/utils/round-to-nearest-magnitude.ts similarity index 100% rename from components/utils/round-to-nearest-magnitude.ts rename to src/utils/round-to-nearest-magnitude.ts diff --git a/components/utils/serialize-query.test.ts b/src/utils/serialize-query.test.ts similarity index 100% rename from components/utils/serialize-query.test.ts rename to src/utils/serialize-query.test.ts diff --git a/components/utils/serialize-query.ts b/src/utils/serialize-query.ts similarity index 100% rename from components/utils/serialize-query.ts rename to src/utils/serialize-query.ts diff --git a/components/utils/slug-to-normal-text.test.ts b/src/utils/slug-to-normal-text.test.ts similarity index 100% rename from components/utils/slug-to-normal-text.test.ts rename to src/utils/slug-to-normal-text.test.ts diff --git a/components/utils/slug-to-normal-text.ts b/src/utils/slug-to-normal-text.ts similarity index 100% rename from components/utils/slug-to-normal-text.ts rename to src/utils/slug-to-normal-text.ts diff --git a/components/utils/slugify.test.ts b/src/utils/slugify.test.ts similarity index 100% rename from components/utils/slugify.test.ts rename to src/utils/slugify.test.ts diff --git a/components/utils/slugify.ts b/src/utils/slugify.ts similarity index 100% rename from components/utils/slugify.ts rename to src/utils/slugify.ts diff --git a/styles/globals.css b/styles/globals.css deleted file mode 100644 index 97fde7c..0000000 --- a/styles/globals.css +++ /dev/null @@ -1,29 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - --background: #ffffff; - --foreground: #171717; - --color-link: #233599; -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - --color-link: #233599; - } -} - -body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; -} - -@layer utilities { - .text-balance { - text-wrap: balance; - } -} diff --git a/tailwind.config.ts b/tailwind.config.ts deleted file mode 100644 index caafc4b..0000000 --- a/tailwind.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from "tailwindcss"; - -const config: Config = { - content: [ - "./pages/**/*.{js,ts,jsx,tsx,mdx}", - "./components/**/*.{js,ts,jsx,tsx,mdx}", - "./app/**/*.{js,ts,jsx,tsx,mdx}", - ], - theme: { - extend: { - colors: { - background: "var(--background)", - foreground: "var(--foreground)", - link: "var(--link)", - }, - }, - }, - plugins: [], -}; -export default config; diff --git a/tsconfig.json b/tsconfig.json index 649790e..8ca27a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,22 @@ { - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "paths": { - "@/*": ["./*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "compilerOptions": { + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "noFallthroughCasesInSwitch": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "incremental": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "src/**/*.test.ts"] }