From e9cc2a927cff7c0cb2f19e343bf278143466ec9b Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Mon, 23 Jun 2025 10:08:43 -0400 Subject: [PATCH 01/16] 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 b3dd3f3ff24f7623524b5b20c39bc62eaf729bd9 Mon Sep 17 00:00:00 2001 From: "kendra.jade" Date: Fri, 25 Jul 2025 12:32:10 -0500 Subject: [PATCH 02/16] docs(components): remove legacy syntax sections from all form controls for v8 (#4202) --- docs/api/checkbox.md | 26 +- docs/api/input.md | 22 -- docs/api/radio.md | 25 -- docs/api/range.md | 26 -- docs/api/select.md | 22 -- docs/api/textarea.md | 23 -- docs/api/toggle.md | 23 -- docs/updating/8-0.md | 12 +- static/usage/v8/checkbox/migration/index.md | 188 -------------- static/usage/v8/input/migration/index.md | 248 ------------------- static/usage/v8/radio/migration/index.md | 188 -------------- static/usage/v8/range/migration/index.md | 256 -------------------- static/usage/v8/select/migration/index.md | 140 ----------- static/usage/v8/textarea/migration/index.md | 248 ------------------- static/usage/v8/toggle/migration/index.md | 188 -------------- 15 files changed, 7 insertions(+), 1628 deletions(-) delete mode 100644 static/usage/v8/checkbox/migration/index.md delete mode 100644 static/usage/v8/input/migration/index.md delete mode 100644 static/usage/v8/radio/migration/index.md delete mode 100644 static/usage/v8/range/migration/index.md delete mode 100644 static/usage/v8/select/migration/index.md delete mode 100644 static/usage/v8/textarea/migration/index.md delete mode 100644 static/usage/v8/toggle/migration/index.md diff --git a/docs/api/checkbox.md b/docs/api/checkbox.md index a7b733f201d..ddc9331f50e 100644 --- a/docs/api/checkbox.md +++ b/docs/api/checkbox.md @@ -65,7 +65,7 @@ import Justify from '@site/static/usage/v8/checkbox/justify/index.md'; import Indeterminate from '@site/static/usage/v8/checkbox/indeterminate/index.md'; - + ## Links inside of Labels Checkbox labels can sometimes be accompanied with links. These links can provide more information related to the checkbox. However, clicking the link should not check the checkbox. To achieve this, we can use [stopPropagation](https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation) to prevent the click event from bubbling. When using this approach, the rest of the label still remains clickable. @@ -114,30 +114,6 @@ interface CheckboxCustomEvent extends CustomEvent { } ``` -## Migrating from Legacy Checkbox Syntax - -A simpler checkbox syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup a checkbox, resolves accessibility issues, and improves the developer experience. - -Developers can perform this migration one checkbox at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - -### Using the Modern Syntax - -Using the modern syntax involves removing the `ion-label` and passing the label directly inside of `ion-checkbox`. The placement of the label can be configured using the `labelPlacement` property on `ion-checkbox`. The way the label and the control are packed on a line can be controlled using the `justify` property on `ion-checkbox`. - -import Migration from '@site/static/usage/v8/checkbox/migration/index.md'; - - - - -:::note -In past versions of Ionic, `ion-item` was required for `ion-checkbox` to function properly. Starting in Ionic 7.0, `ion-checkbox` should only be used in an `ion-item` when the item is placed in an `ion-list`. Additionally, `ion-item` is no longer required for `ion-checkbox` to function properly. -::: - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern checkbox syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-checkbox` to `true` to force that instance of the checkbox to use the legacy syntax. - - ## Properties diff --git a/docs/api/input.md b/docs/api/input.md index 78059609d8e..18d71de4eb8 100644 --- a/docs/api/input.md +++ b/docs/api/input.md @@ -188,28 +188,6 @@ import CSSProps from '@site/static/usage/v8/input/theming/css-properties/index.m -## Migrating from Legacy Input Syntax - -A simpler input syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an input, resolves accessibility issues, and improves the developer experience. - -Developers can perform this migration one input at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - -### Using the Modern Syntax - -Using the modern syntax involves three steps: - -1. Remove `ion-label` and use the `label` property on `ion-input` instead. The placement of the label can be configured using the `labelPlacement` property on `ion-input`. -2. Move input-specific properties from `ion-item` on to `ion-input`. This includes the `counter`, `counterFormatter`, `fill`, and `shape` properties. -3. Remove usages of the `helper` and `error` slots on `ion-item` and use the `helperText` and `errorText` properties on `ion-input` instead. - -import Migration from '@site/static/usage/v8/input/migration/index.md'; - - - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern input syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-input` to `true` to force that instance of the input to use the legacy syntax. - ## Interfaces ### InputChangeEventDetail diff --git a/docs/api/radio.md b/docs/api/radio.md index fb717c14835..3cd52c13a4b 100644 --- a/docs/api/radio.md +++ b/docs/api/radio.md @@ -107,31 +107,6 @@ import CSSParts from '@site/static/usage/v8/radio/theming/css-shadow-parts/index -## Migrating from Legacy Radio Syntax - -A simpler radio syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an radio, resolves accessibility issues, and improves the developer experience. - -Developers can perform this migration one radio at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - -### Using the Modern Syntax - -Using the modern syntax involves removing the `ion-label` and passing the label directly inside of `ion-radio`. The placement of the label can be configured using the `labelPlacement` property on `ion-radio`. The way the label and the control are packed on a line can be controlled using the `justify` property on `ion-radio`. - -import Migration from '@site/static/usage/v8/radio/migration/index.md'; - - - - -:::note -In past versions of Ionic, `ion-item` was required for `ion-radio` to function properly. Starting in Ionic 7.0, `ion-radio` should only be used in an `ion-item` when the item is placed in an `ion-list`. Additionally, `ion-item` is no longer required for `ion-radio` to function properly. -::: - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern radio syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-radio` to `true` to force that instance of the radio to use the legacy syntax. - - - ## Properties diff --git a/docs/api/range.md b/docs/api/range.md index 838b981be05..fdb042bb3e9 100644 --- a/docs/api/range.md +++ b/docs/api/range.md @@ -128,32 +128,6 @@ import CSSParts from '@site/static/usage/v8/range/theming/css-shadow-parts/index -## Migrating from Legacy Range Syntax - -A simpler range syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an range, resolves accessibility issues, and improves the developer experience. - -Developers can perform this migration one range at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - -### Using the Modern Syntax - -Using the modern syntax involves removing the `ion-label` and passing the label to `ion-range` using the `label` property. The placement of the label can be configured using the `labelPlacement` property. - -If custom HTML is needed for the label, it can be passed directly inside the `ion-range` using the `label` slot instead. - -import Migration from '@site/static/usage/v8/range/migration/index.md'; - - - - -:::note -In past versions of Ionic, `ion-item` was required for `ion-range` to function properly. Starting in Ionic 7.0, `ion-range` should only be used in an `ion-item` when the item is placed in an `ion-list`. Additionally, `ion-item` is no longer required for `ion-range` to function properly. -::: - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern range syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-range` to `true` to force that instance of the range to use the legacy syntax. - - ## Interfaces ### RangeChangeEventDetail diff --git a/docs/api/select.md b/docs/api/select.md index 0642c6e701d..2ee43b4751e 100644 --- a/docs/api/select.md +++ b/docs/api/select.md @@ -284,28 +284,6 @@ interface SelectCustomEvent extends CustomEvent { } ``` -## Migrating from Legacy Select Syntax - -A simpler select syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an select, resolves accessibility issues, and improves the developer experience. - -Developers can perform this migration one select at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - - -### Using the Modern Syntax - -Using the modern syntax involves two steps: - -1. Remove `ion-label` and use the `label` property on `ion-select` instead. The placement of the label can be configured using the `labelPlacement` property on `ion-select`. -2. Move any usage of `fill` and `shape` from `ion-item` on to `ion-select`. - -import Migration from '@site/static/usage/v8/select/migration/index.md'; - - - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern select syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-select` to `true` to force that instance of the input to use the legacy syntax. - ## Accessibility ### Keyboard Interactions diff --git a/docs/api/textarea.md b/docs/api/textarea.md index 5e34e78a72a..feed4b04bee 100644 --- a/docs/api/textarea.md +++ b/docs/api/textarea.md @@ -127,29 +127,6 @@ import StartEndSlots from '@site/static/usage/v8/textarea/start-end-slots/index. -## Migrating from Legacy Textarea Syntax - -A simpler textarea syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an textarea, resolves accessibility issues, and improves the developer experience. - -Developers can perform this migration one textarea at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - - -### Using the Modern Syntax - -Using the modern syntax involves three steps: - -1. Remove `ion-label` and use the `label` property on `ion-textarea` instead. The placement of the label can be configured using the `labelPlacement` property on `ion-textarea`. -2. Move textarea-specific properties from `ion-item` on to `ion-textarea`. This includes the `counter`, `counterFormatter`, `fill`, and `shape` properties. -3. Remove usages of the `helper` and `error` slots on `ion-item` and use the `helperText` and `errorText` properties on `ion-textarea` instead. - -import Migration from '@site/static/usage/v8/textarea/migration/index.md'; - - - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern textarea syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-textarea` to `true` to force that instance of the textarea to use the legacy syntax. - ## Theming import ThemingPlayground from '@site/static/usage/v8/textarea/theming/index.md'; diff --git a/docs/api/toggle.md b/docs/api/toggle.md index c0b7445b2ac..ad2ebe3554e 100644 --- a/docs/api/toggle.md +++ b/docs/api/toggle.md @@ -107,29 +107,6 @@ import CSSParts from '@site/static/usage/v8/toggle/theming/css-shadow-parts/inde -## Migrating from Legacy Toggle Syntax - -A simpler toggle syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an toggle, resolves accessibility issues, and improves the developer experience. - -While developers can continue using the legacy syntax, we recommend migrating as soon as possible. - -### Using the Modern Syntax - -Using the modern syntax involves removing the `ion-label` and passing the label directly inside of `ion-toggle`. The placement of the label can be configured using the `labelPlacement` property on `ion-toggle`. The way the label and the control are packed on a line can be controlled using the `justify` property on `ion-toggle`. - -import Migration from '@site/static/usage/v8/toggle/migration/index.md'; - - - - -:::note -In past versions of Ionic, `ion-item` was required for `ion-toggle` to function properly. Starting in Ionic 7.0, `ion-toggle` should only be used in an `ion-item` when the item is placed in an `ion-list`. Additionally, `ion-item` is no longer required for `ion-toggle` to function properly. -::: - -### Using the Legacy Syntax - -Ionic uses heuristics to detect if an app is using the modern toggle syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-toggle` to `true` to force that instance of the toggle to use the legacy syntax. - ## Interfaces ### ToggleChangeEventDetail diff --git a/docs/updating/8-0.md b/docs/updating/8-0.md index e0e283b4ac5..ca20c9cb6cb 100644 --- a/docs/updating/8-0.md +++ b/docs/updating/8-0.md @@ -215,13 +215,13 @@ iOS >=15 ### Checkbox -1. Migrate any remaining instances of Checkbox to use the [modern form control syntax](../api/checkbox#migrating-from-legacy-checkbox-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. +1. Migrate any remaining instances of Checkbox to use the [modern form control syntax](../v7/api/checkbox#migrating-from-legacy-checkbox-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. ### Input 1. Remove any usages of the `size` property. CSS should be used to specify the visible width of the input instead. 2. Remove any usages of the `accept` property. -3. Migrate any remaining instances of Input to use the [modern form control syntax](../api/input#migrating-from-legacy-input-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. +3. Migrate any remaining instances of Input to use the [modern form control syntax](../v7/api/input#migrating-from-legacy-input-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. ### Item @@ -243,19 +243,19 @@ iOS >=15 ### Radio -1. Migrate any remaining instances of Radio to use the [modern form control syntax](../api/radio#migrating-from-legacy-radio-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. +1. Migrate any remaining instances of Radio to use the [modern form control syntax](../v7/api/radio#migrating-from-legacy-radio-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. ### Select -1. Migrate any remaining instances of Select to use the [modern form control syntax](../api/select#migrating-from-legacy-select-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. +1. Migrate any remaining instances of Select to use the [modern form control syntax](../v7/api/select#migrating-from-legacy-select-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. ### Textarea -1. Migrate any remaining instances of Textarea to use the [modern form control syntax](../api/textarea#migrating-from-legacy-textarea-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. +1. Migrate any remaining instances of Textarea to use the [modern form control syntax](../v7/api/textarea#migrating-from-legacy-textarea-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. ### Toggle -1. Migrate any remaining instances of Toggle to use the [modern form control syntax](../api/toggle#migrating-from-legacy-toggle-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. +1. Migrate any remaining instances of Toggle to use the [modern form control syntax](../v7/api/toggle#migrating-from-legacy-toggle-syntax). Additionally, remove any usages of the `legacy` property as the legacy form control syntax has been removed. ## Need Help Upgrading? diff --git a/static/usage/v8/checkbox/migration/index.md b/static/usage/v8/checkbox/migration/index.md deleted file mode 100644 index acf77957566..00000000000 --- a/static/usage/v8/checkbox/migration/index.md +++ /dev/null @@ -1,188 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Checkbox Label - - - - - - Checkbox Label - - - - - - - Checkbox Label - - - - - - Checkbox Label - - - - - - - Checkbox Label - - - - - - Checkbox Label - -``` - - - -```html - - - - - Checkbox Label - - - - - - Checkbox Label - - - - - - - Checkbox Label - - - - - - Checkbox Label - - - - - - - Checkbox Label - - - - - - Checkbox Label - -``` - - - -```tsx -{/* Basic */} - -{/* Before */} - - Checkbox Label - - - -{/* After */} - - Checkbox Label - - -{/* Fixed Labels */} - -{/* Before */} - - Checkbox Label - - - -{/* After */} - - Checkbox Label - - -{/* Checkbox at the start of line, Label at the end of line */} - -{/* Before */} - - Checkbox Label - - - -{/* After */} - - Checkbox Label - -``` - - - -```html - - - - - Checkbox Label - - - - - - Checkbox Label - - - - - - - Checkbox Label - - - - - - Checkbox Label - - - - - - - Checkbox Label - - - - - - Checkbox Label - -``` - - -```` diff --git a/static/usage/v8/input/migration/index.md b/static/usage/v8/input/migration/index.md deleted file mode 100644 index 34e3ccaece5..00000000000 --- a/static/usage/v8/input/migration/index.md +++ /dev/null @@ -1,248 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Email: - - - - - - - - - - - - - - Email: - - - - - - - - - - - - - Email: - -
Enter an email
-
Please enter a valid email
-
- - - - - - -``` -
- - -```html - - - - - Email: - - - - - - - - - - - - - - Email: - - - - - - - - - - - - - Email: - -
Enter an email
-
Please enter a valid email
-
- - - - - - -``` -
- - -```tsx -{/* Label and Label Position */} - -{/* Before */} - - Email: - - - -{/* After */} - - - - - -{/* Fill */} - -{/* Before */} - - Email: - - - -{/* After */} - -{/* Inputs using `fill` should not be placed in IonItem */} - - -{/* Input-specific features on IonItem */} - -{/* Before */} - - Email: - -
Enter an email
-
Please enter a valid email
-
- -{/* After */} - -{/* - Metadata such as counters and helper text should not - be used when an input is in an item/list. If you need to - provide more context on a input, consider using an IonNote - underneath the IonList. -*/} - - -``` -
- - -```html - - - - - Email: - - - - - - - - - - - - - - Email: - - - - - - - - - - - - - Email: - -
Enter an email
-
Please enter a valid email
-
- - - - - - -``` -
-
-```` diff --git a/static/usage/v8/radio/migration/index.md b/static/usage/v8/radio/migration/index.md deleted file mode 100644 index 4c0477f1e4a..00000000000 --- a/static/usage/v8/radio/migration/index.md +++ /dev/null @@ -1,188 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Radio Label - - - - - - Radio Label - - - - - - - Radio Label - - - - - - Radio Label - - - - - - - Radio Label - - - - - - Radio Label - -``` - - - -```html - - - - - Radio Label - - - - - - Radio Label - - - - - - - Radio Label - - - - - - Radio Label - - - - - - - Radio Label - - - - - - Radio Label - -``` - - - -```tsx -{/* Basic */} - -{/* Before */} - - Radio Label - - - -{/* After */} - - Radio Label - - -{/* Fixed Labels */} - -{/* Before */} - - Radio Label - - - -{/* After */} - - Radio Label - - -{/* Radio at the start of line, Label at the end of line */} - -{/* Before */} - - Radio Label - - - -{/* After */} - - Radio Label - -``` - - - -```html - - - - - Radio Label - - - - - - Radio Label - - - - - - - Radio Label - - - - - - Radio Label - - - - - - - Radio Label - - - - - - Radio Label - -``` - - -```` diff --git a/static/usage/v8/range/migration/index.md b/static/usage/v8/range/migration/index.md deleted file mode 100644 index 4025f91bc31..00000000000 --- a/static/usage/v8/range/migration/index.md +++ /dev/null @@ -1,256 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Notifications - - - - - - - - - - - - - Notifications - - - - - - - - - - - - - Notifications - - - - - - - - - - - - - -
Notifications
-
- -
- - - - -
Notifications
-
-
-``` -
- - -```html - - - - - Notifications - - - - - - - - - - - - - Notifications - - - - - - - - - - - - - Notifications - - - - - - - - - - - - - -
Notifications
-
- -
- - - - -
Notifications
-
-
-``` -
- - -```tsx -{/* Basic */} - -{/* Before */} - - Notifications - - - -{/* After */} - - - - -{/* Fixed Labels */} - -{/* Before */} - - Notifications - - - -{/* After */} - - - - -{/* Range at the start of line, Label at the end of line */} - -{/* Before */} - - Notifications - - - -{/* After */} - - - - -{/* Custom HTML label */} - -{/* Before */} - - -
Notifications
-
- -
- - - - -
Notifications
-
-
-``` -
- - -```html - - - - - Notifications - - - - - - - - - - - - - Notifications - - - - - - - - - - - - - Notifications - - - - - - - - - - - - - -
Notifications
-
- -
- - - - -
Notifications
-
-
-``` -
-
-```` diff --git a/static/usage/v8/select/migration/index.md b/static/usage/v8/select/migration/index.md deleted file mode 100644 index daf1a3a2612..00000000000 --- a/static/usage/v8/select/migration/index.md +++ /dev/null @@ -1,140 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Favorite Fruit: - ... - - - - - ... - - - - - - - - Favorite Fruit: - ... - - - - - -... -``` - - - -```html - - - - - Favorite Fruit: - ... - - - - - ... - - - - - - - - Favorite Fruit: - ... - - - - - -... -``` - - - -```tsx -{/* Label and Label Position */} - -{/* Before */} - - Favorite Fruit: - ... - - -{/* After */} - - ... - - - -{/* Fill */} - -{/* Before */} - - Favorite Fruit: - ... - - -{/* After */} - -{/* Inputs using `fill` should not be placed in IonItem */} -... -``` - - - -```html - - - - - Favorite Fruit: - ... - - - - - ... - - - - - - - - Favorite Fruit: - ... - - - - - -... -``` - - -```` diff --git a/static/usage/v8/textarea/migration/index.md b/static/usage/v8/textarea/migration/index.md deleted file mode 100644 index aa820c53b48..00000000000 --- a/static/usage/v8/textarea/migration/index.md +++ /dev/null @@ -1,248 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Label: - - - - - - - - - - - - - - Label: - - - - - - - - - - - - - Label: - -
Enter text
-
Please enter text
-
- - - - - - -``` -
- - -```html - - - - - Label: - - - - - - - - - - - - - - Label: - - - - - - - - - - - - - Label: - -
Enter text
-
Please enter text
-
- - - - - - -``` -
- - -```tsx -{/* Label and Label Position */} - -{/* Before */} - - Label: - - - -{/* After */} - - - - - -{/* Fill */} - -{/* Before */} - - Label: - - - -{/* After */} - -{/* Textareas using `fill` should not be placed in IonItem */} - - -{/* Textarea-specific features on IonItem */} - -{/* Before */} - - Label: - -
Enter text
-
Please enter text
-
- -{/* After */} - -{/* - Metadata such as counters and helper text should not - be used when a textarea is in an item/list. If you need to - provide more context on a textarea, consider using an IonNote - underneath the IonList. -*/} - - -``` -
- - -```html - - - - - Label: - - - - - - - - - - - - - - Label: - - - - - - - - - - - - - Label: - -
Enter text
-
Please enter text
-
- - - - - - -``` -
-
-```` diff --git a/static/usage/v8/toggle/migration/index.md b/static/usage/v8/toggle/migration/index.md deleted file mode 100644 index a1f855766b8..00000000000 --- a/static/usage/v8/toggle/migration/index.md +++ /dev/null @@ -1,188 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -````mdx-code-block - - - -```html - - - - - Notifications - - - - - - Notifications - - - - - - - Notifications - - - - - - Notifications - - - - - - - Notifications - - - - - - Notifications - -``` - - - -```html - - - - - Notifications - - - - - - Notifications - - - - - - - Notifications - - - - - - Notifications - - - - - - - Notifications - - - - - - Notifications - -``` - - - -```tsx -{/* Basic */} - -{/* Before */} - - Notifications - - - -{/* After */} - - Notifications - - -{/* Fixed Labels */} - -{/* Before */} - - Notifications - - - -{/* After */} - - Notifications - - -{/* Toggle at the start of line, Label at the end of line */} - -{/* Before */} - - Notifications - - - -{/* After */} - - Notifications - -``` - - - -```html - - - - - Notifications - - - - - - Notifications - - - - - - - Notifications - - - - - - Notifications - - - - - - - Notifications - - - - - - Notifications - -``` - - -```` From 4f75fd889951f3dea0efaf0f3debf7e01b03e450 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 10:58:05 -0400 Subject: [PATCH 03/16] chore(deps): update dependency vite to v7.0.6 (#4216) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../code/stackblitz/v7/vue/package-lock.json | 28 +++++++++---------- .../code/stackblitz/v8/vue/package-lock.json | 28 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/static/code/stackblitz/v7/vue/package-lock.json b/static/code/stackblitz/v7/vue/package-lock.json index 27e17f33d0b..9b73e3519c9 100644 --- a/static/code/stackblitz/v7/vue/package-lock.json +++ b/static/code/stackblitz/v7/vue/package-lock.json @@ -1111,9 +1111,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "engines": { "node": ">=12" @@ -1231,14 +1231,14 @@ } }, "node_modules/vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dev": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" @@ -2026,9 +2026,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true }, "postcss": { @@ -2098,15 +2098,15 @@ "devOptional": true }, "vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dev": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "fsevents": "~2.3.3", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" diff --git a/static/code/stackblitz/v8/vue/package-lock.json b/static/code/stackblitz/v8/vue/package-lock.json index bb6d3dbde48..943788ab224 100644 --- a/static/code/stackblitz/v8/vue/package-lock.json +++ b/static/code/stackblitz/v8/vue/package-lock.json @@ -1239,9 +1239,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "engines": { "node": ">=12" @@ -1359,14 +1359,14 @@ } }, "node_modules/vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dev": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" @@ -2221,9 +2221,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true }, "postcss": { @@ -2293,15 +2293,15 @@ "devOptional": true }, "vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dev": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "fsevents": "~2.3.3", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" From 69b87fbc6d3e0046a2365f57cf3becd83edc79d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 10:58:57 -0400 Subject: [PATCH 04/16] chore(deps): update dependency vite to v7.0.6 (#4215) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../stackblitz/v7/react/package-lock.json | 28 +++++++++---------- .../stackblitz/v8/react/package-lock.json | 28 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/static/code/stackblitz/v7/react/package-lock.json b/static/code/stackblitz/v7/react/package-lock.json index 99f3ce46ed7..1819714e6eb 100644 --- a/static/code/stackblitz/v7/react/package-lock.json +++ b/static/code/stackblitz/v7/react/package-lock.json @@ -1395,9 +1395,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "engines": { "node": ">=12" }, @@ -1679,13 +1679,13 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "node_modules/vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" @@ -2580,9 +2580,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "postcss": { "version": "8.5.6", @@ -2782,14 +2782,14 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "fsevents": "~2.3.3", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" diff --git a/static/code/stackblitz/v8/react/package-lock.json b/static/code/stackblitz/v8/react/package-lock.json index 2f20f90617b..01348b5a2a7 100644 --- a/static/code/stackblitz/v8/react/package-lock.json +++ b/static/code/stackblitz/v8/react/package-lock.json @@ -1501,9 +1501,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "engines": { "node": ">=12" }, @@ -1785,13 +1785,13 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "node_modules/vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" @@ -2746,9 +2746,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "postcss": { "version": "8.5.6", @@ -2948,14 +2948,14 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "fsevents": "~2.3.3", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" From 751ca7e865533fcfde798becbd83308a204b8864 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 12:03:46 -0400 Subject: [PATCH 05/16] chore(deps): update dependency vue to v3.5.18 (#4217) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../code/stackblitz/v7/vue/package-lock.json | 246 +++++++++--------- .../code/stackblitz/v8/vue/package-lock.json | 246 +++++++++--------- 2 files changed, 246 insertions(+), 246 deletions(-) diff --git a/static/code/stackblitz/v7/vue/package-lock.json b/static/code/stackblitz/v7/vue/package-lock.json index 9b73e3519c9..a443dfdc46a 100644 --- a/static/code/stackblitz/v7/vue/package-lock.json +++ b/static/code/stackblitz/v7/vue/package-lock.json @@ -37,11 +37,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -51,9 +51,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -821,36 +821,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", - "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", "dependencies": { - "@babel/parser": "^7.27.5", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", - "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", "dependencies": { - "@vue/compiler-core": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", - "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", "dependencies": { - "@babel/parser": "^7.27.5", - "@vue/compiler-core": "3.5.17", - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", @@ -858,12 +858,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", - "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", "dependencies": { - "@vue/compiler-dom": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/compiler-vue2": { @@ -906,49 +906,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", - "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", "dependencies": { - "@vue/shared": "3.5.17" + "@vue/shared": "3.5.18" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", - "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", "dependencies": { - "@vue/reactivity": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", - "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", "dependencies": { - "@vue/reactivity": "3.5.17", - "@vue/runtime-core": "3.5.17", - "@vue/shared": "3.5.17", + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", - "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", "dependencies": { - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" }, "peerDependencies": { - "vue": "3.5.17" + "vue": "3.5.18" } }, "node_modules/@vue/shared": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", - "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==" + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" }, "node_modules/alien-signals": { "version": "2.0.5", @@ -1311,15 +1311,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", - "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", "dependencies": { - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-sfc": "3.5.17", - "@vue/runtime-dom": "3.5.17", - "@vue/server-renderer": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" }, "peerDependencies": { "typescript": "*" @@ -1373,17 +1373,17 @@ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" }, "@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "requires": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" } }, "@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "requires": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -1789,36 +1789,36 @@ } }, "@vue/compiler-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", - "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", "requires": { - "@babel/parser": "^7.27.5", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "@vue/compiler-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", - "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", "requires": { - "@vue/compiler-core": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/compiler-sfc": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", - "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", "requires": { - "@babel/parser": "^7.27.5", - "@vue/compiler-core": "3.5.17", - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", @@ -1826,12 +1826,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", - "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", "requires": { - "@vue/compiler-dom": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/compiler-vue2": { @@ -1866,46 +1866,46 @@ } }, "@vue/reactivity": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", - "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", "requires": { - "@vue/shared": "3.5.17" + "@vue/shared": "3.5.18" } }, "@vue/runtime-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", - "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", "requires": { - "@vue/reactivity": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/runtime-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", - "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", "requires": { - "@vue/reactivity": "3.5.17", - "@vue/runtime-core": "3.5.17", - "@vue/shared": "3.5.17", + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "@vue/server-renderer": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", - "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", "requires": { - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/shared": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", - "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==" + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" }, "alien-signals": { "version": "2.0.5", @@ -2119,15 +2119,15 @@ "dev": true }, "vue": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", - "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", "requires": { - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-sfc": "3.5.17", - "@vue/runtime-dom": "3.5.17", - "@vue/server-renderer": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" } }, "vue-router": { diff --git a/static/code/stackblitz/v8/vue/package-lock.json b/static/code/stackblitz/v8/vue/package-lock.json index 943788ab224..0df34fc3e3f 100644 --- a/static/code/stackblitz/v8/vue/package-lock.json +++ b/static/code/stackblitz/v8/vue/package-lock.json @@ -37,11 +37,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -51,9 +51,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -949,36 +949,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", - "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", "dependencies": { - "@babel/parser": "^7.27.5", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", - "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", "dependencies": { - "@vue/compiler-core": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", - "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", "dependencies": { - "@babel/parser": "^7.27.5", - "@vue/compiler-core": "3.5.17", - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", @@ -986,12 +986,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", - "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", "dependencies": { - "@vue/compiler-dom": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/compiler-vue2": { @@ -1034,49 +1034,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", - "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", "dependencies": { - "@vue/shared": "3.5.17" + "@vue/shared": "3.5.18" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", - "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", "dependencies": { - "@vue/reactivity": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", - "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", "dependencies": { - "@vue/reactivity": "3.5.17", - "@vue/runtime-core": "3.5.17", - "@vue/shared": "3.5.17", + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", - "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", "dependencies": { - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" }, "peerDependencies": { - "vue": "3.5.17" + "vue": "3.5.18" } }, "node_modules/@vue/shared": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", - "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==" + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" }, "node_modules/alien-signals": { "version": "2.0.5", @@ -1439,15 +1439,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", - "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", "dependencies": { - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-sfc": "3.5.17", - "@vue/runtime-dom": "3.5.17", - "@vue/server-renderer": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" }, "peerDependencies": { "typescript": "*" @@ -1501,17 +1501,17 @@ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" }, "@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "requires": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" } }, "@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "requires": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -1984,36 +1984,36 @@ } }, "@vue/compiler-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", - "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", "requires": { - "@babel/parser": "^7.27.5", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "@vue/compiler-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", - "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", "requires": { - "@vue/compiler-core": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/compiler-sfc": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", - "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", "requires": { - "@babel/parser": "^7.27.5", - "@vue/compiler-core": "3.5.17", - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17", + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", @@ -2021,12 +2021,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", - "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", "requires": { - "@vue/compiler-dom": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/compiler-vue2": { @@ -2061,46 +2061,46 @@ } }, "@vue/reactivity": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", - "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", "requires": { - "@vue/shared": "3.5.17" + "@vue/shared": "3.5.18" } }, "@vue/runtime-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", - "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", "requires": { - "@vue/reactivity": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/runtime-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", - "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", "requires": { - "@vue/reactivity": "3.5.17", - "@vue/runtime-core": "3.5.17", - "@vue/shared": "3.5.17", + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "@vue/server-renderer": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", - "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", "requires": { - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" } }, "@vue/shared": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", - "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==" + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" }, "alien-signals": { "version": "2.0.5", @@ -2314,15 +2314,15 @@ "dev": true }, "vue": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", - "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", "requires": { - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-sfc": "3.5.17", - "@vue/runtime-dom": "3.5.17", - "@vue/server-renderer": "3.5.17", - "@vue/shared": "3.5.17" + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" } }, "vue-router": { From 2f858c879bed32b62048d1af425a3474d7b4b59b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 12:12:48 -0400 Subject: [PATCH 06/16] chore(deps): update dependency vue-tsc to v3.0.4 (#4218) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../code/stackblitz/v7/vue/package-lock.json | 28 +++++++++---------- .../code/stackblitz/v8/vue/package-lock.json | 28 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/static/code/stackblitz/v7/vue/package-lock.json b/static/code/stackblitz/v7/vue/package-lock.json index a443dfdc46a..86ec845890f 100644 --- a/static/code/stackblitz/v7/vue/package-lock.json +++ b/static/code/stackblitz/v7/vue/package-lock.json @@ -882,9 +882,9 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "node_modules/@vue/language-core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.3.tgz", - "integrity": "sha512-I9wY0ULMN9tMSua+2C7g+ez1cIziVMUzIHlDYGSl2rtru3Eh4sXj95vZ+4GBuXwwPnEmYfzSApVbXiVbI8V5Gg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.4.tgz", + "integrity": "sha512-BvueED4LfBCSNH66eeUQk37MQCb7hjdezzGgxniM0LbriW53AJIyLorgshAtStmjfsAuOCcTl/c1b+nz/ye8xQ==", "dev": true, "dependencies": { "@volar/language-core": "2.4.20", @@ -1345,13 +1345,13 @@ } }, "node_modules/vue-tsc": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.3.tgz", - "integrity": "sha512-uU1OMSzWE8/y0+kDTc0iEIu9v82bmFkGyJpAO/x3wQqBkkHkButKgtygREyOkxL4E/xtcf/ExvgNhhjdzonldw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.4.tgz", + "integrity": "sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw==", "dev": true, "dependencies": { "@volar/typescript": "2.4.20", - "@vue/language-core": "3.0.3" + "@vue/language-core": "3.0.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -1850,9 +1850,9 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "@vue/language-core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.3.tgz", - "integrity": "sha512-I9wY0ULMN9tMSua+2C7g+ez1cIziVMUzIHlDYGSl2rtru3Eh4sXj95vZ+4GBuXwwPnEmYfzSApVbXiVbI8V5Gg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.4.tgz", + "integrity": "sha512-BvueED4LfBCSNH66eeUQk37MQCb7hjdezzGgxniM0LbriW53AJIyLorgshAtStmjfsAuOCcTl/c1b+nz/ye8xQ==", "dev": true, "requires": { "@volar/language-core": "2.4.20", @@ -2139,13 +2139,13 @@ } }, "vue-tsc": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.3.tgz", - "integrity": "sha512-uU1OMSzWE8/y0+kDTc0iEIu9v82bmFkGyJpAO/x3wQqBkkHkButKgtygREyOkxL4E/xtcf/ExvgNhhjdzonldw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.4.tgz", + "integrity": "sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw==", "dev": true, "requires": { "@volar/typescript": "2.4.20", - "@vue/language-core": "3.0.3" + "@vue/language-core": "3.0.4" } } } diff --git a/static/code/stackblitz/v8/vue/package-lock.json b/static/code/stackblitz/v8/vue/package-lock.json index 0df34fc3e3f..b9f7cd62041 100644 --- a/static/code/stackblitz/v8/vue/package-lock.json +++ b/static/code/stackblitz/v8/vue/package-lock.json @@ -1010,9 +1010,9 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "node_modules/@vue/language-core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.3.tgz", - "integrity": "sha512-I9wY0ULMN9tMSua+2C7g+ez1cIziVMUzIHlDYGSl2rtru3Eh4sXj95vZ+4GBuXwwPnEmYfzSApVbXiVbI8V5Gg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.4.tgz", + "integrity": "sha512-BvueED4LfBCSNH66eeUQk37MQCb7hjdezzGgxniM0LbriW53AJIyLorgshAtStmjfsAuOCcTl/c1b+nz/ye8xQ==", "dev": true, "dependencies": { "@volar/language-core": "2.4.20", @@ -1473,13 +1473,13 @@ } }, "node_modules/vue-tsc": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.3.tgz", - "integrity": "sha512-uU1OMSzWE8/y0+kDTc0iEIu9v82bmFkGyJpAO/x3wQqBkkHkButKgtygREyOkxL4E/xtcf/ExvgNhhjdzonldw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.4.tgz", + "integrity": "sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw==", "dev": true, "dependencies": { "@volar/typescript": "2.4.20", - "@vue/language-core": "3.0.3" + "@vue/language-core": "3.0.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -2045,9 +2045,9 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "@vue/language-core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.3.tgz", - "integrity": "sha512-I9wY0ULMN9tMSua+2C7g+ez1cIziVMUzIHlDYGSl2rtru3Eh4sXj95vZ+4GBuXwwPnEmYfzSApVbXiVbI8V5Gg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.4.tgz", + "integrity": "sha512-BvueED4LfBCSNH66eeUQk37MQCb7hjdezzGgxniM0LbriW53AJIyLorgshAtStmjfsAuOCcTl/c1b+nz/ye8xQ==", "dev": true, "requires": { "@volar/language-core": "2.4.20", @@ -2334,13 +2334,13 @@ } }, "vue-tsc": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.3.tgz", - "integrity": "sha512-uU1OMSzWE8/y0+kDTc0iEIu9v82bmFkGyJpAO/x3wQqBkkHkButKgtygREyOkxL4E/xtcf/ExvgNhhjdzonldw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.4.tgz", + "integrity": "sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw==", "dev": true, "requires": { "@volar/typescript": "2.4.20", - "@vue/language-core": "3.0.3" + "@vue/language-core": "3.0.4" } } } From 070d69e14f6d5a7ae2f0ff1ae63f1ab2508b5611 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Wed, 30 Jul 2025 14:11:09 -0400 Subject: [PATCH 07/16] 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> 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 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 08/16] 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 09/16] 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', From 54a3cb249dba4dfc15feb415ce2e773c6a25aabb Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Thu, 31 Jul 2025 09:59:24 -0400 Subject: [PATCH 10/16] docs(playgrounds): add back migration examples for JP docs (#4225) Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- static/usage/v8/checkbox/migration/index.md | 188 ++++++++++++++ static/usage/v8/input/migration/index.md | 248 +++++++++++++++++++ static/usage/v8/radio/migration/index.md | 188 ++++++++++++++ static/usage/v8/range/migration/index.md | 256 ++++++++++++++++++++ static/usage/v8/select/migration/index.md | 140 +++++++++++ static/usage/v8/textarea/migration/index.md | 248 +++++++++++++++++++ static/usage/v8/toggle/migration/index.md | 188 ++++++++++++++ 7 files changed, 1456 insertions(+) create mode 100644 static/usage/v8/checkbox/migration/index.md create mode 100644 static/usage/v8/input/migration/index.md create mode 100644 static/usage/v8/radio/migration/index.md create mode 100644 static/usage/v8/range/migration/index.md create mode 100644 static/usage/v8/select/migration/index.md create mode 100644 static/usage/v8/textarea/migration/index.md create mode 100644 static/usage/v8/toggle/migration/index.md diff --git a/static/usage/v8/checkbox/migration/index.md b/static/usage/v8/checkbox/migration/index.md new file mode 100644 index 00000000000..acf77957566 --- /dev/null +++ b/static/usage/v8/checkbox/migration/index.md @@ -0,0 +1,188 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Checkbox Label + + + + + + Checkbox Label + + + + + + + Checkbox Label + + + + + + Checkbox Label + + + + + + + Checkbox Label + + + + + + Checkbox Label + +``` + + + +```html + + + + + Checkbox Label + + + + + + Checkbox Label + + + + + + + Checkbox Label + + + + + + Checkbox Label + + + + + + + Checkbox Label + + + + + + Checkbox Label + +``` + + + +```tsx +{/* Basic */} + +{/* Before */} + + Checkbox Label + + + +{/* After */} + + Checkbox Label + + +{/* Fixed Labels */} + +{/* Before */} + + Checkbox Label + + + +{/* After */} + + Checkbox Label + + +{/* Checkbox at the start of line, Label at the end of line */} + +{/* Before */} + + Checkbox Label + + + +{/* After */} + + Checkbox Label + +``` + + + +```html + + + + + Checkbox Label + + + + + + Checkbox Label + + + + + + + Checkbox Label + + + + + + Checkbox Label + + + + + + + Checkbox Label + + + + + + Checkbox Label + +``` + + +```` diff --git a/static/usage/v8/input/migration/index.md b/static/usage/v8/input/migration/index.md new file mode 100644 index 00000000000..34e3ccaece5 --- /dev/null +++ b/static/usage/v8/input/migration/index.md @@ -0,0 +1,248 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Email: + + + + + + + + + + + + + + Email: + + + + + + + + + + + + + Email: + +
Enter an email
+
Please enter a valid email
+
+ + + + + + +``` +
+ + +```html + + + + + Email: + + + + + + + + + + + + + + Email: + + + + + + + + + + + + + Email: + +
Enter an email
+
Please enter a valid email
+
+ + + + + + +``` +
+ + +```tsx +{/* Label and Label Position */} + +{/* Before */} + + Email: + + + +{/* After */} + + + + + +{/* Fill */} + +{/* Before */} + + Email: + + + +{/* After */} + +{/* Inputs using `fill` should not be placed in IonItem */} + + +{/* Input-specific features on IonItem */} + +{/* Before */} + + Email: + +
Enter an email
+
Please enter a valid email
+
+ +{/* After */} + +{/* + Metadata such as counters and helper text should not + be used when an input is in an item/list. If you need to + provide more context on a input, consider using an IonNote + underneath the IonList. +*/} + + +``` +
+ + +```html + + + + + Email: + + + + + + + + + + + + + + Email: + + + + + + + + + + + + + Email: + +
Enter an email
+
Please enter a valid email
+
+ + + + + + +``` +
+
+```` diff --git a/static/usage/v8/radio/migration/index.md b/static/usage/v8/radio/migration/index.md new file mode 100644 index 00000000000..4c0477f1e4a --- /dev/null +++ b/static/usage/v8/radio/migration/index.md @@ -0,0 +1,188 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Radio Label + + + + + + Radio Label + + + + + + + Radio Label + + + + + + Radio Label + + + + + + + Radio Label + + + + + + Radio Label + +``` + + + +```html + + + + + Radio Label + + + + + + Radio Label + + + + + + + Radio Label + + + + + + Radio Label + + + + + + + Radio Label + + + + + + Radio Label + +``` + + + +```tsx +{/* Basic */} + +{/* Before */} + + Radio Label + + + +{/* After */} + + Radio Label + + +{/* Fixed Labels */} + +{/* Before */} + + Radio Label + + + +{/* After */} + + Radio Label + + +{/* Radio at the start of line, Label at the end of line */} + +{/* Before */} + + Radio Label + + + +{/* After */} + + Radio Label + +``` + + + +```html + + + + + Radio Label + + + + + + Radio Label + + + + + + + Radio Label + + + + + + Radio Label + + + + + + + Radio Label + + + + + + Radio Label + +``` + + +```` diff --git a/static/usage/v8/range/migration/index.md b/static/usage/v8/range/migration/index.md new file mode 100644 index 00000000000..4025f91bc31 --- /dev/null +++ b/static/usage/v8/range/migration/index.md @@ -0,0 +1,256 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Notifications + + + + + + + + + + + + + Notifications + + + + + + + + + + + + + Notifications + + + + + + + + + + + + + +
Notifications
+
+ +
+ + + + +
Notifications
+
+
+``` +
+ + +```html + + + + + Notifications + + + + + + + + + + + + + Notifications + + + + + + + + + + + + + Notifications + + + + + + + + + + + + + +
Notifications
+
+ +
+ + + + +
Notifications
+
+
+``` +
+ + +```tsx +{/* Basic */} + +{/* Before */} + + Notifications + + + +{/* After */} + + + + +{/* Fixed Labels */} + +{/* Before */} + + Notifications + + + +{/* After */} + + + + +{/* Range at the start of line, Label at the end of line */} + +{/* Before */} + + Notifications + + + +{/* After */} + + + + +{/* Custom HTML label */} + +{/* Before */} + + +
Notifications
+
+ +
+ + + + +
Notifications
+
+
+``` +
+ + +```html + + + + + Notifications + + + + + + + + + + + + + Notifications + + + + + + + + + + + + + Notifications + + + + + + + + + + + + + +
Notifications
+
+ +
+ + + + +
Notifications
+
+
+``` +
+
+```` diff --git a/static/usage/v8/select/migration/index.md b/static/usage/v8/select/migration/index.md new file mode 100644 index 00000000000..daf1a3a2612 --- /dev/null +++ b/static/usage/v8/select/migration/index.md @@ -0,0 +1,140 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Favorite Fruit: + ... + + + + + ... + + + + + + + + Favorite Fruit: + ... + + + + + +... +``` + + + +```html + + + + + Favorite Fruit: + ... + + + + + ... + + + + + + + + Favorite Fruit: + ... + + + + + +... +``` + + + +```tsx +{/* Label and Label Position */} + +{/* Before */} + + Favorite Fruit: + ... + + +{/* After */} + + ... + + + +{/* Fill */} + +{/* Before */} + + Favorite Fruit: + ... + + +{/* After */} + +{/* Inputs using `fill` should not be placed in IonItem */} +... +``` + + + +```html + + + + + Favorite Fruit: + ... + + + + + ... + + + + + + + + Favorite Fruit: + ... + + + + + +... +``` + + +```` diff --git a/static/usage/v8/textarea/migration/index.md b/static/usage/v8/textarea/migration/index.md new file mode 100644 index 00000000000..aa820c53b48 --- /dev/null +++ b/static/usage/v8/textarea/migration/index.md @@ -0,0 +1,248 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Label: + + + + + + + + + + + + + + Label: + + + + + + + + + + + + + Label: + +
Enter text
+
Please enter text
+
+ + + + + + +``` +
+ + +```html + + + + + Label: + + + + + + + + + + + + + + Label: + + + + + + + + + + + + + Label: + +
Enter text
+
Please enter text
+
+ + + + + + +``` +
+ + +```tsx +{/* Label and Label Position */} + +{/* Before */} + + Label: + + + +{/* After */} + + + + + +{/* Fill */} + +{/* Before */} + + Label: + + + +{/* After */} + +{/* Textareas using `fill` should not be placed in IonItem */} + + +{/* Textarea-specific features on IonItem */} + +{/* Before */} + + Label: + +
Enter text
+
Please enter text
+
+ +{/* After */} + +{/* + Metadata such as counters and helper text should not + be used when a textarea is in an item/list. If you need to + provide more context on a textarea, consider using an IonNote + underneath the IonList. +*/} + + +``` +
+ + +```html + + + + + Label: + + + + + + + + + + + + + + Label: + + + + + + + + + + + + + Label: + +
Enter text
+
Please enter text
+
+ + + + + + +``` +
+
+```` diff --git a/static/usage/v8/toggle/migration/index.md b/static/usage/v8/toggle/migration/index.md new file mode 100644 index 00000000000..a1f855766b8 --- /dev/null +++ b/static/usage/v8/toggle/migration/index.md @@ -0,0 +1,188 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +````mdx-code-block + + + +```html + + + + + Notifications + + + + + + Notifications + + + + + + + Notifications + + + + + + Notifications + + + + + + + Notifications + + + + + + Notifications + +``` + + + +```html + + + + + Notifications + + + + + + Notifications + + + + + + + Notifications + + + + + + Notifications + + + + + + + Notifications + + + + + + Notifications + +``` + + + +```tsx +{/* Basic */} + +{/* Before */} + + Notifications + + + +{/* After */} + + Notifications + + +{/* Fixed Labels */} + +{/* Before */} + + Notifications + + + +{/* After */} + + Notifications + + +{/* Toggle at the start of line, Label at the end of line */} + +{/* Before */} + + Notifications + + + +{/* After */} + + Notifications + +``` + + + +```html + + + + + Notifications + + + + + + Notifications + + + + + + + Notifications + + + + + + Notifications + + + + + + + Notifications + + + + + + Notifications + +``` + + +```` From 613d75cbe741ab64d871ca7585bdd7dc30820d48 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 10:09:05 -0400 Subject: [PATCH 11/16] chore(deps): update ionic to v8.7.0 (#4223) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../code/stackblitz/v8/angular/package.json | 4 +- static/code/stackblitz/v8/html/package.json | 2 +- .../stackblitz/v8/react/package-lock.json | 255 +++++++++++++++--- static/code/stackblitz/v8/react/package.json | 4 +- .../code/stackblitz/v8/vue/package-lock.json | 255 +++++++++++++++--- static/code/stackblitz/v8/vue/package.json | 4 +- 6 files changed, 445 insertions(+), 79 deletions(-) diff --git a/static/code/stackblitz/v8/angular/package.json b/static/code/stackblitz/v8/angular/package.json index 6cf52acc420..190268e822a 100644 --- a/static/code/stackblitz/v8/angular/package.json +++ b/static/code/stackblitz/v8/angular/package.json @@ -15,8 +15,8 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-browser-dynamic": "^20.0.0", "@angular/router": "^20.0.0", - "@ionic/angular": "8.6.5", - "@ionic/core": "8.6.5", + "@ionic/angular": "8.7.0", + "@ionic/core": "8.7.0", "ionicons": "8.0.13", "rxjs": "^7.8.1", "tslib": "^2.5.0", diff --git a/static/code/stackblitz/v8/html/package.json b/static/code/stackblitz/v8/html/package.json index e1d3912cfee..4c386cb3f7d 100644 --- a/static/code/stackblitz/v8/html/package.json +++ b/static/code/stackblitz/v8/html/package.json @@ -9,7 +9,7 @@ "start": "vite preview" }, "dependencies": { - "@ionic/core": "8.6.5", + "@ionic/core": "8.7.0", "ionicons": "8.0.13" }, "devDependencies": { diff --git a/static/code/stackblitz/v8/react/package-lock.json b/static/code/stackblitz/v8/react/package-lock.json index 01348b5a2a7..c77cae7388a 100644 --- a/static/code/stackblitz/v8/react/package-lock.json +++ b/static/code/stackblitz/v8/react/package-lock.json @@ -8,8 +8,8 @@ "name": "vite-react-typescript", "version": "0.1.0", "dependencies": { - "@ionic/react": "8.6.5", - "@ionic/react-router": "8.6.5", + "@ionic/react": "8.7.0", + "@ionic/react-router": "8.7.0", "@types/node": "^22.0.0", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", @@ -669,22 +669,22 @@ } }, "node_modules/@ionic/core": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.6.5.tgz", - "integrity": "sha512-HN+6/Q67fEEpRA86QzXSrCahuHwaTPBsa910RuvY0pIYuoY4rpzGPU9ZOQ5q2wBsrln921rroEPU1xdpPKIH8Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz", + "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==", "dependencies": { "@stencil/core": "4.33.1", - "ionicons": "^7.2.2", + "ionicons": "^8.0.13", "tslib": "^2.1.0" } }, "node_modules/@ionic/react": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.6.5.tgz", - "integrity": "sha512-reUKqlU3cIJoHuDibB8WUd32a7nqg5aMsIfPnXOVydIUsJdvQnwjACbYiP0g+4AFzTVPsw/Cmyqh85GhXGw4WA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.0.tgz", + "integrity": "sha512-9MLa6qWDbtLoq+cUEAdoxHXeXrNTzoKVaOzEs95rohoKsKIUch5aAcI4g4iPx7zd04fMhvpiEVfMwoR1tq4EJQ==", "dependencies": { - "@ionic/core": "8.6.5", - "ionicons": "^7.0.0", + "@ionic/core": "8.7.0", + "ionicons": "^8.0.13", "tslib": "*" }, "peerDependencies": { @@ -693,11 +693,11 @@ } }, "node_modules/@ionic/react-router": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.6.5.tgz", - "integrity": "sha512-DGR7yHaNEneK1DwZ6D52vkKRICAAteiC1i9C6KgNGw24e1et83nE1gqa4s4EQ3ggbfWBkmWCs/9UBqU8oyG0Cg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.7.0.tgz", + "integrity": "sha512-DcSxqaT4I1wvnMlunPIM2lCTuhWMKFfDwdIpLJGLzQytqA9iv+AXDYrhm5BfuXry8bpgKSHErX16ihsqqzqVvw==", "dependencies": { - "@ionic/react": "8.6.5", + "@ionic/react": "8.7.0", "tslib": "*" }, "peerDependencies": { @@ -1407,11 +1407,129 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/ionicons": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.3.1.tgz", - "integrity": "sha512-1boG4EQTBBpQ4/0PU60Yi78Iw/k8iNtKu9c0NmsbzHGnWAcwpiovG9Wi/rk5UlF+DC+CR4XDCxKo91YqvAxkww==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.13.tgz", + "integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==", "dependencies": { - "@stencil/core": "^4.0.3" + "@stencil/core": "^4.35.3" + } + }, + "node_modules/ionicons/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/ionicons/node_modules/@stencil/core": { + "version": "4.36.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", + "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" } }, "node_modules/js-tokens": { @@ -2208,31 +2326,31 @@ "optional": true }, "@ionic/core": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.6.5.tgz", - "integrity": "sha512-HN+6/Q67fEEpRA86QzXSrCahuHwaTPBsa910RuvY0pIYuoY4rpzGPU9ZOQ5q2wBsrln921rroEPU1xdpPKIH8Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz", + "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==", "requires": { "@stencil/core": "4.33.1", - "ionicons": "^7.2.2", + "ionicons": "^8.0.13", "tslib": "^2.1.0" } }, "@ionic/react": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.6.5.tgz", - "integrity": "sha512-reUKqlU3cIJoHuDibB8WUd32a7nqg5aMsIfPnXOVydIUsJdvQnwjACbYiP0g+4AFzTVPsw/Cmyqh85GhXGw4WA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.0.tgz", + "integrity": "sha512-9MLa6qWDbtLoq+cUEAdoxHXeXrNTzoKVaOzEs95rohoKsKIUch5aAcI4g4iPx7zd04fMhvpiEVfMwoR1tq4EJQ==", "requires": { - "@ionic/core": "8.6.5", - "ionicons": "^7.0.0", + "@ionic/core": "8.7.0", + "ionicons": "^8.0.13", "tslib": "*" } }, "@ionic/react-router": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.6.5.tgz", - "integrity": "sha512-DGR7yHaNEneK1DwZ6D52vkKRICAAteiC1i9C6KgNGw24e1et83nE1gqa4s4EQ3ggbfWBkmWCs/9UBqU8oyG0Cg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.7.0.tgz", + "integrity": "sha512-DcSxqaT4I1wvnMlunPIM2lCTuhWMKFfDwdIpLJGLzQytqA9iv+AXDYrhm5BfuXry8bpgKSHErX16ihsqqzqVvw==", "requires": { - "@ionic/react": "8.6.5", + "@ionic/react": "8.7.0", "tslib": "*" } }, @@ -2682,11 +2800,76 @@ } }, "ionicons": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.3.1.tgz", - "integrity": "sha512-1boG4EQTBBpQ4/0PU60Yi78Iw/k8iNtKu9c0NmsbzHGnWAcwpiovG9Wi/rk5UlF+DC+CR4XDCxKo91YqvAxkww==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.13.tgz", + "integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==", "requires": { - "@stencil/core": "^4.0.3" + "@stencil/core": "^4.35.3" + }, + "dependencies": { + "@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "optional": true + }, + "@stencil/core": { + "version": "4.36.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", + "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", + "requires": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" + } + } } }, "js-tokens": { diff --git a/static/code/stackblitz/v8/react/package.json b/static/code/stackblitz/v8/react/package.json index 07c566794e6..ec62cee7918 100644 --- a/static/code/stackblitz/v8/react/package.json +++ b/static/code/stackblitz/v8/react/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@ionic/react": "8.6.5", - "@ionic/react-router": "8.6.5", + "@ionic/react": "8.7.0", + "@ionic/react-router": "8.7.0", "@types/node": "^22.0.0", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", diff --git a/static/code/stackblitz/v8/vue/package-lock.json b/static/code/stackblitz/v8/vue/package-lock.json index b9f7cd62041..c036156cf93 100644 --- a/static/code/stackblitz/v8/vue/package-lock.json +++ b/static/code/stackblitz/v8/vue/package-lock.json @@ -8,8 +8,8 @@ "name": "vite-vue-starter", "version": "0.0.0", "dependencies": { - "@ionic/vue": "8.6.5", - "@ionic/vue-router": "8.6.5", + "@ionic/vue": "8.7.0", + "@ionic/vue-router": "8.7.0", "vue": "^3.2.25", "vue-router": "4.5.1" }, @@ -463,31 +463,31 @@ } }, "node_modules/@ionic/core": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.6.5.tgz", - "integrity": "sha512-HN+6/Q67fEEpRA86QzXSrCahuHwaTPBsa910RuvY0pIYuoY4rpzGPU9ZOQ5q2wBsrln921rroEPU1xdpPKIH8Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz", + "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==", "dependencies": { "@stencil/core": "4.33.1", - "ionicons": "^7.2.2", + "ionicons": "^8.0.13", "tslib": "^2.1.0" } }, "node_modules/@ionic/vue": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.6.5.tgz", - "integrity": "sha512-hmvH8y9QRbfWchRBJJoSHHoAHpcOMo942B1/4xZQwgkujRtpLTIoWG9eGNxvbMpV0c11CyUX9R2++MHpVdLKDw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.0.tgz", + "integrity": "sha512-lIq8zTIx794QrFUHqXpS02Z0QRPBDNcuX+lIL7dQYg4PXxYwdERppt5MStfXXbx1jNr6YDCOhYMdcuw9emmzGA==", "dependencies": { - "@ionic/core": "8.6.5", + "@ionic/core": "8.7.0", "@stencil/vue-output-target": "0.10.7", - "ionicons": "^7.0.0" + "ionicons": "^8.0.13" } }, "node_modules/@ionic/vue-router": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-8.6.5.tgz", - "integrity": "sha512-WMQLkQSBgaoV1z+dtTYr/D32N5OFzSrF3pNLWT+r3E8+OlLqLt/1AqEqDbIYT1yj/i+JzmD7ZpKgktvZwevQDQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-8.7.0.tgz", + "integrity": "sha512-LoBxwC6aOL1qV/XKtd8FiURkhZABxFZkjkoLbGMHcdeV++BPwQvdkLtQ9/TC6KbwTmHYJHooqIvkAHQA0f0yMw==", "dependencies": { - "@ionic/vue": "8.6.5" + "@ionic/vue": "8.7.0" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1189,11 +1189,129 @@ } }, "node_modules/ionicons": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.3.1.tgz", - "integrity": "sha512-1boG4EQTBBpQ4/0PU60Yi78Iw/k8iNtKu9c0NmsbzHGnWAcwpiovG9Wi/rk5UlF+DC+CR4XDCxKo91YqvAxkww==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.13.tgz", + "integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==", "dependencies": { - "@stencil/core": "^4.0.3" + "@stencil/core": "^4.35.3" + } + }, + "node_modules/ionicons/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/ionicons/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/ionicons/node_modules/@stencil/core": { + "version": "4.36.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", + "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" } }, "node_modules/magic-string": { @@ -1693,31 +1811,31 @@ "optional": true }, "@ionic/core": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.6.5.tgz", - "integrity": "sha512-HN+6/Q67fEEpRA86QzXSrCahuHwaTPBsa910RuvY0pIYuoY4rpzGPU9ZOQ5q2wBsrln921rroEPU1xdpPKIH8Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz", + "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==", "requires": { "@stencil/core": "4.33.1", - "ionicons": "^7.2.2", + "ionicons": "^8.0.13", "tslib": "^2.1.0" } }, "@ionic/vue": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.6.5.tgz", - "integrity": "sha512-hmvH8y9QRbfWchRBJJoSHHoAHpcOMo942B1/4xZQwgkujRtpLTIoWG9eGNxvbMpV0c11CyUX9R2++MHpVdLKDw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.0.tgz", + "integrity": "sha512-lIq8zTIx794QrFUHqXpS02Z0QRPBDNcuX+lIL7dQYg4PXxYwdERppt5MStfXXbx1jNr6YDCOhYMdcuw9emmzGA==", "requires": { - "@ionic/core": "8.6.5", + "@ionic/core": "8.7.0", "@stencil/vue-output-target": "0.10.7", - "ionicons": "^7.0.0" + "ionicons": "^8.0.13" } }, "@ionic/vue-router": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-8.6.5.tgz", - "integrity": "sha512-WMQLkQSBgaoV1z+dtTYr/D32N5OFzSrF3pNLWT+r3E8+OlLqLt/1AqEqDbIYT1yj/i+JzmD7ZpKgktvZwevQDQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-8.7.0.tgz", + "integrity": "sha512-LoBxwC6aOL1qV/XKtd8FiURkhZABxFZkjkoLbGMHcdeV++BPwQvdkLtQ9/TC6KbwTmHYJHooqIvkAHQA0f0yMw==", "requires": { - "@ionic/vue": "8.6.5" + "@ionic/vue": "8.7.0" } }, "@jridgewell/sourcemap-codec": { @@ -2183,11 +2301,76 @@ "dev": true }, "ionicons": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.3.1.tgz", - "integrity": "sha512-1boG4EQTBBpQ4/0PU60Yi78Iw/k8iNtKu9c0NmsbzHGnWAcwpiovG9Wi/rk5UlF+DC+CR4XDCxKo91YqvAxkww==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.13.tgz", + "integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==", "requires": { - "@stencil/core": "^4.0.3" + "@stencil/core": "^4.35.3" + }, + "dependencies": { + "@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "optional": true + }, + "@stencil/core": { + "version": "4.36.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", + "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", + "requires": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" + } + } } }, "magic-string": { diff --git a/static/code/stackblitz/v8/vue/package.json b/static/code/stackblitz/v8/vue/package.json index 3ad1d6524a3..a5aff493ef4 100644 --- a/static/code/stackblitz/v8/vue/package.json +++ b/static/code/stackblitz/v8/vue/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@ionic/vue": "8.6.5", - "@ionic/vue-router": "8.6.5", + "@ionic/vue": "8.7.0", + "@ionic/vue-router": "8.7.0", "vue": "^3.2.25", "vue-router": "4.5.1" }, From f4a7449a567b7d63825a585d1314086eb83703ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 10:09:16 -0400 Subject: [PATCH 12/16] chore(deps): update dependency @vitejs/plugin-vue to v6.0.1 (#4224) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../code/stackblitz/v7/vue/package-lock.json | 28 +++++++++---------- .../code/stackblitz/v8/vue/package-lock.json | 28 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/static/code/stackblitz/v7/vue/package-lock.json b/static/code/stackblitz/v7/vue/package-lock.json index 86ec845890f..4a6001fdc67 100644 --- a/static/code/stackblitz/v7/vue/package-lock.json +++ b/static/code/stackblitz/v7/vue/package-lock.json @@ -495,9 +495,9 @@ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -779,12 +779,12 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", - "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", "dev": true, "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.19" + "@rolldown/pluginutils": "1.0.0-beta.29" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -1597,9 +1597,9 @@ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", "dev": true }, "@rollup/rollup-android-arm-eabi": { @@ -1754,12 +1754,12 @@ "dev": true }, "@vitejs/plugin-vue": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", - "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", "dev": true, "requires": { - "@rolldown/pluginutils": "1.0.0-beta.19" + "@rolldown/pluginutils": "1.0.0-beta.29" } }, "@volar/language-core": { diff --git a/static/code/stackblitz/v8/vue/package-lock.json b/static/code/stackblitz/v8/vue/package-lock.json index c036156cf93..8f3d3c9080f 100644 --- a/static/code/stackblitz/v8/vue/package-lock.json +++ b/static/code/stackblitz/v8/vue/package-lock.json @@ -496,9 +496,9 @@ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -907,12 +907,12 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", - "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", "dev": true, "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.19" + "@rolldown/pluginutils": "1.0.0-beta.29" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -1844,9 +1844,9 @@ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", "dev": true }, "@rollup/rollup-android-arm-eabi": { @@ -2067,12 +2067,12 @@ "dev": true }, "@vitejs/plugin-vue": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", - "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", "dev": true, "requires": { - "@rolldown/pluginutils": "1.0.0-beta.19" + "@rolldown/pluginutils": "1.0.0-beta.29" } }, "@volar/language-core": { From 2a77aed079fd354cd6cb1e6faecedffcb95a3b3e Mon Sep 17 00:00:00 2001 From: soundproofboot Date: Thu, 31 Jul 2025 16:37:17 -0500 Subject: [PATCH 13/16] docs(radio): add example for wrapping label text --- docs/api/radio.md | 8 ++++ .../angular/example_component_css.md | 9 ++++ .../angular/example_component_html.md | 12 ++++++ .../angular/example_component_ts.md | 12 ++++++ static/usage/v8/radio/label-wrap/demo.html | 41 +++++++++++++++++++ static/usage/v8/radio/label-wrap/index.md | 34 +++++++++++++++ .../usage/v8/radio/label-wrap/javascript.md | 22 ++++++++++ .../v8/radio/label-wrap/react/main_css.md | 9 ++++ .../v8/radio/label-wrap/react/main_tsx.md | 24 +++++++++++ static/usage/v8/radio/label-wrap/vue.md | 33 +++++++++++++++ 10 files changed, 204 insertions(+) create mode 100644 static/usage/v8/radio/label-wrap/angular/example_component_css.md create mode 100644 static/usage/v8/radio/label-wrap/angular/example_component_html.md create mode 100644 static/usage/v8/radio/label-wrap/angular/example_component_ts.md create mode 100644 static/usage/v8/radio/label-wrap/demo.html create mode 100644 static/usage/v8/radio/label-wrap/index.md create mode 100644 static/usage/v8/radio/label-wrap/javascript.md create mode 100644 static/usage/v8/radio/label-wrap/react/main_css.md create mode 100644 static/usage/v8/radio/label-wrap/react/main_tsx.md create mode 100644 static/usage/v8/radio/label-wrap/vue.md diff --git a/docs/api/radio.md b/docs/api/radio.md index 3cd52c13a4b..52194b92ce5 100644 --- a/docs/api/radio.md +++ b/docs/api/radio.md @@ -36,6 +36,14 @@ import LabelPlacement from '@site/static/usage/v8/radio/label-placement/index.md +## Label Wrapping + +Regardless of label placement, long text will not wrap by default. If the width of the radio is constrained, overflowing text will be truncated with an ellipsis. The `label` shadow part can be styled with the `::part()` selector. + +import LabelWrap from '@site/static/usage/v8/radio/label-wrap/index.md'; + + + ## Object Value References By default, the radio group uses strict equality (`===`) to determine if an option is selected. This can be overridden by providing a property name or a function to the `compareWith` property. diff --git a/static/usage/v8/radio/label-wrap/angular/example_component_css.md b/static/usage/v8/radio/label-wrap/angular/example_component_css.md new file mode 100644 index 00000000000..717b5e49bc0 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/angular/example_component_css.md @@ -0,0 +1,9 @@ +```css +ion-list { + width: 250px; +} + +ion-radio.wrapped::part(label) { + text-wrap: wrap; +} +``` diff --git a/static/usage/v8/radio/label-wrap/angular/example_component_html.md b/static/usage/v8/radio/label-wrap/angular/example_component_html.md new file mode 100644 index 00000000000..15ae87dc743 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/angular/example_component_html.md @@ -0,0 +1,12 @@ +```html + + + + Truncated with ellipsis by default + + + `text-wrap` applied to `label` shadow part + + + +``` diff --git a/static/usage/v8/radio/label-wrap/angular/example_component_ts.md b/static/usage/v8/radio/label-wrap/angular/example_component_ts.md new file mode 100644 index 00000000000..151a9f44f80 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/angular/example_component_ts.md @@ -0,0 +1,12 @@ +```ts +import { Component } from '@angular/core'; +import { IonItem, IonList, IonRadio, IonRadioGroup } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'], + imports: [IonItem, IonList, IonRadio, IonRadioGroup], +}) +export class ExampleComponent {} +``` diff --git a/static/usage/v8/radio/label-wrap/demo.html b/static/usage/v8/radio/label-wrap/demo.html new file mode 100644 index 00000000000..73c64c7f4a3 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/demo.html @@ -0,0 +1,41 @@ + + + + + + Radio + + + + + + + + + + + +
+ + + + Truncated with ellipsis by default + + + `text-wrap` applied to `label` shadow part + + + +
+
+
+ + diff --git a/static/usage/v8/radio/label-wrap/index.md b/static/usage/v8/radio/label-wrap/index.md new file mode 100644 index 00000000000..95f743485e5 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/index.md @@ -0,0 +1,34 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; + +import react_main_tsx from './react/main_tsx.md'; +import react_main_css from './react/main_css.md'; + +import vue from './vue.md'; + +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_css from './angular/example_component_css.md'; +import angular_example_component_ts from './angular/example_component_ts.md'; + + diff --git a/static/usage/v8/radio/label-wrap/javascript.md b/static/usage/v8/radio/label-wrap/javascript.md new file mode 100644 index 00000000000..953d7644394 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/javascript.md @@ -0,0 +1,22 @@ +```html + + + + Truncated with ellipsis by default + + + `text-wrap` applied to `label` shadow part + + + + + +``` diff --git a/static/usage/v8/radio/label-wrap/react/main_css.md b/static/usage/v8/radio/label-wrap/react/main_css.md new file mode 100644 index 00000000000..717b5e49bc0 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/react/main_css.md @@ -0,0 +1,9 @@ +```css +ion-list { + width: 250px; +} + +ion-radio.wrapped::part(label) { + text-wrap: wrap; +} +``` diff --git a/static/usage/v8/radio/label-wrap/react/main_tsx.md b/static/usage/v8/radio/label-wrap/react/main_tsx.md new file mode 100644 index 00000000000..8dbffdfb4e0 --- /dev/null +++ b/static/usage/v8/radio/label-wrap/react/main_tsx.md @@ -0,0 +1,24 @@ +```tsx +import React from 'react'; +import { IonList, IonItem, IonRadio, IonRadioGroup } from '@ionic/react'; + +import './main.css'; + +function Example() { + return ( + + + + Truncated with ellipsis by default + + + + `text-wrap` applied to `label` shadow part + + + + + ); +} +export default Example; +``` diff --git a/static/usage/v8/radio/label-wrap/vue.md b/static/usage/v8/radio/label-wrap/vue.md new file mode 100644 index 00000000000..d92af41ae8f --- /dev/null +++ b/static/usage/v8/radio/label-wrap/vue.md @@ -0,0 +1,33 @@ +```html + + + + + +``` From 4e03158a0c0b1c7c71769755c54c7918a01025d6 Mon Sep 17 00:00:00 2001 From: soundproofboot Date: Wed, 6 Aug 2025 12:12:50 -0500 Subject: [PATCH 14/16] docs(radio): update wrapping example to include ion-text-wrap utility class --- .../radio/label-wrap/angular/example_component_html.md | 7 ++++++- static/usage/v8/radio/label-wrap/demo.html | 9 ++++++++- static/usage/v8/radio/label-wrap/javascript.md | 7 ++++++- static/usage/v8/radio/label-wrap/react/main_tsx.md | 9 +++++++-- static/usage/v8/radio/label-wrap/vue.md | 7 ++++++- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/static/usage/v8/radio/label-wrap/angular/example_component_html.md b/static/usage/v8/radio/label-wrap/angular/example_component_html.md index 15ae87dc743..0837d088fab 100644 --- a/static/usage/v8/radio/label-wrap/angular/example_component_html.md +++ b/static/usage/v8/radio/label-wrap/angular/example_component_html.md @@ -5,7 +5,12 @@ Truncated with ellipsis by default - `text-wrap` applied to `label` shadow part + Wrapping with text-wrap applied to label shadow part + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
diff --git a/static/usage/v8/radio/label-wrap/demo.html b/static/usage/v8/radio/label-wrap/demo.html index 73c64c7f4a3..24105fff9db 100644 --- a/static/usage/v8/radio/label-wrap/demo.html +++ b/static/usage/v8/radio/label-wrap/demo.html @@ -30,7 +30,14 @@ Truncated with ellipsis by default - `text-wrap` applied to `label` shadow part + + Wrapping with text-wrap applied to label shadow part + + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
diff --git a/static/usage/v8/radio/label-wrap/javascript.md b/static/usage/v8/radio/label-wrap/javascript.md index 953d7644394..3191c3d27b5 100644 --- a/static/usage/v8/radio/label-wrap/javascript.md +++ b/static/usage/v8/radio/label-wrap/javascript.md @@ -5,7 +5,12 @@ Truncated with ellipsis by default - `text-wrap` applied to `label` shadow part + Wrapping with text-wrap applied to label shadow part + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
diff --git a/static/usage/v8/radio/label-wrap/react/main_tsx.md b/static/usage/v8/radio/label-wrap/react/main_tsx.md index 8dbffdfb4e0..25b4d4618dc 100644 --- a/static/usage/v8/radio/label-wrap/react/main_tsx.md +++ b/static/usage/v8/radio/label-wrap/react/main_tsx.md @@ -12,8 +12,13 @@ function Example() { Truncated with ellipsis by default - - `text-wrap` applied to `label` shadow part + + Wrapping with text-wrap applied to label shadow part + + + + +
Wrapping with ion-text-wrap class applied wrapper element
diff --git a/static/usage/v8/radio/label-wrap/vue.md b/static/usage/v8/radio/label-wrap/vue.md index d92af41ae8f..b8fe29c8236 100644 --- a/static/usage/v8/radio/label-wrap/vue.md +++ b/static/usage/v8/radio/label-wrap/vue.md @@ -6,7 +6,12 @@ Truncated with ellipsis by default - `text-wrap` applied to `label` shadow part + Wrapping with text-wrap applied to label shadow part + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
From 3a4b4ed5fc90bf48f463b4f215a83faa237587c2 Mon Sep 17 00:00:00 2001 From: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> Date: Fri, 8 Aug 2025 15:56:40 -0400 Subject: [PATCH 15/16] docs(radio): small updates for wrapping demo --- docs/api/radio.md | 2 +- .../usage/v8/radio/label-wrap/angular/example_component_css.md | 2 +- static/usage/v8/radio/label-wrap/demo.html | 2 +- static/usage/v8/radio/label-wrap/javascript.md | 2 +- static/usage/v8/radio/label-wrap/react/main_css.md | 2 +- static/usage/v8/radio/label-wrap/vue.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/api/radio.md b/docs/api/radio.md index 52194b92ce5..62a86923dda 100644 --- a/docs/api/radio.md +++ b/docs/api/radio.md @@ -38,7 +38,7 @@ import LabelPlacement from '@site/static/usage/v8/radio/label-placement/index.md ## Label Wrapping -Regardless of label placement, long text will not wrap by default. If the width of the radio is constrained, overflowing text will be truncated with an ellipsis. The `label` shadow part can be styled with the `::part()` selector. +Regardless of label placement, long text will not wrap by default. If the width of the radio is constrained, overflowing text will be truncated with an ellipsis. You can enable text wrapping by adding the `ion-text-wrap` class to a wrapper around the radio text or styling the `label` shadow part using the `::part()` selector. import LabelWrap from '@site/static/usage/v8/radio/label-wrap/index.md'; diff --git a/static/usage/v8/radio/label-wrap/angular/example_component_css.md b/static/usage/v8/radio/label-wrap/angular/example_component_css.md index 717b5e49bc0..ec109440a50 100644 --- a/static/usage/v8/radio/label-wrap/angular/example_component_css.md +++ b/static/usage/v8/radio/label-wrap/angular/example_component_css.md @@ -4,6 +4,6 @@ ion-list { } ion-radio.wrapped::part(label) { - text-wrap: wrap; + white-space: normal; } ``` diff --git a/static/usage/v8/radio/label-wrap/demo.html b/static/usage/v8/radio/label-wrap/demo.html index 24105fff9db..6f8f030bcf2 100644 --- a/static/usage/v8/radio/label-wrap/demo.html +++ b/static/usage/v8/radio/label-wrap/demo.html @@ -15,7 +15,7 @@ } ion-radio.wrapped::part(label) { - text-wrap: wrap; + white-space: normal; } diff --git a/static/usage/v8/radio/label-wrap/javascript.md b/static/usage/v8/radio/label-wrap/javascript.md index 3191c3d27b5..1bce1a8fd7a 100644 --- a/static/usage/v8/radio/label-wrap/javascript.md +++ b/static/usage/v8/radio/label-wrap/javascript.md @@ -21,7 +21,7 @@ } ion-radio.wrapped::part(label) { - text-wrap: wrap; + white-space: normal; } ``` diff --git a/static/usage/v8/radio/label-wrap/react/main_css.md b/static/usage/v8/radio/label-wrap/react/main_css.md index 717b5e49bc0..ec109440a50 100644 --- a/static/usage/v8/radio/label-wrap/react/main_css.md +++ b/static/usage/v8/radio/label-wrap/react/main_css.md @@ -4,6 +4,6 @@ ion-list { } ion-radio.wrapped::part(label) { - text-wrap: wrap; + white-space: normal; } ``` diff --git a/static/usage/v8/radio/label-wrap/vue.md b/static/usage/v8/radio/label-wrap/vue.md index b8fe29c8236..ecabbadb8b1 100644 --- a/static/usage/v8/radio/label-wrap/vue.md +++ b/static/usage/v8/radio/label-wrap/vue.md @@ -32,7 +32,7 @@ } ion-radio.wrapped::part(label) { - text-wrap: wrap; + white-space: normal; } ``` From 69a4d2cb4020693f59ed4e693c1ffd468641233a Mon Sep 17 00:00:00 2001 From: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> Date: Fri, 8 Aug 2025 16:01:53 -0400 Subject: [PATCH 16/16] docs(radio): copy example to v7 docs --- .../angular/example_component_css.md | 9 ++++ .../angular/example_component_html.md | 17 +++++++ .../angular/example_component_ts.md | 12 +++++ static/usage/v7/radio/label-wrap/demo.html | 48 +++++++++++++++++++ static/usage/v7/radio/label-wrap/index.md | 34 +++++++++++++ .../usage/v7/radio/label-wrap/javascript.md | 27 +++++++++++ .../v7/radio/label-wrap/react/main_css.md | 9 ++++ .../v7/radio/label-wrap/react/main_tsx.md | 29 +++++++++++ static/usage/v7/radio/label-wrap/vue.md | 38 +++++++++++++++ versioned_docs/version-v7/api/radio.md | 8 ++++ 10 files changed, 231 insertions(+) create mode 100644 static/usage/v7/radio/label-wrap/angular/example_component_css.md create mode 100644 static/usage/v7/radio/label-wrap/angular/example_component_html.md create mode 100644 static/usage/v7/radio/label-wrap/angular/example_component_ts.md create mode 100644 static/usage/v7/radio/label-wrap/demo.html create mode 100644 static/usage/v7/radio/label-wrap/index.md create mode 100644 static/usage/v7/radio/label-wrap/javascript.md create mode 100644 static/usage/v7/radio/label-wrap/react/main_css.md create mode 100644 static/usage/v7/radio/label-wrap/react/main_tsx.md create mode 100644 static/usage/v7/radio/label-wrap/vue.md diff --git a/static/usage/v7/radio/label-wrap/angular/example_component_css.md b/static/usage/v7/radio/label-wrap/angular/example_component_css.md new file mode 100644 index 00000000000..ec109440a50 --- /dev/null +++ b/static/usage/v7/radio/label-wrap/angular/example_component_css.md @@ -0,0 +1,9 @@ +```css +ion-list { + width: 250px; +} + +ion-radio.wrapped::part(label) { + white-space: normal; +} +``` diff --git a/static/usage/v7/radio/label-wrap/angular/example_component_html.md b/static/usage/v7/radio/label-wrap/angular/example_component_html.md new file mode 100644 index 00000000000..0837d088fab --- /dev/null +++ b/static/usage/v7/radio/label-wrap/angular/example_component_html.md @@ -0,0 +1,17 @@ +```html + + + + Truncated with ellipsis by default + + + Wrapping with text-wrap applied to label shadow part + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
+
+
+
+``` diff --git a/static/usage/v7/radio/label-wrap/angular/example_component_ts.md b/static/usage/v7/radio/label-wrap/angular/example_component_ts.md new file mode 100644 index 00000000000..151a9f44f80 --- /dev/null +++ b/static/usage/v7/radio/label-wrap/angular/example_component_ts.md @@ -0,0 +1,12 @@ +```ts +import { Component } from '@angular/core'; +import { IonItem, IonList, IonRadio, IonRadioGroup } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'], + imports: [IonItem, IonList, IonRadio, IonRadioGroup], +}) +export class ExampleComponent {} +``` diff --git a/static/usage/v7/radio/label-wrap/demo.html b/static/usage/v7/radio/label-wrap/demo.html new file mode 100644 index 00000000000..6f8f030bcf2 --- /dev/null +++ b/static/usage/v7/radio/label-wrap/demo.html @@ -0,0 +1,48 @@ + + + + + + Radio + + + + + + + + + + + +
+ + + + Truncated with ellipsis by default + + + + Wrapping with text-wrap applied to label shadow part + + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
+
+
+
+
+
+
+ + diff --git a/static/usage/v7/radio/label-wrap/index.md b/static/usage/v7/radio/label-wrap/index.md new file mode 100644 index 00000000000..95f743485e5 --- /dev/null +++ b/static/usage/v7/radio/label-wrap/index.md @@ -0,0 +1,34 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; + +import react_main_tsx from './react/main_tsx.md'; +import react_main_css from './react/main_css.md'; + +import vue from './vue.md'; + +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_css from './angular/example_component_css.md'; +import angular_example_component_ts from './angular/example_component_ts.md'; + + diff --git a/static/usage/v7/radio/label-wrap/javascript.md b/static/usage/v7/radio/label-wrap/javascript.md new file mode 100644 index 00000000000..1bce1a8fd7a --- /dev/null +++ b/static/usage/v7/radio/label-wrap/javascript.md @@ -0,0 +1,27 @@ +```html + + + + Truncated with ellipsis by default + + + Wrapping with text-wrap applied to label shadow part + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
+
+
+
+ + +``` diff --git a/static/usage/v7/radio/label-wrap/react/main_css.md b/static/usage/v7/radio/label-wrap/react/main_css.md new file mode 100644 index 00000000000..ec109440a50 --- /dev/null +++ b/static/usage/v7/radio/label-wrap/react/main_css.md @@ -0,0 +1,9 @@ +```css +ion-list { + width: 250px; +} + +ion-radio.wrapped::part(label) { + white-space: normal; +} +``` diff --git a/static/usage/v7/radio/label-wrap/react/main_tsx.md b/static/usage/v7/radio/label-wrap/react/main_tsx.md new file mode 100644 index 00000000000..25b4d4618dc --- /dev/null +++ b/static/usage/v7/radio/label-wrap/react/main_tsx.md @@ -0,0 +1,29 @@ +```tsx +import React from 'react'; +import { IonList, IonItem, IonRadio, IonRadioGroup } from '@ionic/react'; + +import './main.css'; + +function Example() { + return ( + + + + Truncated with ellipsis by default + + + + Wrapping with text-wrap applied to label shadow part + + + + +
Wrapping with ion-text-wrap class applied wrapper element
+
+
+
+
+ ); +} +export default Example; +``` diff --git a/static/usage/v7/radio/label-wrap/vue.md b/static/usage/v7/radio/label-wrap/vue.md new file mode 100644 index 00000000000..ecabbadb8b1 --- /dev/null +++ b/static/usage/v7/radio/label-wrap/vue.md @@ -0,0 +1,38 @@ +```html + + + + + +``` diff --git a/versioned_docs/version-v7/api/radio.md b/versioned_docs/version-v7/api/radio.md index c470a326ed6..8cec4707042 100644 --- a/versioned_docs/version-v7/api/radio.md +++ b/versioned_docs/version-v7/api/radio.md @@ -39,6 +39,14 @@ import LabelPlacement from '@site/static/usage/v7/radio/label-placement/index.md +## Label Wrapping + +Regardless of label placement, long text will not wrap by default. If the width of the radio is constrained, overflowing text will be truncated with an ellipsis. You can enable text wrapping by adding the `ion-text-wrap` class to a wrapper around the radio text or styling the `label` shadow part using the `::part()` selector. + +import LabelWrap from '@site/static/usage/v7/radio/label-wrap/index.md'; + + + ## Object Value References By default, the radio group uses strict equality (`===`) to determine if an option is selected. This can be overridden by providing a property name or a function to the `compareWith` property.
` element. | +| `.ion-display-table-row` | `display: table-row` | The element behaves like an HTML `