From e9cc2a927cff7c0cb2f19e343bf278143466ec9b Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Mon, 23 Jun 2025 10:08:43 -0400 Subject: [PATCH 1/4] docs(reorder): add new ionReorderStart, ionReorderMove, ionReorderEnd event playgrounds (#4149) Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- docs/api/reorder-group.md | 54 +++++++- docs/api/reorder.md | 25 +++- .../index.js | 12 +- static/demos/api/reorder/index.html | 2 +- .../basic/angular/example_component_html.md | 2 +- .../basic/angular/example_component_ts.md | 6 +- static/usage/v8/reorder/basic/demo.html | 6 +- static/usage/v8/reorder/basic/javascript.md | 4 +- static/usage/v8/reorder/basic/react.md | 8 +- static/usage/v8/reorder/basic/vue.md | 10 +- .../angular/example_component_html.md | 2 +- .../angular/example_component_ts.md | 6 +- static/usage/v8/reorder/custom-icon/demo.html | 6 +- .../v8/reorder/custom-icon/javascript.md | 4 +- .../custom-icon/javascript/index_html.md | 4 +- static/usage/v8/reorder/custom-icon/react.md | 8 +- static/usage/v8/reorder/custom-icon/vue.md | 10 +- .../angular/example_component_html.md | 2 +- .../angular/example_component_ts.md | 6 +- .../v8/reorder/custom-scroll-target/demo.html | 13 +- .../custom-scroll-target/javascript.md | 4 +- .../custom-scroll-target/react/main_tsx.md | 8 +- .../v8/reorder/custom-scroll-target/vue.md | 18 ++- .../angular/example_component_html.md | 19 +++ .../angular/example_component_ts.md | 79 ++++++++++++ .../v8/reorder/reorder-move-event/demo.html | 116 ++++++++++++++++++ .../v8/reorder/reorder-move-event/index.md | 26 ++++ .../reorder/reorder-move-event/javascript.md | 89 ++++++++++++++ .../v8/reorder/reorder-move-event/react.md | 92 ++++++++++++++ .../v8/reorder/reorder-move-event/vue.md | 81 ++++++++++++ .../angular/example_component_html.md | 19 +++ .../angular/example_component_ts.md | 62 ++++++++++ .../reorder-start-end-events/demo.html | 82 +++++++++++++ .../reorder/reorder-start-end-events/index.md | 33 +++++ .../javascript/index_html.md | 57 +++++++++ .../javascript/index_ts.md | 47 +++++++ .../reorder/reorder-start-end-events/react.md | 67 ++++++++++ .../reorder/reorder-start-end-events/vue.md | 59 +++++++++ .../angular/example_component_html.md | 2 +- .../angular/example_component_ts.md | 6 +- .../v8/reorder/toggling-disabled/demo.html | 6 +- .../reorder/toggling-disabled/javascript.md | 4 +- .../v8/reorder/toggling-disabled/react.md | 8 +- .../usage/v8/reorder/toggling-disabled/vue.md | 18 ++- .../angular/example_component_html.md | 2 +- .../angular/example_component_ts.md | 4 +- .../usage/v8/reorder/updating-data/demo.html | 4 +- .../v8/reorder/updating-data/javascript.md | 2 +- .../usage/v8/reorder/updating-data/react.md | 6 +- static/usage/v8/reorder/updating-data/vue.md | 8 +- .../wrapper/angular/example_component_html.md | 2 +- .../wrapper/angular/example_component_ts.md | 6 +- static/usage/v8/reorder/wrapper/demo.html | 6 +- static/usage/v8/reorder/wrapper/javascript.md | 4 +- static/usage/v8/reorder/wrapper/react.md | 8 +- static/usage/v8/reorder/wrapper/vue.md | 10 +- 56 files changed, 1137 insertions(+), 117 deletions(-) create mode 100644 static/usage/v8/reorder/reorder-move-event/angular/example_component_html.md create mode 100644 static/usage/v8/reorder/reorder-move-event/angular/example_component_ts.md create mode 100644 static/usage/v8/reorder/reorder-move-event/demo.html create mode 100644 static/usage/v8/reorder/reorder-move-event/index.md create mode 100644 static/usage/v8/reorder/reorder-move-event/javascript.md create mode 100644 static/usage/v8/reorder/reorder-move-event/react.md create mode 100644 static/usage/v8/reorder/reorder-move-event/vue.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/angular/example_component_html.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/angular/example_component_ts.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/demo.html create mode 100644 static/usage/v8/reorder/reorder-start-end-events/index.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/javascript/index_html.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/javascript/index_ts.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/react.md create mode 100644 static/usage/v8/reorder/reorder-start-end-events/vue.md diff --git a/docs/api/reorder-group.md b/docs/api/reorder-group.md index c3c6c4e9508..2d1d7f73fd3 100644 --- a/docs/api/reorder-group.md +++ b/docs/api/reorder-group.md @@ -16,27 +16,71 @@ import Slots from '@ionic-internal/component-api/v8/reorder-group/slots.md'; import EncapsulationPill from '@components/page/api/EncapsulationPill'; -The reorder group is a container for items using the [reorder](./reorder) component. When the user drags an item and drops it in a new position, the `ionItemReorder` event is dispatched. A handler for this event should be implemented that calls the `complete` method. +The reorder group is a container for items using the [reorder](./reorder) component. When the user drags an item and drops it, the `ionReorderEnd` event is dispatched. A handler for this event should be implemented that calls the `complete` method. -The `detail` property of the `ionItemReorder` event includes all of the relevant information about the reorder operation, including the `from` and `to` indexes. In the context of reordering, an item moves `from` an index `to` a new index. For example usage of the reorder group, see the [reorder](./reorder) documentation. +The `detail` property of the `ionReorderEnd` event includes all of the relevant information about the reorder operation, including the `from` and `to` indexes. In the context of reordering, an item moves `from` an index `to` an index. For example usage of the reorder group, see the [reorder](./reorder) documentation. ## Interfaces -### ItemReorderEventDetail +### ReorderMoveEventDetail ```typescript -interface ItemReorderEventDetail { +interface ReorderMoveEventDetail { + from: number; + to: number; +} +``` + +### ReorderEndEventDetail + +```typescript +interface ReorderEndEventDetail { from: number; to: number; complete: (data?: boolean | any[]) => any; } ``` -### ItemReorderCustomEvent +### ReorderMoveCustomEvent + +While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component. + +```typescript +interface ReorderMoveCustomEvent extends CustomEvent { + detail: ReorderMoveEventDetail; + target: HTMLIonReorderGroupElement; +} + +``` + +### ReorderEndCustomEvent While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component. +```typescript +interface ReorderEndCustomEvent extends CustomEvent { + detail: ReorderEndEventDetail; + target: HTMLIonReorderGroupElement; +} +``` + +### ItemReorderEventDetail (deprecated) + +**_Deprecated_** — Use the `ionReorderEnd` event with `ReorderEndEventDetail` instead. + +```typescript +interface ItemReorderEventDetail { + from: number; + to: number; + complete: (data?: boolean | any[]) => any; +} +``` + +### ItemReorderCustomEvent (deprecated) + +**_Deprecated_** — Use the `ionReorderEnd` event with `ReorderEndCustomEvent` instead. + ```typescript interface ItemReorderCustomEvent extends CustomEvent { detail: ItemReorderEventDetail; diff --git a/docs/api/reorder.md b/docs/api/reorder.md index ad07a4290ea..5f771c9badf 100644 --- a/docs/api/reorder.md +++ b/docs/api/reorder.md @@ -20,7 +20,7 @@ import EncapsulationPill from '@components/page/api/EncapsulationPill'; Reorder is a component that allows an item to be dragged to change its order within a group of items. It must be used within a [reorder group](./reorder-group) to provide a visual drag and drop interface. -The reorder is the anchor used to drag and drop the items. Once the reorder is complete, the `ionItemReorder` event will be dispatched from the reorder group and the `complete` method needs to be called. +The reorder is the anchor used to drag and drop the items. Once the reorder is complete, the `ionReorderEnd` event will be dispatched from the reorder group and the `complete` method needs to be called. ## Basic Usage @@ -73,6 +73,29 @@ import UpdatingData from '@site/static/usage/v8/reorder/updating-data/index.md'; +## Event Handling + +### Using `ionReorderStart` and `ionReorderEnd` + +The `ionReorderStart` event is emitted when the user begins a reorder gesture. This event fires when the user taps and holds an item, before any movement occurs. This is useful for preparing the UI for the reorder operation, such as hiding certain elements or updating the visual state of items. For example, icons in list items can be hidden while they are being dragged and shown again when the reorder is complete. + +The `ionReorderEnd` event is emitted when the user completes the reorder gesture. This occurs when the user releases the item they are dragging, for example by lifting their finger on a touch screen or releasing the mouse button. The event includes the `from` and `to` indices of the item, as well as the `complete` method that should be called to finalize the reorder operation. The `from` index will always be the position of the item when the gesture started, while the `to` index will be its final position. This event will fire even if no items have changed position, in which case the `from` and `to` indices will be the same. + +import ReorderStartEndEvents from '@site/static/usage/v8/reorder/reorder-start-end-events/index.md'; + + + +### Using `ionReorderMove` + +The `ionReorderMove` event is emitted continuously during the reorder gesture as the user drags an item. The event includes the `from` and `to` indices of the item. Unlike `ionReorderEnd`, the `from` index in this event represents the last known position of the item (which updates as the item moves), while the `to` index represents its current position. If the item has not changed position since the last event, the `from` and `to` indices will be the same. This event is useful for tracking position changes during the drag operation. For example, the ranking or numbering of items can be updated in real-time as they are being dragged to maintain a logical ascending order. + +:::warning +Do not call the `complete` method during the `ionReorderMove` event as it can break the gesture. +::: + +import ReorderMoveEvent from '@site/static/usage/v8/reorder/reorder-move-event/index.md'; + + ## Usage with Virtual Scroll diff --git a/plugins/docusaurus-plugin-ionic-component-api/index.js b/plugins/docusaurus-plugin-ionic-component-api/index.js index d3b3d2d7255..90e59ee09f3 100644 --- a/plugins/docusaurus-plugin-ionic-component-api/index.js +++ b/plugins/docusaurus-plugin-ionic-component-api/index.js @@ -145,7 +145,7 @@ ${properties .map((prop) => { const isDeprecated = prop.deprecation !== undefined; - const docs = isDeprecated ? `${prop.docs}\n_Deprecated_ ${prop.deprecation}` : prop.docs; + const docs = isDeprecated ? `${prop.docs}\n\n**_Deprecated_** — ${prop.deprecation}` : prop.docs; return ` ### ${prop.name} ${isDeprecated ? '(deprecated)' : ''} @@ -170,7 +170,15 @@ function renderEvents({ events }) { return ` | Name | Description | Bubbles | | --- | --- | --- | -${events.map((event) => `| \`${event.event}\` | ${formatMultiline(event.docs)} | \`${event.bubbles}\` |`).join('\n')}`; +${events + .map((event) => { + const isDeprecated = event.deprecation !== undefined; + const docs = isDeprecated ? `${event.docs}\n\n**_Deprecated_** — ${event.deprecation}` : event.docs; + return `| \`${event.event}\` ${isDeprecated ? '**(deprecated)**' : ''} | ${formatMultiline(docs)} | \`${ + event.bubbles + }\` |`; + }) + .join('\n')}`; } /** diff --git a/static/demos/api/reorder/index.html b/static/demos/api/reorder/index.html index 695a50c2701..3903da1eb7d 100644 --- a/static/demos/api/reorder/index.html +++ b/static/demos/api/reorder/index.html @@ -99,7 +99,7 @@ function toggleReorder() { const reorderGroup = document.getElementById('reorder'); reorderGroup.disabled = !reorderGroup.disabled; - reorderGroup.addEventListener('ionItemReorder', ({ detail }) => { + reorderGroup.addEventListener('ionReorderEnd', ({ detail }) => { detail.complete(true); }); } diff --git a/static/usage/v8/reorder/basic/angular/example_component_html.md b/static/usage/v8/reorder/basic/angular/example_component_html.md index 60795eaa3ff..8b1294bd101 100644 --- a/static/usage/v8/reorder/basic/angular/example_component_html.md +++ b/static/usage/v8/reorder/basic/angular/example_component_html.md @@ -2,7 +2,7 @@ - + Item 1 diff --git a/static/usage/v8/reorder/basic/angular/example_component_ts.md b/static/usage/v8/reorder/basic/angular/example_component_ts.md index 541fd9c6df3..5553891178a 100644 --- a/static/usage/v8/reorder/basic/angular/example_component_ts.md +++ b/static/usage/v8/reorder/basic/angular/example_component_ts.md @@ -1,12 +1,12 @@ ```ts import { Component } from '@angular/core'; import { - ItemReorderEventDetail, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, + ReorderEndCustomEvent, } from '@ionic/angular/standalone'; @Component({ @@ -16,14 +16,14 @@ import { imports: [IonItem, IonLabel, IonList, IonReorder, IonReorderGroup], }) export class ExampleComponent { - handleReorder(event: CustomEvent) { + handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } } diff --git a/static/usage/v8/reorder/basic/demo.html b/static/usage/v8/reorder/basic/demo.html index f9afb7d750a..7b8abca0b96 100644 --- a/static/usage/v8/reorder/basic/demo.html +++ b/static/usage/v8/reorder/basic/demo.html @@ -11,7 +11,7 @@ @@ -56,14 +56,14 @@ diff --git a/static/usage/v8/reorder/basic/javascript.md b/static/usage/v8/reorder/basic/javascript.md index fe805d10fc6..4b07e8ad210 100644 --- a/static/usage/v8/reorder/basic/javascript.md +++ b/static/usage/v8/reorder/basic/javascript.md @@ -32,14 +32,14 @@ diff --git a/static/usage/v8/reorder/basic/react.md b/static/usage/v8/reorder/basic/react.md index abe3b187294..397ebc395d7 100644 --- a/static/usage/v8/reorder/basic/react.md +++ b/static/usage/v8/reorder/basic/react.md @@ -1,23 +1,23 @@ ```tsx import React from 'react'; -import { IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ItemReorderEventDetail } from '@ionic/react'; +import { IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ReorderEndCustomEvent } from '@ionic/react'; function Example() { - function handleReorder(event: CustomEvent) { + function handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } return ( {/* The reorder gesture is disabled by default, enable it to drag and drop items */} - + Item 1 diff --git a/static/usage/v8/reorder/basic/vue.md b/static/usage/v8/reorder/basic/vue.md index 0ac2374089f..285a1c347be 100644 --- a/static/usage/v8/reorder/basic/vue.md +++ b/static/usage/v8/reorder/basic/vue.md @@ -2,7 +2,7 @@ diff --git a/static/usage/v8/reorder/custom-icon/angular/example_component_html.md b/static/usage/v8/reorder/custom-icon/angular/example_component_html.md index 6d1fb8960bd..cc6692c862d 100644 --- a/static/usage/v8/reorder/custom-icon/angular/example_component_html.md +++ b/static/usage/v8/reorder/custom-icon/angular/example_component_html.md @@ -2,7 +2,7 @@ - + Item 1 diff --git a/static/usage/v8/reorder/custom-icon/angular/example_component_ts.md b/static/usage/v8/reorder/custom-icon/angular/example_component_ts.md index e9bdafd6df8..4d0472c0bd3 100644 --- a/static/usage/v8/reorder/custom-icon/angular/example_component_ts.md +++ b/static/usage/v8/reorder/custom-icon/angular/example_component_ts.md @@ -1,13 +1,13 @@ ```ts import { Component } from '@angular/core'; import { - ItemReorderEventDetail, IonIcon, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, + ReorderEndCustomEvent, } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; @@ -29,14 +29,14 @@ export class ExampleComponent { addIcons({ pizza }); } - handleReorder(event: CustomEvent) { + handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } } diff --git a/static/usage/v8/reorder/custom-icon/demo.html b/static/usage/v8/reorder/custom-icon/demo.html index ab2c55b9423..b089815bd07 100644 --- a/static/usage/v8/reorder/custom-icon/demo.html +++ b/static/usage/v8/reorder/custom-icon/demo.html @@ -11,7 +11,7 @@ @@ -66,14 +66,14 @@ diff --git a/static/usage/v8/reorder/custom-icon/javascript.md b/static/usage/v8/reorder/custom-icon/javascript.md index d7aa87d8f64..8535da7544a 100644 --- a/static/usage/v8/reorder/custom-icon/javascript.md +++ b/static/usage/v8/reorder/custom-icon/javascript.md @@ -42,14 +42,14 @@ diff --git a/static/usage/v8/reorder/custom-icon/javascript/index_html.md b/static/usage/v8/reorder/custom-icon/javascript/index_html.md index d7aa87d8f64..8535da7544a 100644 --- a/static/usage/v8/reorder/custom-icon/javascript/index_html.md +++ b/static/usage/v8/reorder/custom-icon/javascript/index_html.md @@ -42,14 +42,14 @@ diff --git a/static/usage/v8/reorder/custom-icon/react.md b/static/usage/v8/reorder/custom-icon/react.md index 9103db6029d..f5fe620035b 100644 --- a/static/usage/v8/reorder/custom-icon/react.md +++ b/static/usage/v8/reorder/custom-icon/react.md @@ -1,24 +1,24 @@ ```tsx import React from 'react'; -import { IonIcon, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ItemReorderEventDetail } from '@ionic/react'; +import { IonIcon, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ReorderEndCustomEvent } from '@ionic/react'; import { pizza } from 'ionicons/icons'; function Example() { - function handleReorder(event: CustomEvent) { + function handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } return ( {/* The reorder gesture is disabled by default, enable it to drag and drop items */} - + Item 1 diff --git a/static/usage/v8/reorder/custom-icon/vue.md b/static/usage/v8/reorder/custom-icon/vue.md index 87d77e33048..eec6b5222a9 100644 --- a/static/usage/v8/reorder/custom-icon/vue.md +++ b/static/usage/v8/reorder/custom-icon/vue.md @@ -2,7 +2,7 @@ diff --git a/static/usage/v8/reorder/custom-scroll-target/angular/example_component_html.md b/static/usage/v8/reorder/custom-scroll-target/angular/example_component_html.md index 2296a5506c4..73fc3967021 100644 --- a/static/usage/v8/reorder/custom-scroll-target/angular/example_component_html.md +++ b/static/usage/v8/reorder/custom-scroll-target/angular/example_component_html.md @@ -4,7 +4,7 @@ - + Item 1 diff --git a/static/usage/v8/reorder/custom-scroll-target/angular/example_component_ts.md b/static/usage/v8/reorder/custom-scroll-target/angular/example_component_ts.md index bdd83c0417f..84dedb755b1 100644 --- a/static/usage/v8/reorder/custom-scroll-target/angular/example_component_ts.md +++ b/static/usage/v8/reorder/custom-scroll-target/angular/example_component_ts.md @@ -1,7 +1,7 @@ ```ts import { Component } from '@angular/core'; import { - ItemReorderEventDetail, + ReorderEndCustomEvent, IonContent, IonItem, IonLabel, @@ -17,14 +17,14 @@ import { imports: [IonContent, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup], }) export class ExampleComponent { - handleReorder(event: CustomEvent) { + handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } } diff --git a/static/usage/v8/reorder/custom-scroll-target/demo.html b/static/usage/v8/reorder/custom-scroll-target/demo.html index 760fb525d79..fb66a69e0ce 100644 --- a/static/usage/v8/reorder/custom-scroll-target/demo.html +++ b/static/usage/v8/reorder/custom-scroll-target/demo.html @@ -10,16 +10,17 @@ + + + + + +
+ + + + +
+
+
+ + + + diff --git a/static/usage/v8/reorder/reorder-move-event/index.md b/static/usage/v8/reorder/reorder-move-event/index.md new file mode 100644 index 00000000000..be938ff393c --- /dev/null +++ b/static/usage/v8/reorder/reorder-move-event/index.md @@ -0,0 +1,26 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; +import react from './react.md'; +import vue from './vue.md'; + +import angular_example_component_ts from './angular/example_component_ts.md'; +import angular_example_component_html from './angular/example_component_html.md'; + + diff --git a/static/usage/v8/reorder/reorder-move-event/javascript.md b/static/usage/v8/reorder/reorder-move-event/javascript.md new file mode 100644 index 00000000000..e559409668b --- /dev/null +++ b/static/usage/v8/reorder/reorder-move-event/javascript.md @@ -0,0 +1,89 @@ +```html + + + + + + +``` diff --git a/static/usage/v8/reorder/reorder-move-event/react.md b/static/usage/v8/reorder/reorder-move-event/react.md new file mode 100644 index 00000000000..39a0680728d --- /dev/null +++ b/static/usage/v8/reorder/reorder-move-event/react.md @@ -0,0 +1,92 @@ +```tsx +import React, { useState } from 'react'; +import { + IonItem, + IonLabel, + IonList, + IonReorder, + IonReorderGroup, + ReorderEndCustomEvent, + ReorderMoveCustomEvent, +} from '@ionic/react'; + +function Example() { + const [items, setItems] = useState([ + 'Buy groceries', + 'Call the bank', + 'Finish project report', + 'Book flight tickets', + 'Read a book', + ]); + + function handleReorderMove(event: ReorderMoveCustomEvent) { + const from = event.detail.from; + const to = event.detail.to; + + if (from !== to) { + console.log('Dragged from index', from, 'to', to); + } + + // Get all items and sort by their current id (item-1, item-2, ...) + const itemElements = Array.from(document.querySelectorAll('ion-item')).sort((a, b) => { + const aNum = parseInt(a.id.replace('item-', ''), 10); + const bNum = parseInt(b.id.replace('item-', ''), 10); + return aNum - bNum; + }); + + // Dragging down: shift up items between from+1 and to, set dragged to to+1 + if (from < to) { + for (let i = from; i <= to; i++) { + const item = itemElements[i]; + const itemNum = item.querySelector('b'); + if (i === from) { + // Dragged item + itemNum!.textContent = String(to + 1); + item.id = `item-${to + 1}`; + } else { + // Items shift up + itemNum!.textContent = String(i); + item.id = `item-${i}`; + } + } + // Dragging up: shift down items between to and from-1, set dragged to to+1 + } else if (from > to) { + for (let i = to; i <= from; i++) { + const item = itemElements[i]; + const itemNum = item.querySelector('b'); + if (i === from) { + // Dragged item + itemNum!.textContent = String(to + 1); + item.id = `item-${to + 1}`; + } else { + // Items shift down + itemNum!.textContent = String(i + 2); + item.id = `item-${i + 2}`; + } + } + } + } + + function handleReorderEnd(event: ReorderEndCustomEvent) { + // Finish the reorder and update the items data + setItems(event.detail.complete(items)); + } + + return ( + + {/* The reorder gesture is disabled by default, enable it to drag and drop items */} + + {items.map((item, index) => ( + + {index + 1} + {item} + + + ))} + + + ); +} + +export default Example; +``` diff --git a/static/usage/v8/reorder/reorder-move-event/vue.md b/static/usage/v8/reorder/reorder-move-event/vue.md new file mode 100644 index 00000000000..cd3518e5aac --- /dev/null +++ b/static/usage/v8/reorder/reorder-move-event/vue.md @@ -0,0 +1,81 @@ +```html + + + +``` diff --git a/static/usage/v8/reorder/reorder-start-end-events/angular/example_component_html.md b/static/usage/v8/reorder/reorder-start-end-events/angular/example_component_html.md new file mode 100644 index 00000000000..7b9be3a150c --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/angular/example_component_html.md @@ -0,0 +1,19 @@ +```html + + + + + @for (item of items; track item; let i = $index) { + + {{ item.label }} + + + + } + + +``` diff --git a/static/usage/v8/reorder/reorder-start-end-events/angular/example_component_ts.md b/static/usage/v8/reorder/reorder-start-end-events/angular/example_component_ts.md new file mode 100644 index 00000000000..ec4ccbdb946 --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/angular/example_component_ts.md @@ -0,0 +1,62 @@ +```ts +import { Component, ViewChildren, QueryList, ElementRef } from '@angular/core'; +import { + ReorderEndCustomEvent, + IonItem, + IonLabel, + IonList, + IonReorder, + IonReorderGroup, + IonIcon, +} from '@ionic/angular/standalone'; +import { addIcons } from 'ionicons'; +import { caretDown, ellipse, warning } from 'ionicons/icons'; + +@Component({ + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'], + imports: [IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, IonIcon], +}) +export class ExampleComponent { + items = [ + { label: 'Buy groceries', icon: 'warning', color: 'warning' }, + { label: 'Call the bank', icon: 'warning', color: 'warning' }, + { label: 'Finish project report', icon: 'ellipse', color: 'light' }, + { label: 'Book flight tickets', icon: 'ellipse', color: 'light' }, + { label: 'Read a book', icon: 'caret-down', color: 'secondary' }, + ]; + + @ViewChildren('icon', { read: ElementRef }) icons!: QueryList>; + + constructor() { + /** + * Any icons you want to use in your application + * can be registered in app.component.ts and then + * referenced by name anywhere in your application. + */ + addIcons({ caretDown, ellipse, warning }); + } + + handleReorderStart() { + console.log('Reorder started'); + + // Hide the icons when the reorder starts + this.icons.forEach((icon) => { + icon.nativeElement.style.opacity = '0'; + }); + } + + handleReorderEnd(event: ReorderEndCustomEvent) { + console.log('Dragged from index', event.detail.from, 'to', event.detail.to); + + // Show the icons again + this.icons.forEach((icon) => { + icon.nativeElement.style.opacity = '1'; + }); + + // Finish the reorder and update the items data + this.items = event.detail.complete(this.items); + } +} +``` diff --git a/static/usage/v8/reorder/reorder-start-end-events/demo.html b/static/usage/v8/reorder/reorder-start-end-events/demo.html new file mode 100644 index 00000000000..72e214b83fe --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/demo.html @@ -0,0 +1,82 @@ + + + + + + Reorder + + + + + + + + + + + +
+ + + + + Buy groceries + + + + + Call the bank + + + + + Finish project report + + + + + Book flight tickets + + + + + Read a book + + + + + +
+
+
+ + + + diff --git a/static/usage/v8/reorder/reorder-start-end-events/index.md b/static/usage/v8/reorder/reorder-start-end-events/index.md new file mode 100644 index 00000000000..5e7d48127d1 --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/index.md @@ -0,0 +1,33 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript_index_html from './javascript/index_html.md'; +import javascript_index_ts from './javascript/index_ts.md'; + +import react from './react.md'; +import vue from './vue.md'; + +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_ts from './angular/example_component_ts.md'; + + diff --git a/static/usage/v8/reorder/reorder-start-end-events/javascript/index_html.md b/static/usage/v8/reorder/reorder-start-end-events/javascript/index_html.md new file mode 100644 index 00000000000..a98397de9e1 --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/javascript/index_html.md @@ -0,0 +1,57 @@ +```html + + + + + Buy groceries + + + + + Call the bank + + + + + Finish project report + + + + + Book flight tickets + + + + + Read a book + + + + + + + +``` diff --git a/static/usage/v8/reorder/reorder-start-end-events/javascript/index_ts.md b/static/usage/v8/reorder/reorder-start-end-events/javascript/index_ts.md new file mode 100644 index 00000000000..c9e03106886 --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/javascript/index_ts.md @@ -0,0 +1,47 @@ +```ts +import { defineCustomElements } from '@ionic/core/loader'; + +import { addIcons } from 'ionicons'; +import { caretDown, ellipse, warning } from 'ionicons/icons'; + +/* Core CSS required for Ionic components to work properly */ +import '@ionic/core/css/core.css'; + +/* Basic CSS for apps built with Ionic */ +import '@ionic/core/css/normalize.css'; +import '@ionic/core/css/structure.css'; +import '@ionic/core/css/typography.css'; + +/* Optional CSS utils that can be commented out */ +import '@ionic/core/css/padding.css'; +import '@ionic/core/css/float-elements.css'; +import '@ionic/core/css/text-alignment.css'; +import '@ionic/core/css/text-transformation.css'; +import '@ionic/core/css/flex-utils.css'; +import '@ionic/core/css/display.css'; + +/** + * Ionic Dark Palette + * ----------------------------------------------------- + * For more information, please see: + * https://ionicframework.com/docs/theming/dark-mode + */ + +// import '@ionic/core/css/palettes/dark.always.css'; +// import '@ionic/core/css/palettes/dark.class.css'; +import '@ionic/core/css/palettes/dark.system.css'; + +/* Theme variables */ +import './theme/variables.css'; + +/** + * On Ionicons 7.2+ these icons get mapped + * to "caret-down", "ellipse", "warning" keys. + * Alternatively, developers can do: + * addIcons({ 'caret-down': caretDown, + * "ellipse": ellipse, "warning": warning }); + */ +addIcons({ caretDown, ellipse, warning }); + +defineCustomElements(); +``` diff --git a/static/usage/v8/reorder/reorder-start-end-events/react.md b/static/usage/v8/reorder/reorder-start-end-events/react.md new file mode 100644 index 00000000000..c70462d5b32 --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/react.md @@ -0,0 +1,67 @@ +```tsx +import React, { useRef, useState } from 'react'; +import { IonIcon, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ReorderEndCustomEvent } from '@ionic/react'; +import { caretDown, ellipse, warning } from 'ionicons/icons'; + +interface TodoItem { + label: string; + icon: string; + color: string; +} + +function Example() { + const [items, setItems] = useState([ + { label: 'Buy groceries', icon: warning, color: 'warning' }, + { label: 'Call the bank', icon: warning, color: 'warning' }, + { label: 'Finish project report', icon: ellipse, color: 'light' }, + { label: 'Book flight tickets', icon: ellipse, color: 'light' }, + { label: 'Read a book', icon: caretDown, color: 'secondary' }, + ]); + const iconsRef = useRef<(HTMLIonIconElement | null)[]>([]); + + function handleReorderStart() { + console.log('Reorder started'); + + // Hide the icons when the reorder starts + iconsRef.current.forEach((icon) => { + if (icon) icon.style.opacity = '0'; + }); + } + + function handleReorderEnd(event: ReorderEndCustomEvent) { + console.log('Dragged from index', event.detail.from, 'to', event.detail.to); + + // Show the icons again + iconsRef.current.forEach((icon) => { + if (icon) icon.style.opacity = '1'; + }); + + // Finish the reorder and update the items data + setItems(event.detail.complete(items)); + } + + return ( + + {/* The reorder gesture is disabled by default, enable it to drag and drop items */} + + {items.map((item: TodoItem, i: number) => ( + + {item.label} + { + iconsRef.current[i] = el; + }} + /> + + + ))} + + + ); +} + +export default Example; +``` diff --git a/static/usage/v8/reorder/reorder-start-end-events/vue.md b/static/usage/v8/reorder/reorder-start-end-events/vue.md new file mode 100644 index 00000000000..0648e09bddc --- /dev/null +++ b/static/usage/v8/reorder/reorder-start-end-events/vue.md @@ -0,0 +1,59 @@ +```html + + + +``` diff --git a/static/usage/v8/reorder/toggling-disabled/angular/example_component_html.md b/static/usage/v8/reorder/toggling-disabled/angular/example_component_html.md index aca04f1ee5a..dbfe175895b 100644 --- a/static/usage/v8/reorder/toggling-disabled/angular/example_component_html.md +++ b/static/usage/v8/reorder/toggling-disabled/angular/example_component_html.md @@ -1,7 +1,7 @@ ```html - + Item 1 diff --git a/static/usage/v8/reorder/toggling-disabled/angular/example_component_ts.md b/static/usage/v8/reorder/toggling-disabled/angular/example_component_ts.md index 496e59f15e1..1e1448b61a0 100644 --- a/static/usage/v8/reorder/toggling-disabled/angular/example_component_ts.md +++ b/static/usage/v8/reorder/toggling-disabled/angular/example_component_ts.md @@ -1,13 +1,13 @@ ```ts import { Component } from '@angular/core'; import { - ItemReorderEventDetail, IonButton, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, + ReorderEndCustomEvent, } from '@ionic/angular/standalone'; @Component({ @@ -19,14 +19,14 @@ import { export class ExampleComponent { public isDisabled = true; - handleReorder(event: CustomEvent) { + handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } diff --git a/static/usage/v8/reorder/toggling-disabled/demo.html b/static/usage/v8/reorder/toggling-disabled/demo.html index 46481ab3dc0..4b5dc99e6e8 100644 --- a/static/usage/v8/reorder/toggling-disabled/demo.html +++ b/static/usage/v8/reorder/toggling-disabled/demo.html @@ -16,7 +16,7 @@ } ion-list { - width: 100%; + width: 300px; } @@ -63,14 +63,14 @@ diff --git a/static/usage/v8/reorder/updating-data/angular/example_component_html.md b/static/usage/v8/reorder/updating-data/angular/example_component_html.md index 873daed0e90..6326a17c949 100644 --- a/static/usage/v8/reorder/updating-data/angular/example_component_html.md +++ b/static/usage/v8/reorder/updating-data/angular/example_component_html.md @@ -2,7 +2,7 @@ - + @for (item of items; track item) { Item {{ item }} diff --git a/static/usage/v8/reorder/updating-data/angular/example_component_ts.md b/static/usage/v8/reorder/updating-data/angular/example_component_ts.md index f70f2bed206..d476b6fdfa0 100644 --- a/static/usage/v8/reorder/updating-data/angular/example_component_ts.md +++ b/static/usage/v8/reorder/updating-data/angular/example_component_ts.md @@ -1,12 +1,12 @@ ```ts import { Component } from '@angular/core'; import { - ItemReorderEventDetail, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, + ReorderEndCustomEvent, } from '@ionic/angular/standalone'; @Component({ @@ -18,7 +18,7 @@ import { export class ExampleComponent { items = [1, 2, 3, 4, 5]; - handleReorder(event: CustomEvent) { + handleReorderEnd(event: ReorderEndCustomEvent) { // Before complete is called with the items they will remain in the // order before the drag console.log('Before complete', this.items); diff --git a/static/usage/v8/reorder/updating-data/demo.html b/static/usage/v8/reorder/updating-data/demo.html index 8f0ca1b7cda..a01deb9600c 100644 --- a/static/usage/v8/reorder/updating-data/demo.html +++ b/static/usage/v8/reorder/updating-data/demo.html @@ -11,7 +11,7 @@ @@ -34,7 +34,7 @@ let items = [1, 2, 3, 4, 5]; reorderItems(items); - reorderGroup.addEventListener('ionItemReorder', ({ detail }) => { + reorderGroup.addEventListener('ionReorderEnd', ({ detail }) => { // Before complete is called with the items they will remain in the // order before the drag console.log('Before complete', items); diff --git a/static/usage/v8/reorder/updating-data/javascript.md b/static/usage/v8/reorder/updating-data/javascript.md index 901bf08a970..28ef0989eea 100644 --- a/static/usage/v8/reorder/updating-data/javascript.md +++ b/static/usage/v8/reorder/updating-data/javascript.md @@ -10,7 +10,7 @@ let items = [1, 2, 3, 4, 5]; reorderItems(items); - reorderGroup.addEventListener('ionItemReorder', ({ detail }) => { + reorderGroup.addEventListener('ionReorderEnd', ({ detail }) => { // Before complete is called with the items they will remain in the // order before the drag console.log('Before complete', items); diff --git a/static/usage/v8/reorder/updating-data/react.md b/static/usage/v8/reorder/updating-data/react.md index acbf422d017..36b9049e56a 100644 --- a/static/usage/v8/reorder/updating-data/react.md +++ b/static/usage/v8/reorder/updating-data/react.md @@ -1,11 +1,11 @@ ```tsx import React, { useState } from 'react'; -import { IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ItemReorderEventDetail } from '@ionic/react'; +import { IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ReorderEndCustomEvent } from '@ionic/react'; function Example() { const [items, setItems] = useState([1, 2, 3, 4, 5]); - function handleReorder(event: CustomEvent) { + function handleReorderEnd(event: ReorderEndCustomEvent) { // Before complete is called with the items they will remain in the // order before the drag console.log('Before complete', items); @@ -22,7 +22,7 @@ function Example() { return ( {/* The reorder gesture is disabled by default, enable it to drag and drop items */} - + {items.map((item) => ( Item {item} diff --git a/static/usage/v8/reorder/updating-data/vue.md b/static/usage/v8/reorder/updating-data/vue.md index 024caf38347..188df041bc2 100644 --- a/static/usage/v8/reorder/updating-data/vue.md +++ b/static/usage/v8/reorder/updating-data/vue.md @@ -2,7 +2,7 @@ diff --git a/static/usage/v8/reorder/wrapper/angular/example_component_html.md b/static/usage/v8/reorder/wrapper/angular/example_component_html.md index cf856309098..5abb818e8b3 100644 --- a/static/usage/v8/reorder/wrapper/angular/example_component_html.md +++ b/static/usage/v8/reorder/wrapper/angular/example_component_html.md @@ -2,7 +2,7 @@ - + Item 1 diff --git a/static/usage/v8/reorder/wrapper/angular/example_component_ts.md b/static/usage/v8/reorder/wrapper/angular/example_component_ts.md index 541fd9c6df3..5553891178a 100644 --- a/static/usage/v8/reorder/wrapper/angular/example_component_ts.md +++ b/static/usage/v8/reorder/wrapper/angular/example_component_ts.md @@ -1,12 +1,12 @@ ```ts import { Component } from '@angular/core'; import { - ItemReorderEventDetail, IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, + ReorderEndCustomEvent, } from '@ionic/angular/standalone'; @Component({ @@ -16,14 +16,14 @@ import { imports: [IonItem, IonLabel, IonList, IonReorder, IonReorderGroup], }) export class ExampleComponent { - handleReorder(event: CustomEvent) { + handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } } diff --git a/static/usage/v8/reorder/wrapper/demo.html b/static/usage/v8/reorder/wrapper/demo.html index 1322a6ee6fd..e4520630556 100644 --- a/static/usage/v8/reorder/wrapper/demo.html +++ b/static/usage/v8/reorder/wrapper/demo.html @@ -11,7 +11,7 @@ @@ -61,14 +61,14 @@ diff --git a/static/usage/v8/reorder/wrapper/javascript.md b/static/usage/v8/reorder/wrapper/javascript.md index e4e024ee2d4..3cd52cb1e8c 100644 --- a/static/usage/v8/reorder/wrapper/javascript.md +++ b/static/usage/v8/reorder/wrapper/javascript.md @@ -37,14 +37,14 @@ diff --git a/static/usage/v8/reorder/wrapper/react.md b/static/usage/v8/reorder/wrapper/react.md index f70ba499316..50210964586 100644 --- a/static/usage/v8/reorder/wrapper/react.md +++ b/static/usage/v8/reorder/wrapper/react.md @@ -1,23 +1,23 @@ ```tsx import React from 'react'; -import { IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ItemReorderEventDetail } from '@ionic/react'; +import { IonItem, IonLabel, IonList, IonReorder, IonReorderGroup, ReorderEndCustomEvent } from '@ionic/react'; function Example() { - function handleReorder(event: CustomEvent) { + function handleReorderEnd(event: ReorderEndCustomEvent) { // The `from` and `to` properties contain the index of the item // when the drag started and ended, respectively console.log('Dragged from index', event.detail.from, 'to', event.detail.to); // Finish the reorder and position the item in the DOM based on // where the gesture ended. This method can also be called directly - // by the reorder group + // by the reorder group. event.detail.complete(); } return ( {/* The reorder gesture is disabled by default, enable it to drag and drop items */} - + Item 1 diff --git a/static/usage/v8/reorder/wrapper/vue.md b/static/usage/v8/reorder/wrapper/vue.md index fd157186093..1b114e575de 100644 --- a/static/usage/v8/reorder/wrapper/vue.md +++ b/static/usage/v8/reorder/wrapper/vue.md @@ -2,7 +2,7 @@ From 070d69e14f6d5a7ae2f0ff1ae63f1ab2508b5611 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Wed, 30 Jul 2025 14:11:09 -0400 Subject: [PATCH 2/4] docs(layout): update css utilities to include new classes and improved section headers (#4219) Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- docs/layout/css-utilities.md | 427 ++++++++++-------- static/img/layout/align-content.png | Bin 0 -> 33014 bytes static/img/layout/align-items.png | Bin 0 -> 20721 bytes static/img/layout/align-self.png | Bin 0 -> 20298 bytes static/img/layout/flex-direction.png | Bin 0 -> 27296 bytes static/img/layout/flex-grow.png | Bin 0 -> 11647 bytes static/img/layout/flex-shrink.png | Bin 0 -> 11229 bytes static/img/layout/flex-wrap.png | Bin 0 -> 23906 bytes static/img/layout/flex.png | Bin 0 -> 19164 bytes static/img/layout/justify-content.png | Bin 0 -> 27402 bytes static/img/layout/order.png | Bin 0 -> 22903 bytes .../version-v5/layout/css-utilities.md | 18 +- .../version-v6/layout/css-utilities.md | 18 +- .../version-v7/layout/css-utilities.md | 18 +- 14 files changed, 263 insertions(+), 218 deletions(-) create mode 100644 static/img/layout/align-content.png create mode 100644 static/img/layout/align-items.png create mode 100644 static/img/layout/align-self.png create mode 100644 static/img/layout/flex-direction.png create mode 100644 static/img/layout/flex-grow.png create mode 100644 static/img/layout/flex-shrink.png create mode 100644 static/img/layout/flex-wrap.png create mode 100644 static/img/layout/flex.png create mode 100644 static/img/layout/justify-content.png create mode 100644 static/img/layout/order.png diff --git a/docs/layout/css-utilities.md b/docs/layout/css-utilities.md index 29ad62298b4..3bafb37362a 100644 --- a/docs/layout/css-utilities.md +++ b/docs/layout/css-utilities.md @@ -12,13 +12,13 @@ title: CSS Utilities Ionic Framework provides a set of CSS utility classes that can be used on any element in order to modify the text, element placement or adjust the padding and margin. -:::note +:::important If your app was not started using an available Ionic Framework starter, the stylesheets listed in the [optional section of the global stylesheets](global-stylesheets.md#optional) will need to be included in order for these styles to work. ::: ## Text Modification -### Text Alignment +### Text Align ```html @@ -76,7 +76,7 @@ If your app was not started using an available Ionic Framework starter, the styl | `.ion-text-wrap` | `white-space: normal` | Sequences of whitespace are collapsed. Newline characters in the source are handled as other whitespace. Breaks lines as necessary to fill line boxes. | | `.ion-text-nowrap` | `white-space: nowrap` | Collapses whitespace as for `normal`, but suppresses line breaks (text wrapping) within text. | -### Text Transformation +### Text Transform ```html @@ -125,9 +125,9 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ## Element Placement -### Float Elements +### Float -The float CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. +The [float](https://developer.mozilla.org/en-US/docs/Web/CSS/float) CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. ```html @@ -188,45 +188,59 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ## Element Display -The display CSS property determines if an element should be visible or not. The element will still be in the DOM, but not rendered, if it is hidden. +### Display -```html - - - -
-

hidden

- You can't see me. -
-
- -
-

not-hidden

- You can see me! -
-
-
-
-``` +The [display](https://developer.mozilla.org/en-US/docs/Web/CSS/display) CSS property sets whether an element is treated as a block or inline box and the layout used for its children, such as flow layout, grid or flex. It can also be used to completely hide an element from the layout. + +Ionic provides the following utility classes for `display`: + +| Class | Style Rule | Description | +| --------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| `.ion-display-none` | `display: none` | Turns off the display of an element so that it has no effect on layout (the document is rendered as though the element did not exist). | +| `.ion-display-inline` | `display: inline` | The element behaves as an inline element that does not create line breaks before or after itself. | +| `.ion-display-inline-block` | `display: inline-block` | The element behaves as a block element that flows with surrounding content as if it were a single inline box. | +| `.ion-display-block` | `display: block` | The element behaves as a block element, creating line breaks both before and after itself when in the normal flow. | +| `.ion-display-flex` | `display: flex` | The element behaves like a block element and lays out its content according to the flexbox model. | +| `.ion-display-inline-flex` | `display: inline-flex` | The element behaves like an inline element and lays out its content according to the flexbox model. | +| `.ion-display-grid` | `display: grid` | The element behaves like a block element and lays out its content according to the grid model. | +| `.ion-display-inline-grid` | `display: inline-grid` | The element behaves like an inline element and lays out its content according to the grid model. | +| `.ion-display-table` | `display: table` | The element behaves like an HTML `` element. It defines a block-level box. | +| `.ion-display-table-cell` | `display: table-cell` | The element behaves like an HTML `` element. | + +### Responsive Display Classes + +All of the display classes listed above have additional classes to modify the display based on the screen size. Instead of `display-` in each class, use `display-{breakpoint}-` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints). -| Class | Style Rule | Description | -| ----------- | --------------- | --------------------------- | -| `.ion-hide` | `display: none` | The element will be hidden. | +The table below shows the default behavior, where `{modifier}` is any of the following: `none`, `inline`, `inline-block`, `block`, `flex`, `inline-flex`, `grid`, `inline-grid`, `table`, `table-cell`, `table-row`, as they are described above. -### Responsive Display Attributes +| Class | Description | +| ---------------------------- | ------------------------------------------------------------- | +| `.ion-display-{modifier}` | Applies the modifier to the element on all screen sizes. | +| `.ion-display-sm-{modifier}` | Applies the modifier to the element when `min-width: 576px`. | +| `.ion-display-md-{modifier}` | Applies the modifier to the element when `min-width: 768px`. | +| `.ion-display-lg-{modifier}` | Applies the modifier to the element when `min-width: 992px`. | +| `.ion-display-xl-{modifier}` | Applies the modifier to the element when `min-width: 1200px`. | -There are also additional classes to modify the visibility based on the screen size. Instead of just `.ion-hide` for all screen sizes, use `.ion-hide-{breakpoint}-{dir}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints), and `{dir}` is whether the element should be hidden on all screen sizes above (`up`) or below (`down`) the specified breakpoint. +### Deprecated Classes + +:::warning Deprecation Notice + +The following classes are deprecated and will be removed in the next major release. Use the recommended `.ion-display-*` classes instead. + +::: -| Class | Description | -| -------------------- | ---------------------------------------------------------------------------------------------------- | -| `.ion-hide-sm-{dir}` | Applies the modifier to the element when `min-width: 576px` (`up`) or `max-width: 576px` (`down`). | -| `.ion-hide-md-{dir}` | Applies the modifier to the element when `min-width: 768px` (`up`) or `max-width: 768px` (`down`). | -| `.ion-hide-lg-{dir}` | Applies the modifier to the element when `min-width: 992px` (`up`) or `max-width: 992px` (`down`). | -| `.ion-hide-xl-{dir}` | Applies the modifier to the element when `min-width: 1200px` (`up`) or `max-width: 1200px` (`down`). | +| Class | Description | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `.ion-hide` | Applies `display: none` to the element on all screen sizes.
**Deprecated** — Use the `ion-display-none` class instead. | +| `.ion-hide-sm-{dir}` | Applies the modifier to the element when `min-width: 576px` (`up`) or `max-width: 576px` (`down`).
**Deprecated** — Use the `ion-display-sm-{modifier}` classes instead. | +| `.ion-hide-md-{dir}` | Applies the modifier to the element when `min-width: 768px` (`up`) or `max-width: 768px` (`down`).
**Deprecated** — Use the `ion-display-md-{modifier}` classes instead. | +| `.ion-hide-lg-{dir}` | Applies the modifier to the element when `min-width: 992px` (`up`) or `max-width: 992px` (`down`).
**Deprecated** — Use the `ion-display-lg-{modifier}` classes instead. | +| `.ion-hide-xl-{dir}` | Applies the modifier to the element when `min-width: 1200px` (`up`) or `max-width: 1200px` (`down`).
**Deprecated** — Use the `ion-display-xl-{modifier}` classes instead. | ## Content Space -### Element Padding +### Padding The padding class sets the padding area of an element. The padding area is the space between the content of the element and its border. @@ -276,7 +290,7 @@ The default amount of `padding` to be applied is `16px` and is set by the `--ion | `.ion-padding-horizontal` | `padding: 0 16px` | Applies padding to the left and right. | | `.ion-no-padding` | `padding: 0` | Applies no padding to all sides. | -### Element Margin +### Margin The margin area extends the border area with an empty area used to separate the element from its neighbors. @@ -326,146 +340,54 @@ The default amount of `margin` to be applied is `16px` and is set by the `--ion- | `.ion-margin-horizontal` | `margin: 0 16px` | Applies margin to the left and right. | | `.ion-no-margin` | `margin: 0` | Applies no margin to all sides. | -## Flex Properties +## Flex Container Properties + +Flexbox properties are divided into two categories: **container properties** that control the layout of all flex items, and **item properties** that control individual flex items. See [Flex Item Properties](#flex-item-properties) for item-level alignment. -### Flex Container Properties +### Align Items -```html - - - -
1 of 2
-
- -
2 of 2
-
-
+The [align-items](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items) CSS property sets the [align-self](#align-self) value on all direct children as a group. In flexbox, it controls the alignment of items on the cross axis. In grid layout, it controls the alignment of items on the block axis within their grid areas. - - -
1 of 2
-
- -
2 of 2
-
-
+ - - -
1 of 2
-
- -
2 of 2
-
-
+Ionic provides the following utility classes for `align-items`: - - -
1 of 2
-
- -
2 of 2
-
-
+| Class | Style Rule | Description | +| --------------------------- | ------------------------- | ---------------------------------------------------- | +| `.ion-align-items-start` | `align-items: flex-start` | Items are packed toward the start on the cross axis. | +| `.ion-align-items-end` | `align-items: flex-end` | Items are packed toward the end on the cross axis. | +| `.ion-align-items-center` | `align-items: center` | Items are centered along the cross axis. | +| `.ion-align-items-baseline` | `align-items: baseline` | Items are aligned so that their baselines align. | +| `.ion-align-items-stretch` | `align-items: stretch` | Items are stretched to fill the container. | - - -
1 of 2
-
- -
2 of 2
-
-
+### Align Content - - -
1 of 2
-
- -
2 of 2
-
-
-
+The [align-content](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content) CSS property sets the distribution of space between and around content items along a flexbox's cross axis, or a grid or block-level element's block axis. - - - -
1 of 4
-
- -
2 of 4
-
- -
3 of 4
-
- -
4 of 4 # # #
-
-
+This property has no effect on single line flex containers (i.e., ones with `flex-wrap: nowrap`). - - -
1 of 4
-
- -
2 of 4
-
- -
3 of 4
-
- -
4 of 4 # # #
-
-
+ - - -
1 of 4
-
- -
2 of 4
-
- -
3 of 4
-
- -
4 of 4 # # #
-
-
+Ionic provides the following utility classes for `align-content`: - - -
1 of 4
-
- -
2 of 4
-
- -
3 of 4
-
- -
4 of 4 # # #
-
-
+| Class | Style Rule | Description | +| ---------------------------- | ------------------------------ | ---------------------------------------------------------- | +| `.ion-align-content-start` | `align-content: flex-start` | Lines are packed toward the start of the cross axis. | +| `.ion-align-content-end` | `align-content: flex-end` | Lines are packed toward the end of the cross axis. | +| `.ion-align-content-center` | `align-content: center` | Lines are centered along the cross axis. | +| `.ion-align-content-stretch` | `align-content: stretch` | Lines are stretched to fill the container. | +| `.ion-align-content-between` | `align-content: space-between` | Lines are evenly distributed on the cross axis. | +| `.ion-align-content-around` | `align-content: space-around` | Lines are evenly distributed with equal space around them. | - - -
1 of 4
-
- -
2 of 4
-
- -
3 of 4
-
- -
4 of 4 # # #
-
-
-
-``` +### Justify Content + +The [justify-content](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content) CSS property defines how the browser distributes space between and around content items along the main axis of a flex container and the inline axis of grid and multi-column containers. + + + +Ionic provides the following utility classes for `justify-content`: | Class | Style Rule | Description | | ------------------------------ | -------------------------------- | --------------------------------------------------------------------------- | @@ -475,35 +397,77 @@ The default amount of `margin` to be applied is `16px` and is set by the `--ion- | `.ion-justify-content-around` | `justify-content: space-around` | Items are evenly distributed on the main axis with equal space around them. | | `.ion-justify-content-between` | `justify-content: space-between` | Items are evenly distributed on the main axis. | | `.ion-justify-content-evenly` | `justify-content: space-evenly` | Items are distributed so that the spacing between any two items is equal. | -| `.ion-align-items-start` | `align-items: flex-start` | Items are packed toward the start on the cross axis. | -| `.ion-align-items-end` | `align-items: flex-end` | Items are packed toward the end on the cross axis. | -| `.ion-align-items-center` | `align-items: center` | Items are centered along the cross axis. | -| `.ion-align-items-baseline` | `align-items: baseline` | Items are aligned so that their baselines align. | -| `.ion-align-items-stretch` | `align-items: stretch` | Items are stretched to fill the container. | -| `.ion-nowrap` | `flex-wrap: nowrap` | Items will all be on one line. | -| `.ion-wrap` | `flex-wrap: wrap` | Items will wrap onto multiple lines, from top to bottom. | -| `.ion-wrap-reverse` | `flex-wrap: wrap-reverse` | Items will wrap onto multiple lines, from bottom to top. | -### Flex Item Properties +### Flex Direction -```html - - - -
1 of 4
-
- -
2 of 4
-
- -
3 of 4
-
- -
4 of 4 # # #
-
-
-
-``` +The [flex-direction](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction) CSS property sets how flex items are placed in the flex container defining the main axis and the direction (normal or reversed). + + + +Ionic provides the following utility classes for `flex-direction`: + +| Class | Style Rule | Description | +| -------------------------- | -------------------------------- | ----------------------------------------------------------------- | +| `.ion-flex-row` | `flex-direction: row` | Items are placed in the same direction as the text direction. | +| `.ion-flex-row-reverse` | `flex-direction: row-reverse` | Items are placed in the opposite direction as the text direction. | +| `.ion-flex-column` | `flex-direction: column` | Items are placed vertically. | +| `.ion-flex-column-reverse` | `flex-direction: column-reverse` | Items are placed vertically in reverse order. | + +### Flex Wrap + +The [flex-wrap](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-wrap) CSS property sets whether flex items are forced onto one line or can wrap onto multiple lines. If wrapping is allowed, it sets the direction that lines are stacked. + + + +Ionic provides the following utility classes for `flex-wrap`: + +| Class | Style Rule | Description | +| ------------------------ | ------------------------- | -------------------------------------------------------- | +| `.ion-flex-nowrap` | `flex-wrap: nowrap` | Items will all be on one line. | +| `.ion-flex-wrap` | `flex-wrap: wrap` | Items will wrap onto multiple lines, from top to bottom. | +| `.ion-flex-wrap-reverse` | `flex-wrap: wrap-reverse` | Items will wrap onto multiple lines, from bottom to top. | + +### Responsive Flex Container Classes + +All of the flex container classes listed above have additional classes to modify the properties based on the screen size. Instead of the base class name, use `{property}-{breakpoint}-{modifier}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints). + +The table below shows the default behavior, where `{property}` is one of the following: `justify-content`, `align-content`, `align-items`, `flex`, or `flex-wrap`, and `{modifier}` is the corresponding value as described above. + +| Class | Description | +| ------------------------------- | ------------------------------------------------------------- | +| `.ion-{property}-{modifier}` | Applies the modifier to the element on all screen sizes. | +| `.ion-{property}-sm-{modifier}` | Applies the modifier to the element when `min-width: 576px`. | +| `.ion-{property}-md-{modifier}` | Applies the modifier to the element when `min-width: 768px`. | +| `.ion-{property}-lg-{modifier}` | Applies the modifier to the element when `min-width: 992px`. | +| `.ion-{property}-xl-{modifier}` | Applies the modifier to the element when `min-width: 1200px`. | + +### Deprecated Classes + +:::warning Deprecation Notice + +The following classes are deprecated and will be removed in the next major release. Use the recommended `.ion-flex-*` classes instead. + +::: + +| Class | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `.ion-nowrap` | Items will all be on one line.
**Deprecated** — Use `.ion-flex-nowrap` instead. | +| `.ion-wrap` | Items will wrap onto multiple lines, from top to bottom.
**Deprecated** — Use `.ion-flex-wrap` instead. | +| `.ion-wrap-reverse` | Items will wrap onto multiple lines, from bottom to top.
**Deprecated** — Use `.ion-flex-wrap-reverse` instead. | + +## Flex Item Properties + +Flex item properties control how individual flex items behave within their flex container. See also: [Flex Container Properties](#flex-container-properties) for container-level alignment. + +### Align Self + +The [align-self](https://developer.mozilla.org/en-US/docs/Web/CSS/align-self) CSS property overrides a grid or flex item's align-items value. In grid, it aligns the item inside the grid area. In flexbox, it aligns the item on the cross axis. + +The property doesn't apply to block-level boxes, or to table cells. If a flexbox item's cross-axis margin is `auto`, then `align-self` is ignored. + + + +Ionic provides the following utility classes for `align-self`: | Class | Style Rule | Description | | -------------------------- | ------------------------ | ---------------------------------------------------------------------- | @@ -514,9 +478,90 @@ The default amount of `margin` to be applied is `16px` and is set by the `--ion- | `.ion-align-self-stretch` | `align-self: stretch` | Item is stretched to fill the container. | | `.ion-align-self-auto` | `align-self: auto` | Item is positioned according to the parent's `align-items` value. | +### Flex + +The [flex](https://developer.mozilla.org/en-US/docs/Web/CSS/flex) CSS property is a shorthand property for `flex-grow`, `flex-shrink` and `flex-basis`. It sets how a flex item will grow or shrink to fit the space available in its flex container. + + + +Ionic provides the following utility classes for `flex`: + +| Class | Style Rule | Description | +| ------------------- | --------------- | ----------------------------------------------------------- | +| `.ion-flex-1` | `flex: 1` | Item grows and shrinks equally with other flex items. | +| `.ion-flex-auto` | `flex: auto` | Item grows and shrinks based on its content size. | +| `.ion-flex-initial` | `flex: initial` | Item shrinks to its minimum content size but does not grow. | +| `.ion-flex-none` | `flex: none` | Item does not grow or shrink. | + +### Flex Grow + +The [flex-grow](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow) CSS property sets the flex grow factor, which specifies how much of the flex container's positive free space, if any, should be assigned to the flex item's main size. + + + +Ionic provides the following utility classes for `flex-grow`: + +| Class | Style Rule | Description | +| ------------------ | -------------- | -------------------------------------------------- | +| `.ion-flex-grow-0` | `flex-grow: 0` | Item does not grow beyond its content size. | +| `.ion-flex-grow-1` | `flex-grow: 1` | Item grows to fill available space proportionally. | + +### Flex Shrink + +The [flex-shrink](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-shrink) CSS property sets the flex shrink factor of a flex item. If the size of all flex items is larger than the flex container, the flex items can shrink to fit according to their `flex-shrink` value. Each flex line's negative free space is distributed between the line's flex items that have a `flex-shrink` value greater than `0`. + + + +Ionic provides the following utility classes for `flex-shrink`: + +| Class | Style Rule | Description | +| -------------------- | ---------------- | -------------------------------------------------------- | +| `.ion-flex-shrink-0` | `flex-shrink: 0` | Item does not shrink below its content size. | +| `.ion-flex-shrink-1` | `flex-shrink: 1` | Item shrinks proportionally when container is too small. | + +### Order + +The [order](https://developer.mozilla.org/en-US/docs/Web/CSS/order) CSS property sets the order to lay out an item in a flex or grid container. Items in a container are sorted by ascending `order` value and then by their source code order. Items not given an explicit `order` value are assigned the default value of `0`. + + + +Ionic provides the following utility classes for `order`: + +| Class | Style Rule | Description | +| ------------------ | ----------- | ----------------------------------------- | +| `.ion-order-first` | `order: -1` | Item appears first in the flex container. | +| `.ion-order-0` | `order: 0` | Item appears in its natural order. | +| `.ion-order-1` | `order: 1` | Item appears after items with order 0. | +| `.ion-order-2` | `order: 2` | Item appears after items with order 1. | +| `.ion-order-3` | `order: 3` | Item appears after items with order 2. | +| `.ion-order-4` | `order: 4` | Item appears after items with order 3. | +| `.ion-order-5` | `order: 5` | Item appears after items with order 4. | +| `.ion-order-6` | `order: 6` | Item appears after items with order 5. | +| `.ion-order-7` | `order: 7` | Item appears after items with order 6. | +| `.ion-order-8` | `order: 8` | Item appears after items with order 7. | +| `.ion-order-9` | `order: 9` | Item appears after items with order 8. | +| `.ion-order-10` | `order: 10` | Item appears after items with order 9. | +| `.ion-order-11` | `order: 11` | Item appears after items with order 10. | +| `.ion-order-12` | `order: 12` | Item appears after items with order 11. | +| `.ion-order-last` | `order: 13` | Item appears last in the flex container. | + +### Responsive Flex Item Classes + +All of the flex item classes listed above have additional classes to modify the properties based on the screen size. Instead of the base class name, use `{property}-{breakpoint}-{modifier}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints). + +The table below shows the default behavior, where `{property}` is one of the following: `align-self`, `flex`, `flex-grow`, `flex-shrink`, or `order`, and `{modifier}` is the corresponding value as described above. + +| Class | Description | +| ------------------------------- | ------------------------------------------------------------- | +| `.ion-{property}-{modifier}` | Applies the modifier to the element on all screen sizes. | +| `.ion-{property}-sm-{modifier}` | Applies the modifier to the element when `min-width: 576px`. | +| `.ion-{property}-md-{modifier}` | Applies the modifier to the element when `min-width: 768px`. | +| `.ion-{property}-lg-{modifier}` | Applies the modifier to the element when `min-width: 992px`. | +| `.ion-{property}-xl-{modifier}` | Applies the modifier to the element when `min-width: 1200px`. | + ## Border Display -The border display CSS property determines if the border should be visible or not. The property can be applied to the ion-header and the ion-footer. +The `.ion-no-border` utility class can be used to remove borders from Ionic components. This class can be applied to the `ion-header` and `ion-footer` components. ```html diff --git a/static/img/layout/align-content.png b/static/img/layout/align-content.png new file mode 100644 index 0000000000000000000000000000000000000000..265c7c7bf3d83869b91ea75a7bd002431b251c06 GIT binary patch literal 33014 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 literal 0 HcmV?d00001 diff --git a/static/img/layout/align-items.png b/static/img/layout/align-items.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c40e22e35e19b477a390e9d2012c8fb0b0b80a GIT binary patch literal 20721 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 literal 0 HcmV?d00001 diff --git a/static/img/layout/align-self.png b/static/img/layout/align-self.png new file mode 100644 index 0000000000000000000000000000000000000000..11fcbd371c22aa067b45385fa19e170293b57f17 GIT binary patch literal 20298 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

Jlib~Lq86BMzYeg> z_+X|{2s4_nK#K4qQNN=;+l5R(@AO>tJEbfd&#Mf)_GVy^}ayd?yIe^pMfIJbnH#Y{#;h%PU(&#r;Hfo*2Sz zJZ=Vl!3zt9AU3_O^>BJn8j)lmx(kB@X%;GyBW!4zZSEDJ+y|KzjaNH$59mJ%EoipQ z;I{OUc^rM-I_?I?LfgCY5wFK~>K()%=O+o?H!sG*rkmwsl<~W_HYUX6%$LZoN?$mA zTdqKHKgMWo7cSG}wfO@n_N+^iWzBry+f|Su;a2O^=%#-5pJ{7hxMXIfjIQ;u z9J`Ntjo8Cwdqmt+QmuT9PdF`ZxmsS6A5day3ZRbgxwRX6#^cg!u*1qd9M-i?MHD}^ z%rT~oD0k{1t9eT8z^T9{9Y-SN7m4q4Kym6G0zT=)Yl?+TwOa9MBqmXKw7l{*MpBZN z3UuFAY|;g}c76!>9Eha-td1|?6}L7yhTAWyw*LeNXUy=?lj~RGoP^tJ_E~ZNtijyO z-h3kC+kD^-wEPlMN2=zQ2Ina*uEXV`%o)tVU&r%A+0+w5;G;qs&J$D>f{+4X;Wi6d zpJ}}gqpVhb2%pKM&0?b-n_S#3KQ~;cXLj-G@lhuL9Gjzh+86o$$}g z&ICm?nL#>DbrgmxLHCQFk!JbbI~2(ZTrdflKEy755JKTeH%!Ys#9F65Nd&veKb}$j zD?82qdj9t3)qsCLrTy>SB!W`hOFP%WoWj+ioHpuCFBJiMA#(!H`66X0>@8ZZJJ6y0 z<+c1It<^ZhzE2bE;s78hl?~r8r3Ey~MhgBdb@*GiCP6}q(Q-vVi=$wabj__sY>`g{ zwLk1{#j0d|I+eX+hI%x1*A@))7RUi5rdLVrSOV&f{xKk#0ol=*@9M{~lJ}@Z&g3D2 z(}Wy6kjy^0O+3otp!w6jH+2R(h2)qe0wEOjx!WQ3vtAj!^>ajsE``lu;^z_X%EA^Z z-t(OFUY3*V5k3lzd5l)g70$=G!>c*U_H3U*E-{^CLETef?sgah+RO=tZydtq((&FW z%Eu)zt500l^WPuSL*%*#$xU3jGVLf(F&DMWGA#AeO4;?t8!dTTEh$JI0u8d$peT2B ztd3_)f{W{T=bZ2GfpVdr?!$ik_np2ydP+b_tn%)b6AYX>J)Yc|x>Fb8to6ibdtAGQ z{%E-#q0NWho#|{LXR7b}Xd+Y^`AKnK7SRlwJuQxLEbuK)KQ zcK`J%*`Ia$f6B`yu(WwKRScis2V4l56&R%j@VD5`H;-)SF_(Vt1!q1*C}box%gD%p zE8c4#M>AXA_Ed7@OfuJSzo+7a%z^&h;O&{srWSCSw;$`tK?|_vFN+B`1y^ma+t@>Y zD8E)W?u3-uW^!N4fu9BvpIIOaJR*f@OEU71Lw{eo6`QOLl6x`209Sys_vYkT06`H- zgl`GDPfuy}3);9RMvGY@a~=3$-*5fyVsd&)L9|WXjo-Uy;Ntq8oaMDEV3L zYd_Cx$x0KWwn^tl%X+5%_(#@~PS>8_#_d+wEx=_qhRV9s;CCBED9xN_dJH1rN7pf;IVFD-fY}s&Qbl zeP51DWt4S#L|#wJE*^gvR3LgR+CO=@*G8bLf~VKeVOz5;fC<=4VUFS?PNp~guU>*? zBP);(Sz%OnYd1)tm{evfN& z^8%v+)3iZ4B=o^7n{hTbYw=;jvqebQ4gObN?VbRzmCeJkJg`*J;v5pM!gFrq4vdxp5fR){3Ren$4r=PXyAM-X+SZ5 zQG{v1reua%`0PWWN}tCjMuC*qB@z6L=Zbp|VC$eZ>be8BFICy^OoT(ZQiEY18tS!Q zjM&oX0+rN`3VU2f;X=d&MDCJ3dHcR!9lf@K!=>J&X(%{}xEobprGmP$KXFVkvlF+g-Iuw!j<)&0JL%sUfA1=G&jvN;6_Ls(f6SWZ{#2yo zgK7|Y@M$Nhv(i`mMW)^bBJNAqh(AUoSOEZP`QSGE9PNr&a&jTLVN>@@CCFBYdLrui zFm`Bk@@0MgK1+;x{q}O)42fjoQl;$q>_SHLV)XmXx1y8hBW42wjOJ)Xuh0CDB&-b; zT_nzhHW$I;7a4VUOc%il1f49)0>nAmrxo+j{t^HX^fE~416+DW3U9x=Re}!Ket*=J z-@eqcDZtUBteB*C^aFa2@Mz;r`a+$8+_Y<@Ox00CQ;3XF8z?CK*bZq$Y|?atYpQa~ zwmf<|#;E8*3JUg7aY}tpO!~uZwzIU!;y3yQlJ>@uF+$e7MnU-(E7peZY#!y&X}^Kv8YN~pYHgoVpd6fIoncqT4k#p@&hke*?-m%o^4 z&gxlOTv|7WZ&l&#A7Pz%`_G9J8no4ImqdnxK+zVC+%oFeDnhYB({7Qh>|D&G7p&OZ zP;4}-qg3=sZK0ua-Ca?%fb`7dGUe5A@V?;^2EJC-Ax@8zL8)afF7)2z|YP$pu*DpqcC~?BnQS8wop5LS2d#Cu7b?W*pr{caQjJ(&= z>Ix~-lUnUtb++u?2*I8ja1?2$>8jP7#+H=MAPbg`RqUl?i)%godYzcIX?=_(y}1Ez8Z~sK z)5)`lGnls9tujA*Rf_CeaAQPO{}@om*3H(ywZw-y(BLf7Gv1V6%v}LuQx4|pC#)KR za_Sf_+&mT9^e+0`#j@tSX=H>1-Ihx_bh)D8!#R?kHlbu&5xMKJ9*DZi5~)50UFBiu1eMv>#szona~kci!}!T_%7WsOWuIhc20|UCgwJ+ zUQ%)zsWb9yvRCeu0%L*>#7iaeOZ@Vf0uuL?$`joh1P|AI7BDgW_WTL8C>7CII!!;7 zEGl|2tad?W((r-*M3l%0{AV2Qs)28d^urNH3Tj4cGBBG-2fXe`dZ5MyxAI%)I zZZze77;x~V*CIr1Q9)k*@yVM*2y?Hmj!*oc1}KD!cZX03AYQNGWtR6Q&eE?{b6sYB zLc~W5>;}EeJ}WDlJq(hgmuah-sAE(Xp>YW zUZ-EXEL)%@XACPiWgoybH7|&PEO6abtso>?y(CtvUA|Ra1-g^4iYZYZKkjSQx>}Iz zT#uZviu3G6p#QX#t8u3Cz*TImj$4O}6yQ*z+}O$Ryxp&!buxd|_vYgzoxsGYV?Z4cBKKb8Dq=PoTsfRHX-^lB!w+TaWtze}WG++3++Dlylf zw(&=b*1wxY-)Xvhdj~_^(~bb6NB%yb{DTJyUd+kJkjOgepCh8Y2t@|CFCO7-jrBl{ zs@Q4!6|0(-baJ=r$s*@aLn5p93Ol}Zd7bsrEjBE|Ee^7|u0OauF#?N0S~=g;+#-Bc zaKTsxd|nMm`h_59VxDw+9d8q^#jG|}l;@>aG1bf>#(x5$o<9UqT!?i1IcbunfFWJL zP2NlQ1V3o zIK<-BA;wmtsBYzG*F9|e*GEj>IN^UW>tq$aE`_w>F(G6emL9!Yp+CP=SAd&ddVkzm zp}62;Q2+%NjuR26HAM|gz26j1maHyUv2LFAH_j#xveKN{)B-w6C`W+0AkvAmo9o1B z@2*?|avq#WwN_DehT`LMctmXv_`7=G{KrbN!dB*3rcK4M6_5AJoG-fl{6JGTRJpxy1NOcfqnJ!cuh~NP-c{DLPwm{ zv9{?8d3+xs>5ZpV7MV}6r)~={+BdrMwHa?&-U1Gfk6jZA z-$Ha_19$^xaqHx1 z+Jas$&mEllbY96Js&{69lM&6{421s87%dW3h^rZ-O+Nl_U?JXyeJJZ=uFR>5Z&>(6 znVQiY?D>5QKY}f?EduDJ)N&|}D_`r>xo-NhkNePk!+NI%!tH6ivWEwS*;gxVI6 z@6l=sV*FYM>H|7zjX`AgY{n10DUOtIrO@5}uqkKm@Y7zP)G+i@YH+74W(Mt$2 zqoDR2VbsZ8#irGaNwykHTJuKz@}RcXQ;k?qY5A+xV9g!Nt<}Vf-&^*`baJ(pv=$Qf zjB(4mEh+nMz*`{4?wF%v4&ST*e=8GVLLK0?P#iE28|M4n9uyTYflP64YeTD9b9H8Y zB$=`D*A@2|=F0qfA2QJUN79pa!w)Fa^W6$Bt~GkB62E&y<05FJ<&H6dR^{f+s~e+f zq8#U}(6uR`CfJ5)!g~AMgG(L~my7U~ZGzb4QaxrF$n!TU9t{5{V8~}T&=i~nQ{R9y zv>+Lb2O#+oDinnPyZ&4?GU-``-x4aC0L?VdhKp)%&BChlLvlP;8OwPQ5h!$c(czPu zAdiCrd7Lu`HKv384M~Y;HlBdru$ggz6ueO2k|2jywg!fDK(!2gz0^`VZdl1rf8gkE zy?@uM&=~cew5T)SRY57K1yOMx=6BB3w)O>O3D!37N^LYfSj1 zsBiw?upvXQ{%1Di(pwH;7X}D_Fy+HKea6;!sA}Dvp0xjp7x}5n*+JJXN5=YG2*eJ9 z+F0Pyac<7kOzdwWjkq?Y5Xz1;i&D#q=J4iEWJRfHa&ET!^ALrx@{e_fkTTHPTTHET zNQjAB#PhM0#5!5Z95kIMIonO-bxY8dXCLZZ0R_%#kb#-H;K3{qk|}{AQT6SLzJ>56(m_&xhse z;z@y|6y<$U_lrl;pL+MGW8_HA43M+10!v#Ke9tTmL_tCs9b?UfWx}_XH0M{E2J|US zTU$S+;Gg^jF%bk-{v!_Z)2{zmQlqwgQCZbZICn#_uufA@@M>qA4f+p#yFhVsh=`ij zeSPG{&|8x1qAawN8VbPH^_eMypo6i8&O3$;w&e~m@pxiV*xQf0bu0&$8!Fk zE3W@{k-(_Qhs`f;FkV9h7SR zig&OUgBTlZjfn-eI=?_;ded6X3fLw(awVxcZmbJsAcajgL(b-2zlm9kWg1py4aJsN{^Lyz0f z8s4c4^^yNc2vAmCB;Awah9FCLUVPavCDP{4zGvhNho}c7V>_)ExNbCq3}L4QGb8W? zGlH+7swzEcYZ)N12tsz<79WEuf!r(@tz&PtY_G_uX7|B;En8Ft4}X!%nX|I*j%w50 zs(8Uzi+ql>RX+Pmd8kjy5;F#@FNcLgK^DUi?IH~(2~2Rv%K$EUL_F30-Dam#E za7u)r{dVmhCuMt<{;0$sMAUcEJG)bMF{G)#g7Q39!NXav0aqY@L)k-|Rk|xdF+Jz0 zvM#?omh#Rt^_o<|$&U$v?zMNPK-F9g1Z3Kmd&{(V(d+L!K_K^&IFF7m#%XyO++cA$ z$;~}Ei9@8uBy~o@^N0DoY1n!%^_z$6V^5H4O4;3^ZEhBxj|Hzf?0qojM^@WkLGq4{ zAa=2u+uMts9f4*N->i1voQUw1gj#0#fk$=9@BJmiulqdao_ye--r^x%c<$ATBqtjX zYxR<3*`Kk#67jGj)cs-OuASrg+$vGA$r)gq^cSgYvPTIc){c z^b!CsyYe&9ojxZnF^U|z5hobJ^&l6P^6x;K@yYDg6PBEJl@Yg?m zFW3lw`d+X@{L6gr@C(Fx_&X5&QMfQ1a{nV7mkh3~>11Bih|eu3!wP*0VHY3%M|2Rt z$r{kXb55P*u^KCrt;<*exfXLs?bzX{D>(8&p6tCX%t1i#ATbeS@R|7E=MSMfAhe3R zW-d4{s#@nX_R*$fb6r4eLI7|OEKrPzQe$PpHW|O9tipd(Wfxg$l(d7XqDQsb{nZ)y zaPI}!T|n?5SRA-tOX*jzxUjkGJ&DD_!;b?St6zlwJC=7pAb6IT_!-;^rKATQ+x~8= zkbD^G=ZCiEy(s8(<=dFFABg3aTkea@$?FreC2~4c?dKVP{u3f1h?mCl3(Sfj>yyAu zGh^cX9=FF&^{XfI12IWz&gBJ)k#H=hZwjGHGVp2WUr{2vGr~!3UxbsM%msf@P__KE zLQv`_4qGf8h)9H=K6U`$R1fF?$yZ?KbmUukf@r+FMuYrz-FYtiJ#3kJr)P~wS-lA1 ztsS+_dP0Jw4pN|a5TV9eColr~j6!nf`f|S5;cwhbrW3zGNdWQ6h@;_jgy9r1iJ_xb z0c;H8*@*rhB6hk{q9?HSha!_g{szVJZ(h&5(p;!mld8r#kFd{_hy;`d_G2%`Nnc+z^X$S zs4YJ@GNZfY)O0g!ubtJ=tf$tvb5B*K2EqkyWseo6`*j-l%o*h3>S`B|yrAex1agg5 zyC0m#_vykUz$Yr`F*m&fHt(^clVeogUxdDjNCOwdU(+xi(ajGp>G!K>`g=U&0v|^J zYJ#3dBHI29GL=4NTl zxHH80+Ra;gp49?*w}Xs(RtU>I+*w+a^?Qp9XxFTOIJEcuX0|B$I|{i8i+lVL5yEm{90=`vTDXtxt_!_d^#LX@~I z=BOmy`V|1yu<^9}ozcZTeZ6ls*Kf{IU(&9dCxEK;Pt1akME@3E)UyKnGQTVHLK2z< z-&~U&NC~*X-v@POe0|^WW6ONvPMhAXMw(GN$`;jO`v%`rNU<%*KI-|RosdpE$3_~J z7&;&U&!LO@>|__+&EK*o_&bC9HjKk;L|A~@r;vSBsn&u%Wk+h_5)%b5k3PnaQ%St*-c z{^W(SFC}Me;u8!=k`vXU3#F6O2P1q?6V^eK3OhzH6QdH9!Q3wvM$Pn)U}z80XyaRW z)n;Q}cUG;o5uLdu+h#}mrRyshz3G{m%U6rlnGbsr0U|HYC~9jcn5Qtlz2r*@n==ym z>W$lyD1ECgyzVD|HLz|}x|}lZZ?N8h;-R8FC@mwd18NqU_vA|7IJ5B3wFaGUwQa?R zPQckia;||)1G;(RHC63lRBZV-wT6yt^JpC^Y#UNptTBZ0Q2-z62t{%_P8SzqF zurd{8vJgItoiE8Na&e0JSy`nVaURhp8cz?=%_a0LEQHr`$V6D~0PSKHp(->-z<2PJ zy;#IOVrusaUzks1Pm{*@R%6I$j(^?N^Z+A~23w05XO!H_OmcdF)$MaR3MuAf-YVX#8c8=bNbcCoDZNqoUQb1mAaM%ZV13O$3R4!3 zShms#Rq$S;Cu5oz4kLD|%7l1y6&1n4xaJ!n0b!M zKu%)fU%RHC_kCp-Y+S5f3CgvhNQdErz?$J=oC=5|sVKGPR4O`5Kk~4Hzm=)Vn^fEV{t$A|d;Gdx%Y3lHLAY}L5L;Afz)cN?nWCRH71Y^F0Y!|7$b%)H0j2;5K`Z_uz-CrnDK|tZN%Caei z4BG-xGoOy9x$sV{p;NyiOtM){iB{EL5;v2|h6K;Xk0CjpkzaATRy=UXS0M&~+cYug zwb0>$z}1)JlDIzcw28e_qLO#jw)X*GU*IM*Y=TrvT1RY=(vPYpMg2jMU2nSpUH8W! zVfI*I1lc03xZLX|B4kb<+7!!!$*m4O?zdgE$tj%KssaX@awflU#!jqpM73n5-D76= z*Dsaz4=TdSLsZs%>%NWomv1lf{f%De)8DJ0HMxNg59yLg$ukuzwx>AJLgv)-aWd0| zWllbc{*F-u_!|(?h$dpP<2v723}}J`R3GCjRL{!U_7LEpM{szGZO|Uf|HjGa#u`Pf zQg*6>rPZ!rhhRA4ikxj1$b0sEg?wb7Y0pfrE>N9l2v8m#r3RIrG0Ap(& z$USCjU>y6t;hq2SUe|yd)yZX|Hq`M-mC)55D{NmPNb*ZhgTPLZQKPlCk~K~UyH+$h z9cpn&>EQ=1z~Me!Anc8TQh d+y5i$jV7eAqrO{(a?Db0Tr;{_s_XFE{{X0?fs+6L literal 0 HcmV?d00001 diff --git a/static/img/layout/flex-direction.png b/static/img/layout/flex-direction.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5691f0fc1d063e4b1eecaffac8b430488a60b4 GIT binary patch literal 27296 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 literal 0 HcmV?d00001 diff --git a/static/img/layout/flex-grow.png b/static/img/layout/flex-grow.png new file mode 100644 index 0000000000000000000000000000000000000000..a029e415dfb2d32278075d62a422b199c45a9b0d GIT binary patch literal 11647 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 literal 0 HcmV?d00001 diff --git a/static/img/layout/flex-shrink.png b/static/img/layout/flex-shrink.png new file mode 100644 index 0000000000000000000000000000000000000000..4c5d58c54da3752b918d1c1367b0a6b32c87a501 GIT binary patch literal 11229 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 G*S`Rul9)vR literal 0 HcmV?d00001 diff --git a/static/img/layout/flex-wrap.png b/static/img/layout/flex-wrap.png new file mode 100644 index 0000000000000000000000000000000000000000..300c417c1be91bb9e255dd30cd12c621cefa99f0 GIT binary patch literal 23906 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 literal 0 HcmV?d00001 diff --git a/static/img/layout/flex.png b/static/img/layout/flex.png new file mode 100644 index 0000000000000000000000000000000000000000..f2648ac05daac2e87f3752d860b0a6b92a86cbbe GIT binary patch literal 19164 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 akH+x6$JXR9QAU>juiNT+YUQ_VpZ-5NJ$+dK literal 0 HcmV?d00001 diff --git a/static/img/layout/justify-content.png b/static/img/layout/justify-content.png new file mode 100644 index 0000000000000000000000000000000000000000..1b2641086a07cb27b3d9438433e7b4df958663c7 GIT binary patch literal 27402 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 YG$E2=cF`i8_s?XWZa$|g|G0Ypf5}6)^#A|> literal 0 HcmV?d00001 diff --git a/static/img/layout/order.png b/static/img/layout/order.png new file mode 100644 index 0000000000000000000000000000000000000000..875e6e799b9d1932f52ec959bd7da1bdc62d51c9 GIT binary patch literal 22903 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 @@ -70,7 +70,7 @@ If your app was not started using an available Ionic Framework starter, the styl | `.ion-text-wrap` | `white-space: normal` | Sequences of whitespace are collapsed. Newline characters in the source are handled as other whitespace. Breaks lines as necessary to fill line boxes. | | `.ion-text-nowrap` | `white-space: nowrap` | Collapses whitespace as for `normal`, but suppresses line breaks (text wrapping) within text. | -### Text Transformation +### Text Transform ```html @@ -121,7 +121,7 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ### Float Elements -The float CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. +The [float](https://developer.mozilla.org/en-US/docs/Web/CSS/float) CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. ```html @@ -165,7 +165,7 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ## Element Display -The display CSS property determines if an element should be visible or not. The element will still be in the DOM, but not rendered, if it is hidden. +The [display](https://developer.mozilla.org/en-US/docs/Web/CSS/display) CSS property sets whether an element is treated as a block or inline box and the layout used for its children, such as flow layout, grid or flex. It can also be used to completely hide an element from the layout. ```html @@ -190,7 +190,7 @@ The display CSS property determines if an element should be visible or not. The | ----------- | --------------- | --------------------------- | | `.ion-hide` | `display: none` | The element will be hidden. | -### Responsive Display Attributes +### Responsive Display Classes There are also additional classes to modify the visibility based on the screen size. Instead of just `.ion-hide` for all screen sizes, use `.ion-hide-{breakpoint}-{dir}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints), and `{dir}` is whether the element should be hidden on all screen sizes above (`up`) or below (`down`) the specified breakpoint. @@ -203,7 +203,7 @@ There are also additional classes to modify the visibility based on the screen s ## Content Space -### Element Padding +### Padding The padding class sets the padding area of an element. The padding area is the space between the content of the element and its border. @@ -253,7 +253,7 @@ The default amount of `padding` to be applied is `16px` and is set by the `--ion | `.ion-padding-horizontal` | `padding: 0 16px` | Applies padding to the left and right. | | `.ion-no-padding` | `padding: 0` | Applies no padding to all sides. | -### Element Margin +### Margin The margin area extends the border area with an empty area used to separate the element from its neighbors. @@ -493,7 +493,7 @@ The default amount of `margin` to be applied is `16px` and is set by the `--ion- ## Border Display -The border display CSS property determines if the border should be visible or not. The property can be applied to the ion-header and the ion-footer. +The `.ion-no-border` utility class can be used to remove borders from Ionic components. This class can be applied to the `ion-header` and `ion-footer` components. ```html diff --git a/versioned_docs/version-v6/layout/css-utilities.md b/versioned_docs/version-v6/layout/css-utilities.md index f743f94a139..20e40f101cc 100644 --- a/versioned_docs/version-v6/layout/css-utilities.md +++ b/versioned_docs/version-v6/layout/css-utilities.md @@ -12,13 +12,13 @@ title: CSS Utilities Ionic Framework provides a set of CSS utility classes that can be used on any element in order to modify the text, element placement or adjust the padding and margin. -:::note +:::important If your app was not started using an available Ionic Framework starter, the stylesheets listed in the [optional section of the global stylesheets](global-stylesheets.md#optional) will need to be included in order for these styles to work. ::: ## Text Modification -### Text Alignment +### Text Align ```html @@ -76,7 +76,7 @@ If your app was not started using an available Ionic Framework starter, the styl | `.ion-text-wrap` | `white-space: normal` | Sequences of whitespace are collapsed. Newline characters in the source are handled as other whitespace. Breaks lines as necessary to fill line boxes. | | `.ion-text-nowrap` | `white-space: nowrap` | Collapses whitespace as for `normal`, but suppresses line breaks (text wrapping) within text. | -### Text Transformation +### Text Transform ```html @@ -127,7 +127,7 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ### Float Elements -The float CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. +The [float](https://developer.mozilla.org/en-US/docs/Web/CSS/float) CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. ```html @@ -171,7 +171,7 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ## Element Display -The display CSS property determines if an element should be visible or not. The element will still be in the DOM, but not rendered, if it is hidden. +The [display](https://developer.mozilla.org/en-US/docs/Web/CSS/display) CSS property sets whether an element is treated as a block or inline box and the layout used for its children, such as flow layout, grid or flex. It can also be used to completely hide an element from the layout. ```html @@ -196,7 +196,7 @@ The display CSS property determines if an element should be visible or not. The | ----------- | --------------- | --------------------------- | | `.ion-hide` | `display: none` | The element will be hidden. | -### Responsive Display Attributes +### Responsive Display Classes There are also additional classes to modify the visibility based on the screen size. Instead of just `.ion-hide` for all screen sizes, use `.ion-hide-{breakpoint}-{dir}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints), and `{dir}` is whether the element should be hidden on all screen sizes above (`up`) or below (`down`) the specified breakpoint. @@ -209,7 +209,7 @@ There are also additional classes to modify the visibility based on the screen s ## Content Space -### Element Padding +### Padding The padding class sets the padding area of an element. The padding area is the space between the content of the element and its border. @@ -259,7 +259,7 @@ The default amount of `padding` to be applied is `16px` and is set by the `--ion | `.ion-padding-horizontal` | `padding: 0 16px` | Applies padding to the left and right. | | `.ion-no-padding` | `padding: 0` | Applies no padding to all sides. | -### Element Margin +### Margin The margin area extends the border area with an empty area used to separate the element from its neighbors. @@ -499,7 +499,7 @@ The default amount of `margin` to be applied is `16px` and is set by the `--ion- ## Border Display -The border display CSS property determines if the border should be visible or not. The property can be applied to the ion-header and the ion-footer. +The `.ion-no-border` utility class can be used to remove borders from Ionic components. This class can be applied to the `ion-header` and `ion-footer` components. ```html diff --git a/versioned_docs/version-v7/layout/css-utilities.md b/versioned_docs/version-v7/layout/css-utilities.md index 05bb0a88aaa..21bf56b8d4c 100644 --- a/versioned_docs/version-v7/layout/css-utilities.md +++ b/versioned_docs/version-v7/layout/css-utilities.md @@ -14,13 +14,13 @@ inlineHtmlPreviews: true Ionic Framework provides a set of CSS utility classes that can be used on any element in order to modify the text, element placement or adjust the padding and margin. -:::note +:::important If your app was not started using an available Ionic Framework starter, the stylesheets listed in the [optional section of the global stylesheets](global-stylesheets.md#optional) will need to be included in order for these styles to work. ::: ## Text Modification -### Text Alignment +### Text Align ```html @@ -78,7 +78,7 @@ If your app was not started using an available Ionic Framework starter, the styl | `.ion-text-wrap` | `white-space: normal` | Sequences of whitespace are collapsed. Newline characters in the source are handled as other whitespace. Breaks lines as necessary to fill line boxes. | | `.ion-text-nowrap` | `white-space: nowrap` | Collapses whitespace as for `normal`, but suppresses line breaks (text wrapping) within text. | -### Text Transformation +### Text Transform ```html @@ -129,7 +129,7 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ### Float Elements -The float CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. +The [float](https://developer.mozilla.org/en-US/docs/Web/CSS/float) CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning. ```html @@ -190,7 +190,7 @@ The table below shows the default behavior, where `{modifier}` is any of the fol ## Element Display -The display CSS property determines if an element should be visible or not. The element will still be in the DOM, but not rendered, if it is hidden. +The [display](https://developer.mozilla.org/en-US/docs/Web/CSS/display) CSS property sets whether an element is treated as a block or inline box and the layout used for its children, such as flow layout, grid or flex. It can also be used to completely hide an element from the layout. ```html @@ -215,7 +215,7 @@ The display CSS property determines if an element should be visible or not. The | ----------- | --------------- | --------------------------- | | `.ion-hide` | `display: none` | The element will be hidden. | -### Responsive Display Attributes +### Responsive Display Classes There are also additional classes to modify the visibility based on the screen size. Instead of just `.ion-hide` for all screen sizes, use `.ion-hide-{breakpoint}-{dir}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints), and `{dir}` is whether the element should be hidden on all screen sizes above (`up`) or below (`down`) the specified breakpoint. @@ -228,7 +228,7 @@ There are also additional classes to modify the visibility based on the screen s ## Content Space -### Element Padding +### Padding The padding class sets the padding area of an element. The padding area is the space between the content of the element and its border. @@ -278,7 +278,7 @@ The default amount of `padding` to be applied is `16px` and is set by the `--ion | `.ion-padding-horizontal` | `padding: 0 16px` | Applies padding to the left and right. | | `.ion-no-padding` | `padding: 0` | Applies no padding to all sides. | -### Element Margin +### Margin The margin area extends the border area with an empty area used to separate the element from its neighbors. @@ -518,7 +518,7 @@ The default amount of `margin` to be applied is `16px` and is set by the `--ion- ## Border Display -The border display CSS property determines if the border should be visible or not. The property can be applied to the ion-header and the ion-footer. +The `.ion-no-border` utility class can be used to remove borders from Ionic components. This class can be applied to the `ion-header` and `ion-footer` components. ```html From 8112113dce8f82c087175b792dce1bea9fe391e0 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Wed, 30 Jul 2025 14:28:35 -0400 Subject: [PATCH 3/4] docs(datetime): add border property to highlightedDates examples (#4220) Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- .../array/angular/example_component_ts.md | 8 ++++++-- static/usage/v8/datetime/highlightedDates/array/demo.html | 8 ++++++-- .../v8/datetime/highlightedDates/array/javascript.md | 8 ++++++-- static/usage/v8/datetime/highlightedDates/array/react.md | 8 ++++++-- static/usage/v8/datetime/highlightedDates/array/vue.md | 8 ++++++-- .../callback/angular/example_component_ts.md | 6 ++++-- .../usage/v8/datetime/highlightedDates/callback/demo.html | 6 ++++-- .../v8/datetime/highlightedDates/callback/javascript.md | 6 ++++-- .../usage/v8/datetime/highlightedDates/callback/react.md | 6 ++++-- static/usage/v8/datetime/highlightedDates/callback/vue.md | 6 ++++-- 10 files changed, 50 insertions(+), 20 deletions(-) diff --git a/static/usage/v8/datetime/highlightedDates/array/angular/example_component_ts.md b/static/usage/v8/datetime/highlightedDates/array/angular/example_component_ts.md index 1382b5db0e9..ca7f322c840 100644 --- a/static/usage/v8/datetime/highlightedDates/array/angular/example_component_ts.md +++ b/static/usage/v8/datetime/highlightedDates/array/angular/example_component_ts.md @@ -14,21 +14,25 @@ export class ExampleComponent { date: '2023-01-05', textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }, { date: '2023-01-10', textColor: '#09721b', backgroundColor: '#c8e5d0', + border: '1px solid #4caf50', }, { date: '2023-01-20', - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }, { date: '2023-01-23', textColor: 'rgb(68, 10, 184)', backgroundColor: 'rgb(211, 200, 229)', + border: '1px solid rgb(103, 58, 183)', }, ]; } diff --git a/static/usage/v8/datetime/highlightedDates/array/demo.html b/static/usage/v8/datetime/highlightedDates/array/demo.html index 1e8545bf042..9f27a6f29c8 100644 --- a/static/usage/v8/datetime/highlightedDates/array/demo.html +++ b/static/usage/v8/datetime/highlightedDates/array/demo.html @@ -31,21 +31,25 @@ date: '2023-01-05', textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }, { date: '2023-01-10', textColor: '#09721b', backgroundColor: '#c8e5d0', + border: '1px solid #4caf50', }, { date: '2023-01-20', - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }, { date: '2023-01-23', textColor: 'rgb(68, 10, 184)', backgroundColor: 'rgb(211, 200, 229)', + border: '1px solid rgb(103, 58, 183)', }, ]; diff --git a/static/usage/v8/datetime/highlightedDates/array/javascript.md b/static/usage/v8/datetime/highlightedDates/array/javascript.md index a27ff554ee2..9eae9580daf 100644 --- a/static/usage/v8/datetime/highlightedDates/array/javascript.md +++ b/static/usage/v8/datetime/highlightedDates/array/javascript.md @@ -8,21 +8,25 @@ date: '2023-01-05', textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }, { date: '2023-01-10', textColor: '#09721b', backgroundColor: '#c8e5d0', + border: '1px solid #4caf50', }, { date: '2023-01-20', - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }, { date: '2023-01-23', textColor: 'rgb(68, 10, 184)', backgroundColor: 'rgb(211, 200, 229)', + border: '1px solid rgb(103, 58, 183)', }, ]; diff --git a/static/usage/v8/datetime/highlightedDates/array/react.md b/static/usage/v8/datetime/highlightedDates/array/react.md index 4d8d9258f63..f49daad4da2 100644 --- a/static/usage/v8/datetime/highlightedDates/array/react.md +++ b/static/usage/v8/datetime/highlightedDates/array/react.md @@ -11,21 +11,25 @@ function Example() { date: '2023-01-05', textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }, { date: '2023-01-10', textColor: '#09721b', backgroundColor: '#c8e5d0', + border: '1px solid #4caf50', }, { date: '2023-01-20', - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }, { date: '2023-01-23', textColor: 'rgb(68, 10, 184)', backgroundColor: 'rgb(211, 200, 229)', + border: '1px solid rgb(103, 58, 183)', }, ]} > diff --git a/static/usage/v8/datetime/highlightedDates/array/vue.md b/static/usage/v8/datetime/highlightedDates/array/vue.md index 408f58f2833..40cc4316e6d 100644 --- a/static/usage/v8/datetime/highlightedDates/array/vue.md +++ b/static/usage/v8/datetime/highlightedDates/array/vue.md @@ -15,21 +15,25 @@ date: '2023-01-05', textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }, { date: '2023-01-10', textColor: '#09721b', backgroundColor: '#c8e5d0', + border: '1px solid #4caf50', }, { date: '2023-01-20', - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }, { date: '2023-01-23', textColor: 'rgb(68, 10, 184)', backgroundColor: 'rgb(211, 200, 229)', + border: '1px solid rgb(103, 58, 183)', }, ]; diff --git a/static/usage/v8/datetime/highlightedDates/callback/angular/example_component_ts.md b/static/usage/v8/datetime/highlightedDates/callback/angular/example_component_ts.md index b877e31c7e5..159d9f8700a 100644 --- a/static/usage/v8/datetime/highlightedDates/callback/angular/example_component_ts.md +++ b/static/usage/v8/datetime/highlightedDates/callback/angular/example_component_ts.md @@ -17,13 +17,15 @@ export class ExampleComponent { return { textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }; } if (utcDay % 3 === 0) { return { - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }; } diff --git a/static/usage/v8/datetime/highlightedDates/callback/demo.html b/static/usage/v8/datetime/highlightedDates/callback/demo.html index 855b797ed2d..447b01e38f5 100644 --- a/static/usage/v8/datetime/highlightedDates/callback/demo.html +++ b/static/usage/v8/datetime/highlightedDates/callback/demo.html @@ -34,13 +34,15 @@ return { textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }; } if (utcDay % 3 === 0) { return { - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }; } diff --git a/static/usage/v8/datetime/highlightedDates/callback/javascript.md b/static/usage/v8/datetime/highlightedDates/callback/javascript.md index 9041810960b..e7774445358 100644 --- a/static/usage/v8/datetime/highlightedDates/callback/javascript.md +++ b/static/usage/v8/datetime/highlightedDates/callback/javascript.md @@ -11,13 +11,15 @@ return { textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }; } if (utcDay % 3 === 0) { return { - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }; } diff --git a/static/usage/v8/datetime/highlightedDates/callback/react.md b/static/usage/v8/datetime/highlightedDates/callback/react.md index 6543a1366ca..b730427ea96 100644 --- a/static/usage/v8/datetime/highlightedDates/callback/react.md +++ b/static/usage/v8/datetime/highlightedDates/callback/react.md @@ -13,13 +13,15 @@ function Example() { return { textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }; } if (utcDay % 3 === 0) { return { - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }; } diff --git a/static/usage/v8/datetime/highlightedDates/callback/vue.md b/static/usage/v8/datetime/highlightedDates/callback/vue.md index e916b2cef1b..5288fefea8e 100644 --- a/static/usage/v8/datetime/highlightedDates/callback/vue.md +++ b/static/usage/v8/datetime/highlightedDates/callback/vue.md @@ -18,13 +18,15 @@ return { textColor: '#800080', backgroundColor: '#ffc0cb', + border: '1px solid #e91e63', }; } if (utcDay % 3 === 0) { return { - textColor: 'var(--ion-color-secondary-contrast)', - backgroundColor: 'var(--ion-color-secondary)', + textColor: 'var(--ion-color-secondary)', + backgroundColor: 'rgb(var(--ion-color-secondary-rgb), 0.18)', + border: '1px solid var(--ion-color-secondary-shade)', }; } From f8de8aad58fef761bf2536612a39981c73de69ab Mon Sep 17 00:00:00 2001 From: Shane Date: Wed, 30 Jul 2025 11:40:16 -0700 Subject: [PATCH 4/4] docs(angular): add injection token docs (#4221) --- docs/angular/injection-tokens.md | 177 +++++++++++++++++++++++++++++++ sidebars.js | 1 + 2 files changed, 178 insertions(+) create mode 100644 docs/angular/injection-tokens.md diff --git a/docs/angular/injection-tokens.md b/docs/angular/injection-tokens.md new file mode 100644 index 00000000000..c7c775fd69c --- /dev/null +++ b/docs/angular/injection-tokens.md @@ -0,0 +1,177 @@ +--- +title: Angular Injection Tokens +sidebar_label: Injection Tokens +--- + + + Angular Injection Tokens | Access Ionic Elements via Dependency Injection + + + +Ionic provides Angular injection tokens that allow you to access Ionic elements through Angular's dependency injection system. This provides a more Angular-idiomatic way to interact with Ionic components programmatically. + +## Benefits + +Using injection tokens provides several advantages: + +- **Type Safety**: Full TypeScript support with proper typing for the modal element +- **Angular Integration**: Works seamlessly with Angular's dependency injection system +- **Simplified Code**: Eliminates the need for `ViewChild` queries or manual element references +- **Better Testing**: Easier to mock and test components that use injection tokens + +## IonModalToken + +The `IonModalToken` injection token allows you to inject a reference to the current modal element directly into your Angular components. This is particularly useful when you need to programmatically control modal behavior, listen to modal events, or access modal properties. + +Starting in `@ionic/angular` v8.7.0, you can use this injection token to streamline modal interactions in your Angular applications. + +### Basic Usage + +To use the `IonModalToken`, inject it into your component's constructor: + +```tsx +import { Component, inject } from '@angular/core'; +import { IonButton, IonContent, IonHeader, IonModalToken, IonTitle, IonToolbar } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-modal', + template: ` + + + Modal Content + + + +

This is modal content

+ Close Modal + + `, + imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton], +}) +export class ModalComponent { + private modalToken = inject(IonModalToken); + + closeModal() { + this.modalToken.dismiss(); + } +} +``` + +### Listening to Modal Events + +You can use the injected modal reference to listen to modal lifecycle events: + +```tsx +import { Component, inject, OnInit } from '@angular/core'; +import { IonButton, IonContent, IonHeader, IonModalToken, IonTitle, IonToolbar } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-modal', + template: ` + + + Modal with Events + + + +

Check the console for modal events

+ Close +
+ `, + imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton], +}) +export class ModalComponent implements OnInit { + private modalToken = inject(IonModalToken); + + ngOnInit() { + this.modalToken.addEventListener('ionModalWillDismiss', (event) => { + console.log('Modal will dismiss:', event.detail); + }); + + this.modalToken.addEventListener('ionModalDidDismiss', (event) => { + console.log('Modal did dismiss:', event.detail); + }); + } + + closeModal() { + this.modalToken.dismiss({ result: 'closed by button' }); + } +} +``` + +### Accessing Modal Properties + +The injected modal reference provides access to all modal properties and methods: + +```tsx +import { Component, inject, OnInit } from '@angular/core'; +import { IonButton, IonContent, IonHeader, IonModalToken, IonTitle, IonToolbar } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-modal', + template: ` + + + Modal Properties + + + +

Modal ID: {{ modalId }}

+ Toggle Backdrop Dismiss: {{ backdropDismiss }} +
+ `, + imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton], +}) +export class ModalComponent implements OnInit { + private modalToken = inject(IonModalToken); + + modalId = ''; + backdropDismiss = true; + + ngOnInit() { + this.modalId = this.modalToken.id || 'No ID'; + this.backdropDismiss = this.modalToken.backdropDismiss; + } + + toggleBackdropDismiss() { + this.backdropDismiss = !this.backdropDismiss; + this.modalToken.backdropDismiss = this.backdropDismiss; + } +} +``` + +### Opening a Modal with Injection Token Content + +When opening a modal that uses the injection token, you can pass the component directly to the modal controller: + +```tsx +import { Component, inject } from '@angular/core'; +import { IonContent, IonButton, ModalController } from '@ionic/angular/standalone'; +import { ModalComponent } from './modal.component'; + +@Component({ + selector: 'app-home', + template: ` + + Open Modal + + `, +}) +export class HomePage { + private modalController = inject(ModalController); + + async openModal() { + const myModal = await this.modalController.create({ + component: ModalComponent, + componentProps: { + // Any props you want to pass to the modal content + }, + }); + + await myModal.present(); + } +} +``` diff --git a/sidebars.js b/sidebars.js index 115eca21382..b3c15b05f58 100644 --- a/sidebars.js +++ b/sidebars.js @@ -85,6 +85,7 @@ module.exports = { }, 'angular/lifecycle', 'angular/navigation', + 'angular/injection-tokens', 'angular/virtual-scroll', 'angular/slides', 'angular/platform',
` element. | +| `.ion-display-table-row` | `display: table-row` | The element behaves like an HTML `