├── .gitignore
├── LICENSE.md
├── README.md
├── biome.json
├── bun.lockb
├── components
├── panda
│ ├── .gitignore
│ ├── .storybook
│ │ ├── main.ts
│ │ ├── panda.css
│ │ └── preview.tsx
│ ├── README.md
│ ├── biome.json
│ ├── package.json
│ ├── panda.config.ts
│ ├── postcss.config.cjs
│ ├── scripts
│ │ ├── .components-tracker.json
│ │ └── track.ts
│ ├── src
│ │ ├── env.d.ts
│ │ ├── lib
│ │ │ └── storybook.tsx
│ │ ├── stories
│ │ │ ├── android
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── animated-beam
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── animated-shiny-text
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── border-beam
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── dock
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── dot-pattern
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── flip-text
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── gradual-spacing
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── grid-pattern
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── iphone-15
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── letter-pullup
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── marquee
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── meteors
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── no-signal-screen
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── number-ticker
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── orbiting-circles
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── retro-grid
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── ripple
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── safari
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── shine-border
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── sparkles-text
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── spotlight
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── text-reveal
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── typing-animation
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── word-fade-in
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ ├── word-pullup
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ │ └── word-rotate
│ │ │ │ ├── default.tsx
│ │ │ │ └── stories.tsx
│ │ └── ui
│ │ │ ├── android.tsx
│ │ │ ├── animated-beam.tsx
│ │ │ ├── animated-shiny-text.tsx
│ │ │ ├── border-beam.tsx
│ │ │ ├── dock.tsx
│ │ │ ├── dot-pattern.tsx
│ │ │ ├── flip-text.tsx
│ │ │ ├── gradual-spacing.tsx
│ │ │ ├── grid-pattern.tsx
│ │ │ ├── iphone-15.tsx
│ │ │ ├── letter-pullup.tsx
│ │ │ ├── marquee.tsx
│ │ │ ├── meteors.tsx
│ │ │ ├── no-signal-screen.tsx
│ │ │ ├── number-ticker.tsx
│ │ │ ├── orbiting-circles.tsx
│ │ │ ├── retro-grid.tsx
│ │ │ ├── ripple.tsx
│ │ │ ├── safari.tsx
│ │ │ ├── shine-border.tsx
│ │ │ ├── sparkles-text.tsx
│ │ │ ├── spotlight.tsx
│ │ │ ├── text-reveal.tsx
│ │ │ ├── typing-animation.tsx
│ │ │ ├── word-fade-in.tsx
│ │ │ ├── word-pullup.tsx
│ │ │ └── word-rotate.tsx
│ └── tsconfig.json
└── tailwind
│ ├── .gitignore
│ ├── .storybook
│ ├── main.ts
│ ├── preview.tsx
│ └── tailwind.css
│ ├── README.md
│ ├── biome.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── src
│ ├── env.d.ts
│ ├── lib
│ │ ├── storybook.tsx
│ │ └── utils.ts
│ ├── stories
│ │ ├── android
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── animated-beam
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── animated-gradient-text
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── animated-shiny-text
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── background-lines
│ │ │ └── background-lines.stories.tsx
│ │ ├── bento-grid
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── border-beam
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── dock
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── dot-pattern
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── flip-text
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── gradual-spacing
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── grid-pattern
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── iphone-15
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── letter-pullup
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── marquee
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── meteors
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── no-signal-screen
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── number-ticker
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── orbiting-circles
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── retro-grid
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── ripple
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── safari
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── shimmer-button
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── shine-border
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── sparkles-text
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── sparkles
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── spotlight
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── starfield
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── text-reveal
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── typing-animation
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── word-fade-in
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ ├── word-pullup
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ │ └── word-rotate
│ │ │ ├── default.tsx
│ │ │ └── stories.tsx
│ └── ui
│ │ ├── android.tsx
│ │ ├── animated-beam.tsx
│ │ ├── animated-gradient-text.tsx
│ │ ├── animated-shiny-text.tsx
│ │ ├── background-lines.tsx
│ │ ├── bento-grid.tsx
│ │ ├── blur-in.tsx
│ │ ├── border-beam.tsx
│ │ ├── dock.tsx
│ │ ├── dot-pattern.tsx
│ │ ├── flip-text.tsx
│ │ ├── gradual-spacing.tsx
│ │ ├── grid-pattern.tsx
│ │ ├── iphone-15.tsx
│ │ ├── letter-pullup.tsx
│ │ ├── marquee.tsx
│ │ ├── meteors.tsx
│ │ ├── no-signal-screen.tsx
│ │ ├── number-ticker.tsx
│ │ ├── orbiting-circles.tsx
│ │ ├── retro-grid.tsx
│ │ ├── ripple.tsx
│ │ ├── safari.tsx
│ │ ├── shimmer-button.tsx
│ │ ├── shine-border.tsx
│ │ ├── sparkles-text.tsx
│ │ ├── sparkles.tsx
│ │ ├── spotlight.tsx
│ │ ├── starfield.tsx
│ │ ├── text-reveal.tsx
│ │ ├── typing-animation.tsx
│ │ ├── word-fade-in.tsx
│ │ ├── word-pullup.tsx
│ │ └── word-rotate.tsx
│ ├── tailwind.config.js
│ └── tsconfig.json
├── package.json
├── packages
├── cli
│ ├── .gitignore
│ ├── README.md
│ ├── biome.json
│ ├── package.json
│ ├── scripts
│ │ └── bump.ts
│ ├── src
│ │ ├── commands
│ │ │ ├── components.ts
│ │ │ └── init.ts
│ │ ├── index.ts
│ │ ├── utils.ts
│ │ └── version.ts
│ ├── tests
│ │ ├── __snapshots__
│ │ │ └── components.test.ts.snap
│ │ ├── components.test.ts
│ │ └── utils.test.ts
│ └── tsconfig.json
└── registry
│ ├── .gitignore
│ ├── README.md
│ ├── biome.json
│ ├── package.json
│ ├── panda
│ ├── android.json
│ ├── animated-beam.json
│ ├── animated-shiny-text.json
│ ├── border-beam.json
│ ├── dock.json
│ ├── dot-pattern.json
│ ├── flip-text.json
│ ├── gradual-spacing.json
│ ├── grid-pattern.json
│ ├── iphone-15.json
│ ├── letter-pullup.json
│ ├── marquee.json
│ ├── meteors.json
│ ├── no-signal-screen.json
│ ├── number-ticker.json
│ ├── orbiting-circles.json
│ ├── retro-grid.json
│ ├── ripple.json
│ ├── safari.json
│ ├── shine-border.json
│ ├── sparkles-text.json
│ ├── spotlight.json
│ ├── text-reveal.json
│ ├── typing-animation.json
│ ├── word-fade-in.json
│ ├── word-pullup.json
│ └── word-rotate.json
│ ├── src
│ ├── build.ts
│ ├── extend-config.ts
│ ├── panda.ts
│ ├── schema.ts
│ ├── tailwind.ts
│ └── utils.ts
│ ├── tailwind
│ ├── android.json
│ ├── animated-beam.json
│ ├── animated-gradient-text.json
│ ├── animated-shiny-text.json
│ ├── background-lines.json
│ ├── bento-grid.json
│ ├── blur-in.json
│ ├── border-beam.json
│ ├── dock.json
│ ├── dot-pattern.json
│ ├── flip-text.json
│ ├── gradual-spacing.json
│ ├── grid-pattern.json
│ ├── iphone-15.json
│ ├── letter-pullup.json
│ ├── marquee.json
│ ├── meteors.json
│ ├── no-signal-screen.json
│ ├── number-ticker.json
│ ├── orbiting-circles.json
│ ├── retro-grid.json
│ ├── ripple.json
│ ├── safari.json
│ ├── shimmer-button.json
│ ├── shine-border.json
│ ├── sparkles-text.json
│ ├── sparkles.json
│ ├── spotlight.json
│ ├── starfield.json
│ ├── text-reveal.json
│ ├── typing-animation.json
│ ├── word-fade-in.json
│ ├── word-pullup.json
│ └── word-rotate.json
│ └── tsconfig.json
├── templates
├── vite-panda
│ ├── .gitignore
│ ├── README.md
│ ├── bun.lockb
│ ├── index.html
│ ├── mystic.config.json
│ ├── package.json
│ ├── panda.config.ts
│ ├── postcss.config.cjs
│ ├── public
│ │ └── vite.svg
│ ├── src
│ │ ├── App.tsx
│ │ ├── assets
│ │ │ └── solid.svg
│ │ ├── components
│ │ │ └── mystic-ui
│ │ │ │ └── ripple.tsx
│ │ ├── index.css
│ │ ├── index.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.ts
└── vite-tailwind
│ ├── .gitignore
│ ├── README.md
│ ├── bun.lockb
│ ├── index.html
│ ├── mystic.config.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── public
│ └── vite.svg
│ ├── src
│ ├── App.tsx
│ ├── assets
│ │ └── solid.svg
│ ├── components
│ │ └── mystic-ui
│ │ │ └── ripple.tsx
│ ├── index.css
│ ├── index.tsx
│ ├── lib
│ │ └── utils.ts
│ └── vite-env.d.ts
│ ├── tailwind.config.js
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.ts
├── tsconfig.json
└── website
├── .gitignore
├── README.md
├── app.config.ts
├── biome.json
├── content-collections.ts
├── package.json
├── panda.config.ts
├── park-ui.json
├── postcss.config.cjs
├── public
└── favicon.ico
├── src
├── app.css
├── app.tsx
├── components
│ ├── code-block.tsx
│ ├── docs
│ │ ├── installation-instructions.tsx
│ │ └── story-preview.tsx
│ ├── navbar.tsx
│ ├── theme-switcher.tsx
│ └── ui
│ │ ├── badge.tsx
│ │ ├── button.tsx
│ │ ├── clipboard.tsx
│ │ ├── code.tsx
│ │ ├── heading.tsx
│ │ ├── icon-button.tsx
│ │ ├── kbd.tsx
│ │ ├── link.tsx
│ │ ├── select.tsx
│ │ ├── spinner.tsx
│ │ ├── stepper.tsx
│ │ ├── styled
│ │ ├── badge.tsx
│ │ ├── button.tsx
│ │ ├── clipboard.tsx
│ │ ├── code.tsx
│ │ ├── heading.tsx
│ │ ├── icon-button.tsx
│ │ ├── kbd.tsx
│ │ ├── link.tsx
│ │ ├── select.tsx
│ │ ├── spinner.tsx
│ │ ├── tabs.tsx
│ │ ├── text.tsx
│ │ └── utils
│ │ │ └── create-style-context.tsx
│ │ ├── tabs.tsx
│ │ └── text.tsx
├── content
│ ├── docs
│ │ ├── android.mdx
│ │ ├── animated-beam.mdx
│ │ ├── animated-shiny-text.mdx
│ │ ├── border-beam.mdx
│ │ ├── dock.mdx
│ │ ├── dot-pattern.mdx
│ │ ├── flip-text.mdx
│ │ ├── gradual-spacing.mdx
│ │ ├── grid-pattern.mdx
│ │ ├── iphone-15.mdx
│ │ ├── letter-pullup.mdx
│ │ ├── marquee.mdx
│ │ ├── meteors.mdx
│ │ ├── no-signal-screen.mdx
│ │ ├── number-ticker.mdx
│ │ ├── orbiting-circles.mdx
│ │ ├── retro-grid.mdx
│ │ ├── ripple.mdx
│ │ ├── safari.mdx
│ │ ├── shine-border.mdx
│ │ ├── sparkles-text.mdx
│ │ ├── spotlight.mdx
│ │ ├── text-reveal.mdx
│ │ ├── typing-animation.mdx
│ │ ├── word-fade-in.mdx
│ │ ├── word-pullup.mdx
│ │ └── word-rotate.mdx
│ └── pages
│ │ ├── introduction.mdx
│ │ ├── setup-panda.mdx
│ │ └── setup-tailwind.mdx
├── entry-client.tsx
├── entry-server.tsx
├── global.d.ts
├── lib
│ ├── shiki.ts
│ ├── store.ts
│ └── stories.ts
├── routes
│ ├── [...404].tsx
│ ├── docs
│ │ ├── [framework].tsx
│ │ └── [framework]
│ │ │ ├── components
│ │ │ └── [id].tsx
│ │ │ ├── index.tsx
│ │ │ └── setup.tsx
│ └── index.tsx
└── tools
│ └── solid-mdx.tsx
└── tsconfig.json
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) Mudit Somani
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "vcs": {
4 | "enabled": false,
5 | "clientKind": "git",
6 | "useIgnoreFile": true
7 | },
8 | "files": {
9 | "ignoreUnknown": false,
10 | "ignore": []
11 | },
12 | "formatter": {
13 | "enabled": true,
14 | "indentStyle": "tab"
15 | },
16 | "organizeImports": {
17 | "enabled": true
18 | },
19 | "linter": {
20 | "enabled": true,
21 | "rules": {
22 | "recommended": true,
23 | "suspicious": {
24 | "noExplicitAny": "warn",
25 | "noReactSpecificProps": "error"
26 | },
27 | "correctness": {
28 | "noUnusedImports": "warn"
29 | },
30 | "style": {
31 | "noNonNullAssertion": "off"
32 | }
33 | }
34 | },
35 | "javascript": {
36 | "formatter": {
37 | "quoteStyle": "double"
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheComputerM/mystic-ui/c7b3f1e9150c0474d8a5e62f807c8312e0e4b17f/bun.lockb
--------------------------------------------------------------------------------
/components/panda/.storybook/main.ts:
--------------------------------------------------------------------------------
1 | import { dirname, join } from "node:path";
2 | import type { StorybookConfig } from "storybook-solidjs-vite";
3 |
4 | import { mergeConfig } from "vite";
5 | import tsconfigPaths from "vite-tsconfig-paths";
6 |
7 | /**
8 | * This function is used to resolve the absolute path of a package.
9 | * It is needed in projects that use Yarn PnP or are set up within a monorepo.
10 | */
11 | function getAbsolutePath(value: string): string {
12 | return dirname(require.resolve(join(value, "package.json")));
13 | }
14 |
15 | const config: StorybookConfig = {
16 | stories: ["../src/stories/**/stories.@(js|jsx|ts|tsx)"],
17 | addons: [getAbsolutePath("@storybook/addon-essentials"), getAbsolutePath("@storybook/addon-themes")],
18 | framework: {
19 | name: getAbsolutePath("storybook-solidjs-vite") as "storybook-solidjs-vite",
20 | options: {},
21 | },
22 | viteFinal(config) {
23 | return mergeConfig(config, {
24 | plugins: [tsconfigPaths()],
25 | });
26 | },
27 | };
28 |
29 | export default config;
30 |
--------------------------------------------------------------------------------
/components/panda/.storybook/panda.css:
--------------------------------------------------------------------------------
1 | @layer reset, base, tokens, recipes, utilities;
--------------------------------------------------------------------------------
/components/panda/.storybook/preview.tsx:
--------------------------------------------------------------------------------
1 | import "./panda.css";
2 | // biome-ignore lint/correctness/noUnusedImports: needed for decorators
3 | import React from "react";
4 | import { withThemeByClassName } from "@storybook/addon-themes";
5 | import type { Preview } from "storybook-solidjs";
6 | import { css } from "../styled-system/css";
7 |
8 | const preview: Preview = {
9 | tags: ["autodocs"],
10 | decorators: [
11 | withThemeByClassName({
12 | themes: {
13 | light: "",
14 | dark: "dark",
15 | },
16 | defaultTheme: "light",
17 | }),
18 | (Story) => (
19 |
29 |
30 |
31 | ),
32 | ],
33 | parameters: {
34 | controls: {
35 | matchers: {
36 | color: /(background|color)$/i,
37 | date: /Date$/i,
38 | },
39 | },
40 | },
41 | };
42 |
43 | export default preview;
44 |
--------------------------------------------------------------------------------
/components/panda/README.md:
--------------------------------------------------------------------------------
1 | # PandaCSS + Mystic UI
2 |
3 | You can use Mystic UI with your PandaCSS projects, also works with panda based frameworks like [Park UI](https://park-ui.com/).
4 |
--------------------------------------------------------------------------------
/components/panda/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "extends": ["../../biome.json"]
4 | }
5 |
--------------------------------------------------------------------------------
/components/panda/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@mystic-ui/panda",
3 | "private": true,
4 | "type": "module",
5 | "scripts": {
6 | "prepare": "panda codegen",
7 | "track": "bun scripts/track.ts",
8 | "storybook": "storybook dev -p 6006",
9 | "build-storybook": "storybook build",
10 | "format": "biome format src",
11 | "lint": "biome lint src",
12 | "check": "biome check src"
13 | },
14 | "devDependencies": {
15 | "@biomejs/biome": "1.9.4",
16 | "@mystic-ui/registry": "workspace:*",
17 | "@pandacss/dev": "^0.47.1",
18 | "@storybook/addon-essentials": "^8.4.7",
19 | "@storybook/addon-themes": "^8.4.7",
20 | "@storybook/builder-vite": "^8.4.7",
21 | "@storybook/docs-tools": "^8.4.7",
22 | "@types/bun": "latest",
23 | "postcss": "^8.4.49",
24 | "storybook": "^8.4.7",
25 | "storybook-solidjs": "^1.0.0-beta.6",
26 | "storybook-solidjs-vite": "^1.0.0-beta.6",
27 | "tw2panda": "^0.3.1",
28 | "vite-tsconfig-paths": "^5.1.4"
29 | },
30 | "peerDependencies": {
31 | "typescript": "^5.3.3"
32 | },
33 | "dependencies": {
34 | "motion": "^11.13.1",
35 | "solid-icons": "^1.1.0",
36 | "solid-js": "^1.9.3",
37 | "solid-motionone": "^1.0.2"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/components/panda/panda.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "@pandacss/dev";
2 | import { pandaConfig as mysticConfig } from "@mystic-ui/registry/src/panda";
3 | import { merge } from "ts-deepmerge";
4 |
5 | const config = defineConfig({
6 | preflight: true,
7 | presets: ["@pandacss/preset-panda"],
8 | include: ["./src/**/*.{js,jsx,ts,tsx}", "./.storybook/preview.tsx"],
9 | exclude: [],
10 | theme: {
11 | extend: {},
12 | },
13 | outdir: "styled-system",
14 | jsxFactory: "solid",
15 | });
16 |
17 | export default merge(mysticConfig(), config);
18 |
--------------------------------------------------------------------------------
/components/panda/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | "@pandacss/dev/postcss": {},
4 | },
5 | };
6 |
--------------------------------------------------------------------------------
/components/panda/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/components/panda/src/lib/storybook.tsx:
--------------------------------------------------------------------------------
1 | import { lazy } from "solid-js";
2 |
3 | const sources = import.meta.glob("../stories/**/*.tsx", {
4 | eager: true,
5 | query: "?raw",
6 | import: "default",
7 | });
8 |
9 | export function getStory(name: string, example: string) {
10 | const Component = lazy(() => import(`../stories/${name}/${example}.tsx`));
11 | return {
12 | // biome-ignore lint/suspicious/noExplicitAny: props are different for each component
13 | render: (props: any) => ,
14 | parameters: {
15 | docs: {
16 | source: {
17 | code: sources[`../stories/${name}/${example}.tsx`],
18 | },
19 | },
20 | },
21 | };
22 | }
23 |
--------------------------------------------------------------------------------
/components/panda/src/stories/android/default.tsx:
--------------------------------------------------------------------------------
1 | import { Android } from "@/ui/android";
2 |
3 | export default function AndroidDemo() {
4 | return (
5 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/panda/src/stories/android/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Android } from "@/ui/android";
5 |
6 | const meta: Meta = {
7 | title: "Mocks/Android",
8 | component: Android,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("android", "default");
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/animated-beam/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { AnimatedBeam } from "@/ui/animated-beam";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Animated Beam",
7 | component: AnimatedBeam,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("animated-beam", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/animated-shiny-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { AnimatedShinyText } from "@/ui/animated-shiny-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Animated Shiny Text",
7 | component: AnimatedShinyText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("animated-shiny-text", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/border-beam/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { BorderBeam } from "@/ui/border-beam";
4 |
5 | export default function BorderBeamDemo() {
6 | return (
7 |
20 |
27 | Border Beam
28 |
29 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/components/panda/src/stories/border-beam/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { BorderBeam } from "@/ui/border-beam";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Border Beam",
7 | component: BorderBeam,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("border-beam", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/dock/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { Dock, DockIcon } from "@/ui/dock";
4 | import { For } from "solid-js";
5 |
6 | export default function DockDemo() {
7 | return (
8 |
9 |
10 | {() => (
11 |
12 |
21 |
22 | )}
23 |
24 |
33 |
34 | {() => (
35 |
36 |
45 |
46 | )}
47 |
48 |
49 | );
50 | }
51 |
--------------------------------------------------------------------------------
/components/panda/src/stories/dock/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Dock } from "@/ui/dock";
5 |
6 | const meta: Meta = {
7 | title: "Component/Dock",
8 | component: Dock,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("dock", "default");
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/dot-pattern/default.tsx:
--------------------------------------------------------------------------------
1 | import { DotPattern } from "@/ui/dot-pattern";
2 | import { css } from "styled-system/css";
3 |
4 | export default function DotPatternDemo() {
5 | return (
6 |
16 |
23 | Dot Pattern
24 |
25 |
31 |
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/components/panda/src/stories/dot-pattern/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { DotPattern } from "@/ui/dot-pattern";
5 |
6 | const meta: Meta = {
7 | title: "Backgrounds/Dot Pattern",
8 | component: DotPattern,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("dot-pattern", "default");
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/flip-text/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { FlipText } from "@/ui/flip-text";
4 |
5 | export default function FlipTextDemo() {
6 | return (
7 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/flip-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { FlipText } from "@/ui/flip-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Flip Text",
7 | component: FlipText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("flip-text", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/gradual-spacing/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { GradualSpacing } from "@/ui/gradual-spacing";
4 |
5 | export default function GradualSpacingDemo() {
6 | return (
7 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/gradual-spacing/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { GradualSpacing } from "@/ui/gradual-spacing";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Gradual Spacing",
7 | component: GradualSpacing,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("gradual-spacing", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/grid-pattern/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { GridPattern } from "@/ui/grid-pattern";
4 |
5 | export default function GridPatternDashed() {
6 | return (
7 |
17 |
18 | Grid Pattern
19 |
20 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/components/panda/src/stories/grid-pattern/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { GridPattern } from "@/ui/grid-pattern";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Backgrounds/Grid Pattern",
7 | component: GridPattern,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("grid-pattern", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/iphone-15/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { IPhone15 } from "@/ui/iphone-15";
4 |
5 | export default function IPhone15Demo() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/components/panda/src/stories/iphone-15/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { IPhone15 } from "@/ui/iphone-15";
5 |
6 | const meta: Meta = {
7 | title: "Mocks/IPhone 15",
8 | component: IPhone15,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("iphone-15", "default");
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/letter-pullup/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { LetterPullup } from "@/ui/letter-pullup";
4 |
5 | export default function LetterPullupDemo() {
6 | return (
7 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/letter-pullup/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { LetterPullup } from "@/ui/letter-pullup";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Letter Pullup",
7 | component: LetterPullup,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("letter-pullup", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/marquee/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Marquee } from "@/ui/marquee";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Component/Marquee",
7 | component: Marquee,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("marquee", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/meteors/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { Meteors } from "@/ui/meteors";
4 |
5 | export default function MeteorDemo() {
6 | return (
7 |
20 |
21 |
28 | Meteors
29 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/components/panda/src/stories/meteors/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Meteors } from "@/ui/meteors";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Meteors",
7 | component: Meteors,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("meteors", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/no-signal-screen/default.tsx:
--------------------------------------------------------------------------------
1 | import { NoSignalScreen } from "@/ui/no-signal-screen";
2 | import { css } from "styled-system/css";
3 |
4 | export default function DotPatternDemo() {
5 | return (
6 |
16 |
24 | No Signal
25 |
26 |
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/components/panda/src/stories/no-signal-screen/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { NoSignalScreen } from "@/ui/no-signal-screen";
5 |
6 | const meta: Meta = {
7 | title: "Backgrounds/No Signal Screen",
8 | component: NoSignalScreen,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("no-signal-screen", "default");
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/number-ticker/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { NumberTicker } from "@/ui/number-ticker";
4 |
5 | export default function NumberTickerDemo() {
6 | return (
7 |
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/number-ticker/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { NumberTicker } from "@/ui/number-ticker";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Number Ticker",
7 | component: NumberTicker,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("number-ticker", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/orbiting-circles/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { OrbitingCircles } from "@/ui/orbiting-circles";
4 | import {
5 | TbBrand4chan,
6 | TbBrandBitbucket,
7 | TbBrandGithubFilled,
8 | TbBrandReddit,
9 | } from "solid-icons/tb";
10 |
11 | export default function OrbitingCirclesDemo() {
12 | return (
13 |
24 |
32 | Circles
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | );
49 | }
50 |
--------------------------------------------------------------------------------
/components/panda/src/stories/orbiting-circles/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { OrbitingCircles } from "@/ui/orbiting-circles";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Component/Orbiting Circles",
7 | component: OrbitingCircles,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("orbiting-circles", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/retro-grid/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { RetroGrid } from "@/ui/retro-grid";
4 |
5 | export default function DotPatternDemo() {
6 | return (
7 |
17 |
31 | Retro Grid
32 |
33 |
34 |
35 |
36 | );
37 | }
38 |
--------------------------------------------------------------------------------
/components/panda/src/stories/retro-grid/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { RetroGrid } from "@/ui/retro-grid";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Backgrounds/Retro Grid",
7 | component: RetroGrid,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("retro-grid", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/ripple/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { Ripple } from "@/ui/ripple";
4 |
5 | export default function RippleDemo() {
6 | return (
7 |
18 |

23 |
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/components/panda/src/stories/ripple/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Ripple } from "@/ui/ripple";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Backgrounds/Ripple",
7 | component: Ripple,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("ripple", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/safari/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { Safari } from "@/ui/safari";
4 |
5 | export default function SafariDemo() {
6 | return (
7 |
8 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/safari/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Safari } from "@/ui/safari";
5 |
6 | const meta: Meta = {
7 | title: "Mocks/Safari",
8 | component: Safari,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("safari", "default");
15 |
--------------------------------------------------------------------------------
/components/panda/src/stories/shine-border/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { ShineBorder } from "@/ui/shine-border";
4 |
5 | export default function ShineBorderDemo() {
6 | return (
7 |
21 |
28 | Shine Border
29 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/components/panda/src/stories/shine-border/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { ShineBorder } from "@/ui/shine-border";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Shine Border",
7 | component: ShineBorder,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("shine-border", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/sparkles-text/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { SparklesText } from "@/ui/sparkles-text";
4 |
5 | export default function SparklesTextDemo() {
6 | return (
7 |
14 | Mystic UI
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/sparkles-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { SparklesText } from "@/ui/sparkles-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Sparkles Text",
7 | component: SparklesText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("sparkles-text", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/spotlight/default.tsx:
--------------------------------------------------------------------------------
1 | import { css, cx } from "styled-system/css";
2 |
3 | import { Spotlight } from "@/ui/spotlight";
4 |
5 | export default function SpotlightDemo() {
6 | return (
7 |
23 |
24 |
40 | Spotlight
41 |
42 |
43 | );
44 | }
45 |
--------------------------------------------------------------------------------
/components/panda/src/stories/spotlight/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Spotlight } from "@/ui/spotlight";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Spotlight",
7 | component: Spotlight,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("spotlight", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/text-reveal/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { TextReveal } from "@/ui/text-reveal";
4 |
5 | export default function TextRevealDemo() {
6 | return (
7 |
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/components/panda/src/stories/text-reveal/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { TextReveal } from "@/ui/text-reveal";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Text Reveal",
7 | component: TextReveal,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("text-reveal", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/typing-animation/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { TypingAnimation } from "@/ui/typing-animation";
4 |
5 | export default function TypingAnimationDemo() {
6 | return (
7 |
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/typing-animation/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { TypingAnimation } from "@/ui/typing-animation";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Typing Animation",
7 | component: TypingAnimation,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("typing-animation", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/word-fade-in/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { WordFadeIn } from "@/ui/word-fade-in";
4 |
5 | export default function WordFadeInDemo() {
6 | return (
7 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/word-fade-in/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { WordFadeIn } from "@/ui/word-fade-in";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Word Fade In",
7 | component: WordFadeIn,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("word-fade-in", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/word-pullup/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { WordPullup } from "@/ui/word-pullup";
4 |
5 | export default function LetterPullupDemo() {
6 | return (
7 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/components/panda/src/stories/word-pullup/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { WordPullup } from "@/ui/word-pullup";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Word Pullup",
7 | component: WordPullup,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("word-pullup", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/stories/word-rotate/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { WordRotate } from "@/ui/word-rotate";
4 |
5 | export default function WordRotateDemo() {
6 | return (
7 |
8 |
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/components/panda/src/stories/word-rotate/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { WordRotate } from "@/ui/word-rotate";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Word Rotate",
7 | component: WordRotate,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("word-rotate", "default");
14 |
--------------------------------------------------------------------------------
/components/panda/src/ui/animated-shiny-text.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type JSX,
3 | type ParentComponent,
4 | mergeProps,
5 | splitProps,
6 | } from "solid-js";
7 | import { css, cx } from "styled-system/css";
8 |
9 | export interface AnimatedShinyTextProps
10 | extends JSX.HTMLAttributes {
11 | shimmerWidth?: number;
12 | }
13 |
14 | export const AnimatedShinyText: ParentComponent = (
15 | props,
16 | ) => {
17 | const [_localProps, forwardProps] = splitProps(props, [
18 | "shimmerWidth",
19 | "class",
20 | "children",
21 | ]);
22 | const localProps = mergeProps({ shimmerWidth: 100 }, _localProps);
23 |
24 | return (
25 |
54 | {localProps.children}
55 |
56 | );
57 | };
58 |
--------------------------------------------------------------------------------
/components/panda/src/ui/flip-text.tsx:
--------------------------------------------------------------------------------
1 | import { css, cx } from "styled-system/css";
2 |
3 | import { Motion, type VariantDefinition } from "solid-motionone";
4 |
5 | import { type Component, For, mergeProps } from "solid-js";
6 |
7 | export interface FlipTextProps {
8 | text: string;
9 | duration?: number;
10 | delayMultiple?: number;
11 | states?: {
12 | initial: VariantDefinition;
13 | animate: VariantDefinition;
14 | };
15 | class?: string;
16 | }
17 |
18 | export const FlipText: Component = (props) => {
19 | const localProps = mergeProps(
20 | {
21 | duration: 0.5,
22 | delayMultiple: 0.08,
23 | states: {
24 | initial: { rotateX: -90, opacity: 0 },
25 | animate: { rotateX: 0, opacity: 1 },
26 | },
27 | },
28 | props,
29 | );
30 |
31 | return (
32 |
33 |
34 | {(char, i) => (
35 |
43 | {char === " " ? : char}
44 |
45 | )}
46 |
47 |
48 | );
49 | };
50 |
--------------------------------------------------------------------------------
/components/panda/src/ui/gradual-spacing.tsx:
--------------------------------------------------------------------------------
1 | import { css, cx } from "styled-system/css";
2 |
3 | import { Motion, type Options } from "solid-motionone";
4 |
5 | import { type Component, For, mergeProps } from "solid-js";
6 |
7 | export interface GradualSpacingProps {
8 | text: string;
9 | duration?: number;
10 | delayMultiple?: number;
11 | states?: {
12 | hidden: Options["exit"];
13 | visible: Options["inView"];
14 | };
15 | class?: string;
16 | }
17 |
18 | export const GradualSpacing: Component = (props) => {
19 | const localProps = mergeProps(
20 | {
21 | duration: 0.5,
22 | delayMultiple: 0.04,
23 | states: {
24 | hidden: { opacity: 0, x: -20 },
25 | visible: { opacity: 1, x: 0 },
26 | },
27 | },
28 | props,
29 | );
30 |
31 | return (
32 |
33 |
34 | {(char, i) => (
35 |
44 | {char === " " ? : char}
45 |
46 | )}
47 |
48 |
49 | );
50 | };
51 |
--------------------------------------------------------------------------------
/components/panda/src/ui/letter-pullup.tsx:
--------------------------------------------------------------------------------
1 | import { css, cx } from "styled-system/css";
2 |
3 | import { animate, inView, stagger } from "motion";
4 | import { type Component, For, mergeProps, onCleanup, onMount } from "solid-js";
5 |
6 | export interface LetterPullupProps {
7 | text: string;
8 | class?: string;
9 | delay?: number;
10 | }
11 |
12 | export const LetterPullup: Component = (props) => {
13 | const localProps = mergeProps({ delay: 0.05 }, props);
14 | let container!: HTMLDivElement;
15 |
16 | onMount(() => {
17 | const stop = inView(container, (info) => {
18 | animate(
19 | Array.from(info.target.children),
20 | {
21 | y: [100, 0],
22 | opacity: [0, 1],
23 | },
24 | {
25 | delay: stagger(localProps.delay),
26 | },
27 | );
28 | });
29 |
30 | onCleanup(() => stop());
31 | });
32 |
33 | return (
34 |
35 |
36 | {(letter, i) => (
37 | {letter === " " ? : letter}
38 | )}
39 |
40 |
41 | );
42 | };
43 |
--------------------------------------------------------------------------------
/components/panda/src/ui/number-ticker.tsx:
--------------------------------------------------------------------------------
1 | import { animate, inView } from "motion";
2 | import {
3 | type Component,
4 | type JSX,
5 | mergeProps,
6 | onMount,
7 | splitProps,
8 | } from "solid-js";
9 |
10 | export interface NumberTickerProps extends JSX.HTMLAttributes {
11 | value?: number;
12 | direction?: "up" | "down";
13 | delay?: number;
14 | decimalPlaces?: number;
15 | }
16 |
17 | export const NumberTicker: Component = (props) => {
18 | const [_localProps, forwardProps] = splitProps(props, [
19 | "value",
20 | "direction",
21 | "delay",
22 | "decimalPlaces",
23 | ]);
24 | const localProps = mergeProps(
25 | { value: 100, direction: "up" as const, delay: 0, decimalPlaces: 0 },
26 | _localProps,
27 | );
28 | let ref!: HTMLSpanElement;
29 |
30 | onMount(() => {
31 | inView(ref, () => {
32 | animate(0, 1, {
33 | delay: localProps.delay,
34 | type: "spring",
35 | damping: 65,
36 | stiffness: 100,
37 | onUpdate: (progress) => {
38 | let latest = progress * localProps.value;
39 | if (localProps.direction === "down") {
40 | latest = localProps.value - latest;
41 | }
42 | ref.textContent = Intl.NumberFormat("en-US", {
43 | minimumFractionDigits: localProps.decimalPlaces,
44 | maximumFractionDigits: localProps.decimalPlaces,
45 | }).format(Number(latest.toFixed(localProps.decimalPlaces)));
46 | },
47 | });
48 | });
49 | });
50 |
51 | return ;
52 | };
53 |
--------------------------------------------------------------------------------
/components/panda/src/ui/typing-animation.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type Component,
3 | createEffect,
4 | createSignal,
5 | mergeProps,
6 | onCleanup,
7 | } from "solid-js";
8 |
9 | export interface TypingAnimationProps {
10 | text: string;
11 | duration?: number;
12 | }
13 |
14 | export const TypingAnimation: Component = (props) => {
15 | const localProps = mergeProps({ duration: 200 }, props);
16 | const [displayedText, setDisplayedText] = createSignal("");
17 | const [i, setI] = createSignal(0);
18 |
19 | createEffect(() => {
20 | const typingEffect = setInterval(() => {
21 | if (i() < localProps.text.length) {
22 | setDisplayedText(localProps.text.substring(0, i() + 1));
23 | setI((i) => i + 1);
24 | } else {
25 | clearInterval(typingEffect);
26 | }
27 | }, localProps.duration);
28 |
29 | onCleanup(() => {
30 | clearInterval(typingEffect);
31 | });
32 | });
33 |
34 | return <>{displayedText()}>;
35 | };
36 |
--------------------------------------------------------------------------------
/components/panda/src/ui/word-fade-in.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type Component,
3 | For,
4 | type JSX,
5 | mergeProps,
6 | splitProps,
7 | } from "solid-js";
8 | import { Motion } from "solid-motionone";
9 | import { css, cx } from "styled-system/css";
10 |
11 | export interface WordFadeInProps extends JSX.HTMLAttributes {
12 | text: string;
13 | delay?: number;
14 | duration?: number;
15 | blur?: number;
16 | }
17 |
18 | export const WordFadeIn: Component = (props) => {
19 | const [_localProps, forwardProps] = splitProps(props, [
20 | "text",
21 | "delay",
22 | "duration",
23 | "blur",
24 | "class",
25 | ]);
26 | const localProps = mergeProps(
27 | {
28 | delay: 0.15,
29 | duration: 1,
30 | blur: 8,
31 | },
32 | _localProps,
33 | );
34 |
35 | return (
36 |
40 |
41 | {(word, i) => (
42 |
51 | {word}
52 |
53 | )}
54 |
55 |
56 | );
57 | };
58 |
--------------------------------------------------------------------------------
/components/panda/src/ui/word-pullup.tsx:
--------------------------------------------------------------------------------
1 | import { css, cx } from "styled-system/css";
2 |
3 | import { type Component, For, mergeProps } from "solid-js";
4 | import { Motion } from "solid-motionone";
5 |
6 | export interface WordPullupProps {
7 | text: string;
8 | class?: string;
9 | delay?: number;
10 | }
11 |
12 | export const WordPullup: Component = (props) => {
13 | const localProps = mergeProps({ delay: 0.2 }, props);
14 |
15 | return (
16 |
17 |
18 | {(letter, i) => (
19 |
27 | {letter}
28 |
29 | )}
30 |
31 |
32 | );
33 | };
34 |
--------------------------------------------------------------------------------
/components/panda/src/ui/word-rotate.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type Component,
3 | type JSX,
4 | Show,
5 | createEffect,
6 | createSignal,
7 | mergeProps,
8 | onCleanup,
9 | splitProps,
10 | } from "solid-js";
11 | import { Motion, type MotionComponentProps, Presence } from "solid-motionone";
12 |
13 | export interface WordRotateProps
14 | extends JSX.HTMLAttributes,
15 | Omit {
16 | words: string[];
17 | duration?: number;
18 | }
19 |
20 | export const WordRotate: Component = (props) => {
21 | const [_localProps, forwardProps] = splitProps(props, ["words", "duration"]);
22 | const localProps = mergeProps(
23 | {
24 | duration: 2500,
25 | },
26 | _localProps,
27 | );
28 |
29 | const [index, setIndex] = createSignal(0);
30 |
31 | createEffect(() => {
32 | const interval = setInterval(() => {
33 | setIndex((prevIndex) => (prevIndex + 1) % localProps.words.length);
34 | }, localProps.duration);
35 |
36 | onCleanup(() => clearInterval(interval));
37 | });
38 |
39 | return (
40 |
41 |
42 |
49 | {localProps.words[index()]}
50 |
51 |
52 |
53 | );
54 | };
55 |
--------------------------------------------------------------------------------
/components/panda/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | // Enable latest features
4 | "lib": ["ESNext", "DOM"],
5 | "target": "ESNext",
6 | "module": "ESNext",
7 | "moduleDetection": "force",
8 | "jsx": "preserve",
9 | "jsxImportSource": "solid-js",
10 | "allowJs": true,
11 |
12 | // Bundler mode
13 | "moduleResolution": "bundler",
14 | "allowImportingTsExtensions": true,
15 | "verbatimModuleSyntax": true,
16 | "noEmit": true,
17 |
18 | // Best practices
19 | "strict": true,
20 | "skipLibCheck": true,
21 | "noFallthroughCasesInSwitch": true,
22 |
23 | // Some stricter flags (disabled by default)
24 | "noUnusedLocals": false,
25 | "noUnusedParameters": false,
26 | "noPropertyAccessFromIndexSignature": false,
27 |
28 | "baseUrl": ".",
29 | "paths": {
30 | "@/*": ["src/*"]
31 | }
32 | },
33 | "include": ["src", "styled-system"]
34 | }
35 |
--------------------------------------------------------------------------------
/components/tailwind/.storybook/main.ts:
--------------------------------------------------------------------------------
1 | import { dirname, join } from "node:path";
2 | import type { StorybookConfig } from "storybook-solidjs-vite";
3 |
4 | import { mergeConfig } from "vite";
5 | import tsconfigPaths from "vite-tsconfig-paths";
6 |
7 | /**
8 | * This function is used to resolve the absolute path of a package.
9 | * It is needed in projects that use Yarn PnP or are set up within a monorepo.
10 | */
11 | function getAbsolutePath(value: string): string {
12 | return dirname(require.resolve(join(value, "package.json")));
13 | }
14 |
15 | const config: StorybookConfig = {
16 | stories: ["../src/stories/**/stories.@(js|jsx|ts|tsx)"],
17 | addons: [getAbsolutePath("@storybook/addon-essentials"), getAbsolutePath("@storybook/addon-themes")],
18 | framework: {
19 | name: getAbsolutePath("storybook-solidjs-vite") as "storybook-solidjs-vite",
20 | options: {},
21 | },
22 | viteFinal(config) {
23 | return mergeConfig(config, {
24 | plugins: [tsconfigPaths()],
25 | });
26 | },
27 | };
28 |
29 | export default config;
30 |
--------------------------------------------------------------------------------
/components/tailwind/.storybook/preview.tsx:
--------------------------------------------------------------------------------
1 | import "./tailwind.css";
2 | // biome-ignore lint/correctness/noUnusedImports: needed for decorators
3 | import React from "react";
4 | import { withThemeByClassName } from "@storybook/addon-themes";
5 | import type { Preview } from "storybook-solidjs";
6 |
7 | const preview: Preview = {
8 | tags: ["autodocs"],
9 | decorators: [
10 | withThemeByClassName({
11 | themes: {
12 | light: "",
13 | dark: "dark",
14 | },
15 | defaultTheme: "light",
16 | }),
17 | (Story) => (
18 | // biome-ignore lint/suspicious/noReactSpecificProps: storybook uses react
19 |
20 |
21 |
22 | ),
23 | ],
24 | parameters: {
25 | controls: {
26 | matchers: {
27 | color: /(background|color)$/i,
28 | date: /Date$/i,
29 | },
30 | },
31 | },
32 | };
33 |
34 | export default preview;
35 |
--------------------------------------------------------------------------------
/components/tailwind/.storybook/tailwind.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/components/tailwind/README.md:
--------------------------------------------------------------------------------
1 | # Tailwind + Mystic UI
2 |
3 | You can use Mystic UI with your Tailwind projects, also works with tailwind based frameworks like [Solid UI](https://www.solid-ui.com/) and [shadcn-solid](https://shadcn-solid.com/).
4 |
--------------------------------------------------------------------------------
/components/tailwind/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "extends": ["../../biome.json"]
4 | }
5 |
--------------------------------------------------------------------------------
/components/tailwind/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@mystic-ui/tailwind",
3 | "private": true,
4 | "type": "module",
5 | "devDependencies": {
6 | "@biomejs/biome": "1.9.4",
7 | "@mystic-ui/registry": "workspace:*",
8 | "@storybook/addon-essentials": "^8.4.7",
9 | "@storybook/addon-themes": "^8.4.7",
10 | "@storybook/builder-vite": "^8.4.7",
11 | "@storybook/docs-tools": "^8.4.7",
12 | "@types/bun": "latest",
13 | "autoprefixer": "^10.4.20",
14 | "postcss": "^8.4.49",
15 | "storybook": "^8.4.7",
16 | "storybook-solidjs": "^1.0.0-beta.6",
17 | "storybook-solidjs-vite": "^1.0.0-beta.6",
18 | "tailwindcss": "^3.4.16",
19 | "ts-deepmerge": "^7.0.2",
20 | "vite-tsconfig-paths": "^5.1.4"
21 | },
22 | "scripts": {
23 | "storybook": "storybook dev -p 6006",
24 | "build-storybook": "storybook build",
25 | "format": "biome format src",
26 | "lint": "biome lint src",
27 | "check": "biome check src"
28 | },
29 | "dependencies": {
30 | "@tsparticles/engine": "^3.7.1",
31 | "@tsparticles/slim": "^3.7.1",
32 | "clsx": "^2.1.1",
33 | "motion": "^11.13.1",
34 | "solid-icons": "^1.1.0",
35 | "solid-js": "^1.9.3",
36 | "solid-motionone": "^1.0.2",
37 | "tailwind-merge": "^2.5.5"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/components/tailwind/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/components/tailwind/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/components/tailwind/src/lib/storybook.tsx:
--------------------------------------------------------------------------------
1 | import { lazy } from "solid-js";
2 |
3 | const sources = import.meta.glob("../stories/**/*.tsx", {
4 | eager: true,
5 | query: "?raw",
6 | import: "default",
7 | });
8 |
9 | export function getStory(name: string, example: string) {
10 | const Component = lazy(() => import(`../stories/${name}/${example}.tsx`));
11 | return {
12 | // biome-ignore lint/suspicious/noExplicitAny: props are different for each component
13 | render: (props: any) => ,
14 | parameters: {
15 | docs: {
16 | source: {
17 | code: sources[`../stories/${name}/${example}.tsx`],
18 | },
19 | },
20 | },
21 | };
22 | }
23 |
--------------------------------------------------------------------------------
/components/tailwind/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/android/default.tsx:
--------------------------------------------------------------------------------
1 | import { css } from "styled-system/css";
2 |
3 | import { Android } from "@/ui/android";
4 |
5 | export default function AndroidDemo() {
6 | return (
7 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/android/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Android } from "@/ui/android";
5 |
6 | const meta: Meta = {
7 | title: "Mocks/Android",
8 | component: Android,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("android", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/animated-beam/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { AnimatedBeam } from "@/ui/animated-beam";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Animated Beam",
7 | component: AnimatedBeam,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("animated-beam", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/animated-gradient-text/default.tsx:
--------------------------------------------------------------------------------
1 | import { AnimatedGradientText } from "@/ui/animated-gradient-text";
2 |
3 | export default function AnimatedGradientTextDemo() {
4 | return (
5 |
6 |
7 | 🎉
{" "}
8 |
9 | Introducing Magic UI
10 |
11 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/animated-gradient-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { AnimatedGradientText } from "@/ui/animated-gradient-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Animated Gradient Text",
7 | component: AnimatedGradientText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("animated-gradient-text", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/animated-shiny-text/default.tsx:
--------------------------------------------------------------------------------
1 | import { AnimatedShinyText } from "@/ui/animated-shiny-text";
2 | import { TbChevronRight } from "solid-icons/tb";
3 |
4 | export default function AnimatedShinyTextDemo() {
5 | return (
6 |
7 |
8 | ✨ Introducing Mystic UI
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/animated-shiny-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { AnimatedShinyText } from "@/ui/animated-shiny-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Animated Shiny Text",
7 | component: AnimatedShinyText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("animated-shiny-text", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/background-lines/background-lines.stories.tsx:
--------------------------------------------------------------------------------
1 | import { BackgroundLines } from "@/ui/background-lines";
2 | import type { Meta, StoryObj } from "storybook-solidjs";
3 |
4 | const meta: Meta = {
5 | title: "Backgrounds/Background Lines",
6 | component: BackgroundLines,
7 | tags: ["autodocs"],
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = {
14 | render: () => (
15 |
16 |
17 | Sanjana Airlines,
Sajana Textiles.
18 |
19 |
20 | Get the best advices from our experts, including expert artists,
21 | painters, marathon enthusiasts and RDX, totally free.
22 |
23 |
24 | ),
25 | };
26 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/bento-grid/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { BentoCard } from "@/ui/bento-grid";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Component/Bento Grid",
7 | component: BentoCard,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("bento-grid", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/border-beam/default.tsx:
--------------------------------------------------------------------------------
1 | import { BorderBeam } from "@/ui/border-beam";
2 |
3 | export default function BorderBeamDemo() {
4 | return (
5 |
6 | Border Beam
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/border-beam/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { BorderBeam } from "@/ui/border-beam";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Border Beam",
7 | component: BorderBeam,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("border-beam", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/dock/default.tsx:
--------------------------------------------------------------------------------
1 | import { Dock, DockIcon } from "@/ui/dock";
2 | import { For } from "solid-js";
3 |
4 | export default function DockDemo() {
5 | return (
6 |
7 |
8 | {() => (
9 |
10 |
11 |
12 | )}
13 |
14 |
15 |
16 | {() => (
17 |
18 |
19 |
20 | )}
21 |
22 |
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/dock/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Dock } from "@/ui/dock";
5 |
6 | const meta: Meta = {
7 | title: "Component/Dock",
8 | component: Dock,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("dock", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/dot-pattern/default.tsx:
--------------------------------------------------------------------------------
1 | import { DotPattern } from "@/ui/dot-pattern";
2 |
3 | export default function DotPatternDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/dot-pattern/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { DotPattern } from "@/ui/dot-pattern";
5 |
6 | const meta: Meta = {
7 | title: "Backgrounds/Dot Pattern",
8 | component: DotPattern,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("dot-pattern", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/flip-text/default.tsx:
--------------------------------------------------------------------------------
1 | import { FlipText } from "@/ui/flip-text";
2 |
3 | export default function FlipTextDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/flip-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { FlipText } from "@/ui/flip-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Flip Text",
7 | component: FlipText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("flip-text", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/gradual-spacing/default.tsx:
--------------------------------------------------------------------------------
1 | import { GradualSpacing } from "@/ui/gradual-spacing";
2 |
3 | export default function GradualSpacingDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/gradual-spacing/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { GradualSpacing } from "@/ui/gradual-spacing";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Gradual Spacing",
7 | component: GradualSpacing,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("gradual-spacing", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/grid-pattern/default.tsx:
--------------------------------------------------------------------------------
1 | import { GridPattern } from "@/ui/grid-pattern";
2 |
3 | export default function GridPatternDashed() {
4 | return (
5 |
6 |
Grid Pattern
7 |
14 |
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/grid-pattern/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { GridPattern } from "@/ui/grid-pattern";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Backgrounds/Grid Pattern",
7 | component: GridPattern,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("grid-pattern", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/iphone-15/default.tsx:
--------------------------------------------------------------------------------
1 | import { IPhone15 } from "@/ui/iphone-15";
2 |
3 | export default function IPhone15Demo() {
4 | return (
5 |
6 |
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/iphone-15/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { IPhone15 } from "@/ui/iphone-15";
5 |
6 | const meta: Meta = {
7 | title: "Mocks/IPhone 15",
8 | component: IPhone15,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("iphone-15", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/letter-pullup/default.tsx:
--------------------------------------------------------------------------------
1 | import { LetterPullup } from "@/ui/letter-pullup";
2 |
3 | export default function LetterPullupDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/letter-pullup/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { LetterPullup } from "@/ui/letter-pullup";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Letter Pullup",
7 | component: LetterPullup,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("letter-pullup", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/marquee/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Marquee } from "@/ui/marquee";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Component/Marquee",
7 | component: Marquee,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("marquee", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/meteors/default.tsx:
--------------------------------------------------------------------------------
1 | import { Meteors } from "@/ui/meteors";
2 |
3 | export default function MeteorDemo() {
4 | return (
5 |
6 |
7 | Meteors
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/meteors/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Meteors } from "@/ui/meteors";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Meteors",
7 | component: Meteors,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("meteors", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/no-signal-screen/default.tsx:
--------------------------------------------------------------------------------
1 | import { NoSignalScreen } from "@/ui/no-signal-screen";
2 |
3 | export default function DotPatternDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/no-signal-screen/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { NoSignalScreen } from "@/ui/no-signal-screen";
5 |
6 | const meta: Meta = {
7 | title: "Backgrounds/No Signal Screen",
8 | component: NoSignalScreen,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("no-signal-screen", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/number-ticker/default.tsx:
--------------------------------------------------------------------------------
1 | import { NumberTicker } from "@/ui/number-ticker";
2 |
3 | export default function NumberTickerDemo() {
4 | return (
5 |
6 |
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/number-ticker/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { NumberTicker } from "@/ui/number-ticker";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Number Ticker",
7 | component: NumberTicker,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("number-ticker", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/orbiting-circles/default.tsx:
--------------------------------------------------------------------------------
1 | import { OrbitingCircles } from "@/ui/orbiting-circles";
2 | import {
3 | TbBrand4chan,
4 | TbBrandBitbucket,
5 | TbBrandGithubFilled,
6 | TbBrandReddit,
7 | } from "solid-icons/tb";
8 |
9 | export default function OrbitingCirclesDemo() {
10 | return (
11 |
12 | Circles
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/orbiting-circles/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { OrbitingCircles } from "@/ui/orbiting-circles";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Component/Orbiting Circles",
7 | component: OrbitingCircles,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("orbiting-circles", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/retro-grid/default.tsx:
--------------------------------------------------------------------------------
1 | import { RetroGrid } from "@/ui/retro-grid";
2 |
3 | export default function DotPatternDemo() {
4 | return (
5 |
6 |
7 | Retro Grid
8 |
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/retro-grid/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { RetroGrid } from "@/ui/retro-grid";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Backgrounds/Retro Grid",
7 | component: RetroGrid,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("retro-grid", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/ripple/default.tsx:
--------------------------------------------------------------------------------
1 | import { Ripple } from "@/ui/ripple";
2 |
3 | export default function RippleDemo() {
4 | return (
5 |
6 |

11 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/ripple/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Ripple } from "@/ui/ripple";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Backgrounds/Ripple",
7 | component: Ripple,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("ripple", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/safari/default.tsx:
--------------------------------------------------------------------------------
1 | import { Safari } from "@/ui/safari";
2 |
3 | export default function SafariDemo() {
4 | return (
5 |
6 |
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/safari/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Safari } from "@/ui/safari";
5 |
6 | const meta: Meta = {
7 | title: "Mocks/Safari",
8 | component: Safari,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("safari", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/shimmer-button/default.tsx:
--------------------------------------------------------------------------------
1 | import { ShimmerButton } from "@/ui/shimmer-button";
2 |
3 | export default function ShimmerButtonDemo() {
4 | return (
5 |
6 |
7 |
8 | Shimmer Button
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/shimmer-button/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { ShimmerButton } from "@/ui/shimmer-button";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Buttons/Shimmer Button",
7 | component: ShimmerButton,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("shimmer-button", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/shine-border/default.tsx:
--------------------------------------------------------------------------------
1 | import { ShineBorder } from "@/ui/shine-border";
2 |
3 | export default function ShineBorderDemo() {
4 | return (
5 |
9 | Shine Border
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/shine-border/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { ShineBorder } from "@/ui/shine-border";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Shine Border",
7 | component: ShineBorder,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("shine-border", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/sparkles-text/default.tsx:
--------------------------------------------------------------------------------
1 | import { SparklesText } from "@/ui/sparkles-text";
2 |
3 | export default function SparklesTextDemo() {
4 | return (
5 |
6 | Mystic UI
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/sparkles-text/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { SparklesText } from "@/ui/sparkles-text";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Sparkles Text",
7 | component: SparklesText,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("sparkles-text", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/sparkles/default.tsx:
--------------------------------------------------------------------------------
1 | import { SparklesCore } from "@/ui/sparkles";
2 |
3 | export default function SparklesDemo() {
4 | return (
5 |
6 |
7 |
15 |
16 |
17 | Build great products
18 |
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/sparkles/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { SparklesCore } from "@/ui/sparkles";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Sparkles",
7 | component: SparklesCore,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("sparkles", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/spotlight/default.tsx:
--------------------------------------------------------------------------------
1 | import { Spotlight } from "@/ui/spotlight";
2 |
3 | export default function SpotlightDemo() {
4 | return (
5 |
6 |
7 |
8 | Spotlight
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/spotlight/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { Spotlight } from "@/ui/spotlight";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Effects/Spotlight",
7 | component: Spotlight,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("spotlight", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/starfield/default.tsx:
--------------------------------------------------------------------------------
1 | import { Starfield } from "@/ui/starfield";
2 |
3 | export default function StarfieldDemo() {
4 | return (
5 |
6 |
Starfield
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/starfield/stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from "storybook-solidjs";
2 |
3 | import { getStory } from "@/lib/storybook";
4 | import { Starfield } from "@/ui/starfield";
5 |
6 | const meta: Meta = {
7 | title: "Effects/Starfield",
8 | component: Starfield,
9 | };
10 |
11 | export default meta;
12 | type Story = StoryObj;
13 |
14 | export const Default: Story = getStory("starfield", "default");
15 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/text-reveal/default.tsx:
--------------------------------------------------------------------------------
1 | import { TextReveal } from "@/ui/text-reveal";
2 |
3 | export default function TextRevealDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/text-reveal/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { TextReveal } from "@/ui/text-reveal";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Text Reveal",
7 | component: TextReveal,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("text-reveal", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/typing-animation/default.tsx:
--------------------------------------------------------------------------------
1 | import { TypingAnimation } from "@/ui/typing-animation";
2 |
3 | export default function TypingAnimationDemo() {
4 | return (
5 |
6 |
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/typing-animation/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { TypingAnimation } from "@/ui/typing-animation";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Typing Animation",
7 | component: TypingAnimation,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("typing-animation", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/word-fade-in/default.tsx:
--------------------------------------------------------------------------------
1 | import { WordFadeIn } from "@/ui/word-fade-in";
2 |
3 | export default function WordFadeInDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/word-fade-in/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { WordFadeIn } from "@/ui/word-fade-in";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Word Fade In",
7 | component: WordFadeIn,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("word-fade-in", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/word-pullup/default.tsx:
--------------------------------------------------------------------------------
1 | import { WordPullup } from "@/ui/word-pullup";
2 |
3 | export default function LetterPullupDemo() {
4 | return (
5 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/word-pullup/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { WordPullup } from "@/ui/word-pullup";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Word Pullup",
7 | component: WordPullup,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("word-pullup", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/word-rotate/default.tsx:
--------------------------------------------------------------------------------
1 | import { WordRotate } from "@/ui/word-rotate";
2 |
3 | export default function WordRotateDemo() {
4 | return (
5 |
6 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/components/tailwind/src/stories/word-rotate/stories.tsx:
--------------------------------------------------------------------------------
1 | import { getStory } from "@/lib/storybook";
2 | import { WordRotate } from "@/ui/word-rotate";
3 | import type { Meta, StoryObj } from "storybook-solidjs";
4 |
5 | const meta: Meta = {
6 | title: "Text/Word Rotate",
7 | component: WordRotate,
8 | };
9 |
10 | export default meta;
11 | type Story = StoryObj;
12 |
13 | export const Default: Story = getStory("word-rotate", "default");
14 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/animated-gradient-text.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import type { ParentComponent } from "solid-js";
3 |
4 | export interface AnimatedGradientTextProps {
5 | class?: string;
6 | }
7 |
8 | export const AnimatedGradientText: ParentComponent<
9 | AnimatedGradientTextProps
10 | > = (props) => {
11 | return (
12 |
18 |
19 |
20 | {props.children}
21 |
22 | );
23 | };
24 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/animated-shiny-text.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import {
3 | type JSX,
4 | type ParentComponent,
5 | mergeProps,
6 | splitProps,
7 | } from "solid-js";
8 |
9 | export interface AnimatedShinyTextProps
10 | extends JSX.HTMLAttributes {
11 | shimmerWidth?: number;
12 | }
13 |
14 | export const AnimatedShinyText: ParentComponent = (
15 | props,
16 | ) => {
17 | const [_localProps, forwardProps] = splitProps(props, [
18 | "shimmerWidth",
19 | "class",
20 | "children",
21 | ]);
22 | const localProps = mergeProps({ shimmerWidth: 100 }, _localProps);
23 |
24 | return (
25 |
42 | {localProps.children}
43 |
44 | );
45 | };
46 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/blur-in.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type JSX,
3 | type ParentComponent,
4 | mergeProps,
5 | splitProps,
6 | } from "solid-js";
7 | import { Motion } from "solid-motionone";
8 |
9 | export interface BlurInProps extends JSX.HTMLAttributes {
10 | blur?: string;
11 | duration?: number;
12 | }
13 |
14 | export const BlurIn: ParentComponent = (props) => {
15 | const [_localProps, forwardProps] = splitProps(props, [
16 | "blur",
17 | "duration",
18 | "children",
19 | ]);
20 | const localProps = mergeProps({ blur: "16px", duration: 1 }, _localProps);
21 | return (
22 |
28 | {localProps.children}
29 |
30 | );
31 | };
32 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/flip-text.tsx:
--------------------------------------------------------------------------------
1 | import { Motion, type VariantDefinition } from "solid-motionone";
2 |
3 | import { cn } from "@/lib/utils";
4 | import { type Component, For, mergeProps } from "solid-js";
5 |
6 | export interface FlipTextProps {
7 | text: string;
8 | duration?: number;
9 | delayMultiple?: number;
10 | states?: {
11 | initial: VariantDefinition;
12 | animate: VariantDefinition;
13 | };
14 | class?: string;
15 | }
16 |
17 | export const FlipText: Component = (props) => {
18 | const localProps = mergeProps(
19 | {
20 | duration: 0.5,
21 | delayMultiple: 0.08,
22 | states: {
23 | initial: { rotateX: -90, opacity: 0 },
24 | animate: { rotateX: 0, opacity: 1 },
25 | },
26 | },
27 | props,
28 | );
29 |
30 | return (
31 |
32 |
33 | {(char, i) => (
34 |
42 | {char === " " ? : char}
43 |
44 | )}
45 |
46 |
47 | );
48 | };
49 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/gradual-spacing.tsx:
--------------------------------------------------------------------------------
1 | import { Motion, type Options } from "solid-motionone";
2 |
3 | import { cn } from "@/lib/utils";
4 | import { type Component, For, mergeProps } from "solid-js";
5 |
6 | export interface GradualSpacingProps {
7 | text: string;
8 | duration?: number;
9 | delayMultiple?: number;
10 | states?: {
11 | hidden: Options["exit"];
12 | visible: Options["inView"];
13 | };
14 | class?: string;
15 | }
16 |
17 | export const GradualSpacing: Component = (props) => {
18 | const localProps = mergeProps(
19 | {
20 | duration: 0.5,
21 | delayMultiple: 0.04,
22 | states: {
23 | hidden: { opacity: 0, x: -20 },
24 | visible: { opacity: 1, x: 0 },
25 | },
26 | },
27 | props,
28 | );
29 |
30 | return (
31 |
32 |
33 | {(char, i) => (
34 |
43 | {char === " " ? : char}
44 |
45 | )}
46 |
47 |
48 | );
49 | };
50 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/letter-pullup.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import { animate, inView, stagger } from "motion";
3 | import { type Component, For, mergeProps, onCleanup, onMount } from "solid-js";
4 |
5 | export interface LetterPullupProps {
6 | text: string;
7 | class?: string;
8 | delay?: number;
9 | }
10 |
11 | export const LetterPullup: Component = (props) => {
12 | const localProps = mergeProps({ delay: 0.05 }, props);
13 | let container!: HTMLDivElement;
14 |
15 | onMount(() => {
16 | const stop = inView(container, (info) => {
17 | animate(
18 | Array.from(info.target.children),
19 | {
20 | y: [100, 0],
21 | opacity: [0, 1],
22 | },
23 | {
24 | delay: stagger(localProps.delay),
25 | },
26 | );
27 | });
28 |
29 | onCleanup(() => stop());
30 | });
31 |
32 | return (
33 |
34 |
35 | {(letter, i) => (
36 |
44 | {letter === " " ? : letter}
45 |
46 | )}
47 |
48 |
49 | );
50 | };
51 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/meteors.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import {
3 | type Component,
4 | For,
5 | type JSX,
6 | createEffect,
7 | createSignal,
8 | mergeProps,
9 | } from "solid-js";
10 |
11 | export interface MeteorsProps {
12 | number?: number;
13 | }
14 | export const Meteors: Component = (props) => {
15 | const localProps = mergeProps({ number: 30 }, props);
16 | const [meteorStyles, setMeteorStyles] = createSignal<
17 | Array
18 | >([]);
19 |
20 | createEffect(() => {
21 | const styles = [...new Array(localProps.number)].map(() => ({
22 | top: "-5px",
23 | left: `${Math.floor(Math.random() * window.innerWidth)}px`,
24 | "animation-delay": `${Math.random() * 1 + 0.2}s`,
25 | "animation-duration": `${Math.floor(Math.random() * 8 + 2)}s`,
26 | }));
27 | setMeteorStyles(styles);
28 | });
29 |
30 | return (
31 |
32 | {(style) => (
33 | // Meteor Head
34 |
40 | {/* Meteor Tail */}
41 |
42 |
43 | )}
44 |
45 | );
46 | };
47 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/number-ticker.tsx:
--------------------------------------------------------------------------------
1 | import { animate, inView } from "motion";
2 | import {
3 | type Component,
4 | type JSX,
5 | mergeProps,
6 | onMount,
7 | splitProps,
8 | } from "solid-js";
9 |
10 | export interface NumberTickerProps extends JSX.HTMLAttributes {
11 | value?: number;
12 | direction?: "up" | "down";
13 | delay?: number;
14 | decimalPlaces?: number;
15 | }
16 |
17 | export const NumberTicker: Component = (props) => {
18 | const [_localProps, forwardProps] = splitProps(props, [
19 | "value",
20 | "direction",
21 | "delay",
22 | "decimalPlaces",
23 | ]);
24 | const localProps = mergeProps(
25 | { value: 100, direction: "up" as const, delay: 0, decimalPlaces: 0 },
26 | _localProps,
27 | );
28 | let ref!: HTMLSpanElement;
29 |
30 | onMount(() => {
31 | inView(ref, () => {
32 | animate(0, 1, {
33 | delay: localProps.delay,
34 | type: "spring",
35 | damping: 65,
36 | stiffness: 100,
37 | onUpdate: (progress) => {
38 | let latest = progress * localProps.value;
39 | if (localProps.direction === "down") {
40 | latest = localProps.value - latest;
41 | }
42 | ref.textContent = Intl.NumberFormat("en-US", {
43 | minimumFractionDigits: localProps.decimalPlaces,
44 | maximumFractionDigits: localProps.decimalPlaces,
45 | }).format(Number(latest.toFixed(localProps.decimalPlaces)));
46 | },
47 | });
48 | });
49 | });
50 |
51 | return ;
52 | };
53 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/orbiting-circles.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import { type ParentComponent, Show, mergeProps } from "solid-js";
3 |
4 | export interface OrbitingCirclesProps {
5 | duration?: number;
6 | delay?: number;
7 | radius?: number;
8 | path?: boolean;
9 | reverse?: boolean;
10 | class?: string;
11 | }
12 |
13 | export const OrbitingCircles: ParentComponent = (
14 | props,
15 | ) => {
16 | const localProps = mergeProps(
17 | {
18 | duration: 20,
19 | delay: 0,
20 | radius: 50,
21 | path: true,
22 | reverse: false,
23 | },
24 | props,
25 | );
26 | return (
27 | <>
28 |
29 |
43 |
44 |
58 | {props.children}
59 |
60 | >
61 | );
62 | };
63 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/retro-grid.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import { type Component, mergeProps } from "solid-js";
3 |
4 | export interface RetroGridProps {
5 | angle?: number;
6 | class?: string;
7 | }
8 |
9 | export const RetroGrid: Component = (props) => {
10 | const localProps = mergeProps({ angle: 65 }, props);
11 | return (
12 |
19 | {/* Grid */}
20 |
35 |
36 | {/* Background Gradient */}
37 |
38 |
39 | );
40 | };
41 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/spotlight.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import type { Component } from "solid-js";
3 |
4 | export interface SpotlightProps {
5 | class?: string;
6 | fill?: string;
7 | }
8 |
9 | export const Spotlight: Component = (props) => {
10 | return (
11 |
56 | );
57 | };
58 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/text-reveal.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import { scroll } from "motion";
3 | import {
4 | type Component,
5 | For,
6 | createSignal,
7 | mergeProps,
8 | onCleanup,
9 | onMount,
10 | } from "solid-js";
11 |
12 | interface TextRevealByWordProps {
13 | text: string;
14 | space?: number;
15 | class?: string;
16 | }
17 |
18 | export const TextReveal: Component = (props) => {
19 | const localProps = mergeProps({ space: 200 }, props);
20 | const words = () => localProps.text.split(" ");
21 | const [scrollY, setScrollY] = createSignal(0);
22 |
23 | let targetRef!: HTMLDivElement;
24 | onMount(() => {
25 | const cancel = scroll((progress: number) => setScrollY(progress), {
26 | target: targetRef,
27 | });
28 |
29 | onCleanup(() => cancel());
30 | });
31 |
32 | return (
33 |
40 |
41 |
42 |
43 | {(word, i) => {
44 | const opacity = () =>
45 | Math.min(1, Math.max(0.15, scrollY() * words().length - i()));
46 | return {word} ;
47 | }}
48 |
49 |
50 |
51 |
52 | );
53 | };
54 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/typing-animation.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type Component,
3 | createEffect,
4 | createSignal,
5 | mergeProps,
6 | onCleanup,
7 | } from "solid-js";
8 |
9 | export interface TypingAnimationProps {
10 | text: string;
11 | duration?: number;
12 | }
13 |
14 | export const TypingAnimation: Component = (props) => {
15 | const localProps = mergeProps({ duration: 200 }, props);
16 | const [displayedText, setDisplayedText] = createSignal("");
17 | const [i, setI] = createSignal(0);
18 |
19 | createEffect(() => {
20 | const typingEffect = setInterval(() => {
21 | if (i() < localProps.text.length) {
22 | setDisplayedText(localProps.text.substring(0, i() + 1));
23 | setI((i) => i + 1);
24 | } else {
25 | clearInterval(typingEffect);
26 | }
27 | }, localProps.duration);
28 |
29 | onCleanup(() => {
30 | clearInterval(typingEffect);
31 | });
32 | });
33 |
34 | return <>{displayedText()}>;
35 | };
36 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/word-fade-in.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import {
3 | type Component,
4 | For,
5 | type JSX,
6 | mergeProps,
7 | splitProps,
8 | } from "solid-js";
9 | import { Motion } from "solid-motionone";
10 |
11 | export interface WordFadeInProps extends JSX.HTMLAttributes {
12 | text: string;
13 | delay?: number;
14 | duration?: number;
15 | blur?: number;
16 | }
17 |
18 | export const WordFadeIn: Component = (props) => {
19 | const [_localProps, forwardProps] = splitProps(props, [
20 | "text",
21 | "delay",
22 | "duration",
23 | "blur",
24 | "class",
25 | ]);
26 | const localProps = mergeProps(
27 | {
28 | delay: 0.15,
29 | duration: 1,
30 | blur: 8,
31 | },
32 | _localProps,
33 | );
34 |
35 | return (
36 |
37 |
38 | {(word, i) => (
39 |
48 | {word}
49 |
50 | )}
51 |
52 |
53 | );
54 | };
55 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/word-pullup.tsx:
--------------------------------------------------------------------------------
1 | import { Motion } from "solid-motionone";
2 |
3 | import { cn } from "@/lib/utils";
4 | import { type Component, For, mergeProps } from "solid-js";
5 |
6 | export interface WordPullupProps {
7 | text: string;
8 | class?: string;
9 | delay?: number;
10 | }
11 |
12 | export const WordPullup: Component = (props) => {
13 | const localProps = mergeProps({ delay: 0.2 }, props);
14 |
15 | return (
16 |
17 |
18 | {(letter, i) => (
19 |
27 | {letter}
28 |
29 | )}
30 |
31 |
32 | );
33 | };
34 |
--------------------------------------------------------------------------------
/components/tailwind/src/ui/word-rotate.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | type Component,
3 | type JSX,
4 | Show,
5 | createEffect,
6 | createSignal,
7 | mergeProps,
8 | onCleanup,
9 | splitProps,
10 | } from "solid-js";
11 | import { Motion, type MotionComponentProps, Presence } from "solid-motionone";
12 |
13 | export interface WordRotateProps
14 | extends JSX.HTMLAttributes,
15 | Omit {
16 | words: string[];
17 | duration?: number;
18 | }
19 |
20 | export const WordRotate: Component = (props) => {
21 | const [_localProps, forwardProps] = splitProps(props, ["words", "duration"]);
22 | const localProps = mergeProps(
23 | {
24 | duration: 2500,
25 | },
26 | _localProps,
27 | );
28 |
29 | const [index, setIndex] = createSignal(0);
30 |
31 | createEffect(() => {
32 | const interval = setInterval(() => {
33 | setIndex((prevIndex) => (prevIndex + 1) % localProps.words.length);
34 | }, localProps.duration);
35 |
36 | onCleanup(() => clearInterval(interval));
37 | });
38 |
39 | return (
40 |
41 |
42 |
49 | {localProps.words[index()]}
50 |
51 |
52 |
53 | );
54 | };
55 |
--------------------------------------------------------------------------------
/components/tailwind/tailwind.config.js:
--------------------------------------------------------------------------------
1 | import { tailwindConfig as mysticConfig } from "@mystic-ui/registry/src/tailwind";
2 | import { merge } from "ts-deepmerge";
3 |
4 |
5 | /** @type {import('tailwindcss').Config} */
6 | const config = {
7 | darkMode: "class",
8 | content: ["./src/**/*.{tsx,ts,jsx,js}"],
9 | theme: {
10 | extend: {},
11 | },
12 | plugins: [],
13 | };
14 |
15 | export default merge(mysticConfig(), config);
16 |
--------------------------------------------------------------------------------
/components/tailwind/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | // Enable latest features
4 | "lib": ["ESNext", "DOM"],
5 | "target": "ESNext",
6 | "module": "ESNext",
7 | "moduleDetection": "force",
8 | "jsx": "preserve",
9 | "jsxImportSource": "solid-js",
10 | "allowJs": true,
11 |
12 | // Bundler mode
13 | "moduleResolution": "bundler",
14 | "allowImportingTsExtensions": true,
15 | "verbatimModuleSyntax": true,
16 | "noEmit": true,
17 |
18 | // Best practices
19 | "strict": true,
20 | "skipLibCheck": true,
21 | "noFallthroughCasesInSwitch": true,
22 |
23 | // Some stricter flags (disabled by default)
24 | "noUnusedLocals": false,
25 | "noUnusedParameters": false,
26 | "noPropertyAccessFromIndexSignature": false,
27 |
28 | "baseUrl": ".",
29 | "paths": {
30 | "@/*": ["./src/*"]
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mystic-ui",
3 | "description": "Monorepo for Mystic UI",
4 | "version": "0.0.1",
5 | "workspaces": ["components/*", "packages/*", "website"],
6 | "type": "module",
7 | "scripts": {
8 | "check": "bun --filter '*' check"
9 | },
10 | "devDependencies": {
11 | "@types/bun": "latest"
12 | },
13 | "peerDependencies": {
14 | "typescript": "^5.3.3"
15 | },
16 | "author": {
17 | "name": "Mudit Somani",
18 | "email": "mudit.somani00@gmail.com",
19 | "url": "https://thecomputerm.dev/"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/cli/README.md:
--------------------------------------------------------------------------------
1 | # mystic-ui CLI
2 |
3 | Start a project:
4 |
5 | ```bash
6 | mystic-ui init
7 | ```
8 |
9 | Add components to your project:
10 |
11 | ```bash
12 | mystic-ui add word-rotate
13 | ```
--------------------------------------------------------------------------------
/packages/cli/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "extends": ["../../biome.json"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/cli/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@mystic-ui/cli",
3 | "version": "0.0.0-1",
4 | "description": "A CLI for adding beautiful mystic components to your SolidJS apps.",
5 | "type": "module",
6 | "module": "dist/index.js",
7 | "bin": {
8 | "mystic-ui": "./dist/index.js"
9 | },
10 | "files": ["/dist"],
11 | "scripts": {
12 | "build": "bun build ./src/index.ts --outdir ./dist --target node --minify",
13 | "version": "bun run ./scripts/bump.ts && git add ./src/version.ts && bun run build",
14 | "start": "bun --bun run ./src/index.ts",
15 | "format": "biome format src",
16 | "lint": "biome lint src",
17 | "check": "biome check src"
18 | },
19 | "devDependencies": {
20 | "@biomejs/biome": "1.9.4",
21 | "@clack/prompts": "^0.7.0",
22 | "@types/bun": "latest",
23 | "commander": "^12.1.0",
24 | "cosmiconfig": "^9.0.0",
25 | "magicast": "^0.3.5",
26 | "nypm": "^0.3.12",
27 | "ts-deepmerge": "^7.0.1",
28 | "zod": "^3.23.8"
29 | },
30 | "peerDependencies": {
31 | "typescript": "^5.3.3"
32 | },
33 | "publishConfig": {
34 | "access": "public",
35 | "tag": "latest"
36 | },
37 | "author": {
38 | "name": "Mudit Somani",
39 | "email": "mudit.somani00@gmail.com",
40 | "url": "https://thecomputerm.dev/"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/packages/cli/scripts/bump.ts:
--------------------------------------------------------------------------------
1 | const packageJson = await Bun.file("package.json").json();
2 | const newVersion = packageJson.version;
3 | await Bun.write("./src/version.ts", `export default "${newVersion}";\n`);
4 |
--------------------------------------------------------------------------------
/packages/cli/src/index.ts:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env node
2 |
3 | import { Command } from "commander";
4 | import addComponentCommand from "./commands/components";
5 | import initCommand from "./commands/init";
6 | import VERSION from "./version";
7 |
8 | export const program = new Command();
9 |
10 | program
11 | .name("mystic-ui")
12 | .description("CLI to add mystic components to your project")
13 | .version(VERSION)
14 | .showHelpAfterError("(add --help for additional information)");
15 |
16 | program
17 | .command("init")
18 | .description("Configures your project to work with mystic components")
19 | .action(initCommand);
20 |
21 | program
22 | .command("add")
23 | .description("Add a component to your project")
24 | .argument("", "name of component to add")
25 | .action(addComponentCommand);
26 |
27 | await program.parseAsync(process.argv);
28 |
--------------------------------------------------------------------------------
/packages/cli/src/version.ts:
--------------------------------------------------------------------------------
1 | export default "0.0.0-1";
2 |
--------------------------------------------------------------------------------
/packages/cli/tests/utils.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, expect, test } from "bun:test";
2 | import { configSchema } from "../src/utils";
3 |
4 | describe("validate schema", () => {
5 | test("panda", () => {
6 | expect(() =>
7 | configSchema.parse({
8 | framework: "panda",
9 | outputPath: "./src/components/mystic-ui/",
10 | configPath: "panda.config.ts",
11 | }),
12 | ).not.toThrowError();
13 | });
14 |
15 | test("tailwind", () => {
16 | expect(() =>
17 | configSchema.parse({
18 | framework: "tailwind",
19 | outputPath: "./src/components/mystic-ui/",
20 | configPath: "tailwind.config.js",
21 | }),
22 | ).toThrowError();
23 |
24 | expect(() =>
25 | configSchema.parse({
26 | framework: "tailwind",
27 | outputPath: "./src/components/mystic-ui/",
28 | configPath: "tailwind.config.js",
29 | tailwind: {
30 | aliases: {
31 | utils: "@/lib/utils",
32 | },
33 | },
34 | }),
35 | ).not.toThrowError();
36 | });
37 | });
38 |
--------------------------------------------------------------------------------
/packages/cli/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | // Enable latest features
4 | "lib": ["ESNext", "DOM"],
5 | "target": "ESNext",
6 | "module": "ESNext",
7 | "moduleDetection": "force",
8 | "jsx": "preserve",
9 | "jsxImportSource": "solid-js",
10 | "allowJs": true,
11 |
12 | // Bundler mode
13 | "moduleResolution": "bundler",
14 | "allowImportingTsExtensions": true,
15 | "verbatimModuleSyntax": true,
16 | "noEmit": true,
17 |
18 | // Best practices
19 | "strict": true,
20 | "skipLibCheck": true,
21 | "noFallthroughCasesInSwitch": true,
22 |
23 | // Some stricter flags (disabled by default)
24 | "noUnusedLocals": false,
25 | "noUnusedParameters": false,
26 | "noPropertyAccessFromIndexSignature": false
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/packages/registry/README.md:
--------------------------------------------------------------------------------
1 | # Mystic UI Registry
2 |
3 | Used to build and store the json registry files which are used by the Mystic UI cli to add components to your project.
--------------------------------------------------------------------------------
/packages/registry/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "extends": ["../../biome.json"]
4 | }
5 |
--------------------------------------------------------------------------------
/packages/registry/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@mystic-ui/registry",
3 | "private": true,
4 | "type": "module",
5 | "scripts": {
6 | "registry": "bun run src/build.ts",
7 | "format": "biome format src",
8 | "lint": "biome lint src",
9 | "check": "biome check src"
10 | },
11 | "devDependencies": {
12 | "@biomejs/biome": "1.9.4",
13 | "@types/bun": "latest"
14 | },
15 | "peerDependencies": {
16 | "typescript": "^5.3.3"
17 | },
18 | "dependencies": {
19 | "ts-deepmerge": "^7.0.1"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/registry/panda/flip-text.json:
--------------------------------------------------------------------------------
1 | {"id":"flip-text","dependencies":["solid-motionone"],"content":"import { css, cx } from \"styled-system/css\";\n\nimport { Motion, type VariantDefinition } from \"solid-motionone\";\n\nimport { type Component, For, mergeProps } from \"solid-js\";\n\nexport interface FlipTextProps {\n\ttext: string;\n\tduration?: number;\n\tdelayMultiple?: number;\n\tstates?: {\n\t\tinitial: VariantDefinition;\n\t\tanimate: VariantDefinition;\n\t};\n\tclass?: string;\n}\n\nexport const FlipText: Component = (props) => {\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tduration: 0.5,\n\t\t\tdelayMultiple: 0.08,\n\t\t\tstates: {\n\t\t\t\tinitial: { rotateX: -90, opacity: 0 },\n\t\t\t\tanimate: { rotateX: 0, opacity: 1 },\n\t\t\t},\n\t\t},\n\t\tprops,\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(char, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{char === \" \" ? : char}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/gradual-spacing.json:
--------------------------------------------------------------------------------
1 | {"id":"gradual-spacing","dependencies":["solid-motionone"],"content":"import { css, cx } from \"styled-system/css\";\n\nimport { Motion, type Options } from \"solid-motionone\";\n\nimport { type Component, For, mergeProps } from \"solid-js\";\n\nexport interface GradualSpacingProps {\n\ttext: string;\n\tduration?: number;\n\tdelayMultiple?: number;\n\tstates?: {\n\t\thidden: Options[\"exit\"];\n\t\tvisible: Options[\"inView\"];\n\t};\n\tclass?: string;\n}\n\nexport const GradualSpacing: Component = (props) => {\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tduration: 0.5,\n\t\t\tdelayMultiple: 0.04,\n\t\t\tstates: {\n\t\t\t\thidden: { opacity: 0, x: -20 },\n\t\t\t\tvisible: { opacity: 1, x: 0 },\n\t\t\t},\n\t\t},\n\t\tprops,\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(char, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{char === \" \" ? : char}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/letter-pullup.json:
--------------------------------------------------------------------------------
1 | {"id":"letter-pullup","dependencies":["motion"],"content":"import { css, cx } from \"styled-system/css\";\n\nimport { animate, inView, stagger } from \"motion\";\nimport { type Component, For, mergeProps, onCleanup, onMount } from \"solid-js\";\n\nexport interface LetterPullupProps {\n\ttext: string;\n\tclass?: string;\n\tdelay?: number;\n}\n\nexport const LetterPullup: Component = (props) => {\n\tconst localProps = mergeProps({ delay: 0.05 }, props);\n\tlet container!: HTMLDivElement;\n\n\tonMount(() => {\n\t\tconst stop = inView(container, (info) => {\n\t\t\tanimate(\n\t\t\t\tArray.from(info.target.children),\n\t\t\t\t{\n\t\t\t\t\ty: [100, 0],\n\t\t\t\t\topacity: [0, 1],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdelay: stagger(localProps.delay),\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\tonCleanup(() => stop());\n\t});\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t{(letter, i) => (\n\t\t\t\t\t{letter === \" \" ? : letter}
\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/number-ticker.json:
--------------------------------------------------------------------------------
1 | {"id":"number-ticker","dependencies":["motion"],"content":"import { animate, inView } from \"motion\";\nimport {\n\ttype Component,\n\ttype JSX,\n\tmergeProps,\n\tonMount,\n\tsplitProps,\n} from \"solid-js\";\n\nexport interface NumberTickerProps extends JSX.HTMLAttributes {\n\tvalue?: number;\n\tdirection?: \"up\" | \"down\";\n\tdelay?: number;\n\tdecimalPlaces?: number;\n}\n\nexport const NumberTicker: Component = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\n\t\t\"value\",\n\t\t\"direction\",\n\t\t\"delay\",\n\t\t\"decimalPlaces\",\n\t]);\n\tconst localProps = mergeProps(\n\t\t{ value: 100, direction: \"up\" as const, delay: 0, decimalPlaces: 0 },\n\t\t_localProps,\n\t);\n\tlet ref!: HTMLSpanElement;\n\n\tonMount(() => {\n\t\tinView(ref, () => {\n\t\t\tanimate(0, 1, {\n\t\t\t\tdelay: localProps.delay,\n\t\t\t\ttype: \"spring\",\n\t\t\t\tdamping: 65,\n\t\t\t\tstiffness: 100,\n\t\t\t\tonUpdate: (progress) => {\n\t\t\t\t\tlet latest = progress * localProps.value;\n\t\t\t\t\tif (localProps.direction === \"down\") {\n\t\t\t\t\t\tlatest = localProps.value - latest;\n\t\t\t\t\t}\n\t\t\t\t\tref.textContent = Intl.NumberFormat(\"en-US\", {\n\t\t\t\t\t\tminimumFractionDigits: localProps.decimalPlaces,\n\t\t\t\t\t\tmaximumFractionDigits: localProps.decimalPlaces,\n\t\t\t\t\t}).format(Number(latest.toFixed(localProps.decimalPlaces)));\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t});\n\n\treturn ;\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/typing-animation.json:
--------------------------------------------------------------------------------
1 | {"id":"typing-animation","content":"import {\n\ttype Component,\n\tcreateEffect,\n\tcreateSignal,\n\tmergeProps,\n\tonCleanup,\n} from \"solid-js\";\n\nexport interface TypingAnimationProps {\n\ttext: string;\n\tduration?: number;\n}\n\nexport const TypingAnimation: Component = (props) => {\n\tconst localProps = mergeProps({ duration: 200 }, props);\n\tconst [displayedText, setDisplayedText] = createSignal(\"\");\n\tconst [i, setI] = createSignal(0);\n\n\tcreateEffect(() => {\n\t\tconst typingEffect = setInterval(() => {\n\t\t\tif (i() < localProps.text.length) {\n\t\t\t\tsetDisplayedText(localProps.text.substring(0, i() + 1));\n\t\t\t\tsetI((i) => i + 1);\n\t\t\t} else {\n\t\t\t\tclearInterval(typingEffect);\n\t\t\t}\n\t\t}, localProps.duration);\n\n\t\tonCleanup(() => {\n\t\t\tclearInterval(typingEffect);\n\t\t});\n\t});\n\n\treturn <>{displayedText()}>;\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/word-fade-in.json:
--------------------------------------------------------------------------------
1 | {"id":"word-fade-in","dependencies":["solid-motionone"],"content":"import {\n\ttype Component,\n\tFor,\n\ttype JSX,\n\tmergeProps,\n\tsplitProps,\n} from \"solid-js\";\nimport { Motion } from \"solid-motionone\";\nimport { css, cx } from \"styled-system/css\";\n\nexport interface WordFadeInProps extends JSX.HTMLAttributes {\n\ttext: string;\n\tdelay?: number;\n\tduration?: number;\n\tblur?: number;\n}\n\nexport const WordFadeIn: Component = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\n\t\t\"text\",\n\t\t\"delay\",\n\t\t\"duration\",\n\t\t\"blur\",\n\t\t\"class\",\n\t]);\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tdelay: 0.15,\n\t\t\tduration: 1,\n\t\t\tblur: 8,\n\t\t},\n\t\t_localProps,\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(word, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{word} \n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/word-pullup.json:
--------------------------------------------------------------------------------
1 | {"id":"word-pullup","dependencies":["solid-motionone"],"content":"import { css, cx } from \"styled-system/css\";\n\nimport { type Component, For, mergeProps } from \"solid-js\";\nimport { Motion } from \"solid-motionone\";\n\nexport interface WordPullupProps {\n\ttext: string;\n\tclass?: string;\n\tdelay?: number;\n}\n\nexport const WordPullup: Component = (props) => {\n\tconst localProps = mergeProps({ delay: 0.2 }, props);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(letter, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{letter} \n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/panda/word-rotate.json:
--------------------------------------------------------------------------------
1 | {"id":"word-rotate","dependencies":["solid-motionone"],"content":"import {\n\ttype Component,\n\ttype JSX,\n\tShow,\n\tcreateEffect,\n\tcreateSignal,\n\tmergeProps,\n\tonCleanup,\n\tsplitProps,\n} from \"solid-js\";\nimport { Motion, type MotionComponentProps, Presence } from \"solid-motionone\";\n\nexport interface WordRotateProps\n\textends JSX.HTMLAttributes,\n\t\tOmit {\n\twords: string[];\n\tduration?: number;\n}\n\nexport const WordRotate: Component = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\"words\", \"duration\"]);\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tduration: 2500,\n\t\t},\n\t\t_localProps,\n\t);\n\n\tconst [index, setIndex] = createSignal(0);\n\n\tcreateEffect(() => {\n\t\tconst interval = setInterval(() => {\n\t\t\tsetIndex((prevIndex) => (prevIndex + 1) % localProps.words.length);\n\t\t}, localProps.duration);\n\n\t\tonCleanup(() => clearInterval(interval));\n\t});\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{localProps.words[index()]}\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/src/panda.ts:
--------------------------------------------------------------------------------
1 | import { defineTokens } from "@pandacss/dev";
2 | import type { ExtendableTheme } from "@pandacss/types";
3 | import { merge } from "ts-deepmerge";
4 | import config from "./extend-config";
5 |
6 | export function componentPandaConfig(component: string) {
7 | if (!(component in config)) {
8 | return undefined;
9 | }
10 |
11 | const extend = config[component];
12 |
13 | return {
14 | theme: {
15 | extend: {
16 | tokens: {
17 | animations: extend.animation
18 | ? defineTokens.animations(
19 | Object.fromEntries(
20 | Object.entries(extend.animation).map(([key, value]) => [
21 | key,
22 | { value },
23 | ]),
24 | ),
25 | )
26 | : undefined,
27 | },
28 | keyframes: extend.keyframes,
29 | },
30 | },
31 | } satisfies {
32 | theme: ExtendableTheme;
33 | };
34 | }
35 |
36 | export function pandaConfig() {
37 | const configs = Object.keys(config)
38 | .map((component) => componentPandaConfig(component))
39 | .filter((x) => x !== undefined);
40 | return merge(...configs);
41 | }
42 |
--------------------------------------------------------------------------------
/packages/registry/src/schema.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const registryEntrySchema = z.object({
4 | id: z.string(),
5 | dependencies: z.string().array().min(1).optional(),
6 | config: z.any(),
7 | content: z.string(),
8 | });
9 |
10 | export type RegistryEntry = z.infer;
11 |
--------------------------------------------------------------------------------
/packages/registry/src/tailwind.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss/types";
2 | import { merge } from "ts-deepmerge";
3 | import config from "./extend-config";
4 |
5 | export function componentTailwindConfig(component: string) {
6 | if (!(component in config)) {
7 | return undefined;
8 | }
9 |
10 | const extend = config[component];
11 |
12 | return {
13 | theme: {
14 | extend,
15 | },
16 | } as Config;
17 | }
18 |
19 | export function tailwindConfig() {
20 | const configs = Object.keys(config)
21 | .map((component) => componentTailwindConfig(component))
22 | .filter((x) => x !== undefined);
23 | return merge(...configs);
24 | }
25 |
--------------------------------------------------------------------------------
/packages/registry/src/utils.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Returns an array of npm dependencies from a component file
3 | * @param content component file
4 | * @returns array of npm deps
5 | */
6 | export function extractDependencies(content: string) {
7 | // adapted from shadcn
8 | const npmDependencies = [];
9 | const importRegex = /from\s+['"]([^'"]+)['"]/g;
10 |
11 | const matches = content.matchAll(importRegex);
12 |
13 | for (const match of matches) {
14 | const dependency = match[1];
15 | // Check if dependency is not a relative or alias import
16 | if (!dependency.startsWith(".") && !dependency.startsWith("@/")) {
17 | // Split the dependency name on '/'
18 | const parts = dependency.split("/");
19 | // Check for scoped package or normal package with optional sub-package
20 | const isValidDependency =
21 | parts.length === 2
22 | ? parts[0].startsWith("@") && parts[1].length > 0
23 | : parts.length === 1;
24 | // Exclude 'solid', but include their sub-packages
25 | if (isValidDependency && !(dependency === "solid-js")) {
26 | npmDependencies.push(dependency);
27 | }
28 | }
29 | }
30 |
31 | return npmDependencies.length ? npmDependencies.sort() : undefined;
32 | }
33 |
--------------------------------------------------------------------------------
/packages/registry/tailwind/animated-gradient-text.json:
--------------------------------------------------------------------------------
1 | {"id":"animated-gradient-text","content":"import { cn } from \"@/lib/utils\";\nimport type { ParentComponent } from \"solid-js\";\n\nexport interface AnimatedGradientTextProps {\n\tclass?: string;\n}\n\nexport const AnimatedGradientText: ParentComponent<\n\tAnimatedGradientTextProps\n> = (props) => {\n\treturn (\n\t\t\n\t\t\t
\n\n\t\t\t{props.children}\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/animated-shiny-text.json:
--------------------------------------------------------------------------------
1 | {"id":"animated-shiny-text","config":{"theme":{"extend":{"animation":{"shiny-text":"shiny-text 8s infinite"},"keyframes":{"shiny-text":{"0%, 90%, 100%":{"backgroundPosition":"calc(-100% - var(--shiny-width)) 0"},"30%, 60%":{"backgroundPosition":"calc(100% + var(--shiny-width)) 0"}}}}}},"content":"import { cn } from \"@/lib/utils\";\nimport {\n\ttype JSX,\n\ttype ParentComponent,\n\tmergeProps,\n\tsplitProps,\n} from \"solid-js\";\n\nexport interface AnimatedShinyTextProps\n\textends JSX.HTMLAttributes {\n\tshimmerWidth?: number;\n}\n\nexport const AnimatedShinyText: ParentComponent = (\n\tprops,\n) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\n\t\t\"shimmerWidth\",\n\t\t\"class\",\n\t\t\"children\",\n\t]);\n\tconst localProps = mergeProps({ shimmerWidth: 100 }, _localProps);\n\n\treturn (\n\t\t\n\t\t\t{localProps.children}\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/blur-in.json:
--------------------------------------------------------------------------------
1 | {"id":"blur-in","dependencies":["solid-motionone"],"content":"import {\n\ttype JSX,\n\ttype ParentComponent,\n\tmergeProps,\n\tsplitProps,\n} from \"solid-js\";\nimport { Motion } from \"solid-motionone\";\n\nexport interface BlurInProps extends JSX.HTMLAttributes {\n\tblur?: string;\n\tduration?: number;\n}\n\nexport const BlurIn: ParentComponent = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\n\t\t\"blur\",\n\t\t\"duration\",\n\t\t\"children\",\n\t]);\n\tconst localProps = mergeProps({ blur: \"16px\", duration: 1 }, _localProps);\n\treturn (\n\t\t\n\t\t\t{localProps.children}\n\t\t\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/flip-text.json:
--------------------------------------------------------------------------------
1 | {"id":"flip-text","dependencies":["solid-motionone"],"content":"import { Motion, type VariantDefinition } from \"solid-motionone\";\n\nimport { cn } from \"@/lib/utils\";\nimport { type Component, For, mergeProps } from \"solid-js\";\n\nexport interface FlipTextProps {\n\ttext: string;\n\tduration?: number;\n\tdelayMultiple?: number;\n\tstates?: {\n\t\tinitial: VariantDefinition;\n\t\tanimate: VariantDefinition;\n\t};\n\tclass?: string;\n}\n\nexport const FlipText: Component = (props) => {\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tduration: 0.5,\n\t\t\tdelayMultiple: 0.08,\n\t\t\tstates: {\n\t\t\t\tinitial: { rotateX: -90, opacity: 0 },\n\t\t\t\tanimate: { rotateX: 0, opacity: 1 },\n\t\t\t},\n\t\t},\n\t\tprops,\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(char, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{char === \" \" ? : char}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/gradual-spacing.json:
--------------------------------------------------------------------------------
1 | {"id":"gradual-spacing","dependencies":["solid-motionone"],"content":"import { Motion, type Options } from \"solid-motionone\";\n\nimport { cn } from \"@/lib/utils\";\nimport { type Component, For, mergeProps } from \"solid-js\";\n\nexport interface GradualSpacingProps {\n\ttext: string;\n\tduration?: number;\n\tdelayMultiple?: number;\n\tstates?: {\n\t\thidden: Options[\"exit\"];\n\t\tvisible: Options[\"inView\"];\n\t};\n\tclass?: string;\n}\n\nexport const GradualSpacing: Component = (props) => {\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tduration: 0.5,\n\t\t\tdelayMultiple: 0.04,\n\t\t\tstates: {\n\t\t\t\thidden: { opacity: 0, x: -20 },\n\t\t\t\tvisible: { opacity: 1, x: 0 },\n\t\t\t},\n\t\t},\n\t\tprops,\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(char, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{char === \" \" ? : char}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/letter-pullup.json:
--------------------------------------------------------------------------------
1 | {"id":"letter-pullup","dependencies":["motion"],"content":"import { cn } from \"@/lib/utils\";\nimport { animate, inView, stagger } from \"motion\";\nimport { type Component, For, mergeProps, onCleanup, onMount } from \"solid-js\";\n\nexport interface LetterPullupProps {\n\ttext: string;\n\tclass?: string;\n\tdelay?: number;\n}\n\nexport const LetterPullup: Component = (props) => {\n\tconst localProps = mergeProps({ delay: 0.05 }, props);\n\tlet container!: HTMLDivElement;\n\n\tonMount(() => {\n\t\tconst stop = inView(container, (info) => {\n\t\t\tanimate(\n\t\t\t\tArray.from(info.target.children),\n\t\t\t\t{\n\t\t\t\t\ty: [100, 0],\n\t\t\t\t\topacity: [0, 1],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdelay: stagger(localProps.delay),\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\tonCleanup(() => stop());\n\t});\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t{(letter, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{letter === \" \" ? : letter}\n\t\t\t\t\t
\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/number-ticker.json:
--------------------------------------------------------------------------------
1 | {"id":"number-ticker","dependencies":["motion"],"content":"import { animate, inView } from \"motion\";\nimport {\n\ttype Component,\n\ttype JSX,\n\tmergeProps,\n\tonMount,\n\tsplitProps,\n} from \"solid-js\";\n\nexport interface NumberTickerProps extends JSX.HTMLAttributes {\n\tvalue?: number;\n\tdirection?: \"up\" | \"down\";\n\tdelay?: number;\n\tdecimalPlaces?: number;\n}\n\nexport const NumberTicker: Component = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\n\t\t\"value\",\n\t\t\"direction\",\n\t\t\"delay\",\n\t\t\"decimalPlaces\",\n\t]);\n\tconst localProps = mergeProps(\n\t\t{ value: 100, direction: \"up\" as const, delay: 0, decimalPlaces: 0 },\n\t\t_localProps,\n\t);\n\tlet ref!: HTMLSpanElement;\n\n\tonMount(() => {\n\t\tinView(ref, () => {\n\t\t\tanimate(0, 1, {\n\t\t\t\tdelay: localProps.delay,\n\t\t\t\ttype: \"spring\",\n\t\t\t\tdamping: 65,\n\t\t\t\tstiffness: 100,\n\t\t\t\tonUpdate: (progress) => {\n\t\t\t\t\tlet latest = progress * localProps.value;\n\t\t\t\t\tif (localProps.direction === \"down\") {\n\t\t\t\t\t\tlatest = localProps.value - latest;\n\t\t\t\t\t}\n\t\t\t\t\tref.textContent = Intl.NumberFormat(\"en-US\", {\n\t\t\t\t\t\tminimumFractionDigits: localProps.decimalPlaces,\n\t\t\t\t\t\tmaximumFractionDigits: localProps.decimalPlaces,\n\t\t\t\t\t}).format(Number(latest.toFixed(localProps.decimalPlaces)));\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t});\n\n\treturn ;\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/text-reveal.json:
--------------------------------------------------------------------------------
1 | {"id":"text-reveal","dependencies":["motion"],"content":"import { cn } from \"@/lib/utils\";\nimport { scroll } from \"motion\";\nimport {\n\ttype Component,\n\tFor,\n\tcreateSignal,\n\tmergeProps,\n\tonCleanup,\n\tonMount,\n} from \"solid-js\";\n\ninterface TextRevealByWordProps {\n\ttext: string;\n\tspace?: number;\n\tclass?: string;\n}\n\nexport const TextReveal: Component = (props) => {\n\tconst localProps = mergeProps({ space: 200 }, props);\n\tconst words = () => localProps.text.split(\" \");\n\tconst [scrollY, setScrollY] = createSignal(0);\n\n\tlet targetRef!: HTMLDivElement;\n\tonMount(() => {\n\t\tconst cancel = scroll((progress: number) => setScrollY(progress), {\n\t\t\ttarget: targetRef,\n\t\t});\n\n\t\tonCleanup(() => cancel());\n\t});\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{(word, i) => {\n\t\t\t\t\t\t\tconst opacity = () =>\n\t\t\t\t\t\t\t\tMath.min(1, Math.max(0.15, scrollY() * words().length - i()));\n\t\t\t\t\t\t\treturn {word} ;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/typing-animation.json:
--------------------------------------------------------------------------------
1 | {"id":"typing-animation","content":"import {\n\ttype Component,\n\tcreateEffect,\n\tcreateSignal,\n\tmergeProps,\n\tonCleanup,\n} from \"solid-js\";\n\nexport interface TypingAnimationProps {\n\ttext: string;\n\tduration?: number;\n}\n\nexport const TypingAnimation: Component = (props) => {\n\tconst localProps = mergeProps({ duration: 200 }, props);\n\tconst [displayedText, setDisplayedText] = createSignal(\"\");\n\tconst [i, setI] = createSignal(0);\n\n\tcreateEffect(() => {\n\t\tconst typingEffect = setInterval(() => {\n\t\t\tif (i() < localProps.text.length) {\n\t\t\t\tsetDisplayedText(localProps.text.substring(0, i() + 1));\n\t\t\t\tsetI((i) => i + 1);\n\t\t\t} else {\n\t\t\t\tclearInterval(typingEffect);\n\t\t\t}\n\t\t}, localProps.duration);\n\n\t\tonCleanup(() => {\n\t\t\tclearInterval(typingEffect);\n\t\t});\n\t});\n\n\treturn <>{displayedText()}>;\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/word-fade-in.json:
--------------------------------------------------------------------------------
1 | {"id":"word-fade-in","dependencies":["solid-motionone"],"content":"import { cn } from \"@/lib/utils\";\nimport {\n\ttype Component,\n\tFor,\n\ttype JSX,\n\tmergeProps,\n\tsplitProps,\n} from \"solid-js\";\nimport { Motion } from \"solid-motionone\";\n\nexport interface WordFadeInProps extends JSX.HTMLAttributes {\n\ttext: string;\n\tdelay?: number;\n\tduration?: number;\n\tblur?: number;\n}\n\nexport const WordFadeIn: Component = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\n\t\t\"text\",\n\t\t\"delay\",\n\t\t\"duration\",\n\t\t\"blur\",\n\t\t\"class\",\n\t]);\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tdelay: 0.15,\n\t\t\tduration: 1,\n\t\t\tblur: 8,\n\t\t},\n\t\t_localProps,\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(word, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{word} \n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/word-pullup.json:
--------------------------------------------------------------------------------
1 | {"id":"word-pullup","dependencies":["solid-motionone"],"content":"import { Motion } from \"solid-motionone\";\n\nimport { cn } from \"@/lib/utils\";\nimport { type Component, For, mergeProps } from \"solid-js\";\n\nexport interface WordPullupProps {\n\ttext: string;\n\tclass?: string;\n\tdelay?: number;\n}\n\nexport const WordPullup: Component = (props) => {\n\tconst localProps = mergeProps({ delay: 0.2 }, props);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{(letter, i) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{letter} \n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tailwind/word-rotate.json:
--------------------------------------------------------------------------------
1 | {"id":"word-rotate","dependencies":["solid-motionone"],"content":"import {\n\ttype Component,\n\ttype JSX,\n\tShow,\n\tcreateEffect,\n\tcreateSignal,\n\tmergeProps,\n\tonCleanup,\n\tsplitProps,\n} from \"solid-js\";\nimport { Motion, type MotionComponentProps, Presence } from \"solid-motionone\";\n\nexport interface WordRotateProps\n\textends JSX.HTMLAttributes,\n\t\tOmit {\n\twords: string[];\n\tduration?: number;\n}\n\nexport const WordRotate: Component = (props) => {\n\tconst [_localProps, forwardProps] = splitProps(props, [\"words\", \"duration\"]);\n\tconst localProps = mergeProps(\n\t\t{\n\t\t\tduration: 2500,\n\t\t},\n\t\t_localProps,\n\t);\n\n\tconst [index, setIndex] = createSignal(0);\n\n\tcreateEffect(() => {\n\t\tconst interval = setInterval(() => {\n\t\t\tsetIndex((prevIndex) => (prevIndex + 1) % localProps.words.length);\n\t\t}, localProps.duration);\n\n\t\tonCleanup(() => clearInterval(interval));\n\t});\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{localProps.words[index()]}\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n"}
--------------------------------------------------------------------------------
/packages/registry/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | // Enable latest features
4 | "lib": ["ESNext", "DOM"],
5 | "target": "ESNext",
6 | "module": "ESNext",
7 | "moduleDetection": "force",
8 | "jsx": "preserve",
9 | "jsxImportSource": "solid-js",
10 | "allowJs": true,
11 |
12 | // Bundler mode
13 | "moduleResolution": "bundler",
14 | "allowImportingTsExtensions": true,
15 | "verbatimModuleSyntax": true,
16 | "noEmit": true,
17 |
18 | // Best practices
19 | "strict": true,
20 | "skipLibCheck": true,
21 | "noFallthroughCasesInSwitch": true,
22 |
23 | // Some stricter flags (disabled by default)
24 | "noUnusedLocals": false,
25 | "noUnusedParameters": false,
26 | "noPropertyAccessFromIndexSignature": false,
27 |
28 | "paths": {
29 | "@/*": ["./src/*"]
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/templates/vite-panda/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | ## Panda
27 | styled-system
28 | styled-system-studio
--------------------------------------------------------------------------------
/templates/vite-panda/README.md:
--------------------------------------------------------------------------------
1 | ## Usage
2 |
3 | ```bash
4 | $ npm install # or pnpm install or yarn install
5 | ```
6 |
7 | ### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs)
8 |
9 | ## Available Scripts
10 |
11 | In the project directory, you can run:
12 |
13 | ### `npm run dev`
14 |
15 | Runs the app in the development mode.
16 | Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
17 |
18 | ### `npm run build`
19 |
20 | Builds the app for production to the `dist` folder.
21 | It correctly bundles Solid in production mode and optimizes the build for the best performance.
22 |
23 | The build is minified and the filenames include the hashes.
24 | Your app is ready to be deployed!
25 |
26 | ## Deployment
27 |
28 | Learn more about deploying your application with the [documentations](https://vite.dev/guide/static-deploy.html)
29 |
--------------------------------------------------------------------------------
/templates/vite-panda/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheComputerM/mystic-ui/c7b3f1e9150c0474d8a5e62f807c8312e0e4b17f/templates/vite-panda/bun.lockb
--------------------------------------------------------------------------------
/templates/vite-panda/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + Solid + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/templates/vite-panda/mystic.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "framework": "panda",
3 | "configPath": "panda.config.ts",
4 | "outputPath": "./src/components/mystic-ui/"
5 | }
--------------------------------------------------------------------------------
/templates/vite-panda/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vite-panda",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "prepare": "panda codegen",
8 | "dev": "vite",
9 | "build": "tsc -b && vite build",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "solid-js": "^1.9.2"
14 | },
15 | "devDependencies": {
16 | "@pandacss/dev": "^0.47.0",
17 | "typescript": "~5.6.2",
18 | "vite": "^5.4.9",
19 | "vite-plugin-solid": "^2.10.2",
20 | "vite-tsconfig-paths": "^5.0.1"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/templates/vite-panda/panda.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "@pandacss/dev";
2 |
3 | export default defineConfig({
4 | // Whether to use css reset
5 | preflight: true,
6 |
7 | presets: ["@pandacss/preset-panda"],
8 |
9 | // Where to look for your css declarations
10 | include: ["./src/**/*.{js,jsx,ts,tsx}", "./pages/**/*.{js,jsx,ts,tsx}"],
11 |
12 | // Files to exclude
13 | exclude: [],
14 |
15 | // Useful for theme customization
16 | theme: {
17 | extend: {
18 | tokens: {
19 | animations: {
20 | ripple: {
21 | value:
22 | "ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite",
23 | },
24 | },
25 | },
26 | keyframes: {
27 | ripple: {
28 | "0%, 100%": {
29 | transform: "translate(-50%, -50%) scale(1)",
30 | },
31 | "50%": {
32 | transform: "translate(-50%, -50%) scale(0.9)",
33 | },
34 | },
35 | },
36 | },
37 | },
38 |
39 | // The output directory for your css system
40 | outdir: "styled-system",
41 |
42 | jsxFramework: "solid",
43 | });
44 |
--------------------------------------------------------------------------------
/templates/vite-panda/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | '@pandacss/dev/postcss': {},
4 | },
5 | }
--------------------------------------------------------------------------------
/templates/vite-panda/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/vite-panda/src/App.tsx:
--------------------------------------------------------------------------------
1 | import solidLogo from "./assets/solid.svg";
2 | import { Center, styled } from "styled-system/jsx";
3 | import { Ripple } from "./components/mystic-ui/ripple";
4 |
5 | function App() {
6 | return (
7 |
8 |
15 |
16 |
17 | );
18 | }
19 |
20 | export default App;
21 |
--------------------------------------------------------------------------------
/templates/vite-panda/src/assets/solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/vite-panda/src/index.css:
--------------------------------------------------------------------------------
1 | @layer reset, base, tokens, recipes, utilities;
--------------------------------------------------------------------------------
/templates/vite-panda/src/index.tsx:
--------------------------------------------------------------------------------
1 | /* @refresh reload */
2 | import { render } from 'solid-js/web'
3 | import './index.css'
4 | import App from './App.tsx'
5 |
6 | const root = document.getElementById('root')
7 |
8 | render(() => , root!)
9 |
--------------------------------------------------------------------------------
/templates/vite-panda/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/templates/vite-panda/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "Bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 | "jsx": "preserve",
16 | "jsxImportSource": "solid-js",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true,
23 | "noUncheckedSideEffectImports": true,
24 |
25 | "baseUrl": "."
26 | },
27 | "include": ["src", "styled-system"]
28 | }
29 |
--------------------------------------------------------------------------------
/templates/vite-panda/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/templates/vite-panda/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2022",
4 | "lib": ["ES2023"],
5 | "module": "ESNext",
6 | "skipLibCheck": true,
7 |
8 | /* Bundler mode */
9 | "moduleResolution": "Bundler",
10 | "allowImportingTsExtensions": true,
11 | "isolatedModules": true,
12 | "moduleDetection": "force",
13 | "noEmit": true,
14 |
15 | /* Linting */
16 | "strict": true,
17 | "noUnusedLocals": true,
18 | "noUnusedParameters": true,
19 | "noFallthroughCasesInSwitch": true,
20 | "noUncheckedSideEffectImports": true
21 | },
22 | "include": ["vite.config.ts"]
23 | }
24 |
--------------------------------------------------------------------------------
/templates/vite-panda/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import solid from "vite-plugin-solid";
3 | import tsconfigPaths from "vite-tsconfig-paths";
4 |
5 | export default defineConfig({
6 | plugins: [tsconfigPaths(), solid()],
7 | });
8 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/README.md:
--------------------------------------------------------------------------------
1 | ## Usage
2 |
3 | ```bash
4 | $ npm install # or pnpm install or yarn install
5 | ```
6 |
7 | ### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs)
8 |
9 | ## Available Scripts
10 |
11 | In the project directory, you can run:
12 |
13 | ### `npm run dev`
14 |
15 | Runs the app in the development mode.
16 | Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
17 |
18 | ### `npm run build`
19 |
20 | Builds the app for production to the `dist` folder.
21 | It correctly bundles Solid in production mode and optimizes the build for the best performance.
22 |
23 | The build is minified and the filenames include the hashes.
24 | Your app is ready to be deployed!
25 |
26 | ## Deployment
27 |
28 | Learn more about deploying your application with the [documentations](https://vite.dev/guide/static-deploy.html)
29 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheComputerM/mystic-ui/c7b3f1e9150c0474d8a5e62f807c8312e0e4b17f/templates/vite-tailwind/bun.lockb
--------------------------------------------------------------------------------
/templates/vite-tailwind/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + Solid + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/mystic.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "framework": "tailwind",
3 | "configPath": "tailwind.config.js",
4 | "outputPath": "./src/components/mystic-ui/",
5 | "tailwind": {
6 | "aliases": {
7 | "utils": "@/lib/utils"
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/templates/vite-tailwind/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vite-tailwind",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc -b && vite build",
9 | "preview": "vite preview"
10 | },
11 | "dependencies": {
12 | "clsx": "^2.1.1",
13 | "solid-js": "^1.9.2",
14 | "tailwind-merge": "^2.5.4"
15 | },
16 | "devDependencies": {
17 | "autoprefixer": "^10.4.20",
18 | "postcss": "^8.4.47",
19 | "tailwindcss": "^3.4.14",
20 | "typescript": "~5.6.2",
21 | "vite": "^5.4.9",
22 | "vite-plugin-solid": "^2.10.2",
23 | "vite-tsconfig-paths": "^5.0.1"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { Ripple } from "@/components/mystic-ui/ripple";
2 | import solidLogo from "./assets/solid.svg";
3 |
4 | function App() {
5 | return (
6 |
7 |

8 |
9 |
10 | );
11 | }
12 |
13 | export default App;
14 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/src/assets/solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/templates/vite-tailwind/src/index.tsx:
--------------------------------------------------------------------------------
1 | /* @refresh reload */
2 | import { render } from 'solid-js/web'
3 | import './index.css'
4 | import App from './App.tsx'
5 |
6 | const root = document.getElementById('root')
7 |
8 | render(() => , root!)
9 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
--------------------------------------------------------------------------------
/templates/vite-tailwind/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
4 | theme: {
5 | extend: {
6 | animation: {
7 | ripple: "ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite",
8 | },
9 |
10 | keyframes: {
11 | ripple: {
12 | "0%, 100%": {
13 | transform: "translate(-50%, -50%) scale(1)",
14 | },
15 |
16 | "50%": {
17 | transform: "translate(-50%, -50%) scale(0.9)",
18 | },
19 | },
20 | },
21 | },
22 | },
23 | plugins: [],
24 | };
25 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "Bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 | "jsx": "preserve",
16 | "jsxImportSource": "solid-js",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true,
23 | "noUncheckedSideEffectImports": true,
24 |
25 | "baseUrl": ".",
26 | "paths": {
27 | "@/*": ["./src/*"]
28 | }
29 | },
30 | "include": ["src"]
31 | }
32 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2022",
4 | "lib": ["ES2023"],
5 | "module": "ESNext",
6 | "skipLibCheck": true,
7 |
8 | /* Bundler mode */
9 | "moduleResolution": "Bundler",
10 | "allowImportingTsExtensions": true,
11 | "isolatedModules": true,
12 | "moduleDetection": "force",
13 | "noEmit": true,
14 |
15 | /* Linting */
16 | "strict": true,
17 | "noUnusedLocals": true,
18 | "noUnusedParameters": true,
19 | "noFallthroughCasesInSwitch": true,
20 | "noUncheckedSideEffectImports": true
21 | },
22 | "include": ["vite.config.ts"]
23 | }
24 |
--------------------------------------------------------------------------------
/templates/vite-tailwind/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import solid from "vite-plugin-solid";
3 | import tsconfigPaths from "vite-tsconfig-paths";
4 |
5 | export default defineConfig({
6 | plugins: [tsconfigPaths(), solid()],
7 | });
8 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | // Enable latest features
4 | "lib": ["ESNext", "DOM"],
5 | "target": "ESNext",
6 | "module": "ESNext",
7 | "moduleDetection": "force",
8 | "jsx": "preserve",
9 | "jsxImportSource": "solid-js",
10 | "allowJs": true,
11 |
12 | // Bundler mode
13 | "moduleResolution": "bundler",
14 | "allowImportingTsExtensions": true,
15 | "verbatimModuleSyntax": true,
16 | "noEmit": true,
17 |
18 | // Best practices
19 | "strict": true,
20 | "skipLibCheck": true,
21 | "noFallthroughCasesInSwitch": true,
22 |
23 | // Some stricter flags (disabled by default)
24 | "noUnusedLocals": false,
25 | "noUnusedParameters": false,
26 | "noPropertyAccessFromIndexSignature": false
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/website/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | dist
3 | .solid
4 | .output
5 | .vercel
6 | .netlify
7 | .vinxi
8 | app.config.timestamp_*.js
9 |
10 | # Environment
11 | .env
12 | .env*.local
13 |
14 | # dependencies
15 | /node_modules
16 |
17 | # IDEs and editors
18 | /.idea
19 | .project
20 | .classpath
21 | *.launch
22 | .settings/
23 |
24 | # Temp
25 | gitignore
26 |
27 | # System Files
28 | .DS_Store
29 | Thumbs.db
30 |
31 | ## Panda
32 | styled-system
33 | styled-system-studio
34 |
35 | # Content Collections
36 | .content-collections
--------------------------------------------------------------------------------
/website/README.md:
--------------------------------------------------------------------------------
1 | # Mystic UI Website
2 |
3 | The website for Mystic UI is created using the [Solid Start](https://start.solidjs.com/) framework and the Mystic UI (*duhh*), [Park UI](https://park-ui.com/) and [PandaCSS](https://panda-css.com/) libraries.
--------------------------------------------------------------------------------
/website/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "extends": ["../biome.json"]
4 | }
5 |
--------------------------------------------------------------------------------
/website/content-collections.ts:
--------------------------------------------------------------------------------
1 | import { defineCollection, defineConfig } from "@content-collections/core";
2 |
3 | const pages = defineCollection({
4 | name: "pages",
5 | directory: "src/content/pages",
6 | include: "**/*.mdx",
7 | schema: (z) => ({
8 | title: z.string(),
9 | }),
10 | });
11 |
12 | const docs = defineCollection({
13 | name: "docs",
14 | directory: "src/content/docs",
15 | include: "**/*.mdx",
16 | schema: (z) => ({
17 | title: z.string(),
18 | description: z.string(),
19 | category: z.enum([
20 | "text",
21 | "background",
22 | "component",
23 | "device-mock",
24 | "effect",
25 | ]),
26 | }),
27 | });
28 |
29 | export default defineConfig({
30 | collections: [pages, docs],
31 | });
32 |
--------------------------------------------------------------------------------
/website/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@mystic-ui/website",
3 | "private": true,
4 | "type": "module",
5 | "scripts": {
6 | "prepare": "panda codegen",
7 | "dev": "vinxi dev",
8 | "build": "panda prepare && vinxi build",
9 | "start": "vinxi start",
10 | "version": "vinxi version",
11 | "format": "biome format src",
12 | "lint": "biome lint src",
13 | "check": "biome check src"
14 | },
15 | "dependencies": {
16 | "@ark-ui/solid": "^4.5.0",
17 | "@fontsource-variable/rubik": "^5.1.0",
18 | "@mystic-ui/panda": "workspace:*",
19 | "@solid-primitives/memo": "^1.3.10",
20 | "@solid-primitives/storage": "^4.2.1",
21 | "@solidjs/meta": "^0.29.4",
22 | "@solidjs/router": "^0.15.1",
23 | "@solidjs/start": "^1.0.10",
24 | "@tanstack/solid-store": "^0.5.7",
25 | "@vinxi/plugin-mdx": "^3.7.2",
26 | "motion": "^11.13.1",
27 | "remark-frontmatter": "^5.0.0",
28 | "solid-icons": "^1.1.0",
29 | "solid-js": "^1.9.3",
30 | "solid-motionone": "^1.0.2",
31 | "vinxi": "^0.4.3"
32 | },
33 | "engines": {
34 | "node": ">=18"
35 | },
36 | "devDependencies": {
37 | "@biomejs/biome": "1.9.4",
38 | "@content-collections/core": "^0.7.3",
39 | "@content-collections/solid-start": "^0.1.3",
40 | "@fastify/deepmerge": "^2.0.0",
41 | "@pandacss/dev": "^0.47.1",
42 | "@park-ui/panda-preset": "^0.42.0",
43 | "rehype-slug": "^6.0.0",
44 | "remark-code-extra": "^1.0.1",
45 | "remark-gfm": "^4.0.0",
46 | "shiki": "^1.22.2",
47 | "ts-deepmerge": "^7.0.1",
48 | "unist-util-visit": "^5.0.0",
49 | "vite-tsconfig-paths": "^5.1.2",
50 | "@mystic-ui/registry": "workspace:*"
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/website/panda.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "@pandacss/dev";
2 | import { pandaConfig as mysticConfig } from "@mystic-ui/registry/src/panda";
3 | import { merge } from "ts-deepmerge";
4 |
5 | const config = defineConfig({
6 | preflight: true,
7 | presets: ["@pandacss/preset-panda", "@park-ui/panda-preset"],
8 | minify: process.env.NODE_ENV === "production",
9 | // TODO: doesn't work properly with vercel
10 | // hash: process.env.NODE_ENV === "production",
11 | include: [
12 | "../components/panda/src/**/*.tsx",
13 | "./src/**/*.{js,jsx,ts,tsx,mdx}",
14 | ],
15 | exclude: [],
16 | theme: {
17 | extend: {},
18 | },
19 | globalCss: {
20 | html: {
21 | "--global-font-body": '"Rubik Variable", sans-serif',
22 | "--global-font-mono":
23 | "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace",
24 | },
25 | },
26 | outdir: "styled-system",
27 | jsxFramework: "solid",
28 | });
29 |
30 | export default merge(mysticConfig(), config);
31 |
--------------------------------------------------------------------------------
/website/park-ui.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://park-ui.com/registry/latest/schema.json",
3 | "jsFramework": "solid",
4 | "outputPath": "./src/components/ui"
5 | }
6 |
--------------------------------------------------------------------------------
/website/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | "@pandacss/dev/postcss": {},
4 | },
5 | };
6 |
--------------------------------------------------------------------------------
/website/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheComputerM/mystic-ui/c7b3f1e9150c0474d8a5e62f807c8312e0e4b17f/website/public/favicon.ico
--------------------------------------------------------------------------------
/website/src/app.css:
--------------------------------------------------------------------------------
1 | @layer reset, base, tokens, recipes, utilities;
2 |
--------------------------------------------------------------------------------
/website/src/app.tsx:
--------------------------------------------------------------------------------
1 | import { MetaProvider, Title } from "@solidjs/meta";
2 | import { Router } from "@solidjs/router";
3 | import { FileRoutes } from "@solidjs/start/router";
4 | import { type ParentComponent, Suspense } from "solid-js";
5 | import "@fontsource-variable/rubik";
6 | import "./app.css";
7 | import { Navbar } from "./components/navbar";
8 |
9 | const Layout: ParentComponent = (props) => {
10 | return (
11 | <>
12 |
13 | {props.children}
14 | >
15 | );
16 | };
17 |
18 | export default function App() {
19 | return (
20 | (
22 |
23 | Mystic UI
24 |
25 | {props.children}
26 |
27 | )}
28 | >
29 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/website/src/components/theme-switcher.tsx:
--------------------------------------------------------------------------------
1 | import { makePersisted } from "@solid-primitives/storage";
2 | import { TbMoon, TbSun } from "solid-icons/tb";
3 | import { Show, createEffect, createSignal } from "solid-js";
4 | import { IconButton } from "./ui/icon-button";
5 |
6 | export const ThemeSwitcher = () => {
7 | const [darkMode, setDarkMode] = makePersisted(createSignal(false), {
8 | name: "darkMode",
9 | });
10 |
11 | createEffect(() => {
12 | if (darkMode()) {
13 | document.documentElement.classList.add("dark");
14 | } else {
15 | document.documentElement.classList.remove("dark");
16 | }
17 | });
18 |
19 | return (
20 | setDarkMode((theme) => !theme)}
22 | variant="ghost"
23 | size="sm"
24 | aria-label="Toggle dark mode"
25 | >
26 | }>
27 |
28 |
29 |
30 | );
31 | };
32 |
--------------------------------------------------------------------------------
/website/src/components/ui/badge.tsx:
--------------------------------------------------------------------------------
1 | export { Badge, type BadgeProps } from "./styled/badge";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import type { JSX } from "solid-js";
2 | import { Show, splitProps } from "solid-js";
3 | import { Center, styled } from "styled-system/jsx";
4 | import { Spinner } from "./spinner";
5 | import {
6 | Button as StyledButton,
7 | type ButtonProps as StyledButtonProps,
8 | } from "./styled/button";
9 |
10 | interface ButtonLoadingProps {
11 | loading?: boolean;
12 | loadingText?: JSX.Element;
13 | }
14 |
15 | export interface ButtonProps extends StyledButtonProps, ButtonLoadingProps {}
16 |
17 | export const Button = (props: ButtonProps) => {
18 | const [localProps, rest] = splitProps(props, [
19 | "loading",
20 | "disabled",
21 | "loadingText",
22 | "children",
23 | ]);
24 | const trulyDisabled = () => localProps.loading || localProps.disabled;
25 |
26 | return (
27 |
28 |
32 | <>
33 |
34 | {localProps.children}
35 | >
36 |
37 |
38 | );
39 | };
40 |
41 | const ButtonSpinner = () => (
42 |
49 |
50 |
51 | );
52 |
--------------------------------------------------------------------------------
/website/src/components/ui/clipboard.tsx:
--------------------------------------------------------------------------------
1 | export * as Clipboard from "./styled/clipboard";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/code.tsx:
--------------------------------------------------------------------------------
1 | export { Code, type CodeProps } from "./styled/code";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/heading.tsx:
--------------------------------------------------------------------------------
1 | export { Heading, type HeadingProps } from "./styled/heading";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/icon-button.tsx:
--------------------------------------------------------------------------------
1 | export { IconButton, type IconButtonProps } from "./styled/icon-button";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/kbd.tsx:
--------------------------------------------------------------------------------
1 | export { Kbd, type KbdProps } from "./styled/kbd";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/link.tsx:
--------------------------------------------------------------------------------
1 | export { Link, type LinkProps } from "./styled/link";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/select.tsx:
--------------------------------------------------------------------------------
1 | export * as Select from "./styled/select";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/spinner.tsx:
--------------------------------------------------------------------------------
1 | import { mergeProps, splitProps } from "solid-js";
2 | import { styled } from "styled-system/jsx";
3 | import {
4 | Spinner as StyledSpinner,
5 | type SpinnerProps as StyledSpinnerProps,
6 | } from "./styled/spinner";
7 |
8 | export interface SpinnerProps extends StyledSpinnerProps {
9 | /**
10 | * For accessibility, it is important to add a fallback loading text.
11 | * This text will be visible to screen readers.
12 | * @default "Loading..."
13 | */
14 | label?: string;
15 | }
16 |
17 | export const Spinner = (props: SpinnerProps) => {
18 | const [_localProps, rootProps] = splitProps(props, ["label"]);
19 | const localProps = mergeProps({ label: "Loading..." }, _localProps);
20 |
21 | return (
22 |
27 | {localProps.label}
28 |
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/website/src/components/ui/stepper.tsx:
--------------------------------------------------------------------------------
1 | // thanks https://github.com/cschroeter/park-ui/blob/main/website/src/components/ui/stepper.tsx
2 |
3 | import type { ParentComponent } from "solid-js";
4 | import { Box, Circle, HStack, Stack } from "styled-system/jsx";
5 | import { Heading } from "./styled/heading";
6 |
7 | export const Steps: ParentComponent = (props) => {
8 | return (
9 |
10 |
18 | {props.children}
19 |
20 | );
21 | };
22 |
23 | type StepProps = {
24 | number: number;
25 | title: string;
26 | };
27 |
28 | export const Step: ParentComponent = (props) => {
29 | return (
30 |
31 |
32 |
41 | {props.number}
42 |
43 |
44 | {props.title}
45 |
46 |
47 | :last-child": { mb: "0" } }}>
48 | {props.children}
49 |
50 |
51 | );
52 | };
53 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/badge.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { badge } from "styled-system/recipes";
5 |
6 | export type BadgeProps = ComponentProps;
7 | export const Badge = styled(ark.div, badge);
8 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/button.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { button } from "styled-system/recipes";
5 |
6 | export type ButtonProps = ComponentProps;
7 | export const Button = styled(ark.button, button);
8 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/code.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { code } from "styled-system/recipes";
5 |
6 | export type CodeProps = ComponentProps;
7 | export const Code = styled(ark.code, code);
8 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/heading.tsx:
--------------------------------------------------------------------------------
1 | import type { ComponentProps } from "solid-js";
2 | import { styled } from "styled-system/jsx";
3 | import { type TextVariantProps, text } from "styled-system/recipes";
4 | import type { StyledComponent } from "styled-system/types";
5 |
6 | type TextProps = TextVariantProps & { as?: React.ElementType };
7 |
8 | export type HeadingProps = ComponentProps;
9 | export const Heading = styled("h2", text, {
10 | defaultProps: { variant: "heading" },
11 | }) as StyledComponent<"h2", TextProps>;
12 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/icon-button.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { type ButtonVariantProps, button } from "styled-system/recipes";
5 |
6 | export type IconButtonProps = ComponentProps;
7 | export const IconButton = styled(ark.button, button, {
8 | defaultProps: { px: "0" } as ButtonVariantProps,
9 | });
10 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/kbd.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { kbd } from "styled-system/recipes";
5 |
6 | export type KbdProps = ComponentProps;
7 | export const Kbd = styled(ark.kbd, kbd);
8 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/link.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { link } from "styled-system/recipes";
5 |
6 | export type LinkProps = ComponentProps;
7 | export const Link = styled(ark.a, link);
8 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/spinner.tsx:
--------------------------------------------------------------------------------
1 | import { ark } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { styled } from "styled-system/jsx";
4 | import { spinner } from "styled-system/recipes";
5 |
6 | export type SpinnerProps = ComponentProps;
7 | export const Spinner = styled(ark.div, spinner);
8 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/tabs.tsx:
--------------------------------------------------------------------------------
1 | import { type Assign, Tabs } from "@ark-ui/solid";
2 | import type { ComponentProps } from "solid-js";
3 | import { type TabsVariantProps, tabs } from "styled-system/recipes";
4 | import type { HTMLStyledProps } from "styled-system/types";
5 | import { createStyleContext } from "./utils/create-style-context";
6 |
7 | const { withProvider, withContext } = createStyleContext(tabs);
8 |
9 | export type RootProviderProps = ComponentProps;
10 | export const RootProvider = withProvider<
11 | Assign<
12 | Assign, Tabs.RootProviderBaseProps>,
13 | TabsVariantProps
14 | >
15 | >(Tabs.RootProvider, "root");
16 |
17 | export type RootProps = ComponentProps;
18 | export const Root = withProvider<
19 | Assign, Tabs.RootBaseProps>, TabsVariantProps>
20 | >(Tabs.Root, "root");
21 |
22 | export const Content = withContext<
23 | Assign, Tabs.ContentBaseProps>
24 | >(Tabs.Content, "content");
25 |
26 | export const Indicator = withContext<
27 | Assign, Tabs.IndicatorBaseProps>
28 | >(Tabs.Indicator, "indicator");
29 |
30 | export const List = withContext<
31 | Assign, Tabs.ListBaseProps>
32 | >(Tabs.List, "list");
33 |
34 | export const Trigger = withContext<
35 | Assign, Tabs.TriggerBaseProps>
36 | >(Tabs.Trigger, "trigger");
37 |
38 | export { TabsContext as Context } from "@ark-ui/solid";
39 |
--------------------------------------------------------------------------------
/website/src/components/ui/styled/text.tsx:
--------------------------------------------------------------------------------
1 | import type { ComponentProps } from "solid-js";
2 | import { styled } from "styled-system/jsx";
3 | import { type TextVariantProps, text } from "styled-system/recipes";
4 | import type { StyledComponent } from "styled-system/types";
5 |
6 | type ParagraphProps = TextVariantProps & { as?: JSX.ElementType };
7 |
8 | export type TextProps = ComponentProps;
9 | export const Text = styled("p", text) as StyledComponent<"p", ParagraphProps>;
10 |
--------------------------------------------------------------------------------
/website/src/components/ui/tabs.tsx:
--------------------------------------------------------------------------------
1 | export * as Tabs from "./styled/tabs";
2 |
--------------------------------------------------------------------------------
/website/src/components/ui/text.tsx:
--------------------------------------------------------------------------------
1 | export { Text, type TextProps } from "./styled/text";
2 |
--------------------------------------------------------------------------------
/website/src/content/docs/android.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Android
3 | description: A mockup of a standard Android device
4 | category: device-mock
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/animated-beam.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Animated Beam
3 | description: An animated beam of light which travels along a path. Useful for showcasing the "integration" features of a website
4 | category: effect
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/animated-shiny-text.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Animated Shiny Text
3 | description: A light glare effect which pans across text making it appear as if it is shimmering
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/border-beam.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Border Beam
3 | description: An animated beam of light which travels along the border of its container
4 | category: effect
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/dock.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Dock
3 | description: An implementation of the MacOS dock using solid and motionone
4 | category: component
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/dot-pattern.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Dot Pattern
3 | description: A background dot pattern made with SVGs, fully customizable using CSS
4 | category: background
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/flip-text.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Flip Text
3 | description: Text flipping character animation
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/gradual-spacing.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Gradual Spacing
3 | description: Word animation for gradual spacing between letters
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/grid-pattern.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Grid Pattern
3 | description: A background grid pattern made with SVGs, fully customizable using CSS
4 | category: background
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/iphone-15.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: iPhone 15
3 | description: A mockup of the iPhone 15 Pro
4 | category: device-mock
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/letter-pullup.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Letter Pullup
3 | description: Staggered letter pull up text animation
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/marquee.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Marquee
3 | description: An infinite scrolling component that can be used to display text, images, or videos
4 | category: component
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/meteors.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Meteors
3 | description: A meteor shower effect
4 | category: effect
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/no-signal-screen.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: No Signal Screen
3 | description: A retro no signal screen background
4 | category: background
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/number-ticker.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Number Ticker
3 | description: Animate numbers to count up or down to a target number
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/orbiting-circles.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Orbiting Circles
3 | description: A collection of circles which move in orbit along a circular path
4 | category: component
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/retro-grid.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Retro Grid
3 | description: An animated scrolling retro grid effect
4 | category: background
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/ripple.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Ripple
3 | description: An animated ripple effect typically used behind elements to emphasize them
4 | category: background
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/safari.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Safari
3 | description: A safari browser mockup to showcase your website
4 | category: device-mock
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/shine-border.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Shine Border
3 | description: Shine border is an animated background border effect
4 | category: effect
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/sparkles-text.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Sparkles Text
3 | description: A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/spotlight.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Spotlight
3 | description: A spotlight effect with CSS, good for drawing attention to a particular element on the page
4 | category: effect
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/text-reveal.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Text Reveal
3 | description: Fade in text as you scroll down the page
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/typing-animation.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Typing Animation
3 | description: Characters appearing in typed animation
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/word-fade-in.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Word Fade In
3 | description: Text animation which fades in word by word
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/word-pullup.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Word Pullup
3 | description: Text animation for words to pull up
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/docs/word-rotate.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Word Rotate
3 | description: A vertical rotation of words
4 | category: text
5 | ---
--------------------------------------------------------------------------------
/website/src/content/pages/introduction.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Introduction
3 | ---
4 |
5 | # Mystic UI
6 |
7 | Collection of beautiful UI components for SolidJS that work with Tailwind and PandaCSS.
8 |
9 | ----
10 |
11 | ## Why?
12 |
13 | I think by now we all know how important a good UI is for websites and applications. It's the first thing users see and it's the first thing they interact with, so it's important to get it right.
14 |
15 | Inspite of that, I would rather focus on buiding the *heart* of the software, I guess that's why component libraries such as [shadcn/ui](https://ui.shadcn.com/) and [Park UI](https://park-ui.com/) are so popular, they allow developers to focus on the core of their software while resting assured in the fact that users will have a good first impression.
16 |
17 | That's why I made **Mystic UI**, because currently there is no collection of *cool and beautiful components* for the SolidJS ecosystem, and I think it's important to have one.
18 |
19 | ----
20 |
21 | ## Acknowledgements
22 |
23 | This project is standing on the shoulders of giants such as:
24 |
25 |
26 | - [Magic UI](https://magicui.design/) - primary inspiration for the project and components
27 | - [Aceternity UI](https://ui.aceternity.com/) - components
28 | - [Eldora UI](https://eldoraui.site) - components
29 | - [UI Layout](https://ui-layout.com) - components
30 | - [SolidJS](https://solidjs.com/) and [Solid Start](https://start.solidjs.com/) - *obviously*
--------------------------------------------------------------------------------
/website/src/content/pages/setup-panda.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Setup PandaCSS
3 | ---
4 |
5 | # Setup with PandaCSS
6 |
7 | You can use Mystic UI with your PandaCSS projects, also works with panda based frameworks like [Park UI](https://park-ui.com/).
8 |
9 | Run `npx @mystic-ui/cli init` with whatever package manager you prefer and make sure you choose *panda* as your css framework.
10 |
11 | And finally make sure you include the panda preset in your config.
12 |
13 | ```js
14 | export default defineConfig({
15 | //...
16 | presets: ["@pandacss/preset-panda"] // make sure the panda preset is included in your config
17 | })
18 | ```
--------------------------------------------------------------------------------
/website/src/content/pages/setup-tailwind.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Setup TailwindCSS
3 | ---
4 |
5 | # Setup with Tailwind
6 |
7 | You can use Mystic UI with your Tailwind projects, also works with tailwind based frameworks like [Solid UI](https://www.solid-ui.com/) and [shadcn-solid](https://shadcn-solid.com/).
8 |
9 | Run `npx @mystic-ui/cli init` with whatever package manager you prefer and make sure you choose *tailwind* as your css framework. You will have to add the `cn` utility manually where you specify the utils path alias.
10 |
11 | ```sh
12 | npm i clsx tailwind-merge
13 | ```
14 |
15 |
16 |
17 | ```ts
18 | import { clsx, type ClassValue } from "clsx"
19 | import { twMerge } from "tailwind-merge"
20 |
21 | export function cn(...inputs: ClassValue[]) {
22 | return twMerge(clsx(inputs))
23 | }
24 | ```
--------------------------------------------------------------------------------
/website/src/entry-client.tsx:
--------------------------------------------------------------------------------
1 | // @refresh reload
2 | import { StartClient, mount } from "@solidjs/start/client";
3 |
4 | mount(() => , document.getElementById("app")!);
5 |
--------------------------------------------------------------------------------
/website/src/entry-server.tsx:
--------------------------------------------------------------------------------
1 | // @refresh reload
2 | import { StartServer, createHandler } from "@solidjs/start/server";
3 |
4 | export default createHandler(() => (
5 | (
7 |
8 |
9 |
10 |
11 |
12 | {assets}
13 |
14 |
15 | {children}
16 | {scripts}
17 |
18 |
19 | )}
20 | />
21 | ));
22 |
--------------------------------------------------------------------------------
/website/src/global.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/website/src/lib/shiki.ts:
--------------------------------------------------------------------------------
1 | "use server";
2 |
3 | import { type BundledLanguage, codeToHtml } from "shiki";
4 |
5 | export async function highlight(code: string, lang: BundledLanguage = "tsx") {
6 | return await codeToHtml(code, {
7 | lang,
8 | theme: "vesper",
9 | });
10 | }
11 |
--------------------------------------------------------------------------------
/website/src/lib/store.ts:
--------------------------------------------------------------------------------
1 | import { Store } from "@tanstack/solid-store";
2 |
3 | export const store = new Store({
4 | sideNavOpen: false,
5 | });
6 |
--------------------------------------------------------------------------------
/website/src/lib/stories.ts:
--------------------------------------------------------------------------------
1 | "use server";
2 |
3 | import { query } from "@solidjs/router";
4 | import { highlight } from "./shiki";
5 |
6 | /**
7 | * Get the source code of a story
8 | */
9 | export const getStorySource = query(
10 | async (
11 | framework: "tailwind" | "panda",
12 | component: string,
13 | name = "default",
14 | ) => {
15 | const source: string = await import(
16 | `../../../components/${framework}/src/stories/${component}/${name}.tsx?raw`
17 | ).then((module) => module.default);
18 | return {
19 | source,
20 | html: await highlight(source, "tsx"),
21 | };
22 | },
23 | "story-source",
24 | );
25 |
--------------------------------------------------------------------------------
/website/src/routes/[...404].tsx:
--------------------------------------------------------------------------------
1 | import { Title } from "@solidjs/meta";
2 | import { HttpStatusCode } from "@solidjs/start";
3 |
4 | export default function NotFound() {
5 | return (
6 |
7 | Not Found
8 |
9 | Page Not Found
10 |
11 | Visit{" "}
12 |
13 | start.solidjs.com
14 | {" "}
15 | to learn how to build SolidStart apps.
16 |
17 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/website/src/routes/docs/[framework]/index.tsx:
--------------------------------------------------------------------------------
1 | import { Meta, Title } from "@solidjs/meta";
2 | import type { RouteSectionProps } from "@solidjs/router";
3 |
4 | import MDXContent from "~/content/pages/introduction.mdx";
5 |
6 | export default function IntroductionPage(props: RouteSectionProps) {
7 | return (
8 | <>
9 | Introduction | Mystic UI
10 |
14 |
15 | >
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/website/src/routes/docs/[framework]/setup.tsx:
--------------------------------------------------------------------------------
1 | import { Title } from "@solidjs/meta";
2 | import type { RouteSectionProps } from "@solidjs/router";
3 | import { type Component, lazy } from "solid-js";
4 | import { Dynamic } from "solid-js/web";
5 |
6 | export default function SetupPage(props: RouteSectionProps) {
7 | const pages: Record = {
8 | panda: lazy(() => import("~/content/pages/setup-panda.mdx")),
9 | tailwind: lazy(() => import("~/content/pages/setup-tailwind.mdx")),
10 | };
11 |
12 | return (
13 | <>
14 | Using Mystic UI with {props.params.framework}
15 |
16 | >
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/website/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "module": "ESNext",
5 | "moduleResolution": "bundler",
6 | "allowSyntheticDefaultImports": true,
7 | "esModuleInterop": true,
8 | "jsx": "preserve",
9 | "jsxImportSource": "solid-js",
10 | "allowJs": true,
11 | "strict": true,
12 | "noEmit": true,
13 | "types": ["vinxi/types/client"],
14 | "isolatedModules": true,
15 | "baseUrl": ".",
16 | "paths": {
17 | "~/*": ["./src/*"],
18 | "content-collections": ["./.content-collections/generated"]
19 | }
20 | },
21 | "include": ["src", "styled-system"]
22 | }
23 |
--------------------------------------------------------------------------------