Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v8 Rewrite #1043

Closed
wants to merge 69 commits into from
Closed
Show file tree
Hide file tree
Changes from 41 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
e507904
Remove old carousel package, add basic children rendering and test stubs
Feb 1, 2024
efc3871
Add next and previous slide hooks
Feb 3, 2024
d09e8bf
Next and previous buttons by slide width
melvin-chen Feb 7, 2024
2658ca0
Add autoplay, fix scroll distance
melvin-chen Feb 8, 2024
a6c7d4d
Add back index.tsx
melvin-chen Feb 8, 2024
f0c08ee
Scroll by screen width
melvin-chen Feb 8, 2024
111c8af
Refactor scroll handling based on page indices
melvin-chen Feb 13, 2024
5fae4f2
Fix scroll by screen width, update jsx in tsconfig
melvin-chen Feb 13, 2024
dd02cf9
Set index for on button clicks
melvin-chen Feb 14, 2024
ca23f2b
Wrap around, fix index issue, fix autoplay bug
melvin-chen Feb 14, 2024
3724ab7
Use es2022 methods
melvin-chen Feb 16, 2024
13624e3
Add api docs
melvin-chen Feb 16, 2024
0556406
Add examples into docs
melvin-chen Feb 16, 2024
90160fa
Add mock for css files
melvin-chen Feb 20, 2024
87577a0
Fix lint in mock
melvin-chen Feb 20, 2024
5eedae8
Fix style mock path, comment out tests
melvin-chen Feb 20, 2024
aa4669f
Cleanup tests
melvin-chen Feb 20, 2024
909e3a4
Add storybook test workflow
melvin-chen Feb 20, 2024
85438c0
Storybook test CI update
melvin-chen Feb 20, 2024
49e3429
Update storybook build command
melvin-chen Feb 20, 2024
d3d6e83
Test manually adding wait-on
melvin-chen Feb 21, 2024
7ebe168
update wait on tcp address
melvin-chen Feb 21, 2024
1db7dcc
update wait on tcp address
melvin-chen Feb 21, 2024
5bcf9ea
Add tests into storybook stories, update function for website examples
melvin-chen Feb 21, 2024
64437cc
Add focusable example
melvin-chen Feb 21, 2024
63031b8
Docs for methods and upgrade guide
melvin-chen Feb 22, 2024
ce84a45
Link v8 to docs
melvin-chen Feb 22, 2024
717f4d3
Go to index function
melvin-chen Feb 22, 2024
f3e55fe
use separate named component for custom render
melvin-chen Feb 23, 2024
50e3aab
Update test script for storybook testing, comment out cypress tests
melvin-chen Feb 26, 2024
d8eb4e0
Use matrix node version
melvin-chen Feb 26, 2024
83c8a14
Use all pnpm commands for storybook-tests
melvin-chen Feb 26, 2024
a910126
Use all yarn commands for storybook-tests
melvin-chen Feb 26, 2024
8225b60
Add pnpm action-steup line
melvin-chen Feb 26, 2024
54fc328
Add testing packages to devDependencies
melvin-chen Feb 26, 2024
e1ad237
Fix indefinite hang on wait
melvin-chen Feb 26, 2024
638b378
Remove cypress tests, remove cypress workflow, add to storybook inter…
melvin-chen Feb 26, 2024
bcf2cf1
Upgrade node versions, remove side effect, use named exports
melvin-chen Feb 28, 2024
3f4df56
Add side effects back in, use named export, add resize listener
melvin-chen Feb 28, 2024
2ab32e1
Add before/after slide hooks, docs, and tests
melvin-chen Feb 29, 2024
9bd5d8e
Add missing useeffect dependencies
melvin-chen Feb 29, 2024
bc36817
Rename prop type to capital, Remove buttons by default on demos, add …
melvin-chen Feb 29, 2024
495b25f
Add info about built in buttons into docs
melvin-chen Mar 1, 2024
c2e59d2
Round numbers to fix page indicator and scrolling bugs
melvin-chen Mar 1, 2024
b8ae41f
Cleanup CI and add chromatic
carbonrobot Mar 13, 2024
a2bd014
Need duplicate command for chromatic
carbonrobot Mar 13, 2024
3b433b7
Rename container class and improve doc page
carbonrobot Mar 13, 2024
6dfa9b7
Remove old storybook test workflow
carbonrobot Mar 13, 2024
8df4843
Use images instead of Formidable logos
carbonrobot Mar 13, 2024
9437cf8
Namespace css to avoid collisions
carbonrobot Mar 15, 2024
33a587f
Reduce demo image sizes
carbonrobot Mar 15, 2024
3394b93
Change layout of documentation
carbonrobot Mar 15, 2024
fa72093
Remove cypress leftovers
carbonrobot Mar 16, 2024
61033de
Add more slides for better testing
carbonrobot Mar 16, 2024
864bd24
Refactor effects and hooks
carbonrobot Mar 16, 2024
7df950d
Re-enable support for multiple width slides
carbonrobot Mar 16, 2024
4bbfa39
Create default page indicator styling
carbonrobot Mar 16, 2024
56f9915
Move styling API to container to avoid gap bug
carbonrobot Mar 16, 2024
2a6bdab
Add wraparound option to API
carbonrobot Mar 16, 2024
9ad5c30
Refactor measurements into hook
carbonrobot Mar 16, 2024
fb2337a
Recalculate dimensions on resize
carbonrobot Mar 16, 2024
7d030cd
Add swiping property
carbonrobot Mar 16, 2024
3b818da
Add nav buttons
carbonrobot Mar 16, 2024
356e710
Improve doc page main demo
carbonrobot Mar 16, 2024
5cacb02
Fix slide page count
carbonrobot Mar 17, 2024
db05774
Namespace to avoid conflicts with consumer app
carbonrobot Mar 17, 2024
623dee3
Cleanup and simplify hooks
carbonrobot Mar 17, 2024
1952505
Update website branding
carbonrobot Mar 17, 2024
8c14687
Add basic docs landing page
carbonrobot Mar 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "error",
"@typescript-eslint/no-unused-vars": ["error"],
"@typescript-eslint/no-var-requires": 0
"@typescript-eslint/no-var-requires": 0,
"react/react-in-jsx-scope": "off"
}
}
53 changes: 0 additions & 53 deletions .github/workflows/cypress.yml
carbonrobot marked this conversation as resolved.
Show resolved Hide resolved

This file was deleted.

25 changes: 25 additions & 0 deletions .github/workflows/storybook-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: 'Storybook Tests'
on: push
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/[email protected]
with:
version: 7
- uses: actions/setup-node@v4
with:
node-version: 18.x
- name: Install dependencies
run: pnpm install
- name: Install Playwright
run: npx playwright install --with-deps
- name: Build Storybook
run: pnpm build:storybook --quiet
- name: Serve Storybook and run tests
run: |
npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
"npx http-server packages/nuka/storybook-static --port 6006" \
"npx wait-on tcp:127.0.0.1:6006 && pnpm test:storybook"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,4 @@ cypress/screenshots
cypress/videos
/packages/nuka/cypress/screenshots
/packages/nuka/cypress/videos
/packages/nuka/storybook-static
2 changes: 1 addition & 1 deletion docs/api.mdx → docs/api-v7.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
sidebar_position: 3
---

# API
# API (v7 and Below)

## Carousel Props

Expand Down
7 changes: 7 additions & 0 deletions docs/api/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
sidebar_position: 3
---

# API (v8+)

Nuka v8 and above are completely rewritten with new props and might not be completely backwards compatable with v7.
47 changes: 47 additions & 0 deletions docs/api/methods.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
sidebar_position: 2
---

import { MethodsDemo } from '../../website/src/components/demos';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Methods

Nuka Carousel has a few exposed methods that allow the user to control certain parts of the carousel manually. These methods are accessed via a ref attached to the carousel.

```tsx title="MyComponent.tsx"
import { useRef } from 'react';
import Carousel, { SlideHandle } from 'nuka-carousel';

const MyComponent = () => {
const ref = useRef<SlideHandle>(null);

return (
<div>
<Carousel ref={ref}>...</Carousel>

<button onClick={() => ref.current.goBack()}>Back</button>
<button onClick={() => ref.current.goForward()}>Forward</button>
</div>
);
};
```

---

## Progression

The carousel can be advanced forward and backwards based on the `scrollDistance` defined from the props.

### `goForward()`

Advances the carousel forward by the given `scrollDistance`.

### `goBack()`

Advances the carousel backward by the given `scrollDistance`.

### Usage/Examples

<MethodsDemo />
155 changes: 155 additions & 0 deletions docs/api/options.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
---
sidebar_position: 1
---

import { BasicDemo } from '../../website/src/components/demos';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Options

## Autoplay

The carousel can advance on its own with a specified interval measured in milliseconds. An `autoplayInterval` without the `autoplay` prop being true will not do anything.

### Details

| Prop Name | Type | Default Value |
| :----------------- | :------ | :------------ |
| `autoplay` | boolean | `false` |
| `autoplayInterval` | number | `3000` |

### Example

<BasicDemo className="standard-demo" autoplay={true} />
carbonrobot marked this conversation as resolved.
Show resolved Hide resolved

---

## Scroll

How far the carousel should move when its goForward() and goBack() methods are called.

### Details

| Prop Name | Type | Default Value |
| :--------------- | :---------------------------- | :------------ |
| `scrollDistance` | "slide" \| number \| "screen" | `slide` |

Using a number will cause the carousel to scroll that many pixels each time.
Using "slide" will advance the carousel one slide each time.
Using "screen" will advance the carousel by the width of the visible carousel.
carbonrobot marked this conversation as resolved.
Show resolved Hide resolved

### Examples

<Tabs lazy>
<TabItem value="slide" label="Slide" default>
<p>
Default scroll by slide width. The scroll distance will automatically
update on the widths of the slides so you can have multiple widths for
each slide.
</p>
<BasicDemo className="slide-distance-demo" scrollDistance="slide" />
</TabItem>
<TabItem value="fixed" label="Fixed Distance (number)">
<p>
Scroll by a fixed distance measured in px. This example scrolls by 100px.
</p>
<BasicDemo className="fixed-distance-demo" scrollDistance={100} />
</TabItem>
<TabItem value="screen" label="Screen">
<p>
Scroll by the width of the "screen" or the container the carousel is in.
</p>
<BasicDemo className="screen=distance-demo" scrollDistance="screen" />
</TabItem>
</Tabs>

---

## Page Indicators
carbonrobot marked this conversation as resolved.
Show resolved Hide resolved

Indicators that show what page the carousel is on. These pages are calculated from the `scrollDistance` and have to be styled in addition to setting the `showPageIndicators` boolean to true.

### Details

| Prop Name | Type | Default Value |
| :------------------- | :----------------- | :------------ |
| `showPageIndicators` | boolean | `false` |
| `pageIndicatorProps` | object (see below) | see below |

#### `pageIndicatorProps` Details

| Prop Name | Type | Default Value |
| :------------------------------ | :----- | :------------ |
| `containerClassName` | string | `undefined` |
| `currentPageIndicatorClassName` | string | `undefined` |
| `pageIndicatorClassName` | string | `undefined` |

### Example

<BasicDemo
className="standard-demo"
showPageIndicators={true}
pageIndicatorProps={{
containerClassName: 'flex items-center justify-center py-4 gap-2',
pageIndicatorClassName:
'w-3 h-3 p-0 rounded-full bg-gray-200 border-none cursor-pointer hover:bg-pink-200',
currentPageIndicatorClassName: 'bg-pink-500 hover:bg-pink-500',
}}
scrollDistance="screen"
/>

carbonrobot marked this conversation as resolved.
Show resolved Hide resolved
---

## Wrapper Styling

Apply classNames to the `<div>` that contains the `children`. This is likely how you will determine the spacing between items in the carousel.

By default, this wrapper has `display: flex` applied.

### Details

| Prop Name | Type | Default Value |
| :----------------- | :----- | :------------ |
| `wrapperClassName` | string | `undefined` |

### Example

<BasicDemo className="standard-demo" wrapperClassName="gap-4" />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without showing the actual code used in the demo, this example is confusing. The description talks about applying a style to the wrapper, and although thats what we did here, we used gap-4 which alters the children of the wrapper which may confuse people into thinking we meant the wrapper of the slide and not of the carousel.

I recommend we consider an alternative name for this property that better describes what it will apply to. Consider something like carouselClassName or perhaps just the native className


---

## Before/After Slide

Functions that are invoked when the progression methods (goBack()/goForward()) are called or when carousel changes its scroll position.

### Details

| Prop Name | Type | Default Value |
| :------------ | :--------- | :------------ |
| `beforeSlide` | () => void | `undefined` |
| `afterSlide` | () => void | `undefined` |

beforeSlide: Runs a given function before scrolling when a progression method is called. It will also run right before the carousel registers that it has been scrolled on if manually scrolled.

afterSlide: Runs a given function after scrolling when a progression method is called or after manually scrolling.

### Example

This is a code usage example. Docusaurus will not run passed functions because the components are converted to static HTML at build time.

```tsx
<BasicDemo
beforeSlide={() => {
myCustomBeforeFunction();
}}
/>
```

```tsx
<BasicDemo
afterSlide={() => {
myCustomAfterFunction();
}}
/>
```
Loading
Loading