mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
feat(components): divider component added
This commit is contained in:
parent
3a9f2be6b9
commit
b6faafd665
24
packages/components/divider/README.md
Normal file
24
packages/components/divider/README.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# @nextui-org/divider
|
||||||
|
|
||||||
|
A Quick description of the component
|
||||||
|
|
||||||
|
> This is an internal utility, not intended for public usage.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add @nextui-org/divider
|
||||||
|
# or
|
||||||
|
npm i @nextui-org/divider
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
Yes please! See the
|
||||||
|
[contributing guidelines](https://github.com/nextui-org/nextui/blob/master/CONTRIBUTING.md)
|
||||||
|
for details.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
This project is licensed under the terms of the
|
||||||
|
[MIT license](https://github.com/nextui-org/nextui/blob/master/LICENSE).
|
||||||
36
packages/components/divider/__tests__/divider.test.tsx
Normal file
36
packages/components/divider/__tests__/divider.test.tsx
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import {render} from "@testing-library/react";
|
||||||
|
import {getMargin} from "@nextui-org/shared-utils";
|
||||||
|
|
||||||
|
import {Divider} from "../src";
|
||||||
|
|
||||||
|
describe("Divider", () => {
|
||||||
|
it("should render correctly", () => {
|
||||||
|
const wrapper = render(<Divider />);
|
||||||
|
|
||||||
|
expect(() => wrapper.unmount()).not.toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("ref should be forwarded", () => {
|
||||||
|
const ref = React.createRef<HTMLDivElement>();
|
||||||
|
|
||||||
|
render(<Divider ref={ref} />);
|
||||||
|
expect(ref.current).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should work with x and y", () => {
|
||||||
|
let x = 2;
|
||||||
|
let y = 4;
|
||||||
|
const {container} = render(<Divider x={x} y={4} />);
|
||||||
|
|
||||||
|
expect(container.firstChild).toHaveStyle(`margin: ${getMargin(x / 2)} ${getMargin(y / 2)}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should support float x & y", () => {
|
||||||
|
let x = 2.5;
|
||||||
|
let y = 4.5;
|
||||||
|
const {container} = render(<Divider x={x} y={4.5} />);
|
||||||
|
|
||||||
|
expect(container.firstChild).toHaveStyle(`margin: ${getMargin(x / 2)} ${getMargin(y / 2)}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
3
packages/components/divider/clean-package.config.json
Normal file
3
packages/components/divider/clean-package.config.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{ "replace": { "main": "dist/index.cjs.js", "module": "dist/index.esm.js",
|
||||||
|
"types": "dist/index.d.ts", "exports": { ".": { "import": "./dist/index.esm.js",
|
||||||
|
"require": "./dist/index.cjs.js" }, "./package.json": "./package.json" } } }
|
||||||
49
packages/components/divider/package.json
Normal file
49
packages/components/divider/package.json
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"name": "@nextui-org/divider",
|
||||||
|
"version": "1.0.0-beta.11",
|
||||||
|
"description": "Dividers are used to visually separate content in a list or group.",
|
||||||
|
"keywords": [
|
||||||
|
"divider"
|
||||||
|
],
|
||||||
|
"author": "Junior Garcia <jrgarciadev@gmail.com>",
|
||||||
|
"homepage": "https://nextui.org",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "src/index.ts",
|
||||||
|
"sideEffects": false,
|
||||||
|
"files": [
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/nextui-org/nextui.git",
|
||||||
|
"directory": "packages/components/divider"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/nextui-org/nextui/issues"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsup src/index.ts --format=esm,cjs --dts",
|
||||||
|
"dev": "yarn build:fast -- --watch",
|
||||||
|
"clean": "rimraf dist .turbo",
|
||||||
|
"typecheck": "tsc --noEmit",
|
||||||
|
"build:fast": "tsup src/index.ts --format=esm,cjs",
|
||||||
|
"prepack": "clean-package",
|
||||||
|
"postpack": "clean-package restore"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">=16.8.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nextui-org/text": "workspace:*",
|
||||||
|
"@nextui-org/system": "workspace:*",
|
||||||
|
"@nextui-org/shared-utils": "workspace:*",
|
||||||
|
"@nextui-org/dom-utils": "workspace:*"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"clean-package": "2.1.1",
|
||||||
|
"react": "^17.0.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
packages/components/divider/src/divider.styles.ts
Normal file
7
packages/components/divider/src/divider.styles.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import {styled} from "@nextui-org/system";
|
||||||
|
|
||||||
|
export const StyledDivider = styled("div", {
|
||||||
|
width: "100%",
|
||||||
|
maxWidth: "100%",
|
||||||
|
position: "relative",
|
||||||
|
});
|
||||||
49
packages/components/divider/src/divider.tsx
Normal file
49
packages/components/divider/src/divider.tsx
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import {forwardRef} from "@nextui-org/system";
|
||||||
|
import {useDOMRef} from "@nextui-org/dom-utils";
|
||||||
|
import {clsx, __DEV__} from "@nextui-org/shared-utils";
|
||||||
|
import {Text} from "@nextui-org/text";
|
||||||
|
|
||||||
|
import {StyledDivider} from "./divider.styles";
|
||||||
|
import {UseDividerProps, useDivider} from "./use-divider";
|
||||||
|
|
||||||
|
export interface DividerProps extends UseDividerProps {}
|
||||||
|
|
||||||
|
const Divider = forwardRef<DividerProps, "div">((props, ref) => {
|
||||||
|
const {css, children, dividerCss, alignCss, textProps, className, ...otherProps} =
|
||||||
|
useDivider(props);
|
||||||
|
|
||||||
|
const domRef = useDOMRef(ref);
|
||||||
|
|
||||||
|
const {css: textCss, ...otherTextProps} = textProps;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<StyledDivider
|
||||||
|
ref={domRef}
|
||||||
|
className={clsx("nextui-divider", className)}
|
||||||
|
css={{
|
||||||
|
...dividerCss,
|
||||||
|
...css,
|
||||||
|
}}
|
||||||
|
role="separator"
|
||||||
|
{...otherProps}
|
||||||
|
>
|
||||||
|
{children && (
|
||||||
|
<Text
|
||||||
|
css={{
|
||||||
|
...alignCss,
|
||||||
|
...textCss,
|
||||||
|
}}
|
||||||
|
{...otherTextProps}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</StyledDivider>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (__DEV__) {
|
||||||
|
Divider.displayName = "NextUI.Divider";
|
||||||
|
}
|
||||||
|
|
||||||
|
Divider.toString = () => ".nextui-divider";
|
||||||
|
|
||||||
|
export default Divider;
|
||||||
5
packages/components/divider/src/index.ts
Normal file
5
packages/components/divider/src/index.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// export types
|
||||||
|
export type {DividerProps} from "./divider";
|
||||||
|
|
||||||
|
// export component
|
||||||
|
export {default as Divider} from "./divider";
|
||||||
76
packages/components/divider/src/use-divider.ts
Normal file
76
packages/components/divider/src/use-divider.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import {useMemo} from "react";
|
||||||
|
import {HTMLNextUIProps, CSS} from "@nextui-org/system";
|
||||||
|
import {TextProps} from "@nextui-org/text";
|
||||||
|
import {DividerAlign, getMargin} from "@nextui-org/shared-utils";
|
||||||
|
|
||||||
|
export interface UseDividerProps extends HTMLNextUIProps<"div"> {
|
||||||
|
/**
|
||||||
|
* x-axis spacing
|
||||||
|
* @default 0
|
||||||
|
*/
|
||||||
|
x?: number;
|
||||||
|
/**
|
||||||
|
* y-axis spacing
|
||||||
|
* @default 0
|
||||||
|
*/
|
||||||
|
y?: number;
|
||||||
|
/**
|
||||||
|
* Divider height in pixels
|
||||||
|
* @default 1
|
||||||
|
*/
|
||||||
|
height?: CSS["height"];
|
||||||
|
/**
|
||||||
|
* Divider background color
|
||||||
|
* @default "border"
|
||||||
|
*/
|
||||||
|
color?: CSS["color"];
|
||||||
|
/**
|
||||||
|
* Divider text children color
|
||||||
|
*/
|
||||||
|
textProps?: TextProps;
|
||||||
|
/**
|
||||||
|
* Divider alignment
|
||||||
|
* @default center
|
||||||
|
*/
|
||||||
|
align?: DividerAlign;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useDivider(props: UseDividerProps) {
|
||||||
|
const {
|
||||||
|
x = 0,
|
||||||
|
y = 0,
|
||||||
|
align = "center",
|
||||||
|
height = 1,
|
||||||
|
color = "$border",
|
||||||
|
textProps = {},
|
||||||
|
...otherProps
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
const alignCss = useMemo(() => {
|
||||||
|
if (!align || align === "center") return {};
|
||||||
|
if (align === "left" || align === "start") {
|
||||||
|
return {transform: "translateY(-50%)", left: "7%"};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
transform: "translateY(-50%)",
|
||||||
|
left: "auto",
|
||||||
|
right: "7%",
|
||||||
|
};
|
||||||
|
}, [align]);
|
||||||
|
|
||||||
|
const dividerCss = useMemo(() => {
|
||||||
|
const top = y ? getMargin(y / 2) : 0;
|
||||||
|
const left = x ? getMargin(x / 2) : 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
backgroundColor: color,
|
||||||
|
margin: `${top} ${left}`,
|
||||||
|
height: `calc(${height} * 1px)`,
|
||||||
|
};
|
||||||
|
}, [x, y, color]);
|
||||||
|
|
||||||
|
return {dividerCss, alignCss, textProps, ...otherProps};
|
||||||
|
}
|
||||||
|
|
||||||
|
export type UseDividerReturn = ReturnType<typeof useDivider>;
|
||||||
11
packages/components/divider/stories/divider.stories.tsx
Normal file
11
packages/components/divider/stories/divider.stories.tsx
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {Meta} from "@storybook/react";
|
||||||
|
|
||||||
|
import {Divider} from "../src";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: "Layout/Divider",
|
||||||
|
component: Divider,
|
||||||
|
} as Meta;
|
||||||
|
|
||||||
|
export const Default = () => <Divider />;
|
||||||
9
packages/components/divider/tsconfig.json
Normal file
9
packages/components/divider/tsconfig.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"paths": {
|
||||||
|
"@stitches/react": ["../../../node_modules/@stitches/react"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["src", "index.ts"]
|
||||||
|
}
|
||||||
13
packages/components/divider/tsup.config.ts
Normal file
13
packages/components/divider/tsup.config.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import {defineConfig} from "tsup";
|
||||||
|
import {findUpSync} from "find-up";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
clean: true,
|
||||||
|
minify: false,
|
||||||
|
treeshake: false,
|
||||||
|
format: ["cjs", "esm"],
|
||||||
|
outExtension(ctx) {
|
||||||
|
return {js: `.${ctx.format}.js`};
|
||||||
|
},
|
||||||
|
inject: process.env.JSX ? [findUpSync("react-shim.js")!] : undefined,
|
||||||
|
});
|
||||||
@ -1,5 +1,6 @@
|
|||||||
import type {HTMLNextUIProps} from "@nextui-org/system";
|
import type {HTMLNextUIProps} from "@nextui-org/system";
|
||||||
|
|
||||||
|
import {getMargin} from "@nextui-org/shared-utils";
|
||||||
import {useMemo} from "react";
|
import {useMemo} from "react";
|
||||||
|
|
||||||
export interface UseSpacerProps extends HTMLNextUIProps<"span"> {
|
export interface UseSpacerProps extends HTMLNextUIProps<"span"> {
|
||||||
@ -17,10 +18,6 @@ export interface UseSpacerProps extends HTMLNextUIProps<"span"> {
|
|||||||
inline?: boolean;
|
inline?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const getMargin = (num: number): string => {
|
|
||||||
return `calc(${num * 15.25}pt + 1px * ${num - 1})`;
|
|
||||||
};
|
|
||||||
|
|
||||||
export function useSpacer(props: UseSpacerProps) {
|
export function useSpacer(props: UseSpacerProps) {
|
||||||
const {x, y, inline = false, ...otherProps} = props;
|
const {x, y, inline = false, ...otherProps} = props;
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import {clsx, __DEV__, isNormalColor} from "@nextui-org/shared-utils";
|
|||||||
|
|
||||||
import {StyledText} from "./text.styles";
|
import {StyledText} from "./text.styles";
|
||||||
|
|
||||||
export interface TextChildProps extends Omit<HTMLNextUIProps<"p">, "color"> {
|
export interface TextChildProps extends HTMLNextUIProps<"p"> {
|
||||||
tag: keyof JSX.IntrinsicElements;
|
tag: keyof JSX.IntrinsicElements;
|
||||||
/**
|
/**
|
||||||
* Text color.
|
* Text color.
|
||||||
|
|||||||
@ -53,7 +53,7 @@ export type PropsOf<T extends As> = React.ComponentPropsWithoutRef<T> & {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type HTMLNextUIProps<T extends As, K extends object = {}> = Omit<
|
export type HTMLNextUIProps<T extends As, K extends object = {}> = Omit<
|
||||||
Omit<PropsOf<T>, "ref"> & {
|
Omit<PropsOf<T>, "ref" | "color"> & {
|
||||||
as?: As;
|
as?: As;
|
||||||
css?: CSS;
|
css?: CSS;
|
||||||
},
|
},
|
||||||
|
|||||||
3
packages/utilities/shared-utils/src/dimensions.ts
Normal file
3
packages/utilities/shared-utils/src/dimensions.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export const getMargin = (num: number): string => {
|
||||||
|
return `calc(${num * 15.25}pt + 1px * ${num - 1})`;
|
||||||
|
};
|
||||||
@ -7,3 +7,4 @@ export * from "./prop-types";
|
|||||||
export * from "./color";
|
export * from "./color";
|
||||||
export * from "./object";
|
export * from "./object";
|
||||||
export * from "./text";
|
export * from "./text";
|
||||||
|
export * from "./dimensions";
|
||||||
|
|||||||
@ -9,4 +9,11 @@ describe("{{capitalize componentName}}", () => {
|
|||||||
|
|
||||||
expect(() => wrapper.unmount()).not.toThrow();
|
expect(() => wrapper.unmount()).not.toThrow();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("ref should be forwarded", () => {
|
||||||
|
const ref = React.createRef<HTMLDivElement>();
|
||||||
|
|
||||||
|
render(<{capitalize componentName}} ref={ref} />);
|
||||||
|
expect(ref.current).not.toBeNull();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
17
pnpm-lock.yaml
generated
17
pnpm-lock.yaml
generated
@ -365,6 +365,23 @@ importers:
|
|||||||
clean-package: 2.1.1
|
clean-package: 2.1.1
|
||||||
react: 17.0.2
|
react: 17.0.2
|
||||||
|
|
||||||
|
packages/components/divider:
|
||||||
|
specifiers:
|
||||||
|
'@nextui-org/dom-utils': workspace:*
|
||||||
|
'@nextui-org/shared-utils': workspace:*
|
||||||
|
'@nextui-org/system': workspace:*
|
||||||
|
'@nextui-org/text': workspace:*
|
||||||
|
clean-package: 2.1.1
|
||||||
|
react: ^17.0.2
|
||||||
|
dependencies:
|
||||||
|
'@nextui-org/dom-utils': link:../../utilities/dom-utils
|
||||||
|
'@nextui-org/shared-utils': link:../../utilities/shared-utils
|
||||||
|
'@nextui-org/system': link:../../core/system
|
||||||
|
'@nextui-org/text': link:../text
|
||||||
|
devDependencies:
|
||||||
|
clean-package: 2.1.1
|
||||||
|
react: 17.0.2
|
||||||
|
|
||||||
packages/components/grid:
|
packages/components/grid:
|
||||||
specifiers:
|
specifiers:
|
||||||
'@nextui-org/dom-utils': workspace:*
|
'@nextui-org/dom-utils': workspace:*
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user