diff --git a/.bundlewatch.config.json b/.bundlewatch.config.json index 21dd4812fc..2f9eac771d 100644 --- a/.bundlewatch.config.json +++ b/.bundlewatch.config.json @@ -2,11 +2,11 @@ "files": [ { "path": "./packages/orange/dist/css/ouds-web-bootstrap.css", - "maxSize": "75.75 kB" + "maxSize": "77 kB" }, { "path": "./packages/orange/dist/css/ouds-web-bootstrap.min.css", - "maxSize": "72.25 kB" + "maxSize": "73.25 kB" }, { "path": "./packages/orange/dist/css/ouds-web-grid.css", @@ -34,11 +34,11 @@ }, { "path": "./packages/orange/dist/css/ouds-web.css", - "maxSize": "65.5 kB" + "maxSize": "66 kB" }, { "path": "./packages/orange/dist/css/ouds-web.min.css", - "maxSize": "61.75 kB" + "maxSize": "62 kB" }, { "path": "./dist/js/ouds-web.bundle.js", diff --git a/packages/orange-compact/scss/tokens/_component.scss b/packages/orange-compact/scss/tokens/_component.scss index a853911be6..662b224c52 100644 --- a/packages/orange-compact/scss/tokens/_component.scss +++ b/packages/orange-compact/scss/tokens/_component.scss @@ -156,6 +156,11 @@ $ouds-button-space-padding-inline-end-icon-start: $ouds-space-padding-inline-3xl $ouds-button-space-padding-inline-icon-none: $ouds-space-padding-inline-4xlarge !default; $ouds-button-space-padding-inline-icon-start: $ouds-space-padding-inline-xlarge !default; $ouds-button-space-padding-inline-start-icon-end: $ouds-space-padding-inline-3xlarge !default; +// Manually added tokens for AI button +$ouds-button-color-border-primary: var(--#{$prefix}color-border-brand-primary) !default; +$ouds-button-color-border-secondary: $core-orange-color-decorative-shocking-pink-200 !default; +$ouds-button-color-border-tertiary: $core-orange-color-decorative-amethyst-400 !default; +$ouds-button-color-border-quaternary: $core-orange-color-decorative-sky-400 !default; // scss-docs-end ouds-component-button // Checkbox diff --git a/packages/orange-compact/scss/tokens/_composite.scss b/packages/orange-compact/scss/tokens/_composite.scss index baf2b56ede..d38887b78c 100644 --- a/packages/orange-compact/scss/tokens/_composite.scss +++ b/packages/orange-compact/scss/tokens/_composite.scss @@ -117,6 +117,8 @@ $select-input-expanded-chevron: url("data:image/svg+xml,") !default; // icon button next v1.4 $btn-next-icon: url("data:image/svg+xml,") !default; +// icon button ai v1.5 +$btn-ai-icon: url("data:image/svg+xml,") !default; //// SVG used several times $svg-as-custom-props: ( diff --git a/packages/orange/scss/tokens/_component.scss b/packages/orange/scss/tokens/_component.scss index 85e2d72648..bf294fcfdb 100644 --- a/packages/orange/scss/tokens/_component.scss +++ b/packages/orange/scss/tokens/_component.scss @@ -156,6 +156,11 @@ $ouds-button-space-padding-inline-end-icon-start: $ouds-space-padding-inline-3xl $ouds-button-space-padding-inline-icon-none: $ouds-space-padding-inline-4xlarge !default; $ouds-button-space-padding-inline-icon-start: $ouds-space-padding-inline-xlarge !default; $ouds-button-space-padding-inline-start-icon-end: $ouds-space-padding-inline-3xlarge !default; +// Manually added tokens for AI button +$ouds-button-color-border-primary: var(--#{$prefix}color-border-brand-primary) !default; +$ouds-button-color-border-secondary: $core-orange-color-decorative-shocking-pink-200 !default; +$ouds-button-color-border-tertiary: $core-orange-color-decorative-amethyst-400 !default; +$ouds-button-color-border-quaternary: $core-orange-color-decorative-sky-400 !default; // scss-docs-end ouds-component-button // Checkbox diff --git a/packages/orange/scss/tokens/_composite.scss b/packages/orange/scss/tokens/_composite.scss index baf2b56ede..d38887b78c 100644 --- a/packages/orange/scss/tokens/_composite.scss +++ b/packages/orange/scss/tokens/_composite.scss @@ -117,6 +117,8 @@ $select-input-expanded-chevron: url("data:image/svg+xml,") !default; // icon button next v1.4 $btn-next-icon: url("data:image/svg+xml,") !default; +// icon button ai v1.5 +$btn-ai-icon: url("data:image/svg+xml,") !default; //// SVG used several times $svg-as-custom-props: ( diff --git a/packages/sosh/scss/tokens/_component-colors-custom-props.scss b/packages/sosh/scss/tokens/_component-colors-custom-props.scss index aed916e409..0774bb18ef 100644 --- a/packages/sosh/scss/tokens/_component-colors-custom-props.scss +++ b/packages/sosh/scss/tokens/_component-colors-custom-props.scss @@ -8,6 +8,7 @@ @include color-mode(light, true) { --#{$prefix}button-color-bg-brand-pressed: #{$core-sosh-color-magenta-500}; --#{$prefix}button-color-bg-brand-loading: #{$core-sosh-color-magenta-500}; + --#{$prefix}button-color-border-quaternary: #{$core-ouds-color-opacity-black-680}; --#{$prefix}button-color-content-brand-pressed: #{$core-ouds-color-functional-white}; --#{$prefix}button-color-content-brand-loading: #{$core-ouds-color-functional-white}; --#{$prefix}button-mono-color-bg-default-hover: #{$core-ouds-color-opacity-black-680}; @@ -64,6 +65,7 @@ @include color-mode(dark, true) { --#{$prefix}button-color-bg-brand-pressed: #{$core-sosh-color-blue-duck-light-800}; --#{$prefix}button-color-bg-brand-loading: #{$core-sosh-color-blue-duck-light-800}; + --#{$prefix}button-color-border-quaternary: #{$core-ouds-color-opacity-white-200}; --#{$prefix}button-color-content-brand-pressed: #{$core-ouds-color-functional-black}; --#{$prefix}button-color-content-brand-loading: #{$core-ouds-color-functional-black}; --#{$prefix}button-mono-color-bg-default-hover: #{$core-ouds-color-opacity-white-800}; diff --git a/packages/sosh/scss/tokens/_component.scss b/packages/sosh/scss/tokens/_component.scss index 0359b5e73d..61ab8b8e33 100644 --- a/packages/sosh/scss/tokens/_component.scss +++ b/packages/sosh/scss/tokens/_component.scss @@ -156,6 +156,11 @@ $ouds-button-space-padding-inline-end-icon-start: $ouds-space-padding-inline-3xl $ouds-button-space-padding-inline-icon-none: $ouds-space-padding-inline-4xlarge !default; $ouds-button-space-padding-inline-icon-start: $ouds-space-padding-inline-xlarge !default; $ouds-button-space-padding-inline-start-icon-end: $ouds-space-padding-inline-3xlarge !default; +// Manually added tokens for AI button +$ouds-button-color-border-primary: var(--#{$prefix}color-border-brand-secondary) !default; +$ouds-button-color-border-secondary: var(--#{$prefix}color-border-brand-primary) !default; +$ouds-button-color-border-tertiary: var(--#{$prefix}color-border-brand-tertiary) !default; +$ouds-button-color-border-quaternary: var(--#{$prefix}button-color-border-quaternary) !default; // scss-docs-end ouds-component-button // Checkbox diff --git a/packages/sosh/scss/tokens/_composite.scss b/packages/sosh/scss/tokens/_composite.scss index 5805dd981c..2eee497b63 100644 --- a/packages/sosh/scss/tokens/_composite.scss +++ b/packages/sosh/scss/tokens/_composite.scss @@ -108,6 +108,8 @@ $select-input-expanded-chevron: url("data:image/svg+xml,") !default; // icon button next v1.4 $btn-next-icon: url("data:image/svg+xml,") !default; +// icon button ai v1.5 +$btn-ai-icon: url("data:image/svg+xml,") !default; //// SVG used several times $svg-as-custom-props: ( diff --git a/scss/_buttons.scss b/scss/_buttons.scss index 35d3a02337..9217cc71f7 100644 --- a/scss/_buttons.scss +++ b/scss/_buttons.scss @@ -60,6 +60,7 @@ display: inline-flex; // OUDS mod: instead of `inline-block` flex-shrink: 0; + gap: var(--#{$prefix}btn-icon-gap); align-items: center; // OUDS mod justify-content: center; // OUDS mod min-width: var(--#{$prefix}btn-min-width); // OUDS mod @@ -189,7 +190,6 @@ flex-shrink: 0; width: 1em; height: 1em; - margin-right: var(--#{$prefix}btn-icon-gap); overflow: hidden; font-size: var(--#{$prefix}btn-icon-size); line-height: 1; @@ -497,29 +497,23 @@ .btn-previous { --#{$prefix}btn-padding-start: #{$ouds-button-space-padding-inline-chevron-start}; --#{$prefix}btn-padding-end: #{$ouds-button-space-padding-inline-end-icon-start}; + --#{$prefix}btn-icon-gap: #{$ouds-button-space-column-gap-chevron}; &::before { content: ""; mask-image: $btn-previous-icon; } - - &:not(.btn-icon)::before { - margin-right: $ouds-button-space-column-gap-chevron; - } } .btn-next { --#{$prefix}btn-padding-start: #{$ouds-button-space-padding-inline-start-icon-end}; --#{$prefix}btn-padding-end: #{$ouds-button-space-padding-inline-chevron-end}; + --#{$prefix}btn-icon-gap: #{$ouds-button-space-column-gap-chevron}; &::after { content: ""; mask-image: $btn-next-icon; } - - &:not(.btn-icon)::after { - margin-left: $ouds-button-space-column-gap-chevron; - } } .btn-previous::before, @@ -529,3 +523,51 @@ background-color: currentcolor; } +// No transparency on the button +.btn-default.btn-ai:where(:not(:active, [class*="loading-"], :disabled, [aria-disabled="true"], .btn-on-colored-bg)) { + --#{$prefix}btn-bg: initial; + + background: linear-gradient(var(--#{$prefix}btn-bg, var(--#{$prefix}color-bg-primary))) padding-box, conic-gradient($ouds-button-color-border-secondary 0deg 78deg, $ouds-button-color-border-tertiary 78deg 118deg, $ouds-button-color-border-quaternary 118deg 242deg, $ouds-button-color-border-primary 242deg 360deg) border-box; + background-origin: border-box; + border-color: transparent; + + &.btn-icon { + background: linear-gradient(var(--#{$prefix}btn-bg, var(--#{$prefix}color-bg-primary))) padding-box, conic-gradient($ouds-button-color-border-secondary 0deg 72deg, $ouds-button-color-border-tertiary 72deg 144deg, $ouds-button-color-border-quaternary 144deg 216deg, $ouds-button-color-border-primary 216deg 360deg) border-box; + } +} + +.btn-ai { + --#{$prefix}btn-padding-start: #{$ouds-button-space-padding-inline-icon-start}; + --#{$prefix}btn-padding-end: #{$ouds-button-space-padding-inline-start-icon-end}; + + &:hover, + &:focus, + &:focus-visible, + &:active, + &:disabled, + &[aria-disabled="true"] { + .btn-ai-colored-icon { + display: none; + } + } + + &.btn-default, + &.btn-strong:where(:not(:has(.btn-ai-colored-icon))), + &.btn-brand, + &.btn-minimal:where(:not(:has(.btn-ai-colored-icon))), + &.btn-negative, + &:hover, + &:focus, + &:focus-visible, + &:active, + &:disabled, + &[aria-disabled="true"] { + &::before { + width: var(--#{$prefix}btn-icon-size); + height: var(--#{$prefix}btn-icon-size); + content: ""; + background-color: currentcolor; + mask-image: $btn-ai-icon; + } + } +} diff --git a/site/data/components-details.ts b/site/data/components-details.ts index 8b547a8c28..cbbc4227d3 100644 --- a/site/data/components-details.ts +++ b/site/data/components-details.ts @@ -3,6 +3,13 @@ import { getConfig } from '@libs/config' import { getVersionedDocsPath } from '@libs/path' export const componentsDetails: ComponentCardData[] = [ + { + name: 'AI button', + slug: 'ai-button', + link: 'buttons#ai-button', + category: 'Actions', + snippet: `` + }, { name: 'Alert message', slug: 'alert-message', diff --git a/site/src/content/docs/components/buttons.mdx b/site/src/content/docs/components/buttons.mdx index 7c3611f4a3..765dba5f96 100644 --- a/site/src/content/docs/components/buttons.mdx +++ b/site/src/content/docs/components/buttons.mdx @@ -7,6 +7,7 @@ toc: true types: - Button - Navigation button + - AI button --- import { getData } from '@libs/data' @@ -22,7 +23,7 @@ import { getMode } from '@libs/sass-variables' ### Component types -
+
+
+
+
+
+
+
+ `} />
+