Skip to content

docs(textarea): update icon playgrounds to use addIcons usage #3753

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/api/textarea.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ In most cases, [Icon](./icon.md) components placed in these slots should have `a
If slot content is meant to be interacted with, it should be wrapped in an interactive element such as a [Button](./button.md). This ensures that the content can be tabbed to.
:::

import StartEndSlots from '@site/static/usage/v7/textarea/start-end-slots/index.md';
import StartEndSlots from '@site/static/usage/v8/textarea/start-end-slots/index.md';

<StartEndSlots />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
```ts
import { Component } from '@angular/core';

import { addIcons } from 'ionicons';
import { eye, lockClosed } from 'ionicons/icons';

@Component({
selector: 'app-example',
templateUrl: 'example.component.html',
styleUrls: ['example.component.css'],
})
export class ExampleComponent {
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({ eye, lockClosed });
}
}
```
4 changes: 2 additions & 2 deletions static/usage/v7/textarea/start-end-slots/demo.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Textarea</title>
<link rel="stylesheet" href="../../../common.css" />
<script src="../../../common.js"></script>
<link rel="stylesheet" href="../../common.css" />
<script src="../../common.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@ionic/core@7/dist/ionic/ionic.esm.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ionic/core@7/css/ionic.bundle.css" />
</head>
Expand Down
28 changes: 24 additions & 4 deletions static/usage/v7/textarea/start-end-slots/index.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,37 @@
import Playground from '@site/src/components/global/Playground';

import javascript from './javascript.md';
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 from './angular.md';

import angular_example_component_html from './angular/example_component_html.md';
import angular_example_component_ts from './angular/example_component_ts.md';

<Playground
version="7"
code={{
javascript,
javascript: {
files: {
'index.html': javascript_index_html,
'index.ts': javascript_index_ts,
},
dependencies: {
ionicons: '7.4.0',
},
},
react,
vue,
angular,
angular: {
files: {
'src/app/example.component.html': angular_example_component_html,
'src/app/example.component.ts': angular_example_component_ts,
},
dependencies: {
ionicons: '7.4.0',
},
},
}}
src="usage/v7/textarea/start-end-slots/demo.html"
/>
35 changes: 35 additions & 0 deletions static/usage/v7/textarea/start-end-slots/javascript/index_ts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
```ts
import { defineCustomElements } from '@ionic/core/loader';

import { addIcons } from 'ionicons';
import { eye, lockClosed } 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';

/* Theme variables */
import './theme/variables.css';

/**
* On Ionicons 7.2+ these icons
* get mapped to a kebab-case key.
* Alternatively, developers can do:
* addIcons({ 'eye': eye, 'lock-closed': lockClosed });
*/
addIcons({ eye, lockClosed });

defineCustomElements();
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
```html
<ion-list>
<ion-item>
<ion-textarea labelPlacement="stacked" label="Comments" placeholder="Enter your comments">
<ion-icon slot="start" name="lock-closed" aria-hidden="true"></ion-icon>
<ion-button fill="clear" slot="end" aria-label="Show/hide">
<ion-icon slot="icon-only" name="eye" aria-hidden="true"></ion-icon>
</ion-button>
</ion-textarea>
</ion-item>
</ion-list>
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
```ts
import { Component } from '@angular/core';

import { addIcons } from 'ionicons';
import { eye, lockClosed } from 'ionicons/icons';

@Component({
selector: 'app-example',
templateUrl: 'example.component.html',
styleUrls: ['example.component.css'],
})
export class ExampleComponent {
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({ eye, lockClosed });
}
}
```
31 changes: 31 additions & 0 deletions static/usage/v8/textarea/start-end-slots/demo.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Textarea</title>
<link rel="stylesheet" href="../../common.css" />
<script src="../../common.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@ionic/core@8/dist/ionic/ionic.esm.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ionic/core@8/css/ionic.bundle.css" />
</head>

<body>
<ion-app>
<ion-content>
<div class="container">
<ion-list>
<ion-item>
<ion-textarea label-placement="stacked" label="Comments" placeholder="Enter your comments">
<ion-icon slot="start" name="lock-closed" aria-hidden="true"></ion-icon>
<ion-button fill="clear" slot="end" aria-label="Show/hide">
<ion-icon slot="icon-only" name="eye" aria-hidden="true"></ion-icon>
</ion-button>
</ion-textarea>
</ion-item>
</ion-list>
</div>
</ion-content>
</ion-app>
</body>
</html>
37 changes: 37 additions & 0 deletions static/usage/v8/textarea/start-end-slots/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
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';

<Playground
version="8"
code={{
javascript: {
files: {
'index.html': javascript_index_html,
'index.ts': javascript_index_ts,
},
dependencies: {
ionicons: '7.4.0',
},
},
react,
vue,
angular: {
files: {
'src/app/example.component.html': angular_example_component_html,
'src/app/example.component.ts': angular_example_component_ts,
},
dependencies: {
ionicons: '7.4.0',
},
},
}}
src="usage/v8/textarea/start-end-slots/demo.html"
/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
```html
<ion-list>
<ion-item>
<ion-textarea label-placement="stacked" label="Comments" placeholder="Enter your comments">
<ion-icon slot="start" name="lock-closed" aria-hidden="true"></ion-icon>
<ion-button fill="clear" slot="end" aria-label="Show/hide">
<ion-icon slot="icon-only" name="eye" aria-hidden="true"></ion-icon>
</ion-button>
</ion-textarea>
</ion-item>
</ion-list>
```
46 changes: 46 additions & 0 deletions static/usage/v8/textarea/start-end-slots/javascript/index_ts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
```ts
import { defineCustomElements } from '@ionic/core/loader';

import { addIcons } from 'ionicons';
import { eye, lockClosed } 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 Theme
* -----------------------------------------------------
* 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 a kebab-case key.
* Alternatively, developers can do:
* addIcons({ 'eye': eye, 'lock-closed': lockClosed });
*/
addIcons({ eye, lockClosed });

defineCustomElements();
```
21 changes: 21 additions & 0 deletions static/usage/v8/textarea/start-end-slots/react.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
```tsx
import React from 'react';
import { IonButton, IonIcon, IonItem, IonList, IonTextarea } from '@ionic/react';
import { eye, lockClosed } from 'ionicons/icons';

function Example() {
return (
<IonList>
<IonItem>
<IonTextarea labelPlacement="stacked" label="Comments" placeholder="Enter your comments">
<IonIcon slot="start" icon={lockClosed} aria-hidden="true"></IonIcon>
<IonButton fill="clear" slot="end" aria-label="Show/hide">
<IonIcon slot="icon-only" name={eye} aria-hidden="true"></IonIcon>
</IonButton>
</IonTextarea>
</IonItem>
</IonList>
);
}
export default Example;
```
33 changes: 33 additions & 0 deletions static/usage/v8/textarea/start-end-slots/vue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
```html
<template>
<ion-list>
<ion-item>
<ion-textarea label-placement="stacked" label="Comments" placeholder="Enter your comments">
<ion-icon slot="start" :icon="lockClosed" aria-hidden="true"></ion-icon>
<ion-button fill="clear" slot="end" aria-label="Show/hide">
<ion-icon slot="icon-only" :icon="eye" aria-hidden="true"></ion-icon>
</ion-button>
</ion-textarea>
</ion-item>
</ion-list>
</template>

<script lang="ts">
import { IonButton, IonIcon, IonItem, IonList, IonTextarea } from '@ionic/vue';
import { eye, lockClosed } from 'ionicons/icons';
import { defineComponent } from 'vue';

export default defineComponent({
components: {
IonButton,
IonIcon,
IonItem,
IonList,
IonTextarea,
},
setup() {
return { eye, lockClosed };
},
});
</script>
```
16 changes: 16 additions & 0 deletions versioned_docs/version-v7/api/textarea.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,22 @@ import ClearOnEditPlayground from '@site/static/usage/v7/textarea/clear-on-edit/

<ClearOnEditPlayground />

## Start and End Slots (experimental)

The `start` and `end` slots can be used to place icons, buttons, or prefix/suffix text on either side of the textarea.

Note that this feature is considered experimental because it relies on a simulated version of [Web Component slots](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots). As a result, the simulated behavior may not exactly match the native slot behavior.

:::note
In most cases, [Icon](./icon.md) components placed in these slots should have `aria-hidden="true"`. See the [Icon accessibility docs](https://ionicframework.com/docs/api/icon#accessibility) for more information.

If slot content is meant to be interacted with, it should be wrapped in an interactive element such as a [Button](./button.md). This ensures that the content can be tabbed to.
:::

import StartEndSlots from '@site/static/usage/v7/textarea/start-end-slots/index.md';

<StartEndSlots />

## 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.
Expand Down