diff --git a/apps/website/src/components/menu/menu.tsx b/apps/website/src/components/menu/menu.tsx index df24ff734..4066b0d9f 100644 --- a/apps/website/src/components/menu/menu.tsx +++ b/apps/website/src/components/menu/menu.tsx @@ -30,6 +30,10 @@ export const Menu = component$(({ onClose$ }) => { { label: 'Radio', path: `/docs/${appState.theme.toLowerCase()}/radio` }, { label: 'Popover', path: `/docs/${appState.theme.toLowerCase()}/popover` }, { label: 'Select', path: `/docs/${appState.theme.toLowerCase()}/select` }, + { + label: 'Spinner', + path: `/docs/${appState.theme.toLowerCase()}/spinner`, + }, { label: 'Tabs', path: `/docs/${appState.theme.toLowerCase()}/tabs` }, { label: 'Toast', path: `/docs/${appState.theme.toLowerCase()}/toast` }, { label: 'Toggle', path: `/docs/${appState.theme.toLowerCase()}/toggle` }, diff --git a/apps/website/src/routes/docs/daisy/spinner/index.tsx b/apps/website/src/routes/docs/daisy/spinner/index.tsx new file mode 100644 index 000000000..b052561b1 --- /dev/null +++ b/apps/website/src/routes/docs/daisy/spinner/index.tsx @@ -0,0 +1,55 @@ +import { component$, useStylesScoped$ } from '@builder.io/qwik'; +import { Spinner } from '@qwik-ui/theme-daisy'; + +export default component$(() => { + useStylesScoped$(` + h1 { margin: 0.5rem 0 1rem 0; padding-top: 1rem; font-weight: bold; } + p { margin-bottom: 0.5rem; } + `); + return ( + <> +

This is the documentation for the Spinner

+ +

Spinner Example

+ + + +

Size

+

+ Spinner are sized based on the font size. To change their size, set the{' '} + font-size property on the Spinner itself or on a parent element + as shown below. +

+ + + + + +

Track Width

+

+ The width of the Spinner track can be changed by the property{' '} + width. +

+ + + +

Color

+

+ The colors of Spinner can be changed by the properties{' '} + indicatorColor and trackColor. +

+ + +

Speed

+

+ The speed of the Spinner can be changed by the property speed. +

+ + + ); +}); diff --git a/apps/website/src/routes/docs/headless/spinner/index.tsx b/apps/website/src/routes/docs/headless/spinner/index.tsx new file mode 100644 index 000000000..d93092911 --- /dev/null +++ b/apps/website/src/routes/docs/headless/spinner/index.tsx @@ -0,0 +1,55 @@ +import { component$, useStylesScoped$ } from '@builder.io/qwik'; +import { Spinner } from '@qwik-ui/headless'; + +export default component$(() => { + useStylesScoped$(` + h1 { margin: 0.5rem 0 1rem 0; padding-top: 1rem; font-weight: bold; } + p { margin-bottom: 0.5rem; } + `); + return ( + <> +

This is the documentation for the Spinner

+ +

Spinner Example

+ + + +

Size

+

+ Spinner are sized based on the font size. To change their size, set the{' '} + font-size property on the Spinner itself or on a parent element + as shown below. +

+ + + + + +

Track Width

+

+ The width of the Spinner track can be changed by the property{' '} + width. +

+ + + +

Color

+

+ The colors of Spinner can be changed by the properties{' '} + indicatorColor and trackColor. +

+ + +

Speed

+

+ The speed of the Spinner can be changed by the property speed. +

+ + + ); +}); diff --git a/packages/daisy/src/components/spinner/spinner.tsx b/packages/daisy/src/components/spinner/spinner.tsx new file mode 100644 index 000000000..7029b8e6b --- /dev/null +++ b/packages/daisy/src/components/spinner/spinner.tsx @@ -0,0 +1,19 @@ +import { component$ } from '@builder.io/qwik'; +import { Spinner as HeadlessSpinner } from '@qwik-ui/headless'; + +export type SpinnerProps = { + class?: string; + style?: string; + width?: string; + trackColor?: string; + indicatorColor?: string; + speed?: string; +}; + +export const Spinner = component$((props: SpinnerProps) => { + return ( + <> + + + ); +}); diff --git a/packages/daisy/src/index.ts b/packages/daisy/src/index.ts index af89ede7b..6b930e395 100644 --- a/packages/daisy/src/index.ts +++ b/packages/daisy/src/index.ts @@ -5,6 +5,7 @@ export * from './components/button-group/button-group'; export * from './components/card'; export * from './components/collapse/collapse'; export * from './components/drawer/drawer'; +export * from './components/spinner/spinner'; export * from './components/popover/popover'; export * from './components/rating/rating'; export * from './components/tabs'; diff --git a/packages/headless/src/components/spinner/spinner.css b/packages/headless/src/components/spinner/spinner.css new file mode 100644 index 000000000..82ba72f00 --- /dev/null +++ b/packages/headless/src/components/spinner/spinner.css @@ -0,0 +1,44 @@ +.spinner-container { + display: inline-flex; + width: 1em; + height: 1em; +} + +.spinner { + flex: 1 1 auto; + height: 100%; + width: 100%; +} + +.track, +.indicator { + fill: none; + cx: 0.5em; + cy: 0.5em; + transform-origin: 50% 50%; +} + +.track { + transform-origin: 0 0; + mix-blend-mode: multiply; +} + +.indicator { + stroke-linecap: round; + stroke-dasharray: 150% 75%; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + stroke-dasharray: 0.01em, 2.75em; + } + 50% { + transform: rotate(450deg); + stroke-dasharray: 1.375em, 1.375em; + } + 100% { + transform: rotate(1080deg); + stroke-dasharray: 0.01em, 2.75em; + } +} diff --git a/packages/headless/src/components/spinner/spinner.tsx b/packages/headless/src/components/spinner/spinner.tsx new file mode 100644 index 000000000..d78fc2d60 --- /dev/null +++ b/packages/headless/src/components/spinner/spinner.tsx @@ -0,0 +1,47 @@ +import { component$, useStylesScoped$ } from '@builder.io/qwik'; +import { clsq } from '@qwik-ui/shared'; +import styles from './spinner.css?inline'; + +export type SpinnerProps = { + class?: string; + style?: string; + width?: string; + trackColor?: string; + indicatorColor?: string; + speed?: string; +}; + +export const Spinner = component$((props: SpinnerProps) => { + const { + style, + class: classNames, + width = '2px', + trackColor = '#8080803f', + indicatorColor = '#006ce9', + speed = '2s', + } = props; + useStylesScoped$(styles); + return ( +
+ + + + +
+ ); +}); diff --git a/packages/headless/src/index.ts b/packages/headless/src/index.ts index da12653e0..5da5250f1 100644 --- a/packages/headless/src/index.ts +++ b/packages/headless/src/index.ts @@ -6,6 +6,7 @@ export * from './components/card'; export * from './components/pagination/pagination'; export * from './components/collapse/collapse'; export * from './components/drawer'; +export * from './components/spinner/spinner'; export * from './components/menu/menu'; export * from './components/popover'; export * from './components/rating/rating';