0.6.0 • Published 3 months ago

i7-ui v0.6.0

Weekly downloads
-
License
MIT
Repository
-
Last release
3 months ago

i7-UI

A modern React UI component library built on top of Medusa UI, providing reusable components for building beautiful and accessible web applications.

Features

  • 🎨 Built on top of Medusa UI
  • 🌙 Dark mode support
  • ♿️ Accessible components following WCAG guidelines
  • 📱 Responsive design
  • 🎯 TypeScript support
  • 🎄 Tree-shakeable
  • 🎪 Built with TailwindCSS

Installation

Install i7-UI and its peer dependencies:

# Using npm
npm install i7-ui @medusajs/ui @medusajs/ui-preset tailwindcss

# Using yarn
yarn add i7-ui @medusajs/ui @medusajs/ui-preset tailwindcss

# Using pnpm
pnpm add i7-ui @medusajs/ui @medusajs/ui-preset tailwindcss

Setup

  1. Add the Medusa UI preset to your tailwind.config.ts:
import type { Config } from "tailwindcss";
import { join } from "path";

const config: Config = {
  // for stop dark mode medusa js
  darkMode: "class",
  // eslint-disable-next-line @typescript-eslint/no-require-imports
  presets: [require("@medusajs/ui-preset")],
  content: [
    join(__dirname, "src/**/!(*.stories|*.spec).{ts,tsx,html}"),
    "./node_modules/@medusajs/ui/dist/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {
      colors: {},
    },
  },
  plugins: [],
};
export default config;

Usage

Here's a quick example of using i7-UI components:

import { Select } from "@medusajs/ui";

function App() {
  const currencies = [
    {
      value: "eur",
      label: "EUR",
    },
    {
      value: "usd",
      label: "USD",
    },
    {
      value: "dkk",
      label: "DKK",
    },
  ];
  return (
    <div>
      <div className="w-[256px]">
        <Select>
          <Select.Trigger>
            <Select.Value placeholder="Select a currency" />
          </Select.Trigger>
          <Select.Content>
            {currencies.map((item) => (
              <Select.Item key={item.value} value={item.value}>
                {item.label}
              </Select.Item>
            ))}
          </Select.Content>
        </Select>
      </div>
    </div>
  );
}

Action Menu Example

import { ActionMenu } from "@medusajs/ui";

function ActionMenuExample() {
  return (
    <ActionMenu>
      <ActionMenu.Trigger>
        <span>Options</span>
      </ActionMenu.Trigger>
      <ActionMenu.Content>
        <ActionMenu.Item onClick={() => console.log("Edit")}>
          Edit
        </ActionMenu.Item>
        <ActionMenu.Item onClick={() => console.log("Duplicate")}>
          Duplicate
        </ActionMenu.Item>
        <ActionMenu.Separator />
        <ActionMenu.Item
          onClick={() => console.log("Delete")}
          className="text-ui-danger"
        >
          Delete
        </ActionMenu.Item>
      </ActionMenu.Content>
    </ActionMenu>
  );
}

Form with Custom Dropdown Example

const App = () => {
  const form = useForm<zod.infer<typeof CreateBranchesSchema>>({
    defaultValues: {
      name: ["3", "5"],
    },
    resolver: zodResolver(CreateBranchesSchema),
  });
  const handleSubmit = form.handleSubmit((data) => {
    console.log(data);
  });
  return (
    <div className="h-screen w-screen flex justify-center items-center">
      <Form {...form}>
        <KeyboundForm onSubmit={handleSubmit}>
          <Form.Field
            control={form.control}
            name="name"
            render={({ field }) => {
              return (
                <Form.Item>
                  <Form.Label>Name</Form.Label>
                  <Form.Control>
                    <DropDown
                      className="w-[400px]"
                      {...field}
                      isMulti={true}
                      value={field.value}
                      onChange={(value) => {
                        field.onChange(value);
                      }}
                      options={[
                        { label: "test1", value: "1" },
                        { label: "test2", value: "2" },
                        { label: "test3", value: "3" },
                        { label: "test4", value: "4" },
                        { label: "test5", value: "5" },
                        { label: "test6", value: "6" },
                        { label: "test7", value: "7" },
                        { label: "test8", value: "8" },
                        { label: "test9", value: "9" },
                        { label: "test10", value: "10" },
                        { label: "test11", value: "11" },
                        { label: "test12", value: "12" },
                        { label: "test13", value: "13" },
                        { label: "test14", value: "14" },
                      ]}
                    />
                  </Form.Control>
                  <Form.ErrorMessage />
                </Form.Item>
              );
            }}
          />
          <Button type="submit">Submit</Button>
        </KeyboundForm>
      </Form>
    </div>
  );
};

Image Upload Example

You can use the ImageUpload component to upload an image. use useUpload hook to upload the image to the server. You can use this component with react-hook-form or formik.

const App = () => {
  const form = useForm<zod.infer<typeof CreateBranchesSchema>>({
    defaultValues: {
      name: faker.image.avatar(),
    },
    resolver: zodResolver(CreateBranchesSchema),
  });
  const handleSubmit = form.handleSubmit((data) => {
    console.log(data);
  });

  const handleUploadFile = async (
    e: React.ChangeEvent<HTMLInputElement>,
    field: any
  ) => {
    const files = e.target.files;
    if (files && files.length > 0) {
      const file = new FormData();
      file.append("file", files[0]);
      field.onChange(faker.image.avatar());
    }
  };

  return (
    <div className="h-screen w-screen flex justify-center items-center">
      <Form {...form}>
        <KeyboundForm onSubmit={handleSubmit}>
          <Form.Field
            control={form.control}
            name="name"
            render={({ field }) => {
              return (
                <Form.Item>
                  <Form.Label>Name</Form.Label>
                  <Form.Control>
                    <ImageUpload
                      value={field.value}
                      onChange={(e) => handleUploadFile(e, field)}
                    />
                  </Form.Control>
                  <Form.ErrorMessage />
                </Form.Item>
              );
            }}
          />
          <Button type="submit">Submit</Button>
        </KeyboundForm>
      </Form>
    </div>
  );
};

DndFile Example

You can use the DndFile component to upload a file or multiple files here is the example of multiple files. use useUpload hook to upload the file to the server. You can use this component with react-hook-form or formik.

const App = () => {
  const [files, setFiles] = useState<File[]>([]);
  const [rejectedFiles, setRejectedFiles] = useState<FileRejection[]>([]);

  const form = useForm<zod.infer<typeof CreateBranchesSchema>>({
    defaultValues: {
      url: [faker.image.avatar(), faker.image.avatar()],
    },
    resolver: zodResolver(CreateBranchesSchema),
  });
  const handleSubmit = form.handleSubmit((data) => {
    console.log(data);
  });

  const onDrop = useCallback(
    async (acceptedFiles: any, rejectedFiles: any, field: any) => {
      if (rejectedFiles.length > 0) {
        setRejectedFiles(rejectedFiles);
        return;
      }

      setFiles(acceptedFiles);
      field.onChange([
        ...(Array.isArray(field.value) ? field.value : []),
        ...acceptedFiles.map((item: any) => faker.image.avatar()),
      ]);
    },
    []
  );

  return (
    <div className="h-screen w-screen flex justify-center items-center">
      <Form {...form}>
        <KeyboundForm onSubmit={handleSubmit}>
          <Form.Field
            control={form.control}
            name="url"
            render={({ field }) => {
              return (
                <Form.Item>
                  <Form.Label>Url</Form.Label>
                  <Form.Control>
                    <DndFile
                      value={field.value}
                      multiFiles={true}
                      onDrop={(acceptedFiles, rejectedFiles) =>
                        onDrop(acceptedFiles, rejectedFiles, field)
                      }
                      onChange={(values) => field.onChange(values)}
                      uploadOptions={{
                        maxFiles: 3,
                      }}
                      uploadFilesInfo={{
                        progress: 50,
                        files: files,
                        rejectedFiles: rejectedFiles,
                      }}
                      fileCount={true}
                    />
                  </Form.Control>
                  <Form.ErrorMessage />
                </Form.Item>
              );
            }}
          />
          <Button type="submit" className="mt-2">
            Submit
          </Button>
        </KeyboundForm>
      </Form>
    </div>
  );
};

Hooks

useComboboxData

The useComboboxData hook is used when implementing a combobox component that needs to fetch data from an API. It provides functionality for handling search, pagination, and initial data loading.

npm install @tanstack/react-query axios

Available Components

i7-UI provides a wide range of components including:

  • ActionMenu
  • Combobox
  • Dropdown
  • Form
  • KeyboundForm
  • Modal
  • Dropdown
  • Container
  • Header
  • GridLayout , GridItem
  • SectionRow
  • Skeleton
  • SingleColumnLayout
  • TwoColumnLayout
  • Pagination
  • Table
  • ImageUpload
  • DndFile For detailed documentation of each component, please visit our documentation site (coming soon).

Contributing

We welcome contributions! Please read our contributing guidelines (coming soon) to get started.

License

MIT © i7-UI

Links

Support

If you need help or have questions:

0.6.0

3 months ago

0.5.9

3 months ago

0.5.8

3 months ago

0.5.7

3 months ago

0.5.6

3 months ago

0.5.5

4 months ago

0.5.4

4 months ago

0.5.3

4 months ago

0.5.2

4 months ago

0.5.1

4 months ago

0.5.0

4 months ago

0.4.8

4 months ago

0.4.7

4 months ago

0.4.6

4 months ago

0.4.5

4 months ago

0.4.4

4 months ago

0.4.3

4 months ago

0.4.2

4 months ago

0.4.1

4 months ago

0.4.0

4 months ago

0.3.0

4 months ago

0.2.18

4 months ago

0.2.17

4 months ago

0.2.16

4 months ago

0.2.15

4 months ago

0.1.14

4 months ago

0.1.13

4 months ago

0.2.12

4 months ago

0.0.12

4 months ago

0.0.11

4 months ago

0.0.10

4 months ago

0.0.8

4 months ago

0.0.7

4 months ago

0.0.6

4 months ago

0.0.4

4 months ago

0.0.3

4 months ago

0.0.2

4 months ago

0.0.1

4 months ago