-
Notifications
You must be signed in to change notification settings - Fork 3.2k
feat(playground): add support for generating a new playground #2994
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 16 commits
e14eb22
61e5dc3
62003d8
af3ab6b
e648bc5
9fe4970
7f892c4
e550592
bce58e7
0c56e30
94e0d5d
be0ce65
b886304
a322b38
9905e53
be300d2
e02db6e
9aa8d83
5c37cb7
7bb71b3
f04be20
705002b
8e9df52
e96c425
ffc5df3
4c041cb
eaf5fd1
ecc4d1a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# Hygen templates | ||
|
||
The templates in this directory are intended to be used with [hygen](https://www.hygen.io/) to generate boilerplate files. Check out [the root package.json](../package.json) to see if there are any custom commands to use them (e.g. `npm run playground:new`). You can also run e.g. `hygen playground new` to use a generator. | ||
|
||
Some helpful docs links for updating/creating templates: | ||
|
||
- [enquirer](https://github.com/enquirer/enquirer#toggle-prompt) for building command line prompts | ||
- [inflection](https://www.hygen.io/docs/templates#helpers-and-inflections) and [change case](https://www.hygen.io/docs/templates#change-case-helpers) for e.g. changing the case of variables submitted via the prompts | ||
|
||
# New playground template | ||
|
||
## Generation | ||
|
||
To create a new playground, run `npm run playground:new`. This will walk you through some prompts to decide what files for the generator to scaffold for the playground, and what their paths should be. | ||
|
||
The path defaults to `basic`. If there is already a basic playground, you'll want to input a different path for the playground. | ||
|
||
The CSS option will add extra files if you need to include custom CSS in your playground. This is often not needed. | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
If you need a component for multiple versions of Ionic Framework, you (currently) need to run the generator once for each version. | ||
|
||
## Usage | ||
|
||
Once you've generated your playground, you need to add it to the main markdown file in the docs (e.g. [docs/api/button.md](../docs/api/button.md)) by doing something similar to the following example: | ||
|
||
``` | ||
## Feature | ||
|
||
import Feature from '@site/static/usage/v7/button/feature/index.md'; | ||
|
||
<Feature /> | ||
Comment on lines
+27
to
+31
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Totally optional, but it might be cool if the command could spit out this code for you to copy-paste, dynamically using the (formatted) name of the innermost directory created as the feature name. Don't worry about it if it would be a big lift, though. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Great idea!! There's probably a more elegant way we could do it, but I added an MVP. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I updated this with a little improvement, although it still would be better if it only gets logged if the files are successfully generated. (But at least now the copy doesn't state that the generation succeeded.) |
||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
--- | ||
# this file's location depends on whether or not the css option is selected via the prompt | ||
to: "<%= `static/usage/v${version}/${name.replace('ion-', '')}/${path}/${css ? 'angular/example_component_html.md' : 'angular.md'}` %>" | ||
--- | ||
```html | ||
<<%= name %>></<%= name %>> | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
--- | ||
# this file only gets generated if `css` (from the command line prompt) is true | ||
to: "<%= css ? `static/usage/v${version}/${name.replace('ion-', '')}/${path}/angular/example_component_css.md` : null %>" | ||
--- | ||
```css | ||
<%= name %> { | ||
/* styles go here */ | ||
} | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
--- | ||
arbitrary: <% nameWithoutIon = name.replace('ion-', ''); numberOfAncestors = (path.match(/\//g) || []).length; directoryChanges = '../'.repeat(numberOfAncestors) %> | ||
to: "<%= `static/usage/v${version}/${nameWithoutIon}/${path}/demo.html` %>" | ||
--- | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
<title><%= h.changeCase.titleCase(nameWithoutIon) %></title> | ||
<link rel="stylesheet" href="<%= directoryChanges %>../../../common.css" /> | ||
<script src="<%= directoryChanges %>../../../common.js"></script> | ||
Comment on lines
+11
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps there's a way to do this without using relative paths? I couldn't quickly find one. |
||
<script type="module" src="https://cdn.jsdelivr.net/npm/@ionic/core@<%= version %>/dist/ionic/ionic.esm.js"></script> | ||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ionic/core@<%= version %>/css/ionic.bundle.css" /><% if (css){ %> | ||
|
||
<style> | ||
<%= name %> { | ||
/* styles go here */ | ||
} | ||
</style><% } %> | ||
</head> | ||
|
||
<body> | ||
<ion-app> | ||
<ion-content> | ||
<div class="container"> | ||
<<%= name %>></<%= name %>> | ||
</div> | ||
</ion-content> | ||
</ion-app> | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
--- | ||
arbitrary: <% nameWithoutIon = name.replace('ion-', '') %> | ||
# this template is only used if `css` (from the command line prompt) is false | ||
to: "<%= css ? null : `static/usage/v${version}/${nameWithoutIon}/${path}/index.md` %>" | ||
--- | ||
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'; | ||
|
||
<Playground version="<%= version %>" code={{ javascript, react, vue, angular }} src="<%= `usage/v${version}/${nameWithoutIon}/${path}/demo.html` %>" /> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
--- | ||
arbitrary: <% nameWithoutIon = name.replace('ion-', '') %> | ||
# this template is only used if `css` (from the command line prompt) is true | ||
to: "<%= css ? `static/usage/v${version}/${nameWithoutIon}/${path}/index.md` : null %>" | ||
--- | ||
import Playground from '@site/src/components/global/Playground'; | ||
|
||
import javascript from './javascript.md'; | ||
|
||
import react_main_tsx from './react/main_tsx.md'; | ||
import react_main_css from './react/main_css.md'; | ||
|
||
import vue from './vue.md'; | ||
|
||
import angular_example_component_html from './angular/example_component_html.md'; | ||
import angular_example_component_css from './angular/example_component_css.md'; | ||
|
||
<Playground | ||
version="<%= version %>" | ||
code={{ | ||
javascript, | ||
react: { | ||
files: { | ||
'src/main.tsx': react_main_tsx, | ||
'src/main.css': react_main_css, | ||
}, | ||
}, | ||
vue, | ||
angular: { | ||
files: { | ||
'src/app/example.component.html': angular_example_component_html, | ||
'src/app/example.component.css': angular_example_component_css, | ||
}, | ||
}, | ||
}} | ||
src="<%= `usage/v${version}/${nameWithoutIon}/${path}/demo.html` %>" | ||
/> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--- | ||
to: "<%= `static/usage/v${version}/${name.replace('ion-', '')}/${path}/javascript.md` %>" | ||
--- | ||
```html | ||
<<%= name %>></<%= name %>><% if (css){ %> | ||
|
||
<style> | ||
<%= name %> { | ||
/* styles go here */ | ||
} | ||
</style><% } %> | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// see types of prompts: | ||
// https://github.com/enquirer/enquirer/tree/master/examples | ||
// | ||
module.exports = [ | ||
{ | ||
type: 'input', | ||
name: 'name', | ||
message: 'Which component is this playground for?', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm very open to copy changes for the prompts in this file. I just put the first thing that came to mind. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we add a note that the component name must be kebab case? For example writing "IonButton" won't work as expected |
||
initial: 'ion-button', | ||
}, | ||
{ | ||
type: 'input', | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
name: 'path', | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
message: 'What should the playground path be?', | ||
hint: 'e.g. `theming/colors`', | ||
initial: 'basic', | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}, | ||
{ | ||
type: 'select', | ||
name: 'version', | ||
message: 'Select the Ionic Framework version for the playground', | ||
initial: '7', | ||
choices: ['6', '7'], | ||
}, | ||
{ | ||
type: 'toggle', | ||
name: 'css', | ||
message: 'Do you want CSS scaffolded?', | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
enabled: 'Yes', | ||
disabled: 'No', | ||
}, | ||
]; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- | ||
arbitrary: <% pascalName = h.changeCase.pascal(name) %> | ||
# this file's location depends on whether or not the css option is selected via the prompt | ||
to: "<%= `static/usage/v${version}/${name.replace('ion-', '')}/${path}/${css ? 'react/main_tsx.md' : 'react.md'}` %>" | ||
--- | ||
```tsx | ||
import React from 'react'; | ||
import { <%= pascalName %> } from '@ionic/react'; | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
function Example() { | ||
return ( | ||
<<%= pascalName %>></<%= pascalName %>> | ||
); | ||
} | ||
export default Example; | ||
``` | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
--- | ||
# this file only gets generated if `css` (from the command line prompt) is true | ||
to: "<%= css ? `static/usage/v${version}/${name.replace('ion-', '')}/${path}/react/main_css.md` : null %>" | ||
--- | ||
```css | ||
<%= name %> { | ||
/* styles go here */ | ||
} | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
--- | ||
arbitrary: <% pascalName = h.changeCase.pascal(name) %> | ||
to: "<%= `static/usage/v${version}/${name.replace('ion-', '')}/${path}/vue.md` %>" | ||
--- | ||
```html | ||
<template> | ||
<<%= name %>> | ||
</<%= name %>> | ||
mapsandapps marked this conversation as resolved.
Show resolved
Hide resolved
|
||
</template> | ||
|
||
<script lang="ts"> | ||
import { <%= pascalName %> } from '@ionic/vue'; | ||
import { defineComponent } from 'vue'; | ||
|
||
export default defineComponent({ | ||
components: { | ||
<%= pascalName %>, | ||
}, | ||
}); | ||
</script><% if (css){ %> | ||
|
||
<style scoped> | ||
<%= name %> { | ||
/* styles go here */ | ||
} | ||
</style><% } %> | ||
``` |
Uh oh!
There was an error while loading. Please reload this page.