From 77cf327ef46ba4b9ef5c5bdb7778c70161decbd8 Mon Sep 17 00:00:00 2001 From: heswell Date: Sat, 9 Mar 2024 14:24:50 +0000 Subject: [PATCH] Tar theme (#1259) * theme and button styling * toggle button * OverflowContainer styling and fixed in vertical mode * tabstrip styling * tabstrip theme variants * fix type issues * fix paths to test fixtures * fix bugs in tests --- plugin/ignite-plugin/ignite/README.txt | 7 + .../work/db/marshaller/2144474804.classname0 | 1 + vuu-ui/package-lock.json | 32 ++- vuu-ui/package.json | 5 +- .../vuu-filters/src/filter-bar/FilterBar.tsx | 1 - .../packages/vuu-layout/src/stack/Stack.css | 8 - .../packages/vuu-layout/src/stack/Stack.tsx | 2 +- .../vuu-shell/src/app-header/AppHeader.tsx | 1 - .../vuu-shell/src/left-nav/LeftNav.css | 4 +- .../defaultApplicationJson.ts | 2 +- vuu-ui/packages/vuu-shell/src/shell.css | 69 +----- .../src/header-cell/GroupHeaderCellNext.tsx | 1 - .../vuu-theme/css/components/button.css | 6 +- .../vuu-theme/css/components/components.css | 1 + .../vuu-theme/css/components/tabstrip.css | 67 ++++++ .../OverflowContainer.cy.tsx | 2 +- .../__component__/tabstrip/Tabstrip.cy.tsx | 28 +-- .../overflow-container/OverflowContainer.css | 60 +++-- .../overflow-container/OverflowContainer.tsx | 41 ++-- .../src/overflow-container/overflow-utils.ts | 85 ++++--- .../useOverflowContainer.ts | 24 +- .../vuu-ui-controls/src/tabstrip/Tab.css | 22 +- .../vuu-ui-controls/src/tabstrip/TabMenu.css | 2 +- .../vuu-ui-controls/src/tabstrip/TabMenu.tsx | 3 +- .../vuu-ui-controls/src/tabstrip/TabsTypes.ts | 6 + .../vuu-ui-controls/src/tabstrip/Tabstrip.css | 13 +- .../vuu-ui-controls/src/tabstrip/Tabstrip.tsx | 7 +- vuu-ui/scripts/build-salt.mjs | 16 -- vuu-ui/scripts/build-themes.mjs | 26 +++ vuu-ui/showcase/icon512.png | Bin 0 -> 23484 bytes vuu-ui/showcase/manifest.json | 17 ++ .../src/examples/Layout/Toolbar.examples.tsx | 9 - vuu-ui/showcase/src/examples/Layout/index.ts | 1 - .../src/examples/Table/BigData.examples.tsx | 2 +- .../src/examples/Table/Table.examples.tsx | 2 +- .../OverflowContainer.examples.css | 8 +- .../OverflowContainer.examples.tsx | 27 +-- .../examples/UiControls/Tabstrip.examples.tsx | 189 ++++++++++++++-- .../showcase/src/examples/UiControls/index.ts | 1 + .../src/examples/salt/Button.examples.tsx | 37 +++- vuu-ui/themes/tar-theme/NunitoSans.css | 71 ++++++ vuu-ui/themes/tar-theme/SomeTypeMono.css | 8 + .../tar-theme/css/characteristics/accent.css | 5 + .../css/characteristics/actionable.css | 35 +++ .../css/characteristics/container.css | 13 ++ .../tar-theme/css/characteristics/content.css | 12 + .../css/characteristics/draggable.css | 10 + .../css/characteristics/editable.css | 33 +++ .../tar-theme/css/characteristics/focused.css | 21 ++ .../css/characteristics/navigable.css | 21 ++ .../css/characteristics/overlayable.css | 11 + .../css/characteristics/selectable.css | 31 +++ .../css/characteristics/separable.css | 7 + .../tar-theme/css/characteristics/status.css | 23 ++ .../tar-theme/css/characteristics/target.css | 10 + .../tar-theme/css/characteristics/text.css | 208 ++++++++++++++++++ .../tar-theme/css/characteristics/track.css | 8 + .../tar-theme/css/components/button.css | 54 +++++ .../tar-theme/css/components/checkbox.css | 50 +++++ .../tar-theme/css/components/components.css | 8 + .../themes/tar-theme/css/components/icon.css | 5 + .../themes/tar-theme/css/components/input.css | 18 ++ .../tar-theme/css/components/splitter.css | 11 + .../tar-theme/css/components/switch.css | 56 +++++ .../tar-theme/css/components/tabstrip.css | 13 ++ .../css/components/toggle-button.css | 52 +++++ .../tar-theme/css/deprecated/foundations.css | 103 +++++++++ .../tar-theme/css/foundations/animation.css | 155 +++++++++++++ .../tar-theme/css/foundations/color.css | 176 +++++++++++++++ .../tar-theme/css/foundations/duration.css | 6 + .../themes/tar-theme/css/foundations/fade.css | 68 ++++++ .../tar-theme/css/foundations/opacity.css | 8 + .../tar-theme/css/foundations/shadow.css | 23 ++ .../themes/tar-theme/css/foundations/size.css | 51 +++++ .../tar-theme/css/foundations/spacing.css | 31 +++ .../tar-theme/css/foundations/typography.css | 11 + .../tar-theme/css/foundations/zindex.css | 14 ++ vuu-ui/themes/tar-theme/css/global.css | 40 ++++ .../themes/tar-theme/css/palette/accent.css | 11 + vuu-ui/themes/tar-theme/css/palette/error.css | 13 ++ vuu-ui/themes/tar-theme/css/palette/info.css | 11 + .../themes/tar-theme/css/palette/interact.css | 95 ++++++++ .../themes/tar-theme/css/palette/navigate.css | 17 ++ .../themes/tar-theme/css/palette/negative.css | 7 + .../themes/tar-theme/css/palette/neutral.css | 41 ++++ .../themes/tar-theme/css/palette/opacity.css | 9 + .../themes/tar-theme/css/palette/positive.css | 7 + .../themes/tar-theme/css/palette/success.css | 13 ++ .../themes/tar-theme/css/palette/warning.css | 13 ++ vuu-ui/themes/tar-theme/css/theme.css | 48 ++++ .../tar-theme/fonts/NunitoSans-Regular.woff | Bin 0 -> 53192 bytes .../tar-theme/fonts/NunitoSansv15Latin.woff2 | Bin 0 -> 49876 bytes .../tar-theme/fonts/SomeTypeMonov1-500.woff2 | Bin 0 -> 10044 bytes vuu-ui/themes/tar-theme/index.css | 5 + vuu-ui/themes/tar-theme/package.json | 12 + vuu-ui/tools/vuu-showcase/src/App.tsx | 4 +- vuu-ui/tools/vuu-showcase/src/AppRoutes.tsx | 29 --- vuu-ui/tools/vuu-showcase/src/Showcase.tsx | 25 ++- .../vuu-showcase/src/ShowcaseStandalone.tsx | 21 +- vuu-ui/tools/vuu-showcase/src/themes/tar.ts | 2 + 100 files changed, 2357 insertions(+), 341 deletions(-) create mode 100644 plugin/ignite-plugin/ignite/README.txt create mode 100644 plugin/ignite-plugin/ignite/work/db/marshaller/2144474804.classname0 create mode 100644 vuu-ui/packages/vuu-theme/css/components/tabstrip.css delete mode 100644 vuu-ui/scripts/build-salt.mjs create mode 100644 vuu-ui/scripts/build-themes.mjs create mode 100644 vuu-ui/showcase/icon512.png create mode 100644 vuu-ui/showcase/manifest.json rename vuu-ui/showcase/src/examples/{Layout => UiControls}/OverflowContainer.examples.css (55%) rename vuu-ui/showcase/src/examples/{Layout => UiControls}/OverflowContainer.examples.tsx (91%) create mode 100644 vuu-ui/themes/tar-theme/NunitoSans.css create mode 100644 vuu-ui/themes/tar-theme/SomeTypeMono.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/accent.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/actionable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/container.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/content.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/draggable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/editable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/focused.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/navigable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/overlayable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/selectable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/separable.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/status.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/target.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/text.css create mode 100644 vuu-ui/themes/tar-theme/css/characteristics/track.css create mode 100644 vuu-ui/themes/tar-theme/css/components/button.css create mode 100644 vuu-ui/themes/tar-theme/css/components/checkbox.css create mode 100644 vuu-ui/themes/tar-theme/css/components/components.css create mode 100644 vuu-ui/themes/tar-theme/css/components/icon.css create mode 100644 vuu-ui/themes/tar-theme/css/components/input.css create mode 100644 vuu-ui/themes/tar-theme/css/components/splitter.css create mode 100644 vuu-ui/themes/tar-theme/css/components/switch.css create mode 100644 vuu-ui/themes/tar-theme/css/components/tabstrip.css create mode 100644 vuu-ui/themes/tar-theme/css/components/toggle-button.css create mode 100644 vuu-ui/themes/tar-theme/css/deprecated/foundations.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/animation.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/color.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/duration.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/fade.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/opacity.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/shadow.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/size.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/spacing.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/typography.css create mode 100644 vuu-ui/themes/tar-theme/css/foundations/zindex.css create mode 100644 vuu-ui/themes/tar-theme/css/global.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/accent.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/error.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/info.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/interact.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/navigate.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/negative.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/neutral.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/opacity.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/positive.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/success.css create mode 100644 vuu-ui/themes/tar-theme/css/palette/warning.css create mode 100644 vuu-ui/themes/tar-theme/css/theme.css create mode 100644 vuu-ui/themes/tar-theme/fonts/NunitoSans-Regular.woff create mode 100644 vuu-ui/themes/tar-theme/fonts/NunitoSansv15Latin.woff2 create mode 100644 vuu-ui/themes/tar-theme/fonts/SomeTypeMonov1-500.woff2 create mode 100644 vuu-ui/themes/tar-theme/index.css create mode 100644 vuu-ui/themes/tar-theme/package.json delete mode 100644 vuu-ui/tools/vuu-showcase/src/AppRoutes.tsx create mode 100644 vuu-ui/tools/vuu-showcase/src/themes/tar.ts diff --git a/plugin/ignite-plugin/ignite/README.txt b/plugin/ignite-plugin/ignite/README.txt new file mode 100644 index 000000000..a74311661 --- /dev/null +++ b/plugin/ignite-plugin/ignite/README.txt @@ -0,0 +1,7 @@ +This is Apache Ignite working directory that contains information that + Ignite nodes need in order to function normally. +Don't delete it unless you're sure you know what you're doing. + +You can change the location of working directory with + igniteConfiguration.setWorkDirectory(location) or + in IgniteConfiguration . diff --git a/plugin/ignite-plugin/ignite/work/db/marshaller/2144474804.classname0 b/plugin/ignite-plugin/ignite/work/db/marshaller/2144474804.classname0 new file mode 100644 index 000000000..c4d1ddb2a --- /dev/null +++ b/plugin/ignite-plugin/ignite/work/db/marshaller/2144474804.classname0 @@ -0,0 +1 @@ +org.finos.vuu.feature.ignite.TestOrderEntity \ No newline at end of file diff --git a/vuu-ui/package-lock.json b/vuu-ui/package-lock.json index dad84c64d..04ba8d6f7 100644 --- a/vuu-ui/package-lock.json +++ b/vuu-ui/package-lock.json @@ -12,7 +12,8 @@ "packages/**", "sample-apps/**", "showcase", - "tools/vuu-showcase" + "tools/vuu-showcase", + "themes/**" ], "dependencies": { "@salt-ds/core": "1.17.0", @@ -59,7 +60,7 @@ "stylelint": "^15.0.0", "tinycolor2": "1.4.2", "typescript": "4.9.5", - "vite": "5.1.3", + "vite": "5.0.12", "vite-tsconfig-paths": "4.2.2", "vitest": "1.3.1" }, @@ -2897,6 +2898,10 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/@vuu-themes/tar-theme": { + "resolved": "themes/tar-theme", + "link": true + }, "node_modules/@zeit/schemas": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", @@ -11873,13 +11878,13 @@ "dev": true }, "node_modules/vite": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", - "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dev": true, "dependencies": { "esbuild": "^0.19.3", - "postcss": "^8.4.35", + "postcss": "^8.4.32", "rollup": "^4.2.0" }, "bin": { @@ -13567,6 +13572,10 @@ "resolved": "https://registry.npmjs.org/@salt-ds/theme/-/theme-1.11.1.tgz", "integrity": "sha512-qdYkWwcmTziNJySu4f00L7pXCK1ExGt6xYBW+yUcYUsyLWymtcqDZDNOKEo6WXSkQ8ZePGI6UwiUwjAQjot/1w==" }, + "themes/tar-theme": { + "version": "0.0.26", + "license": "Apache-2.0" + }, "tools/vuu-showcase": { "name": "@finos/vuu-showcase", "version": "0.0.1", @@ -15780,6 +15789,9 @@ } } }, + "@vuu-themes/tar-theme": { + "version": "file:themes/tar-theme" + }, "@zeit/schemas": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", @@ -22364,14 +22376,14 @@ } }, "vite": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", - "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dev": true, "requires": { "esbuild": "^0.19.3", "fsevents": "~2.3.3", - "postcss": "^8.4.35", + "postcss": "^8.4.32", "rollup": "^4.2.0" }, "dependencies": { diff --git a/vuu-ui/package.json b/vuu-ui/package.json index e8f765796..0c1e9081a 100644 --- a/vuu-ui/package.json +++ b/vuu-ui/package.json @@ -12,7 +12,8 @@ "packages/**", "sample-apps/**", "showcase", - "tools/vuu-showcase" + "tools/vuu-showcase", + "themes/**" ], "scripts": { "lint": "eslint . --ext .js,.jsx,.ts,.tsx", @@ -25,7 +26,7 @@ "build:table": "cd sample-apps/standalone-table && node scripts/build.mjs", "build:packages": "npm run build -- --cjs --license && npm run type-defs", "build:packages:debug": "npm run build -- --cjs --debug && npm run type-defs -- --debug", - "build:salt": "node ./scripts/build-salt.mjs", + "build:themes": "node ./scripts/build-themes.mjs", "launch:demo": "node ./scripts/launch-app.mjs", "launch:table": "node ./scripts/launch-table.mjs", "launch:demo:electron": "cd tools/electron && node ./node_modules/.bin/electron .", diff --git a/vuu-ui/packages/vuu-filters/src/filter-bar/FilterBar.tsx b/vuu-ui/packages/vuu-filters/src/filter-bar/FilterBar.tsx index c72621fdd..e01fe4aae 100644 --- a/vuu-ui/packages/vuu-filters/src/filter-bar/FilterBar.tsx +++ b/vuu-ui/packages/vuu-filters/src/filter-bar/FilterBar.tsx @@ -154,7 +154,6 @@ export const FilterBar = ({ .vuuHeader { height: 0; overflow: hidden; diff --git a/vuu-ui/packages/vuu-layout/src/stack/Stack.tsx b/vuu-ui/packages/vuu-layout/src/stack/Stack.tsx index a7eac8751..09bd069d7 100644 --- a/vuu-ui/packages/vuu-layout/src/stack/Stack.tsx +++ b/vuu-ui/packages/vuu-layout/src/stack/Stack.tsx @@ -59,6 +59,7 @@ export const Stack = forwardRef(function Stack( }: StackProps, ref: ForwardedRef ) { + console.log({ TabstripProps }); const id = useId(idProp); const tabLabels = useRef([]); const { @@ -146,7 +147,6 @@ export const Stack = forwardRef(function Stack( onExitEditMode={handleExitEditMode} onMoveTab={onMoveTab} orientation={tabstripOrientation} - // onMouseDown={handleMouseDown} > {renderTabs()} diff --git a/vuu-ui/packages/vuu-shell/src/app-header/AppHeader.tsx b/vuu-ui/packages/vuu-shell/src/app-header/AppHeader.tsx index 9cc821d5f..1df2d51b0 100644 --- a/vuu-ui/packages/vuu-shell/src/app-header/AppHeader.tsx +++ b/vuu-ui/packages/vuu-shell/src/app-header/AppHeader.tsx @@ -44,7 +44,6 @@ export const AppHeader = ({ diff --git a/vuu-ui/packages/vuu-shell/src/left-nav/LeftNav.css b/vuu-ui/packages/vuu-shell/src/left-nav/LeftNav.css index 12710db0d..469b86f9b 100644 --- a/vuu-ui/packages/vuu-shell/src/left-nav/LeftNav.css +++ b/vuu-ui/packages/vuu-shell/src/left-nav/LeftNav.css @@ -1,11 +1,11 @@ .vuuLeftNav { + --vuuOverflowContainer-height: auto; --salt-navigable-fontWeight-active: 700; --vuuTab-background-selected: rgba(255, 255, 255, 0.10); --vuuTab-hover-background: rgba(255, 255, 255, 0.10); --vuuTab-before-content: none; --vuuTab-borderRadius: 6px; --vuuTab-height: 40px; - --vuuTab-padding: 0 0 0 48px; --vuuTabstrip-fontWeight: 700; --vuuTabstrip-width: 100%; --svg-demo: url('data:image/svg+xml;utf8,'); @@ -87,6 +87,8 @@ --vuu-icon-left: 12px; --vuu-icon-size: 16px; border-left: solid 4px transparent; + padding: 0 0 0 48px; + } .vuuLeftNav .vuuTab-selected { diff --git a/vuu-ui/packages/vuu-shell/src/persistence-management/defaultApplicationJson.ts b/vuu-ui/packages/vuu-shell/src/persistence-management/defaultApplicationJson.ts index ba3b475a3..051387a41 100644 --- a/vuu-ui/packages/vuu-shell/src/persistence-management/defaultApplicationJson.ts +++ b/vuu-ui/packages/vuu-shell/src/persistence-management/defaultApplicationJson.ts @@ -35,7 +35,7 @@ export const defaultApplicationJson: ApplicationJSON = { allowRenameTab: true, animateSelectionThumb: false, location: "main-tab", - tabClassName: "MainTab", + variant: "primary", }, preserve: true, active: 0, diff --git a/vuu-ui/packages/vuu-shell/src/shell.css b/vuu-ui/packages/vuu-shell/src/shell.css index 719ca6396..6ba0abd56 100644 --- a/vuu-ui/packages/vuu-shell/src/shell.css +++ b/vuu-ui/packages/vuu-shell/src/shell.css @@ -39,78 +39,11 @@ } .vuuShell-mainTabs > .vuuTabstrip { - --vuuTabstrip-height: 28px; - --saltTabs-tabstrip-height: 29px; - --tabstrip-height: 29px; left:-1px; padding-bottom: 7px; position: absolute !important; right: 1px; top: 0; width: calc(100% + 2px) !important; -} +} -.vuuShell-mainTabs > .vuuTabHeader { - border-bottom: none; -} - -.vuuShell-mainTabs > .vuuTabstrip:before { - background-color: transparent; - border-radius: 0 6px 0 0; - border-left: solid 1px #D6D7DA; - border-right: solid 1px #D6D7DA; - border-top: solid 1px #D6D7DA; - content: ''; - position: absolute; - bottom: 0; - left:0; - right:0; - height: 8px; - z-index: 1; -} - -.vuuTab.MainTab { - --vuuTabMenu-top: -1px; - background-color: #F1F2F4; - border-color: #D6D7DA; - border-radius: 6px 6px 0 0; - border-width: 1px; - border-style: solid; - position: relative; -} - -.MainTab.vuuTab-selected { - background-color: white; - border-bottom-color: white; - z-index: 1; - -} - -.MainTab.vuuTab-selected:before{ - background-color: #6d188b;; - content: ''; - position: absolute; - height: 100%; - left:0; - top:0; - border-radius: 6px 0 0 0; - width: 6px; -} - -.MainTab.vuuTab:hover:before{ - background-color: #F37880; - content: ''; - position: absolute; - height: 100%; - left:0; - top:0; - border-radius: 6px 0 0 0; - width: 6px; -} - -.vuuTab.MainTab .vuuTab-main { - background-color: transparent; - font-weight: 700; - height: 29px; - padding: 0 24px; -} diff --git a/vuu-ui/packages/vuu-table/src/header-cell/GroupHeaderCellNext.tsx b/vuu-ui/packages/vuu-table/src/header-cell/GroupHeaderCellNext.tsx index de31214fd..d89e44116 100644 --- a/vuu-ui/packages/vuu-table/src/header-cell/GroupHeaderCellNext.tsx +++ b/vuu-ui/packages/vuu-table/src/header-cell/GroupHeaderCellNext.tsx @@ -95,7 +95,6 @@ export const GroupHeaderCellNext = ({ diff --git a/vuu-ui/packages/vuu-theme/css/components/button.css b/vuu-ui/packages/vuu-theme/css/components/button.css index 6151daf3e..323b49bbf 100644 --- a/vuu-ui/packages/vuu-theme/css/components/button.css +++ b/vuu-ui/packages/vuu-theme/css/components/button.css @@ -1,7 +1,11 @@ .vuu-theme { /** TODO these will need density variants */ --saltButton-borderRadius: 6px; - --saltButton-padding: 16px; + --saltButton-padding: var(--salt-spacing-400); + + .saltButton { + gap: var(--salt-spacing-200); + } .saltButton-primary { --saltButton-borderColor: var(--vuuButton-borderColor,var(--salt-actionable-primary-foreground)); diff --git a/vuu-ui/packages/vuu-theme/css/components/components.css b/vuu-ui/packages/vuu-theme/css/components/components.css index c60f69e40..248a0ca79 100644 --- a/vuu-ui/packages/vuu-theme/css/components/components.css +++ b/vuu-ui/packages/vuu-theme/css/components/components.css @@ -4,4 +4,5 @@ @import url(input.css); @import url(splitter.css); @import url(switch.css); +@import url(tabstrip.css); @import url(toggle-button.css); diff --git a/vuu-ui/packages/vuu-theme/css/components/tabstrip.css b/vuu-ui/packages/vuu-theme/css/components/tabstrip.css new file mode 100644 index 000000000..8fdd0fa58 --- /dev/null +++ b/vuu-ui/packages/vuu-theme/css/components/tabstrip.css @@ -0,0 +1,67 @@ +.vuu-theme { + + .vuuTab { + --vuuTab-padding: 0 var(--salt-spacing-400); + } + + .vuuTabstrip-primary { + + --vuuOverflowContainer-borderColor: var(--vuu-color-gray-30); + --vuuTab-background: var(--vuu-color-gray-28); + --vuuTab-borderRadius: 6px 6px 0 0; + --vuuTab-borderColor: var(--vuu-color-gray-30); + --vuuTab-borderStyle: solid; + --vuuTab-borderWidth: 1px; + + + &.vuuOrientation-horizontal { + --vuuOverflowContainer-borderStyle: none; + --vuuOverflowContainer-contentHeight: calc(var(--salt-size-base) + var(--salt-spacing-100)); + --vuuOverflowContainer-height: calc(var(--vuuOverflowContainer-contentHeight) + 7px); + padding-bottom: 7px; + } + + .vuuTab { + height: calc(var(--tab-height) + 1px); + } + + .vuuTab-selected { + --vuuTab-background: var(--vuu-color-white); + border-bottom-color: white; + z-index: 1; + } + + .vuuTab-selected:before{ + height: 100%; + left:0; + top:0; + border-radius: 6px 0 0 0; + width: 6px; + } + + .vuuTab:hover:before{ + background-color: #F37880; + height: 100%; + left:0; + top:0; + border-radius: 6px 0 0 0; + width: 6px; + } + + &.vuuTabstrip:before { + background-color: transparent; + border-radius: 0 6px 0 0; + border-left: solid 1px var(--vuu-color-gray-30); + border-right: solid 1px var(--vuu-color-gray-30); + border-top: solid 1px var(--vuu-color-gray-30); + content: ''; + position: absolute; + bottom: 0; + left:0; + right:0; + height: 8px; + z-index: 1; + } + } + +} \ No newline at end of file diff --git a/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/overflow-container/OverflowContainer.cy.tsx b/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/overflow-container/OverflowContainer.cy.tsx index c7a1e75e2..6ca13cb00 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/overflow-container/OverflowContainer.cy.tsx +++ b/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/overflow-container/OverflowContainer.cy.tsx @@ -1,6 +1,6 @@ import React from "react"; // TODO try and get TS path alias working to avoid relative paths like this -import { TestFixtureSimpleOverflowContainer } from "../../../../../../showcase/src/examples/Layout/OverflowContainer.examples"; +import { TestFixtureSimpleOverflowContainer } from "../../../../../../showcase/src/examples/UiControls/OverflowContainer.examples"; describe("WHEN it initially renders, with enough space for all items", () => { it("THEN all child items will be visible, and none will be marked as wrapped", () => { diff --git a/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/tabstrip/Tabstrip.cy.tsx b/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/tabstrip/Tabstrip.cy.tsx index 39a3c9243..74538ed1f 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/tabstrip/Tabstrip.cy.tsx +++ b/vuu-ui/packages/vuu-ui-controls/src/__tests__/__component__/tabstrip/Tabstrip.cy.tsx @@ -1,5 +1,5 @@ // TODO try and get TS path alias working to avoid relative paths like this -import { DefaultTabstripNext } from "../../../../../../showcase/src/examples/UiControls/Tabstrip.examples"; +import { DefaultTabstrip } from "../../../../../../showcase/src/examples/UiControls/Tabstrip.examples"; const OVERFLOW_ITEMS = ".vuuOverflowContainer-wrapContainer > *"; const OVERFLOWED_ITEMS = ".vuuOverflowContainer-wrapContainer > .wrapped"; @@ -10,7 +10,7 @@ const OVERFLOW_IND = describe("WHEN initial size is sufficient to display all contents", () => { describe("WHEN it initially renders", () => { it("THEN all the content items will be visible", () => { - cy.mount(); + cy.mount(); const tabstrip = cy.findByRole("tablist"); tabstrip.should("have.class", "vuuTabstrip"); // The overflow Inidcator will be present, but have zero width @@ -20,11 +20,11 @@ describe("WHEN initial size is sufficient to display all contents", () => { .should("have.length", 5); }); it("THEN no items will be overflowed", () => { - cy.mount(); + cy.mount(); cy.get(OVERFLOWED_ITEMS).should("have.length", 0); }); it("THEN no overflow indicator will be visible", () => { - cy.mount(); + cy.mount(); cy.get(OVERFLOW_IND).should("have.length", 1); cy.get(OVERFLOW_IND).should("not.be.visible"); }); @@ -32,12 +32,12 @@ describe("WHEN initial size is sufficient to display all contents", () => { describe("WHEN resized such that space is sufficient for only 4 tabs (first tab selected)", () => { it("THEN first 4 tabs will be displayed, with overflow indicator", () => { - cy.mount(); - cy.get(".vuuTabstrip").invoke("css", "width", "450px"); + cy.mount(); + cy.get(".vuuTabstrip").invoke("css", "width", "350px"); cy.get(OVERFLOW_ITEMS) .should("have.length", 6) .filter(":visible") - .should("have.length", 4); + .should("have.length", 5); cy.get(".vuuTabstrip").debug(); cy.get(OVERFLOWED_ITEMS).should("have.length", 1); cy.get(`.wrapped`).should("have.length", 1); @@ -48,16 +48,18 @@ describe("WHEN initial size is sufficient to display all contents", () => { describe("WHEN resized such that space is sufficient for only 4 tabs (LAST tab selected)", () => { it("THEN as last tab is selected, last but one will be overflowed", () => { - cy.mount(); - cy.get(".vuuTabstrip").invoke("css", "width", "450px"); + cy.mount(); + cy.get(".vuuTabstrip").invoke("css", "width", "350px"); cy.get(OVERFLOW_ITEMS) .should("have.length", 6) .filter(":visible") .should("have.length", 4); - cy.get(OVERFLOWED_ITEMS).should("have.length", 1); - cy.get(`${OVERFLOW_ITEMS}:nth-child(4).wrapped`).should("have.length", 1); + cy.get(OVERFLOWED_ITEMS).should("have.length", 2); + // Because a longer (selected) item has been restored , two shorter items have been wrapped + cy.get(`${OVERFLOW_ITEMS}:nth-child(2).wrapped`).should("have.length", 1); + cy.get(`${OVERFLOW_ITEMS}:nth-child(3).wrapped`).should("have.length", 1); cy.get(OVERFLOW_IND).should("have.length", 1); - cy.get(OVERFLOW_IND).should("be.visible", 1); + cy.get(OVERFLOW_IND).should("be.visible"); }); }); }); @@ -81,7 +83,7 @@ describe("WHEN initial size is sufficient to display all contents", () => { // describe("WHEN it initially renders", () => { // describe("WHEN the selected Tab has not been specified", () => { // it("THEN the first tab will be selected", () => { -// cy.mount(); +// cy.mount(); // cy.get(".saltTabstrip-inner > *:first-child").should( // "have.ariaSelected" // ); diff --git a/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.css b/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.css index b3d0d67ad..9e1d0f095 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.css +++ b/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.css @@ -1,3 +1,4 @@ + .vuuOverflowContainer { --overflow-borderColor: var(--vuuOverflowContainer-borderColor, none); --overflow-borderStyle: var(--vuuOverflowContainer-borderStyle, none); @@ -8,11 +9,11 @@ --overflow-border-bottomWidth: var(--vuuOverflowContainer-borderBottomWidth, var(--overflow-borderWidth)); --overflow-border-leftWidth: var(--vuuOverflowContainer-borderLeftWidth, var(--overflow-borderWidth)); + --border: calc(var(--overflow-border-topWidth) + var(--overflow-border-bottomWidth)); + --overflow-item-gap : var(--vuuOverflowContainer-gap,2px); --overflow-direction: row; --overflow-height: var(--overflow-item-height); - --overflow-top:top:0; - --overflow-width: 0px; background-color: var(--vuuOverflowContainer-background); border-color: var(--overflow-borderColor); @@ -21,35 +22,61 @@ border-right-width: var(--overflow-border-rightWidth); border-bottom-width: var(--overflow-border-bottomWidth); border-left-width: var(--overflow-border-leftWidth); - height: var(--overflow-container-heightWidth); + height: var(--vuuOverflowContainer-height,var(--overflow-container-height)); + width: var(--overflow-container-width); } -.vuuOverflowContainer-horizontal { +.vuuOverflowContainer.vuuOrientation-horizontal { --item-align: center; --item-margin: 0 var(--overflow-item-gap) 0 var(--overflow-item-gap); + --overflow-container-height: calc(var(--salt-size-base) + var(--salt-spacing-100)); + --overflow-container-width: var(--vuuOverflowContainer-width, auto); + --overflow-wrapper-height: var(--overflow-item-height); + --overflow-item-height: var(--vuuOverflowContainer-contentHeight, calc(var(--overflow-container-height) - var(--total-border-size))); + --overflow-item-width: auto; + --overflow-width: 0px; + --total-border-size: calc(var(--overflow-border-topWidth) + var(--overflow-border-bottomWidth)); + + min-width: var(--vuuOverflowContainer-minWidth, var(--overflow-container-height)); + + .vuuOverflowContainer-wrapContainer-overflowed { + --overflow-left: auto; + --overflow-position: relative; + --overflow-width: auto; + } + } -.vuuOverflowContainer-vertical { +.vuuOverflowContainer.vuuOrientation-vertical { --item-align: stretch; + --overflow-container-height: 100%; + --overflow-container-width: var(--vuuOverflowContainer-width,calc(var(--salt-size-base) + var(--salt-spacing-100))); --overflow-item-height: auto; + --overflow-item-width: calc(var(--overflow-container-width) - var(--total-border-size)); + --overflow-wrapper-height: 100%; + --total-border-size: calc(var(--overflow-border-leftWidth) + var(--overflow-border-rightWidth)); + --item-margin: var(--overflow-item-gap) 0 var(--overflow-item-gap) 0; --overflow-direction: column; - --overflow-height: 0; + --overflow-height: 0px; --overflow-left: 0; --overflow-top: 100%; --overflow-width: auto; - + + .vuuOverflowContainer-wrapContainer-overflowed { + --overflow-top: auto; + --overflow-position: relative; + --overflow-height: auto; + } + } .vuuOverflowContainer-wrapContainer { - --border: calc(var(--overflow-border-topWidth) + var(--overflow-border-bottomWidth)); - --overflow-item-height: calc(var(--overflow-container-height) - var(--border)); align-items: var(--item-align); display: flex; flex-direction: var(--overflow-direction); flex-wrap: wrap; - height: var(--overflow-item-height); + height: var(--overflow-wrapper-height); justify-content: var(--vuuOverflowContainer-justifyContent, flex-start); - min-width: var(--vuuOverflowContainer-minWidth, 44px); overflow: hidden; position: relative; width: 100%; @@ -63,7 +90,7 @@ --overflow-width: auto; } -.vuuOverflowContainer-vertical.vuuOverflowContainer-wrapContainer-overflowed { +.vuuOverflowContainer.vuuOrientation-vertical.vuuOverflowContainer-wrapContainer-overflowed { --overflow-height: auto; } @@ -74,16 +101,17 @@ position: relative; height: var(--overflow-item-height); margin: var(--item-margin); + width: var(--overflow-item-width); } .vuuOverflowContainer-item[data-align="right"] { margin-left: auto; } - .vuuOverflowContainer-item.wrapped { --overflow-item-bg: #ccc; order: 3; + visibility: hidden; } .vuuOverflowContainer-item.vuuDraggable-dragAway, @@ -102,15 +130,9 @@ height: var(--overflow-height); order: var(--overflow-order, 99); overflow: hidden; - left: var(--overflow-left, 100%); - top: var(--overflow-top, 100%); - position: var(--overflow-position, absolute); width: var(--overflow-width); - - } - .vuuDraggable-vuuOverflowContainer { align-items: center; display: flex; diff --git a/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.tsx b/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.tsx index da5c11d81..2ca83a3df 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.tsx +++ b/vuu-ui/packages/vuu-ui-controls/src/overflow-container/OverflowContainer.tsx @@ -2,12 +2,7 @@ import { PopupMenu, PopupMenuProps } from "@finos/vuu-popups"; import { asReactElements, orientationType, useId } from "@finos/vuu-utils"; import cx from "clsx"; -import React, { - CSSProperties, - ForwardedRef, - forwardRef, - HTMLAttributes, -} from "react"; +import React, { ForwardedRef, forwardRef, HTMLAttributes } from "react"; import { OverflowItem } from "./overflow-utils"; import { useOverflowContainer } from "./useOverflowContainer"; @@ -19,7 +14,6 @@ export interface OverflowContainerProps extends HTMLAttributes { PopupMenuProps?: Partial; allowDragDrop?: boolean; debugId?: string; - height: number; onMoveItem?: (fromIndex: number, toIndex: number) => void; onSwitchWrappedItemIntoView?: (overflowItem: OverflowItem) => void; orientation?: orientationType; @@ -32,14 +26,13 @@ const WrapContainer = React.memo( PopupMenuProps, allowDragDrop, children, - className: classNameProp, - height: heightProp, id, onMoveItem, onSwitchWrappedItemIntoView, - orientation = "horizontal", + orientation, overflowIcon, - }: OverflowContainerProps) => { + }: Omit & + Required>) => { const childElements = asReactElements(children); const { draggable, @@ -56,17 +49,6 @@ const WrapContainer = React.memo( orientation, }); - const height = orientation === "vertical" ? "100%" : `${heightProp}px`; - // TODO measure the height, if not provided - const style = { - "--overflow-container-height": `${height}`, - } as CSSProperties; - - const className = cx(`${classBase}-wrapContainer`, classNameProp, { - [`${classBase}-horizontal`]: orientation === "horizontal", - [`${classBase}-vertical`]: orientation === "vertical", - }); - const content = childElements.map((childEl, i) => { const { "data-align": align, @@ -100,6 +82,7 @@ const WrapContainer = React.memo( > ); - content.push(overflowIndicator); return ( -
+
{content} {draggable}
@@ -127,11 +109,10 @@ export const OverflowContainer = forwardRef(function OverflowContainer( allowDragDrop = false, children, className, - height = 44, id: idProp, onMoveItem, onSwitchWrappedItemIntoView, - orientation, + orientation = "horizontal", overflowIcon, overflowPosition, ...htmlAttributes @@ -143,14 +124,18 @@ export const OverflowContainer = forwardRef(function OverflowContainer( return (
{ const nonWrappedItems: OverflowItem[] = []; const wrappedItems: OverflowItem[] = []; @@ -165,11 +165,12 @@ export const highPriorityItemsHaveWrappedButShouldNotHave = ( */ export const correctForWrappedOverflowIndicator = ( container: HTMLElement, - overflowedItems: OverflowItem[] + overflowedItems: OverflowItem[], + orientation: orientationType ): Promise => new Promise((resolve) => { requestAnimationFrame(() => { - const [, o2] = getNonWrappedAndWrappedItems(container); + const [, o2] = getNonWrappedAndWrappedItems(container, orientation); const newlyOverflowed = getNewItems(overflowedItems, o2); newlyOverflowed.forEach((item) => markElementAsWrapped(container, item)); resolve(o2); @@ -185,16 +186,18 @@ export const correctForWrappedOverflowIndicator = ( export const correctForWrappedHighPriorityItems = ( container: HTMLElement, nonWrapped: OverflowItem[], - wrapped: OverflowItem[] + wrapped: OverflowItem[], + orientation: orientationType ): Promise<[OverflowItem[], OverflowItem[]]> => new Promise((resolve) => { requestAnimationFrame(() => { - const [, o2] = getNonWrappedAndWrappedItems(container); + const [, o2] = getNonWrappedAndWrappedItems(container, orientation); const highPriorityWrappedItem = getHighestPriorityItem(o2); if (highPriorityWrappedItem) { const [nonWrappedItems, wrappedItems] = switchWrappedItemIntoView( container, - highPriorityWrappedItem + highPriorityWrappedItem, + orientation ); resolve([nonWrappedItems, wrappedItems]); } else { @@ -249,19 +252,39 @@ const getOverflowIndicator = (container: HTMLElement) => container.querySelector('[data-index="overflow"]') as HTMLElement; const getOverflowedItem = (container: HTMLElement) => container.querySelector(".wrapped") as HTMLElement; -const getElementWidth = (el: HTMLElement) => - parseInt(getComputedStyle(el).getPropertyValue("width")); +const getElementSize = (el: HTMLElement, sizeProperty: "width" | "height") => { + const size = parseInt(getComputedStyle(el).getPropertyValue(sizeProperty)); + const margin = + sizeProperty === "width" + ? parseInt(getComputedStyle(el).getPropertyValue("margin-left")) + + parseInt(getComputedStyle(el).getPropertyValue("margin-right")) + : parseInt(getComputedStyle(el).getPropertyValue("margin-top")) + + parseInt(getComputedStyle(el).getPropertyValue("margin-bottom")); + + return size + margin; +}; const getAvailableSpace = ( container: HTMLElement, - overflowIndicator: HTMLElement + overflowIndicator: HTMLElement, + orientation: orientationType ) => { - const { right: containerRight } = container.getBoundingClientRect(); - const paddingRight = parseInt( - getComputedStyle(container).getPropertyValue("padding-right") - ); - const { right: indicatorRight } = overflowIndicator.getBoundingClientRect(); - return containerRight - paddingRight - indicatorRight; + if (orientation === "horizontal") { + const { right: containerRight } = container.getBoundingClientRect(); + const paddingRight = parseInt( + getComputedStyle(container).getPropertyValue("padding-right") + ); + const { right: indicatorRight } = overflowIndicator.getBoundingClientRect(); + return containerRight - paddingRight - indicatorRight; + } else { + const { bottom: containerBottom } = container.getBoundingClientRect(); + const paddingBottom = parseInt( + getComputedStyle(container).getPropertyValue("padding-bottom") + ); + const { bottom: indicatorBottom } = + overflowIndicator.getBoundingClientRect(); + return containerBottom - paddingBottom - indicatorBottom; + } }; /** @@ -270,16 +293,22 @@ const getAvailableSpace = ( indicaor were removed ? */ export const removeOverflowIndicatorIfNoLongerNeeded = ( - container: HTMLElement + container: HTMLElement, + orientation: orientationType ): boolean => { + const sizeProperty = orientation === "horizontal" ? "width" : "height"; const overflowIndicator = getOverflowIndicator(container); - const availableSpace = getAvailableSpace(container, overflowIndicator); - const indicatorWidth = getElementWidth(overflowIndicator); + const availableSpace = getAvailableSpace( + container, + overflowIndicator, + orientation + ); + const indicatorWidth = getElementSize(overflowIndicator, sizeProperty); const overflowedItem = getOverflowedItem(container); - const overflowWidth = getElementWidth(overflowedItem); + const overflowWidth = getElementSize(overflowedItem, sizeProperty); if (overflowWidth <= availableSpace + indicatorWidth) { - container.classList.remove("overflowed"); + container.classList.remove("vuuOverflowContainer-wrapContainer-overflowed"); overflowedItem.classList.remove("wrapped"); return true; } @@ -315,7 +344,8 @@ const getNonwrappedItemsByPriority = (container: HTMLElement) => */ export const switchWrappedItemIntoView = ( container: HTMLElement, - overflowItem: OverflowItem + overflowItem: OverflowItem, + orientation: orientationType ): [OverflowItem[], OverflowItem[]] => { const unwrappedItems = getNonwrappedItemsByPriority(container); const targetElement = getElementByDataIndex( @@ -325,11 +355,12 @@ export const switchWrappedItemIntoView = ( ); let pos = -1; let unwrappedItem = unwrappedItems.at(pos) as HTMLElement; - const itemWidth = getElementWidth(unwrappedItem); - const targetWidth = getElementWidth(targetElement); + const sizeProperty = orientation === "horizontal" ? "width" : "height"; + const itemWidth = getElementSize(unwrappedItem, sizeProperty); + const targetWidth = getElementSize(targetElement, sizeProperty); const overflowIndicator = getOverflowIndicator(container); let availableSpace = - getAvailableSpace(container, overflowIndicator) + itemWidth; + getAvailableSpace(container, overflowIndicator, orientation) + itemWidth; if (availableSpace >= targetWidth) { switchWrapOnElements(targetElement, unwrappedItem); } else { @@ -351,8 +382,10 @@ export const switchWrappedItemIntoView = ( item.classList.add("wrapped"); }); } - const [nonWrappedItems, wrappedItems] = - getNonWrappedAndWrappedItems(container); + const [nonWrappedItems, wrappedItems] = getNonWrappedAndWrappedItems( + container, + orientation + ); unmarkItemsWhichAreNoLongerWrapped(container, wrappedItems); return [nonWrappedItems, wrappedItems]; }; diff --git a/vuu-ui/packages/vuu-ui-controls/src/overflow-container/useOverflowContainer.ts b/vuu-ui/packages/vuu-ui-controls/src/overflow-container/useOverflowContainer.ts index ffbbd8563..e3048afc8 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/overflow-container/useOverflowContainer.ts +++ b/vuu-ui/packages/vuu-ui-controls/src/overflow-container/useOverflowContainer.ts @@ -24,10 +24,8 @@ import { import { OverflowContainerProps } from "./OverflowContainer"; export interface OverflowContainerHookProps - extends Pick< - OverflowContainerProps, - "allowDragDrop" | "onMoveItem" | "orientation" - > { + extends Pick, + Required> { itemCount: number; onSwitchWrappedItemIntoView?: (overflowItem: OverflowItem) => void; } @@ -37,7 +35,7 @@ export const useOverflowContainer = ({ itemCount, onMoveItem, onSwitchWrappedItemIntoView, - orientation = "horizontal", + orientation, }: OverflowContainerHookProps) => { const [container, setContainer] = useState(null); const wrappedItemsRef = useRef(NO_WRAPPED_ITEMS); @@ -64,7 +62,11 @@ export const useOverflowContainer = ({ "vuuOverflowContainer-wrapContainer" ); if (overflowIndicatorHasWrappedButShouldNotHave(wrapped)) { - wrapped = await correctForWrappedOverflowIndicator(container, wrapped); + wrapped = await correctForWrappedOverflowIndicator( + container, + wrapped, + orientation + ); } while ( highPriorityItemsHaveWrappedButShouldNotHave(nonWrapped, wrapped) @@ -72,11 +74,12 @@ export const useOverflowContainer = ({ [nonWrapped, wrapped] = await correctForWrappedHighPriorityItems( container, nonWrapped, - wrapped + wrapped, + orientation ); } if (wrapped.length === 1) { - if (removeOverflowIndicatorIfNoLongerNeeded(container)) { + if (removeOverflowIndicatorIfNoLongerNeeded(container, orientation)) { wrapped = NO_WRAPPED_ITEMS; } } @@ -119,7 +122,8 @@ export const useOverflowContainer = ({ // TODO do we always want to switch it into view - leave that to caller const [, wrappedItems] = switchWrappedItemIntoView( container, - options.overflowItem + options.overflowItem, + orientation ); wrappedItemsRef.current = wrappedItems; onSwitchWrappedItemIntoView?.(options.overflowItem); @@ -127,7 +131,7 @@ export const useOverflowContainer = ({ return true; }, ]; - }, [container, onSwitchWrappedItemIntoView]); + }, [container, onSwitchWrappedItemIntoView, orientation]); const resizeObserver = useMemo(() => { const { sizeProp } = MEASURES[orientation]; diff --git a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tab.css b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tab.css index 81794c69e..bd4cd0378 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tab.css +++ b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tab.css @@ -1,21 +1,21 @@ /* Class applied to root Tab element */ .vuuTab { - --saltEditableLabel-padding: 0; --saltEditableLabel-height: calc(var(--tabstrip-height) - 2px); --saltInputLegacy-minWidth: 4em; --saltEditableLabel-top: 2px; - --tab-background: var(--vuuTab-background, var(--salt-navigable-primary-background)); + --tab-background: var(--vuuTab-background, transparent); --tab-cursor: pointer; --tab-position: relative; -} -.vuuTab { + align-items: center; align-self: stretch; background: var(--tab-background); - border: none; + border-color: var(--vuuTab-borderColor, transparent); + border-style: var(--vuuTab-borderStyle, none); + border-width: var(--vuuTab-borderWidth, 0px); border-radius: var(--vuuTab-borderRadius, 0); color: var(--salt-text-primary-foreground); cursor: var(--vuuTab-cursor, var(--tab-cursor)); @@ -23,23 +23,15 @@ gap: 8px; height: var(--vuuTabHeight, var(--tab-height)); letter-spacing: var(--vuuTab-letterSpacing, var(--tab-letterSpacing, 0)); + margin: 0 var(--tab-spacing) 0 0; min-width: var(--vuuTab-minWidth, 40px); outline: none; - padding: var(--vuuTab-padding, 0 24px); + padding: var(--vuuTab-padding, 0 var(--salt-spacing-200)); position: var(--vuuTab-position, var(--tab-position)); user-select: none; width: var(--tab-width) } -/* Overrides characteristic used in saltFocusVisible */ -/* .vuuTab.saltFocusVisible:after { - inset: 2px 2px 4px 2px; -} */ - -.vuuTab { - margin: 0 var(--tab-spacing) 0 0; -} - .vuuTab-selected { background: var(--vuuTab-background-selected, var(--tab-background)); color: var(--salt-text-primary-foreground); diff --git a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.css b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.css index 14ef26e00..d006ac8e0 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.css +++ b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.css @@ -1,3 +1,3 @@ .vuuTabMenu { - top: var(--vuuTabMenu-top, -2px); + top: var(--vuuTabMenu-top, 0px); } \ No newline at end of file diff --git a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.tsx b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.tsx index 41e4a9703..db4bf1dc8 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.tsx +++ b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabMenu.tsx @@ -68,14 +68,15 @@ export const TabMenu = ({ return ( ); }; diff --git a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabsTypes.ts b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabsTypes.ts index e75eee04c..2fb658458 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabsTypes.ts +++ b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/TabsTypes.ts @@ -115,6 +115,12 @@ export interface TabstripProps extends HTMLAttributes { * An optional classname that will be added to each tab */ tabClassName?: string; + + /** + * An optional classifier, used to create a classname, intended + * for promary vs secondary bavigation. + */ + variant?: "primary" | "secondary"; } export type exitEditHandler = ( diff --git a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.css b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.css index ae4e409d0..812d0cb2c 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.css +++ b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.css @@ -1,7 +1,8 @@ /* Component class applied to the root element */ .vuuTabstrip { --vuuOverflowContainer-background: transparent; - /* --tabstrip-height: var(--vuuTabstrip-height, var(--salt-size-stackable)); */ + --vuuOverflowContainer-borderColor: var(--salt-container-primary-borderColor); + --vuuOverflowContainer-width: var(--tabstrip-width); --tabstrip-dragging-display: none; --tabstrip-display: inline-flex; --tabstrip-background: transparent; @@ -13,16 +14,14 @@ min-width: 28px; position: relative; overflow: visible; - width: var(--tabstrip-width); } /* Tabstrip orientation is horizontal */ -.vuuTabstrip-horizontal { - --vuuOverflowContainer-borderColor: var(--salt-container-primary-borderColor); +.vuuTabstrip.vuuOrientation-horizontal { --vuuOverflowContainer-borderStyle: none none solid none; --vuuOverflowContainer-borderBottomWidth: 1px; - --tabstrip-height: var(--vuuTabstrip-height, 28px); + --tabstrip-height: var(--vuuTabstrip-height, var(--overflow-wrapper-height,28px)); --tabstrip-width: var(--vuuTabstrip-width, 100%); --tab-height: var(--tabstrip-height); --tab-width: auto; @@ -35,7 +34,7 @@ } /* Tabstrip orientation is vertical */ -.vuuTabstrip-vertical { +.vuuTabstrip.vuuOrientation-vertical { --tabstrip-height: var(--vuuTabstrip-height, 100%); --tabstrip-width: var(--vuuTabstrip-width, 100px); --tab-height: 50px; @@ -79,7 +78,7 @@ line-height: var(--tabstrip-height); } -.vuuTabstrip-vertical .vuuTabstrip-inner { +.vuuTabstrip.vuuOrientation-vertical .vuuTabstrip-inner { flex-direction: column; height: auto; } diff --git a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.tsx b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.tsx index be5c25dd3..85f171c8a 100644 --- a/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.tsx +++ b/vuu-ui/packages/vuu-ui-controls/src/tabstrip/Tabstrip.tsx @@ -30,6 +30,7 @@ export const Tabstrip = ({ showTabMenuButton, style: styleProp, tabClassName, + variant = "secondary", ...htmlAttributes }: TabstripProps) => { const rootRef = useRef(null); @@ -55,7 +56,7 @@ export const Tabstrip = ({ orientation, }); const id = useId(idProp); - const className = cx(classBase, `${classBase}-${orientation}`, classNameProp); + const className = cx(classBase, classNameProp); const style = styleProp || containerStyle ? { @@ -101,6 +102,7 @@ export const Tabstrip = ({ {...tabstripHook.navigationProps} aria-label="Create Tab" className={`${classBase}-addTabButton`} + data-embedded icon="add" data-overflow-priority="1" key="addButton" @@ -135,8 +137,7 @@ export const Tabstrip = ({ buildPackage(packageName)); diff --git a/vuu-ui/scripts/build-themes.mjs b/vuu-ui/scripts/build-themes.mjs new file mode 100644 index 000000000..8d4c22b54 --- /dev/null +++ b/vuu-ui/scripts/build-themes.mjs @@ -0,0 +1,26 @@ +import { execWait, getCommandLineArg, withArgs } from "./utils.mjs"; + +const jsonOutput = getCommandLineArg("json", false); + +export const buildAll = async () => { + const buildPackage = async (packageName) => + execWait( + `npm run --silent build${withArgs("dev", "debug")}`, + `themes/${packageName}` + ); + + // TODO determine the dependency graph/build order programatically + const packages = ["tar-theme"]; + + if (jsonOutput) { + console.log( + JSON.stringify({ + "package-list": packages, + }) + ); + } + + await Promise.all(packages.map(buildPackage)); +}; + +buildAll(); diff --git a/vuu-ui/showcase/icon512.png b/vuu-ui/showcase/icon512.png new file mode 100644 index 0000000000000000000000000000000000000000..3f46c9d48580e65122fa2b570ad5b7978637c7ac GIT binary patch literal 23484 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 I?Qr6M04uw33IG5A literal 0 HcmV?d00001 diff --git a/vuu-ui/showcase/manifest.json b/vuu-ui/showcase/manifest.json new file mode 100644 index 000000000..0f2b677a4 --- /dev/null +++ b/vuu-ui/showcase/manifest.json @@ -0,0 +1,17 @@ +{ + "lang": "en-us", + "name": "Vuu Showcase", + "short_name": "Vuu showcase", + "description": "A showcase for Vuu components, patterns and documentation", + "start_url": "/", + "background_color": "red", + "theme_color": "green", + "orientation": "any", + "display": "standalone", + "icons": [ + { + "src": "/icon512.png", + "sizes": "512x512" + } + ] +} diff --git a/vuu-ui/showcase/src/examples/Layout/Toolbar.examples.tsx b/vuu-ui/showcase/src/examples/Layout/Toolbar.examples.tsx index e9876d923..bd06bb94c 100644 --- a/vuu-ui/showcase/src/examples/Layout/Toolbar.examples.tsx +++ b/vuu-ui/showcase/src/examples/Layout/Toolbar.examples.tsx @@ -25,7 +25,6 @@ export const DefaulToolbar = () => { } > { } > { > { > { > { } > { } > { } > { } > { scrollingApiRef={scrollingAPI} width={1000} /> - + diff --git a/vuu-ui/showcase/src/examples/Table/Table.examples.tsx b/vuu-ui/showcase/src/examples/Table/Table.examples.tsx index 0bcb37474..2f2728489 100644 --- a/vuu-ui/showcase/src/examples/Table/Table.examples.tsx +++ b/vuu-ui/showcase/src/examples/Table/Table.examples.tsx @@ -153,7 +153,7 @@ export const ControlledNavigation = () => { return ( <> - + diff --git a/vuu-ui/showcase/src/examples/Layout/OverflowContainer.examples.css b/vuu-ui/showcase/src/examples/UiControls/OverflowContainer.examples.css similarity index 55% rename from vuu-ui/showcase/src/examples/Layout/OverflowContainer.examples.css rename to vuu-ui/showcase/src/examples/UiControls/OverflowContainer.examples.css index b49635ca1..dee66a7cc 100644 --- a/vuu-ui/showcase/src/examples/Layout/OverflowContainer.examples.css +++ b/vuu-ui/showcase/src/examples/UiControls/OverflowContainer.examples.css @@ -1,17 +1,13 @@ .Item { background-color: var(--item-bg, blue); color: white; - height: 32px; + height: var(--salt-size-base); } -.vuuOverflowContainer-vertical .Item { +.vuuOverflowContainer.vuuOrientation-vertical .Item { width: 100%; } [data-overflow-priority="1"].Item { background-color: pink; } - -.vuuOverflowContainer-wrapContainer { - /* overflow: visible; */ -} \ No newline at end of file diff --git a/vuu-ui/showcase/src/examples/Layout/OverflowContainer.examples.tsx b/vuu-ui/showcase/src/examples/UiControls/OverflowContainer.examples.tsx similarity index 91% rename from vuu-ui/showcase/src/examples/Layout/OverflowContainer.examples.tsx rename to vuu-ui/showcase/src/examples/UiControls/OverflowContainer.examples.tsx index 413049800..37c93b992 100644 --- a/vuu-ui/showcase/src/examples/Layout/OverflowContainer.examples.tsx +++ b/vuu-ui/showcase/src/examples/UiControls/OverflowContainer.examples.tsx @@ -19,7 +19,7 @@ export const DefaultOverflowContainer = () => { } as CSSProperties } > - +

@@ -60,7 +60,7 @@ export const WrapOverflowContainerFlexLayout = () => { style={{ flex: 1, flexDirection: "column", background: "#ccc" }} > {/* prettier-ignore */} - +
1
2
3
@@ -69,7 +69,7 @@ export const WrapOverflowContainerFlexLayout = () => {
6
{/* prettier-ignore */} - +
1
2
3
@@ -79,7 +79,7 @@ export const WrapOverflowContainerFlexLayout = () => {
7
{/* prettier-ignore */} - +
1
2
3
@@ -129,7 +129,7 @@ export const OverflowContainerHighPriorityItem = () => { style={{ flex: 1, flexDirection: "column", background: "#ccc" }} > {/* prettier-ignore */} - +
1
2
3
@@ -138,7 +138,7 @@ export const OverflowContainerHighPriorityItem = () => {
6
{/* prettier-ignore */} - +
1
2
3
@@ -147,7 +147,7 @@ export const OverflowContainerHighPriorityItem = () => {
6
{/* prettier-ignore */} - +
1
2
3
@@ -161,7 +161,7 @@ export const OverflowContainerHighPriorityItem = () => {
11
{/* prettier-ignore */} - +
1
2
3
@@ -189,11 +189,7 @@ export const TestFixtureSimpleOverflowContainer = ({ width = 600 }) => { return ( <> - +
@@ -240,9 +236,8 @@ export const SortableOverflowContainer = () => { > {items.map((item) => (
@@ -283,7 +278,7 @@ export const VerticalOverflowContainerFlexLayout = () => { style={{ background: "lightcyan", flex: 1, overflow: "hidden" }} > {/* prettier-ignore */} - +
1
2
3
diff --git a/vuu-ui/showcase/src/examples/UiControls/Tabstrip.examples.tsx b/vuu-ui/showcase/src/examples/UiControls/Tabstrip.examples.tsx index a2b789ebc..d1c219cbe 100644 --- a/vuu-ui/showcase/src/examples/UiControls/Tabstrip.examples.tsx +++ b/vuu-ui/showcase/src/examples/UiControls/Tabstrip.examples.tsx @@ -1,4 +1,9 @@ -import { ExitEditModeHandler, Tab, Tabstrip } from "@finos/vuu-ui-controls"; +import { + ExitEditModeHandler, + Tab, + Tabstrip, + TabstripProps, +} from "@finos/vuu-ui-controls"; import { moveItem } from "@finos/vuu-utils"; import { useCallback, useState } from "react"; import { FlexboxLayout, LayoutProvider } from "@finos/vuu-layout"; @@ -9,9 +14,85 @@ const SPLITTER_WIDTH = 3; let displaySequence = 1; -export const DefaultTabstripNext = ({ +export const DefaultTabstrip = ({ + activeTabIndex: activeTabIndexProp = 0, + width = 500, +}) => { + const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp); + const tabs = ["Home", "Transactions", "Loans", "Checks", "Liquidity"]; + return ( + + +
+ + {tabs.map((label, i) => ( + + ))} + +
+
+ + + ); +}; + +DefaultTabstrip.displaySequence = displaySequence++; + +export const OveflowingTabstrip = ({ + activeTabIndex: activeTabIndexProp = 0, + width = 350, +}) => { + const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp); + const tabs = ["Home", "Transactions", "Loans", "Checks", "Liquidity"]; + return ( + + +
+ + {tabs.map((label, i) => ( + + ))} + +
+
+ + + ); +}; + +OveflowingTabstrip.displaySequence = displaySequence++; + +export const OveflowingSelectedTab = ({ activeTabIndex: activeTabIndexProp = 4, - width = 700, + width = 350, }) => { const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp); const tabs = ["Home", "Transactions", "Loans", "Checks", "Liquidity"]; @@ -45,9 +126,9 @@ export const DefaultTabstripNext = ({ ); }; -DefaultTabstripNext.displaySequence = displaySequence++; +OveflowingSelectedTab.displaySequence = displaySequence++; -export const TabstripNextAddTab = ({ width = 700 }) => { +export const TabstripAddTab = ({ width = 700 }) => { const [activeTabIndex, setActiveTabIndex] = useState(0); const [tabs, setTabs] = useState([{ label: "Home" }]); @@ -89,9 +170,9 @@ export const TabstripNextAddTab = ({ width = 700 }) => { ); }; -TabstripNextAddTab.displaySequence = displaySequence++; +TabstripAddTab.displaySequence = displaySequence++; -export const TabstripNextRemoveTab = ({ width = 700 }) => { +export const TabstripRemoveTab = ({ width = 700 }) => { const [activeTabIndex, setActiveTabIndex] = useState(0); const [tabs, setTabs] = useState([{ label: "Home" }]); @@ -142,9 +223,9 @@ export const TabstripNextRemoveTab = ({ width = 700 }) => { ); }; -TabstripNextRemoveTab.displaySequence = displaySequence++; +TabstripRemoveTab.displaySequence = displaySequence++; -export const TabstripNextEditableLabels = ({ +export const TabstripEditableLabels = ({ activeTabIndex: activeTabIndexProp = 0, width = 700, }) => { @@ -190,17 +271,11 @@ export const TabstripNextEditableLabels = ({ ); }; -TabstripNextEditableLabels.displaySequence = displaySequence++; +TabstripEditableLabels.displaySequence = displaySequence++; -export const TabstripNextDragDrop = ({ width = 700 }) => { +export const TabstripDragDrop = ({ width = 700 }) => { const [activeTabIndex, setActiveTabIndex] = useState(0); - const [tabs, setTabs] = useState([ - "Home", - "Transactions", - "Loans", - "Checks", - "Liquidity", - ]); + const [tabs, setTabs] = useState(["Home", "Transactions", "Loans", "Checks"]); const handleDrop = useCallback((fromIndex: number, toIndex: number) => { setTabs((tabs) => moveItem(tabs, fromIndex, toIndex)); @@ -238,7 +313,83 @@ export const TabstripNextDragDrop = ({ width = 700 }) => { ); }; -TabstripNextDragDrop.displaySequence = displaySequence++; +TabstripDragDrop.displaySequence = displaySequence++; + +const TabstripBase = (props: Partial) => { + const [activeTabIndex, setActiveTabIndex] = useState(0); + const [tabs, setTabs] = useState([ + "Home", + "Transactions", + "Loans", + "Checks", + "Liquidity", + ]); + + const handleDrop = useCallback((fromIndex: number, toIndex: number) => { + setTabs((tabs) => moveItem(tabs, fromIndex, toIndex)); + }, []); + return ( + + {tabs.map((label, i) => ( + + ))} + + ); +}; + +export const TabstripVariations = () => { + return ( +
+ Primary + + + + + + + + + Secondary + + + + + + + +
+ ); +}; + +TabstripVariations.displaySequence = displaySequence++; /* const CloseTabWarningDialog = ({ diff --git a/vuu-ui/showcase/src/examples/UiControls/index.ts b/vuu-ui/showcase/src/examples/UiControls/index.ts index 430504685..b7cc4f594 100644 --- a/vuu-ui/showcase/src/examples/UiControls/index.ts +++ b/vuu-ui/showcase/src/examples/UiControls/index.ts @@ -7,6 +7,7 @@ export * as EditableLabel from "./EditableLabel.examples"; export * as InstrumentPicker from "./InstrumentPicker.examples"; export * as InstrumentSearch from "./InstrumentSearch.examples"; export * as List from "./List.examples"; +export * as OverflowContainer from "./OverflowContainer.examples"; export * as Tree from "./Tree.examples"; export * as SplitButton from "./SplitButton.examples"; export * as Tabstrip from "./Tabstrip.examples"; diff --git a/vuu-ui/showcase/src/examples/salt/Button.examples.tsx b/vuu-ui/showcase/src/examples/salt/Button.examples.tsx index 8a04048ec..d0d6adb29 100644 --- a/vuu-ui/showcase/src/examples/salt/Button.examples.tsx +++ b/vuu-ui/showcase/src/examples/salt/Button.examples.tsx @@ -50,21 +50,27 @@ export const ButtonVariations = () => { alignItems: "center", display: "grid", gap: 20, - gridTemplateColumns: "1fr 1fr 1fr 1fr", + gridTemplateColumns: "1fr 1fr 1fr 1fr 1fr", justifyItems: "left", }} > + CTA Primary Secondary - CTA + Embedded + - + + - active + { icon="filter" variant="secondary" /> - + active + - disabled + - + disabled + - diff --git a/vuu-ui/themes/tar-theme/NunitoSans.css b/vuu-ui/themes/tar-theme/NunitoSans.css new file mode 100644 index 000000000..a046ad4a9 --- /dev/null +++ b/vuu-ui/themes/tar-theme/NunitoSans.css @@ -0,0 +1,71 @@ +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-stretch: 100%; + font-display: swap; + src: url(./fonts/NunitoSansv15Latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(./fonts/NunitoSansv15Latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(./fonts/NunitoSansv15Latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 600; + font-stretch: 100%; + font-display: swap; + src: url(./fonts/NunitoSansv15Latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(./fonts/NunitoSansv15Latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 800; + font-stretch: 100%; + font-display: swap; + src: url(./fonts/NunitoSansv15Latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* This font contains the variation of the 'a' character, which can be applied with `font-feature-settings` as per Figma */ +@font-face { + font-family: 'Nunito Sans A-Variant'; + src: url('./fonts/NunitoSans-Regular.woff') format('opentype'); +} diff --git a/vuu-ui/themes/tar-theme/SomeTypeMono.css b/vuu-ui/themes/tar-theme/SomeTypeMono.css new file mode 100644 index 000000000..3db9d6d66 --- /dev/null +++ b/vuu-ui/themes/tar-theme/SomeTypeMono.css @@ -0,0 +1,8 @@ +@font-face { + font-family: 'Sometype Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(./fonts/SomeTypeMonov1-500.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/characteristics/accent.css b/vuu-ui/themes/tar-theme/css/characteristics/accent.css new file mode 100644 index 000000000..df7a915aa --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/accent.css @@ -0,0 +1,5 @@ +.tar-theme { + --salt-accent-background: var(--salt-palette-accent-background); + --salt-accent-borderColor: var(--salt-palette-accent-border); + --salt-accent-foreground: var(--salt-palette-accent-foreground); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/actionable.css b/vuu-ui/themes/tar-theme/css/characteristics/actionable.css new file mode 100644 index 000000000..faefaf382 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/actionable.css @@ -0,0 +1,35 @@ +.tar-theme { + --salt-actionable-cursor-hover: pointer; + --salt-actionable-cursor-active: pointer; + --salt-actionable-cursor-disabled: not-allowed; + + /* Primary variant */ + --salt-actionable-primary-foreground: var(--salt-palette-interact-primary-foreground); + --salt-actionable-primary-foreground-hover: var(--salt-palette-interact-primary-foreground-hover); + --salt-actionable-primary-foreground-active: var(--salt-palette-interact-primary-foreground-active); + --salt-actionable-primary-foreground-disabled: var(--salt-palette-interact-primary-foreground-disabled); + --salt-actionable-primary-background: var(--salt-palette-interact-primary-background); + --salt-actionable-primary-background-hover: var(--salt-palette-interact-primary-background-hover); + --salt-actionable-primary-background-active: var(--salt-palette-interact-primary-background-active); + --salt-actionable-primary-background-disabled: var(--salt-palette-interact-primary-background-disabled); + + /* CTA variant */ + --salt-actionable-cta-foreground: var(--salt-palette-interact-cta-foreground); + --salt-actionable-cta-foreground-hover: var(--salt-palette-interact-cta-foreground-hover); + --salt-actionable-cta-foreground-active: var(--salt-palette-interact-cta-foreground-active); + --salt-actionable-cta-foreground-disabled: var(--salt-palette-interact-cta-foreground-disabled); + --salt-actionable-cta-background: var(--salt-palette-interact-cta-background); + --salt-actionable-cta-background-hover: var(--salt-palette-interact-cta-background-hover); + --salt-actionable-cta-background-active: var(--salt-palette-interact-cta-background-active); + --salt-actionable-cta-background-disabled: var(--salt-palette-interact-cta-background-disabled); + + /* Secondary variant */ + --salt-actionable-secondary-foreground: var(--salt-palette-interact-secondary-foreground); + --salt-actionable-secondary-foreground-hover: var(--salt-palette-interact-secondary-foreground-hover); + --salt-actionable-secondary-foreground-active: var(--salt-palette-interact-secondary-foreground-active); + --salt-actionable-secondary-foreground-disabled: var(--salt-palette-interact-secondary-foreground-disabled); + --salt-actionable-secondary-background: var(--salt-palette-interact-secondary-background); + --salt-actionable-secondary-background-hover: var(--salt-palette-interact-secondary-background-hover); + --salt-actionable-secondary-background-active: var(--salt-palette-interact-secondary-background-active); + --salt-actionable-secondary-background-disabled: var(--salt-palette-interact-secondary-background-disabled); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/container.css b/vuu-ui/themes/tar-theme/css/characteristics/container.css new file mode 100644 index 000000000..623bca463 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/container.css @@ -0,0 +1,13 @@ +.tar-theme { + --salt-container-borderStyle: solid; + + --salt-container-primary-background: var(--salt-palette-neutral-primary-background); + --salt-container-primary-background-disabled: var(--salt-palette-neutral-primary-background-disabled); + --salt-container-primary-borderColor: var(--salt-palette-neutral-primary-border); + --salt-container-primary-borderColor-disabled: var(--salt-palette-neutral-primary-border-disabled); + + --salt-container-secondary-background: var(--salt-palette-neutral-secondary-background); + --salt-container-secondary-background-disabled: var(--salt-palette-neutral-secondary-background-disabled); + --salt-container-secondary-borderColor: var(--salt-palette-neutral-secondary-border); + --salt-container-secondary-borderColor-disabled: var(--salt-palette-neutral-secondary-border-disabled); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/content.css b/vuu-ui/themes/tar-theme/css/characteristics/content.css new file mode 100644 index 000000000..2a8f7d5b7 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/content.css @@ -0,0 +1,12 @@ +.tar-theme { + /* Colors */ + --salt-content-primary-foreground: var(--salt-palette-neutral-primary-foreground); + --salt-content-primary-foreground-disabled: var(--salt-palette-neutral-primary-foreground-disabled); + --salt-content-secondary-foreground: var(--salt-palette-neutral-secondary-foreground); + --salt-content-secondary-foreground-disabled: var(--salt-palette-neutral-secondary-foreground-disabled); + + --salt-content-foreground-hover: var(--salt-palette-navigate-foreground-hover); + --salt-content-foreground-active: var(--salt-palette-navigate-foreground-active); + --salt-content-foreground-visited: var(--salt-palette-navigate-foreground-visited); + --salt-content-foreground-highlight: var(--salt-palette-interact-background-active); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/draggable.css b/vuu-ui/themes/tar-theme/css/characteristics/draggable.css new file mode 100644 index 000000000..dc8490a58 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/draggable.css @@ -0,0 +1,10 @@ +.tar-theme { + --salt-draggable-horizontal-cursor-hover: row-resize; + --salt-draggable-horizontal-cursor-active: row-resize; + + --salt-draggable-vertical-cursor-hover: col-resize; + --salt-draggable-vertical-cursor-active: col-resize; + + --salt-draggable-grab-cursor-hover: grab; + --salt-draggable-grab-cursor-active: grabbing; +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/editable.css b/vuu-ui/themes/tar-theme/css/characteristics/editable.css new file mode 100644 index 000000000..22db4fe86 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/editable.css @@ -0,0 +1,33 @@ +.tar-theme { + --salt-editable-cursor-hover: text; + --salt-editable-cursor-active: text; + --salt-editable-cursor-disabled: not-allowed; + --salt-editable-cursor-readonly: text; + + --salt-editable-borderStyle: solid; + --salt-editable-borderStyle-hover: solid; + --salt-editable-borderStyle-active: solid; + --salt-editable-borderStyle-disabled: solid; + --salt-editable-borderStyle-readonly: solid; + --salt-editable-borderWidth-active: 2px; + + --salt-editable-borderColor: var(--salt-palette-interact-border); + --salt-editable-borderColor-active: var(--salt-palette-interact-border-active); + --salt-editable-borderColor-disabled: var(--salt-palette-interact-border-disabled); + --salt-editable-borderColor-hover: var(--salt-palette-interact-border-hover); + --salt-editable-borderColor-readonly: var(--salt-palette-interact-border-readonly); + + --salt-editable-primary-background: var(--salt-palette-neutral-primary-background); + --salt-editable-primary-background-active: var(--salt-palette-neutral-primary-background); + --salt-editable-primary-background-disabled: var(--salt-palette-neutral-primary-background-disabled); + --salt-editable-primary-background-hover: var(--salt-palette-neutral-primary-background); + --salt-editable-primary-background-readonly: var(--salt-palette-neutral-primary-background-readonly); + + --salt-editable-secondary-background: var(--salt-palette-neutral-secondary-background); + --salt-editable-secondary-background-active: var(--salt-palette-neutral-secondary-background); + --salt-editable-secondary-background-disabled: var(--salt-palette-neutral-secondary-background-disabled); + --salt-editable-secondary-background-hover: var(--salt-palette-neutral-secondary-background); + --salt-editable-secondary-background-readonly: var(--salt-palette-neutral-secondary-background-readonly); + + --salt-editable-help-fontStyle: italic; +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/focused.css b/vuu-ui/themes/tar-theme/css/characteristics/focused.css new file mode 100644 index 000000000..1345167a0 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/focused.css @@ -0,0 +1,21 @@ +.tar-theme { + --salt-focused-outlineColor: var(--salt-palette-interact-outline); + --salt-focused-outlineStyle: dotted; + --salt-focused-outlineWidth: 2px; + --salt-focused-outlineInset: 0; + --salt-focused-outlineOffset: 0; + + --salt-focused-outline: var(--salt-focused-outlineWidth) var(--salt-focused-outlineStyle) var(--salt-focused-outlineColor); /* CSS shortcut token: not in Figma */ +} + +.saltFocusVisible:after, +.focused:focus:after, +.focused:focus-visible:after { + content: ""; + inset: var(--salt-focused-outlineInset); + outline-color: var(--salt-focused-outlineColor); + outline-offset: var(--salt-focused-outlineOffset); + outline-style: var(--salt-focused-outlineStyle); + outline-width: var(--salt-focused-outlineWidth); + position: absolute; +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/navigable.css b/vuu-ui/themes/tar-theme/css/characteristics/navigable.css new file mode 100644 index 000000000..4a963e2d1 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/navigable.css @@ -0,0 +1,21 @@ +.tar-theme { + --salt-navigable-cursor-active: pointer; + --salt-navigable-cursor-hover: pointer; + --salt-navigable-cursor-disabled: not-allowed; + --salt-navigable-cursor-edit: text; + + --salt-navigable-fontWeight: var(--salt-typography-fontWeight-regular); + --salt-navigable-fontWeight-hover: var(--salt-typography-fontWeight-regular); + --salt-navigable-fontWeight-active: var(--salt-typography-fontWeight-semiBold); + --salt-navigable-fontWeight-edit: var(--salt-typography-fontWeight-regular); + + --salt-navigable-indicator-hover: var(--salt-palette-navigate-indicator-hover); + --salt-navigable-indicator-active: var(--salt-palette-navigate-indicator-active); + + --salt-navigable-background-hover: var(--salt-palette-navigate-primary-background-hover); + + /* Link */ + --salt-navigable-textDecoration: underline; + --salt-navigable-textDecoration-hover: none; + --salt-navigable-textDecoration-selected: underline; +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/overlayable.css b/vuu-ui/themes/tar-theme/css/characteristics/overlayable.css new file mode 100644 index 000000000..2efc63218 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/overlayable.css @@ -0,0 +1,11 @@ +.tar-theme { + --salt-overlayable-shadow-scroll: var(--salt-shadow-100); + --salt-overlayable-shadow-region: var(--salt-shadow-200); + --salt-overlayable-shadow: var(--salt-shadow-200); + --salt-overlayable-shadow-hover: var(--salt-shadow-300); + --salt-overlayable-shadow-popout: var(--salt-shadow-400); + --salt-overlayable-shadow-drag: var(--salt-shadow-400); + --salt-overlayable-shadow-modal: var(--salt-shadow-500); + + --salt-overlayable-background: var(--salt-palette-neutral-backdrop); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/selectable.css b/vuu-ui/themes/tar-theme/css/characteristics/selectable.css new file mode 100644 index 000000000..3b62fb504 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/selectable.css @@ -0,0 +1,31 @@ +.tar-theme { + --salt-selectable-cursor-hover: pointer; + --salt-selectable-cursor-selected: pointer; + --salt-selectable-cursor-blurSelected: pointer; + --salt-selectable-cursor-disabled: not-allowed; + --salt-selectable-cursor-readonly: not-allowed; + + --salt-selectable-borderStyle: solid; + --salt-selectable-borderStyle-hover: solid; + --salt-selectable-borderStyle-selected: solid; + --salt-selectable-borderStyle-blurSelected: solid; + + --salt-selectable-borderColor: var(--salt-palette-interact-border); + --salt-selectable-borderColor-hover: var(--salt-palette-interact-border-hover); + --salt-selectable-borderColor-selected: var(--salt-palette-interact-border-active); + --salt-selectable-borderColor-selectedDisabled: var(--salt-palette-interact-border-activeDisabled); + --salt-selectable-borderColor-disabled: var(--salt-palette-interact-border-disabled); + --salt-selectable-borderColor-readonly: var(--salt-palette-interact-border-readonly); + + --salt-selectable-foreground: var(--salt-palette-interact-foreground); + --salt-selectable-foreground-disabled: var(--salt-palette-interact-foreground-disabled); + --salt-selectable-foreground-hover: var(--salt-palette-interact-foreground-hover); + --salt-selectable-foreground-selected: var(--salt-palette-interact-foreground-active); + --salt-selectable-foreground-selectedDisabled: var(--salt-palette-interact-foreground-activeDisabled); + --salt-selectable-background: var(--salt-palette-interact-background); + --salt-selectable-background-hover: var(--salt-palette-interact-background-hover); + --salt-selectable-background-selected: var(--salt-palette-interact-background-active); + --salt-selectable-background-blurSelected: var(--salt-palette-interact-background-blurSelected); + --salt-selectable-background-disabled: var(--salt-palette-interact-background-disabled); + --salt-selectable-background-selectedDisabled: var(--salt-palette-interact-background-activeDisabled); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/separable.css b/vuu-ui/themes/tar-theme/css/characteristics/separable.css new file mode 100644 index 000000000..4fe4734ac --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/separable.css @@ -0,0 +1,7 @@ +.tar-theme { + --salt-separable-borderStyle: solid; + + --salt-separable-primary-borderColor: var(--salt-palette-neutral-primary-separator); + --salt-separable-secondary-borderColor: var(--salt-palette-neutral-secondary-separator); + --salt-separable-tertiary-borderColor: var(--salt-palette-neutral-tertiary-separator); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/status.css b/vuu-ui/themes/tar-theme/css/characteristics/status.css new file mode 100644 index 000000000..26b748b21 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/status.css @@ -0,0 +1,23 @@ +.tar-theme { + --salt-status-info-foreground: var(--salt-palette-info-foreground); + --salt-status-success-foreground: var(--salt-palette-success-foreground); + --salt-status-warning-foreground: var(--salt-palette-warning-foreground); + --salt-status-error-foreground: var(--salt-palette-error-foreground); + --salt-status-static-foreground: var(--salt-palette-neutral-secondary-foreground); + --salt-status-negative-foreground: var(--salt-palette-negative-foreground); + --salt-status-positive-foreground: var(--salt-palette-positive-foreground); + + --salt-status-info-borderColor: var(--salt-palette-info-border); + --salt-status-success-borderColor: var(--salt-palette-success-border); + --salt-status-warning-borderColor: var(--salt-palette-warning-border); + --salt-status-error-borderColor: var(--salt-palette-error-border); + + --salt-status-info-background: var(--salt-palette-info-background); + --salt-status-success-background: var(--salt-palette-success-background); + --salt-status-warning-background: var(--salt-palette-warning-background); + --salt-status-error-background: var(--salt-palette-error-background); + + --salt-status-success-background-selected: var(--salt-palette-success-background-selected); + --salt-status-warning-background-selected: var(--salt-palette-warning-background-selected); + --salt-status-error-background-selected: var(--salt-palette-error-background-selected); +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/target.css b/vuu-ui/themes/tar-theme/css/characteristics/target.css new file mode 100644 index 000000000..931e28d56 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/target.css @@ -0,0 +1,10 @@ +.tar-theme { + --salt-target-background-hover: var(--salt-palette-interact-background-hover); + + --salt-target-borderColor-hover: var(--salt-palette-interact-border-hover); + --salt-target-borderStyle: dashed; + --salt-target-borderStyle-hover: solid; + --salt-target-borderStyle-disabled: dashed; + + --salt-target-cursor-disabled: not-allowed; +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/text.css b/vuu-ui/themes/tar-theme/css/characteristics/text.css new file mode 100644 index 000000000..ae0bd7022 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/text.css @@ -0,0 +1,208 @@ +.tar-theme { + /* Misc */ + --salt-text-letterSpacing: 0; + --salt-text-textAlign: left; + --salt-text-textAlign-embedded: center; + --salt-text-textDecoration: none; + --salt-text-textTransform: none; + + /* Action */ + --salt-text-action-letterSpacing: 0.6px; + --salt-text-action-textTransform: uppercase; + --salt-text-action-textAlign: center; + --salt-text-action-fontWeight: var(--salt-typography-fontWeight-semiBold); + + /* Body text (should be used as default) */ + --salt-text-fontFamily: var(--salt-typography-fontFamily); + --salt-text-fontWeight: var(--salt-typography-fontWeight-regular); + --salt-text-fontWeight-small: var(--salt-typography-fontWeight-light); + --salt-text-fontWeight-strong: var(--salt-typography-fontWeight-semiBold); + + /* Notation */ + --salt-text-notation-fontFamily: var(--salt-typography-fontFamily); + --salt-text-notation-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-notation-fontWeight-small: var(--salt-typography-fontWeight-regular); + --salt-text-notation-fontWeight-strong: var(--salt-typography-fontWeight-bold); + + /* H1 */ + --salt-text-h1-fontFamily: var(--salt-typography-fontFamily); + --salt-text-h1-fontWeight: var(--salt-typography-fontWeight-bold); + --salt-text-h1-fontWeight-small: var(--salt-typography-fontWeight-medium); + --salt-text-h1-fontWeight-strong: var(--salt-typography-fontWeight-extraBold); + + /* H2 */ + --salt-text-h2-fontFamily: var(--salt-typography-fontFamily); + --salt-text-h2-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-h2-fontWeight-small: var(--salt-typography-fontWeight-regular); + --salt-text-h2-fontWeight-strong: var(--salt-typography-fontWeight-bold); + + /* H3 */ + --salt-text-h3-fontFamily: var(--salt-typography-fontFamily); + --salt-text-h3-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-h3-fontWeight-small: var(--salt-typography-fontWeight-regular); + --salt-text-h3-fontWeight-strong: var(--salt-typography-fontWeight-bold); + + /* H4 */ + --salt-text-h4-fontFamily: var(--salt-typography-fontFamily); + --salt-text-h4-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-h4-fontWeight-small: var(--salt-typography-fontWeight-regular); + --salt-text-h4-fontWeight-strong: var(--salt-typography-fontWeight-bold); + + /* Label */ + --salt-text-label-fontFamily: var(--salt-typography-fontFamily); + --salt-text-label-fontWeight: var(--salt-typography-fontWeight-regular); + --salt-text-label-fontWeight-small: var(--salt-typography-fontWeight-light); + --salt-text-label-fontWeight-strong: var(--salt-typography-fontWeight-semiBold); + + /* Display text */ + --salt-text-display1-fontFamily: var(--salt-typography-fontFamily); + --salt-text-display1-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-display1-fontWeight-strong: var(--salt-typography-fontWeight-bold); + --salt-text-display1-fontWeight-small: var(--salt-typography-fontWeight-regular); + + --salt-text-display2-fontFamily: var(--salt-typography-fontFamily); + --salt-text-display2-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-display2-fontWeight-strong: var(--salt-typography-fontWeight-bold); + --salt-text-display2-fontWeight-small: var(--salt-typography-fontWeight-regular); + + --salt-text-display3-fontFamily: var(--salt-typography-fontFamily); + --salt-text-display3-fontWeight: var(--salt-typography-fontWeight-semiBold); + --salt-text-display3-fontWeight-strong: var(--salt-typography-fontWeight-bold); + --salt-text-display3-fontWeight-small: var(--salt-typography-fontWeight-regular); + + /* Code */ + --salt-text-code-fontFamily: var(--salt-typography-fontFamily-code); +} + +/* Sizes by density */ +.tar-density-touch { + --salt-text-h1-fontSize: 42px; + --salt-text-h1-lineHeight: 54px; + + --salt-text-h2-fontSize: 32px; + --salt-text-h2-lineHeight: 42px; + + --salt-text-h3-fontSize: 24px; + --salt-text-h3-lineHeight: 32px; + + --salt-text-h4-fontSize: 16px; + --salt-text-h4-lineHeight: 20px; + + --salt-text-label-fontSize: 14px; + --salt-text-label-lineHeight: 18px; + + --salt-text-fontSize: 16px; + --salt-text-lineHeight: 20px; + --salt-text-minHeight: 20px; + + --salt-text-display1-fontSize: 84px; + --salt-text-display1-lineHeight: 109px; + + --salt-text-display2-fontSize: 58px; + --salt-text-display2-lineHeight: 76px; + + --salt-text-display3-fontSize: 42px; + --salt-text-display3-lineHeight: 54px; + + --salt-text-notation-fontSize: 14px; + --salt-text-notation-lineHeight: 18px; +} + +.tar-density-low { + --salt-text-h1-fontSize: 32px; + --salt-text-h1-lineHeight: 42px; + + --salt-text-h2-fontSize: 24px; + --salt-text-h2-lineHeight: 32px; + + --salt-text-h3-fontSize: 18px; + --salt-text-h3-lineHeight: 24px; + + --salt-text-h4-fontSize: 14px; + --salt-text-h4-lineHeight: 18px; + + --salt-text-label-fontSize: 12px; + --salt-text-label-lineHeight: 16px; + + --salt-text-fontSize: 14px; + --salt-text-lineHeight: 18px; + --salt-text-minHeight: 18px; + + --salt-text-display1-fontSize: 68px; + --salt-text-display1-lineHeight: 88px; + + --salt-text-display2-fontSize: 46px; + --salt-text-display2-lineHeight: 60px; + + --salt-text-display3-fontSize: 32px; + --salt-text-display3-lineHeight: 42px; + + --salt-text-notation-fontSize: 12px; + --salt-text-notation-lineHeight: 16px; +} + +.tar-density-medium { + --salt-text-h1-fontSize: 24px; + --salt-text-h1-lineHeight: 32px; + + --salt-text-h2-fontSize: 18px; + --salt-text-h2-lineHeight: 24px; + + --salt-text-h3-fontSize: 14px; + --salt-text-h3-lineHeight: 18px; + + --salt-text-h4-fontSize: 12px; + --salt-text-h4-lineHeight: 16px; + + --salt-text-label-fontSize: 11px; + --salt-text-label-lineHeight: 14px; + + --salt-text-fontSize: 12px; + --salt-text-lineHeight: 16px; + --salt-text-minHeight: 16px; + + --salt-text-display1-fontSize: 54px; + --salt-text-display1-lineHeight: 70px; + + --salt-text-display2-fontSize: 36px; + --salt-text-display2-lineHeight: 47px; + + --salt-text-display3-fontSize: 24px; + --salt-text-display3-lineHeight: 32px; + + --salt-text-notation-fontSize: 10px; + --salt-text-notation-lineHeight: 13px; +} + +.tar-density-high { + --salt-text-h1-fontSize: 18px; + --salt-text-h1-lineHeight: 24px; + + --salt-text-h2-fontSize: 14px; + --salt-text-h2-lineHeight: 18px; + + --salt-text-h3-fontSize: 12px; + --salt-text-h3-lineHeight: 16px; + + --salt-text-h4-fontSize: 11px; + --salt-text-h4-lineHeight: 14px; + + --salt-text-label-fontSize: 10px; + --salt-text-label-lineHeight: 13px; + + --salt-text-fontSize: 12px; + --salt-text-lineHeight: 16px; + --salt-text-minHeight: 16px; + + --salt-text-display1-fontSize: 42px; + --salt-text-display1-lineHeight: 54px; + + --salt-text-display2-fontSize: 28px; + --salt-text-display2-lineHeight: 36px; + + --salt-text-display3-fontSize: 18px; + --salt-text-display3-lineHeight: 24px; + + --salt-text-notation-fontSize: 8px; + --salt-text-notation-lineHeight: 10px; +} diff --git a/vuu-ui/themes/tar-theme/css/characteristics/track.css b/vuu-ui/themes/tar-theme/css/characteristics/track.css new file mode 100644 index 000000000..42b95d791 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/characteristics/track.css @@ -0,0 +1,8 @@ +.tar-theme { + --salt-track-borderStyle: solid; + --salt-track-borderStyle-active: solid; + --salt-track-borderStyle-complete: solid; + --salt-track-borderStyle-incomplete: dotted; + + --salt-track-borderColor: var(--salt-palette-neutral-secondary-border); +} diff --git a/vuu-ui/themes/tar-theme/css/components/button.css b/vuu-ui/themes/tar-theme/css/components/button.css new file mode 100644 index 000000000..6765c90a6 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/button.css @@ -0,0 +1,54 @@ + +.tar-theme { + /** TODO these will need density variants */ + --saltButton-borderRadius: 2px; + --saltButton-padding: var(--salt-spacing-200); + + .saltButton { + gap: var(--salt-spacing-100); + } + + .saltButton[data-embedded="true"]{ + --saltButton-height: calc(var(--salt-size-base) - var(--salt-spacing-100)); + --saltButton-borderStyle: none; + } + + .vuuIconButton[data-embedded="true"]{ + --saltButton-width: calc(var(--salt-size-base) - var(--salt-spacing-100)); + --saltButton-minWidth: var(--saltButton-width); + + --vuu-icon-width: 12px; + } + + .saltButton-secondary { + --saltButton-borderColor: var(--tar-color-gray-40); + --saltButton-borderWidth: 1px; + --saltButton-borderStyle: solid; + } + + .saltButton-secondary:not(:disabled):hover { + --saltButton-borderColor: var(--vuuButton-borderColor, var(--salt-actionable-secondary-background-hover)); + } +} + + +.tar-theme[theme-mode="light"]{ + .saltButton-secondary { + --saltButton-borderColor: var(--tar-color-gray-40); + } + .saltButton-secondary:disabled { + --saltButton-borderColor: var(--tar-color-gray-20); + } + +} + +.tar-theme[theme-mode="dark"]{ + .saltButton-secondary { + --saltButton-borderColor: var(--tar-color-gray-35); + } + .saltButton-secondary:disabled { + --saltButton-borderColor: var(--tar-color-gray-30); + } + +} + diff --git a/vuu-ui/themes/tar-theme/css/components/checkbox.css b/vuu-ui/themes/tar-theme/css/components/checkbox.css new file mode 100644 index 000000000..fea029c25 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/checkbox.css @@ -0,0 +1,50 @@ +.tar-theme { + .saltCheckbox { + --checkbox-background: white; + --checkbox-borderColor: var(--salt-selectable-borderColor); /* --vuu-color-gray-45 */ + --vuu-icon-color: white; + --vuu-icon-left: -1px; + --vuu-icon-top: -1px; + } + + .saltCheckbox:has(.saltCheckboxIcon-checked) { + --checkbox-background: var(--salt-actionable-cta-background); /* --vuu-color-purple-10 */ + --checkbox-borderColor: var( --salt-container-primary-borderColor); /* --vuu-color-purple-10 */ + } + + .saltCheckbox:hover { + --vuu-icon-color:var(--salt-actionable-primary-background-hover); /* --vuu-color-pink-10 */ + --checkbox-background: var(--vuu-color-pink-10-fade-20); + --checkbox-borderColor: var(--salt-selectable-borderColor-hover); /* --vuu-color-pink-10 */ + } + + .saltCheckboxIcon { + background:var(--checkbox-background); + border-color: var(--checkbox-borderColor) !important; + border-radius: 3px; + border-style: solid; + border-width: 1px; + } + + .saltCheckboxIcon-checked.saltCheckboxIcon-disabled, + .saltCheckbox:hover .saltCheckboxIcon-checked.saltCheckboxIcon-disabled { + background-color: var(--salt-selectable-background-disabled); + border-color: transparent;; + } + + + .saltCheckboxIcon-checked:after { + content: ""; + background-color: var(--vuu-icon-color); + left: var(--vuu-icon-left, auto); + --vuu-icon-size: calc(var(--salt-size-icon) + 2px); + height: var(--vuu-icon-height, var(--vuu-icon-size, 12px)); + mask: var(--vuu-svg-tick) center center/var(--vuu-icon-size) var(--vuu-icon-size); + -webkit-mask: var(--vuu-svg-tick) center center/var(--vuu-icon-size) var(--vuu-icon-size); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + position: absolute; + top: var(--vuu-icon-top, auto); + width: var(--vuu-icon-width, var(--vuu-icon-size, 12px)); + } +} \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/components/components.css b/vuu-ui/themes/tar-theme/css/components/components.css new file mode 100644 index 000000000..248a0ca79 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/components.css @@ -0,0 +1,8 @@ +@import url(button.css); +@import url(checkbox.css); +@import url(icon.css); +@import url(input.css); +@import url(splitter.css); +@import url(switch.css); +@import url(tabstrip.css); +@import url(toggle-button.css); diff --git a/vuu-ui/themes/tar-theme/css/components/icon.css b/vuu-ui/themes/tar-theme/css/components/icon.css new file mode 100644 index 000000000..d184ba7a1 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/icon.css @@ -0,0 +1,5 @@ +.tar-theme { + .saltIcon { + display: none; + } +} \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/components/input.css b/vuu-ui/themes/tar-theme/css/components/input.css new file mode 100644 index 000000000..3e89014aa --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/input.css @@ -0,0 +1,18 @@ +.saltInput-activationIndicator { + display: none; +} + +.saltInput:hover { + background: inherit;; +} + +.saltInput-primary { + --saltInput-height: 24px; + border: solid 1px var(--input-borderColor, var(--salt-editable-borderColor)); + border-radius: 6px; +} + +.saltInput-focused:hover, +.saltInput-focused { + --input-borderColor: var(--vuu-color-purple-10); +} \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/components/splitter.css b/vuu-ui/themes/tar-theme/css/components/splitter.css new file mode 100644 index 000000000..d4f60e2fd --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/splitter.css @@ -0,0 +1,11 @@ +.tar-theme .vuuSplitter { + --splitter-background: var(--vuu-color-gray-05); + --splitter-size: 9px; + --splitter-borderColor: white; + --splitter-borderStyle: none solid none solid; + --splitter-borderWidth: 4px; +} + +.tar-theme .vuuSplitter-column { + --splitter-borderStyle: solid none solid none; +} \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/components/switch.css b/vuu-ui/themes/tar-theme/css/components/switch.css new file mode 100644 index 000000000..e032d64e8 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/switch.css @@ -0,0 +1,56 @@ +.saltSwitch { + --switch-color: var(--vuu-color-gray-45); + --vuu-icon-left: -1px; +} + +.saltSwitch-track { + background-color: var(--switch-color); + border: none; + border-radius: 4px; + height: 14px; + padding: 0 2px; + width: 26px; +} + +.saltSwitch:not(.saltSwitch-disabled):hover .saltSwitch-track { + --switch-color: var(--vuu-color-pink-10); +} + +.saltSwitch-thumb { + background-color: var(--vuu-color-white); + border: none; + border-radius: 3px; + height: 10px; + margin:0; + width: 10px; +} + +.saltSwitch-checked { + --switch-color: var(--vuu-color-purple-10); +} + +.saltSwitch-disabled { + --switch-color: var(--vuu-color-gray-30); +} + +.saltSwitch-checked .saltSwitch-thumb, +.saltSwitch-checked:hover .saltSwitch-thumb { + background-color: white; + transform: translateX(calc(100% + 2px)); +} + + +.saltSwitch-checked .saltSwitch-thumb:after { + background-color: var(--switch-color); + content: ""; + left: var(--vuu-icon-left, auto); + height: var(--vuu-icon-height, var(--vuu-icon-size, 12px)); + mask: var(--vuu-svg-tick) center center/var(--vuu-icon-size) var(--vuu-icon-size); + -webkit-mask: var(--vuu-svg-tick) center center/var(--vuu-icon-size) var(--vuu-icon-size); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + position: absolute; + top: var(--vuu-icon-top, auto); + width: var(--vuu-icon-width, var(--vuu-icon-size, 12px)); + +} \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/components/tabstrip.css b/vuu-ui/themes/tar-theme/css/components/tabstrip.css new file mode 100644 index 000000000..1c458e3d2 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/tabstrip.css @@ -0,0 +1,13 @@ +.tar-theme { + + .vuuTabstrip { + --vuuOverflowContainer-borderColor: var(--salt-separable-primary-borderColor); + --tab-thumb-height: 3px; + } + + .vuuTabstrip-secondary { + + --vuuOverflowContainer-height: calc(var(--salt-size-base) + var(--salt-spacing-50)); + --vuuOverflowContainer-contentHeight: calc(var(--vuuOverflowContainer-height) - 1px); + } +} \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/css/components/toggle-button.css b/vuu-ui/themes/tar-theme/css/components/toggle-button.css new file mode 100644 index 000000000..f856826b0 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/components/toggle-button.css @@ -0,0 +1,52 @@ +.tar-theme { + .saltToggleButtonGroup { + --togglebutton-borderRadius: 2px; + /** TODO vary by density */ + --salt-spacing-100: 16px; + border-radius: 2px; + gap: 0; + height: var(--salt-size-base); + padding: 2px 3px; + } + + .saltToggleButtonGroup-horizontal .saltToggleButton { + height: 100%; + } + + .saltToggleButton { + border-radius: var(--togglebutton-borderRadius); + /** TODO vary by density */ + gap: 8px; + + --vuu-icon-color: var(--salt-actionable-secondary-foreground); + + &[aria-checked="true"] { + --vuu-icon-color: var(--salt-actionable-secondary-foreground-active); + } + &[aria-pressed="true"] { + --vuu-icon-color: var(--salt-actionable-secondary-foreground-active); + } + + } + + .saltToggleButton:hover:not([aria-pressed="true"], [aria-checked="true"]) { + background: var(--salt-actionable-secondary-background); + color: var(--salt-actionable-secondary-foreground); + } + + + .vuuStateButtonGroup { + + .saltToggleButton { + --togglebutton-borderRadius: 0; + } + + .saltToggleButton:first-child { + --togglebutton-borderRadius: 2px 0 0 2px; + } + .saltToggleButton:last-child { + --togglebutton-borderRadius: 0 2px 2px 0; + } + } + +} diff --git a/vuu-ui/themes/tar-theme/css/deprecated/foundations.css b/vuu-ui/themes/tar-theme/css/deprecated/foundations.css new file mode 100644 index 000000000..2ea9c1ba9 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/deprecated/foundations.css @@ -0,0 +1,103 @@ +/* +* **Deprecated:** Use duration instead +*/ +.tar-theme { + /* Delay */ + --salt-delay-instant: 100ms; + --salt-delay-perceptible: 300ms; + --salt-delay-notable: 1000ms; + --salt-delay-cutoff: 10000ms; + + /* Icon */ + --salt-size-icon-base: var(--salt-icon-size-base); + + /* Opacity */ + --salt-opacity-1: 0.15; + --salt-opacity-2: 0.25; + --salt-opacity-3: 0.4; + --salt-opacity-4: 0.7; + + /* Shadow */ + --salt-shadow-0: none; + --salt-shadow-1: 0 1px 3px 0 var(--salt-shadow-1-color); /* Use --salt-shadow-100 */ + --salt-shadow-2: 0 2px 4px 0 var(--salt-shadow-2-color); /* Use --salt-shadow-200 */ + --salt-shadow-3: 0 4px 8px 0 var(--salt-shadow-3-color); /* Use --salt-shadow-300 */ + --salt-shadow-4: 0 6px 10px 0 var(--salt-shadow-4-color); /* Use --salt-shadow-400 */ + --salt-shadow-5: 0 12px 40px 0 var(--salt-shadow-5-color); /* Use --salt-shadow-500 */ +} + +.tar-theme[data-mode="light"] { + --salt-shadow-1-color: rgba(0, 0, 0, 0.1); /* Use --salt-shadow-100-color */ + --salt-shadow-2-color: rgba(0, 0, 0, 0.1); /* Use --salt-shadow-200-color */ + --salt-shadow-3-color: rgba(0, 0, 0, 0.15); /* Use --salt-shadow-300-color */ + --salt-shadow-4-color: rgba(0, 0, 0, 0.2); /* Use --salt-shadow-400-color */ + --salt-shadow-5-color: rgba(0, 0, 0, 0.3); /* Use --salt-shadow-500-color */ +} + +.tar-theme[data-mode="dark"] { + --salt-shadow-1-color: rgba(0, 0, 0, 0.5); /* Use --salt-shadow-100-color */ + --salt-shadow-2-color: rgba(0, 0, 0, 0.5); /* Use --salt-shadow-200-color */ + --salt-shadow-3-color: rgba(0, 0, 0, 0.55); /* Use --salt-shadow-300-color */ + --salt-shadow-4-color: rgba(0, 0, 0, 0.55); /* Use --salt-shadow-400-color */ + --salt-shadow-5-color: rgba(0, 0, 0, 0.65); /* Use --salt-shadow-500-color */ +} + +.tar-density-touch, +.tar-density-low, +.tar-density-medium, +.tar-density-high { + /* Size */ + --salt-size-selection: var(--salt-size-selectable); + --salt-size-brandBar: 4px; /* Use --salt-size-accent */ + --salt-size-graphic-small: 12px; + --salt-size-graphic-medium: 24px; + --salt-size-graphic-large: 48px; + --salt-size-divider-height: var(--salt-size-separator-height); + --salt-size-divider-strokeWidth: var(--salt-size-separator-strokeWidth); + + --salt-size-detail: var(--salt-size-compact); + --salt-size-basis-unit: 4px; + + --salt-size-adornmentGap: calc(0.75 * var(--salt-size-unit)); + --salt-size-container-spacing: calc(3 * var(--salt-size-unit)); + --salt-size-separator-strokeWidth: 1px; + --salt-size-separator-height: calc(var(--salt-size-compact) + 1.5 * var(--salt-size-basis-unit)); + --salt-size-sharktooth-height: 5px; + --salt-size-sharktooth-width: 10px; + --salt-size-stackable: calc(var(--salt-size-base) + var(--salt-size-unit)); + + /* Z Index */ + --salt-zIndex-docked: 1050; +} + +.tar-density-high { + --salt-size-unit: calc(var(--salt-size-basis-unit) * 1); + --salt-size-compact: calc(var(--salt-size-basis-unit) * 1.5); + --salt-size-accent: calc(var(--salt-size-basis-unit) * 0.5); + --salt-icon-size-base: 10px; /* Use --salt-size-icon */ + --salt-icon-size-status-adornment: 6px; /* Use --salt-size-adornment */ +} + +.tar-density-medium { + --salt-size-unit: calc(var(--salt-size-basis-unit) * 2); + --salt-size-compact: calc(var(--salt-size-basis-unit) * 2); + --salt-size-accent: calc(var(--salt-size-basis-unit) * 1); + --salt-icon-size-base: 12px; /* Use --salt-size-icon */ + --salt-icon-size-status-adornment: 8px; /* Use --salt-size-adornment */ +} + +.tar-density-low { + --salt-size-unit: calc(var(--salt-size-basis-unit) * 3); + --salt-size-compact: calc(var(--salt-size-basis-unit) * 2.5); + --salt-size-accent: calc(var(--salt-size-basis-unit) * 1.5); + --salt-icon-size-base: 14px; /* Use --salt-size-icon */ + --salt-icon-size-status-adornment: 10px; /* Use --salt-size-adornment */ +} + +.tar-density-touch { + --salt-size-unit: calc(var(--salt-size-basis-unit) * 4); + --salt-size-compact: calc(var(--salt-size-basis-unit) * 3); + --salt-size-accent: calc(var(--salt-size-basis-unit) * 2); + --salt-icon-size-base: 16px; /* Use --salt-size-icon */ + --salt-icon-size-status-adornment: 12px; /* Use --salt-size-adornment */ +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/animation.css b/vuu-ui/themes/tar-theme/css/foundations/animation.css new file mode 100644 index 000000000..4e20921d9 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/animation.css @@ -0,0 +1,155 @@ +.tar-density-touch, +.tar-density-low, +.tar-density-medium, +.tar-density-high { + --salt-animation-opacity-start: 0; + --salt-animation-opacity-end: 1; + --salt-animation-scale-start: 0; + --salt-animation-scale-end: 1; + --salt-animation-transform-start: 100%; + --salt-animation-transform-end: 0; + --salt-animation-duration: var(--salt-duration-perceptible); + --salt-animation-timing-function: ease-in-out; + + /* Slide Animations */ + --salt-animation-slide-in-top: slide-in-top var(--salt-animation-duration) var(--salt-animation-timing-function); + --salt-animation-slide-in-left: slide-in-left var(--salt-animation-duration) var(--salt-animation-timing-function); + --salt-animation-slide-in-right: slide-in-right var(--salt-animation-duration) var(--salt-animation-timing-function); + --salt-animation-slide-in-bottom: slide-in-bottom var(--salt-animation-duration) var(--salt-animation-timing-function); + + --salt-animation-slide-out-top: slide-out-top var(--salt-animation-duration) var(--salt-animation-timing-function) both; + --salt-animation-slide-out-left: slide-out-left var(--salt-animation-duration) var(--salt-animation-timing-function) both; + --salt-animation-slide-out-right: slide-out-right var(--salt-animation-duration) var(--salt-animation-timing-function) both; + --salt-animation-slide-out-bottom: slide-out-bottom var(--salt-animation-duration) var(--salt-animation-timing-function) both; + + /* Fade Animations */ + --salt-animation-fade-in-back: fade-in-back var(--salt-animation-duration) var(--salt-animation-timing-function); + --salt-animation-fade-in-forward: fade-in-forward var(--salt-animation-duration) var(--salt-animation-timing-function); + --salt-animation-fade-in-center: fade-in-center var(--salt-animation-duration) var(--salt-animation-timing-function); + --salt-animation-fade-out-back: fade-out-back var(--salt-animation-duration) ease-in-out both; +} + +/*Slide keyframes */ +@keyframes slide-in-top { + 0% { + opacity: var(--salt-animation-opacity-start); + transform: translateY(var(--salt-animation-transform-start)); + } + 100% { + opacity: var(--salt-animation-opacity-end); + transform: translateY(var(--salt-animation-transform-end)); + } +} +@keyframes slide-out-top { + 0% { + opacity: var(--salt-animation-opacity-end); + transform: translateY(var(--salt-animation-transform-end)); + } + 100% { + opacity: var(--salt-animation-opacity-start); + transform: translateY(var(--salt-animation-transform-start)); + } +} +@keyframes slide-in-left { + 0% { + opacity: var(--salt-animation-opacity-start); + transform: translateX(calc(-1 * var(--salt-animation-transform-start))); + } + 100% { + opacity: var(--salt-animation-opacity-end); + transform: translateX(var(--salt-animation-transform-end)); + } +} +@keyframes slide-out-left { + 0% { + opacity: var(--salt-animation-opacity-end); + transform: translateX(var(--salt-animation-transform-end)); + } + 100% { + opacity: var(--salt-animation-opacity-start); + transform: translateX(calc(-1 * var(--salt-animation-transform-start))); + } +} +@keyframes slide-in-right { + 0% { + opacity: var(--salt-animation-opacity-start); + transform: translateX(var(--salt-animation-transform-start)); + } + 100% { + opacity: var(--salt-animation-opacity-end); + transform: translateX(var(--salt-animation-transform-end)); + } +} +@keyframes slide-out-right { + 0% { + opacity: var(--salt-animation-opacity-end); + transform: translateX(var(--salt-animation-transform-end)); + } + 100% { + opacity: var(--salt-animation-opacity-start); + transform: translateX(var(--salt-animation-transform-start)); + } +} +@keyframes slide-in-bottom { + 0% { + opacity: var(--salt-animation-opacity-start); + transform: translateY(calc(-1 * var(--salt-animation-transform-start))); + } + 100% { + opacity: var(--salt-animation-opacity-end); + transform: translateY(var(--salt-animation-transform-end)); + } +} +@keyframes slide-out-bottom { + 0% { + opacity: var(--salt-animation-opacity-end); + transform: translateY(var(--salt-animation-transform-end)); + } + 100% { + opacity: var(--salt-animation-opacity-start); + transform: translateY(calc(-1 * var(--salt-animation-transform-start))); + } +} +/* Fade keyframes */ +@keyframes fade-in-back { + 0% { + --salt-animation-scale-start: 1.4; + opacity: var(--salt-animation-opacity-start); + transform: scale(var(--salt-animation-scale-start)); + } + + 100% { + opacity: var(--salt-animation-opacity-end); + transform: scale(var(--salt-animation-scale-end)); + } +} +@keyframes fade-in-forward { + 0% { + --salt-animation-scale-start: 0.6; + opacity: var(--salt-animation-opacity-start); + transform: scale(var(--salt-animation-scale-start)); + } + + 100% { + opacity: var(--salt-animation-opacity-end); + transform: scale(var(--salt-animation-scale-end)); + } +} +@keyframes fade-in-center { + 0% { + opacity: var(--salt-animation-opacity-start); + } + + 100% { + opacity: var(--salt-animation-opacity-end); + } +} + +@keyframes fade-out-back { + 0% { + opacity: var(--salt-animation-opacity-end); + } + 100% { + opacity: var(--salt-animation-opacity-start); + } +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/color.css b/vuu-ui/themes/tar-theme/css/foundations/color.css new file mode 100644 index 000000000..8eb91c0ae --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/color.css @@ -0,0 +1,176 @@ +.tar-theme { + + --vuu-fade-light : 0.13; + + --vuu-color-black: black; + --vuu-color-white: white; + --vuu-color-white-fade-70: rgba(255,255,255,.7); + + /** text-selection */ + --vuu-color-blue-40: rgb(164, 213, 244); /* #A4D5F4 */ + +--tar-color-red-10: rgb(230,0,0); /* #E60000*/ +--tar-color-red-20: rgb(189, 0, 12); /* /* #BD000C */ +--tar-color-red-30: rgb(247, 128, 128); /* #F78080 */ +--tar-color-red-40: rgba(230, 0, 0, 0.502); /* #e6000080 */ +--tar-color-red-50: rgb(); /* */ +--tar-color-red-60: rgb(); /* */ + + --vuu-color-purple-10: rgb(109,24,189); /* #6D18BD */ + --vuu-color-purple-20-fade-40 :rgba(197, 163, 229, .4); /* #C5A3E566 */ + --vuu-color-purple-50: rgb(42, 1, 95); /* #2A015F */ + --vuu-color-purple-10-fade-light: rgba(109,24,189, var(--vuu-fade-light)); + + --vuu-color-pink-10: rgb(234, 120, 128); /* #F37880 */ + --vuu-color-pink-10-fade-20: rgba(234, 120, 128, .2); /* #F37880 */ + + --tar-color-gray-05: rgb(215, 215, 215); /* #D7D7D7 */ + --tar-color-gray-10: rgb(170, 170, 170); /* #aaa */ + --tar-color-gray-20: rgb(204, 204, 204); /* #ccc */ + --tar-color-gray-25: rgb(145, 145, 145); /* #919191*/ + --tar-color-gray-30: rgb(68, 68, 68); /* #444 */ + --tar-color-gray-35: rgb(91, 91, 91); /* #5b5b5b */ + --tar-color-gray-40: rgb(100, 100, 100); /* #646464*/ + --tar-color-gray-70: rgb(28, 28, 28); /* #1C1C1C */ + + + --vuu-color-gray-02: rgb(235, 235, 236); /* #EBEBEC */ + --vuu-color-gray-03: rgb(237, 237, 237); /* #EDEDED */ + --vuu-color-gray-05: rgb(222, 222, 222); /* #DEDEDE */ + --vuu-color-gray-07: rgb(226, 226, 227); /* #E2E2E3 */ + --vuu-color-gray-10: rgb(228, 227, 231); /* #E4E3E7 */ + --vuu-color-gray-20: rgb(245, 242, 248); /* #F5F2F8 */ + --vuu-color-gray-25: rgb(244, 244, 244) ; /* #F4F4F4 */ + --vuu-color-gray-28: rgb(249, 249, 251); /* #F9F9FB */ + --vuu-color-gray-30: rgb(214, 215, 218); /* #D6D7Da */ + --vuu-color-gray-35: rgb(155, 158, 168); /* #9B9EA8; */ + --vuu-color-gray-40: rgb(169, 170, 173); /* #A9AAAD */ + --vuu-color-gray-42: rgb(135, 139, 158); /* #878b9e */ + --vuu-color-gray-45: rgb(119, 124, 148); /* #777C94 */ + --vuu-color-gray-50: rgb(96, 100, 119); /* #606477 */ + --vuu-color-gray-80: rgb(21, 23, 27); /* #15171B */ + + +--vuu-color-green-50: rgb(102, 174, 90); /* #66AE5A */ +--vuu-color-green-60: rgb(36, 137, 19); /* #248913 */ +--vuu-color-green-60-fade-30: rgba(36, 137, 19, .3); /* #248913 */ + +--vuu-color-red-50: rgb(226, 52, 52); /* #E23434 */ + + --vuu-color-yellow-20: rgb(244, 202, 51); /* #F4CA33 */ + + + + /* Color palette will stay the same no matter of theming */ + --salt-color-white: rgb(255, 255, 255); + --salt-color-black: rgb(0, 0, 0); + + --salt-color-red-10: rgb(255, 227, 224); + --salt-color-red-20: rgb(255, 207, 201); + --salt-color-red-30: rgb(255, 187, 178); + --salt-color-red-40: rgb(255, 167, 156); + --salt-color-red-50: rgb(255, 148, 133); + --salt-color-red-100: rgb(255, 128, 111); + --salt-color-red-200: rgb(255, 108, 88); + --salt-color-red-300: rgb(255, 89, 66); + --salt-color-red-400: rgb(237, 65, 42); + --salt-color-red-500: rgb(227, 43, 22); + --salt-color-red-600: rgb(196, 32, 16); + --salt-color-red-700: rgb(166, 21, 11); + --salt-color-red-800: rgb(136, 10, 5); + --salt-color-red-900: rgb(65, 37, 34); + + --salt-color-orange-10: rgb(255, 232, 191); + --salt-color-orange-20: rgb(254, 223, 166); + --salt-color-orange-30: rgb(254, 214, 142); + --salt-color-orange-40: rgb(254, 205, 118); + --salt-color-orange-50: rgb(254, 197, 94); + --salt-color-orange-100: rgb(250, 181, 81); + --salt-color-orange-200: rgb(246, 165, 68); + --salt-color-orange-300: rgb(242, 149, 56); + --salt-color-orange-400: rgb(238, 133, 43); + --salt-color-orange-500: rgb(234, 115, 25); + --salt-color-orange-600: rgb(224, 101, 25); + --salt-color-orange-700: rgb(214, 85, 19); + --salt-color-orange-800: rgb(204, 68, 13); + --salt-color-orange-900: rgb(54, 44, 36); + + --salt-color-green-10: rgb(209, 244, 201); + --salt-color-green-20: rgb(184, 232, 182); + --salt-color-green-30: rgb(160, 221, 164); + --salt-color-green-40: rgb(136, 210, 145); + --salt-color-green-50: rgb(112, 199, 127); + --salt-color-green-100: rgb(93, 189, 116); + --salt-color-green-200: rgb(77, 180, 105); + --salt-color-green-300: rgb(60, 171, 96); + --salt-color-green-400: rgb(48, 156, 90); + --salt-color-green-500: rgb(36, 135, 75); + --salt-color-green-600: rgb(24, 114, 61); + --salt-color-green-700: rgb(12, 93, 46); + --salt-color-green-800: rgb(1, 73, 32); + --salt-color-green-900: rgb(35, 52, 43); + + --salt-color-teal-10: rgb(218, 240, 240); + --salt-color-teal-20: rgb(199, 232, 232); + --salt-color-teal-30: rgb(180, 224, 225); + --salt-color-teal-40: rgb(162, 217, 218); + --salt-color-teal-50: rgb(141, 205, 209); + --salt-color-teal-100: rgb(123, 193, 200); + --salt-color-teal-200: rgb(99, 181, 192); + --salt-color-teal-300: rgb(73, 160, 172); + --salt-color-teal-400: rgb(48, 149, 166); + --salt-color-teal-500: rgb(0, 130, 151); + --salt-color-teal-600: rgb(27, 107, 133); + --salt-color-teal-700: rgb(0, 85, 113); + --salt-color-teal-800: rgb(1, 65, 86); + --salt-color-teal-900: rgb(0, 49, 76); + + --salt-color-blue-10: rgb(203, 231, 249); + --salt-color-blue-20: rgb(183, 222, 246); + --salt-color-blue-30: rgb(164, 213, 244); + --salt-color-blue-40: rgb(144, 204, 242); + --salt-color-blue-50: rgb(125, 195, 240); + --salt-color-blue-100: rgb(100, 177, 228); + --salt-color-blue-200: rgb(75, 159, 216); + --salt-color-blue-300: rgb(51, 141, 205); + --salt-color-blue-400: rgb(46, 132, 198); + --salt-color-blue-500: rgb(38, 112, 169); + --salt-color-blue-600: rgb(21, 92, 147); + --salt-color-blue-700: rgb(0, 71, 123); + --salt-color-blue-800: rgb(39, 60, 77); + --salt-color-blue-900: rgb(35, 47, 56); + + --salt-color-purple-10: rgb(249, 224, 247); + --salt-color-purple-20: rgb(247, 212, 244); + --salt-color-purple-30: rgb(245, 201, 241); + --salt-color-purple-40: rgb(243, 189, 238); + --salt-color-purple-50: rgb(241, 178, 235); + --salt-color-purple-100: rgb(223, 156, 225); + --salt-color-purple-200: rgb(205, 135, 215); + --salt-color-purple-300: rgb(192, 116, 203); + --salt-color-purple-400: rgb(169, 97, 181); + --salt-color-purple-500: rgb(150, 78, 162); + --salt-color-purple-600: rgb(129, 60, 141); + --salt-color-purple-700: rgb(103, 46, 122); + --salt-color-purple-800: rgb(83, 37, 109); + --salt-color-purple-900: rgb(59, 16, 84); + + --salt-color-gray-10: rgb(242, 244, 246); + --salt-color-gray-20: rgb(234, 237, 239); + --salt-color-gray-30: rgb(224, 228, 233); + --salt-color-gray-40: rgb(217, 221, 227); + --salt-color-gray-50: rgb(206, 210, 217); + --salt-color-gray-60: rgb(197, 201, 208); + --salt-color-gray-70: rgb(180, 183, 190); + --salt-color-gray-80: rgb(159, 163, 170); + --salt-color-gray-90: rgb(132, 135, 142); + --salt-color-gray-100: rgb(116, 119, 127); + --salt-color-gray-200: rgb(97, 101, 110); + --salt-color-gray-300: rgb(76, 80, 91); + --salt-color-gray-400: rgb(68, 72, 79); + --salt-color-gray-500: rgb(59, 63, 70); + --salt-color-gray-600: rgb(47, 49, 54); + --salt-color-gray-700: rgb(42, 44, 47); + --salt-color-gray-800: rgb(36, 37, 38); + --salt-color-gray-900: rgb(22, 22, 22); +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/duration.css b/vuu-ui/themes/tar-theme/css/foundations/duration.css new file mode 100644 index 000000000..988d14af1 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/duration.css @@ -0,0 +1,6 @@ +.tar-theme { + --salt-duration-instant: 0ms; + --salt-duration-perceptible: 300ms; + --salt-duration-notable: 1000ms; + --salt-duration-cutoff: 10000ms; +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/fade.css b/vuu-ui/themes/tar-theme/css/foundations/fade.css new file mode 100644 index 000000000..8feb4daf9 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/fade.css @@ -0,0 +1,68 @@ +.tar-theme { + --salt-color-blue-100-fade-foreground: rgba(100, 177, 228, var(--salt-palette-opacity-disabled)); + --salt-color-blue-500-fade-foreground: rgba(38, 112, 169, var(--salt-palette-opacity-disabled)); + --salt-color-blue-600-fade-foreground: rgba(21, 92, 147, var(--salt-palette-opacity-disabled)); + --salt-color-gray-200-fade-foreground: rgba(97, 101, 110, var(--salt-palette-opacity-disabled)); + --salt-color-gray-70-fade-foreground: rgba(180, 183, 190, var(--salt-palette-opacity-disabled)); + --salt-color-gray-90-fade-foreground: rgba(132, 135, 142, var(--salt-palette-opacity-disabled)); + --salt-color-gray-900-fade-foreground: rgba(22, 22, 22, var(--salt-palette-opacity-disabled)); + --salt-color-green-300-fade-foreground: rgba(60, 171, 96, var(--salt-palette-opacity-disabled)); + --salt-color-green-400-fade-foreground: rgba(48, 156, 90, var(--salt-palette-opacity-disabled)); + --salt-color-green-500-fade-foreground: rgba(36, 135, 75, var(--salt-palette-opacity-disabled)); + --salt-color-green-700-fade-foreground: rgba(12, 93, 46, var(--salt-palette-opacity-disabled)); + --salt-color-red-300-fade-foreground: rgba(255, 89, 66, var(--salt-palette-opacity-disabled)); + --salt-color-red-500-fade-foreground: rgba(227, 43, 22, var(--salt-palette-opacity-disabled)); + --salt-color-red-700-fade-foreground: rgba(166, 21, 11, var(--salt-palette-opacity-disabled)); + --salt-color-white-fade-foreground: rgba(255, 255, 255, var(--salt-palette-opacity-disabled)); + + --salt-color-blue-500-fade-border: rgba(38, 112, 169, var(--salt-palette-opacity-disabled)); + --salt-color-gray-50-fade-border: rgba(206, 210, 217, var(--salt-palette-opacity-disabled)); + --salt-color-gray-60-fade-border: rgba(197, 201, 208, var(--salt-palette-opacity-disabled)); + --salt-color-gray-90-fade-border: rgba(132, 135, 142, var(--salt-palette-opacity-disabled)); + --salt-color-gray-200-fade-border: rgba(97, 101, 110, var(--salt-palette-opacity-disabled)); + --salt-color-gray-300-fade-border: rgba(76, 80, 91, var(--salt-palette-opacity-disabled)); + --salt-color-green-400-fade-border: rgba(48, 156, 90, var(--salt-palette-opacity-disabled)); + --salt-color-green-500-fade-border: rgba(36, 135, 75, var(--salt-palette-opacity-disabled)); + --salt-color-orange-400-fade-border: rgba(238, 133, 43, var(--salt-palette-opacity-disabled)); + --salt-color-orange-500-fade-border: rgba(234, 115, 25, var(--salt-palette-opacity-disabled)); + --salt-color-orange-600-fade-border: rgba(224, 101, 25, var(--salt-palette-opacity-disabled)); + --salt-color-orange-700-fade-border: rgba(214, 85, 19, var(--salt-palette-opacity-disabled)); + --salt-color-red-500-fade-border: rgba(227, 43, 22, var(--salt-palette-opacity-disabled)); + + --salt-color-gray-90-fade-border-readonly: rgba(132, 135, 142, var(--salt-palette-opacity-border-readonly)); + --salt-color-gray-200-fade-border-readonly: rgba(97, 101, 110, var(--salt-palette-opacity-border-readonly)); + + --salt-color-blue-30-fade-background: rgba(164, 213, 244, var(--salt-palette-opacity-disabled)); + --salt-color-blue-500-fade-background: rgba(38, 112, 169, var(--salt-palette-opacity-disabled)); + --salt-color-blue-600-fade-background: rgba(21, 92, 147, var(--salt-palette-opacity-disabled)); + --salt-color-blue-700-fade-background: rgba(0, 71, 123, var(--salt-palette-opacity-disabled)); + --salt-color-gray-20-fade-background: rgba(234, 237, 239, var(--salt-palette-opacity-disabled)); + --salt-color-gray-60-fade-background: rgba(197, 201, 208, var(--salt-palette-opacity-disabled)); + --salt-color-gray-70-fade-background: rgba(180, 183, 190, var(--salt-palette-opacity-disabled)); + --salt-color-gray-200-fade-background: rgba(97, 101, 110, var(--salt-palette-opacity-disabled)); + --salt-color-gray-300-fade-background: rgba(76, 80, 91, var(--salt-palette-opacity-disabled)); + --salt-color-gray-600-fade-background: rgba(47, 49, 54, var(--salt-palette-opacity-disabled)); + --salt-color-gray-800-fade-background: rgba(36, 37, 38, var(--salt-palette-opacity-disabled)); + --salt-color-white-fade-background: rgba(255, 255, 255, var(--salt-palette-opacity-disabled)); + + --salt-color-white-fade-background-readonly: rgba(255, 255, 255, var(--salt-palette-opacity-background-readonly)); + --salt-color-gray-20-fade-background-readonly: rgba(234, 237, 239, var(--salt-palette-opacity-background-readonly)); + --salt-color-gray-600-fade-background-readonly: rgba(47, 49, 54, var(--salt-palette-opacity-background-readonly)); + --salt-color-gray-800-fade-background-readonly: rgba(36, 37, 38, var(--salt-palette-opacity-background-readonly)); + + --salt-color-white-fade-backdrop: rgba(255, 255, 255, var(--salt-palette-opacity-backdrop)); + --salt-color-black-fade-backdrop: rgba(0, 0, 0, var(--salt-palette-opacity-backdrop)); + + --salt-color-blue-100-fade-fill: rgba(100, 177, 228, var(--salt-palette-opacity-disabled)); + --salt-color-blue-600-fade-fill: rgba(21, 92, 147, var(--salt-palette-opacity-disabled)); + + --salt-color-white-fade-separatorOpacity-primary: rgba(255, 255, 255, var(--salt-palette-opacity-primary-border)); + --salt-color-white-fade-separatorOpacity-secondary: rgba(255, 255, 255, var(--salt-palette-opacity-secondary-border)); + --salt-color-white-fade-separatorOpacity-tertiary: rgba(255, 255, 255, var(--salt-palette-opacity-tertiary-border)); + --salt-color-black-fade-separatorOpacity-primary: rgba(0, 0, 0, var(--salt-palette-opacity-primary-border)); + --salt-color-black-fade-separatorOpacity-secondary: rgba(0, 0, 0, var(--salt-palette-opacity-secondary-border)); + --salt-color-black-fade-separatorOpacity-tertiary: rgba(0, 0, 0, var(--salt-palette-opacity-tertiary-border)); + + --salt-color-black-fade-background-hover: rgba(0, 0, 0, var(--salt-opacity-8)); + --salt-color-white-fade-background-hover: rgba(255, 255, 255, var(--salt-opacity-8)); +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/opacity.css b/vuu-ui/themes/tar-theme/css/foundations/opacity.css new file mode 100644 index 000000000..52495d7bb --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/opacity.css @@ -0,0 +1,8 @@ +.tar-theme { + --salt-opacity-0: 0; + --salt-opacity-8: 0.08; + --salt-opacity-15: 0.15; + --salt-opacity-25: 0.25; + --salt-opacity-40: 0.4; + --salt-opacity-70: 0.7; +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/shadow.css b/vuu-ui/themes/tar-theme/css/foundations/shadow.css new file mode 100644 index 000000000..eef993f1c --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/shadow.css @@ -0,0 +1,23 @@ +.tar-theme[data-mode="light"] { + --salt-shadow-100-color: rgba(0, 0, 0, 0.1); + --salt-shadow-200-color: rgba(0, 0, 0, 0.1); + --salt-shadow-300-color: rgba(0, 0, 0, 0.15); + --salt-shadow-400-color: rgba(0, 0, 0, 0.2); + --salt-shadow-500-color: rgba(0, 0, 0, 0.3); +} + +.tar-theme[data-mode="dark"] { + --salt-shadow-100-color: rgba(0, 0, 0, 0.5); + --salt-shadow-200-color: rgba(0, 0, 0, 0.5); + --salt-shadow-300-color: rgba(0, 0, 0, 0.55); + --salt-shadow-400-color: rgba(0, 0, 0, 0.55); + --salt-shadow-500-color: rgba(0, 0, 0, 0.65); +} + +.tar-theme { + --salt-shadow-100: 0 1px 3px 0 var(--salt-shadow-100-color); + --salt-shadow-200: 0 2px 4px 0 var(--salt-shadow-200-color); + --salt-shadow-300: 0 4px 8px 0 var(--salt-shadow-300-color); + --salt-shadow-400: 0 6px 10px 0 var(--salt-shadow-400-color); + --salt-shadow-500: 0 12px 40px 0 var(--salt-shadow-500-color); +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/size.css b/vuu-ui/themes/tar-theme/css/foundations/size.css new file mode 100644 index 000000000..f17c1d911 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/size.css @@ -0,0 +1,51 @@ +.tar-density-high { + --salt-size-adornment: 6px; + --salt-size-bar: 2px; + --salt-size-base: 24px; + --salt-size-border: 1px; + --salt-size-icon: 10px; + --salt-size-indicator: 1px; + --salt-size-selectable: 12px; + --salt-size-bar-strong: 4px; + --salt-size-bar-small: 2px; + --salt-size-border-strong: 2px; +} + +.tar-density-medium { + --salt-size-adornment: 8px; + --salt-size-bar: 4px; + --salt-size-base: 28px; + --salt-size-border: 1px; + --salt-size-icon: 12px; + --salt-size-indicator: 2px; + --salt-size-selectable: 14px; + --salt-size-bar-strong: 8px; + --salt-size-bar-small: 2px; + --salt-size-border-strong: 2px; +} + +.tar-density-low { + --salt-size-adornment: 10px; + --salt-size-bar: 6px; + --salt-size-base: 36px; + --salt-size-border: 1px; + --salt-size-icon: 14px; + --salt-size-indicator: 3px; + --salt-size-selectable: 16px; + --salt-size-bar-strong: 12px; + --salt-size-bar-small: 2px; + --salt-size-border-strong: 2px; +} + +.tar-density-touch { + --salt-size-adornment: 12px; + --salt-size-bar: 8px; + --salt-size-base: 44px; + --salt-size-border: 1px; + --salt-size-icon: 16px; + --salt-size-indicator: 4px; + --salt-size-selectable: 18px; + --salt-size-bar-strong: 16px; + --salt-size-bar-small: 2px; + --salt-size-border-strong: 2px; +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/spacing.css b/vuu-ui/themes/tar-theme/css/foundations/spacing.css new file mode 100644 index 000000000..c7172a792 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/spacing.css @@ -0,0 +1,31 @@ +.tar-density-touch { + --salt-spacing-100: 16px; +} + +.tar-density-low { + --salt-spacing-100: 12px; +} + +.tar-density-medium { + --salt-spacing-100: 8px; +} + +.tar-density-high { + --salt-spacing-100: 4px; +} + +.tar-density-touch, +.tar-density-low, +.tar-density-medium, +.tar-density-high { + --salt-spacing-25: calc(0.25 * var(--salt-spacing-100)); + --salt-spacing-50: calc(0.5 * var(--salt-spacing-100)); + --salt-spacing-75: calc(0.75 * var(--salt-spacing-100)); + + --salt-spacing-150: calc(1.5 * var(--salt-spacing-100)); + --salt-spacing-200: calc(2 * var(--salt-spacing-100)); + --salt-spacing-250: calc(2.5 * var(--salt-spacing-100)); + --salt-spacing-300: calc(3 * var(--salt-spacing-100)); + --salt-spacing-350: calc(3.5 * var(--salt-spacing-100)); + --salt-spacing-400: calc(4 * var(--salt-spacing-100)); +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/typography.css b/vuu-ui/themes/tar-theme/css/foundations/typography.css new file mode 100644 index 000000000..8f0e00490 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/typography.css @@ -0,0 +1,11 @@ +.tar-theme { + --salt-typography-fontFamily: "Nunito Sans"; + --salt-typography-fontFamily-code: 'Sometype Mono'; + + --salt-typography-fontWeight-light: 300; + --salt-typography-fontWeight-regular: 400; + --salt-typography-fontWeight-medium: 500; + --salt-typography-fontWeight-semiBold: 600; + --salt-typography-fontWeight-bold: 700; + --salt-typography-fontWeight-extraBold: 800; +} diff --git a/vuu-ui/themes/tar-theme/css/foundations/zindex.css b/vuu-ui/themes/tar-theme/css/foundations/zindex.css new file mode 100644 index 000000000..a4cd75bba --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/foundations/zindex.css @@ -0,0 +1,14 @@ +.tar-density-touch, +.tar-density-low, +.tar-density-medium, +.tar-density-high { + --salt-zIndex-default: 1; + --salt-zIndex-popout: 1000; + --salt-zIndex-appHeader: 1100; + --salt-zIndex-drawer: 1200; + --salt-zIndex-modal: 1300; + --salt-zIndex-notification: 1400; + --salt-zIndex-dragObject: 1420; + --salt-zIndex-contextMenu: 1450; + --salt-zIndex-flyover: 1500; +} diff --git a/vuu-ui/themes/tar-theme/css/global.css b/vuu-ui/themes/tar-theme/css/global.css new file mode 100644 index 000000000..eb6db5c35 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/global.css @@ -0,0 +1,40 @@ + +.tar-theme { + color: var(--salt-content-primary-foreground); + font-family: var(--salt-typography-fontFamily); + font-size: var(--salt-text-fontSize); + letter-spacing: var(--salt-text-letterSpacing); + line-height: var(--salt-text-lineHeight); +} + +.salt-theme ::selection { + background: var(--salt-content-foreground-highlight); +} + +.tar-theme[data-mode="light"] { + color-scheme: light; +} + +.tar-theme[data-mode="dark"] { + color-scheme: dark; +} + +/* Setting every element's box-sizing to border-box ensures the declared width +of the element is never exceeded due to padding or border. */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +.salt-visuallyHidden { + position: absolute; + height: 1px; + width: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} diff --git a/vuu-ui/themes/tar-theme/css/palette/accent.css b/vuu-ui/themes/tar-theme/css/palette/accent.css new file mode 100644 index 000000000..acfc0c2b8 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/accent.css @@ -0,0 +1,11 @@ +.tar-theme[data-mode="light"] { + --salt-palette-accent-background: var(--salt-color-blue-500); + --salt-palette-accent-border: var(--salt-color-blue-500); + --salt-palette-accent-foreground: var(--salt-color-white); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-accent-background: var(--salt-color-blue-500); + --salt-palette-accent-border: var(--salt-color-blue-500); + --salt-palette-accent-foreground: var(--salt-color-white); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/error.css b/vuu-ui/themes/tar-theme/css/palette/error.css new file mode 100644 index 000000000..6b51c849d --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/error.css @@ -0,0 +1,13 @@ +.tar-theme[data-mode="light"] { + --salt-palette-error-background: var(--salt-color-red-10); + --salt-palette-error-background-selected: var(--salt-color-red-20); + --salt-palette-error-border: var(--salt-color-red-500); + --salt-palette-error-foreground: var(--salt-color-red-500); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-error-background: var(--salt-color-red-900); + --salt-palette-error-background-selected: var(--salt-color-red-900); + --salt-palette-error-border: var(--salt-color-red-500); + --salt-palette-error-foreground: var(--salt-color-red-500); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/info.css b/vuu-ui/themes/tar-theme/css/palette/info.css new file mode 100644 index 000000000..844ded139 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/info.css @@ -0,0 +1,11 @@ +.tar-theme[data-mode="light"] { + --salt-palette-info-background: var(--salt-color-blue-10); + --salt-palette-info-border: var(--salt-color-blue-500); + --salt-palette-info-foreground: var(--salt-color-blue-500); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-info-background: var(--salt-color-blue-900); + --salt-palette-info-border: var(--salt-color-blue-500); + --salt-palette-info-foreground: var(--salt-color-blue-500); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/interact.css b/vuu-ui/themes/tar-theme/css/palette/interact.css new file mode 100644 index 000000000..5cfc15301 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/interact.css @@ -0,0 +1,95 @@ +.tar-theme[data-mode="light"] { + --salt-palette-interact-background: transparent; + --salt-palette-interact-background-blurSelected: var(--salt-color-gray-30); + --salt-palette-interact-background-hover: var(--vuu-color-gray-10); + --salt-palette-interact-background-active: var(--vuu-color-gray-02); + --salt-palette-interact-background-disabled: var(--vuu-color-gray-35); + --salt-palette-interact-background-activeDisabled: var(--salt-color-blue-30-fade-background); + --salt-palette-interact-border: var(--vuu-color-gray-45); + --salt-palette-interact-border-active: var(--vuu-color-purple-10); + --salt-palette-interact-border-activeDisabled: var(--salt-color-blue-600-fade-fill); + --salt-palette-interact-border-disabled: var(--salt-color-gray-200-fade-border); + --salt-palette-interact-border-hover: var(--vuu-color-pink-10); + --salt-palette-interact-border-readonly: var(--salt-color-gray-200-fade-border-readonly); + --salt-palette-interact-foreground: var(--salt-color-gray-200); + --salt-palette-interact-foreground-active: var(--vuu-color-purple-10); + --salt-palette-interact-foreground-activeDisabled: var(--salt-color-blue-600-fade-foreground); + --salt-palette-interact-foreground-disabled: var(--salt-color-gray-200-fade-foreground); + --salt-palette-interact-foreground-hover: var(--salt-color-blue-500); + --salt-palette-interact-outline: var(--vuu-color-purple-10); + + --salt-palette-interact-cta-background: var(--tar-color-red-10); + --salt-palette-interact-cta-background-active: var(--tar-color-red-20); + --salt-palette-interact-cta-background-disabled: var(--tar-color-red-30); + --salt-palette-interact-cta-background-hover: var(--tar-color-red-20); + --salt-palette-interact-cta-foreground: var(--salt-color-white); + --salt-palette-interact-cta-foreground-active: var(--salt-color-white); + --salt-palette-interact-cta-foreground-disabled: var(--vuu-color-white-fade-70); + --salt-palette-interact-cta-foreground-hover: var(--salt-color-white); + + --salt-palette-interact-primary-background: var(--tar-color-gray-40); + --salt-palette-interact-primary-background-active: var(--tar-color-gray-30); + --salt-palette-interact-primary-background-disabled: var(--tar-color-gray-20); + --salt-palette-interact-primary-background-hover: var(--tar-color-gray-30); + --salt-palette-interact-primary-foreground: var(--salt-color-white); + --salt-palette-interact-primary-foreground-active: var(--salt-color-white); + --salt-palette-interact-primary-foreground-disabled: var(--tar-color-gray-10); + --salt-palette-interact-primary-foreground-hover: var(--salt-color-white); + + --salt-palette-interact-secondary-background: var(--salt-color-white); + --salt-palette-interact-secondary-background-active: var(--tar-color-gray-30); + --salt-palette-interact-secondary-background-disabled: transparent; + --salt-palette-interact-secondary-background-hover: var(--tar-color-gray-30); + --salt-palette-interact-secondary-foreground: var(--tar-color-gray-40); + --salt-palette-interact-secondary-foreground-active: var(--salt-color-white); + --salt-palette-interact-secondary-foreground-disabled: var(--tar-color-gray-20); + --salt-palette-interact-secondary-foreground-hover: var(--salt-color-white); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-interact-background: transparent; + --salt-palette-interact-background-active: var(--salt-color-blue-700); + --salt-palette-interact-background-blurSelected: var(--salt-color-gray-600); + --salt-palette-interact-background-hover: var(--salt-color-blue-800); + --salt-palette-interact-background-disabled: transparent; + --salt-palette-interact-background-activeDisabled: var(--salt-color-blue-700-fade-background); + --salt-palette-interact-border: var(--salt-color-gray-90); + --salt-palette-interact-border-active: var(--salt-color-blue-100); + --salt-palette-interact-border-activeDisabled: var(--salt-color-blue-100-fade-fill); + --salt-palette-interact-border-disabled: var(--salt-color-gray-90-fade-border); + --salt-palette-interact-border-hover: var(--salt-color-blue-500); + --salt-palette-interact-border-readonly: var(--salt-color-gray-90-fade-border-readonly); + --salt-palette-interact-foreground: var(--salt-color-gray-90); + --salt-palette-interact-foreground-active: var(--salt-color-blue-100); + --salt-palette-interact-foreground-activeDisabled: var(--salt-color-blue-100-fade-foreground); + --salt-palette-interact-foreground-disabled: var(--salt-color-gray-90-fade-foreground); + --salt-palette-interact-foreground-hover: var(--salt-color-blue-500); + --salt-palette-interact-outline: var(--vuu-color-pink-10); + + --salt-palette-interact-cta-background: var(--tar-color-red-10); + --salt-palette-interact-cta-background-active: var(--tar-color-red-20); + --salt-palette-interact-cta-background-disabled: var(--tar-color-red-40); + --salt-palette-interact-cta-background-hover: var(--tar-color-red-20); + --salt-palette-interact-cta-foreground: var(--salt-color-white); + --salt-palette-interact-cta-foreground-active: var(--salt-color-white); + --salt-palette-interact-cta-foreground-disabled: var(--salt-color-white-fade-foreground); + --salt-palette-interact-cta-foreground-hover: var(--salt-color-white); + + --salt-palette-interact-primary-background: var(--tar-color-gray-20); + --salt-palette-interact-primary-background-active: var(--tar-color-gray-10); + --salt-palette-interact-primary-background-disabled: var(--tar-color-gray-30); + --salt-palette-interact-primary-background-hover: var(--tar-color-gray-10); + --salt-palette-interact-primary-foreground: var(--tar-color-gray-70); + --salt-palette-interact-primary-foreground-active: var(--tar-color-gray-70); + --salt-palette-interact-primary-foreground-disabled: var(--tar-color-gray-40); + --salt-palette-interact-primary-foreground-hover: var(--tar-color-gray-70); + + --salt-palette-interact-secondary-background: var(--tar-color-gray-70); + --salt-palette-interact-secondary-background-active: var(--tar-color-gray-10); + --salt-palette-interact-secondary-background-disabled: transparent; + --salt-palette-interact-secondary-background-hover: var(--tar-color-gray-10); + --salt-palette-interact-secondary-foreground: var(--tar-color-gray-10); + --salt-palette-interact-secondary-foreground-active: var(--tar-color-gray-70); + --salt-palette-interact-secondary-foreground-disabled: var(--tar-color-gray-40); + --salt-palette-interact-secondary-foreground-hover: var(--tar-color-gray-70); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/navigate.css b/vuu-ui/themes/tar-theme/css/palette/navigate.css new file mode 100644 index 000000000..0c4bfea41 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/navigate.css @@ -0,0 +1,17 @@ +.tar-theme[data-mode="light"] { + --salt-palette-navigate-primary-background-active: transparent; + --salt-palette-navigate-foreground-hover: var(--salt-color-blue-600); + --salt-palette-navigate-foreground-active: var(--salt-color-blue-700); + --salt-palette-navigate-foreground-visited: var(--salt-color-purple-800); + --salt-palette-navigate-indicator-hover: var(--salt-color-gray-90); + --salt-palette-navigate-indicator-active: var(--tar-color-red-10); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-navigate-primary-background-active: transparent; + --salt-palette-navigate-foreground-hover: var(--salt-color-blue-200); + --salt-palette-navigate-foreground-active: var(--salt-color-blue-300); + --salt-palette-navigate-foreground-visited: var(--salt-color-purple-100); + --salt-palette-navigate-indicator-hover: var(--salt-color-gray-90); + --salt-palette-navigate-indicator-active: var(--vuu-color-pink-10); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/negative.css b/vuu-ui/themes/tar-theme/css/palette/negative.css new file mode 100644 index 000000000..62711b137 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/negative.css @@ -0,0 +1,7 @@ +.tar-theme[data-mode="light"] { + --salt-palette-negative-foreground: var(--salt-color-red-700); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-negative-foreground: var(--salt-color-red-300); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/neutral.css b/vuu-ui/themes/tar-theme/css/palette/neutral.css new file mode 100644 index 000000000..cff08b527 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/neutral.css @@ -0,0 +1,41 @@ +.tar-theme[data-mode="light"] { + --salt-palette-neutral-primary-background: var(--salt-color-white); + --salt-palette-neutral-primary-background-disabled: var(--vuu-color-gray-30); + --salt-palette-neutral-primary-background-readonly: var(--salt-color-white-fade-background-readonly); + --salt-palette-neutral-primary-foreground: var(--vuu-color-gray-80); + --salt-palette-neutral-primary-foreground-disabled: var(--salt-color-gray-900-fade-foreground); + --salt-palette-neutral-primary-separator: var(--tar-color-gray-05); + --salt-palette-neutral-primary-border: var(--tar-color-gray-40); + --salt-palette-neutral-primary-border-disabled: var(--salt-color-gray-50-fade-border); + --salt-palette-neutral-secondary-background: var(--vuu-color-gray-25); + --salt-palette-neutral-secondary-background-disabled: var(--salt-color-gray-20-fade-background); + --salt-palette-neutral-secondary-background-readonly: var(--salt-color-gray-20-fade-background-readonly); + --salt-palette-neutral-secondary-border: var(--vuu-color-gray-50); + --salt-palette-neutral-secondary-border-disabled: var(--salt-color-gray-50-fade-border); + --salt-palette-neutral-secondary-foreground: var(--salt-color-gray-200); + --salt-palette-neutral-secondary-foreground-disabled: var(--salt-color-gray-200-fade-foreground); + --salt-palette-neutral-backdrop: var(--salt-color-white-fade-backdrop); + --salt-palette-neutral-secondary-separator: var(--vuu-color-gray-05); + --salt-palette-neutral-tertiary-separator: var(--vuu-color-gray-03); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-neutral-primary-background: var(--tar-color-gray-70); + --salt-palette-neutral-primary-background-disabled: var(--salt-color-gray-800-fade-background); + --salt-palette-neutral-primary-background-readonly: var(--salt-color-gray-800-fade-background-readonly); + --salt-palette-neutral-primary-border: var(--tar-color-gray-25); + --salt-palette-neutral-primary-border-disabled: var(--salt-color-gray-300-fade-border); + --salt-palette-neutral-primary-foreground: var(--salt-color-white); + --salt-palette-neutral-primary-foreground-disabled: var(--salt-color-white-fade-foreground); + --salt-palette-neutral-primary-separator: var(--tar-color-gray-30); + --salt-palette-neutral-secondary-background: var(--salt-color-gray-600); + --salt-palette-neutral-secondary-background-disabled: var(--salt-color-gray-600-fade-background); + --salt-palette-neutral-secondary-background-readonly: var(--salt-color-gray-600-fade-background-readonly); + --salt-palette-neutral-secondary-border: var(--salt-color-gray-300); + --salt-palette-neutral-secondary-border-disabled: var(--salt-color-gray-300-fade-border); + --salt-palette-neutral-secondary-foreground: var(--salt-color-gray-70); + --salt-palette-neutral-secondary-foreground-disabled: var(--salt-color-gray-70-fade-foreground); + --salt-palette-neutral-backdrop: var(--salt-color-black-fade-backdrop); + --salt-palette-neutral-secondary-separator: var(--salt-color-white-fade-separatorOpacity-secondary); + --salt-palette-neutral-tertiary-separator: var(--salt-color-white-fade-separatorOpacity-tertiary); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/opacity.css b/vuu-ui/themes/tar-theme/css/palette/opacity.css new file mode 100644 index 000000000..e43d3f6bb --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/opacity.css @@ -0,0 +1,9 @@ +.tar-theme { + --salt-palette-opacity-backdrop: var(--salt-opacity-70); + --salt-palette-opacity-disabled: var(--salt-opacity-40); + --salt-palette-opacity-background-readonly: var(--salt-opacity-0); + --salt-palette-opacity-border-readonly: var(--salt-opacity-15); + --salt-palette-opacity-primary-border: var(--salt-opacity-40); + --salt-palette-opacity-secondary-border: var(--salt-opacity-25); + --salt-palette-opacity-tertiary-border: var(--salt-opacity-15); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/positive.css b/vuu-ui/themes/tar-theme/css/palette/positive.css new file mode 100644 index 000000000..39dfdfeb8 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/positive.css @@ -0,0 +1,7 @@ +.tar-theme[data-mode="light"] { + --salt-palette-positive-foreground: var(--salt-color-green-700); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-positive-foreground: var(--salt-color-green-300); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/success.css b/vuu-ui/themes/tar-theme/css/palette/success.css new file mode 100644 index 000000000..ca282c555 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/success.css @@ -0,0 +1,13 @@ +.tar-theme[data-mode="light"] { + --salt-palette-success-background: var(--salt-color-green-10); + --salt-palette-success-background-selected: var(--salt-color-green-20); + --salt-palette-success-border: var(--salt-color-green-500); + --salt-palette-success-foreground: var(--salt-color-green-500); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-success-background: var(--salt-color-green-900); + --salt-palette-success-background-selected: var(--salt-color-green-900); + --salt-palette-success-border: var(--salt-color-green-400); + --salt-palette-success-foreground: var(--salt-color-green-400); +} diff --git a/vuu-ui/themes/tar-theme/css/palette/warning.css b/vuu-ui/themes/tar-theme/css/palette/warning.css new file mode 100644 index 000000000..20bdce97b --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/palette/warning.css @@ -0,0 +1,13 @@ +.tar-theme[data-mode="light"] { + --salt-palette-warning-background: var(--salt-color-orange-10); + --salt-palette-warning-background-selected: var(--salt-color-orange-20); + --salt-palette-warning-border: var(--salt-color-orange-700); + --salt-palette-warning-foreground: var(--salt-color-orange-700); +} + +.tar-theme[data-mode="dark"] { + --salt-palette-warning-background: var(--salt-color-orange-900); + --salt-palette-warning-background-selected: var(--salt-color-orange-900); + --salt-palette-warning-border: var(--salt-color-orange-500); + --salt-palette-warning-foreground: var(--salt-color-orange-500); +} diff --git a/vuu-ui/themes/tar-theme/css/theme.css b/vuu-ui/themes/tar-theme/css/theme.css new file mode 100644 index 000000000..a5e6d3843 --- /dev/null +++ b/vuu-ui/themes/tar-theme/css/theme.css @@ -0,0 +1,48 @@ +/** + * We're using url importing for now. When performance becomes a concern, we can always run a + * scripts to massage them into one. Or even split them to theme specific ones. + */ + +/* Foundations (base values) */ +@import url(foundations/animation.css); +@import url(foundations/color.css); +@import url(foundations/duration.css); +@import url(foundations/fade.css); +@import url(foundations/opacity.css); +@import url(foundations/shadow.css); +@import url(foundations/size.css); +@import url(foundations/spacing.css); +@import url(foundations/typography.css); +@import url(foundations/zindex.css); + +/* Intermediate palette (refined colors) */ +@import url(palette/accent.css); +@import url(palette/error.css); +@import url(palette/info.css); +@import url(palette/interact.css); +@import url(palette/navigate.css); +@import url(palette/negative.css); +@import url(palette/neutral.css); +@import url(palette/opacity.css); +@import url(palette/positive.css); +@import url(palette/success.css); +@import url(palette/warning.css); + +/* Each characteristic file references values from above foundations */ +@import url(characteristics/accent.css); +@import url(characteristics/actionable.css); +@import url(characteristics/container.css); +@import url(characteristics/draggable.css); +@import url(characteristics/target.css); +@import url(characteristics/editable.css); +@import url(characteristics/focused.css); +@import url(characteristics/navigable.css); +@import url(characteristics/overlayable.css); +@import url(characteristics/selectable.css); +@import url(characteristics/separable.css); +@import url(characteristics/status.css); +@import url(characteristics/text.css); +@import url(characteristics/content.css); +@import url(characteristics/track.css); + +@import url(deprecated/foundations.css); \ No newline at end of file diff --git a/vuu-ui/themes/tar-theme/fonts/NunitoSans-Regular.woff b/vuu-ui/themes/tar-theme/fonts/NunitoSans-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..841827c895b772dda34927fe86d6e7168cccaf3f GIT binary patch literal 53192 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 literal 0 HcmV?d00001 diff --git a/vuu-ui/themes/tar-theme/fonts/NunitoSansv15Latin.woff2 b/vuu-ui/themes/tar-theme/fonts/NunitoSansv15Latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3a597c3dca96cf4337de46abfb8463f092a76b7f GIT binary patch literal 49876 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

m9Dry>9 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 SX{N?2!3di4sEpMC0002x_;o`7 literal 0 HcmV?d00001 diff --git a/vuu-ui/themes/tar-theme/index.css b/vuu-ui/themes/tar-theme/index.css new file mode 100644 index 000000000..6be451256 --- /dev/null +++ b/vuu-ui/themes/tar-theme/index.css @@ -0,0 +1,5 @@ +@import url(NunitoSans.css); +@import url(SomeTypeMono.css); +@import url(css/global.css); +@import url(css/theme.css); +@import url(css/components/components.css); diff --git a/vuu-ui/themes/tar-theme/package.json b/vuu-ui/themes/tar-theme/package.json new file mode 100644 index 000000000..d83795186 --- /dev/null +++ b/vuu-ui/themes/tar-theme/package.json @@ -0,0 +1,12 @@ +{ + "name": "@vuu-themes/tar-theme", + "version": "0.0.26", + "license": "Apache-2.0", + "style": "index.css", + "files": [ + "fonts" + ], + "scripts": { + "build": "node ../../scripts/run-build.mjs" + } +} diff --git a/vuu-ui/tools/vuu-showcase/src/App.tsx b/vuu-ui/tools/vuu-showcase/src/App.tsx index d7f56c822..56f57003f 100644 --- a/vuu-ui/tools/vuu-showcase/src/App.tsx +++ b/vuu-ui/tools/vuu-showcase/src/App.tsx @@ -37,7 +37,7 @@ const sourceFromImports = ( childNodes: sourceFromImports(stories, `${id}/`, "box"), }; }); - +// LIF00219931962 export interface AppProps { stories: ExamplesModule; } @@ -50,6 +50,7 @@ const availableThemes: ThemeDescriptor[] = [ { id: "no-theme", label: "No Theme" }, { id: "salt", label: "Salt" }, { id: "vuu", label: "Vuu" }, + { id: "tar", label: "Tar" }, ]; const availableThemeModes: ThemeModeDescriptor[] = [ @@ -155,6 +156,7 @@ export const App = ({ stories }: AppProps) => { No Theme SALT VUU + TAR - Object.entries(examples) - .filter(([path]) => path !== "default") - .reduce((routes, [label, Value]) => { - const id = `${prefix}${label}`; - return typeof Value === "object" - ? routes - .concat() - .concat(createRoutes(Value, `${id}/`)) - : routes.concat(); - }, []); - -interface AppRoutesProps { - stories: ExamplesModule; -} - -export const AppRoutes = ({ stories }: AppRoutesProps) => ( - - - }> - {createRoutes(stories)} - - - -); diff --git a/vuu-ui/tools/vuu-showcase/src/Showcase.tsx b/vuu-ui/tools/vuu-showcase/src/Showcase.tsx index ca8f81d8b..7f308572c 100644 --- a/vuu-ui/tools/vuu-showcase/src/Showcase.tsx +++ b/vuu-ui/tools/vuu-showcase/src/Showcase.tsx @@ -3,9 +3,30 @@ import "./themes/vuu"; import "./Showcase.css"; -import { AppRoutes } from "./AppRoutes"; +import { BrowserRouter, Route, Routes } from "react-router-dom"; import { ExamplesModule } from "./showcase-utils"; +import { App } from "./App"; + +const createRoutes = (examples: ExamplesModule, prefix = ""): JSX.Element[] => + Object.entries(examples) + .filter(([path]) => path !== "default") + .reduce((routes, [label, Value]) => { + const id = `${prefix}${label}`; + return typeof Value === "object" + ? routes + .concat() + .concat(createRoutes(Value, `${id}/`)) + : routes.concat(); + }, []); export const Showcase = ({ exhibits }: { exhibits: ExamplesModule }) => { - return ; + return ( + + + }> + {createRoutes(exhibits)} + + + + ); }; diff --git a/vuu-ui/tools/vuu-showcase/src/ShowcaseStandalone.tsx b/vuu-ui/tools/vuu-showcase/src/ShowcaseStandalone.tsx index 59a3c53e9..1f43311ef 100644 --- a/vuu-ui/tools/vuu-showcase/src/ShowcaseStandalone.tsx +++ b/vuu-ui/tools/vuu-showcase/src/ShowcaseStandalone.tsx @@ -18,6 +18,10 @@ const asThemeMode = (input: string | undefined): ThemeMode => { } }; +const themeIsInstalled = (theme = "no-theme") => { + return ["salt", "vuu", "tar"].includes(theme); +}; + const asDensity = (input: string | undefined): Density => { if (input === "high" || input === "low" || input === "touch") { return input; @@ -58,19 +62,10 @@ export const ShowcaseStandalone = () => { }, []); useMemo(() => { - switch (theme) { - case "vuu": - import("./themes/vuu").then(() => { - setThemeReady(true); - }); - break; - case "salt": - import("./themes/salt").then(() => { - setThemeReady(true); - }); - break; - default: - // do nothing + if (themeIsInstalled(theme)) { + import(`./themes/${theme}.ts`).then(() => { + setThemeReady(true); + }); } }, [theme]); diff --git a/vuu-ui/tools/vuu-showcase/src/themes/tar.ts b/vuu-ui/tools/vuu-showcase/src/themes/tar.ts new file mode 100644 index 000000000..4fe27182e --- /dev/null +++ b/vuu-ui/tools/vuu-showcase/src/themes/tar.ts @@ -0,0 +1,2 @@ +import "@vuu-themes/tar-theme/index.css"; +import "@finos/vuu-icons/index.css";