Skip to content

Commit

Permalink
fix(build): ship unminified
Browse files Browse the repository at this point in the history
chore(docs): update installation docs with frameworks examples
  • Loading branch information
LexSwed committed Dec 27, 2022
1 parent d94f6a0 commit 46f0d65
Show file tree
Hide file tree
Showing 13 changed files with 366 additions and 236 deletions.
338 changes: 169 additions & 169 deletions package-lock.json

Large diffs are not rendered by default.

11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
"description": "UI library for Fxtrot initiatives",
"version": "0.0.1",
"license": "Apache-2.0",
"type": "module",
"types": "dist/types/index.d.ts",
"main": "./dist/fxtrot-ui.umd.js",
"main": "./dist/fxtrot-ui.cjs",
"module": "./dist/fxtrot-ui.es.js",
"exports": {
".": {
"import": "./dist/fxtrot-ui.es.js",
"require": "./dist/fxtrot-ui.umd.js",
"require": "./dist/fxtrot-ui.cjs",
"types": "./dist/types/index.d.ts"
},
"./tailwind.cjs": "./dist/tailwind.preset.cjs",
Expand Down Expand Up @@ -71,11 +72,11 @@
"@stitches/react": "^1.2.8",
"@types/glob": "^8.0.0",
"@types/jest": "^29.2.4",
"@types/node": "^18.11.17",
"@types/node": "^18.11.18",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.10",
"@typescript-eslint/eslint-plugin": "^5.47.0",
"@typescript-eslint/parser": "^5.47.0",
"@typescript-eslint/eslint-plugin": "^5.47.1",
"@typescript-eslint/parser": "^5.47.1",
"@vitejs/plugin-react": "^3.0.0",
"autoprefixer": "^10.4.13",
"eslint": "^8.30.0",
Expand Down
1 change: 1 addition & 0 deletions src/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@ export {
useLatest,
useOnClickOutside,
} from './utils/hooks';
export type { Theme } from './theme-provider/types';
63 changes: 47 additions & 16 deletions src/lib/tabs/tabs.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,30 @@
flex-flow: row;
border-block-end: 2px solid theme('colors.outline/0.2');
}
/* position: relative;
&:after {
position: absolute;
content: '';
background-color: theme('colors.outline/0.2');
}
&[data-orientation='vertical'] {
flex-flow: column;
&:after {
width: 2px;
height: calc(100% - theme('spacing.2'));
inset-block-start: theme('spacing.2');
inset-inline-end: 0;
}
}
&[data-orientation='horizontal'] {
flex-flow: row;
&:after {
height: 2px;
width: calc(100% - theme('spacing.2') * 2);
inset-block-end: 0;
inset-inline-start: theme('spacing.2');
}
} */
}

.trigger {
Expand All @@ -28,25 +52,32 @@
content: '';
background-color: transparent;
transition: 0.14s ease-in-out;
transform-origin: center;
}

&[data-orientation='horizontal']:after {
inset-inline-start: 0;
inset-block-end: 0;
transform-origin: bottom;
width: 100%;
height: 2px;
scale: var(--scale) 1;
translate: 0 100%;
&[data-orientation='horizontal'] {
&:first-child {
margin-inline-start: calc(-1 * theme('spacing[1.5]'));
}
&:after {
inset-inline-start: 0;
inset-block-end: -2px;
width: 100%;
height: 2px;
scale: var(--scale) 1;
}
}
&[data-orientation='vertical']:after {
inset-block-end: 0;
inset-inline-end: 0;
width: 2px;
height: 100%;
transform-origin: end;
scale: 1 calc(var(--scale) * 0.8);
translate: 100% 0;
&[data-orientation='vertical'] {
&:first-child {
margin-block-start: calc(-1 * theme('spacing[1.5]'));
}
&:after {
inset-block-end: 0;
inset-inline-end: -2px;
width: 2px;
height: 100%;
scale: 1 calc(var(--scale) * 0.8);
}
}

&:where(:not([aria-selected='true'])) {
Expand Down
4 changes: 2 additions & 2 deletions src/lib/text-field/text-field.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

@layer lib {
.text-field {
&[type='number']::-webkit-inner-spin-button,
/* &[type='number']::-webkit-inner-spin-button,
&[type='number']::-webkit-outer-spin-button {
-webkit-appearance: inner-spin-button !important;
appearance: inner-spin-button !important;
}
} */

/** set same sizing/position styles as for custom ones */
&[type='date']::-webkit-calendar-picker-indicator,
Expand Down
1 change: 0 additions & 1 deletion src/pages-helpers/CopyButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ export const CopyButton = ({ text, label = 'Copy code' }: Props) => {
icon={copied ? CheckIcon : ClipboardIcon}
onClick={() => copy(text)}
variant="flat"
size="sm"
/>
);
};
10 changes: 7 additions & 3 deletions src/pages-helpers/MdxProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,20 @@ import { MainLayout } from './MainLayout';
import { Code } from './Code';
import { Playground } from './Playground';

const Pre: React.FC<{ preview: boolean; children?: React.ReactNode }> = ({ children, preview = false }) => {
const Pre: React.FC<{ preview: boolean; children?: React.ReactNode; filename?: string }> = ({
children,
filename,
preview = false,
}) => {
if (!(React.Children.only(children) && React.isValidElement<{ children: string; className?: string }>(children))) {
return null;
}
const code = children.props.children.trim();
const language = children.props.className?.replace('language-', '') || '';
if (preview) {
return <Playground code={code} language={language} />;
return <Playground code={code} language={language} fileName={filename} />;
}
return <MultilineCode code={code} language={language} />;
return <MultilineCode code={code} language={language} fileName={filename} />;
};

const AnchoredHeading = ({ id, children, ...props }: any) => {
Expand Down
74 changes: 49 additions & 25 deletions src/pages-helpers/MultilineCode.tsx
Original file line number Diff line number Diff line change
@@ -1,39 +1,63 @@
import Highlight, { defaultProps, Language } from 'prism-react-renderer';
import { clsx } from 'clsx';
import theme from 'prism-react-renderer/themes/nightOwl';
import { DiReact } from 'react-icons/di';
import { Icon, Row, Text, ThemeProvider, Theme } from '@fxtrot/ui';
import { CopyButton } from './CopyButton';

type Props = {
code: string;
language: string;
lineNumber?: boolean;
fileName?: string;
};

export const MultilineCode = ({ code, language, lineNumber = true }: Props) => {
export const MultilineCode = ({ code, language, fileName, lineNumber = true }: Props) => {
return (
<Highlight {...defaultProps} theme={theme} code={code} language={language as Language}>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<section className="group/code-wrapper relative">
<pre className={clsx('overflow-scroll rounded-sm p-3 text-start my-1', className)} style={style}>
{tokens.map((line, i) => {
const lineProps = getLineProps({ line, key: i });
return (
<line {...lineProps} className={clsx('table-row text-sm', lineProps.className)}>
{lineNumber && <span className="table-cell select-none text-end opacity-50 pr-4">{i + 1}</span>}
<span className="table-cell">
{line.map((token, key) => (
<span key={key} {...getTokenProps({ token, key })} />
))}
</span>
</line>
);
})}
</pre>
<div className="duration-240 absolute top-2 right-2 text-inverse-on-surface opacity-0 transition-opacity delay-500 group-hover/code-wrapper:opacity-100 group-hover/code-wrapper:delay-[0s]">
<CopyButton text={code} />
</div>
</section>
)}
</Highlight>
<ThemeProvider theme={codeTheme}>
<Highlight {...defaultProps} theme={theme} code={code} language={language as Language}>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<section className="group/code-wrapper relative overflow-scroll rounded-sm my-1">
{fileName ? (
<Row style={style} main="start" className="sticky top-0">
<Row cross="center" gap="sm" className="border-t-2 border-t-primary bg-surface p-2">
<Icon as={DiReact} />
<Text textStyle="mono-md">{fileName}</Text>
</Row>
</Row>
) : null}
<pre className={clsx('p-3 text-start font-mono', className)} style={style}>
{tokens.map((line, i) => {
const lineProps = getLineProps({ line, key: i });
return (
<line {...lineProps} className={clsx('table-row text-sm', lineProps.className)}>
{lineNumber && <span className="table-cell select-none text-end opacity-50 pr-4">{i + 1}</span>}
<span className="table-cell">
{line.map((token, key) => (
<span key={key} {...getTokenProps({ token, key })} />
))}
</span>
</line>
);
})}
</pre>
<div className="duration-240 absolute top-0 right-0 text-inverse-on-surface opacity-0 transition-opacity delay-500 group-focus-within/code-wrapper:opacity-100 group-focus-within/code-wrapper:delay-[0s] group-hover/code-wrapper:opacity-100 group-hover/code-wrapper:delay-[0s]">
<CopyButton text={code} />
</div>
</section>
)}
</Highlight>
</ThemeProvider>
);
};

const codeTheme: Theme = {
colors: {
'primary': 'hsl(221deg 100% 75%)',
'background': 'hsl(207deg 95% 8%)',
'on-background': 'hsl(217deg 34% 88%)',
'surface': 'hsl(207deg 45% 10%)',
'on-surface': 'hsl(217deg 34% 88%)',
'outline': 'hsl(217deg 5% 40%)',
},
};
1 change: 1 addition & 0 deletions src/pages-helpers/Playground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { components } from './MdxProvider';
type Props = {
code: string;
language: string;
fileName?: string;
};

export const Playground = ({ code, language }: Props) => {
Expand Down
5 changes: 1 addition & 4 deletions src/pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,7 @@ export default function App(props: AppProps) {
},
]}
/>
<ThemeProvider
className={[Inter.variable, FiraCode.variable].join(' ')}
theme={{ fontFamily: { sans: Inter.style.fontFamily, mono: FiraCode.style.fontFamily } }}
>
<ThemeProvider theme={{ fontFamily: { sans: Inter.style.fontFamily, mono: FiraCode.style.fontFamily } }}>
<MdxProvider>
<Component {...pageProps} />
</MdxProvider>
Expand Down
4 changes: 4 additions & 0 deletions src/pages/components/Tabs.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,7 @@ Control the orientation of tabs with [Flex](/components/Flex)'s `flow` prop:
</Tabs.Content>
</Tabs>
```

## URL sync

Often, you want to preserve selected tab between page reloads. There's no better way than using URL Search Params for this.
88 changes: 77 additions & 11 deletions src/pages/installation.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,99 @@
title: Installation and setup
---

# Setup
# Installation and setup

Install component library in your React project

```bash
npm install @fxtrot/ui
```

Wrap your application in `ThemeProvider`:
<Tabs defaultValue="cra" className="mt-8">
<Tabs.List>
<Tabs.Trigger value="cra">Create React App / Vite</Tabs.Trigger>
<Tabs.Trigger value="next">Next.js</Tabs.Trigger>
<Tabs.Trigger value="remix">Remix</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="cra">
Import styles and wrap your application in `ThemeProvider`:

```jsx
```jsx filename="src/index.jsx"
import { ThemeProvider } from '@fxtrot/ui';

const App = () => <ThemeProvider>{/* Your application here */}</ThemeProvider>;
import '@fxtrot/ui/style.css';

ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<ThemeProvider>
<App />
</ThemeProvider>
</React.StrictMode>
);
```

`ThemeProvider` makes sure all portals are rendered in correct place and themed appropriately.
</Tabs.Content>
<Tabs.Content value="next">
Import styles and wrap your application in `ThemeProvider`:

```jsx filename="app/layout.tsx"
import { ThemeProvider } from '@fxtrot/ui';

`@fxtrot/ui` does not ship fonts, so you should install them yourself, for example including `link` into `<head>` using Google Fonts:
import '@fxtrot/ui/style.css';

```html
<link
href="https://fonts.googleapis.com/css2?family=Noto+Sans+Display:wght@100;200;300;400;500;600;700;800;900&display=swap"
rel="stylesheet"
/>
export default function RootLayout({ children }) {
return (
<html>
<head />
<body>
<ThemeProvider>{children}</ThemeProvider>
</body>
</html>
);
}
```

</Tabs.Content>
<Tabs.Content value="remix">
Import styles and wrap your application in `ThemeProvider`:

```jsx filename="app/root.tsx"
import { ThemeProvider } from '@fxtrot/ui';

import fxtrotStyles from '@fxtrot/ui/style.css';

export function links() {
return [{ rel: 'stylesheet', href: fxtrotStyles }];
}

export default function App() {
return (
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<Meta />
<Links />
</head>
<body>
{/* Wrap the app in ThemeProvider */}
<ThemeProvider>
<Outlet />
</ThemeProvider>
<ScrollRestoration />
<Scripts />
{process.env.NODE_ENV === 'development' && <LiveReload />}
</body>
</html>
);
}
```

</Tabs.Content>
</Tabs>

In addition to providing the default theme, `ThemeProvider` ensures all components get necessary context parameters.

## Usage

Use components in your app.
Expand Down
Loading

0 comments on commit 46f0d65

Please sign in to comment.