From 11da9b89e7404ebf8df0df3d794111006ff551c0 Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Sun, 18 Oct 2026 10:17:54 +0100 Subject: [PATCH] Package library as @moduletrace/twui npm package - Move components/ to src/ and compile to dist/ with tsc - Add root barrel export plus deep-import subpath exports and base.css export - Post-compile step: copy base.css, add .js import extensions, mark client modules - Add publish.sh and .npmrc for the Gitea npm registry - Fix type errors, guard TinyMCE env access, drop ace-builds type dependency - Rename clashing props type names, remove Next.js scaffolding and unused deps Co-Authored-By: Claude Opus 5.5 --- .gitignore | 61 ++- .npmrc | 2 + CLAUDE.md => AGENTS.md | 0 README.md | 112 ++--- bun.lock | 407 ++++++++++++++++++ bun.lockb | Bin 124095 -> 0 bytes components/(utils)/ejson.ts | 38 -- components/Readme.md | 27 -- components/bun.lock | 193 --------- components/package.json | 30 -- next.config.mjs | 6 - package.json | 142 ++++-- postcss.config.mjs | 8 - publish.sh | 49 +++ scripts/post-compile.ts | 80 ++++ .../(functions)/popver/grab-popover-styles.ts | 0 .../(partials)/ModalComponent.tsx | 0 .../(partials)/PopoverComponent.tsx | 0 .../(utils)/search-select/keyboard-ops.ts | 0 {components => src}/base.css | 3 + .../composites/docs/TWUIDocsAside.tsx | 0 .../composites/docs/TWUIDocsLink.tsx | 0 .../composites/docs/TWUIDocsRightAside.tsx | 0 {components => src}/composites/docs/index.tsx | 0 {components => src}/editors/AceEditor.tsx | 0 src/editors/TinyMCE/default-base-url.ts | 22 + {components => src}/editors/TinyMCE/index.tsx | 5 +- .../editors/TinyMCE/tinymce.d.ts | 0 .../editors/TinyMCE/tinymce.ts | 0 .../editors/TinyMCE/useTinyMCE.tsx | 5 +- .../editors/ace-editor-modes.ts | 0 {components => src}/elements/Border.tsx | 0 {components => src}/elements/Breadcrumbs.tsx | 0 {components => src}/elements/Card.tsx | 0 .../elements/CheckBulletPoints.tsx | 0 {components => src}/elements/CodeBlock.tsx | 0 .../elements/ColorSchemeSelector.tsx | 0 {components => src}/elements/CopySlug.tsx | 0 {components => src}/elements/Dropdown.tsx | 0 {components => src}/elements/EmptyContent.tsx | 3 - {components => src}/elements/HeaderLink.tsx | 0 {components => src}/elements/HeaderNav.tsx | 0 .../elements/HeaderNavLinkComponent.tsx | 0 .../elements/HtmlToReactComponent.tsx | 4 +- {components => src}/elements/LinkList.tsx | 0 {components => src}/elements/Loading.tsx | 0 {components => src}/elements/LoadingBlock.tsx | 0 .../elements/LoadingOverlay.tsx | 0 {components => src}/elements/Modal.tsx | 0 {components => src}/elements/Pagination.tsx | 0 {components => src}/elements/Paper.tsx | 0 {components => src}/elements/Popover.tsx | 0 .../elements/RemoteCodeBlock.tsx | 0 {components => src}/elements/Search.tsx | 0 .../elements/SingleLineCodeBlock.tsx | 0 {components => src}/elements/StarRating.tsx | 0 {components => src}/elements/Table.tsx | 0 {components => src}/elements/Tabs.tsx | 4 +- {components => src}/elements/Tag.tsx | 4 +- {components => src}/elements/Toast.tsx | 0 {components => src}/elements/Toggle.tsx | 0 .../elements/ai/AIPromptActionSection.tsx | 0 .../elements/ai/AIPromptBlock.tsx | 0 .../elements/ai/AIPromptBlockInputSection.tsx | 0 .../ai/AIPromptHistoryAssistantCard.tsx | 0 .../elements/ai/AIPromptHistoryModal.tsx | 0 .../elements/ai/AIPromptHistoryUserCard.tsx | 0 .../elements/ai/AIPromptPreview.tsx | 0 .../elements/ai/AIVoiceTranscription.tsx | 0 {components => src}/elements/ai/types.ts | 0 {components => src}/elements/lucide-icon.tsx | 0 {components => src}/form/Checkbox.tsx | 0 {components => src}/form/FileUpload.tsx | 0 {components => src}/form/Form.tsx | 0 {components => src}/form/ImageUpload.tsx | 0 .../form/Input/NumberInputButtons.tsx | 0 {components => src}/form/Input/index.tsx | 0 {components => src}/form/Radios.tsx | 0 {components => src}/form/SearchSelect.tsx | 0 {components => src}/form/Select.tsx | 0 {components => src}/form/Textarea.tsx | 0 .../hooks/useCustomEventDispatch.tsx | 0 .../hooks/useCustomEventListener.tsx | 0 .../hooks/useIntersectionObserver.tsx | 0 {components => src}/hooks/useLocalStorage.tsx | 0 {components => src}/hooks/useReady.tsx | 0 {components => src}/hooks/useStatus.tsx | 0 {components => src}/hooks/useWebSocket.tsx | 0 .../hooks/useWebSocketEventHandler.tsx | 0 {components => src}/hooks/userWindowFocus.tsx | 0 src/index.ts | 140 ++++++ {components => src}/layout/ArrowedLink.tsx | 0 {components => src}/layout/Button.tsx | 0 {components => src}/layout/Center.tsx | 0 {components => src}/layout/Container.tsx | 0 {components => src}/layout/Divider.tsx | 0 {components => src}/layout/DocsImg.tsx | 0 {components => src}/layout/Footer.tsx | 0 {components => src}/layout/H1.tsx | 0 {components => src}/layout/H2.tsx | 0 {components => src}/layout/H3.tsx | 0 {components => src}/layout/H4.tsx | 0 {components => src}/layout/H5.tsx | 0 {components => src}/layout/HR.tsx | 0 {components => src}/layout/Header.tsx | 0 {components => src}/layout/IconLink.tsx | 0 {components => src}/layout/Img.tsx | 0 {components => src}/layout/Link.tsx | 0 {components => src}/layout/List.tsx | 0 .../layout/LoadingRectangleBlock.tsx | 0 {components => src}/layout/Main.tsx | 0 {components => src}/layout/P.tsx | 0 {components => src}/layout/Row.tsx | 0 {components => src}/layout/Section.tsx | 0 {components => src}/layout/Spacer.tsx | 0 {components => src}/layout/Span.tsx | 0 {components => src}/layout/Stack.tsx | 0 .../mdx/markdown/MarkdownEditor.tsx | 0 .../mdx/markdown/MarkdownEditorComponent.tsx | 0 .../MarkdownEditorPreviewComponent.tsx | 0 .../MarkdownEditorSelectorButtons.tsx | 0 {components => src}/mdx/mdx-components.tsx | 0 .../next-js/hooks/useMDXComponents.tsx | 0 {components => src}/svgs/CheckMarkSVG.tsx | 0 {components => src}/types.ts | 4 +- .../utils/camel-to-normal-case.test.ts | 0 .../utils/camel-to-normal-case.ts | 0 {components => src}/utils/ejson.test.ts | 0 {components => src}/utils/ejson.ts | 0 {components => src}/utils/fetch/fetchApi.ts | 0 .../utils/form/fileInputToBase64.ts | 0 .../utils/form/imageInputToBase64.ts | 0 .../utils/lower-to-title-case.test.ts | 0 .../utils/lower-to-title-case.ts | 0 .../utils/normalize-text.test.ts | 0 {components => src}/utils/normalize-text.ts | 0 {components => src}/utils/numberfy.test.ts | 0 {components => src}/utils/numberfy.ts | 0 .../utils/round-to-nearest-magnitude.ts | 0 .../utils/serialize-query.test.ts | 0 {components => src}/utils/serialize-query.ts | 0 .../utils/slug-to-normal-text.test.ts | 0 .../utils/slug-to-normal-text.ts | 0 {components => src}/utils/slugify.test.ts | 0 {components => src}/utils/slugify.ts | 0 styles/globals.css | 29 -- tailwind.config.ts | 20 - tsconfig.json | 39 +- 148 files changed, 937 insertions(+), 500 deletions(-) create mode 100644 .npmrc rename CLAUDE.md => AGENTS.md (100%) create mode 100644 bun.lock delete mode 100755 bun.lockb delete mode 100644 components/(utils)/ejson.ts delete mode 100644 components/Readme.md delete mode 100644 components/bun.lock delete mode 100644 components/package.json delete mode 100644 next.config.mjs delete mode 100644 postcss.config.mjs create mode 100755 publish.sh create mode 100644 scripts/post-compile.ts rename {components => src}/(functions)/popver/grab-popover-styles.ts (100%) rename {components => src}/(partials)/ModalComponent.tsx (100%) rename {components => src}/(partials)/PopoverComponent.tsx (100%) rename {components => src}/(utils)/search-select/keyboard-ops.ts (100%) rename {components => src}/base.css (98%) rename {components => src}/composites/docs/TWUIDocsAside.tsx (100%) rename {components => src}/composites/docs/TWUIDocsLink.tsx (100%) rename {components => src}/composites/docs/TWUIDocsRightAside.tsx (100%) rename {components => src}/composites/docs/index.tsx (100%) rename {components => src}/editors/AceEditor.tsx (100%) create mode 100644 src/editors/TinyMCE/default-base-url.ts rename {components => src}/editors/TinyMCE/index.tsx (97%) rename {components => src}/editors/TinyMCE/tinymce.d.ts (100%) rename {components => src}/editors/TinyMCE/tinymce.ts (100%) rename {components => src}/editors/TinyMCE/useTinyMCE.tsx (88%) rename {components => src}/editors/ace-editor-modes.ts (100%) rename {components => src}/elements/Border.tsx (100%) rename {components => src}/elements/Breadcrumbs.tsx (100%) rename {components => src}/elements/Card.tsx (100%) rename {components => src}/elements/CheckBulletPoints.tsx (100%) rename {components => src}/elements/CodeBlock.tsx (100%) rename {components => src}/elements/ColorSchemeSelector.tsx (100%) rename {components => src}/elements/CopySlug.tsx (100%) rename {components => src}/elements/Dropdown.tsx (100%) rename {components => src}/elements/EmptyContent.tsx (95%) rename {components => src}/elements/HeaderLink.tsx (100%) rename {components => src}/elements/HeaderNav.tsx (100%) rename {components => src}/elements/HeaderNavLinkComponent.tsx (100%) rename {components => src}/elements/HtmlToReactComponent.tsx (91%) rename {components => src}/elements/LinkList.tsx (100%) rename {components => src}/elements/Loading.tsx (100%) rename {components => src}/elements/LoadingBlock.tsx (100%) rename {components => src}/elements/LoadingOverlay.tsx (100%) rename {components => src}/elements/Modal.tsx (100%) rename {components => src}/elements/Pagination.tsx (100%) rename {components => src}/elements/Paper.tsx (100%) rename {components => src}/elements/Popover.tsx (100%) rename {components => src}/elements/RemoteCodeBlock.tsx (100%) rename {components => src}/elements/Search.tsx (100%) rename {components => src}/elements/SingleLineCodeBlock.tsx (100%) rename {components => src}/elements/StarRating.tsx (100%) rename {components => src}/elements/Table.tsx (100%) rename {components => src}/elements/Tabs.tsx (98%) rename {components => src}/elements/Tag.tsx (95%) rename {components => src}/elements/Toast.tsx (100%) rename {components => src}/elements/Toggle.tsx (100%) rename {components => src}/elements/ai/AIPromptActionSection.tsx (100%) rename {components => src}/elements/ai/AIPromptBlock.tsx (100%) rename {components => src}/elements/ai/AIPromptBlockInputSection.tsx (100%) rename {components => src}/elements/ai/AIPromptHistoryAssistantCard.tsx (100%) rename {components => src}/elements/ai/AIPromptHistoryModal.tsx (100%) rename {components => src}/elements/ai/AIPromptHistoryUserCard.tsx (100%) rename {components => src}/elements/ai/AIPromptPreview.tsx (100%) rename {components => src}/elements/ai/AIVoiceTranscription.tsx (100%) rename {components => src}/elements/ai/types.ts (100%) rename {components => src}/elements/lucide-icon.tsx (100%) rename {components => src}/form/Checkbox.tsx (100%) rename {components => src}/form/FileUpload.tsx (100%) rename {components => src}/form/Form.tsx (100%) rename {components => src}/form/ImageUpload.tsx (100%) rename {components => src}/form/Input/NumberInputButtons.tsx (100%) rename {components => src}/form/Input/index.tsx (100%) rename {components => src}/form/Radios.tsx (100%) rename {components => src}/form/SearchSelect.tsx (100%) rename {components => src}/form/Select.tsx (100%) rename {components => src}/form/Textarea.tsx (100%) rename {components => src}/hooks/useCustomEventDispatch.tsx (100%) rename {components => src}/hooks/useCustomEventListener.tsx (100%) rename {components => src}/hooks/useIntersectionObserver.tsx (100%) rename {components => src}/hooks/useLocalStorage.tsx (100%) rename {components => src}/hooks/useReady.tsx (100%) rename {components => src}/hooks/useStatus.tsx (100%) rename {components => src}/hooks/useWebSocket.tsx (100%) rename {components => src}/hooks/useWebSocketEventHandler.tsx (100%) rename {components => src}/hooks/userWindowFocus.tsx (100%) create mode 100644 src/index.ts rename {components => src}/layout/ArrowedLink.tsx (100%) rename {components => src}/layout/Button.tsx (100%) rename {components => src}/layout/Center.tsx (100%) rename {components => src}/layout/Container.tsx (100%) rename {components => src}/layout/Divider.tsx (100%) rename {components => src}/layout/DocsImg.tsx (100%) rename {components => src}/layout/Footer.tsx (100%) rename {components => src}/layout/H1.tsx (100%) rename {components => src}/layout/H2.tsx (100%) rename {components => src}/layout/H3.tsx (100%) rename {components => src}/layout/H4.tsx (100%) rename {components => src}/layout/H5.tsx (100%) rename {components => src}/layout/HR.tsx (100%) rename {components => src}/layout/Header.tsx (100%) rename {components => src}/layout/IconLink.tsx (100%) rename {components => src}/layout/Img.tsx (100%) rename {components => src}/layout/Link.tsx (100%) rename {components => src}/layout/List.tsx (100%) rename {components => src}/layout/LoadingRectangleBlock.tsx (100%) rename {components => src}/layout/Main.tsx (100%) rename {components => src}/layout/P.tsx (100%) rename {components => src}/layout/Row.tsx (100%) rename {components => src}/layout/Section.tsx (100%) rename {components => src}/layout/Spacer.tsx (100%) rename {components => src}/layout/Span.tsx (100%) rename {components => src}/layout/Stack.tsx (100%) rename {components => src}/mdx/markdown/MarkdownEditor.tsx (100%) rename {components => src}/mdx/markdown/MarkdownEditorComponent.tsx (100%) rename {components => src}/mdx/markdown/MarkdownEditorPreviewComponent.tsx (100%) rename {components => src}/mdx/markdown/MarkdownEditorSelectorButtons.tsx (100%) rename {components => src}/mdx/mdx-components.tsx (100%) rename {components => src}/next-js/hooks/useMDXComponents.tsx (100%) rename {components => src}/svgs/CheckMarkSVG.tsx (100%) rename {components => src}/types.ts (97%) rename {components => src}/utils/camel-to-normal-case.test.ts (100%) rename {components => src}/utils/camel-to-normal-case.ts (100%) rename {components => src}/utils/ejson.test.ts (100%) rename {components => src}/utils/ejson.ts (100%) rename {components => src}/utils/fetch/fetchApi.ts (100%) rename {components => src}/utils/form/fileInputToBase64.ts (100%) rename {components => src}/utils/form/imageInputToBase64.ts (100%) rename {components => src}/utils/lower-to-title-case.test.ts (100%) rename {components => src}/utils/lower-to-title-case.ts (100%) rename {components => src}/utils/normalize-text.test.ts (100%) rename {components => src}/utils/normalize-text.ts (100%) rename {components => src}/utils/numberfy.test.ts (100%) rename {components => src}/utils/numberfy.ts (100%) rename {components => src}/utils/round-to-nearest-magnitude.ts (100%) rename {components => src}/utils/serialize-query.test.ts (100%) rename {components => src}/utils/serialize-query.ts (100%) rename {components => src}/utils/slug-to-normal-text.test.ts (100%) rename {components => src}/utils/slug-to-normal-text.ts (100%) rename {components => src}/utils/slugify.test.ts (100%) rename {components => src}/utils/slugify.ts (100%) delete mode 100644 styles/globals.css delete mode 100644 tailwind.config.ts 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 7f7418e79bb1860646f9a780efbb4c5ae3e75e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124095 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 BmLUKD 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"] }