From e541696d160fa2f8d4f0945fb0a1d96b5210d103 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Mon, 1 Aug 2022 08:59:39 -0400 Subject: [PATCH 001/469] docs(datetime-button): add base usage example (#2464) --- docs/api/datetime-button.md | 76 +++++++++++++++++++ docs/api/datetime.md | 4 + sidebars.js | 2 +- static/usage/datetime-button/basic/angular.md | 9 +++ static/usage/datetime-button/basic/demo.html | 30 ++++++++ static/usage/datetime-button/basic/index.md | 8 ++ .../usage/datetime-button/basic/javascript.md | 7 ++ static/usage/datetime-button/basic/react.md | 14 ++++ static/usage/datetime-button/basic/vue.md | 18 +++++ 9 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 docs/api/datetime-button.md create mode 100644 static/usage/datetime-button/basic/angular.md create mode 100644 static/usage/datetime-button/basic/demo.html create mode 100644 static/usage/datetime-button/basic/index.md create mode 100644 static/usage/datetime-button/basic/javascript.md create mode 100644 static/usage/datetime-button/basic/react.md create mode 100644 static/usage/datetime-button/basic/vue.md diff --git a/docs/api/datetime-button.md b/docs/api/datetime-button.md new file mode 100644 index 00000000000..d13e5dcdf0d --- /dev/null +++ b/docs/api/datetime-button.md @@ -0,0 +1,76 @@ +--- +title: "ion-datetime-button" +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +import Props from '@site/static/auto-generated/datetime-button/props.md'; +import Events from '@site/static/auto-generated/datetime-button/events.md'; +import Methods from '@site/static/auto-generated/datetime-button/methods.md'; +import Parts from '@site/static/auto-generated/datetime-button/parts.md'; +import CustomProps from '@site/static/auto-generated/datetime-button/custom-props.md'; +import Slots from '@site/static/auto-generated/datetime-button/slots.md'; + + + ion-datetime-button: Ionic API Input for interacting with Datetime picker + + + +import EncapsulationPill from '@components/page/api/EncapsulationPill'; +import APITOCInline from '@components/page/api/APITOCInline'; + + + +Datetime Button links with a [Datetime](./datetime) component to display the formatted date and time. It also provides buttons to present the datetime in a modal, popover, and more. + +## Overview + +Datetime Button should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay. + +When using Datetime Button with a JavaScript framework such as Angular, React, or Vue be sure to use the [keepContentsMounted property on ion-modal](./modal#keepcontentsmounted) or the [keepContentsMounted property on ion-popover](./popover#keepcontentsmounted). This allows the linked datetime instance to be mounted even if the overlay has not been presented yet. + +## Basic Usage + +import Basic from '@site/static/usage/datetime-button/basic/index.md'; + + + +## Localization + +The localized text on `ion-datetime-button` is determined by the `locale` property on the associated `ion-datetime` instance. See [Datetime Localization](./datetime#localization) for more details. + +## Usage with Modals and Popovers + +`ion-datetime-button` must be associated with a mounted `ion-datetime` instance. As a result, [Inline Modals](./modal#inline-modals-recommended) and [Inline Popovers](./popover#inline-popovers) with the `keepContentsMounted` property set to `true` must be used. + + + +## Properties + + +## Events + + +## Methods + + +## CSS Shadow Parts + + +## CSS Custom Properties + + +## Slots + diff --git a/docs/api/datetime.md b/docs/api/datetime.md index 9770cef8b7e..4e051a731af 100644 --- a/docs/api/datetime.md +++ b/docs/api/datetime.md @@ -94,6 +94,10 @@ While seconds and milliseconds can be specified using the ISO 8601 datetime form +## Usage with Datetime Button + +If you need to present a datetime in an overlay such as a modal or a popover, we recommend using [ion-datetime-button](./datetime-button). `ion-datetime-button` should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay. + ## Date Constraints ### Max and Min Dates diff --git a/sidebars.js b/sidebars.js index 4ab111c7ae3..e6231ae0a68 100644 --- a/sidebars.js +++ b/sidebars.js @@ -287,7 +287,7 @@ module.exports = { type: 'category', label: 'Date & Time Pickers', collapsed: false, - items: ['api/datetime', 'api/picker'], + items: ['api/datetime', 'api/datetime-button', 'api/picker'], }, { type: 'category', diff --git a/static/usage/datetime-button/basic/angular.md b/static/usage/datetime-button/basic/angular.md new file mode 100644 index 00000000000..80a6ffe3724 --- /dev/null +++ b/static/usage/datetime-button/basic/angular.md @@ -0,0 +1,9 @@ +```html + + + + + + + +``` diff --git a/static/usage/datetime-button/basic/demo.html b/static/usage/datetime-button/basic/demo.html new file mode 100644 index 00000000000..8271b6ee9cf --- /dev/null +++ b/static/usage/datetime-button/basic/demo.html @@ -0,0 +1,30 @@ + + + + + + Datetime + + + + + + + + + +
+ + + + + +
+
+
+ + diff --git a/static/usage/datetime-button/basic/index.md b/static/usage/datetime-button/basic/index.md new file mode 100644 index 00000000000..55e9b3155a1 --- /dev/null +++ b/static/usage/datetime-button/basic/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/datetime-button/basic/javascript.md b/static/usage/datetime-button/basic/javascript.md new file mode 100644 index 00000000000..3b39203bb90 --- /dev/null +++ b/static/usage/datetime-button/basic/javascript.md @@ -0,0 +1,7 @@ +```html + + + + + +``` diff --git a/static/usage/datetime-button/basic/react.md b/static/usage/datetime-button/basic/react.md new file mode 100644 index 00000000000..2fe97bd73a0 --- /dev/null +++ b/static/usage/datetime-button/basic/react.md @@ -0,0 +1,14 @@ +```tsx +import React from 'react'; +import { IonDatetime, IonDatetimeButton, IonModal } from '@ionic/react'; +function Example() { + return ( + + + + + + ); +} +export default Example; +``` diff --git a/static/usage/datetime-button/basic/vue.md b/static/usage/datetime-button/basic/vue.md new file mode 100644 index 00000000000..1272d768b88 --- /dev/null +++ b/static/usage/datetime-button/basic/vue.md @@ -0,0 +1,18 @@ +```html + + + +``` From fd16a4f58a9f117ea3b5532df86d2bcf71bb63ad Mon Sep 17 00:00:00 2001 From: Amirreza Aliakbari Date: Tue, 2 Aug 2022 18:40:54 +0430 Subject: [PATCH 002/469] docs(vue): fix typo in router.go docs (#2472) --- docs/vue/navigation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/vue/navigation.md b/docs/vue/navigation.md index f5a995e9e85..e6fe6fc64dd 100644 --- a/docs/vue/navigation.md +++ b/docs/vue/navigation.md @@ -204,7 +204,7 @@ Say you have the following application history: If you were to call `router.go(-2)` on `/pageC`, you would be brought back to `/pageA`. If you then called `router.go(2)`, you would be brought to `/pageC`. -An key characteristic of `router.go()` is that it expects your application history to be linear. This means that `router.go()` should not be used in applications that make use of non-linear routing. See [Linear Routing versus Non-Linear Routing](#linear-routing-versus-non-linear-routing) for more information. +A key characteristic of `router.go()` is that it expects your application history to be linear. This means that `router.go()` should not be used in applications that make use of non-linear routing. See [Linear Routing versus Non-Linear Routing](#linear-routing-versus-non-linear-routing) for more information. ## Lazy Loading Routes From c8759fd0671de26a3b0fd5d0fe4ee623bf585345 Mon Sep 17 00:00:00 2001 From: Sean Perkins Date: Tue, 2 Aug 2022 10:31:35 -0400 Subject: [PATCH 003/469] fix(playground): order framework buttons alphabetically (#2475) --- src/components/global/Playground/index.tsx | 28 ++++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/components/global/Playground/index.tsx b/src/components/global/Playground/index.tsx index 889a1326a64..8951c59f7cd 100644 --- a/src/components/global/Playground/index.tsx +++ b/src/components/global/Playground/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import useBaseUrl from '@docusaurus/useBaseUrl'; import './playground.css'; @@ -115,7 +115,7 @@ export default function Playground({ * or an explicit pixel value. */ const frameSize = FRAME_SIZES[size] || size; - const [usageTarget, setUsageTarget] = useState(UsageTarget.JavaScript); + const [usageTarget, setUsageTarget] = useState(UsageTarget.Angular); const [mode, setMode] = useState(Mode.iOS); const [codeSnippets, setCodeSnippets] = useState({}); const [renderIframes, setRenderIframes] = useState(false); @@ -322,16 +322,20 @@ export default function Playground({ function renderLoadingScreen() { return ( -
- ) +
+ +
+ ); } + const sortedUsageTargets = useMemo(() => Object.keys(UsageTarget).sort(), []); + return (
- {Object.keys(UsageTarget).map((lang) => ( + {sortedUsageTargets.map((lang) => (
- { renderIframes ? [ -
- {!iframesLoaded && renderLoadingScreen()} - {/* + {renderIframes + ? [ +
+ {!iframesLoaded && renderLoadingScreen()} + {/* We render two iframes, one for each mode. When the set mode changes, we hide one frame and show the other. This is done to avoid flickering @@ -479,10 +484,7 @@ export default function Playground({ ] : []}
-
+
{renderCodeSnippets()}
From 34b5d07192b7ecef128c0b127242c216716d41b5 Mon Sep 17 00:00:00 2001 From: Sean Perkins Date: Wed, 3 Aug 2022 13:40:33 -0400 Subject: [PATCH 004/469] feat(playground): auto-inject ion-content and ion-app (#2440) --- src/components/global/Playground/README.md | 69 ++++++++++ src/components/global/Playground/index.tsx | 22 +++- .../global/Playground/stackblitz.utils.ts | 40 +++--- .../stackblitz/angular/app.component.html | 3 + .../angular/app.component.withContent.html | 5 + static/code/stackblitz/angular/app.module.ts | 6 +- .../stackblitz/angular/example.component.ts | 8 ++ static/code/stackblitz/html/index.html | 7 +- .../stackblitz/html/index.withContent.html | 16 +++ static/code/stackblitz/react/app.tsx | 8 +- .../code/stackblitz/react/app.withContent.tsx | 28 ++++ .../code/stackblitz/vue/App.withContent.vue | 20 +++ .../accessibility/animations/angular.md | 48 +++---- .../accessibility/animations/javascript.md | 2 - .../accessibility/animations/react.md | 62 ++++----- .../accordion/accessibility/animations/vue.md | 66 ++++------ .../angular/angular-ts.md | 11 +- .../advanced-expansion-styles/index.md | 12 +- .../react/react-ts.md | 9 +- .../accordion/customization/icons/angular.md | 48 +++---- .../customization/theming/angular.md | 30 ----- .../accordion/customization/theming/index.md | 6 +- .../usage/accordion/disable-group/angular.md | 48 +++---- .../accordion/disable-group/javascript.md | 48 +++---- static/usage/accordion/disable-group/react.md | 62 ++++----- static/usage/accordion/disable-group/vue.md | 66 ++++------ .../usage/accordion/disable/group/angular.md | 48 +++---- .../accordion/disable/group/javascript.md | 48 +++---- static/usage/accordion/disable/group/react.md | 62 ++++----- static/usage/accordion/disable/group/vue.md | 66 ++++------ .../accordion/disable/individual/angular.md | 48 +++---- .../disable/individual/javascript.md | 48 +++---- .../accordion/disable/individual/react.md | 62 ++++----- .../usage/accordion/disable/individual/vue.md | 66 ++++------ .../accordion/listen-changes/angular-html.md | 52 ++++---- .../accordion/listen-changes/angular-ts.md | 18 +-- .../usage/accordion/listen-changes/index.md | 8 +- .../accordion/listen-changes/javascript.md | 54 ++++---- .../usage/accordion/listen-changes/react.md | 29 ++--- static/usage/accordion/listen-changes/vue.md | 86 ++++++------ static/usage/accordion/multiple/angular.md | 48 +++---- static/usage/accordion/multiple/javascript.md | 48 +++---- static/usage/accordion/multiple/react.md | 68 +++++----- static/usage/accordion/multiple/vue.md | 27 +--- static/usage/accordion/toggle/angular-html.md | 52 ++++---- static/usage/accordion/toggle/angular-ts.md | 10 +- static/usage/accordion/toggle/index.md | 8 +- static/usage/accordion/toggle/javascript.md | 54 ++++---- static/usage/accordion/toggle/react.md | 19 +-- static/usage/accordion/toggle/vue.md | 80 +++++------- .../usage/alert/buttons/angular/angular_ts.md | 20 +-- static/usage/alert/buttons/index.md | 10 +- static/usage/alert/buttons/react.md | 48 ++++--- static/usage/alert/buttons/vue.md | 76 +++++------ .../alert/customization/angular/angular_ts.md | 16 +-- static/usage/alert/customization/index.md | 10 +- .../alert/customization/react/react_ts.md | 38 +++--- static/usage/alert/customization/vue.md | 20 ++- .../alert/inputs/radios/angular/angular_ts.md | 18 +-- static/usage/alert/inputs/radios/index.md | 10 +- static/usage/alert/inputs/radios/react.md | 52 ++++---- static/usage/alert/inputs/radios/vue.md | 64 +++++---- .../inputs/text-inputs/angular/angular_ts.md | 22 ++-- .../usage/alert/inputs/text-inputs/index.md | 10 +- .../usage/alert/inputs/text-inputs/react.md | 60 +++++---- static/usage/alert/inputs/text-inputs/vue.md | 72 +++++------ .../controller/angular/angular_ts.md | 10 +- .../alert/presenting/controller/index.md | 10 +- .../alert/presenting/controller/react.md | 22 ++-- .../usage/alert/presenting/controller/vue.md | 34 +++-- .../expand-on-click/angular/angular_ts.md | 6 +- .../collapsing-items/expand-on-click/index.md | 10 +- .../items-before-after/react.md | 6 +- .../items-before-after/vue.md | 78 ++++++----- .../popover-on-click/angular/angular_ts.md | 6 +- .../popover-on-click/index.md | 10 +- .../breadcrumbs/icons/icons-on-items/react.md | 6 +- .../breadcrumbs/icons/icons-on-items/vue.md | 84 ++++++------ .../breadcrumbs/styling/css-props/index.md | 14 +- .../date-constraints/advanced/angular-ts.md | 12 +- .../date-constraints/advanced/index.md | 26 ++-- static/usage/datetime/theming/angular-css.md | 28 +++- static/usage/datetime/theming/index.md | 18 +-- static/usage/loading/controller/angular/ts.md | 10 +- static/usage/loading/controller/index.md | 25 ++-- static/usage/loading/spinners/angular/ts.md | 10 +- static/usage/loading/spinners/index.md | 25 ++-- static/usage/loading/theming/angular/ts.md | 10 +- static/usage/loading/theming/index.md | 37 +++--- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 6 +- .../usage/modal/can-dismiss/boolean/index.md | 8 +- .../modal/can-dismiss/boolean/javascript.md | 56 ++++---- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 6 +- .../usage/modal/can-dismiss/function/index.md | 8 +- .../modal/can-dismiss/function/javascript.md | 50 ++++--- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 6 +- static/usage/modal/card/basic/index.md | 8 +- static/usage/modal/card/basic/javascript.md | 122 +++++++++--------- .../modal/controller/angular/app_module_ts.md | 4 +- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 6 +- static/usage/modal/controller/index.md | 9 +- static/usage/modal/controller/javascript.md | 20 ++- .../angular/app_component_html.md | 35 ----- .../angular/example_component_html.md | 33 +++++ static/usage/modal/custom-dialogs/index.md | 5 +- .../usage/modal/custom-dialogs/javascript.md | 72 +++++------ .../basic/angular/app_component_html.md | 34 ----- .../inline/basic/angular/app_module_ts.md | 16 --- .../basic/angular/example_component_html.md | 32 +++++ ...omponent_ts.md => example_component_ts.md} | 6 +- static/usage/modal/inline/basic/index.md | 11 +- static/usage/modal/inline/basic/javascript.md | 59 +++++---- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 6 +- static/usage/modal/inline/is-open/index.md | 9 +- .../usage/modal/inline/is-open/javascript.md | 52 ++++---- .../usage/modal/performance/mount/demo.html | 11 +- static/usage/modal/performance/mount/index.md | 3 +- .../modal/performance/mount/javascript.md | 19 +-- ...ponent_css.md => example_component_css.md} | 0 ...nent_html.md => example_component_html.md} | 4 +- ...omponent_ts.md => example_component_ts.md} | 8 +- .../modal/sheet/background-content/index.md | 13 +- .../sheet/background-content/javascript.md | 114 ++++++++-------- static/usage/modal/sheet/basic/angular.md | 108 ++++++++-------- static/usage/modal/sheet/basic/index.md | 1 + static/usage/modal/sheet/basic/javascript.md | 104 ++++++++------- .../modal/sheet/handle-behavior/angular.md | 46 ++++--- .../modal/sheet/handle-behavior/index.md | 1 + .../modal/sheet/handle-behavior/javascript.md | 32 +++-- .../animations/angular/app_component_html.md | 65 ---------- .../angular/example_component_html.md | 63 +++++++++ ...omponent_ts.md => example_component_ts.md} | 7 +- .../usage/modal/styling/animations/index.md | 9 +- .../usage/modal/styling/animations/react.md | 2 +- .../theming/angular/app_component_html.md | 63 --------- .../theming/angular/example_component_html.md | 61 +++++++++ .../angular/{angular_css.md => global_css.md} | 0 static/usage/modal/styling/theming/index.md | 9 +- .../modal/styling/theming/react/main_tsx.md | 2 +- .../angular/app_component_html.md | 5 - .../angular/example_component_html.md | 3 + ...omponent_ts.md => example_component_ts.md} | 6 +- static/usage/picker/multiple-column/index.md | 8 +- .../picker/multiple-column/javascript.md | 7 +- static/usage/picker/multiple-column/react.md | 10 +- static/usage/picker/multiple-column/vue.md | 8 +- .../angular/app_component_html.md | 5 - .../angular/example_component_html.md | 3 + ...omponent_ts.md => example_component_ts.md} | 6 +- static/usage/picker/single-column/index.md | 8 +- .../usage/picker/single-column/javascript.md | 7 +- static/usage/picker/single-column/react.md | 10 +- static/usage/picker/single-column/vue.md | 8 +- .../positioning/angular/angular_ts.md | 11 +- .../customization/positioning/index.md | 16 +-- .../popover/customization/sizing/react.md | 4 +- .../usage/popover/customization/sizing/vue.md | 22 ++-- .../popover/customization/styling/index.md | 8 +- .../customization/styling/react/react_ts.md | 4 +- .../popover/customization/styling/vue.md | 14 +- static/usage/popover/nested/react.md | 20 ++- static/usage/popover/nested/vue.md | 40 +++--- .../controller/angular/angular_module.md | 11 +- .../controller/angular/angular_popover_ts.md | 8 +- .../controller/angular/angular_ts.md | 14 +- .../popover/presenting/controller/index.md | 16 +-- .../popover/presenting/controller/react.md | 20 ++- .../presenting/controller/vue/vue_main.md | 48 ++++--- .../inline-isopen/angular/angular_ts.md | 7 +- .../popover/presenting/inline-isopen/index.md | 10 +- .../popover/presenting/inline-isopen/react.md | 4 +- .../popover/presenting/inline-isopen/vue.md | 22 ++-- .../presenting/inline-trigger/react.md | 4 +- .../popover/presenting/inline-trigger/vue.md | 26 ++-- static/usage/range/basic/angular.md | 4 +- static/usage/range/basic/javascript.md | 6 +- static/usage/range/basic/react.md | 8 +- static/usage/range/basic/vue.md | 8 +- .../angular/app_component_html.md | 5 - ...ponent_css.md => example_component_css.md} | 0 .../angular/example_component_html.md | 3 + static/usage/range/css-shadow-parts/index.md | 8 +- .../range/css-shadow-parts/javascript.md | 6 +- .../range/css-shadow-parts/react/main_tsx.md | 8 +- static/usage/range/css-shadow-parts/vue.md | 8 +- .../angular/app_component_html.md | 5 - ...ponent_css.md => example_component_css.md} | 0 .../angular/example_component_html.md | 3 + static/usage/range/css-variables/index.md | 8 +- .../usage/range/css-variables/javascript.md | 6 +- .../range/css-variables/react/main_tsx.md | 8 +- static/usage/range/css-variables/vue.md | 8 +- static/usage/range/dual-knobs/angular.md | 4 +- static/usage/range/dual-knobs/javascript.md | 6 +- static/usage/range/dual-knobs/react.md | 18 ++- static/usage/range/dual-knobs/vue.md | 4 +- .../angular/app_component_html.md | 6 - .../angular/example_component_html.md | 4 + ...omponent_ts.md => example_component_ts.md} | 7 +- static/usage/range/ion-change-event/index.md | 8 +- .../range/ion-change-event/javascript.md | 8 +- static/usage/range/ion-change-event/react.md | 6 +- static/usage/range/ion-change-event/vue.md | 10 +- .../angular/app_component_html.md | 11 -- .../angular/example_component_html.md | 9 ++ ...omponent_ts.md => example_component_ts.md} | 7 +- .../usage/range/ion-knob-move-event/index.md | 8 +- .../range/ion-knob-move-event/javascript.md | 18 +-- .../usage/range/ion-knob-move-event/react.md | 6 +- static/usage/range/ion-knob-move-event/vue.md | 20 ++- .../range/pins/angular/app_component_html.md | 5 - .../pins/angular/example_component_html.md | 3 + ...omponent_ts.md => example_component_ts.md} | 7 +- static/usage/range/pins/index.md | 8 +- static/usage/range/pins/javascript.md | 6 +- static/usage/range/pins/react.md | 8 +- static/usage/range/pins/vue.md | 8 +- static/usage/range/snapping-ticks/angular.md | 4 +- .../usage/range/snapping-ticks/javascript.md | 6 +- static/usage/range/snapping-ticks/react.md | 8 +- static/usage/range/snapping-ticks/vue.md | 8 +- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 9 +- .../basic/responding-to-interaction/index.md | 14 +- .../basic/responding-to-interaction/react.md | 8 +- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 15 +-- .../customization/interface-options/index.md | 14 +- .../styling-select/angular/angular-ts.md | 11 +- .../customization/styling-select/index.md | 16 +-- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 27 ++-- .../multiple-selection/index.md | 14 +- .../multiple-selection/react.md | 38 +++--- ...nent_html.md => example_component_html.md} | 0 ...omponent_ts.md => example_component_ts.md} | 23 ++-- .../using-comparewith/index.md | 14 +- .../using-comparewith/react.md | 34 +++-- 243 files changed, 2550 insertions(+), 2769 deletions(-) create mode 100644 src/components/global/Playground/README.md create mode 100644 static/code/stackblitz/angular/app.component.html create mode 100644 static/code/stackblitz/angular/app.component.withContent.html create mode 100644 static/code/stackblitz/angular/example.component.ts create mode 100644 static/code/stackblitz/html/index.withContent.html create mode 100644 static/code/stackblitz/react/app.withContent.tsx create mode 100644 static/code/stackblitz/vue/App.withContent.vue delete mode 100644 static/usage/accordion/customization/theming/angular.md rename static/usage/modal/can-dismiss/boolean/angular/{app_component_html.md => example_component_html.md} (100%) rename static/usage/modal/can-dismiss/boolean/angular/{app_component_ts.md => example_component_ts.md} (79%) rename static/usage/modal/can-dismiss/function/angular/{app_component_html.md => example_component_html.md} (100%) rename static/usage/modal/can-dismiss/function/angular/{app_component_ts.md => example_component_ts.md} (87%) rename static/usage/modal/card/basic/angular/{app_component_html.md => example_component_html.md} (100%) rename static/usage/modal/card/basic/angular/{app_component_ts.md => example_component_ts.md} (70%) rename static/usage/modal/controller/angular/{app_component_html.md => example_component_html.md} (100%) rename static/usage/modal/controller/angular/{app_component_ts.md => example_component_ts.md} (85%) delete mode 100644 static/usage/modal/custom-dialogs/angular/app_component_html.md create mode 100644 static/usage/modal/custom-dialogs/angular/example_component_html.md delete mode 100644 static/usage/modal/inline/basic/angular/app_component_html.md delete mode 100644 static/usage/modal/inline/basic/angular/app_module_ts.md create mode 100644 static/usage/modal/inline/basic/angular/example_component_html.md rename static/usage/modal/inline/basic/angular/{app_component_ts.md => example_component_ts.md} (87%) rename static/usage/modal/inline/is-open/angular/{app_component_html.md => example_component_html.md} (100%) rename static/usage/modal/inline/is-open/angular/{app_component_ts.md => example_component_ts.md} (61%) rename static/usage/modal/sheet/background-content/angular/{app_component_css.md => example_component_css.md} (100%) rename static/usage/modal/sheet/background-content/angular/{app_component_html.md => example_component_html.md} (98%) rename static/usage/modal/sheet/background-content/angular/{app_component_ts.md => example_component_ts.md} (53%) delete mode 100644 static/usage/modal/styling/animations/angular/app_component_html.md create mode 100644 static/usage/modal/styling/animations/angular/example_component_html.md rename static/usage/modal/styling/animations/angular/{app_component_ts.md => example_component_ts.md} (89%) delete mode 100644 static/usage/modal/styling/theming/angular/app_component_html.md create mode 100644 static/usage/modal/styling/theming/angular/example_component_html.md rename static/usage/modal/styling/theming/angular/{angular_css.md => global_css.md} (100%) delete mode 100644 static/usage/picker/multiple-column/angular/app_component_html.md create mode 100644 static/usage/picker/multiple-column/angular/example_component_html.md rename static/usage/picker/multiple-column/angular/{app_component_ts.md => example_component_ts.md} (94%) delete mode 100644 static/usage/picker/single-column/angular/app_component_html.md create mode 100644 static/usage/picker/single-column/angular/example_component_html.md rename static/usage/picker/single-column/angular/{app_component_ts.md => example_component_ts.md} (91%) delete mode 100644 static/usage/range/css-shadow-parts/angular/app_component_html.md rename static/usage/range/css-shadow-parts/angular/{app_component_css.md => example_component_css.md} (100%) create mode 100644 static/usage/range/css-shadow-parts/angular/example_component_html.md delete mode 100644 static/usage/range/css-variables/angular/app_component_html.md rename static/usage/range/css-variables/angular/{app_component_css.md => example_component_css.md} (100%) create mode 100644 static/usage/range/css-variables/angular/example_component_html.md delete mode 100644 static/usage/range/ion-change-event/angular/app_component_html.md create mode 100644 static/usage/range/ion-change-event/angular/example_component_html.md rename static/usage/range/ion-change-event/angular/{app_component_ts.md => example_component_ts.md} (70%) delete mode 100644 static/usage/range/ion-knob-move-event/angular/app_component_html.md create mode 100644 static/usage/range/ion-knob-move-event/angular/example_component_html.md rename static/usage/range/ion-knob-move-event/angular/{app_component_ts.md => example_component_ts.md} (76%) delete mode 100644 static/usage/range/pins/angular/app_component_html.md create mode 100644 static/usage/range/pins/angular/example_component_html.md rename static/usage/range/pins/angular/{app_component_ts.md => example_component_ts.md} (51%) rename static/usage/select/basic/responding-to-interaction/angular/{app.component_html.md => example_component_html.md} (100%) rename static/usage/select/basic/responding-to-interaction/angular/{app.component_ts.md => example_component_ts.md} (69%) rename static/usage/select/customization/interface-options/angular/{app.component_html.md => example_component_html.md} (100%) rename static/usage/select/customization/interface-options/angular/{app.component_ts.md => example_component_ts.md} (61%) rename static/usage/select/objects-as-values/multiple-selection/angular/{app.component_html.md => example_component_html.md} (100%) rename static/usage/select/objects-as-values/multiple-selection/angular/{app.component_ts.md => example_component_ts.md} (56%) rename static/usage/select/objects-as-values/using-comparewith/angular/{app.component_html.md => example_component_html.md} (100%) rename static/usage/select/objects-as-values/using-comparewith/angular/{app.component_ts.md => example_component_ts.md} (56%) diff --git a/src/components/global/Playground/README.md b/src/components/global/Playground/README.md new file mode 100644 index 00000000000..8f89a5d4719 --- /dev/null +++ b/src/components/global/Playground/README.md @@ -0,0 +1,69 @@ +# Playground + +The Playground component renders a demo preview of a component experience with code snippets available for each supported framework. + +The Playground can be customized per example, to meet the requirements of the component or experience that you are trying to showcase. + +## Show example within a device frame (iPhone/Pixel 5) + +By default, Playground examples will render in an empty container and fill the available space. Using the `devicePreview` flag, the Playground will render the demo experience within an iPhone device frame when on iOS mode and within a Pixel device frame when on MD. + +```tsx + +``` + +## Multiple File Examples + +Playground supports single file and multi-file examples to show the required code to create a sample. To include multiple file examples for a single framework target, use the `files` option to specify the file location (in the Stackblitz generated project) and the file contents. + +You can mix multi-file and single file examples together in a single example: + +```tsx +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_ts from './angular/example_component_ts.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 javascript from './javascript.md'; + +; +``` + +The file location is respective to the Stackblitz demo project. If you are unsure of the exact path, refer to the `stackblitz.utils.ts` method for each respective target. The path specified in `sdk.openProject` will coincide with the value used in the `files` configuration. + +## Ejecting from IonApp/IonContent Boilerplate + +By default, Playground examples will automatically include the following template wrapper for each component example when opened in Stackblitz. + +```html + + + + + +``` + +Note: The above code is just a sample. The code will be slightly different based on each framework target. + +To opt-out of this behavior, set `includeIonContent={false}` to disable this wrapper. You will be responsible for manually including `ion-content` in your code snippets. + +```tsx + +``` diff --git a/src/components/global/Playground/index.tsx b/src/components/global/Playground/index.tsx index 8951c59f7cd..d8066bcc302 100644 --- a/src/components/global/Playground/index.tsx +++ b/src/components/global/Playground/index.tsx @@ -91,6 +91,7 @@ export default function Playground({ src, size = 'small', devicePreview, + includeIonContent = true, }: { code: { [key in UsageTarget]?: MdxContent | UsageTargetOptions }; title?: string; @@ -98,6 +99,7 @@ export default function Playground({ size: string; description?: string; devicePreview?: boolean; + includeIonContent: boolean; }) { if (!code || Object.keys(code).length === 0) { console.warn('No code usage examples provided for this Playground example.'); @@ -201,14 +203,19 @@ export default function Playground({ * Reloads the iOS and MD iframe sources back to their original state. */ function resetDemo() { - frameiOS.current.contentWindow.location.reload(); - frameMD.current.contentWindow.location.reload(); + if (frameiOS.current) { + frameiOS.current.contentWindow.location.reload(); + } + if (frameMD.current) { + frameMD.current.contentWindow.location.reload(); + } } function openEditor(event) { const editorOptions: EditorOptions = { title, description, + includeIonContent, }; let codeBlock; @@ -503,12 +510,17 @@ const waitForFrame = (frame: HTMLIFrameElement) => { if (isFrameReady(frame)) return Promise.resolve(); return new Promise((resolve) => { - frame.contentWindow.addEventListener('demoReady', () => { - resolve(); - }); + if (frame) { + frame.contentWindow.addEventListener('demoReady', () => { + resolve(); + }); + } }); }; const isFrameReady = (frame: HTMLIFrameElement) => { + if (!frame) { + return false; + } return (frame.contentWindow as any).demoReady === true; }; diff --git a/src/components/global/Playground/stackblitz.utils.ts b/src/components/global/Playground/stackblitz.utils.ts index d387f1526e7..fb24f424c3b 100644 --- a/src/components/global/Playground/stackblitz.utils.ts +++ b/src/components/global/Playground/stackblitz.utils.ts @@ -22,6 +22,12 @@ export interface EditorOptions { [key: string]: string; } + /** + * `true` if `ion-app` and `ion-content` should automatically be injected into the + * Stackblitz example. + */ + includeIonContent: boolean; + angularModuleOptions?: { imports: string[]; declarations?: string[]; @@ -36,7 +42,7 @@ const loadSourceFiles = async (files: string[]) => { const openHtmlEditor = async (code: string, options?: EditorOptions) => { const [index_ts, index_html] = await loadSourceFiles([ 'html/index.ts', - 'html/index.html', + options?.includeIonContent ? 'html/index.withContent.html' : 'html/index.html', ]); sdk.openProject({ @@ -44,8 +50,7 @@ const openHtmlEditor = async (code: string, options?: EditorOptions) => { title: options?.title ?? DEFAULT_EDITOR_TITLE, description: options?.description ?? DEFAULT_EDITOR_DESCRIPTION, files: { - // Injects our code sample into the body of the HTML document - 'index.html': index_html.replace(/<\/body>/g, `\n` + code + ''), + 'index.html': index_html.replace(/{{ TEMPLATE }}/g, code), 'index.ts': index_ts, ...options?.files }, @@ -56,11 +61,13 @@ const openHtmlEditor = async (code: string, options?: EditorOptions) => { } const openAngularEditor = async (code: string, options?: EditorOptions) => { - let [main_ts, app_module_ts, app_component_ts, app_component_css, styles_css, global_css, angular_json, tsconfig_json] = await loadSourceFiles([ + let [main_ts, app_module_ts, app_component_ts, app_component_css, app_component_html, example_component_ts, styles_css, global_css, angular_json, tsconfig_json] = await loadSourceFiles([ 'angular/main.ts', 'angular/app.module.ts', 'angular/app.component.ts', 'angular/app.component.css', + options?.includeIonContent ? 'angular/app.component.withContent.html' : 'angular/app.component.html', + 'angular/example.component.ts', 'angular/styles.css', 'angular/global.css', 'angular/angular.json', @@ -85,7 +92,10 @@ const openAngularEditor = async (code: string, options?: EditorOptions) => { 'src/polyfills.ts': `import 'zone.js/dist/zone';`, 'src/app/app.module.ts': app_module_ts, 'src/app/app.component.ts': app_component_ts, - 'src/app/app.component.html': code, + 'src/app/app.component.html': app_component_html, + 'src/app/example.component.ts': example_component_ts, + 'src/app/example.component.html': code, + 'src/app/example.component.css': '', 'src/app/app.component.css': app_component_css, 'src/index.html': '', 'src/styles.css': styles_css, @@ -109,28 +119,14 @@ const openAngularEditor = async (code: string, options?: EditorOptions) => { } const openReactEditor = async (code: string, options?: EditorOptions) => { - /** - * This controls what the component is imported - * as. Since we use "export default" in the actual - * component template, this does not need to match - * up with the actual component name. - */ - const componentTagName = 'Example'; - const [index_tsx, app_tsx, ts_config_json, package_json, package_lock_json] = await loadSourceFiles([ 'react/index.tsx', - 'react/app.tsx', + options?.includeIonContent ? 'react/app.withContent.tsx' : 'react/app.tsx', 'react/tsconfig.json', 'react/package.json', 'react/package-lock.json' ]); - const app_tsx_renamed = app_tsx - // Inserts the component name from the sample into the tag. - .replace(/<\/IonApp>/g, `<${componentTagName} />`) - // Imports the component from our `main` example file. - .replace(/setupIonicReact\(\);/g, `import ${componentTagName} from "./main";\n\n` + 'setupIonicReact();'); - sdk.openProject({ template: 'node', title: options?.title ?? DEFAULT_EDITOR_TITLE, @@ -138,7 +134,7 @@ const openReactEditor = async (code: string, options?: EditorOptions) => { files: { 'public/index.html': `
`, 'src/index.tsx': index_tsx, - 'src/App.tsx': app_tsx_renamed, + 'src/App.tsx': app_tsx, 'src/main.tsx': code, 'tsconfig.json': ts_config_json, 'package.json': package_json, @@ -158,7 +154,7 @@ const openVueEditor = async (code: string, options?: EditorOptions) => { 'vue/index.html', 'vue/vite.config.ts', 'vue/main.ts', - 'vue/App.vue', + options?.includeIonContent ? 'vue/App.withContent.vue' : 'vue/App.vue', 'vue/tsconfig.json', 'vue/tsconfig.node.json', 'vue/env.d.ts' diff --git a/static/code/stackblitz/angular/app.component.html b/static/code/stackblitz/angular/app.component.html new file mode 100644 index 00000000000..cb73f595adb --- /dev/null +++ b/static/code/stackblitz/angular/app.component.html @@ -0,0 +1,3 @@ + + + diff --git a/static/code/stackblitz/angular/app.component.withContent.html b/static/code/stackblitz/angular/app.component.withContent.html new file mode 100644 index 00000000000..96ebf597215 --- /dev/null +++ b/static/code/stackblitz/angular/app.component.withContent.html @@ -0,0 +1,5 @@ + + + + + diff --git a/static/code/stackblitz/angular/app.module.ts b/static/code/stackblitz/angular/app.module.ts index 474064f51b9..15761a79e07 100644 --- a/static/code/stackblitz/angular/app.module.ts +++ b/static/code/stackblitz/angular/app.module.ts @@ -1,13 +1,15 @@ import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { IonicModule } from '@ionic/angular'; import { AppComponent } from './app.component'; +import { ExampleComponent } from './example.component'; @NgModule({ - imports: [BrowserModule, IonicModule.forRoot({})], - declarations: [AppComponent], + imports: [BrowserModule, FormsModule, IonicModule.forRoot({})], + declarations: [AppComponent, ExampleComponent], bootstrap: [AppComponent], }) export class AppModule { } diff --git a/static/code/stackblitz/angular/example.component.ts b/static/code/stackblitz/angular/example.component.ts new file mode 100644 index 00000000000..6b67261e0b3 --- /dev/null +++ b/static/code/stackblitz/angular/example.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'] +}) +export class ExampleComponent { } diff --git a/static/code/stackblitz/html/index.html b/static/code/stackblitz/html/index.html index 4abd0ae7924..8a59c2afc0f 100644 --- a/static/code/stackblitz/html/index.html +++ b/static/code/stackblitz/html/index.html @@ -2,8 +2,13 @@ + - + + + {{ TEMPLATE }} + + diff --git a/static/code/stackblitz/html/index.withContent.html b/static/code/stackblitz/html/index.withContent.html new file mode 100644 index 00000000000..3cd31834675 --- /dev/null +++ b/static/code/stackblitz/html/index.withContent.html @@ -0,0 +1,16 @@ + + + + + + + + + + + {{ TEMPLATE }} + + + + + diff --git a/static/code/stackblitz/react/app.tsx b/static/code/stackblitz/react/app.tsx index 0188284a05d..fef34594344 100644 --- a/static/code/stackblitz/react/app.tsx +++ b/static/code/stackblitz/react/app.tsx @@ -13,8 +13,14 @@ import '@ionic/react/css/text-alignment.css'; import '@ionic/react/css/text-transformation.css'; import '@ionic/react/css/flex-utils.css'; +import Example from './main'; + setupIonicReact(); export default function App() { - return ; + return ( + + + + ); } diff --git a/static/code/stackblitz/react/app.withContent.tsx b/static/code/stackblitz/react/app.withContent.tsx new file mode 100644 index 00000000000..12c3a19d3dc --- /dev/null +++ b/static/code/stackblitz/react/app.withContent.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { setupIonicReact, IonApp, IonContent } from '@ionic/react'; +/* Core CSS required for Ionic components to work properly */ +import '@ionic/react/css/core.css'; +/* Basic CSS for apps built with Ionic */ +import '@ionic/react/css/normalize.css'; +import '@ionic/react/css/structure.css'; +import '@ionic/react/css/typography.css'; +/* Optional CSS utils that can be commented out */ +import '@ionic/react/css/padding.css'; +import '@ionic/react/css/float-elements.css'; +import '@ionic/react/css/text-alignment.css'; +import '@ionic/react/css/text-transformation.css'; +import '@ionic/react/css/flex-utils.css'; + +import Example from './main'; + +setupIonicReact(); + +export default function App() { + return ( + + + + + + ); +} diff --git a/static/code/stackblitz/vue/App.withContent.vue b/static/code/stackblitz/vue/App.withContent.vue new file mode 100644 index 00000000000..aa113caf3e4 --- /dev/null +++ b/static/code/stackblitz/vue/App.withContent.vue @@ -0,0 +1,20 @@ + + + diff --git a/static/usage/accordion/accessibility/animations/angular.md b/static/usage/accordion/accessibility/animations/angular.md index 7a8faa86b4b..ced314d2657 100644 --- a/static/usage/accordion/accessibility/animations/angular.md +++ b/static/usage/accordion/accessibility/animations/angular.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/accessibility/animations/javascript.md b/static/usage/accordion/accessibility/animations/javascript.md index e0bc6b35c7f..1500ccf60c4 100644 --- a/static/usage/accordion/accessibility/animations/javascript.md +++ b/static/usage/accordion/accessibility/animations/javascript.md @@ -1,5 +1,4 @@ ```html - @@ -26,5 +25,4 @@
- ``` diff --git a/static/usage/accordion/accessibility/animations/react.md b/static/usage/accordion/accessibility/animations/react.md index 1a838cda43f..0bf5878865b 100644 --- a/static/usage/accordion/accessibility/animations/react.md +++ b/static/usage/accordion/accessibility/animations/react.md @@ -1,42 +1,34 @@ ```tsx import React from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonContent, - IonItem, - IonLabel -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonItem, IonLabel } from '@ionic/react'; function Example() { return ( - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
+ First Content +
+
+ + + Second Accordion + +
+ Second Content +
+
+ + + Third Accordion + +
+ Third Content +
+
+
); } export default Example; diff --git a/static/usage/accordion/accessibility/animations/vue.md b/static/usage/accordion/accessibility/animations/vue.md index 2800c1772af..05847edab7b 100644 --- a/static/usage/accordion/accessibility/animations/vue.md +++ b/static/usage/accordion/accessibility/animations/vue.md @@ -1,53 +1,37 @@ ```html ``` diff --git a/static/usage/accordion/customization/advanced-expansion-styles/angular/angular-ts.md b/static/usage/accordion/customization/advanced-expansion-styles/angular/angular-ts.md index f0a038f5b8a..4db53a836a9 100644 --- a/static/usage/accordion/customization/advanced-expansion-styles/angular/angular-ts.md +++ b/static/usage/accordion/customization/advanced-expansion-styles/angular/angular-ts.md @@ -2,10 +2,9 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'] + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'], }) -export class AppComponent { } - -``` \ No newline at end of file +export class ExampleComponent {} +``` diff --git a/static/usage/accordion/customization/advanced-expansion-styles/index.md b/static/usage/accordion/customization/advanced-expansion-styles/index.md index d24c552018b..b01ea6391d1 100644 --- a/static/usage/accordion/customization/advanced-expansion-styles/index.md +++ b/static/usage/accordion/customization/advanced-expansion-styles/index.md @@ -17,16 +17,16 @@ import angularTS from './angular/angular-ts.md'; react: { files: { 'src/main.tsx': reactTS, - 'src/main.css': reactCSS - } + 'src/main.css': reactCSS, + }, }, vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.css': angularCSS, - 'src/app/app.component.ts': angularTS - } + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.css': angularCSS, + 'src/app/example.component.ts': angularTS, + }, }, }} size="250px" diff --git a/static/usage/accordion/customization/advanced-expansion-styles/react/react-ts.md b/static/usage/accordion/customization/advanced-expansion-styles/react/react-ts.md index 1f5cdbf5e7f..01cd873445d 100644 --- a/static/usage/accordion/customization/advanced-expansion-styles/react/react-ts.md +++ b/static/usage/accordion/customization/advanced-expansion-styles/react/react-ts.md @@ -1,17 +1,12 @@ ```tsx import React from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonItem, - IonLabel -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonItem, IonLabel } from '@ionic/react'; import './main.css'; function Example() { return ( - + First Accordion diff --git a/static/usage/accordion/customization/icons/angular.md b/static/usage/accordion/customization/icons/angular.md index dd37ee275a3..2899aeacac6 100644 --- a/static/usage/accordion/customization/icons/angular.md +++ b/static/usage/accordion/customization/icons/angular.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/customization/theming/angular.md b/static/usage/accordion/customization/theming/angular.md deleted file mode 100644 index dd37ee275a3..00000000000 --- a/static/usage/accordion/customization/theming/angular.md +++ /dev/null @@ -1,30 +0,0 @@ -```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
-``` diff --git a/static/usage/accordion/customization/theming/index.md b/static/usage/accordion/customization/theming/index.md index f60455c59f1..8ca4314cca2 100644 --- a/static/usage/accordion/customization/theming/index.md +++ b/static/usage/accordion/customization/theming/index.md @@ -16,13 +16,13 @@ import angularHTML from './angular/angular-html.md'; react: { files: { 'src/main.tsx': reactTS, - 'src/main.css': reactCSS - } + 'src/main.css': reactCSS, + }, }, vue, angular: { files: { - 'src/app/app.component.html': angularHTML, + 'src/app/example.component.html': angularHTML, 'src/global.css': angularCSS } } diff --git a/static/usage/accordion/disable-group/angular.md b/static/usage/accordion/disable-group/angular.md index 27bedc3d522..5c4cf3b51b3 100644 --- a/static/usage/accordion/disable-group/angular.md +++ b/static/usage/accordion/disable-group/angular.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/disable-group/javascript.md b/static/usage/accordion/disable-group/javascript.md index 51ca00c2d25..163641a544c 100644 --- a/static/usage/accordion/disable-group/javascript.md +++ b/static/usage/accordion/disable-group/javascript.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/disable-group/react.md b/static/usage/accordion/disable-group/react.md index a1a97f6debd..b2ff09b5fe4 100644 --- a/static/usage/accordion/disable-group/react.md +++ b/static/usage/accordion/disable-group/react.md @@ -1,42 +1,34 @@ ```tsx import React from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonContent, - IonItem, - IonLabel -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonItem, IonLabel } from '@ionic/react'; function Example() { return ( - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
+ First Content +
+
+ + + Second Accordion + +
+ Second Content +
+
+ + + Third Accordion + +
+ Third Content +
+
+
); } export default Example; diff --git a/static/usage/accordion/disable-group/vue.md b/static/usage/accordion/disable-group/vue.md index e661dbdc278..6c9e3567845 100644 --- a/static/usage/accordion/disable-group/vue.md +++ b/static/usage/accordion/disable-group/vue.md @@ -1,53 +1,37 @@ ```html ``` diff --git a/static/usage/accordion/disable/group/angular.md b/static/usage/accordion/disable/group/angular.md index 27bedc3d522..5c4cf3b51b3 100644 --- a/static/usage/accordion/disable/group/angular.md +++ b/static/usage/accordion/disable/group/angular.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/disable/group/javascript.md b/static/usage/accordion/disable/group/javascript.md index 51ca00c2d25..163641a544c 100644 --- a/static/usage/accordion/disable/group/javascript.md +++ b/static/usage/accordion/disable/group/javascript.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/disable/group/react.md b/static/usage/accordion/disable/group/react.md index a1a97f6debd..b2ff09b5fe4 100644 --- a/static/usage/accordion/disable/group/react.md +++ b/static/usage/accordion/disable/group/react.md @@ -1,42 +1,34 @@ ```tsx import React from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonContent, - IonItem, - IonLabel -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonItem, IonLabel } from '@ionic/react'; function Example() { return ( - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
+ First Content +
+
+ + + Second Accordion + +
+ Second Content +
+
+ + + Third Accordion + +
+ Third Content +
+
+
); } export default Example; diff --git a/static/usage/accordion/disable/group/vue.md b/static/usage/accordion/disable/group/vue.md index e661dbdc278..6c9e3567845 100644 --- a/static/usage/accordion/disable/group/vue.md +++ b/static/usage/accordion/disable/group/vue.md @@ -1,53 +1,37 @@ ```html ``` diff --git a/static/usage/accordion/disable/individual/angular.md b/static/usage/accordion/disable/individual/angular.md index b87b87fd775..56ac780e987 100644 --- a/static/usage/accordion/disable/individual/angular.md +++ b/static/usage/accordion/disable/individual/angular.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion (Disabled) - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion (Disabled) + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/disable/individual/javascript.md b/static/usage/accordion/disable/individual/javascript.md index e9e5ebb18a0..df5f207512a 100644 --- a/static/usage/accordion/disable/individual/javascript.md +++ b/static/usage/accordion/disable/individual/javascript.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion (Disabled) - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion (Disabled) + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/disable/individual/react.md b/static/usage/accordion/disable/individual/react.md index 9441c5ec596..e133354999a 100644 --- a/static/usage/accordion/disable/individual/react.md +++ b/static/usage/accordion/disable/individual/react.md @@ -1,42 +1,34 @@ ```tsx import React from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonContent, - IonItem, - IonLabel -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonItem, IonLabel } from '@ionic/react'; function Example() { return ( - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
+ First Content +
+
+ + + Second Accordion + +
+ Second Content +
+
+ + + Third Accordion + +
+ Third Content +
+
+
); } export default Example; diff --git a/static/usage/accordion/disable/individual/vue.md b/static/usage/accordion/disable/individual/vue.md index a1e0a5eab1a..dc26bc3b11f 100644 --- a/static/usage/accordion/disable/individual/vue.md +++ b/static/usage/accordion/disable/individual/vue.md @@ -1,53 +1,37 @@ ```html ``` diff --git a/static/usage/accordion/listen-changes/angular-html.md b/static/usage/accordion/listen-changes/angular-html.md index a41268db0f5..a70ad5e3be6 100644 --- a/static/usage/accordion/listen-changes/angular-html.md +++ b/static/usage/accordion/listen-changes/angular-html.md @@ -1,32 +1,24 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
- -

-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
+ +

``` diff --git a/static/usage/accordion/listen-changes/angular-ts.md b/static/usage/accordion/listen-changes/angular-ts.md index 332505e9cf0..c14734aba72 100644 --- a/static/usage/accordion/listen-changes/angular-ts.md +++ b/static/usage/accordion/listen-changes/angular-ts.md @@ -2,24 +2,26 @@ import { Component, ElementRef, ViewChild } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html' + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { @ViewChild('listenerOut', { static: true }) listenerOut: ElementRef; private values: string[] = ['first', 'second', 'third']; accordionGroupChange = (ev: any) => { const nativeEl = this.listenerOut.nativeElement; - if (!nativeEl) { return; } + if (!nativeEl) { + return; + } - const collapsedItems = this.values.filter(value => value !== ev.detail.value); + const collapsedItems = this.values.filter((value) => value !== ev.detail.value); const selectedValue = ev.detail.value; - + nativeEl.innerText = ` Expanded: ${selectedValue === undefined ? 'None' : ev.detail.value} Collapsed: ${collapsedItems.join(', ')} - ` - } + `; + }; } ``` diff --git a/static/usage/accordion/listen-changes/index.md b/static/usage/accordion/listen-changes/index.md index e609690c716..d5f2eac4b56 100644 --- a/static/usage/accordion/listen-changes/index.md +++ b/static/usage/accordion/listen-changes/index.md @@ -13,10 +13,10 @@ import angularTS from './angular-ts.md'; vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.ts': angularTS - } - } + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.ts': angularTS, + }, + }, }} size="320px" src="usage/accordion/listen-changes/demo.html" diff --git a/static/usage/accordion/listen-changes/javascript.md b/static/usage/accordion/listen-changes/javascript.md index 5d271b2a9d5..e7085ca86eb 100644 --- a/static/usage/accordion/listen-changes/javascript.md +++ b/static/usage/accordion/listen-changes/javascript.md @@ -1,34 +1,26 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
-

-
+

``` diff --git a/static/usage/accordion/listen-changes/react.md b/static/usage/accordion/listen-changes/react.md index 882d5cb7a32..eb76312b62a 100644 --- a/static/usage/accordion/listen-changes/react.md +++ b/static/usage/accordion/listen-changes/react.md @@ -1,31 +1,26 @@ ```tsx import React, { useRef } from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonContent, - IonItem, - IonLabel, - AccordionGroupCustomEvent -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonItem, IonLabel, AccordionGroupCustomEvent } from '@ionic/react'; function Example() { const listenerOut = useRef(null); const values = ['first', 'second', 'third']; const accordionGroupChange = (ev: AccordionGroupCustomEvent) => { const nativeEl = listenerOut.current; - if (!nativeEl) { return; } - - const collapsedItems = values.filter(value => value !== ev.detail.value); + if (!nativeEl) { + return; + } + + const collapsedItems = values.filter((value) => value !== ev.detail.value); const selectedValue = ev.detail.value; - + nativeEl.innerText = ` Expanded: ${selectedValue === undefined ? 'None' : ev.detail.value} Collapsed: ${collapsedItems.join(', ')} - ` - } - + `; + }; + return ( - + <> @@ -53,7 +48,7 @@ function Example() {

-
+ ); } export default Example; diff --git a/static/usage/accordion/listen-changes/vue.md b/static/usage/accordion/listen-changes/vue.md index bc4c493b14e..0086a788ac0 100644 --- a/static/usage/accordion/listen-changes/vue.md +++ b/static/usage/accordion/listen-changes/vue.md @@ -1,72 +1,58 @@ ```html ``` diff --git a/static/usage/accordion/multiple/angular.md b/static/usage/accordion/multiple/angular.md index 552e4f54949..238f000c458 100644 --- a/static/usage/accordion/multiple/angular.md +++ b/static/usage/accordion/multiple/angular.md @@ -1,30 +1,22 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
``` diff --git a/static/usage/accordion/multiple/javascript.md b/static/usage/accordion/multiple/javascript.md index a64b22a02f4..6948ed4e9cc 100644 --- a/static/usage/accordion/multiple/javascript.md +++ b/static/usage/accordion/multiple/javascript.md @@ -1,32 +1,24 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
-
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
diff --git a/static/usage/accordion/toggle/angular-html.md b/static/usage/accordion/toggle/angular-html.md index 6a0139e0c60..6af0af8516a 100644 --- a/static/usage/accordion/toggle/angular-html.md +++ b/static/usage/accordion/toggle/angular-html.md @@ -1,32 +1,24 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
- - Toggle Second Accordion -
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
+ +Toggle Second Accordion ``` diff --git a/static/usage/accordion/toggle/angular-ts.md b/static/usage/accordion/toggle/angular-ts.md index b8f854d4d4d..bdcac1d862f 100644 --- a/static/usage/accordion/toggle/angular-ts.md +++ b/static/usage/accordion/toggle/angular-ts.md @@ -3,10 +3,10 @@ import { Component, ViewChild } from '@angular/core'; import { IonAccordionGroup } from '@ionic/angular'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html' + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { @ViewChild('accordionGroup', { static: true }) accordionGroup: IonAccordionGroup; toggleAccordion = () => { @@ -16,6 +16,6 @@ export class AppComponent { } else { nativeEl.value = 'second'; } - } + }; } -``` \ No newline at end of file +``` diff --git a/static/usage/accordion/toggle/index.md b/static/usage/accordion/toggle/index.md index 9e33b6adb19..7f47e805c13 100644 --- a/static/usage/accordion/toggle/index.md +++ b/static/usage/accordion/toggle/index.md @@ -13,10 +13,10 @@ import angularTS from './angular-ts.md'; vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.ts': angularTS - } - } + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.ts': angularTS, + }, + }, }} size="medium" src="usage/accordion/toggle/demo.html" diff --git a/static/usage/accordion/toggle/javascript.md b/static/usage/accordion/toggle/javascript.md index 982dd22dd0e..058e4e468d6 100644 --- a/static/usage/accordion/toggle/javascript.md +++ b/static/usage/accordion/toggle/javascript.md @@ -1,34 +1,26 @@ ```html - - - - - First Accordion - -
- First Content -
-
- - - Second Accordion - -
- Second Content -
-
- - - Third Accordion - -
- Third Content -
-
-
- - Toggle Second Accordion -
+ + + + First Accordion + +
First Content
+
+ + + Second Accordion + +
Second Content
+
+ + + Third Accordion + +
Third Content
+
+
+ +Toggle Second Accordion ``` diff --git a/static/usage/accordion/toggle/react.md b/static/usage/accordion/toggle/react.md index 990515683aa..8d20c6bb18e 100644 --- a/static/usage/accordion/toggle/react.md +++ b/static/usage/accordion/toggle/react.md @@ -1,17 +1,12 @@ ```tsx import React, { useRef } from 'react'; -import { - IonAccordion, - IonAccordionGroup, - IonButton, - IonContent, - IonItem, - IonLabel -} from '@ionic/react'; +import { IonAccordion, IonAccordionGroup, IonButton, IonItem, IonLabel } from '@ionic/react'; function Example() { const accordionGroup = useRef(null); const toggleAccordion = () => { - if (!accordionGroup.current) { return; } + if (!accordionGroup.current) { + return; + } const nativeEl = accordionGroup.current; if (nativeEl.value === 'second') { @@ -19,9 +14,9 @@ function Example() { } else { nativeEl.value = 'second'; } - } + }; return ( - + <> @@ -49,7 +44,7 @@ function Example() { Toggle Second Accordion - + ); } export default Example; diff --git a/static/usage/accordion/toggle/vue.md b/static/usage/accordion/toggle/vue.md index ebad4f7610b..c9fa11c0e9c 100644 --- a/static/usage/accordion/toggle/vue.md +++ b/static/usage/accordion/toggle/vue.md @@ -1,63 +1,47 @@ ```html ``` diff --git a/static/usage/alert/buttons/angular/angular_ts.md b/static/usage/alert/buttons/angular/angular_ts.md index 2614a2ed719..f4a7b4e9a18 100644 --- a/static/usage/alert/buttons/angular/angular_ts.md +++ b/static/usage/alert/buttons/angular/angular_ts.md @@ -3,10 +3,10 @@ import { Component } from '@angular/core'; import { AlertController } from '@ionic/angular'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { handlerMessage = ''; roleMessage = ''; @@ -19,14 +19,18 @@ export class AppComponent { { text: 'Cancel', role: 'cancel', - handler: () => { this.handlerMessage = 'Alert canceled'; } + handler: () => { + this.handlerMessage = 'Alert canceled'; + }, }, { text: 'OK', role: 'confirm', - handler: () => { this.handlerMessage = 'Alert confirmed'; } - } - ] + handler: () => { + this.handlerMessage = 'Alert confirmed'; + }, + }, + ], }); await alert.present(); @@ -35,4 +39,4 @@ export class AppComponent { this.roleMessage = `Dismissed with role: ${role}`; } } -``` \ No newline at end of file +``` diff --git a/static/usage/alert/buttons/index.md b/static/usage/alert/buttons/index.md index d2949de2317..b3bb80edbac 100644 --- a/static/usage/alert/buttons/index.md +++ b/static/usage/alert/buttons/index.md @@ -15,10 +15,10 @@ import angularTS from './angular/angular_ts.md'; vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.ts': angularTS - } - } + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.ts': angularTS, + }, + }, }} src="usage/alert/buttons/demo.html" -/> \ No newline at end of file +/> diff --git a/static/usage/alert/buttons/react.md b/static/usage/alert/buttons/react.md index 6655c40fd09..da6138b71c5 100644 --- a/static/usage/alert/buttons/react.md +++ b/static/usage/alert/buttons/react.md @@ -1,6 +1,6 @@ ```tsx import React, { useState } from 'react'; -import { IonButton, IonContent, useIonAlert } from '@ionic/react'; +import { IonButton, useIonAlert } from '@ionic/react'; function Example() { const [presentAlert] = useIonAlert(); @@ -8,26 +8,36 @@ function Example() { const [roleMessage, setRoleMessage] = useState(''); return ( - - presentAlert({ - header: 'Alert!', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - handler: () => { setHandlerMessage('Alert canceled'); } - }, - { - text: 'OK', - role: 'confirm', - handler: () => { setHandlerMessage('Alert confirmed'); } - } - ], - onDidDismiss: (e: CustomEvent) => setRoleMessage(`Dismissed with role: ${e.detail.role}`) - })}>Click Me + <> + + presentAlert({ + header: 'Alert!', + buttons: [ + { + text: 'Cancel', + role: 'cancel', + handler: () => { + setHandlerMessage('Alert canceled'); + }, + }, + { + text: 'OK', + role: 'confirm', + handler: () => { + setHandlerMessage('Alert confirmed'); + }, + }, + ], + onDidDismiss: (e: CustomEvent) => setRoleMessage(`Dismissed with role: ${e.detail.role}`), + }) + } + > + Click Me +

{handlerMessage}

{roleMessage}

-
+ ); } export default Example; diff --git a/static/usage/alert/buttons/vue.md b/static/usage/alert/buttons/vue.md index bc29caaca35..f3aab5ef08a 100644 --- a/static/usage/alert/buttons/vue.md +++ b/static/usage/alert/buttons/vue.md @@ -1,47 +1,49 @@ ```html -``` \ No newline at end of file +``` diff --git a/static/usage/alert/customization/angular/angular_ts.md b/static/usage/alert/customization/angular/angular_ts.md index fc910da0fe0..9606aeb72f4 100644 --- a/static/usage/alert/customization/angular/angular_ts.md +++ b/static/usage/alert/customization/angular/angular_ts.md @@ -3,10 +3,10 @@ import { Component } from '@angular/core'; import { AlertController } from '@ionic/angular'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { constructor(private alertController: AlertController) {} async presentAlert() { @@ -16,16 +16,16 @@ export class AppComponent { buttons: [ { text: 'No', - cssClass: 'alert-button-cancel' + cssClass: 'alert-button-cancel', }, { text: 'Yes', - cssClass: 'alert-button-confirm' - } - ] + cssClass: 'alert-button-confirm', + }, + ], }); await alert.present(); } } -``` \ No newline at end of file +``` diff --git a/static/usage/alert/customization/index.md b/static/usage/alert/customization/index.md index c5521d46b58..a97cefceecc 100644 --- a/static/usage/alert/customization/index.md +++ b/static/usage/alert/customization/index.md @@ -17,17 +17,17 @@ import angularTS from './angular/angular_ts.md'; react: { files: { 'src/main.tsx': reactTS, - 'src/main.css': reactCSS - } + 'src/main.css': reactCSS, + }, }, vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.ts': angularTS, + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.ts': angularTS, 'src/global.css': angularCSS } } }} src="usage/alert/customization/demo.html" -/> \ No newline at end of file +/> diff --git a/static/usage/alert/customization/react/react_ts.md b/static/usage/alert/customization/react/react_ts.md index 564617b2796..7a04d967cea 100644 --- a/static/usage/alert/customization/react/react_ts.md +++ b/static/usage/alert/customization/react/react_ts.md @@ -1,6 +1,6 @@ ```tsx import React from 'react'; -import { IonButton, IonContent, useIonAlert } from '@ionic/react'; +import { IonButton, useIonAlert } from '@ionic/react'; import './main.css'; @@ -8,22 +8,26 @@ function Example() { const [presentAlert] = useIonAlert(); return ( - - presentAlert({ - header: 'Are you sure?', - cssClass: 'custom-alert', - buttons: [ - { - text: 'No', - cssClass: 'alert-button-cancel' - }, - { - text: 'Yes', - cssClass: 'alert-button-confirm' - } - ] - })}>Click Me - + + presentAlert({ + header: 'Are you sure?', + cssClass: 'custom-alert', + buttons: [ + { + text: 'No', + cssClass: 'alert-button-cancel', + }, + { + text: 'Yes', + cssClass: 'alert-button-confirm', + }, + ], + }) + } + > + Click Me + ); } export default Example; diff --git a/static/usage/alert/customization/vue.md b/static/usage/alert/customization/vue.md index aa16c0c1729..f07233f64e1 100644 --- a/static/usage/alert/customization/vue.md +++ b/static/usage/alert/customization/vue.md @@ -1,15 +1,13 @@ ```html - - - - App - - - - Open Custom Dialog - - -
-

Dialog header

- - - - - Item 1 - - - - Item 2 - - - - Item 3 - - -
-
-
-
+ + + App + + + + Open Custom Dialog + + +
+

Dialog header

+ + + + + Item 1 + + + + Item 2 + + + + Item 3 + + +
+
+
@@ -23,12 +23,12 @@ - Open Modal - + Open Modal + - Close + Close Modal @@ -43,6 +43,9 @@ ``` diff --git a/static/usage/modal/sheet/background-content/angular/app_component_css.md b/static/usage/modal/sheet/background-content/angular/example_component_css.md similarity index 100% rename from static/usage/modal/sheet/background-content/angular/app_component_css.md rename to static/usage/modal/sheet/background-content/angular/example_component_css.md diff --git a/static/usage/modal/sheet/background-content/angular/app_component_html.md b/static/usage/modal/sheet/background-content/angular/example_component_html.md similarity index 98% rename from static/usage/modal/sheet/background-content/angular/app_component_html.md rename to static/usage/modal/sheet/background-content/angular/example_component_html.md index 7910cca5345..286c8e66487 100644 --- a/static/usage/modal/sheet/background-content/angular/app_component_html.md +++ b/static/usage/modal/sheet/background-content/angular/example_component_html.md @@ -1,5 +1,5 @@ ```html - +
App @@ -68,5 +68,5 @@ - +
``` diff --git a/static/usage/modal/sheet/background-content/angular/app_component_ts.md b/static/usage/modal/sheet/background-content/angular/example_component_ts.md similarity index 53% rename from static/usage/modal/sheet/background-content/angular/app_component_ts.md rename to static/usage/modal/sheet/background-content/angular/example_component_ts.md index a9ca2c29ef5..e132d2f84c7 100644 --- a/static/usage/modal/sheet/background-content/angular/app_component_ts.md +++ b/static/usage/modal/sheet/background-content/angular/example_component_ts.md @@ -2,11 +2,11 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'], }) -export class AppComponent { +export class ExampleComponent { count = 0; increment() { diff --git a/static/usage/modal/sheet/background-content/index.md b/static/usage/modal/sheet/background-content/index.md index b5c46d80cb6..e1ed5e241e0 100644 --- a/static/usage/modal/sheet/background-content/index.md +++ b/static/usage/modal/sheet/background-content/index.md @@ -4,9 +4,9 @@ import javascript from './javascript.md'; import vue from './vue.md'; import react from './react.md'; -import angular_app_component_html from './angular/app_component_html.md'; -import angular_app_component_ts from './angular/app_component_ts.md'; -import angular_app_component_css from './angular/app_component_css.md'; +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_ts from './angular/example_component_ts.md'; +import angular_example_component_css from './angular/example_component_css.md'; diff --git a/static/usage/modal/sheet/background-content/javascript.md b/static/usage/modal/sheet/background-content/javascript.md index 8dcc58a4e49..7d58104e6dd 100644 --- a/static/usage/modal/sheet/background-content/javascript.md +++ b/static/usage/modal/sheet/background-content/javascript.md @@ -7,66 +7,64 @@ } - - - - App - - - -

You can interact with the +/- buttons until the sheet is fully expanded.

+ + + App + + + +

You can interact with the +/- buttons until the sheet is fully expanded.

-
- - -

0

- + -
+
+ - +

0

+ + +
- - - - - - - - - -

Connor Smith

-

Sales Rep

-
-
- - - - - -

Daniel Smith

-

Product Designer

-
-
- - - - - -

Greg Smith

-

Director of Operations

-
-
- - - - - -

Zoey Smith

-

CEO

-
-
-
-
-
-
-
+ + + + + + + + + +

Connor Smith

+

Sales Rep

+
+
+ + + + + +

Daniel Smith

+

Product Designer

+
+
+ + + + + +

Greg Smith

+

Director of Operations

+
+
+ + + + + +

Zoey Smith

+

CEO

+
+
+
+
+
+
``` diff --git a/static/usage/popover/customization/styling/index.md b/static/usage/popover/customization/styling/index.md index 69131291cba..6b74ad461db 100644 --- a/static/usage/popover/customization/styling/index.md +++ b/static/usage/popover/customization/styling/index.md @@ -16,16 +16,16 @@ import angularCSS from './angular/angular_css.md'; react: { files: { 'src/main.tsx': reactTS, - 'src/main.css': reactCSS - } + 'src/main.css': reactCSS, + }, }, vue, angular: { files: { - 'src/app/app.component.html': angularHTML, + 'src/app/example.component.html': angularHTML, 'src/global.css': angularCSS } } }} src="usage/popover/customization/styling/demo.html" -/> \ No newline at end of file +/> diff --git a/static/usage/popover/customization/styling/react/react_ts.md b/static/usage/popover/customization/styling/react/react_ts.md index 525507f60cd..1a905f8056d 100644 --- a/static/usage/popover/customization/styling/react/react_ts.md +++ b/static/usage/popover/customization/styling/react/react_ts.md @@ -6,12 +6,12 @@ import './main.css'; function Example() { return ( - + <> Click Me Hello Styled World! - + ); } export default Example; diff --git a/static/usage/popover/customization/styling/vue.md b/static/usage/popover/customization/styling/vue.md index b0454796b21..964eeb09bfc 100644 --- a/static/usage/popover/customization/styling/vue.md +++ b/static/usage/popover/customization/styling/vue.md @@ -1,19 +1,17 @@ ```html diff --git a/static/usage/popover/nested/react.md b/static/usage/popover/nested/react.md index 7df90490419..eb84d67effb 100644 --- a/static/usage/popover/nested/react.md +++ b/static/usage/popover/nested/react.md @@ -3,26 +3,34 @@ import React from 'react'; import { IonButton, IonContent, IonItem, IonList, IonPopover } from '@ionic/react'; function Example() { return ( - + <> Open Menu - Option 1 - Option 2 - More options... + + Option 1 + + + Option 2 + + + More options... + - Nested option + + Nested option + - + ); } export default Example; diff --git a/static/usage/popover/nested/vue.md b/static/usage/popover/nested/vue.md index eb153ce0558..04a7b6d7e36 100644 --- a/static/usage/popover/nested/vue.md +++ b/static/usage/popover/nested/vue.md @@ -1,33 +1,31 @@ ```html ``` diff --git a/static/usage/popover/presenting/controller/angular/angular_module.md b/static/usage/popover/presenting/controller/angular/angular_module.md index d162dd7b840..887ca3acf89 100644 --- a/static/usage/popover/presenting/controller/angular/angular_module.md +++ b/static/usage/popover/presenting/controller/angular/angular_module.md @@ -1,14 +1,19 @@ ```ts import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; + import { IonicModule } from '@ionic/angular'; + import { AppComponent } from './app.component'; +import { ExampleComponent } from './example.component'; + import { PopoverComponent } from './popover.component'; @NgModule({ - imports: [BrowserModule, IonicModule.forRoot({})], - declarations: [AppComponent, PopoverComponent], + imports: [BrowserModule, FormsModule, IonicModule.forRoot({})], + declarations: [AppComponent, ExampleComponent, PopoverComponent], bootstrap: [AppComponent], }) export class AppModule {} -``` \ No newline at end of file +``` diff --git a/static/usage/popover/presenting/controller/angular/angular_popover_ts.md b/static/usage/popover/presenting/controller/angular/angular_popover_ts.md index d56d7a6a35b..2900a32240c 100644 --- a/static/usage/popover/presenting/controller/angular/angular_popover_ts.md +++ b/static/usage/popover/presenting/controller/angular/angular_popover_ts.md @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; import { PopoverController } from '@ionic/angular'; @Component({ - selector: 'popover-component', + selector: 'app-popover', templateUrl: 'popover.component.html', }) -export class PopoverComponent { - constructor() {} -} -``` \ No newline at end of file +export class PopoverComponent {} +``` diff --git a/static/usage/popover/presenting/controller/angular/angular_ts.md b/static/usage/popover/presenting/controller/angular/angular_ts.md index 9481ad07555..bf0e0165d78 100644 --- a/static/usage/popover/presenting/controller/angular/angular_ts.md +++ b/static/usage/popover/presenting/controller/angular/angular_ts.md @@ -1,25 +1,27 @@ ```ts import { Component, ViewChild } from '@angular/core'; + import { PopoverController } from '@ionic/angular'; + import { PopoverComponent } from './popover.component'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { - roleMsg = ""; +export class ExampleComponent { + roleMsg = ''; constructor(public popoverController: PopoverController) {} async presentPopover(e: Event) { const popover = await this.popoverController.create({ component: PopoverComponent, - event: e + event: e, }); await popover.present(); - + const { role } = await popover.onDidDismiss(); this.roleMsg = `Popover dismissed with role: ${role}`; } diff --git a/static/usage/popover/presenting/controller/index.md b/static/usage/popover/presenting/controller/index.md index e997458a49c..e6a1e83f6ad 100644 --- a/static/usage/popover/presenting/controller/index.md +++ b/static/usage/popover/presenting/controller/index.md @@ -20,18 +20,18 @@ import angularModule from './angular/angular_module.md'; vue: { files: { 'src/components/Example.vue': vueMain, - 'src/components/Popover.vue': vuePopover - } + 'src/components/Popover.vue': vuePopover, + }, }, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.ts': angularTS, + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.ts': angularTS, 'src/app/popover.component.html': angularPopoverHTML, 'src/app/popover.component.ts': angularPopoverTS, - 'src/app/app.module.ts': angularModule - } - } + 'src/app/app.module.ts': angularModule, + }, + }, }} src="usage/popover/presenting/controller/demo.html" -/> \ No newline at end of file +/> diff --git a/static/usage/popover/presenting/controller/react.md b/static/usage/popover/presenting/controller/react.md index 1a946c674a2..8d772ca8ef6 100644 --- a/static/usage/popover/presenting/controller/react.md +++ b/static/usage/popover/presenting/controller/react.md @@ -6,18 +6,24 @@ const Popover = () => Hello World! dismiss(data, role) + onDismiss: (data: any, role: string) => dismiss(data, role), }); const [roleMsg, setRoleMsg] = useState(''); return ( - - present({ - event: e, - onDidDismiss: (e: CustomEvent) => setRoleMsg(`Popover dismissed with role: ${e.detail.role}`) - })}>Click Me + <> + + present({ + event: e, + onDidDismiss: (e: CustomEvent) => setRoleMsg(`Popover dismissed with role: ${e.detail.role}`), + }) + } + > + Click Me +

{roleMsg}

-
+ ); } export default Example; diff --git a/static/usage/popover/presenting/controller/vue/vue_main.md b/static/usage/popover/presenting/controller/vue/vue_main.md index f3f17dfe72b..36e0e51d3d8 100644 --- a/static/usage/popover/presenting/controller/vue/vue_main.md +++ b/static/usage/popover/presenting/controller/vue/vue_main.md @@ -1,34 +1,32 @@ ```html -``` \ No newline at end of file +``` diff --git a/static/usage/popover/presenting/inline-isopen/angular/angular_ts.md b/static/usage/popover/presenting/inline-isopen/angular/angular_ts.md index 71d8c64f93e..ef604e603d9 100644 --- a/static/usage/popover/presenting/inline-isopen/angular/angular_ts.md +++ b/static/usage/popover/presenting/inline-isopen/angular/angular_ts.md @@ -2,12 +2,11 @@ import { Component, ViewChild } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { @ViewChild('popover') popover; - constructor() {} isOpen = false; diff --git a/static/usage/popover/presenting/inline-isopen/index.md b/static/usage/popover/presenting/inline-isopen/index.md index 030f2ab791e..a23bef68095 100644 --- a/static/usage/popover/presenting/inline-isopen/index.md +++ b/static/usage/popover/presenting/inline-isopen/index.md @@ -15,10 +15,10 @@ import angularTS from './angular/angular_ts.md'; vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.ts': angularTS, - } - } + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.ts': angularTS, + }, + }, }} src="usage/popover/presenting/inline-isopen/demo.html" -/> \ No newline at end of file +/> diff --git a/static/usage/popover/presenting/inline-isopen/react.md b/static/usage/popover/presenting/inline-isopen/react.md index 6c35a136353..1d0b68fd1f5 100644 --- a/static/usage/popover/presenting/inline-isopen/react.md +++ b/static/usage/popover/presenting/inline-isopen/react.md @@ -12,12 +12,12 @@ function Example() { }; return ( - + <> Click Me setPopoverOpen(false)}> Hello World! - + ); } export default Example; diff --git a/static/usage/popover/presenting/inline-isopen/vue.md b/static/usage/popover/presenting/inline-isopen/vue.md index 1bca8f0e5b0..fbbaf065a17 100644 --- a/static/usage/popover/presenting/inline-isopen/vue.md +++ b/static/usage/popover/presenting/inline-isopen/vue.md @@ -1,15 +1,9 @@ ```html ``` diff --git a/static/usage/popover/presenting/inline-trigger/react.md b/static/usage/popover/presenting/inline-trigger/react.md index acfb3a0fed0..93ba97cbd7c 100644 --- a/static/usage/popover/presenting/inline-trigger/react.md +++ b/static/usage/popover/presenting/inline-trigger/react.md @@ -3,7 +3,7 @@ import React from 'react'; import { IonButton, IonContent, IonPopover } from '@ionic/react'; function Example() { return ( - + <> Left-Click Me Hello World! @@ -18,7 +18,7 @@ function Example() { Hello World! - + ); } export default Example; diff --git a/static/usage/popover/presenting/inline-trigger/vue.md b/static/usage/popover/presenting/inline-trigger/vue.md index d61df6161d1..07f1f68a62f 100644 --- a/static/usage/popover/presenting/inline-trigger/vue.md +++ b/static/usage/popover/presenting/inline-trigger/vue.md @@ -1,21 +1,19 @@ ```html ``` diff --git a/static/usage/range/css-shadow-parts/angular/app_component_html.md b/static/usage/range/css-shadow-parts/angular/app_component_html.md deleted file mode 100644 index 72f9213a9ba..00000000000 --- a/static/usage/range/css-shadow-parts/angular/app_component_html.md +++ /dev/null @@ -1,5 +0,0 @@ -```html - - - -``` diff --git a/static/usage/range/css-shadow-parts/angular/app_component_css.md b/static/usage/range/css-shadow-parts/angular/example_component_css.md similarity index 100% rename from static/usage/range/css-shadow-parts/angular/app_component_css.md rename to static/usage/range/css-shadow-parts/angular/example_component_css.md diff --git a/static/usage/range/css-shadow-parts/angular/example_component_html.md b/static/usage/range/css-shadow-parts/angular/example_component_html.md new file mode 100644 index 00000000000..95fbcd6f6ab --- /dev/null +++ b/static/usage/range/css-shadow-parts/angular/example_component_html.md @@ -0,0 +1,3 @@ +```html + +``` diff --git a/static/usage/range/css-shadow-parts/index.md b/static/usage/range/css-shadow-parts/index.md index 95af2d3c7f3..af1df80390f 100644 --- a/static/usage/range/css-shadow-parts/index.md +++ b/static/usage/range/css-shadow-parts/index.md @@ -7,8 +7,8 @@ import react_main_css from './react/main_css.md'; import vue from './vue.md'; -import angular_app_component_html from './angular/app_component_html.md'; -import angular_app_component_css from './angular/app_component_css.md'; +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_css from './angular/example_component_css.md'; - - - - + ``` diff --git a/static/usage/range/css-variables/angular/app_component_html.md b/static/usage/range/css-variables/angular/app_component_html.md deleted file mode 100644 index 69a76797cb2..00000000000 --- a/static/usage/range/css-variables/angular/app_component_html.md +++ /dev/null @@ -1,5 +0,0 @@ -```html - - - -``` diff --git a/static/usage/range/css-variables/angular/app_component_css.md b/static/usage/range/css-variables/angular/example_component_css.md similarity index 100% rename from static/usage/range/css-variables/angular/app_component_css.md rename to static/usage/range/css-variables/angular/example_component_css.md diff --git a/static/usage/range/css-variables/angular/example_component_html.md b/static/usage/range/css-variables/angular/example_component_html.md new file mode 100644 index 00000000000..788c2c288d8 --- /dev/null +++ b/static/usage/range/css-variables/angular/example_component_html.md @@ -0,0 +1,3 @@ +```html + +``` diff --git a/static/usage/range/css-variables/index.md b/static/usage/range/css-variables/index.md index d533b6d2670..c613c23ce3f 100644 --- a/static/usage/range/css-variables/index.md +++ b/static/usage/range/css-variables/index.md @@ -7,8 +7,8 @@ import react_main_css from './react/main_css.md'; import vue from './vue.md'; -import angular_app_component_html from './angular/app_component_html.md'; -import angular_app_component_css from './angular/app_component_css.md'; +import angular_example_component_html from './angular/example_component_html.md'; +import angular_example_component_css from './angular/example_component_css.md'; - - - - + ``` diff --git a/static/usage/range/dual-knobs/angular.md b/static/usage/range/dual-knobs/angular.md index 689632aa991..b5d6a592a92 100644 --- a/static/usage/range/dual-knobs/angular.md +++ b/static/usage/range/dual-knobs/angular.md @@ -1,5 +1,3 @@ ```html - - - + ``` diff --git a/static/usage/range/dual-knobs/javascript.md b/static/usage/range/dual-knobs/javascript.md index 8768ad6ab88..1227b5cc841 100644 --- a/static/usage/range/dual-knobs/javascript.md +++ b/static/usage/range/dual-knobs/javascript.md @@ -1,9 +1,5 @@ ```html - - - - - + ``` diff --git a/static/usage/select/basic/responding-to-interaction/angular/app.component_html.md b/static/usage/select/basic/responding-to-interaction/angular/example_component_html.md similarity index 100% rename from static/usage/select/basic/responding-to-interaction/angular/app.component_html.md rename to static/usage/select/basic/responding-to-interaction/angular/example_component_html.md diff --git a/static/usage/select/basic/responding-to-interaction/angular/app.component_ts.md b/static/usage/select/basic/responding-to-interaction/angular/example_component_ts.md similarity index 69% rename from static/usage/select/basic/responding-to-interaction/angular/app.component_ts.md rename to static/usage/select/basic/responding-to-interaction/angular/example_component_ts.md index 56343326cf2..18c0b1eaa1b 100644 --- a/static/usage/select/basic/responding-to-interaction/angular/app.component_ts.md +++ b/static/usage/select/basic/responding-to-interaction/angular/example_component_ts.md @@ -2,10 +2,10 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { logs: string[] = []; pushLog(msg) { @@ -16,5 +16,4 @@ export class AppComponent { this.pushLog('ionChange fired with value: ' + e.detail.value); } } - -``` \ No newline at end of file +``` diff --git a/static/usage/select/basic/responding-to-interaction/index.md b/static/usage/select/basic/responding-to-interaction/index.md index 0af87d3b651..36d66bad680 100644 --- a/static/usage/select/basic/responding-to-interaction/index.md +++ b/static/usage/select/basic/responding-to-interaction/index.md @@ -4,8 +4,8 @@ import javascript from './javascript.md'; import react from './react.md'; import vue from './vue.md'; -import angularHTML from './angular/app.component_html.md'; -import angularTS from './angular/app.component_ts.md'; +import angularHTML from './angular/example_component_html.md'; +import angularTS from './angular/example_component_ts.md'; \ No newline at end of file +/> diff --git a/static/usage/select/basic/responding-to-interaction/react.md b/static/usage/select/basic/responding-to-interaction/react.md index 7adde2b42d2..e6a85e2eef6 100644 --- a/static/usage/select/basic/responding-to-interaction/react.md +++ b/static/usage/select/basic/responding-to-interaction/react.md @@ -3,9 +3,9 @@ import React, { useState } from 'react'; import { IonItem, IonList, IonSelect, IonSelectOption } from '@ionic/react'; function Example() { - const [logs, setLogs] = useState([]); + const [logs, setLogs] = useState([]); - const pushLog = (msg) => { + const pushLog = (msg: string) => { setLogs([msg, ...logs]); }; @@ -26,7 +26,9 @@ function Example() {
- {logs.map((log) =>

{log}

)} + {logs.map((log) => ( +

{log}

+ ))}
); diff --git a/static/usage/select/customization/interface-options/angular/app.component_html.md b/static/usage/select/customization/interface-options/angular/example_component_html.md similarity index 100% rename from static/usage/select/customization/interface-options/angular/app.component_html.md rename to static/usage/select/customization/interface-options/angular/example_component_html.md diff --git a/static/usage/select/customization/interface-options/angular/app.component_ts.md b/static/usage/select/customization/interface-options/angular/example_component_ts.md similarity index 61% rename from static/usage/select/customization/interface-options/angular/app.component_ts.md rename to static/usage/select/customization/interface-options/angular/example_component_ts.md index 5858420a575..c3f34d0adaf 100644 --- a/static/usage/select/customization/interface-options/angular/app.component_ts.md +++ b/static/usage/select/customization/interface-options/angular/example_component_ts.md @@ -2,27 +2,26 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { customAlertOptions = { header: 'Pizza Toppings', subHeader: 'Select your favorite topping', message: 'Choose only one', - translucent: true + translucent: true, }; customPopoverOptions = { header: 'Hair Color', subHeader: 'Select your hair color', - message: 'Only select your dominant hair color' + message: 'Only select your dominant hair color', }; customActionSheetOptions = { header: 'Colors', - subHeader: 'Select your favorite color' + subHeader: 'Select your favorite color', }; } - -``` \ No newline at end of file +``` diff --git a/static/usage/select/customization/interface-options/index.md b/static/usage/select/customization/interface-options/index.md index 54a1397a925..44247363484 100644 --- a/static/usage/select/customization/interface-options/index.md +++ b/static/usage/select/customization/interface-options/index.md @@ -4,8 +4,8 @@ import javascript from './javascript.md'; import react from './react.md'; import vue from './vue.md'; -import angularHTML from './angular/app.component_html.md'; -import angularTS from './angular/app.component_ts.md'; +import angularHTML from './angular/example_component_html.md'; +import angularTS from './angular/example_component_ts.md'; \ No newline at end of file +/> diff --git a/static/usage/select/customization/styling-select/angular/angular-ts.md b/static/usage/select/customization/styling-select/angular/angular-ts.md index f0a038f5b8a..4db53a836a9 100644 --- a/static/usage/select/customization/styling-select/angular/angular-ts.md +++ b/static/usage/select/customization/styling-select/angular/angular-ts.md @@ -2,10 +2,9 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'] + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'], }) -export class AppComponent { } - -``` \ No newline at end of file +export class ExampleComponent {} +``` diff --git a/static/usage/select/customization/styling-select/index.md b/static/usage/select/customization/styling-select/index.md index 24d2ef59070..b6afedc5dcd 100644 --- a/static/usage/select/customization/styling-select/index.md +++ b/static/usage/select/customization/styling-select/index.md @@ -17,17 +17,17 @@ import angularTS from './angular/angular-ts.md'; react: { files: { 'src/main.tsx': reactTS, - 'src/main.css': reactCSS - } + 'src/main.css': reactCSS, + }, }, vue, angular: { files: { - 'src/app/app.component.html': angularHTML, - 'src/app/app.component.css': angularCSS, - 'src/app/app.component.ts': angularTS - } - } + 'src/app/example.component.html': angularHTML, + 'src/app/example.component.css': angularCSS, + 'src/app/example.component.ts': angularTS, + }, + }, }} src="usage/select/customization/styling-select/demo.html" -/> \ No newline at end of file +/> diff --git a/static/usage/select/objects-as-values/multiple-selection/angular/app.component_html.md b/static/usage/select/objects-as-values/multiple-selection/angular/example_component_html.md similarity index 100% rename from static/usage/select/objects-as-values/multiple-selection/angular/app.component_html.md rename to static/usage/select/objects-as-values/multiple-selection/angular/example_component_html.md diff --git a/static/usage/select/objects-as-values/multiple-selection/angular/app.component_ts.md b/static/usage/select/objects-as-values/multiple-selection/angular/example_component_ts.md similarity index 56% rename from static/usage/select/objects-as-values/multiple-selection/angular/app.component_ts.md rename to static/usage/select/objects-as-values/multiple-selection/angular/example_component_ts.md index 49836165f4c..76fa7e51e49 100644 --- a/static/usage/select/objects-as-values/multiple-selection/angular/app.component_ts.md +++ b/static/usage/select/objects-as-values/multiple-selection/angular/example_component_ts.md @@ -2,36 +2,36 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { currentFood = undefined; foods = [ { id: 1, - name: "Apples", - type: "fruit" + name: 'Apples', + type: 'fruit', }, { id: 2, - name: "Carrots", - type: "vegetable" + name: 'Carrots', + type: 'vegetable', }, { id: 3, - name: "Cupcakes", - type: "dessert" - } + name: 'Cupcakes', + type: 'dessert', + }, ]; compareWith(o1, o2) { - if(!o1 || !o2) { + if (!o1 || !o2) { return o1 === o2; } - if(Array.isArray(o2)) { + if (Array.isArray(o2)) { return o2.some((o) => o.id === o1.id); } @@ -42,5 +42,4 @@ export class AppComponent { this.currentFood = ev.target.value; } } - -``` \ No newline at end of file +``` diff --git a/static/usage/select/objects-as-values/multiple-selection/index.md b/static/usage/select/objects-as-values/multiple-selection/index.md index 34e089c97b2..6bced8d6e44 100644 --- a/static/usage/select/objects-as-values/multiple-selection/index.md +++ b/static/usage/select/objects-as-values/multiple-selection/index.md @@ -4,8 +4,8 @@ import javascript from './javascript.md'; import react from './react.md'; import vue from './vue.md'; -import angularHTML from './angular/app.component_html.md'; -import angularTS from './angular/app.component_ts.md'; +import angularHTML from './angular/example_component_html.md'; +import angularTS from './angular/example_component_ts.md'; \ No newline at end of file +/> diff --git a/static/usage/select/objects-as-values/multiple-selection/react.md b/static/usage/select/objects-as-values/multiple-selection/react.md index 76af4828308..e6485198a86 100644 --- a/static/usage/select/objects-as-values/multiple-selection/react.md +++ b/static/usage/select/objects-as-values/multiple-selection/react.md @@ -2,30 +2,36 @@ import React, { useState } from 'react'; import { IonItem, IonList, IonLabel, IonSelect, IonSelectOption } from '@ionic/react'; -const foods = [ +interface Food { + id: number; + name: string; + type: string; +} + +const foods: Food[] = [ { id: 1, - name: "Apples", - type: "fruit" + name: 'Apples', + type: 'fruit', }, { id: 2, - name: "Carrots", - type: "vegetable" + name: 'Carrots', + type: 'vegetable', }, { id: 3, - name: "Cupcakes", - type: "dessert" - } + name: 'Cupcakes', + type: 'dessert', + }, ]; -const compareWith = (o1, o2) => { - if(!o1 || !o2) { +const compareWith = (o1: Food, o2: Food) => { + if (!o1 || !o2) { return o1 === o2; } - if(Array.isArray(o2)) { + if (Array.isArray(o2)) { return o2.some((o) => o.id === o1.id); } @@ -33,7 +39,7 @@ const compareWith = (o1, o2) => { }; function Example() { - const [currentFood, setCurrentFood] = useState(""); + const [currentFood, setCurrentFood] = useState(''); return ( @@ -41,11 +47,13 @@ function Example() { setCurrentFood(JSON.stringify(ev.detail.value))} + onIonChange={(ev) => setCurrentFood(JSON.stringify(ev.detail.value))} multiple={true} > - {foods.map(food => ( - {food.name} + {foods.map((food) => ( + + {food.name} + ))} diff --git a/static/usage/select/objects-as-values/using-comparewith/angular/app.component_html.md b/static/usage/select/objects-as-values/using-comparewith/angular/example_component_html.md similarity index 100% rename from static/usage/select/objects-as-values/using-comparewith/angular/app.component_html.md rename to static/usage/select/objects-as-values/using-comparewith/angular/example_component_html.md diff --git a/static/usage/select/objects-as-values/using-comparewith/angular/app.component_ts.md b/static/usage/select/objects-as-values/using-comparewith/angular/example_component_ts.md similarity index 56% rename from static/usage/select/objects-as-values/using-comparewith/angular/app.component_ts.md rename to static/usage/select/objects-as-values/using-comparewith/angular/example_component_ts.md index d45c2a6b335..afbd5f454cd 100644 --- a/static/usage/select/objects-as-values/using-comparewith/angular/app.component_ts.md +++ b/static/usage/select/objects-as-values/using-comparewith/angular/example_component_ts.md @@ -2,28 +2,28 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: 'app-example', + templateUrl: 'example.component.html', }) -export class AppComponent { +export class ExampleComponent { currentFood = undefined; foods = [ { id: 1, - name: "Apples", - type: "fruit" + name: 'Apples', + type: 'fruit', }, { id: 2, - name: "Carrots", - type: "vegetable" + name: 'Carrots', + type: 'vegetable', }, { id: 3, - name: "Cupcakes", - type: "dessert" - } + name: 'Cupcakes', + type: 'dessert', + }, ]; compareWith(o1, o2) { @@ -34,5 +34,4 @@ export class AppComponent { this.currentFood = ev.target.value; } } - -``` \ No newline at end of file +``` diff --git a/static/usage/select/objects-as-values/using-comparewith/index.md b/static/usage/select/objects-as-values/using-comparewith/index.md index 25e6dc11641..323797ca6ce 100644 --- a/static/usage/select/objects-as-values/using-comparewith/index.md +++ b/static/usage/select/objects-as-values/using-comparewith/index.md @@ -4,8 +4,8 @@ import javascript from './javascript.md'; import react from './react.md'; import vue from './vue.md'; -import angularHTML from './angular/app.component_html.md'; -import angularTS from './angular/app.component_ts.md'; +import angularHTML from './angular/example_component_html.md'; +import angularTS from './angular/example_component_ts.md'; \ No newline at end of file +/> diff --git a/static/usage/select/objects-as-values/using-comparewith/react.md b/static/usage/select/objects-as-values/using-comparewith/react.md index 4763ec85f4f..7cd468d5b0e 100644 --- a/static/usage/select/objects-as-values/using-comparewith/react.md +++ b/static/usage/select/objects-as-values/using-comparewith/react.md @@ -2,30 +2,36 @@ import React, { useState } from 'react'; import { IonItem, IonList, IonLabel, IonSelect, IonSelectOption } from '@ionic/react'; -const foods = [ +interface Food { + id: number; + name: string; + type: string; +} + +const foods: Food[] = [ { id: 1, - name: "Apples", - type: "fruit" + name: 'Apples', + type: 'fruit', }, { id: 2, - name: "Carrots", - type: "vegetable" + name: 'Carrots', + type: 'vegetable', }, { id: 3, - name: "Cupcakes", - type: "dessert" - } + name: 'Cupcakes', + type: 'dessert', + }, ]; -const compareWith = (o1, o2) => { +const compareWith = (o1: Food, o2: Food) => { return o1 && o2 ? o1.id === o2.id : o1 === o2; }; function Example() { - const [currentFood, setCurrentFood] = useState(""); + const [currentFood, setCurrentFood] = useState(''); return ( @@ -33,10 +39,12 @@ function Example() { setCurrentFood(JSON.stringify(ev.detail.value))} + onIonChange={(ev) => setCurrentFood(JSON.stringify(ev.detail.value))} > - {foods.map(food => ( - {food.name} + {foods.map((food) => ( + + {food.name} + ))} From 4e562939e5bf63a630726af8fa4f58a7cf361fc8 Mon Sep 17 00:00:00 2001 From: Amanda Johnston <90629384+amandaejohnston@users.noreply.github.com> Date: Thu, 4 Aug 2022 08:38:39 -0500 Subject: [PATCH 005/469] docs(badge): add playgrounds (#2477) --- docs/api/badge.md | 195 +----------------- static/usage/badge/basic/angular.md | 12 ++ static/usage/badge/basic/demo.html | 39 ++++ static/usage/badge/basic/index.md | 11 + static/usage/badge/basic/javascript.md | 12 ++ static/usage/badge/basic/react.md | 19 ++ static/usage/badge/basic/vue.md | 23 +++ .../badge/customization/color/angular.md | 28 +++ .../usage/badge/customization/color/demo.html | 55 +++++ .../usage/badge/customization/color/index.md | 12 ++ .../badge/customization/color/javascript.md | 28 +++ .../usage/badge/customization/color/react.md | 35 ++++ static/usage/badge/customization/color/vue.md | 39 ++++ .../css-properties/angular/angular-css.md | 8 + .../css-properties/angular/angular-html.md | 8 + .../customization/css-properties/demo.html | 42 ++++ .../customization/css-properties/index.md | 31 +++ .../css-properties/javascript.md | 17 ++ .../css-properties/react/react-css.md | 8 + .../css-properties/react/react-ts.md | 18 ++ .../badge/customization/css-properties/vue.md | 28 +++ 21 files changed, 483 insertions(+), 185 deletions(-) create mode 100644 static/usage/badge/basic/angular.md create mode 100644 static/usage/badge/basic/demo.html create mode 100644 static/usage/badge/basic/index.md create mode 100644 static/usage/badge/basic/javascript.md create mode 100644 static/usage/badge/basic/react.md create mode 100644 static/usage/badge/basic/vue.md create mode 100644 static/usage/badge/customization/color/angular.md create mode 100644 static/usage/badge/customization/color/demo.html create mode 100644 static/usage/badge/customization/color/index.md create mode 100644 static/usage/badge/customization/color/javascript.md create mode 100644 static/usage/badge/customization/color/react.md create mode 100644 static/usage/badge/customization/color/vue.md create mode 100644 static/usage/badge/customization/css-properties/angular/angular-css.md create mode 100644 static/usage/badge/customization/css-properties/angular/angular-html.md create mode 100644 static/usage/badge/customization/css-properties/demo.html create mode 100644 static/usage/badge/customization/css-properties/index.md create mode 100644 static/usage/badge/customization/css-properties/javascript.md create mode 100644 static/usage/badge/customization/css-properties/react/react-css.md create mode 100644 static/usage/badge/customization/css-properties/react/react-ts.md create mode 100644 static/usage/badge/customization/css-properties/vue.md diff --git a/docs/api/badge.md b/docs/api/badge.md index ae0de884003..32004eab66f 100644 --- a/docs/api/badge.md +++ b/docs/api/badge.md @@ -1,8 +1,5 @@ --- title: "ion-badge" -hide_table_of_contents: true -demoUrl: "/docs/demos/api/badge/index.html" -demoSourceUrl: "https://github.com/ionic-team/ionic-docs/tree/main/static/demos/api/badge/index.html" --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -20,200 +17,28 @@ import Slots from '@site/static/auto-generated/badge/slots.md'; import EncapsulationPill from '@components/page/api/EncapsulationPill'; -import APITOCInline from '@components/page/api/APITOCInline'; -

Contents

- - - - - Badges are inline block elements that usually appear near another element. Typically they contain a number or other characters. They can be used as a notification that there are additional items associated with an element and indicate how many items there are. +import BasicExample from '@site/static/usage/badge/basic/index.md'; + + +## Customization Examples +### Color -## Usage +import ColorExample from '@site/static/usage/badge/customization/color/index.md'; - + - +### CSS Properties -```html - -99 +import CSSPropsExample from '@site/static/usage/badge/customization/css-properties/index.md'; - -11 -22 -33 -44 -55 -66 -77 -88 -99 - - - - 11 - My Item - 22 - -``` - - - - - - -```html - -99 - - -11 -22 -33 -44 -55 -66 -77 -88 -99 - - - - 11 - My Item - 22 - -``` - - - - - - -```tsx -import React from 'react'; -import { IonBadge, IonItem, IonLabel, IonContent } from '@ionic/react'; - -export const BadgeExample: React.FC = () => ( - - {/*-- Default --*/} - 99 - - {/*-- Colors --*/} - 11 - 22 - 33 - 44 - 55 - 66 - 77 - 88 - 99 - - {/*-- Item with badge on left and right --*/} - - 11 - My Item - 22 - - -); -``` - - - - - - - -```tsx -import { Component, h } from '@stencil/core'; - -@Component({ - tag: 'badge-example', - styleUrl: 'badge-example.css' -}) -export class BadgeExample { - render() { - return [ - // Default - 99, - - // Colors - 11, - 22, - 33, - 44, - 55, - 66, - 77, - 88, - 99, - - // Item with badge on left and right - - 11 - My Item - 22 - - ]; - } -} -``` - - - - - - -```html - - - -``` - - - - + ## Properties diff --git a/static/usage/badge/basic/angular.md b/static/usage/badge/basic/angular.md new file mode 100644 index 00000000000..9f8de1ff7eb --- /dev/null +++ b/static/usage/badge/basic/angular.md @@ -0,0 +1,12 @@ +```html + + + 11 + Badge in start slot + + + 22 + Badge in end slot + + +``` diff --git a/static/usage/badge/basic/demo.html b/static/usage/badge/basic/demo.html new file mode 100644 index 00000000000..dee14a40209 --- /dev/null +++ b/static/usage/badge/basic/demo.html @@ -0,0 +1,39 @@ + + + + + + + Badge + + + + + + + + + + + +
+ + + 11 + Badge in start slot + + + 22 + Badge in end slot + + +
+
+
+ + + \ No newline at end of file diff --git a/static/usage/badge/basic/index.md b/static/usage/badge/basic/index.md new file mode 100644 index 00000000000..c549304418e --- /dev/null +++ b/static/usage/badge/basic/index.md @@ -0,0 +1,11 @@ +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 from './angular.md'; + + \ No newline at end of file diff --git a/static/usage/badge/basic/javascript.md b/static/usage/badge/basic/javascript.md new file mode 100644 index 00000000000..9f8de1ff7eb --- /dev/null +++ b/static/usage/badge/basic/javascript.md @@ -0,0 +1,12 @@ +```html + + + 11 + Badge in start slot + + + 22 + Badge in end slot + + +``` diff --git a/static/usage/badge/basic/react.md b/static/usage/badge/basic/react.md new file mode 100644 index 00000000000..4d569dbbd02 --- /dev/null +++ b/static/usage/badge/basic/react.md @@ -0,0 +1,19 @@ +```tsx +import React from 'react'; +import { IonBadge, IonItem, IonLabel, IonList } from '@ionic/react'; +function Example() { + return ( + + + 11 + Badge in start slot + + + 22 + Badge in end slot + + + ); +} +export default Example; +``` diff --git a/static/usage/badge/basic/vue.md b/static/usage/badge/basic/vue.md new file mode 100644 index 00000000000..e02b9c552e3 --- /dev/null +++ b/static/usage/badge/basic/vue.md @@ -0,0 +1,23 @@ +```html + + + +``` diff --git a/static/usage/badge/customization/color/angular.md b/static/usage/badge/customization/color/angular.md new file mode 100644 index 00000000000..bad750b1bfc --- /dev/null +++ b/static/usage/badge/customization/color/angular.md @@ -0,0 +1,28 @@ +```html + + + Followers + 22k + + + Likes + 118k + + + Stars + 34k + + + Completed + 80 + + + Warnings + 70 + + + Notifications + 1000 + + +``` diff --git a/static/usage/badge/customization/color/demo.html b/static/usage/badge/customization/color/demo.html new file mode 100644 index 00000000000..82b36f6d955 --- /dev/null +++ b/static/usage/badge/customization/color/demo.html @@ -0,0 +1,55 @@ + + + + + + + Badge + + + + + + + + + + + +
+ + + Followers + 22k + + + Likes + 118k + + + Stars + 34k + + + Completed + 80 + + + Warnings + 70 + + + Notifications + 1000 + + +
+
+
+ + + \ No newline at end of file diff --git a/static/usage/badge/customization/color/index.md b/static/usage/badge/customization/color/index.md new file mode 100644 index 00000000000..047e0871bcf --- /dev/null +++ b/static/usage/badge/customization/color/index.md @@ -0,0 +1,12 @@ +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 from './angular.md'; + + \ No newline at end of file diff --git a/static/usage/badge/customization/color/javascript.md b/static/usage/badge/customization/color/javascript.md new file mode 100644 index 00000000000..bad750b1bfc --- /dev/null +++ b/static/usage/badge/customization/color/javascript.md @@ -0,0 +1,28 @@ +```html + + + Followers + 22k + + + Likes + 118k + + + Stars + 34k + + + Completed + 80 + + + Warnings + 70 + + + Notifications + 1000 + + +``` diff --git a/static/usage/badge/customization/color/react.md b/static/usage/badge/customization/color/react.md new file mode 100644 index 00000000000..ad53c54274a --- /dev/null +++ b/static/usage/badge/customization/color/react.md @@ -0,0 +1,35 @@ +```tsx +import React from 'react'; +import { IonBadge, IonItem, IonLabel, IonList } from '@ionic/react'; +function Example() { + return ( + + + Followers + 22k + + + Likes + 118k + + + Stars + 34k + + + Completed + 80 + + + Warnings + 70 + + + Notifications + 1000 + + + ); +} +export default Example; +``` diff --git a/static/usage/badge/customization/color/vue.md b/static/usage/badge/customization/color/vue.md new file mode 100644 index 00000000000..77e5c1a9e97 --- /dev/null +++ b/static/usage/badge/customization/color/vue.md @@ -0,0 +1,39 @@ +```html + + + +``` diff --git a/static/usage/badge/customization/css-properties/angular/angular-css.md b/static/usage/badge/customization/css-properties/angular/angular-css.md new file mode 100644 index 00000000000..950e96b4e80 --- /dev/null +++ b/static/usage/badge/customization/css-properties/angular/angular-css.md @@ -0,0 +1,8 @@ +```css +ion-badge { + --background: purple; + --color: white; + --padding-end: 20px; + --padding-start: 20px; +} +``` \ No newline at end of file diff --git a/static/usage/badge/customization/css-properties/angular/angular-html.md b/static/usage/badge/customization/css-properties/angular/angular-html.md new file mode 100644 index 00000000000..92df32f60de --- /dev/null +++ b/static/usage/badge/customization/css-properties/angular/angular-html.md @@ -0,0 +1,8 @@ +```html + + + Badges styled + 1 + + +``` diff --git a/static/usage/badge/customization/css-properties/demo.html b/static/usage/badge/customization/css-properties/demo.html new file mode 100644 index 00000000000..2789948ad7e --- /dev/null +++ b/static/usage/badge/customization/css-properties/demo.html @@ -0,0 +1,42 @@ + + + + + + + Select - Styling the Select + + + + + + + + + + + +
+ + + Badges styled + 1 + + +
+
+
+ + + \ No newline at end of file diff --git a/static/usage/badge/customization/css-properties/index.md b/static/usage/badge/customization/css-properties/index.md new file mode 100644 index 00000000000..de39bd6203f --- /dev/null +++ b/static/usage/badge/customization/css-properties/index.md @@ -0,0 +1,31 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; +import vue from './vue.md'; + +import reactTS from './react/react-ts.md'; +import reactCSS from './react/react-css.md'; + +import angularHTML from './angular/angular-html.md'; +import angularCSS from './angular/angular-css.md'; + + diff --git a/static/usage/badge/customization/css-properties/javascript.md b/static/usage/badge/customization/css-properties/javascript.md new file mode 100644 index 00000000000..6dedc97ba4d --- /dev/null +++ b/static/usage/badge/customization/css-properties/javascript.md @@ -0,0 +1,17 @@ +```html + + + Badges styled + 1 + + + + +``` diff --git a/static/usage/badge/customization/css-properties/react/react-css.md b/static/usage/badge/customization/css-properties/react/react-css.md new file mode 100644 index 00000000000..950e96b4e80 --- /dev/null +++ b/static/usage/badge/customization/css-properties/react/react-css.md @@ -0,0 +1,8 @@ +```css +ion-badge { + --background: purple; + --color: white; + --padding-end: 20px; + --padding-start: 20px; +} +``` \ No newline at end of file diff --git a/static/usage/badge/customization/css-properties/react/react-ts.md b/static/usage/badge/customization/css-properties/react/react-ts.md new file mode 100644 index 00000000000..fea8b34191e --- /dev/null +++ b/static/usage/badge/customization/css-properties/react/react-ts.md @@ -0,0 +1,18 @@ +```tsx +import React from 'react'; +import { IonBadge, IonItem, IonLabel, IonList } from '@ionic/react'; + +import './main.css'; + +function Example() { + return ( + + + Badges styled + 1 + + + ); +} +export default Example; +``` diff --git a/static/usage/badge/customization/css-properties/vue.md b/static/usage/badge/customization/css-properties/vue.md new file mode 100644 index 00000000000..08a5d88d81e --- /dev/null +++ b/static/usage/badge/customization/css-properties/vue.md @@ -0,0 +1,28 @@ +```html + + + + + +``` From 8f4b2a7bb45d44a3ede159e9073949914ce120e4 Mon Sep 17 00:00:00 2001 From: Amanda Johnston <90629384+amandaejohnston@users.noreply.github.com> Date: Thu, 4 Aug 2022 09:19:28 -0500 Subject: [PATCH 006/469] docs(support): update v5 to extended support only (#2478) --- docs/reference/support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/support.md b/docs/reference/support.md index 3e9c702cad6..54e23e3664f 100644 --- a/docs/reference/support.md +++ b/docs/reference/support.md @@ -23,7 +23,7 @@ The current status of each Ionic Framework version is: | Version | Status | Released | Maintenance Ends | Ext. Support Ends | | :-----: | :-------------------: | :----------: | :--------------: | :---------------: | | V6 | **Active** | Dec 8, 2021 | TBD | TBD | -| V5 | Maintenance | Feb 11, 2020 | June 8, 2022 | Dec 8, 2022 | +| V5 | Extended Support Only | Feb 11, 2020 | June 8, 2022 | Dec 8, 2022 | | V4 | Extended Support Only | Jan 23, 2019 | Aug 11, 2020 | Sept 30, 2022 | | V3 | End of Support | Apr 5, 2017 | Oct 30, 2019 | Aug 11, 2020 | | V2 | End of Support | Jan 25, 2017 | Apr 5, 2017 | Apr 5, 2017 | From aff9fa345981916024cfbaf69ddd08de5500133e Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Thu, 4 Aug 2022 10:58:08 -0400 Subject: [PATCH 007/469] docs(release-notes): update version names (#2479) --- scripts/release-notes.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/release-notes.js b/scripts/release-notes.js index 6b65c6fa7b5..8d83e1df023 100644 --- a/scripts/release-notes.js +++ b/scripts/release-notes.js @@ -236,6 +236,16 @@ var versions = [ symbol: 'V', element: 'Vanadium', }, + { + minor: '6.2', + symbol: 'Cr', + element: 'Chromium' + }, + { + minor: '6.3', + symbol: 'Mn', + element: 'Manganese' + } ]; var fallbackVersion = { minor: '9201', symbol: 'Uo', element: 'Unobtainium' }; From 2bbe3e2157c189d9942d856867c1203c2eac980e Mon Sep 17 00:00:00 2001 From: Amanda Johnston <90629384+amandaejohnston@users.noreply.github.com> Date: Thu, 4 Aug 2022 16:07:22 -0500 Subject: [PATCH 008/469] fix(playground): ensure dark mode loads on iframes at start (#2481) --- src/components/global/Playground/index.tsx | 49 ++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/src/components/global/Playground/index.tsx b/src/components/global/Playground/index.tsx index d8066bcc302..ca4128b9929 100644 --- a/src/components/global/Playground/index.tsx +++ b/src/components/global/Playground/index.tsx @@ -128,7 +128,7 @@ export default function Playground({ * url, we post a message to each frame so that * dark mode can be enabled without a full page reload. */ - useEffect(async () => { + const postDarkThemeMessage = async () => { if (frameiOS.current && frameMD.current) { await Promise.all([waitForFrame(frameiOS.current), waitForFrame(frameMD.current)]); @@ -136,6 +136,32 @@ export default function Playground({ frameiOS.current.contentWindow.postMessage(message); frameMD.current.contentWindow.postMessage(message); } + }; + + const handleFrameRef = (ref: HTMLIFrameElement, frameMode: 'ios' | 'md') => { + if (frameMode === 'ios') { + frameiOS.current = ref; + } else { + frameMD.current = ref; + } + + /** + * If both frames are loaded, init the dark theme for the first page load. + * When dark mode is toggled after the fact, that's handled by the + * useEffect below. + */ + if (frameiOS.current && frameMD.current) { + postDarkThemeMessage(); + } + }; + + useEffect(() => { + /** + * Note that we can't just do useEffect(postDarkThemeMessage) + * because useEffect callbacks cannot return a Promise, as + * async functions do. + */ + postDarkThemeMessage(); }, [isDarkTheme]); /** @@ -143,10 +169,17 @@ export default function Playground({ * load, so a loading screen is shown by default. * Once the source of the iframe loads we can * hide the loading screen and show the inner content. + * + * We call this as a local function because useEffect + * callbacks cannot return a Promise, as async functions do. */ - useEffect(async () => { - await Promise.all([waitForFrame(frameiOS.current), waitForFrame(frameMD.current)]); - setIframesLoaded(true); + useEffect(() => { + const setFramesLoaded = async () => { + await Promise.all([waitForFrame(frameiOS.current), waitForFrame(frameMD.current)]); + setIframesLoaded(true); + }; + + setFramesLoaded(); }, [renderIframes]); useEffect(() => { @@ -464,12 +497,12 @@ export default function Playground({ ? [
- +
,
- +
, ] @@ -477,13 +510,13 @@ export default function Playground({ , , ]} From 73f82f939ac728ebf67fc34e8ebcd4c7943c6965 Mon Sep 17 00:00:00 2001 From: John Wheeler <73669769+johnwheeler-prod@users.noreply.github.com> Date: Mon, 8 Aug 2022 15:10:20 -0400 Subject: [PATCH 009/469] chore(titan updates): updates through 08-08 (#2487) --- docs/vue/overview.md | 8 ++++++++ docs/vue/pwa.md | 8 ++++++++ scripts/data/meta-override.json | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/docs/vue/overview.md b/docs/vue/overview.md index 18eedbfa4b6..d5b68367f49 100644 --- a/docs/vue/overview.md +++ b/docs/vue/overview.md @@ -2,6 +2,14 @@ sidebar_label: Overview --- + + Ionic Vue Overview | Vue.js Framework Documentation + + + import DocsCard from '@components/global/DocsCard'; import DocsCards from '@components/global/DocsCards'; diff --git a/docs/vue/pwa.md b/docs/vue/pwa.md index 15fef825bad..2c75702bd46 100644 --- a/docs/vue/pwa.md +++ b/docs/vue/pwa.md @@ -2,6 +2,14 @@ sidebar_label: Progressive Web Apps --- + + Vue PWA | Add Progressive Web Apps to Vue.js Projects | Ionic + + + # Progressive Web Apps in Vue ## Making your Vue app a PWA diff --git a/scripts/data/meta-override.json b/scripts/data/meta-override.json index f287815058f..9f058fd4f06 100644 --- a/scripts/data/meta-override.json +++ b/scripts/data/meta-override.json @@ -600,6 +600,10 @@ "title": "File Chooser | Opens File Picker on Android and Returns File URI", "description": "File Chooser opens the file picker on Android for the user to select a file and returns a file URI. Read for more about File Chooser installation and usage." }, + "file-opener": { + "title": "File Opener - Plugin for Cordova | Ionic Documentation", + "description": "File opener2 plugin for Cordova opens files on your device file system with its default application. Learn more about installation and usage." + }, "file-transfer": { "title": "File Transfer | Cordova Docs File Transfer Download Plugin", "description": "The Cordova File Transfer plug in allows you to upload and download docs files. This plugin is supported on iOS, Android, Windows, and more platforms." From ba06ce76b62b8c4e622a6618323984de114d98e4 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Tue, 9 Aug 2022 10:22:56 -0400 Subject: [PATCH 010/469] docs(skeleton-text): add playgrounds (#2486) --- docs/api/skeleton-text.md | 876 +----------------- .../basic/angular/angular-html.md | 39 + .../skeleton-text/basic/angular/angular-ts.md | 13 + static/usage/skeleton-text/basic/demo.html | 89 ++ static/usage/skeleton-text/basic/index.md | 24 + .../usage/skeleton-text/basic/javascript.md | 61 ++ static/usage/skeleton-text/basic/react.md | 61 ++ static/usage/skeleton-text/basic/vue.md | 78 ++ .../theming/angular/angular-css.md | 7 + .../theming/angular/angular-html.md | 23 + static/usage/skeleton-text/theming/demo.html | 57 ++ static/usage/skeleton-text/theming/index.md | 32 + .../usage/skeleton-text/theming/javascript.md | 31 + .../skeleton-text/theming/react/react-css.md | 7 + .../skeleton-text/theming/react/react-tsx.md | 40 + static/usage/skeleton-text/theming/vue.md | 56 ++ 16 files changed, 625 insertions(+), 869 deletions(-) create mode 100644 static/usage/skeleton-text/basic/angular/angular-html.md create mode 100644 static/usage/skeleton-text/basic/angular/angular-ts.md create mode 100644 static/usage/skeleton-text/basic/demo.html create mode 100644 static/usage/skeleton-text/basic/index.md create mode 100644 static/usage/skeleton-text/basic/javascript.md create mode 100644 static/usage/skeleton-text/basic/react.md create mode 100644 static/usage/skeleton-text/basic/vue.md create mode 100644 static/usage/skeleton-text/theming/angular/angular-css.md create mode 100644 static/usage/skeleton-text/theming/angular/angular-html.md create mode 100644 static/usage/skeleton-text/theming/demo.html create mode 100644 static/usage/skeleton-text/theming/index.md create mode 100644 static/usage/skeleton-text/theming/javascript.md create mode 100644 static/usage/skeleton-text/theming/react/react-css.md create mode 100644 static/usage/skeleton-text/theming/react/react-tsx.md create mode 100644 static/usage/skeleton-text/theming/vue.md diff --git a/docs/api/skeleton-text.md b/docs/api/skeleton-text.md index 7c877f55dd2..53c6a2d76b4 100644 --- a/docs/api/skeleton-text.md +++ b/docs/api/skeleton-text.md @@ -1,8 +1,5 @@ --- title: "ion-skeleton-text" -hide_table_of_contents: true -demoUrl: "/docs/demos/api/skeleton-text/index.html" -demoSourceUrl: "https://github.com/ionic-team/ionic-docs/tree/main/static/demos/api/skeleton-text/index.html" --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -24,882 +21,23 @@ import APITOCInline from '@components/page/api/APITOCInline'; -

Contents

- - - Skeleton Text is a component for rendering placeholder content. The element will render a gray block at the specified width. +## Basic Usage +import Basic from '@site/static/usage/skeleton-text/basic/index.md'; + -## Usage - - - - - -```html - -
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac eros est. Cras iaculis pulvinar arcu non vehicula. Fusce at quam a eros malesuada condimentum. Aliquam tincidunt tincidunt vehicula. -
- - - - - Data - - - - - - - -

- {{ data.heading }} -

-

- {{ data.para1 }} -

-

- {{ data.para2 }} -

-
-
- - - - - -

- {{ data.heading }} -

-

- {{ data.para1 }} -

-

- {{ data.para2 }} -

-
-
- - - -

- {{ data.heading }} -

-

- {{ data.para1 }} -

-

- {{ data.para2 }} -

-
-
-
-
- - -
-
- - - - - -
- - - - - - - - - - - - -

- -

-

- -

-

- -

-
-
- - - - - -

- -

-

- -

-

- -

-
-
- - - -

- -

-

- -

-

- -

-
-
-
-
-``` - -```css -/* Custom Skeleton Line Height and Margin */ -.custom-skeleton ion-skeleton-text { - line-height: 13px; -} - -.custom-skeleton ion-skeleton-text:last-child { - margin-bottom: 5px; -} -``` - -```typescript -import { Component } from '@angular/core'; - -@Component({ - selector: 'skeleton-text-example', - templateUrl: 'skeleton-text-example.html', - styleUrls: ['./skeleton-text-example.css'] -}) -export class SkeletonTextExample { - data: any; - - constructor() {} - - ionViewWillEnter() { - setTimeout(() => { - this.data = { - 'heading': 'Normal text', - 'para1': 'Lorem ipsum dolor sit amet, consectetur', - 'para2': 'adipiscing elit.' - }; - }, 5000); - } -} -``` - -
- - - - -```html - -
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac eros est. Cras iaculis pulvinar arcu non vehicula. Fusce at quam a eros malesuada condimentum. Aliquam tincidunt tincidunt vehicula. -
- - - - - Data - - - - - - - -

- Normal text -

-

- Lorem ipsum dolor sit amet, consectetur -

-

- adipiscing elit. -

-
-
- - - - - -

- Normal text -

-

- Lorem ipsum dolor sit amet, consectetur -

-

- adipiscing elit. -

-
-
- - - -

- Normal text -

-

- Lorem ipsum dolor sit amet, consectetur -

-

- adipiscing elit. -

-
-
-
-
- - -
-
- - - - - -
- - - - - - - - - - - - -

- -

-

- -

-

- -

-
-
- - - - - -

- -

-

- -

-

- -

-
-
- - - -

- -

-

- -

-

- -

-
-
-
-
-``` - -```css -#data { - display: none; -} - -/* Custom Skeleton Line Height and Margin */ -.custom-skeleton ion-skeleton-text { - line-height: 13px; -} - -.custom-skeleton ion-skeleton-text:last-child { - margin-bottom: 5px; -} -``` - -```javascript -function onLoad() { - const skeletonEl = document.getElementById('skeleton'); - const dataEl = document.getElementById('data'); - - setTimeout(() => { - skeletonEl.style.display = 'none'; - dataEl.style.display = 'block'; - }, 5000); -} -``` - -
- - - - -```tsx -import React, { useState } from 'react'; -import { - IonContent, - IonItem, - IonAvatar, - IonLabel, - IonSkeletonText, - IonListHeader, - IonIcon, - IonThumbnail, - IonList -} from '@ionic/react'; -import { call } from 'ionicons/icons'; - -import './SkeletonTextExample.css'; - -export const SkeletonTextExample: React.FC = () => { - const [data, setData] = useState(); - - setTimeout(() => { - setData({ - heading: 'Normal text', - para1: 'Lorem ipsum dolor sit amet, consectetur', - para2: 'adipiscing elit.' - }); - }, 5000); - - return ( - - {data ? ( - <> -
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac eros est. Cras iaculis pulvinar - arcu non vehicula. Fusce at quam a eros malesuada condimentum. Aliquam tincidunt tincidunt - vehicula. -
- - - - - Data - - - - - - - -

{data.heading}

-

{data.para1}

-

{data.para2}

-
-
- - - - - -

{data.heading}

-

{data.para1}

-

{data.para2}

-
-
- - - -

{data.heading}

-

{data.para1}

-

{data.para2}

-
-
-
- - ) : ( - <> -
- - - - - -
- - - - - - - - - - - - -

- -

-

- -

-

- -

-
-
- - - - - -

- -

-

- -

-

- -

-
-
- - - -

- -

-

- -

-

- -

-
-
-
- - )} -
- ); -}; -``` - -```css -/* Custom Skeleton Line Height and Margin */ -.custom-skeleton ion-skeleton-text { - line-height: 13px; -} - -.custom-skeleton ion-skeleton-text:last-child { - margin-bottom: 5px; -} -``` - -
- - - - -```tsx -import { Component, State, h } from '@stencil/core'; - -@Component({ - tag: 'skeleton-text-example', - styleUrl: 'skeleton-text-example.css' -}) -export class SkeletonTextExample { - @State() data: any; - - componentWillLoad() { - // Data will show after 5 seconds - setTimeout(() => { - this.data = { - 'heading': 'Normal text', - 'para1': 'Lorem ipsum dolor sit amet, consectetur', - 'para2': 'adipiscing elit.' - }; - }, 5000); - } - - // Render skeleton screen when there is no data - renderSkeletonScreen() { - return [ - -
- - - - - -
- - - - - - - - - - - - -

- -

-

- -

-

- -

-
-
- - - - - -

- -

-

- -

-

- -

-
-
- - - -

- -

-

- -

-

- -

-
-
-
-
- ]; - } - - // Render the elements with data - renderDataScreen() { - return [ - -
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac eros est. Cras iaculis pulvinar arcu non vehicula. Fusce at quam a eros malesuada condimentum. Aliquam tincidunt tincidunt vehicula. -
- - - - - Data - - - - - - - -

- { this.data.heading } -

-

- { this.data.para1 } -

-

- { this.data.para2 } -

-
-
- - - - - -

- { this.data.heading } -

-

- { this.data.para1 } -

-

- { this.data.para2 } -

-
-
- - - -

- { this.data.heading } -

-

- { this.data.para1 } -

-

- { this.data.para2 } -

-
-
-
-
- ]; - } - - render() { - if (this.data) { - return this.renderDataScreen(); - } else { - return this.renderSkeletonScreen(); - } - } -} -``` - -```css -/* Custom Skeleton Line Height and Margin */ -.custom-skeleton ion-skeleton-text { - line-height: 13px; -} - -.custom-skeleton ion-skeleton-text:last-child { - margin-bottom: 5px; -} -``` - -
- - - - -```html - - - - - -``` +### Theming - +import Theming from '@site/static/usage/skeleton-text/theming/index.md'; -
+ ## Properties diff --git a/static/usage/skeleton-text/basic/angular/angular-html.md b/static/usage/skeleton-text/basic/angular/angular-html.md new file mode 100644 index 00000000000..bea0ee90431 --- /dev/null +++ b/static/usage/skeleton-text/basic/angular/angular-html.md @@ -0,0 +1,39 @@ +```html + + Albums + + + + + +

Abbey Road

+

The Beatles

+

1969

+
+
+
+ + + + + + + + + + +

+ +

+

+ +

+

+ +

+
+
+
+ +Toggle +``` diff --git a/static/usage/skeleton-text/basic/angular/angular-ts.md b/static/usage/skeleton-text/basic/angular/angular-ts.md new file mode 100644 index 00000000000..1931197e875 --- /dev/null +++ b/static/usage/skeleton-text/basic/angular/angular-ts.md @@ -0,0 +1,13 @@ +```ts +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: 'app.component.html', + styleUrls: ['app.component.css'] +}) +export class AppComponent { + public loaded = false; +} + +``` \ No newline at end of file diff --git a/static/usage/skeleton-text/basic/demo.html b/static/usage/skeleton-text/basic/demo.html new file mode 100644 index 00000000000..1571c89d85f --- /dev/null +++ b/static/usage/skeleton-text/basic/demo.html @@ -0,0 +1,89 @@ + + + + + + Accordion + + + + + + + + + + +
+
+ Toggle +
+
+
+ + + + diff --git a/static/usage/skeleton-text/basic/index.md b/static/usage/skeleton-text/basic/index.md new file mode 100644 index 00000000000..a605ef2462f --- /dev/null +++ b/static/usage/skeleton-text/basic/index.md @@ -0,0 +1,24 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; +import react from './react.md'; +import vue from './vue.md'; + +import angularHTML from './angular/angular-html.md'; +import angularTS from './angular/angular-ts.md'; + + diff --git a/static/usage/skeleton-text/basic/javascript.md b/static/usage/skeleton-text/basic/javascript.md new file mode 100644 index 00000000000..5eefa7c1149 --- /dev/null +++ b/static/usage/skeleton-text/basic/javascript.md @@ -0,0 +1,61 @@ +```html +
+Toggle + + +``` diff --git a/static/usage/skeleton-text/basic/react.md b/static/usage/skeleton-text/basic/react.md new file mode 100644 index 00000000000..2ea377034c9 --- /dev/null +++ b/static/usage/skeleton-text/basic/react.md @@ -0,0 +1,61 @@ +```tsx +import React, { useState } from 'react'; +import { + IonButton, + IonIcon, + IonItem, + IonLabel, + IonList, + IonListHeader, + IonSkeletonText, + IonThumbnail, +} from '@ionic/react'; +import { musicalNotes } from 'ionicons/icons'; +function Example() { + const [loaded, setLoaded] = useState(false); + return ( + <> + {loaded && + + Albums + + + + + +

Abbey Road

+

The Beatles

+

1969

+
+
+
+ } + {!loaded && + + + + + + + + + +

+ +

+

+ +

+

+ +

+
+
+
+ } + setLoaded(!loaded)}>Toggle + + ); +} +export default Example; +``` \ No newline at end of file diff --git a/static/usage/skeleton-text/basic/vue.md b/static/usage/skeleton-text/basic/vue.md new file mode 100644 index 00000000000..c03a518af19 --- /dev/null +++ b/static/usage/skeleton-text/basic/vue.md @@ -0,0 +1,78 @@ +```html + + + +``` diff --git a/static/usage/skeleton-text/theming/angular/angular-css.md b/static/usage/skeleton-text/theming/angular/angular-css.md new file mode 100644 index 00000000000..67761872c60 --- /dev/null +++ b/static/usage/skeleton-text/theming/angular/angular-css.md @@ -0,0 +1,7 @@ +```css +ion-skeleton-text { + --border-radius: 9999px; + --background: rgba(188, 0, 255, 0.065); + --background-rgb: 188, 0, 255; +} +``` \ No newline at end of file diff --git a/static/usage/skeleton-text/theming/angular/angular-html.md b/static/usage/skeleton-text/theming/angular/angular-html.md new file mode 100644 index 00000000000..4044c112b0c --- /dev/null +++ b/static/usage/skeleton-text/theming/angular/angular-html.md @@ -0,0 +1,23 @@ +```html + + + + + + + + + +

+ +

+

+ +

+

+ +

+
+
+
+``` diff --git a/static/usage/skeleton-text/theming/demo.html b/static/usage/skeleton-text/theming/demo.html new file mode 100644 index 00000000000..98c691431e9 --- /dev/null +++ b/static/usage/skeleton-text/theming/demo.html @@ -0,0 +1,57 @@ + + + + + + Accordion + + + + + + + + + + +
+ + + + + + + + + +

+ +

+

+ +

+

+ +

+
+
+
+
+
+
+ + diff --git a/static/usage/skeleton-text/theming/index.md b/static/usage/skeleton-text/theming/index.md new file mode 100644 index 00000000000..7f7cde7b91d --- /dev/null +++ b/static/usage/skeleton-text/theming/index.md @@ -0,0 +1,32 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; + +import reactTSX from './react/react-tsx.md'; +import reactCSS from './react/react-css.md'; + +import vue from './vue.md'; + +import angularHTML from './angular/angular-html.md'; +import angularCSS from './angular/angular-css.md'; + + diff --git a/static/usage/skeleton-text/theming/javascript.md b/static/usage/skeleton-text/theming/javascript.md new file mode 100644 index 00000000000..20463c6aba6 --- /dev/null +++ b/static/usage/skeleton-text/theming/javascript.md @@ -0,0 +1,31 @@ +```html + + + + + + + + + + + +

+ +

+

+ +

+

+ +

+
+
+
+``` diff --git a/static/usage/skeleton-text/theming/react/react-css.md b/static/usage/skeleton-text/theming/react/react-css.md new file mode 100644 index 00000000000..67761872c60 --- /dev/null +++ b/static/usage/skeleton-text/theming/react/react-css.md @@ -0,0 +1,7 @@ +```css +ion-skeleton-text { + --border-radius: 9999px; + --background: rgba(188, 0, 255, 0.065); + --background-rgb: 188, 0, 255; +} +``` \ No newline at end of file diff --git a/static/usage/skeleton-text/theming/react/react-tsx.md b/static/usage/skeleton-text/theming/react/react-tsx.md new file mode 100644 index 00000000000..29e6e159f68 --- /dev/null +++ b/static/usage/skeleton-text/theming/react/react-tsx.md @@ -0,0 +1,40 @@ +```tsx +import React from 'react'; +import { + IonItem, + IonLabel, + IonList, + IonListHeader, + IonSkeletonText, + IonThumbnail, +} from '@ionic/react'; + +import './main.css'; + +function Example() { + return ( + + + + + + + + + +

+ +

+

+ +

+

+ +

+
+
+
+ ); +} +export default Example; +``` \ No newline at end of file diff --git a/static/usage/skeleton-text/theming/vue.md b/static/usage/skeleton-text/theming/vue.md new file mode 100644 index 00000000000..418a7ca610f --- /dev/null +++ b/static/usage/skeleton-text/theming/vue.md @@ -0,0 +1,56 @@ +```html + + + + + +``` From f2e622f938feeb4fbc27d36d8a73ae817584a0ce Mon Sep 17 00:00:00 2001 From: John Wheeler <73669769+johnwheeler-prod@users.noreply.github.com> Date: Tue, 9 Aug 2022 10:38:37 -0400 Subject: [PATCH 011/469] chore(titan updates): updates through 0809 (#2489) --- scripts/data/meta-override.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/data/meta-override.json b/scripts/data/meta-override.json index 9f058fd4f06..10de584062e 100644 --- a/scripts/data/meta-override.json +++ b/scripts/data/meta-override.json @@ -322,6 +322,10 @@ "title": "Angular NG Build Configuration to Build Ionic Apps | ionic build", "description": "Build web assets and prepare your Ionic app for any platform targets. Ionic build uses the Angular CLI—see the ng build docs for how to use the configuration." }, + "capacitor-build": { + "title": "Ionic Capacitor Build for Apps - Documentation", + "description": "Build an Ionic project for a given platform. Once Ionic Capacitor Build copies web assets into the native platform, you can build your app using the native IDE." + }, "capacitor-copy": { "title": "Ionic Capacitor Copy - Options to Copy and Compile Web Assets", "description": "Perform an Ionic build, which compiles web assets and copies web assets to Capacitor native platform(s), with Ionic Capacitor Copy. Read to learn about options." From 98cd3704380cbaeb405735761c49641c73257346 Mon Sep 17 00:00:00 2001 From: Sean Perkins Date: Thu, 11 Aug 2022 14:02:19 -0400 Subject: [PATCH 012/469] docs(chip): playground examples (#2480) --- docs/api/chip.md | 328 +----------------- static/usage/chip/basic/angular.md | 5 + static/usage/chip/basic/demo.html | 27 ++ static/usage/chip/basic/index.md | 8 + static/usage/chip/basic/javascript.md | 5 + static/usage/chip/basic/react.md | 14 + static/usage/chip/basic/vue.md | 16 + static/usage/chip/color/angular.md | 12 + static/usage/chip/color/demo.html | 45 +++ static/usage/chip/color/index.md | 8 + static/usage/chip/color/javascript.md | 12 + static/usage/chip/color/react.md | 21 ++ static/usage/chip/color/vue.md | 23 ++ static/usage/chip/slots/angular.md | 15 + static/usage/chip/slots/demo.html | 37 ++ static/usage/chip/slots/index.md | 8 + static/usage/chip/slots/javascript.md | 15 + static/usage/chip/slots/react.md | 26 ++ static/usage/chip/slots/vue.md | 34 ++ .../styling/angular/example_component_css.md | 6 + .../styling/angular/example_component_html.md | 3 + static/usage/chip/styling/demo.html | 32 ++ static/usage/chip/styling/index.md | 31 ++ static/usage/chip/styling/javascript.md | 10 + static/usage/chip/styling/react/main_css.md | 6 + static/usage/chip/styling/react/main_tsx.md | 11 + static/usage/chip/styling/vue.md | 21 ++ 27 files changed, 463 insertions(+), 316 deletions(-) create mode 100644 static/usage/chip/basic/angular.md create mode 100644 static/usage/chip/basic/demo.html create mode 100644 static/usage/chip/basic/index.md create mode 100644 static/usage/chip/basic/javascript.md create mode 100644 static/usage/chip/basic/react.md create mode 100644 static/usage/chip/basic/vue.md create mode 100644 static/usage/chip/color/angular.md create mode 100644 static/usage/chip/color/demo.html create mode 100644 static/usage/chip/color/index.md create mode 100644 static/usage/chip/color/javascript.md create mode 100644 static/usage/chip/color/react.md create mode 100644 static/usage/chip/color/vue.md create mode 100644 static/usage/chip/slots/angular.md create mode 100644 static/usage/chip/slots/demo.html create mode 100644 static/usage/chip/slots/index.md create mode 100644 static/usage/chip/slots/javascript.md create mode 100644 static/usage/chip/slots/react.md create mode 100644 static/usage/chip/slots/vue.md create mode 100644 static/usage/chip/styling/angular/example_component_css.md create mode 100644 static/usage/chip/styling/angular/example_component_html.md create mode 100644 static/usage/chip/styling/demo.html create mode 100644 static/usage/chip/styling/index.md create mode 100644 static/usage/chip/styling/javascript.md create mode 100644 static/usage/chip/styling/react/main_css.md create mode 100644 static/usage/chip/styling/react/main_tsx.md create mode 100644 static/usage/chip/styling/vue.md diff --git a/docs/api/chip.md b/docs/api/chip.md index 4e10449fd00..55b50b01d34 100644 --- a/docs/api/chip.md +++ b/docs/api/chip.md @@ -1,12 +1,6 @@ --- title: "ion-chip" -hide_table_of_contents: true -demoUrl: "/docs/demos/api/chip/index.html" -demoSourceUrl: "https://github.com/ionic-team/ionic-docs/tree/main/static/demos/api/chip/index.html" --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - import Props from '@site/static/auto-generated/chip/props.md'; import Events from '@site/static/auto-generated/chip/events.md'; import Methods from '@site/static/auto-generated/chip/methods.md'; @@ -24,330 +18,32 @@ import APITOCInline from '@components/page/api/APITOCInline'; -

Contents

- - - - - Chips represent complex entities in small blocks, such as a contact. A chip can contain several different elements such as avatars, text, and icons. +## Basic +import BasicExample from '@site/static/usage/chip/basic/index.md'; -## Usage - - - - - -```html - - Default - - - - Secondary Label - - - - Secondary w/ Dark label - - - - Disabled Chip - - - - - Default - - - - - Default - - - - Button Chip - - - - - - Icon Chip - - - - - - - - Avatar Chip - - -``` - - - - - - - -```html - - Default - - - - Secondary Label - - - - Secondary w/ Dark label - - - - Disabled Chip - - - - - Default - - - - - Default - - - - Button Chip - - - - - - Icon Chip - - - - - - - - Avatar Chip - - -``` - - - - - - - -```tsx -import React from 'react'; -import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonChip, IonLabel, IonIcon, IonAvatar } from '@ionic/react'; -import { pin, heart, closeCircle, close } from 'ionicons/icons'; - -export const ChipExamples: React.FC = () => { - return ( - - - - ChipExamples - - - - - Default - - - - Secondary Label - - - - Secondary w/ Dark label - - - - Disabled Chip - - - - - Default - - - - - Default - - - - Button Chip - - - - - - Icon Chip - - - - - - - - Avatar Chip - - - - - ); -}; - -``` - - - - - - - -```tsx -import { Component, h } from '@stencil/core'; - -@Component({ - tag: 'chip-example', - styleUrl: 'chip-example.css' -}) -export class ChipExample { - render() { - return [ - - Default - , - - - Secondary Label - , - - - Secondary w/ Dark label - , - - - - Default - , - - - - Default - , - - - Button Chip - - , - - - - Icon Chip - - , - - - - - - Avatar Chip - - - ]; - } -} -``` - - - - - - -```html - - -``` + +## Styling - +import StylingExample from '@site/static/usage/chip/styling/index.md'; - + ## Properties diff --git a/static/usage/chip/basic/angular.md b/static/usage/chip/basic/angular.md new file mode 100644 index 00000000000..0e9440b7ea8 --- /dev/null +++ b/static/usage/chip/basic/angular.md @@ -0,0 +1,5 @@ +```html +Default +Disabled +Outline +``` diff --git a/static/usage/chip/basic/demo.html b/static/usage/chip/basic/demo.html new file mode 100644 index 00000000000..85bf9b12ade --- /dev/null +++ b/static/usage/chip/basic/demo.html @@ -0,0 +1,27 @@ + + + + + + + Chip + + + + + + + + + + +
+ Default + Disabled + Outline +
+
+
+ + + diff --git a/static/usage/chip/basic/index.md b/static/usage/chip/basic/index.md new file mode 100644 index 00000000000..02e79a4f64b --- /dev/null +++ b/static/usage/chip/basic/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/chip/basic/javascript.md b/static/usage/chip/basic/javascript.md new file mode 100644 index 00000000000..fb494e84571 --- /dev/null +++ b/static/usage/chip/basic/javascript.md @@ -0,0 +1,5 @@ +```html +Default +Disabled +Outline +``` diff --git a/static/usage/chip/basic/react.md b/static/usage/chip/basic/react.md new file mode 100644 index 00000000000..cc1989f2d03 --- /dev/null +++ b/static/usage/chip/basic/react.md @@ -0,0 +1,14 @@ +```tsx +import React from 'react'; +import { IonChip } from '@ionic/react'; +function Example() { + return ( + <> + Default + Disabled + Outline + + ); +} +export default Example; +``` diff --git a/static/usage/chip/basic/vue.md b/static/usage/chip/basic/vue.md new file mode 100644 index 00000000000..69634b44d3e --- /dev/null +++ b/static/usage/chip/basic/vue.md @@ -0,0 +1,16 @@ +```html + + + +``` diff --git a/static/usage/chip/color/angular.md b/static/usage/chip/color/angular.md new file mode 100644 index 00000000000..db05dd6f248 --- /dev/null +++ b/static/usage/chip/color/angular.md @@ -0,0 +1,12 @@ +```html +Default +Primary +Secondary +Tertiary +Success +Warning +Danger +Light +Medium +Dark +``` diff --git a/static/usage/chip/color/demo.html b/static/usage/chip/color/demo.html new file mode 100644 index 00000000000..9f05dea22d0 --- /dev/null +++ b/static/usage/chip/color/demo.html @@ -0,0 +1,45 @@ + + + + + + + Chip + + + + + + + + + + + +
+
+ Default + Primary + Secondary + Tertiary + Success + Warning + Danger + Light + Medium + Dark +
+
+
+
+ + + diff --git a/static/usage/chip/color/index.md b/static/usage/chip/color/index.md new file mode 100644 index 00000000000..6c8ed67e81c --- /dev/null +++ b/static/usage/chip/color/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/chip/color/javascript.md b/static/usage/chip/color/javascript.md new file mode 100644 index 00000000000..db05dd6f248 --- /dev/null +++ b/static/usage/chip/color/javascript.md @@ -0,0 +1,12 @@ +```html +Default +Primary +Secondary +Tertiary +Success +Warning +Danger +Light +Medium +Dark +``` diff --git a/static/usage/chip/color/react.md b/static/usage/chip/color/react.md new file mode 100644 index 00000000000..8f12b4f978e --- /dev/null +++ b/static/usage/chip/color/react.md @@ -0,0 +1,21 @@ +```tsx +import React from 'react'; +import { IonChip } from '@ionic/react'; +function Example() { + return ( + <> + Default + Primary + Secondary + Tertiary + Success + Warning + Danger + Light + Medium + Dark + + ); +} +export default Example; +``` diff --git a/static/usage/chip/color/vue.md b/static/usage/chip/color/vue.md new file mode 100644 index 00000000000..55221ac5115 --- /dev/null +++ b/static/usage/chip/color/vue.md @@ -0,0 +1,23 @@ +```html + + + +``` diff --git a/static/usage/chip/slots/angular.md b/static/usage/chip/slots/angular.md new file mode 100644 index 00000000000..6387a0e55ba --- /dev/null +++ b/static/usage/chip/slots/angular.md @@ -0,0 +1,15 @@ +```html + + + + + Avatar Chip + + + + + + Icon Chip + + +``` diff --git a/static/usage/chip/slots/demo.html b/static/usage/chip/slots/demo.html new file mode 100644 index 00000000000..fd3f22a72df --- /dev/null +++ b/static/usage/chip/slots/demo.html @@ -0,0 +1,37 @@ + + + + + + + Chip + + + + + + + + + + +
+ + + + + Avatar Chip + + + + + + Icon Chip + + +
+
+
+ + + diff --git a/static/usage/chip/slots/index.md b/static/usage/chip/slots/index.md new file mode 100644 index 00000000000..590dd242f92 --- /dev/null +++ b/static/usage/chip/slots/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/chip/slots/javascript.md b/static/usage/chip/slots/javascript.md new file mode 100644 index 00000000000..6387a0e55ba --- /dev/null +++ b/static/usage/chip/slots/javascript.md @@ -0,0 +1,15 @@ +```html + + + + + Avatar Chip + + + + + + Icon Chip + + +``` diff --git a/static/usage/chip/slots/react.md b/static/usage/chip/slots/react.md new file mode 100644 index 00000000000..25fd0d192b1 --- /dev/null +++ b/static/usage/chip/slots/react.md @@ -0,0 +1,26 @@ +```tsx +import React from 'react'; +import { IonChip, IonAvatar, IonLabel, IonIcon } from '@ionic/react'; +import { close, closeCircle, pin } from 'ionicons/icons'; + +function Example() { + return ( + <> + + + + + Avatar Chip + + + + + + Icon Chip + + + + ); +} +export default Example; +``` diff --git a/static/usage/chip/slots/vue.md b/static/usage/chip/slots/vue.md new file mode 100644 index 00000000000..29e12166788 --- /dev/null +++ b/static/usage/chip/slots/vue.md @@ -0,0 +1,34 @@ +```html + + + +``` diff --git a/static/usage/chip/styling/angular/example_component_css.md b/static/usage/chip/styling/angular/example_component_css.md new file mode 100644 index 00000000000..60dc62c6417 --- /dev/null +++ b/static/usage/chip/styling/angular/example_component_css.md @@ -0,0 +1,6 @@ +```css +ion-chip { + --background: #00213f; + --color: #adefd1; +} +``` diff --git a/static/usage/chip/styling/angular/example_component_html.md b/static/usage/chip/styling/angular/example_component_html.md new file mode 100644 index 00000000000..67c6144e7b8 --- /dev/null +++ b/static/usage/chip/styling/angular/example_component_html.md @@ -0,0 +1,3 @@ +```html +Default +``` diff --git a/static/usage/chip/styling/demo.html b/static/usage/chip/styling/demo.html new file mode 100644 index 00000000000..26048748135 --- /dev/null +++ b/static/usage/chip/styling/demo.html @@ -0,0 +1,32 @@ + + + + + + + Chip + + + + + + + + + + + + +
+ Default +
+
+
+ + + diff --git a/static/usage/chip/styling/index.md b/static/usage/chip/styling/index.md new file mode 100644 index 00000000000..4f07411cf99 --- /dev/null +++ b/static/usage/chip/styling/index.md @@ -0,0 +1,31 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; + +import react_main_css from './react/main_css.md'; +import react_main_tsx from './react/main_tsx.md'; + +import vue from './vue.md'; + +import angular_example_component_css from './angular/example_component_css.md'; +import angular_example_component_html from './angular/example_component_html.md'; + + diff --git a/static/usage/chip/styling/javascript.md b/static/usage/chip/styling/javascript.md new file mode 100644 index 00000000000..b40912d73a2 --- /dev/null +++ b/static/usage/chip/styling/javascript.md @@ -0,0 +1,10 @@ +```html + + +Default +``` diff --git a/static/usage/chip/styling/react/main_css.md b/static/usage/chip/styling/react/main_css.md new file mode 100644 index 00000000000..60dc62c6417 --- /dev/null +++ b/static/usage/chip/styling/react/main_css.md @@ -0,0 +1,6 @@ +```css +ion-chip { + --background: #00213f; + --color: #adefd1; +} +``` diff --git a/static/usage/chip/styling/react/main_tsx.md b/static/usage/chip/styling/react/main_tsx.md new file mode 100644 index 00000000000..b4fc5f12cae --- /dev/null +++ b/static/usage/chip/styling/react/main_tsx.md @@ -0,0 +1,11 @@ +```tsx +import React from 'react'; +import { IonChip } from '@ionic/react'; + +import './main.css'; + +function Example() { + return Default; +} +export default Example; +``` diff --git a/static/usage/chip/styling/vue.md b/static/usage/chip/styling/vue.md new file mode 100644 index 00000000000..7195787bd52 --- /dev/null +++ b/static/usage/chip/styling/vue.md @@ -0,0 +1,21 @@ +```html + + + + + +``` From ad7394344778830066231332205772d134233f97 Mon Sep 17 00:00:00 2001 From: jaredcbaum <61951482+jaredcbaum@users.noreply.github.com> Date: Thu, 11 Aug 2022 13:15:26 -0600 Subject: [PATCH 013/469] fix(meta): OG image on all pages (#2492) --- docs/index.md | 1 - docs/react.md | 1 - docusaurus.config.js | 1 + static/img/meta/open-graph.png | Bin 36722 -> 85347 bytes versioned_docs/version-v5/index.md | 1 - versioned_docs/version-v5/react.md | 1 - 6 files changed, 1 insertion(+), 4 deletions(-) mode change 100755 => 100644 static/img/meta/open-graph.png diff --git a/docs/index.md b/docs/index.md index aa5e8747fd2..1f91e35204a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,6 @@ title: Introduction to Ionic sidebar_label: Overview slug: / -image: /img/meta/open-graph.png hide_table_of_contents: true demoUrl: https://docs-demo.ionic.io/ demoSourceUrl: https://github.com/ionic-team/docs-demo diff --git a/docs/react.md b/docs/react.md index 0978942e0f4..2ab6b863a63 100644 --- a/docs/react.md +++ b/docs/react.md @@ -3,7 +3,6 @@ title: Ionic React sidebar_label: Overview hide_title: true hide_table_of_contents: true -image: /img/meta/open-graph.png --- import PageStyles from '@components/page/react/PageStyles'; diff --git a/docusaurus.config.js b/docusaurus.config.js index b3438eb4a01..478c2f8e0be 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -24,6 +24,7 @@ module.exports = { organizationName: 'ionic-team', projectName: 'ionic-docs', themeConfig: { + metadata: [{ name: 'og:image', content: 'https://ionicframework.com/docs/img/meta/open-graph.png' }], colorMode: { defaultMode: 'light', }, diff --git a/static/img/meta/open-graph.png b/static/img/meta/open-graph.png old mode 100755 new mode 100644 index 4db4a96753a35daa3295201b39823d38b4fd83e3..92a1d0a6ca6c8811d518233b94c2a4fd5a241c93 GIT binary patch literal 85347 zcmeFY1zS~H8!o&k=@t~FyAkOQ=?3YL?(S|-Qo2*5ySqag2?1fz-7U3VZITAcSYYH$8afg1`r&orH!X z2!u=V^aCZSM1BH%3FW9HE(|Ik!`}t|fHf786#{{(qLAo9WoMJBUM&_8lg{cKx%s0#(B`LMOX`YH8fMJj5=dJ z+g4o3qXOP}c#*l=8q(5liARZ114?f;?!Bj2N0(8775`j@kb02Blynr!Re@5`15rF

dcj>z9eYLrs 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 literal 36722 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 Date: Thu, 11 Aug 2022 15:06:28 -0600 Subject: [PATCH 014/469] chore(meta): Add twitter meta info (#2493) --- docusaurus.config.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 478c2f8e0be..4e94c18df89 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -24,7 +24,38 @@ module.exports = { organizationName: 'ionic-team', projectName: 'ionic-docs', themeConfig: { - metadata: [{ name: 'og:image', content: 'https://ionicframework.com/docs/img/meta/open-graph.png' }], + metadata: [ + { name: 'og:image', content: 'https://ionicframework.com/docs/img/meta/open-graph.png' }, + { name: 'twitter:image', content: 'https://ionicframework.com/docs/img/meta/open-graph.png' }, + { + name: 'twitter:card', + content: 'summary_large_image', + }, + { + name: 'twitter:domain', + content: 'ionicframework.com', + }, + { + name: 'twitter:site', + content: '@ionicframework', + }, + { + name: 'twitter:creator', + content: 'ionicframework', + }, + { + name: 'fb:page_id', + content: '1321836767955949', + }, + { + name: 'og:type', + content: 'website', + }, + { + name: 'og:site_name', + content: 'Ionic Framework Docs', + }, + ], colorMode: { defaultMode: 'light', }, From cb723c363e618ff788e204f49604e4a266fd43dd Mon Sep 17 00:00:00 2001 From: Masahiko Sakakibara Date: Sat, 13 Aug 2022 08:54:21 +0900 Subject: [PATCH 015/469] chore --- docs/vue/quickstart.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/vue/quickstart.md b/docs/vue/quickstart.md index d8df3ee5225..99bedeb7835 100644 --- a/docs/vue/quickstart.md +++ b/docs/vue/quickstart.md @@ -287,11 +287,7 @@ const routes: Array = [ 最初に確認した `App` コンポーネントと同様に、特定のIonic Frameworkコンポーネントのインポート、Vueからのインポート、Vueコンポーネント、そして私たちのコンポーネントに合わせたスタイルがあります。 -<<<<<<< HEAD スタイルに `scoped` を指定していることに注目してください。つまり、ここで記述するスタイルは、このコンポーネントにのみ適用されます。これは、スタイルがコンポーネントから漏れてアプリケーションの他の部分に影響するのを防ぐのに役立ちます。Ionic Vueアプリケーションでは、 `scoped` のついたスタイルを使用することを強くお勧めします。 -======= -For our styles, notice that we have specified our styles to be `scoped`. This means that the styles we write here will only apply to this component. This is useful for preventing styles from leaking out of a component and affecting other parts of your application. We strongly recommend using `scoped` styles for Ionic Vue applications. ->>>>>>> main `IonPage` はすべてのページ(route/URLを持つコンポーネント)の基本コンポーネントであり、header, title, contentコンポーネントなど、フルスクリーンコンポーネントの一般的な構成要素がいくつか含まれています。 From c06ef0efc316b4740088797647e9493d8a86dff7 Mon Sep 17 00:00:00 2001 From: Masahiko Sakakibara Date: Sat, 13 Aug 2022 08:59:29 +0900 Subject: [PATCH 016/469] =?UTF-8?q?translate():=20datetime-button=E3=82=92?= =?UTF-8?q?=E7=BF=BB=E8=A8=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/api/datetime-button.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api/datetime-button.md b/docs/api/datetime-button.md index d13e5dcdf0d..912c8316369 100644 --- a/docs/api/datetime-button.md +++ b/docs/api/datetime-button.md @@ -21,27 +21,27 @@ import APITOCInline from '@components/page/api/APITOCInline'; -Datetime Button links with a [Datetime](./datetime) component to display the formatted date and time. It also provides buttons to present the datetime in a modal, popover, and more. +Datetimeボタンは、[Datetime](./datetime) コンポーネントとリンクし、フォーマットされた日付と時刻を表示します。また、モーダルやポップオーバーなどで日時を表示するためのボタンも用意されています。 -## Overview +## 概要 -Datetime Button should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay. +Datetimeボタンは、スペースに制約がある場合に使用する必要があります。このコンポーネントは、現在の日付と時刻の値を表示するボタンを表示します。ボタンがタップされると、日付や時刻のピッカーがオーバーレイで表示されます。 -When using Datetime Button with a JavaScript framework such as Angular, React, or Vue be sure to use the [keepContentsMounted property on ion-modal](./modal#keepcontentsmounted) or the [keepContentsMounted property on ion-popover](./popover#keepcontentsmounted). This allows the linked datetime instance to be mounted even if the overlay has not been presented yet. +Angular、React、VueなどのJavaScriptフレームワークでDatetime Buttonを使用する場合は、 [ion-modalのkeepContentsMountedプロパティ](./modal#keepcontentsmounted) または [ion-popover](./popover#keepcontentsmounted) を使用していることを確認してください。これにより、オーバーレイがまだ表示されていない場合でも、リンクされたdatetimeインスタンスがマウントされるようになります。 -## Basic Usage +## 基本的な使い方 import Basic from '@site/static/usage/datetime-button/basic/index.md'; -## Localization +## ローカライゼーション The localized text on `ion-datetime-button` is determined by the `locale` property on the associated `ion-datetime` instance. See [Datetime Localization](./datetime#localization) for more details. -## Usage with Modals and Popovers +## モーダルやポップオーバーと使う -`ion-datetime-button` must be associated with a mounted `ion-datetime` instance. As a result, [Inline Modals](./modal#inline-modals-recommended) and [Inline Popovers](./popover#inline-popovers) with the `keepContentsMounted` property set to `true` must be used. +`ion-datetime-button` は、マウントされた `ion-datetime` インスタンスと関連付ける必要があります。そのため、[Inline Modals](./modal#inline-modals-recommended) と [Inline Popovers](./popover#inline-popovers) は `keepContentsMounted` プロパティを `true` に設定して使用しなければなりません。 - + Left Icon Right Icon - + - + @@ -378,11 +378,15 @@ export class ButtonExample { ``` From d41594745e57fa484fd3a18ff37c4cfdd7a86026 Mon Sep 17 00:00:00 2001 From: Sean Perkins Date: Tue, 30 Aug 2022 11:09:02 -0400 Subject: [PATCH 026/469] docs(react): remove virtual scroll outdated section (#2508) --- docs/react/virtual-scroll.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/react/virtual-scroll.md b/docs/react/virtual-scroll.md index de6aa30a9d1..c40d235bbbe 100644 --- a/docs/react/virtual-scroll.md +++ b/docs/react/virtual-scroll.md @@ -51,12 +51,6 @@ From there, we can use the `itemContent` property to pass a function that will b An important thing to note here is the `div` that wraps our `IonItem` component. When lazy loading Ionic components, there may be a few frames where the component is loaded but the styles have not loaded in. When this happens, the component's dimension will be `0`, and Virtuoso may throw an error. This is because Virtuoso needs distinct positions for each item it renders, and it cannot determine that when a component's dimension is `0`. -## A Note on Ionic Components - -Certain Ionic Framework functionality is currently not compatible with virtual scrolling. Features such as collapsible large titles, `ion-infinite-scroll`, and `ion-refresher` rely on being able to scroll on `ion-content` itself, and as a result will not work when using virtual scrolling. - -We are working to improve compatibility between these components and virtual scrolling solutions. You can follow progress and give feedback here: https://github.com/ionic-team/ionic-framework/issues/23437. - ## Usage with Ionic Components Ionic Framework requires that features such as collapsible large titles, `ion-infinite-scroll`, `ion-refresher`, and `ion-reorder-group` be used within an `ion-content`. To use these experiences with virtual scrolling, you must add the `.ion-content-scroll-host` class to the virtual scroll viewport. From 5fd7ce425a0d22f226e82178b8c7a2e80988c67e Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Wed, 31 Aug 2022 00:02:35 +0200 Subject: [PATCH 027/469] docs(your-first-app): Replace Storage plugin with Preferences (#2499) --- docs/angular/your-first-app.md | 4 ++-- docs/angular/your-first-app/2-taking-photos.md | 2 +- .../angular/your-first-app/4-loading-photos.md | 10 +++++----- docs/angular/your-first-app/5-adding-mobile.md | 2 +- docs/angular/your-first-app/7-live-reload.md | 4 ++-- docs/react/your-first-app.md | 4 ++-- docs/react/your-first-app/2-taking-photos.md | 2 +- docs/react/your-first-app/4-loading-photos.md | 18 +++++++++--------- docs/react/your-first-app/5-adding-mobile.md | 8 ++++---- docs/react/your-first-app/7-live-reload.md | 4 ++-- docs/vue/your-first-app.md | 4 ++-- docs/vue/your-first-app/2-taking-photos.md | 2 +- docs/vue/your-first-app/4-loading-photos.md | 18 +++++++++--------- docs/vue/your-first-app/5-adding-mobile.md | 6 +++--- docs/vue/your-first-app/7-live-reload.md | 2 +- .../version-v5/angular/your-first-app.md | 4 ++-- .../angular/your-first-app/2-taking-photos.md | 2 +- .../angular/your-first-app/4-loading-photos.md | 10 +++++----- .../angular/your-first-app/5-adding-mobile.md | 2 +- .../angular/your-first-app/7-live-reload.md | 4 ++-- .../version-v5/react/your-first-app.md | 4 ++-- .../react/your-first-app/2-taking-photos.md | 2 +- .../react/your-first-app/4-loading-photos.md | 16 ++++++++-------- .../react/your-first-app/5-adding-mobile.md | 8 ++++---- .../react/your-first-app/7-live-reload.md | 4 ++-- .../version-v5/vue/your-first-app.md | 4 ++-- .../vue/your-first-app/2-taking-photos.md | 2 +- .../vue/your-first-app/4-loading-photos.md | 18 +++++++++--------- .../vue/your-first-app/5-adding-mobile.md | 8 ++++---- .../vue/your-first-app/7-live-reload.md | 2 +- 30 files changed, 90 insertions(+), 90 deletions(-) diff --git a/docs/angular/your-first-app.md b/docs/angular/your-first-app.md index 753dbefb5a5..5cb290f4c1c 100644 --- a/docs/angular/your-first-app.md +++ b/docs/angular/your-first-app.md @@ -36,7 +36,7 @@ Highlights include: - One Angular-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components). - Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitor.ionicframework.com), Ionic's official native app runtime. -- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Storage](https://capacitor.ionicframework.com/docs/apis/storage) APIs. +- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Preferences](https://capacitor.ionicframework.com/docs/apis/preferences) APIs. Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-ng). @@ -88,7 +88,7 @@ cd photo-gallery Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work: ```shell -npm install @capacitor/camera @capacitor/storage @capacitor/filesystem +npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem ``` ### PWA Elements diff --git a/docs/angular/your-first-app/2-taking-photos.md b/docs/angular/your-first-app/2-taking-photos.md index 33064cd1140..eab0e8d1b02 100644 --- a/docs/angular/your-first-app/2-taking-photos.md +++ b/docs/angular/your-first-app/2-taking-photos.md @@ -26,7 +26,7 @@ Open the new `services/photo.service.ts` file, and let’s add the logic that wi ```tsx import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; import { Filesystem, Directory } from '@capacitor/filesystem'; -import { Storage } from '@capacitor/storage'; +import { Preferences } from '@capacitor/preferences'; ``` Next, define a new class method, `addNewToGallery`, that will contain the core logic to take a device photo and save it to the filesystem. Let’s start by opening the device camera: diff --git a/docs/angular/your-first-app/4-loading-photos.md b/docs/angular/your-first-app/4-loading-photos.md index 15aa6ec926a..3c34b84f546 100644 --- a/docs/angular/your-first-app/4-loading-photos.md +++ b/docs/angular/your-first-app/4-loading-photos.md @@ -6,9 +6,9 @@ sidebar_label: Loading Photos We’ve implemented photo taking and saving to the filesystem. There’s one last piece of functionality missing: the photos are stored in the filesystem, but we need a way to save pointers to each file so that they can be displayed again in the photo gallery. -Fortunately, this is easy: we’ll leverage the Capacitor [Storage API](https://capacitor.ionicframework.com/docs/apis/storage) to store our array of Photos in a key-value store. +Fortunately, this is easy: we’ll leverage the Capacitor [Preferences API](https://capacitor.ionicframework.com/docs/apis/preferences) to store our array of Photos in a key-value store. -## Storage API +## Preferences API Begin by defining a constant variable that will act as the key for the store: @@ -21,10 +21,10 @@ export class PhotoService { } ``` -Next, at the end of the `addNewToGallery` function, add a call to `Storage.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. +Next, at the end of the `addNewToGallery` function, add a call to `Preferences.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. ```tsx -Storage.set({ +Preferences.set({ key: this.PHOTO_STORAGE, value: JSON.stringify(this.photos), }); @@ -35,7 +35,7 @@ With the photo array data saved, create a function called `loadSaved()` that can ```tsx public async loadSaved() { // Retrieve cached photo array data - const photoList = await Storage.get({ key: this.PHOTO_STORAGE }); + const photoList = await Preferences.get({ key: this.PHOTO_STORAGE }); this.photos = JSON.parse(photoList.value) || []; // more to come... diff --git a/docs/angular/your-first-app/5-adding-mobile.md b/docs/angular/your-first-app/5-adding-mobile.md index 913d4d582e6..72ef3429132 100644 --- a/docs/angular/your-first-app/5-adding-mobile.md +++ b/docs/angular/your-first-app/5-adding-mobile.md @@ -93,7 +93,7 @@ Next, head back over to the `loadSaved()` function we implemented for the web ea ```tsx public async loadSaved() { // Retrieve cached photo array data - const photoList = await Storage.get({ key: this.PHOTO_STORAGE }); + const photoList = await Preferences.get({ key: this.PHOTO_STORAGE }); this.photos = JSON.parse(photoList.value) || []; // Easiest way to detect when running on the web: diff --git a/docs/angular/your-first-app/7-live-reload.md b/docs/angular/your-first-app/7-live-reload.md index c560be55767..26fe3b4fbf0 100644 --- a/docs/angular/your-first-app/7-live-reload.md +++ b/docs/angular/your-first-app/7-live-reload.md @@ -91,7 +91,7 @@ public async deletePicture(photo: UserPhoto, position: number) { this.photos.splice(position, 1); // Update photos array cache by overwriting the existing photo array - Storage.set({ + Preferences.set({ key: this.PHOTO_STORAGE, value: JSON.stringify(this.photos) }); @@ -107,7 +107,7 @@ public async deletePicture(photo: UserPhoto, position: number) { } ``` -The selected photo is removed from the Photos array first. Then, we use the Capacitor Storage API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. +The selected photo is removed from the Photos array first. Then, we use the Capacitor Preferences API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. Save this file, then tap on a photo again and choose the “Delete” option. This time, the photo is deleted! Implemented much faster using Live Reload. 💪 diff --git a/docs/react/your-first-app.md b/docs/react/your-first-app.md index 47fce5914fe..8364e516080 100644 --- a/docs/react/your-first-app.md +++ b/docs/react/your-first-app.md @@ -32,7 +32,7 @@ Highlights include: - One React-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components). - Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitor.ionicframework.com), Ionic's official native app runtime. -- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Storage](https://capacitor.ionicframework.com/docs/apis/storage) APIs. +- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Preferences](https://capacitor.ionicframework.com/docs/apis/preferences) APIs. Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-react). @@ -84,7 +84,7 @@ cd photo-gallery Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work: ```shell -npm install @capacitor/camera @capacitor/storage @capacitor/filesystem +npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem ``` ### PWA Elements diff --git a/docs/react/your-first-app/2-taking-photos.md b/docs/react/your-first-app/2-taking-photos.md index a7fd6cb61ab..c2d65fa5c1d 100644 --- a/docs/react/your-first-app/2-taking-photos.md +++ b/docs/react/your-first-app/2-taking-photos.md @@ -29,7 +29,7 @@ import { isPlatform } from '@ionic/react'; import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; import { Filesystem, Directory } from '@capacitor/filesystem'; -import { Storage } from '@capacitor/storage'; +import { Preferences } from '@capacitor/preferences'; import { Capacitor } from '@capacitor/core'; ``` diff --git a/docs/react/your-first-app/4-loading-photos.md b/docs/react/your-first-app/4-loading-photos.md index 76acfce106a..7911d592b6d 100644 --- a/docs/react/your-first-app/4-loading-photos.md +++ b/docs/react/your-first-app/4-loading-photos.md @@ -7,15 +7,15 @@ sidebar_label: Loading Photos Loading Photos from the Filesystem Using A Key-Value Store We’ve implemented photo taking and saving to the filesystem. There’s one last piece of functionality missing: the photos are stored in the filesystem, but we need a way to save pointers to each file so that they can be displayed again in the photo gallery. -Fortunately, this is easy: we’ll leverage the Capacitor [Storage API](https://capacitor.ionicframework.com/docs/apis/storage) to store our array of Photos in a key-value store. +Fortunately, this is easy: we’ll leverage the Capacitor [Preferences API](https://capacitor.ionicframework.com/docs/apis/preferences) to store our array of Photos in a key-value store. -## Storage API +## Preferences API Begin by defining a constant variable that will act as the key for the store before the `usePhotoGallery` function definition in `src/hooks/usePhotoGallery.ts`: @@ -26,10 +26,10 @@ export function usePhotoGallery() {} Then, use the `Storage` class to get access to the get and set methods for reading and writing to device storage: -At the end of the `takePhoto` function, add a call to `Storage.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. +At the end of the `takePhoto` function, add a call to `Preferences.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. ```tsx -Storage.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); +Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); ``` With the photo array data saved, we will create a method that will retrieve the data when the hook loads. We will do so by using React's `useEffect` hook. Insert this above the `takePhoto` declaration. Here is the code, and we will break it down: @@ -37,10 +37,10 @@ With the photo array data saved, we will create a method that will retrieve the ```tsx useEffect(() => { const loadSaved = async () => { - const { value } = await Storage.get({ key: PHOTO_STORAGE }); - const photosInStorage = (value ? JSON.parse(value) : []) as UserPhoto[]; + const { value } = await Preferences.get({ key: PHOTO_STORAGE }); + const photosInPreferences = (value ? JSON.parse(value) : []) as UserPhoto[]; - for (let photo of photosInStorage) { + for (let photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -48,7 +48,7 @@ useEffect(() => { // Web platform only: Load the photo as base64 data photo.webviewPath = `data:image/jpeg;base64,${file.data}`; } - setPhotos(photosInStorage); + setPhotos(photosInPreferences); }; loadSaved(); }, []); diff --git a/docs/react/your-first-app/5-adding-mobile.md b/docs/react/your-first-app/5-adding-mobile.md index ec65d87524f..eef40b7a333 100644 --- a/docs/react/your-first-app/5-adding-mobile.md +++ b/docs/react/your-first-app/5-adding-mobile.md @@ -52,12 +52,12 @@ Next, add a new bit of logic in the `loadSaved` function. On mobile, we can dire ```tsx const loadSaved = async () => { - const { value } = await Storage.get({ key: PHOTO_STORAGE }); + const { value } = await Preferences.get({ key: PHOTO_STORAGE }); - const photosInStorage = (value ? JSON.parse(value) : []) as UserPhoto[]; + const photosInPreferences = (value ? JSON.parse(value) : []) as UserPhoto[]; // If running on the web... if (!isPlatform('hybrid')) { - for (let photo of photosInStorage) { + for (let photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -66,7 +66,7 @@ const loadSaved = async () => { photo.webviewPath = `data:image/jpeg;base64,${file.data}`; } } - setPhotos(photosInStorage); + setPhotos(photosInPreferences); }; ``` diff --git a/docs/react/your-first-app/7-live-reload.md b/docs/react/your-first-app/7-live-reload.md index 86fe0affc71..2d37c4efdba 100644 --- a/docs/react/your-first-app/7-live-reload.md +++ b/docs/react/your-first-app/7-live-reload.md @@ -91,7 +91,7 @@ const deletePhoto = async (photo: UserPhoto) => { const newPhotos = photos.filter((p) => p.filepath !== photo.filepath); // Update photos array cache by overwriting the existing photo array - Storage.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); + Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); // delete photo file from filesystem const filename = photo.filepath.substr(photo.filepath.lastIndexOf('/') + 1); @@ -103,7 +103,7 @@ const deletePhoto = async (photo: UserPhoto) => { }; ``` -The selected photo is removed from the Photos array first. Then, we use the Capacitor Storage API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. +The selected photo is removed from the Photos array first. Then, we use the Capacitor Preferences API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. Make sure to return the `deletePhoto` function so it is as a part of the hook API that we expose: diff --git a/docs/vue/your-first-app.md b/docs/vue/your-first-app.md index ff03a79ef5b..31362bf23bb 100644 --- a/docs/vue/your-first-app.md +++ b/docs/vue/your-first-app.md @@ -32,7 +32,7 @@ Highlights include: - One Vue-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components). - Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitor.ionicframework.com), Ionic's official native app runtime. -- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Storage](https://capacitor.ionicframework.com/docs/apis/storage) APIs. +- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Preferences](https://capacitor.ionicframework.com/docs/apis/preferences) APIs. Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-vue). @@ -84,7 +84,7 @@ cd photo-gallery Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work: ```shell -npm install @capacitor/camera @capacitor/storage @capacitor/filesystem +npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem ``` ### PWA Elements diff --git a/docs/vue/your-first-app/2-taking-photos.md b/docs/vue/your-first-app/2-taking-photos.md index e0632873305..38bafe39a59 100644 --- a/docs/vue/your-first-app/2-taking-photos.md +++ b/docs/vue/your-first-app/2-taking-photos.md @@ -20,7 +20,7 @@ We will start by importing the various utilities we will use from Vue core and C import { ref, onMounted, watch } from 'vue'; import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; import { Filesystem, Directory } from '@capacitor/filesystem'; -import { Storage } from '@capacitor/storage'; +import { Preferences } from '@capacitor/preferences'; ``` Next, create a function named usePhotoGallery: diff --git a/docs/vue/your-first-app/4-loading-photos.md b/docs/vue/your-first-app/4-loading-photos.md index 4a2df79fa5a..b0157de7654 100644 --- a/docs/vue/your-first-app/4-loading-photos.md +++ b/docs/vue/your-first-app/4-loading-photos.md @@ -6,9 +6,9 @@ sidebar_label: Loading Photos We’ve implemented photo taking and saving to the filesystem. There’s one last piece of functionality missing: the photos are stored in the filesystem, but we need a way to save pointers to each file so that they can be displayed again in the photo gallery. -Fortunately, this is easy: we’ll leverage the Capacitor [Storage API](https://capacitor.ionicframework.com/docs/apis/storage) to store our array of Photos in a key-value store. +Fortunately, this is easy: we’ll leverage the Capacitor [Preferences API](https://capacitor.ionicframework.com/docs/apis/preferences) to store our array of Photos in a key-value store. -## Storage API +## Preferences API Begin by defining a constant variable that will act as the key for the store at the top of the `usePhotoGallery` function in `src/composables/usePhotoGallery.ts`: @@ -16,11 +16,11 @@ Begin by defining a constant variable that will act as the key for the store at const PHOTO_STORAGE = 'photos'; ``` -Next, add a `cachePhotos` function that saves the Photos array as JSON to file storage: +Next, add a `cachePhotos` function that saves the Photos array as JSON to preferences: ```tsx const cachePhotos = () => { - Storage.set({ + Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(photos.value), }); @@ -33,14 +33,14 @@ Next, use the Vue [watch function](https://v3.vuejs.org/guide/composition-api-in watch(photos, cachePhotos); ``` -Now that the photo array data is saved, create a function to retrieve the data when Tab2 loads. First, retrieve photo data from Storage, then each photo's data into base64 format: +Now that the photo array data is saved, create a function to retrieve the data when Tab2 loads. First, retrieve photo data from Preferences, then each photo's data into base64 format: ```tsx const loadSaved = async () => { - const photoList = await Storage.get({ key: PHOTO_STORAGE }); - const photosInStorage = photoList.value ? JSON.parse(photoList.value) : []; + const photoList = await Preferences.get({ key: PHOTO_STORAGE }); + const photosInPreferences = photoList.value ? JSON.parse(photoList.value) : []; - for (const photo of photosInStorage) { + for (const photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -48,7 +48,7 @@ const loadSaved = async () => { photo.webviewPath = `data:image/jpeg;base64,${file.data}`; } - photos.value = photosInStorage; + photos.value = photosInPreferences; }; ``` diff --git a/docs/vue/your-first-app/5-adding-mobile.md b/docs/vue/your-first-app/5-adding-mobile.md index 39a37a424e7..28c60aa6bf3 100644 --- a/docs/vue/your-first-app/5-adding-mobile.md +++ b/docs/vue/your-first-app/5-adding-mobile.md @@ -58,11 +58,11 @@ Next, add a new bit of logic in the `loadSaved` function. On mobile, we can dire ```tsx const loadSaved = async () => { const photoList = await Storage.get({ key: PHOTO_STORAGE }); - const photosInStorage = photoList.value ? JSON.parse(photoList.value) : []; + const photosInPreferences = photoList.value ? JSON.parse(photoList.value) : []; // If running on the web... if (!isPlatform('hybrid')) { - for (const photo of photosInStorage) { + for (const photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -72,7 +72,7 @@ const loadSaved = async () => { } } - photos.value = photosInStorage; + photos.value = photosInPreferences; }; ``` diff --git a/docs/vue/your-first-app/7-live-reload.md b/docs/vue/your-first-app/7-live-reload.md index 4010e1fcfff..a76c6e6622e 100644 --- a/docs/vue/your-first-app/7-live-reload.md +++ b/docs/vue/your-first-app/7-live-reload.md @@ -125,7 +125,7 @@ Remember that removing the photo from the `photos` array triggers the `cachePhot ```tsx const cachePhotos = () => { - Storage.set({ + Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(photos.value), }); diff --git a/versioned_docs/version-v5/angular/your-first-app.md b/versioned_docs/version-v5/angular/your-first-app.md index bee8e745cc4..08e208422b7 100644 --- a/versioned_docs/version-v5/angular/your-first-app.md +++ b/versioned_docs/version-v5/angular/your-first-app.md @@ -29,7 +29,7 @@ Highlights include: - One Angular-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components). - Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitor.ionicframework.com), Ionic's official native app runtime. -- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Storage](https://capacitor.ionicframework.com/docs/apis/storage) APIs. +- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Preferences](https://capacitor.ionicframework.com/docs/apis/preferences) APIs. Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-ng). @@ -81,7 +81,7 @@ cd photo-gallery Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work: ```shell -npm install @capacitor/camera @capacitor/storage @capacitor/filesystem +npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem ``` ### PWA Elements diff --git a/versioned_docs/version-v5/angular/your-first-app/2-taking-photos.md b/versioned_docs/version-v5/angular/your-first-app/2-taking-photos.md index 5153a2051f8..febc4de66d3 100644 --- a/versioned_docs/version-v5/angular/your-first-app/2-taking-photos.md +++ b/versioned_docs/version-v5/angular/your-first-app/2-taking-photos.md @@ -19,7 +19,7 @@ Open the new `services/photo.service.ts` file, and let’s add the logic that wi ```tsx import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; import { Filesystem, Directory } from '@capacitor/filesystem'; -import { Storage } from '@capacitor/storage'; +import { Preferences } from '@capacitor/preferences'; ``` Next, define a new class method, `addNewToGallery`, that will contain the core logic to take a device photo and save it to the filesystem. Let’s start by opening the device camera: diff --git a/versioned_docs/version-v5/angular/your-first-app/4-loading-photos.md b/versioned_docs/version-v5/angular/your-first-app/4-loading-photos.md index 15aa6ec926a..3c34b84f546 100644 --- a/versioned_docs/version-v5/angular/your-first-app/4-loading-photos.md +++ b/versioned_docs/version-v5/angular/your-first-app/4-loading-photos.md @@ -6,9 +6,9 @@ sidebar_label: Loading Photos We’ve implemented photo taking and saving to the filesystem. There’s one last piece of functionality missing: the photos are stored in the filesystem, but we need a way to save pointers to each file so that they can be displayed again in the photo gallery. -Fortunately, this is easy: we’ll leverage the Capacitor [Storage API](https://capacitor.ionicframework.com/docs/apis/storage) to store our array of Photos in a key-value store. +Fortunately, this is easy: we’ll leverage the Capacitor [Preferences API](https://capacitor.ionicframework.com/docs/apis/preferences) to store our array of Photos in a key-value store. -## Storage API +## Preferences API Begin by defining a constant variable that will act as the key for the store: @@ -21,10 +21,10 @@ export class PhotoService { } ``` -Next, at the end of the `addNewToGallery` function, add a call to `Storage.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. +Next, at the end of the `addNewToGallery` function, add a call to `Preferences.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. ```tsx -Storage.set({ +Preferences.set({ key: this.PHOTO_STORAGE, value: JSON.stringify(this.photos), }); @@ -35,7 +35,7 @@ With the photo array data saved, create a function called `loadSaved()` that can ```tsx public async loadSaved() { // Retrieve cached photo array data - const photoList = await Storage.get({ key: this.PHOTO_STORAGE }); + const photoList = await Preferences.get({ key: this.PHOTO_STORAGE }); this.photos = JSON.parse(photoList.value) || []; // more to come... diff --git a/versioned_docs/version-v5/angular/your-first-app/5-adding-mobile.md b/versioned_docs/version-v5/angular/your-first-app/5-adding-mobile.md index 913d4d582e6..72ef3429132 100644 --- a/versioned_docs/version-v5/angular/your-first-app/5-adding-mobile.md +++ b/versioned_docs/version-v5/angular/your-first-app/5-adding-mobile.md @@ -93,7 +93,7 @@ Next, head back over to the `loadSaved()` function we implemented for the web ea ```tsx public async loadSaved() { // Retrieve cached photo array data - const photoList = await Storage.get({ key: this.PHOTO_STORAGE }); + const photoList = await Preferences.get({ key: this.PHOTO_STORAGE }); this.photos = JSON.parse(photoList.value) || []; // Easiest way to detect when running on the web: diff --git a/versioned_docs/version-v5/angular/your-first-app/7-live-reload.md b/versioned_docs/version-v5/angular/your-first-app/7-live-reload.md index 52de878c339..9aad9835c23 100644 --- a/versioned_docs/version-v5/angular/your-first-app/7-live-reload.md +++ b/versioned_docs/version-v5/angular/your-first-app/7-live-reload.md @@ -85,7 +85,7 @@ public async deletePicture(photo: UserPhoto, position: number) { this.photos.splice(position, 1); // Update photos array cache by overwriting the existing photo array - Storage.set({ + Preferences.set({ key: this.PHOTO_STORAGE, value: JSON.stringify(this.photos) }); @@ -101,7 +101,7 @@ public async deletePicture(photo: UserPhoto, position: number) { } ``` -The selected photo is removed from the Photos array first. Then, we use the Capacitor Storage API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. +The selected photo is removed from the Photos array first. Then, we use the Capacitor Preferences API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. Save this file, then tap on a photo again and choose the “Delete” option. This time, the photo is deleted! Implemented much faster using Live Reload. 💪 diff --git a/versioned_docs/version-v5/react/your-first-app.md b/versioned_docs/version-v5/react/your-first-app.md index 63a11b97543..da7a5f7ccf6 100644 --- a/versioned_docs/version-v5/react/your-first-app.md +++ b/versioned_docs/version-v5/react/your-first-app.md @@ -27,7 +27,7 @@ Highlights include: - One React-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components). - Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitor.ionicframework.com), Ionic's official native app runtime. -- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Storage](https://capacitor.ionicframework.com/docs/apis/storage) APIs. +- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Preferences](https://capacitor.ionicframework.com/docs/apis/preferences) APIs. Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-react). @@ -79,7 +79,7 @@ cd photo-gallery Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work: ```shell -npm install @capacitor/camera @capacitor/storage @capacitor/filesystem +npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem ``` ### PWA Elements diff --git a/versioned_docs/version-v5/react/your-first-app/2-taking-photos.md b/versioned_docs/version-v5/react/your-first-app/2-taking-photos.md index 33dcb20ad6e..4abf6bc2051 100644 --- a/versioned_docs/version-v5/react/your-first-app/2-taking-photos.md +++ b/versioned_docs/version-v5/react/your-first-app/2-taking-photos.md @@ -22,7 +22,7 @@ import { isPlatform } from '@ionic/react'; import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; import { Filesystem, Directory } from '@capacitor/filesystem'; -import { Storage } from '@capacitor/storage'; +import { Preferences } from '@capacitor/preferences'; import { Capacitor } from '@capacitor/core'; ``` diff --git a/versioned_docs/version-v5/react/your-first-app/4-loading-photos.md b/versioned_docs/version-v5/react/your-first-app/4-loading-photos.md index 35dcd63a38a..00454621eb9 100644 --- a/versioned_docs/version-v5/react/your-first-app/4-loading-photos.md +++ b/versioned_docs/version-v5/react/your-first-app/4-loading-photos.md @@ -6,9 +6,9 @@ sidebar_label: Loading Photos We’ve implemented photo taking and saving to the filesystem. There’s one last piece of functionality missing: the photos are stored in the filesystem, but we need a way to save pointers to each file so that they can be displayed again in the photo gallery. -Fortunately, this is easy: we’ll leverage the Capacitor [Storage API](https://capacitor.ionicframework.com/docs/apis/storage) to store our array of Photos in a key-value store. +Fortunately, this is easy: we’ll leverage the Capacitor [Preferences API](https://capacitor.ionicframework.com/docs/apis/preferences) to store our array of Photos in a key-value store. -## Storage API +## Preferences API Begin by defining a constant variable that will act as the key for the store before the `usePhotoGallery` function definition in `src/hooks/usePhotoGallery.ts`: @@ -19,10 +19,10 @@ export function usePhotoGallery() {} Then, use the `Storage` class to get access to the get and set methods for reading and writing to device storage: -At the end of the `takePhoto` function, add a call to `Storage.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. +At the end of the `takePhoto` function, add a call to `Preferences.set()` to save the Photos array. By adding it here, the Photos array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved. ```tsx -Storage.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); +Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); ``` With the photo array data saved, we will create a method that will retrieve the data when the hook loads. We will do so by using React's `useEffect` hook. Insert this above the `takePhoto` declaration. Here is the code, and we will break it down: @@ -30,10 +30,10 @@ With the photo array data saved, we will create a method that will retrieve the ```tsx useEffect(() => { const loadSaved = async () => { - const { value } = await Storage.get({ key: PHOTO_STORAGE }); - const photosInStorage = (value ? JSON.parse(value) : []) as UserPhoto[]; + const { value } = await Preferences.get({ key: PHOTO_STORAGE }); + const photosInPreferences = (value ? JSON.parse(value) : []) as UserPhoto[]; - for (let photo of photosInStorage) { + for (let photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -41,7 +41,7 @@ useEffect(() => { // Web platform only: Load the photo as base64 data photo.webviewPath = `data:image/jpeg;base64,${file.data}`; } - setPhotos(photosInStorage); + setPhotos(photosInPreferences); }; loadSaved(); }, []); diff --git a/versioned_docs/version-v5/react/your-first-app/5-adding-mobile.md b/versioned_docs/version-v5/react/your-first-app/5-adding-mobile.md index ec65d87524f..eef40b7a333 100644 --- a/versioned_docs/version-v5/react/your-first-app/5-adding-mobile.md +++ b/versioned_docs/version-v5/react/your-first-app/5-adding-mobile.md @@ -52,12 +52,12 @@ Next, add a new bit of logic in the `loadSaved` function. On mobile, we can dire ```tsx const loadSaved = async () => { - const { value } = await Storage.get({ key: PHOTO_STORAGE }); + const { value } = await Preferences.get({ key: PHOTO_STORAGE }); - const photosInStorage = (value ? JSON.parse(value) : []) as UserPhoto[]; + const photosInPreferences = (value ? JSON.parse(value) : []) as UserPhoto[]; // If running on the web... if (!isPlatform('hybrid')) { - for (let photo of photosInStorage) { + for (let photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -66,7 +66,7 @@ const loadSaved = async () => { photo.webviewPath = `data:image/jpeg;base64,${file.data}`; } } - setPhotos(photosInStorage); + setPhotos(photosInPreferences); }; ``` diff --git a/versioned_docs/version-v5/react/your-first-app/7-live-reload.md b/versioned_docs/version-v5/react/your-first-app/7-live-reload.md index 1c1de115784..45dcf768053 100644 --- a/versioned_docs/version-v5/react/your-first-app/7-live-reload.md +++ b/versioned_docs/version-v5/react/your-first-app/7-live-reload.md @@ -91,7 +91,7 @@ const deletePhoto = async (photo: UserPhoto) => { const newPhotos = photos.filter((p) => p.filepath !== photo.filepath); // Update photos array cache by overwriting the existing photo array - Storage.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); + Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(newPhotos) }); // delete photo file from filesystem const filename = photo.filepath.substr(photo.filepath.lastIndexOf('/') + 1); @@ -103,7 +103,7 @@ const deletePhoto = async (photo: UserPhoto) => { }; ``` -The selected photo is removed from the Photos array first. Then, we use the Capacitor Storage API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. +The selected photo is removed from the Photos array first. Then, we use the Capacitor Preferences API to update the cached version of the Photos array. Finally, we delete the actual photo file itself using the Filesystem API. Make sure to return the `deletePhoto` function so it is as a part of the hook API that we expose: diff --git a/versioned_docs/version-v5/vue/your-first-app.md b/versioned_docs/version-v5/vue/your-first-app.md index ab54638476d..db73be1f0cf 100644 --- a/versioned_docs/version-v5/vue/your-first-app.md +++ b/versioned_docs/version-v5/vue/your-first-app.md @@ -25,7 +25,7 @@ Highlights include: - One Vue-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components). - Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitor.ionicframework.com), Ionic's official native app runtime. -- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Storage](https://capacitor.ionicframework.com/docs/apis/storage) APIs. +- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitor.ionicframework.com/docs/apis/camera), [Filesystem](https://capacitor.ionicframework.com/docs/apis/filesystem), and [Preferences](https://capacitor.ionicframework.com/docs/apis/preferences) APIs. Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-vue). @@ -77,7 +77,7 @@ cd photo-gallery Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work: ```shell -npm install @capacitor/camera @capacitor/storage @capacitor/filesystem +npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem ``` ### PWA Elements diff --git a/versioned_docs/version-v5/vue/your-first-app/2-taking-photos.md b/versioned_docs/version-v5/vue/your-first-app/2-taking-photos.md index e0632873305..38bafe39a59 100644 --- a/versioned_docs/version-v5/vue/your-first-app/2-taking-photos.md +++ b/versioned_docs/version-v5/vue/your-first-app/2-taking-photos.md @@ -20,7 +20,7 @@ We will start by importing the various utilities we will use from Vue core and C import { ref, onMounted, watch } from 'vue'; import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; import { Filesystem, Directory } from '@capacitor/filesystem'; -import { Storage } from '@capacitor/storage'; +import { Preferences } from '@capacitor/preferences'; ``` Next, create a function named usePhotoGallery: diff --git a/versioned_docs/version-v5/vue/your-first-app/4-loading-photos.md b/versioned_docs/version-v5/vue/your-first-app/4-loading-photos.md index 4a2df79fa5a..b0157de7654 100644 --- a/versioned_docs/version-v5/vue/your-first-app/4-loading-photos.md +++ b/versioned_docs/version-v5/vue/your-first-app/4-loading-photos.md @@ -6,9 +6,9 @@ sidebar_label: Loading Photos We’ve implemented photo taking and saving to the filesystem. There’s one last piece of functionality missing: the photos are stored in the filesystem, but we need a way to save pointers to each file so that they can be displayed again in the photo gallery. -Fortunately, this is easy: we’ll leverage the Capacitor [Storage API](https://capacitor.ionicframework.com/docs/apis/storage) to store our array of Photos in a key-value store. +Fortunately, this is easy: we’ll leverage the Capacitor [Preferences API](https://capacitor.ionicframework.com/docs/apis/preferences) to store our array of Photos in a key-value store. -## Storage API +## Preferences API Begin by defining a constant variable that will act as the key for the store at the top of the `usePhotoGallery` function in `src/composables/usePhotoGallery.ts`: @@ -16,11 +16,11 @@ Begin by defining a constant variable that will act as the key for the store at const PHOTO_STORAGE = 'photos'; ``` -Next, add a `cachePhotos` function that saves the Photos array as JSON to file storage: +Next, add a `cachePhotos` function that saves the Photos array as JSON to preferences: ```tsx const cachePhotos = () => { - Storage.set({ + Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(photos.value), }); @@ -33,14 +33,14 @@ Next, use the Vue [watch function](https://v3.vuejs.org/guide/composition-api-in watch(photos, cachePhotos); ``` -Now that the photo array data is saved, create a function to retrieve the data when Tab2 loads. First, retrieve photo data from Storage, then each photo's data into base64 format: +Now that the photo array data is saved, create a function to retrieve the data when Tab2 loads. First, retrieve photo data from Preferences, then each photo's data into base64 format: ```tsx const loadSaved = async () => { - const photoList = await Storage.get({ key: PHOTO_STORAGE }); - const photosInStorage = photoList.value ? JSON.parse(photoList.value) : []; + const photoList = await Preferences.get({ key: PHOTO_STORAGE }); + const photosInPreferences = photoList.value ? JSON.parse(photoList.value) : []; - for (const photo of photosInStorage) { + for (const photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -48,7 +48,7 @@ const loadSaved = async () => { photo.webviewPath = `data:image/jpeg;base64,${file.data}`; } - photos.value = photosInStorage; + photos.value = photosInPreferences; }; ``` diff --git a/versioned_docs/version-v5/vue/your-first-app/5-adding-mobile.md b/versioned_docs/version-v5/vue/your-first-app/5-adding-mobile.md index 39a37a424e7..728e1ffb83c 100644 --- a/versioned_docs/version-v5/vue/your-first-app/5-adding-mobile.md +++ b/versioned_docs/version-v5/vue/your-first-app/5-adding-mobile.md @@ -57,12 +57,12 @@ Next, add a new bit of logic in the `loadSaved` function. On mobile, we can dire ```tsx const loadSaved = async () => { - const photoList = await Storage.get({ key: PHOTO_STORAGE }); - const photosInStorage = photoList.value ? JSON.parse(photoList.value) : []; + const photoList = await Preferences.get({ key: PHOTO_STORAGE }); + const photosInPreferences = photoList.value ? JSON.parse(photoList.value) : []; // If running on the web... if (!isPlatform('hybrid')) { - for (const photo of photosInStorage) { + for (const photo of photosInPreferences) { const file = await Filesystem.readFile({ path: photo.filepath, directory: Directory.Data, @@ -72,7 +72,7 @@ const loadSaved = async () => { } } - photos.value = photosInStorage; + photos.value = photosInPreferences; }; ``` diff --git a/versioned_docs/version-v5/vue/your-first-app/7-live-reload.md b/versioned_docs/version-v5/vue/your-first-app/7-live-reload.md index 0d64028f047..2764b126bc8 100644 --- a/versioned_docs/version-v5/vue/your-first-app/7-live-reload.md +++ b/versioned_docs/version-v5/vue/your-first-app/7-live-reload.md @@ -125,7 +125,7 @@ Remember that removing the photo from the `photos` array triggers the `cachePhot ```tsx const cachePhotos = () => { - Storage.set({ + Preferences.set({ key: PHOTO_STORAGE, value: JSON.stringify(photos.value), }); From 0506f010a3fad7413935ac68851228d0475cd77d Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Wed, 31 Aug 2022 15:45:22 -0500 Subject: [PATCH 028/469] docs(toast): fix aria-live usage (#2520) --- docs/api/toast.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/toast.md b/docs/api/toast.md index 2ef9e1be4ab..4de48c86620 100644 --- a/docs/api/toast.md +++ b/docs/api/toast.md @@ -98,7 +98,7 @@ Toasts are intended to be subtle notifications and are not intended to interrupt `ion-toast` has `aria-live="polite"` and `aria-atomic="true"` set by default. -`aria-live` causes screen readers to announce the content of the toast when it is presented. However, since the attribute is set to `'polite'`, screen readers generally do not interrupt the current task. Developers can customize this behavior by using the `htmlAttributes` property to set `aria-live` to `'assertive'`. This will cause screen readers to immediately notify the user when a toast is presented, potentially interrupting any previous updates. +`aria-live` causes screen readers to announce the content of the toast when it is updated. However, since the attribute is set to `'polite'`, screen readers generally do not interrupt the current task. Developers can customize this behavior by using the `htmlAttributes` property to set `aria-live` to `'assertive'`. This will cause screen readers to immediately notify the user when a toast is updated, potentially interrupting any previous updates. `aria-atomic="true"` is set to ensure that the entire toast is announced as a single unit. This is useful when dynamically updating the content of the toast as it prevents screen readers from announcing only the content that has changed. @@ -497,4 +497,4 @@ export default defineComponent({ ## Slots - \ No newline at end of file + From 8cb2f334c8ef1946c07d4b06fe819d44fb3b62bf Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Thu, 1 Sep 2022 12:58:22 -0500 Subject: [PATCH 029/469] fix(playground): use className instead of class (#2522) --- src/components/global/Playground/icons/IconDots.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/global/Playground/icons/IconDots.tsx b/src/components/global/Playground/icons/IconDots.tsx index 3c13b771d9c..5d74a1822a9 100644 --- a/src/components/global/Playground/icons/IconDots.tsx +++ b/src/components/global/Playground/icons/IconDots.tsx @@ -3,7 +3,7 @@ import React from 'react'; import './IconDots.css'; export const IconDots = () => ( -

+
From 01dd2f5758e0eb9fdd4f880c582eced728ae9cc7 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Thu, 1 Sep 2022 14:02:43 -0500 Subject: [PATCH 030/469] fix(skeleton-text): use consistent naming for files (#2523) --- .../usage/skeleton-text/basic/angular/angular-ts.md | 13 ------------- .../{angular-html.md => example_component_html.md} | 0 .../basic/angular/example_component_ts.md | 13 +++++++++++++ static/usage/skeleton-text/basic/index.md | 8 ++++---- .../{angular-css.md => example_component_css.md} | 0 .../{angular-html.md => example_component_html.md} | 0 static/usage/skeleton-text/theming/index.md | 12 ++++++------ .../theming/react/{react-css.md => main_css.md} | 0 .../theming/react/{react-tsx.md => main_tsx.md} | 0 9 files changed, 23 insertions(+), 23 deletions(-) delete mode 100644 static/usage/skeleton-text/basic/angular/angular-ts.md rename static/usage/skeleton-text/basic/angular/{angular-html.md => example_component_html.md} (100%) create mode 100644 static/usage/skeleton-text/basic/angular/example_component_ts.md rename static/usage/skeleton-text/theming/angular/{angular-css.md => example_component_css.md} (100%) rename static/usage/skeleton-text/theming/angular/{angular-html.md => example_component_html.md} (100%) rename static/usage/skeleton-text/theming/react/{react-css.md => main_css.md} (100%) rename static/usage/skeleton-text/theming/react/{react-tsx.md => main_tsx.md} (100%) diff --git a/static/usage/skeleton-text/basic/angular/angular-ts.md b/static/usage/skeleton-text/basic/angular/angular-ts.md deleted file mode 100644 index 1931197e875..00000000000 --- a/static/usage/skeleton-text/basic/angular/angular-ts.md +++ /dev/null @@ -1,13 +0,0 @@ -```ts -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'] -}) -export class AppComponent { - public loaded = false; -} - -``` \ No newline at end of file diff --git a/static/usage/skeleton-text/basic/angular/angular-html.md b/static/usage/skeleton-text/basic/angular/example_component_html.md similarity index 100% rename from static/usage/skeleton-text/basic/angular/angular-html.md rename to static/usage/skeleton-text/basic/angular/example_component_html.md diff --git a/static/usage/skeleton-text/basic/angular/example_component_ts.md b/static/usage/skeleton-text/basic/angular/example_component_ts.md new file mode 100644 index 00000000000..8b30337848c --- /dev/null +++ b/static/usage/skeleton-text/basic/angular/example_component_ts.md @@ -0,0 +1,13 @@ +```ts +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-example', + templateUrl: 'example.component.html', + styleUrls: ['example.component.css'] +}) +export class ExampleComponent { + public loaded = false; +} + +``` \ No newline at end of file diff --git a/static/usage/skeleton-text/basic/index.md b/static/usage/skeleton-text/basic/index.md index a605ef2462f..33b4f57ee26 100644 --- a/static/usage/skeleton-text/basic/index.md +++ b/static/usage/skeleton-text/basic/index.md @@ -4,8 +4,8 @@ import javascript from './javascript.md'; import react from './react.md'; import vue from './vue.md'; -import angularHTML from './angular/angular-html.md'; -import angularTS from './angular/angular-ts.md'; +import angularHTML from './angular/example_component_html.md'; +import angularTS from './angular/example_component_ts.md'; Date: Thu, 1 Sep 2022 16:45:31 -0400 Subject: [PATCH 031/469] docs(avatar): add component playgrounds and new svg (#2524) --- docs/api/avatar.md | 181 ++---------------- static/demos/api/avatar/avatar.svg | 13 +- static/img/avatar.svg | 13 +- static/usage/avatar/basic/angular.md | 5 + static/usage/avatar/basic/demo.html | 27 +++ static/usage/avatar/basic/index.md | 8 + static/usage/avatar/basic/javascript.md | 5 + static/usage/avatar/basic/react.md | 15 ++ static/usage/avatar/basic/vue.md | 16 ++ static/usage/avatar/chip/angular.md | 8 + static/usage/avatar/chip/demo.html | 30 +++ static/usage/avatar/chip/index.md | 8 + static/usage/avatar/chip/javascript.md | 8 + static/usage/avatar/chip/react.md | 17 ++ static/usage/avatar/chip/vue.md | 19 ++ static/usage/avatar/item/angular.md | 8 + static/usage/avatar/item/demo.html | 30 +++ static/usage/avatar/item/index.md | 8 + static/usage/avatar/item/javascript.md | 8 + static/usage/avatar/item/react.md | 17 ++ static/usage/avatar/item/vue.md | 19 ++ .../theming/angular/example_component_css.md | 5 + .../theming/angular/example_component_html.md | 5 + static/usage/avatar/theming/demo.html | 32 ++++ static/usage/avatar/theming/index.md | 32 ++++ static/usage/avatar/theming/javascript.md | 11 ++ static/usage/avatar/theming/react.md | 20 ++ static/usage/avatar/theming/react/main_css.md | 5 + static/usage/avatar/theming/react/main_tsx.md | 18 ++ static/usage/avatar/theming/vue.md | 22 +++ static/usage/chip/slots/angular.md | 2 +- static/usage/chip/slots/demo.html | 2 +- static/usage/chip/slots/javascript.md | 2 +- static/usage/chip/slots/react.md | 2 +- static/usage/chip/slots/vue.md | 2 +- 35 files changed, 448 insertions(+), 175 deletions(-) create mode 100644 static/usage/avatar/basic/angular.md create mode 100644 static/usage/avatar/basic/demo.html create mode 100644 static/usage/avatar/basic/index.md create mode 100644 static/usage/avatar/basic/javascript.md create mode 100644 static/usage/avatar/basic/react.md create mode 100644 static/usage/avatar/basic/vue.md create mode 100644 static/usage/avatar/chip/angular.md create mode 100644 static/usage/avatar/chip/demo.html create mode 100644 static/usage/avatar/chip/index.md create mode 100644 static/usage/avatar/chip/javascript.md create mode 100644 static/usage/avatar/chip/react.md create mode 100644 static/usage/avatar/chip/vue.md create mode 100644 static/usage/avatar/item/angular.md create mode 100644 static/usage/avatar/item/demo.html create mode 100644 static/usage/avatar/item/index.md create mode 100644 static/usage/avatar/item/javascript.md create mode 100644 static/usage/avatar/item/react.md create mode 100644 static/usage/avatar/item/vue.md create mode 100644 static/usage/avatar/theming/angular/example_component_css.md create mode 100644 static/usage/avatar/theming/angular/example_component_html.md create mode 100644 static/usage/avatar/theming/demo.html create mode 100644 static/usage/avatar/theming/index.md create mode 100644 static/usage/avatar/theming/javascript.md create mode 100644 static/usage/avatar/theming/react.md create mode 100644 static/usage/avatar/theming/react/main_css.md create mode 100644 static/usage/avatar/theming/react/main_tsx.md create mode 100644 static/usage/avatar/theming/vue.md diff --git a/docs/api/avatar.md b/docs/api/avatar.md index 86fb904812a..e7a005fa719 100644 --- a/docs/api/avatar.md +++ b/docs/api/avatar.md @@ -1,11 +1,6 @@ --- title: "ion-avatar" -hide_table_of_contents: true -demoUrl: "/docs/demos/api/avatar/index.html" -demoSourceUrl: "https://github.com/ionic-team/ionic-docs/tree/main/static/demos/api/avatar/index.html" --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; import Props from '@site/static/auto-generated/avatar/props.md'; import Events from '@site/static/auto-generated/avatar/events.md'; @@ -20,186 +15,36 @@ import Slots from '@site/static/auto-generated/avatar/slots.md'; import EncapsulationPill from '@components/page/api/EncapsulationPill'; -import APITOCInline from '@components/page/api/APITOCInline'; -

Contents

- - - - - Avatars are circular components that usually wrap an image or icon. They can be used to represent a person or an object. Avatars can be used by themselves or inside of any element. If placed inside of an `ion-chip` or `ion-item`, the avatar will resize to fit the parent component. To position an avatar on the left or right side of an item, set the slot to `start` or `end`, respectively. +## Basic +import Basic from '@site/static/usage/avatar/basic/index.md'; + -## Usage +## Chip Avatar - +import Chip from '@site/static/usage/avatar/chip/index.md'; - + -```html - - - +## Item Avatar - - - - - Chip Avatar - - - - - - - Item Avatar - -``` +import Item from '@site/static/usage/avatar/item/index.md'; - + +## Theming - +import Theming from '@site/static/usage/avatar/theming/index.md'; -```html - - - - - - - - - Chip Avatar - - - - - - - Item Avatar - -``` - - - - - - -```tsx -import React from 'react'; -import { IonAvatar, IonChip, IonItem, IonLabel, IonContent } from '@ionic/react'; - -export const AvatarExample: React.FC = () => ( - - - - - - - - - - Chip Avatar - - - - - - - Item Avatar - - -); -``` - - - - - - -```tsx -import { Component, h } from '@stencil/core'; - -@Component({ - tag: 'avatar-example', - styleUrl: 'avatar-example.css' -}) -export class AvatarExample { - render() { - return [ - - - , - - - - - - Chip Avatar - , - - - - - - Item Avatar - - ]; - } -} -``` - - - - - - -```html - - - -``` - - - - + ## Properties @@ -217,4 +62,4 @@ export default defineComponent({ ## Slots - \ No newline at end of file + diff --git a/static/demos/api/avatar/avatar.svg b/static/demos/api/avatar/avatar.svg index 90c4d0e9cbd..bd0cec9a9c1 100644 --- a/static/demos/api/avatar/avatar.svg +++ b/static/demos/api/avatar/avatar.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + + + + + diff --git a/static/img/avatar.svg b/static/img/avatar.svg index 90c4d0e9cbd..bd0cec9a9c1 100644 --- a/static/img/avatar.svg +++ b/static/img/avatar.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + + + + + diff --git a/static/usage/avatar/basic/angular.md b/static/usage/avatar/basic/angular.md new file mode 100644 index 00000000000..0e544a336b8 --- /dev/null +++ b/static/usage/avatar/basic/angular.md @@ -0,0 +1,5 @@ +```html + + Silhouette of a person's head + +``` diff --git a/static/usage/avatar/basic/demo.html b/static/usage/avatar/basic/demo.html new file mode 100644 index 00000000000..f4b499736c2 --- /dev/null +++ b/static/usage/avatar/basic/demo.html @@ -0,0 +1,27 @@ + + + + + + + Avatar + + + + + + + + + + +
+ + Silhouette of a person's head + +
+
+
+ + + diff --git a/static/usage/avatar/basic/index.md b/static/usage/avatar/basic/index.md new file mode 100644 index 00000000000..5c31f3f5306 --- /dev/null +++ b/static/usage/avatar/basic/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/avatar/basic/javascript.md b/static/usage/avatar/basic/javascript.md new file mode 100644 index 00000000000..0e544a336b8 --- /dev/null +++ b/static/usage/avatar/basic/javascript.md @@ -0,0 +1,5 @@ +```html + + Silhouette of a person's head + +``` diff --git a/static/usage/avatar/basic/react.md b/static/usage/avatar/basic/react.md new file mode 100644 index 00000000000..419456d4733 --- /dev/null +++ b/static/usage/avatar/basic/react.md @@ -0,0 +1,15 @@ +```tsx +import React from 'react'; +import { IonAvatar } from '@ionic/react'; + +function Example() { + return ( + <> + + Silhouette of a person's head + + + ); +} +export default Example; +``` diff --git a/static/usage/avatar/basic/vue.md b/static/usage/avatar/basic/vue.md new file mode 100644 index 00000000000..95bee27c769 --- /dev/null +++ b/static/usage/avatar/basic/vue.md @@ -0,0 +1,16 @@ +```html + + + +``` diff --git a/static/usage/avatar/chip/angular.md b/static/usage/avatar/chip/angular.md new file mode 100644 index 00000000000..767e5bc3ff3 --- /dev/null +++ b/static/usage/avatar/chip/angular.md @@ -0,0 +1,8 @@ +```html + + + Silhouette of a person's head + + Chip Avatar + +``` diff --git a/static/usage/avatar/chip/demo.html b/static/usage/avatar/chip/demo.html new file mode 100644 index 00000000000..bf827440dd6 --- /dev/null +++ b/static/usage/avatar/chip/demo.html @@ -0,0 +1,30 @@ + + + + + + + Avatar + + + + + + + + + + +
+ + + Silhouette of a person's head + + Chip Avatar + +
+
+
+ + + diff --git a/static/usage/avatar/chip/index.md b/static/usage/avatar/chip/index.md new file mode 100644 index 00000000000..2acfeb4b578 --- /dev/null +++ b/static/usage/avatar/chip/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/avatar/chip/javascript.md b/static/usage/avatar/chip/javascript.md new file mode 100644 index 00000000000..767e5bc3ff3 --- /dev/null +++ b/static/usage/avatar/chip/javascript.md @@ -0,0 +1,8 @@ +```html + + + Silhouette of a person's head + + Chip Avatar + +``` diff --git a/static/usage/avatar/chip/react.md b/static/usage/avatar/chip/react.md new file mode 100644 index 00000000000..237cbd54d64 --- /dev/null +++ b/static/usage/avatar/chip/react.md @@ -0,0 +1,17 @@ +```tsx +import React from 'react'; +import { IonAvatar, IonChip, IonLabel } from '@ionic/react'; +function Example() { + return ( + <> + + + Silhouette of a person's head + + Chip Avatar + + + ); +} +export default Example; +``` diff --git a/static/usage/avatar/chip/vue.md b/static/usage/avatar/chip/vue.md new file mode 100644 index 00000000000..fe07bebe1ad --- /dev/null +++ b/static/usage/avatar/chip/vue.md @@ -0,0 +1,19 @@ +```html + + + +``` diff --git a/static/usage/avatar/item/angular.md b/static/usage/avatar/item/angular.md new file mode 100644 index 00000000000..20a7db662dc --- /dev/null +++ b/static/usage/avatar/item/angular.md @@ -0,0 +1,8 @@ +```html + + + Silhouette of a person's head + + Item Avatar + +``` diff --git a/static/usage/avatar/item/demo.html b/static/usage/avatar/item/demo.html new file mode 100644 index 00000000000..dde84e47480 --- /dev/null +++ b/static/usage/avatar/item/demo.html @@ -0,0 +1,30 @@ + + + + + + + Avatar + + + + + + + + + + +
+ + + Silhouette of a person's head + + Item Avatar + +
+
+
+ + + diff --git a/static/usage/avatar/item/index.md b/static/usage/avatar/item/index.md new file mode 100644 index 00000000000..43630dba17e --- /dev/null +++ b/static/usage/avatar/item/index.md @@ -0,0 +1,8 @@ +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 from './angular.md'; + + diff --git a/static/usage/avatar/item/javascript.md b/static/usage/avatar/item/javascript.md new file mode 100644 index 00000000000..20a7db662dc --- /dev/null +++ b/static/usage/avatar/item/javascript.md @@ -0,0 +1,8 @@ +```html + + + Silhouette of a person's head + + Item Avatar + +``` diff --git a/static/usage/avatar/item/react.md b/static/usage/avatar/item/react.md new file mode 100644 index 00000000000..b652100dbeb --- /dev/null +++ b/static/usage/avatar/item/react.md @@ -0,0 +1,17 @@ +```tsx +import React from 'react'; +import { IonAvatar, IonItem, IonLabel } from '@ionic/react'; +function Example() { + return ( + <> + + + Silhouette of a person's head + + Item Avatar + + + ); +} +export default Example; +``` diff --git a/static/usage/avatar/item/vue.md b/static/usage/avatar/item/vue.md new file mode 100644 index 00000000000..745d67ed32e --- /dev/null +++ b/static/usage/avatar/item/vue.md @@ -0,0 +1,19 @@ +```html + + + +``` diff --git a/static/usage/avatar/theming/angular/example_component_css.md b/static/usage/avatar/theming/angular/example_component_css.md new file mode 100644 index 00000000000..5a97e1fc6ae --- /dev/null +++ b/static/usage/avatar/theming/angular/example_component_css.md @@ -0,0 +1,5 @@ +```css +ion-avatar { + --border-radius: 4px; +} +``` diff --git a/static/usage/avatar/theming/angular/example_component_html.md b/static/usage/avatar/theming/angular/example_component_html.md new file mode 100644 index 00000000000..0e544a336b8 --- /dev/null +++ b/static/usage/avatar/theming/angular/example_component_html.md @@ -0,0 +1,5 @@ +```html + + Silhouette of a person's head + +``` diff --git a/static/usage/avatar/theming/demo.html b/static/usage/avatar/theming/demo.html new file mode 100644 index 00000000000..0d3c4b67ac2 --- /dev/null +++ b/static/usage/avatar/theming/demo.html @@ -0,0 +1,32 @@ + + + + + + + Avatar + + + + + + + + + + + +
+ + Silhouette of a person's head + +
+
+
+ + + diff --git a/static/usage/avatar/theming/index.md b/static/usage/avatar/theming/index.md new file mode 100644 index 00000000000..e586aae743b --- /dev/null +++ b/static/usage/avatar/theming/index.md @@ -0,0 +1,32 @@ +import Playground from '@site/src/components/global/Playground'; + +import javascript from './javascript.md'; + +import reactTSX from './react/main_tsx.md'; +import reactCSS from './react/main_css.md'; + +import vue from './vue.md'; + +import angularHTML from './angular/example_component_html.md'; +import angularCSS from './angular/example_component_css.md'; + + diff --git a/static/usage/avatar/theming/javascript.md b/static/usage/avatar/theming/javascript.md new file mode 100644 index 00000000000..96e64bcf277 --- /dev/null +++ b/static/usage/avatar/theming/javascript.md @@ -0,0 +1,11 @@ +```html + + + + Silhouette of a person's head + +``` diff --git a/static/usage/avatar/theming/react.md b/static/usage/avatar/theming/react.md new file mode 100644 index 00000000000..7d0e98290b8 --- /dev/null +++ b/static/usage/avatar/theming/react.md @@ -0,0 +1,20 @@ +```tsx +import React from 'react'; +import { IonAvatar, IonItem, IonLabel } from '@ionic/react'; + +import './main.css'; + +function Example() { + return ( + <> + + + Silhouette of a person's head + + Item Avatar + + + ); +} +export default Example; +``` diff --git a/static/usage/avatar/theming/react/main_css.md b/static/usage/avatar/theming/react/main_css.md new file mode 100644 index 00000000000..5a97e1fc6ae --- /dev/null +++ b/static/usage/avatar/theming/react/main_css.md @@ -0,0 +1,5 @@ +```css +ion-avatar { + --border-radius: 4px; +} +``` diff --git a/static/usage/avatar/theming/react/main_tsx.md b/static/usage/avatar/theming/react/main_tsx.md new file mode 100644 index 00000000000..4824f336b9c --- /dev/null +++ b/static/usage/avatar/theming/react/main_tsx.md @@ -0,0 +1,18 @@ + +```tsx +import React from 'react'; +import { IonAvatar } from '@ionic/react'; + +import './main.css'; + +function Example() { + return ( + <> + + Silhouette of a person's head + + + ); +} +export default Example; +``` diff --git a/static/usage/avatar/theming/vue.md b/static/usage/avatar/theming/vue.md new file mode 100644 index 00000000000..235fb00ea0b --- /dev/null +++ b/static/usage/avatar/theming/vue.md @@ -0,0 +1,22 @@ +```html + + + + + +``` diff --git a/static/usage/chip/slots/angular.md b/static/usage/chip/slots/angular.md index 6387a0e55ba..3fbc4818f43 100644 --- a/static/usage/chip/slots/angular.md +++ b/static/usage/chip/slots/angular.md @@ -1,7 +1,7 @@ ```html - + Silhouette of a person's head Avatar Chip diff --git a/static/usage/chip/slots/demo.html b/static/usage/chip/slots/demo.html index fd3f22a72df..4888fb8d911 100644 --- a/static/usage/chip/slots/demo.html +++ b/static/usage/chip/slots/demo.html @@ -18,7 +18,7 @@
- + Silhouette of a person's head Avatar Chip diff --git a/static/usage/chip/slots/javascript.md b/static/usage/chip/slots/javascript.md index 6387a0e55ba..3fbc4818f43 100644 --- a/static/usage/chip/slots/javascript.md +++ b/static/usage/chip/slots/javascript.md @@ -1,7 +1,7 @@ ```html - + Silhouette of a person's head Avatar Chip diff --git a/static/usage/chip/slots/react.md b/static/usage/chip/slots/react.md index 25fd0d192b1..7a36f9b68c5 100644 --- a/static/usage/chip/slots/react.md +++ b/static/usage/chip/slots/react.md @@ -8,7 +8,7 @@ function Example() { <> - + Silhouette of a person's head Avatar Chip diff --git a/static/usage/chip/slots/vue.md b/static/usage/chip/slots/vue.md index 29e12166788..24ef77077f2 100644 --- a/static/usage/chip/slots/vue.md +++ b/static/usage/chip/slots/vue.md @@ -2,7 +2,7 @@