From 61bc92de6ec4fdecff023783e400a41b49e4afbe Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 9 May 2023 23:36:24 +0800 Subject: [PATCH] remove unnecessary select styles and configure storybook (#807) * remove unnecessary select styles and configure storybook * fix eslint * fix clippy --- apps/desktop/src-tauri/src/file.rs | 24 ++++++------ apps/storybook/.storybook/main.ts | 10 ++++- apps/storybook/.storybook/preview.ts | 1 + apps/storybook/package.json | 15 +++++--- apps/storybook/postcss.config.js | 6 +++ apps/storybook/tailwind.config.js | 1 + .../Layout/Sidebar/JobManager/Job.tsx | 2 +- .../library/locations/AddLocationDialog.tsx | 2 +- package.json | 2 + packages/config/package.json | 6 ++- packages/config/vite/index.ts | 1 - packages/ui/src/Input.stories.tsx | 27 ++++++++++++++ packages/ui/src/Input.tsx | 3 +- packages/ui/src/Select.stories.tsx | 35 ++++++++++++++++++ packages/ui/src/Select.tsx | 22 +++++------ packages/ui/style/tailwind.js | 10 ++--- pnpm-lock.yaml | Bin 704380 -> 723295 bytes 17 files changed, 122 insertions(+), 45 deletions(-) create mode 100644 apps/storybook/postcss.config.js create mode 100644 apps/storybook/tailwind.config.js create mode 100644 packages/ui/src/Input.stories.tsx create mode 100644 packages/ui/src/Select.stories.tsx diff --git a/apps/desktop/src-tauri/src/file.rs b/apps/desktop/src-tauri/src/file.rs index c51b95db2..78f592f88 100644 --- a/apps/desktop/src-tauri/src/file.rs +++ b/apps/desktop/src-tauri/src/file.rs @@ -63,21 +63,19 @@ pub async fn get_file_path_open_with_apps( }; #[cfg(target_os = "macos")] - let apps = { - unsafe { sd_desktop_macos::get_open_with_applications(&path.to_str().unwrap().into()) } - .as_slice() - .into_iter() - .map(|app| OpenWithApplication { - name: app.name.to_string(), - url: app.url.to_string(), - }) - .collect() - }; + return Ok(unsafe { + sd_desktop_macos::get_open_with_applications(&path.to_str().unwrap().into()) + } + .as_slice() + .into_iter() + .map(|app| OpenWithApplication { + name: app.name.to_string(), + url: app.url.to_string(), + }) + .collect()); #[cfg(not(target_os = "macos"))] - return Err(()); - - Ok(apps) + Err(()) } #[tauri::command(async)] diff --git a/apps/storybook/.storybook/main.ts b/apps/storybook/.storybook/main.ts index cbee039ce..2b8c7113b 100644 --- a/apps/storybook/.storybook/main.ts +++ b/apps/storybook/.storybook/main.ts @@ -16,7 +16,15 @@ const config: StorybookConfig = { addons: [ '@storybook/addon-links', '@storybook/addon-essentials', - '@storybook/addon-interactions' + '@storybook/addon-interactions', + { + name: '@storybook/addon-styling', + options: { + // Check out https://github.com/storybookjs/addon-styling/blob/main/docs/api.md + // For more details on this addon's options. + postCss: true + } + } ], framework: { name: '@storybook/react-vite', diff --git a/apps/storybook/.storybook/preview.ts b/apps/storybook/.storybook/preview.ts index 7c9e31bf9..03800253d 100644 --- a/apps/storybook/.storybook/preview.ts +++ b/apps/storybook/.storybook/preview.ts @@ -1,4 +1,5 @@ import type { Preview } from '@storybook/react'; +import '@sd/ui/style'; const preview: Preview = { parameters: { diff --git a/apps/storybook/package.json b/apps/storybook/package.json index 34dd796cf..767f9c907 100644 --- a/apps/storybook/package.json +++ b/apps/storybook/package.json @@ -1,30 +1,33 @@ { "name": "@sd/storybook", "private": true, - "version": "0.0.0", - "type": "module", "scripts": { "dev": "storybook dev -p 6006", "build-storybook": "storybook build" }, "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { "@storybook/addon-essentials": "^7.0.5", "@storybook/addon-interactions": "^7.0.5", "@storybook/addon-links": "^7.0.5", + "@storybook/addon-styling": "^1.0.6", "@storybook/blocks": "^7.0.5", "@storybook/react": "^7.0.5", "@storybook/react-vite": "^7.0.5", "@storybook/testing-library": "^0.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { "@sd/config": "workspace:*", + "@sd/ui": "workspace:*", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@vitejs/plugin-react": "^3.1.0", + "autoprefixer": "^10.4.12", + "postcss": "^8.4.17", "prop-types": "^15.8.1", "storybook": "^7.0.5", + "tailwindcss": "^3.1.8", "typescript": "^4.9.3", "vite": "^4.2.0" } diff --git a/apps/storybook/postcss.config.js b/apps/storybook/postcss.config.js new file mode 100644 index 000000000..054c147cb --- /dev/null +++ b/apps/storybook/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/apps/storybook/tailwind.config.js b/apps/storybook/tailwind.config.js new file mode 100644 index 000000000..198f2f062 --- /dev/null +++ b/apps/storybook/tailwind.config.js @@ -0,0 +1 @@ +module.exports = require('@sd/ui/tailwind')('web'); diff --git a/interface/app/$libraryId/Layout/Sidebar/JobManager/Job.tsx b/interface/app/$libraryId/Layout/Sidebar/JobManager/Job.tsx index 4d4c700b7..89ab29cca 100644 --- a/interface/app/$libraryId/Layout/Sidebar/JobManager/Job.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/JobManager/Job.tsx @@ -172,7 +172,7 @@ function Job({ job, clearJob, className, isGroup }: JobProps) { {isRunning && ( -
+
)} diff --git a/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx b/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx index eb419b3a5..9de1b0101 100644 --- a/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx +++ b/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx @@ -195,7 +195,7 @@ export const AddLocationDialog = ({ })} ctaLabel="Add" > - + ; + +export const Default = () => { + const [value, setValue] = useState('Spacedrive'); + + return ( +
+ setValue(e.target.value)} /> +
+ ); +}; diff --git a/packages/ui/src/Input.tsx b/packages/ui/src/Input.tsx index 6aa2095ad..1eba9624a 100644 --- a/packages/ui/src/Input.tsx +++ b/packages/ui/src/Input.tsx @@ -23,7 +23,8 @@ export const inputSizes = { export const inputStyles = cva( [ 'rounded-md border text-sm leading-7', - 'shadow-sm outline-none transition-all focus-within:ring-2' + 'shadow-sm outline-none transition-all focus-within:ring-2', + 'text-ink' ], { variants: { diff --git a/packages/ui/src/Select.stories.tsx b/packages/ui/src/Select.stories.tsx new file mode 100644 index 000000000..7ce52f80b --- /dev/null +++ b/packages/ui/src/Select.stories.tsx @@ -0,0 +1,35 @@ +import { Meta } from '@storybook/react'; +import { useState } from 'react'; +import { Select, SelectOption } from './Select'; + +export default { + title: 'Select', + component: Select, + argTypes: {}, + parameters: { + backgrounds: { + default: 'dark' + } + }, + args: { + children: 'Select' + } +} as Meta; + +export const Default = () => { + const VALUES = ['Option 1', 'Option 2', 'Option 3'] as const; + + const [value, setValue] = useState(VALUES[0]); + + return ( +
+ +
+ ); +}; diff --git a/packages/ui/src/Select.tsx b/packages/ui/src/Select.tsx index 7c7da1d04..769e358ea 100644 --- a/packages/ui/src/Select.tsx +++ b/packages/ui/src/Select.tsx @@ -7,20 +7,15 @@ import { PropsWithChildren } from 'react'; export const selectStyles = cva( [ - 'flex items-center justify-between rounded-md border pl-3 pr-[10px] text-sm', + 'flex items-center justify-between rounded-md border py-0.5 pl-3 pr-[10px] text-sm', 'shadow-sm outline-none transition-all focus:ring-2', - 'radix-placeholder:text-ink-faint' + 'text-ink radix-placeholder:text-ink-faint' ], { variants: { variant: { - default: [ - 'bg-app-input focus:bg-app-focus', - 'border-app-line focus:border-app-divider/80', - 'focus:ring-app-selected/30' - ] + default: ['bg-app-input', 'border-app-line'] }, - size: { sm: 'h-[30px]', md: 'h-[34px]', @@ -34,15 +29,18 @@ export const selectStyles = cva( } ); -export interface SelectProps extends VariantProps { - value: string; - onChange: (value: string) => void; +export interface SelectProps + extends VariantProps { + value: TValue; + onChange: (value: TValue) => void; placeholder?: string; className?: string; disabled?: boolean; } -export function Select(props: PropsWithChildren) { +export function Select( + props: PropsWithChildren> +) { return ( { - // addVariant('open', '&[data-state="open"]'); - // addVariant('closed', '&[data-state="closed"]'); - // }), require('tailwindcss-animate'), require('@headlessui/tailwindcss'), require('tailwindcss-radix')() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74b6667a6240be849e26dcf5475ef612a142750d..ec1d191cbab69b4244494db0a598ef2851e9dec4 100644 GIT binary patch delta 11351 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