From 04ad643893bf3be99cc5dfef9c6c89ac109392b5 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 26 May 2026 14:25:46 -0700 Subject: [PATCH 1/3] feat(text): add recipe and tokens --- BREAKING.md | 23 +++++++ core/api.txt | 4 +- core/src/components.d.ts | 19 +++--- core/src/components/text/test/hue/index.html | 61 +++++++++++++++++++ core/src/components/text/text.interfaces.ts | 18 ++++++ core/src/components/text/text.scss | 21 +++++-- core/src/components/text/text.tsx | 27 ++++++-- core/src/themes/ionic/default.tokens.ts | 24 ++++++++ core/src/themes/ios/default.tokens.ts | 24 ++++++++ core/src/themes/md/default.tokens.ts | 24 ++++++++ core/src/themes/themes.interfaces.ts | 3 + packages/angular/src/directives/proxies.ts | 4 +- .../standalone/src/directives/proxies.ts | 4 +- packages/vue/src/proxies.ts | 3 +- 14 files changed, 236 insertions(+), 23 deletions(-) create mode 100644 core/src/components/text/test/hue/index.html create mode 100644 core/src/components/text/text.interfaces.ts diff --git a/BREAKING.md b/BREAKING.md index 12fca9b9580..3e62ae575d0 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -26,6 +26,7 @@ This is a comprehensive list of the breaking changes introduced in the major ver - [Item Divider](#version-9x-item-divider) - [Radio Group](#version-9x-radio-group) - [Spinner](#version-9x-spinner) + - [Text](#version-9x-text) - [Textarea](#version-9x-textarea)

Global Styles

@@ -289,6 +290,28 @@ Additionally, the `radio-group-wrapper` div element has been removed, causing sl - `.spinner-[spinner-name]` → `.spinner-name-[spinner-name]` - Specific theme classes (e.g., `ion-spinner.md`) are no longer supported. Style modifications based on the active theme must be implemented using theme tokens rather than direct class targeting. +

Text

+ +The following breaking changes apply to `ion-text`: + +1. The color applied by the `color` prop is now driven by the centralized Ionic Theming system, scoped to the new `hue` property. +2. Theme classes (`ion-text.md`, `ion-text.ios`) are no longer supported. + +
New `hue` property and color tokens
+ +A new `hue` property selects between vibrant and muted color variants. It defaults to `"bold"`, which preserves prior behavior when `color` is set. + +When `color` is set, the text color now reads from a token instead of `--ion-color-base` directly. Global overrides should use the theme tokens; component-specific overrides use the corresponding CSS variables: + +| Hue | Token (global) | CSS variable (component-specific) | +|---|---|---| +| `bold` | `IonText.hue.bold.semantic.default.color` | `--ion-text-hue-bold-semantic-default-color` | +| `subtle` | `IonText.hue.subtle.semantic.default.color` | `--ion-text-hue-subtle-semantic-default-color` | + +
Theme classes
+ +Remove any instances that target the theme classes: `ion-text.md`, `ion-text.ios`. +

Textarea

Converted `ion-textarea` to use [Shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM). diff --git a/core/api.txt b/core/api.txt index 618916e5be4..6defeed5dc0 100644 --- a/core/api.txt +++ b/core/api.txt @@ -2699,8 +2699,10 @@ ion-tabs,event,ionTabsWillChange,{ tab: string; },false ion-text,shadow ion-text,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record | undefined,undefined,false,true +ion-text,prop,hue,"bold" | "subtle" | undefined,undefined,false,false ion-text,prop,mode,"ios" | "md",undefined,false,false -ion-text,prop,theme,"ios" | "md" | "ionic",undefined,false,false +ion-text,css-prop,--ion-text-hue-bold-semantic-default-color +ion-text,css-prop,--ion-text-hue-subtle-semantic-default-color ion-textarea,shadow ion-textarea,prop,autoGrow,boolean,false,false,true diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 1b7292c8df1..440c0e6ceb8 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -44,6 +44,7 @@ import { SelectModalOption } from "./components/select-modal/select-modal-interf import { SelectPopoverOption } from "./components/select-popover/select-popover-interface"; import { SpinnerSize } from "./components/spinner/spinner.interfaces"; import { TabBarChangedEventDetail, TabButtonClickEventDetail, TabButtonLayout } from "./components/tab-bar/tab-bar-interface"; +import { IonTextHue } from "./components/text/text.interfaces"; import { TextareaChangeEventDetail, TextareaInputEventDetail } from "./components/textarea/textarea-interface"; import { ToastButton, ToastDismissOptions, ToastLayout, ToastPosition, ToastPresentOptions, ToastSwipeGestureDirection } from "./components/toast/toast-interface"; import { ToggleChangeEventDetail } from "./components/toggle/toggle-interface"; @@ -86,6 +87,7 @@ export { SelectModalOption } from "./components/select-modal/select-modal-interf export { SelectPopoverOption } from "./components/select-popover/select-popover-interface"; export { SpinnerSize } from "./components/spinner/spinner.interfaces"; export { TabBarChangedEventDetail, TabButtonClickEventDetail, TabButtonLayout } from "./components/tab-bar/tab-bar-interface"; +export { IonTextHue } from "./components/text/text.interfaces"; export { TextareaChangeEventDetail, TextareaInputEventDetail } from "./components/textarea/textarea-interface"; export { ToastButton, ToastDismissOptions, ToastLayout, ToastPosition, ToastPresentOptions, ToastSwipeGestureDirection } from "./components/toast/toast-interface"; export { ToggleChangeEventDetail } from "./components/toggle/toggle-interface"; @@ -4075,13 +4077,13 @@ export namespace Components { */ "color"?: Color; /** - * The mode determines the platform behaviors of the component. + * Set to `"bold"` for a text with vibrant, bold colors or to `"subtle"` for a text with muted, subtle colors. Defaults to `"bold"` if both the hue property and theme config are unset. */ - "mode"?: "ios" | "md"; + "hue"?: IonTextHue; /** - * The theme determines the visual appearance of the component. + * The mode determines the platform behaviors of the component. */ - "theme"?: "ios" | "md" | "ionic"; + "mode"?: "ios" | "md"; } interface IonTextarea { /** @@ -10155,13 +10157,13 @@ declare namespace LocalJSX { */ "color"?: Color; /** - * The mode determines the platform behaviors of the component. + * Set to `"bold"` for a text with vibrant, bold colors or to `"subtle"` for a text with muted, subtle colors. Defaults to `"bold"` if both the hue property and theme config are unset. */ - "mode"?: "ios" | "md"; + "hue"?: IonTextHue; /** - * The theme determines the visual appearance of the component. + * The mode determines the platform behaviors of the component. */ - "theme"?: "ios" | "md" | "ionic"; + "mode"?: "ios" | "md"; } interface IonTextarea { /** @@ -11313,6 +11315,7 @@ declare namespace LocalJSX { } interface IonTextAttributes { "color": Color; + "hue": IonTextHue; } interface IonTextareaAttributes { "color": Color; diff --git a/core/src/components/text/test/hue/index.html b/core/src/components/text/test/hue/index.html new file mode 100644 index 00000000000..d430806d7f3 --- /dev/null +++ b/core/src/components/text/test/hue/index.html @@ -0,0 +1,61 @@ + + + + + Text - Hue + + + + + + + + + + + + + + + Text - Hue + + + + +

Text Hue: Bold

+ + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + +

Text Hue: Subtle

+ + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog + The quick brown fox jumps over the lazy dog +
+
+ + diff --git a/core/src/components/text/text.interfaces.ts b/core/src/components/text/text.interfaces.ts new file mode 100644 index 00000000000..30e643c57b1 --- /dev/null +++ b/core/src/components/text/text.interfaces.ts @@ -0,0 +1,18 @@ +export type IonTextRecipe = { + hue?: { + [K in IonTextHue]?: { + /** Any of the semantic colors like primary, secondary, etc. */ + semantic?: { + default?: { + color?: string; + }; + }; + }; + }; +}; + +export type IonTextConfig = { + hue?: IonTextHue; +}; + +export type IonTextHue = 'bold' | 'subtle'; diff --git a/core/src/components/text/text.scss b/core/src/components/text/text.scss index d86de15d200..5f77690076c 100644 --- a/core/src/components/text/text.scss +++ b/core/src/components/text/text.scss @@ -1,8 +1,19 @@ -@import "../../themes/native/native.globals"; - -// Text +// Text: Common Styles // -------------------------------------------------- -:host(.ion-color) { - color: current-color(base); +:host { + /** + * @prop --ion-text-hue-bold-semantic-default-color: Color of the `bold` hue when a semantic color is applied + * @prop --ion-text-hue-subtle-semantic-default-color: Color of the `subtle` hue when a semantic color is applied + */ + + color: inherit; +} + +:host(.text-hue-bold.ion-color) { + color: var(--ion-text-hue-bold-semantic-default-color); +} + +:host(.text-hue-subtle.ion-color) { + color: var(--ion-text-hue-subtle-semantic-default-color); } diff --git a/core/src/components/text/text.tsx b/core/src/components/text/text.tsx index c3fab899fd8..6cc8a5afdb1 100644 --- a/core/src/components/text/text.tsx +++ b/core/src/components/text/text.tsx @@ -2,12 +2,13 @@ import type { ComponentInterface } from '@stencil/core'; import { Component, Host, Prop, h } from '@stencil/core'; import { createColorClasses } from '@utils/theme'; -import { getIonTheme } from '../../global/ionic-global'; +import { config } from '../../global/config'; import type { Color } from '../../interface'; +import type { IonTextHue } from './text.interfaces'; + /** * @virtualProp {"ios" | "md"} mode - The mode determines the platform behaviors of the component. - * @virtualProp {"ios" | "md" | "ionic"} theme - The theme determines the visual appearance of the component. */ @Component({ tag: 'ion-text', @@ -22,12 +23,30 @@ export class Text implements ComponentInterface { */ @Prop({ reflect: true }) color?: Color; + /** + * Set to `"bold"` for a text with vibrant, bold colors or to `"subtle"` for + * a text with muted, subtle colors. + * + * Defaults to `"bold"` if both the hue property and theme config are unset. + */ + @Prop() hue?: IonTextHue; + + /** + * Gets the text hue. Uses the `hue` property if set, otherwise + * checks the theme config and falls back to 'bold' if neither is provided. + */ + get hueValue(): IonTextHue { + const hueConfig = config.getObjectValue('IonText.hue', 'bold') as IonTextHue; + + return this.hue || hueConfig; + } + render() { - const theme = getIonTheme(this); + const { hueValue } = this; return ( diff --git a/core/src/themes/ionic/default.tokens.ts b/core/src/themes/ionic/default.tokens.ts index 04aa66835c7..948c2b92882 100644 --- a/core/src/themes/ionic/default.tokens.ts +++ b/core/src/themes/ionic/default.tokens.ts @@ -41,6 +41,10 @@ export const defaultTheme: DefaultTheme = { IonSpinner: { size: 'xsmall', }, + + IonText: { + hue: 'bold', + }, }, }, @@ -830,5 +834,25 @@ export const defaultTheme: DefaultTheme = { }, }, }, + + IonText: { + hue: { + bold: { + semantic: { + default: { + color: currentColor('foreground'), + }, + }, + }, + + subtle: { + semantic: { + default: { + color: currentColor('foreground', { subtle: true }), + }, + }, + }, + }, + }, }, }; diff --git a/core/src/themes/ios/default.tokens.ts b/core/src/themes/ios/default.tokens.ts index 26d8569a84d..a3883b0654c 100644 --- a/core/src/themes/ios/default.tokens.ts +++ b/core/src/themes/ios/default.tokens.ts @@ -43,6 +43,10 @@ export const defaultTheme: DefaultTheme = { IonSpinner: { size: 'medium', }, + + IonText: { + hue: 'bold', + }, }, }, @@ -858,5 +862,25 @@ export const defaultTheme: DefaultTheme = { }, }, }, + + IonText: { + hue: { + bold: { + semantic: { + default: { + color: currentColor('foreground'), + }, + }, + }, + + subtle: { + semantic: { + default: { + color: currentColor('foreground', { subtle: true }), + }, + }, + }, + }, + }, }, }; diff --git a/core/src/themes/md/default.tokens.ts b/core/src/themes/md/default.tokens.ts index 0fa301c8b2a..0b185db44da 100644 --- a/core/src/themes/md/default.tokens.ts +++ b/core/src/themes/md/default.tokens.ts @@ -46,6 +46,10 @@ export const defaultTheme: DefaultTheme = { IonSpinner: { size: 'medium', }, + + IonText: { + hue: 'bold', + }, }, }, @@ -983,5 +987,25 @@ export const defaultTheme: DefaultTheme = { }, }, }, + + IonText: { + hue: { + bold: { + semantic: { + default: { + color: currentColor('foreground'), + }, + }, + }, + + subtle: { + semantic: { + default: { + color: currentColor('foreground', { subtle: true }), + }, + }, + }, + }, + }, }, }; diff --git a/core/src/themes/themes.interfaces.ts b/core/src/themes/themes.interfaces.ts index 0a87addcbff..5804badc75d 100644 --- a/core/src/themes/themes.interfaces.ts +++ b/core/src/themes/themes.interfaces.ts @@ -4,6 +4,7 @@ import type { IonContentRecipe } from '../components/content/content.interfaces' import type { IonItemDividerRecipe } from '../components/item-divider/item-divider.interfaces'; import type { IonProgressBarConfig, IonProgressBarRecipe } from '../components/progress-bar/progress-bar.interfaces'; import type { IonSpinnerConfig, IonSpinnerRecipe } from '../components/spinner/spinner.interfaces'; +import type { IonTextConfig, IonTextRecipe } from '../components/text/text.interfaces'; import type { IonicConfig as IonicGlobalConfig } from '../utils/config'; // Platform-specific theme @@ -249,6 +250,7 @@ export type IonicConfig = IonicGlobalConfig & { IonChip?: IonChipConfig; IonProgressBar?: IonProgressBarConfig; IonSpinner?: IonSpinnerConfig; + IonText?: IonTextConfig; }; }; @@ -292,6 +294,7 @@ type Components = { IonItemDivider?: IonItemDividerRecipe; IonProgressBar?: IonProgressBarRecipe; IonSpinner?: IonSpinnerRecipe; + IonText?: IonTextRecipe; IonCard?: any; IonItem?: any; diff --git a/packages/angular/src/directives/proxies.ts b/packages/angular/src/directives/proxies.ts index 1dd5491da67..880c28a1d30 100644 --- a/packages/angular/src/directives/proxies.ts +++ b/packages/angular/src/directives/proxies.ts @@ -2414,14 +2414,14 @@ export declare interface IonTabButton extends Components.IonTabButton {} @ProxyCmp({ - inputs: ['color', 'mode', 'theme'] + inputs: ['color', 'hue', 'mode'] }) @Component({ selector: 'ion-text', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['color', 'mode', 'theme'], + inputs: ['color', 'hue', 'mode'], }) export class IonText { protected el: HTMLIonTextElement; diff --git a/packages/angular/standalone/src/directives/proxies.ts b/packages/angular/standalone/src/directives/proxies.ts index d11f99cd10c..8f8f849b868 100644 --- a/packages/angular/standalone/src/directives/proxies.ts +++ b/packages/angular/standalone/src/directives/proxies.ts @@ -2161,14 +2161,14 @@ export declare interface IonTabButton extends Components.IonTabButton {} @ProxyCmp({ defineCustomElementFn: defineIonText, - inputs: ['color', 'mode', 'theme'] + inputs: ['color', 'hue', 'mode'] }) @Component({ selector: 'ion-text', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['color', 'mode', 'theme'], + inputs: ['color', 'hue', 'mode'], standalone: true }) export class IonText { diff --git a/packages/vue/src/proxies.ts b/packages/vue/src/proxies.ts index b2382020f56..64380f598d8 100644 --- a/packages/vue/src/proxies.ts +++ b/packages/vue/src/proxies.ts @@ -1042,7 +1042,8 @@ export const IonTab: StencilVueComponent = /*@__PURE__*/ defineConta export const IonText: StencilVueComponent = /*@__PURE__*/ defineContainer('ion-text', defineIonText, [ - 'color' + 'color', + 'hue' ]); From 006fdc7b0ccd3492678b844b461a2865c4940fe4 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 26 May 2026 14:59:01 -0700 Subject: [PATCH 2/3] chore(text): run lint --- core/src/components/text/text.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/components/text/text.scss b/core/src/components/text/text.scss index 5f77690076c..f1f0be8fbd7 100644 --- a/core/src/components/text/text.scss +++ b/core/src/components/text/text.scss @@ -6,7 +6,7 @@ * @prop --ion-text-hue-bold-semantic-default-color: Color of the `bold` hue when a semantic color is applied * @prop --ion-text-hue-subtle-semantic-default-color: Color of the `subtle` hue when a semantic color is applied */ - + color: inherit; } From 5ad94aae197edfbaf6c1a919bcdd6fb8e262c516 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 26 May 2026 15:07:34 -0700 Subject: [PATCH 3/3] test(text): update snapshots --- .../text-color-md-ltr-Mobile-Chrome-linux.png | Bin 4390 -> 4264 bytes ...text-color-md-ltr-Mobile-Firefox-linux.png | Bin 5081 -> 5130 bytes .../text-color-md-ltr-Mobile-Safari-linux.png | Bin 5312 -> 5422 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/core/src/components/text/test/basic/text.e2e.ts-snapshots/text-color-md-ltr-Mobile-Chrome-linux.png b/core/src/components/text/test/basic/text.e2e.ts-snapshots/text-color-md-ltr-Mobile-Chrome-linux.png index f5fe40421a6b5ee6e916fa92162d6e63a7f6cac3..9ae6f0920aa5af17aa4e572d47bcc9b4237464ce 100644 GIT binary patch literal 4264 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 KMNUMnLSTX+U|!b% literal 4390 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 diff --git a/core/src/components/text/test/basic/text.e2e.ts-snapshots/text-color-md-ltr-Mobile-Safari-linux.png b/core/src/components/text/test/basic/text.e2e.ts-snapshots/text-color-md-ltr-Mobile-Safari-linux.png index 484124fc7c1bf20c04a4f9f79cf7e66ac2a20b39..f73830aa2b5d77e097e75e543d15288319c162d0 100644 GIT binary patch delta 5406 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 Bbh-cl