├── .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 |
6 | 7 |
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 | Solid JS 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 |
8 | 9 |
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 |
6 |

Dot Pattern

7 | 8 |
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 |
6 |

No Signal

7 | 8 |
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 | Solid JS 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 |
21 |
34 |
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 | Solid JS 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 | --------------------------------------------------------------------------------