@monimesl/dot-cli 1.0.0-beta.0 → 1.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -9
- package/dist/cli.js +24 -14
- package/dist/cli.js.map +1 -1
- package/dist/{server-DMnWDdJ6.js → server-BhnO9_Zu.js} +56 -7
- package/dist/server-BhnO9_Zu.js.map +1 -0
- package/dist/templates/showcase/.env +2 -2
- package/dist/templates/showcase/dot.ts +22 -2
- package/dist/templates/showcase/pages/basics/bars/controller.ts +2 -2
- package/dist/templates/showcase/pages/basics/bars/view.dml +2 -1
- package/dist/templates/showcase/pages/basics/bindings/state.ts +2 -2
- package/dist/templates/showcase/pages/basics/bindings/view.dml +2 -2
- package/dist/templates/showcase/pages/basics/colors/controller.ts +1 -1
- package/dist/templates/showcase/pages/basics/concert/view.dml +1 -1
- package/dist/templates/showcase/pages/basics/control-flow/controller.ts +1 -1
- package/dist/templates/showcase/pages/basics/control-flow/view.dml +1 -1
- package/dist/templates/showcase/pages/basics/events/controller.ts +1 -1
- package/dist/templates/showcase/pages/basics/events/view.dml +1 -1
- package/dist/templates/showcase/pages/basics/hooks/controller.ts +2 -1
- package/dist/templates/showcase/pages/basics/hooks/view.dml +2 -2
- package/dist/templates/showcase/pages/basics/navigation/controller.ts +1 -0
- package/dist/templates/showcase/pages/basics/navigation/view.dml +1 -1
- package/dist/templates/showcase/pages/basics/pick-genre/controller.ts +3 -3
- package/dist/templates/showcase/pages/basics/share/view.dml +2 -2
- package/dist/templates/showcase/pages/basics/state/controller.ts +9 -0
- package/dist/templates/showcase/pages/basics/state/state.ts +3 -0
- package/dist/templates/showcase/pages/basics/theme/controller.ts +28 -0
- package/dist/templates/showcase/pages/basics/theme/state.ts +4 -0
- package/dist/templates/showcase/pages/basics/theme/view.dml +50 -0
- package/dist/templates/showcase/pages/components/capture/controller.ts +25 -0
- package/dist/templates/showcase/pages/components/capture/state.ts +7 -0
- package/dist/templates/showcase/pages/components/capture/view.dml +32 -0
- package/dist/templates/showcase/pages/components/carousel/view.dml +2 -2
- package/dist/templates/showcase/pages/components/feedback/controller.ts +2 -1
- package/dist/templates/showcase/pages/components/feedback/state.ts +2 -2
- package/dist/templates/showcase/pages/components/feedback/view.dml +2 -2
- package/dist/templates/showcase/pages/components/forms/controller.ts +2 -2
- package/dist/templates/showcase/pages/components/forms/state.ts +1 -1
- package/dist/templates/showcase/pages/components/forms/view.dml +6 -5
- package/dist/templates/showcase/pages/components/icons/controller.ts +1 -0
- package/dist/templates/showcase/pages/components/icons/state.ts +1 -1
- package/dist/templates/showcase/pages/components/images/controller.ts +1 -1
- package/dist/templates/showcase/pages/components/images/state.ts +1 -1
- package/dist/templates/showcase/pages/components/images/view.dml +4 -4
- package/dist/templates/showcase/pages/components/layout/controller.ts +5 -1
- package/dist/templates/showcase/pages/components/layout/state.ts +2 -0
- package/dist/templates/showcase/pages/components/layout/view.dml +44 -6
- package/dist/templates/showcase/pages/components/lists/view.dml +12 -7
- package/dist/templates/showcase/pages/components/money/controller.ts +1 -1
- package/dist/templates/showcase/pages/components/money/view.dml +2 -2
- package/dist/templates/showcase/pages/components/pinned/controller.ts +10 -0
- package/dist/templates/showcase/pages/components/pinned/state.ts +25 -0
- package/dist/templates/showcase/pages/components/pinned/view.dml +42 -0
- package/dist/templates/showcase/pages/components/reading/state.ts +2 -2
- package/dist/templates/showcase/pages/components/sheets/controller.ts +1 -1
- package/dist/templates/showcase/pages/components/sheets/view.dml +1 -1
- package/dist/templates/showcase/pages/components/styles/view.dml +39 -4
- package/dist/templates/showcase/pages/components/tabs/state.ts +2 -2
- package/dist/templates/showcase/pages/components/tabs/view.dml +6 -5
- package/dist/templates/showcase/pages/components/text/view.dml +4 -4
- package/dist/templates/showcase/pages/dash/account/controller.ts +3 -0
- package/dist/templates/showcase/pages/dash/account/view.dml +2 -2
- package/dist/templates/showcase/pages/dash/cache/controller.ts +45 -16
- package/dist/templates/showcase/pages/dash/cache/state.ts +1 -0
- package/dist/templates/showcase/pages/dash/cache/view.dml +4 -0
- package/dist/templates/showcase/pages/dash/calls/controller.ts +3 -2
- package/dist/templates/showcase/pages/dash/contacts/controller.ts +1 -0
- package/dist/templates/showcase/pages/dash/crypto/controller.ts +2 -0
- package/dist/templates/showcase/pages/dash/crypto/view.dml +1 -1
- package/dist/templates/showcase/pages/dash/files/controller.ts +67 -32
- package/dist/templates/showcase/pages/dash/files/state.ts +1 -0
- package/dist/templates/showcase/pages/dash/files/view.dml +5 -1
- package/dist/templates/showcase/pages/dash/media/controller.ts +7 -1
- package/dist/templates/showcase/pages/dash/media/state.ts +2 -0
- package/dist/templates/showcase/pages/dash/network/controller.ts +5 -1
- package/dist/templates/showcase/pages/dash/network/view.dml +1 -1
- package/dist/templates/showcase/pages/dash/payments/cases.ts +40 -22
- package/dist/templates/showcase/pages/dash/payments/controller.ts +27 -3
- package/dist/templates/showcase/pages/dash/payments/state.ts +2 -0
- package/dist/templates/showcase/pages/dash/payments/view.dml +3 -1
- package/dist/templates/showcase/pages/dash/reminders/controller.ts +73 -0
- package/dist/templates/showcase/pages/dash/reminders/state.ts +6 -0
- package/dist/templates/showcase/pages/dash/reminders/view.dml +34 -0
- package/dist/templates/showcase/pages/dash/secrets/controller.ts +37 -14
- package/dist/templates/showcase/pages/dash/secrets/state.ts +1 -0
- package/dist/templates/showcase/pages/dash/secrets/view.dml +4 -0
- package/dist/templates/showcase/pages/dash/system/controller.ts +5 -0
- package/dist/templates/showcase/pages/dash/system/view.dml +4 -4
- package/dist/templates/showcase/pages/dash/ui/controller.ts +6 -1
- package/dist/templates/showcase/pages/index/controller.ts +1 -0
- package/dist/templates/showcase/pages/index/state.ts +30 -6
- package/dist/templates/showcase/statics/icons/ticket-stub.svg +1 -0
- package/dist/templates/starter/.env +2 -2
- package/dist/templates/starter/dot.ts +1 -0
- package/dist/templates/starter/pages/index/controller.ts +2 -0
- package/dist/templates/starter/pages/index/state.ts +2 -0
- package/dist/templates/starter/pages/index/view.dml +2 -1
- package/package.json +6 -6
- package/dist/server-DMnWDdJ6.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { errorMessage } from '@monimesl/dot-runtime';
|
|
|
2
2
|
|
|
3
3
|
import state from './state';
|
|
4
4
|
|
|
5
|
-
// AUDACITY's id in Apple's catalog
|
|
5
|
+
// AUDACITY's id in Apple's catalog. Its cover's address can change, so the page looks it up.
|
|
6
6
|
const AUDACITY = 6811765244;
|
|
7
7
|
|
|
8
8
|
interface Lookup {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
size: 64,
|
|
3
3
|
loaded: '',
|
|
4
|
-
//
|
|
4
|
+
// Kept in state, not written in the view, so the build doesn't check that the file exists.
|
|
5
5
|
missing: 'statics/missing.png',
|
|
6
6
|
failure: '',
|
|
7
7
|
// The cover of Drizilik's album AUDACITY, which the page asks Apple's catalog for.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
<View gap="small">
|
|
16
16
|
<Text variant="subtitle">From the web</Text>
|
|
17
|
-
<Text variant="caption" tone="muted">The cover of Drizilik's album AUDACITY. With aspect="1:1" and no width, it fills the card.</Text>
|
|
17
|
+
<Text variant="caption" tone="muted">The cover of Drizilik's album AUDACITY. A web picture loads only from a host in dot.json's network.hosts. With aspect="1:1" and no width, it fills the card.</Text>
|
|
18
18
|
<View variant="card" gap="small">
|
|
19
19
|
<If condition="{{ cover }}">
|
|
20
20
|
<Image src="{{ cover }}" alt="The cover of AUDACITY, by Drizilik" aspect="1:1" />
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
<View gap="small">
|
|
34
34
|
<Text variant="subtitle">shape and fit</Text>
|
|
35
|
-
<Text variant="caption" tone="muted">
|
|
35
|
+
<Text variant="caption" tone="muted">shape is rounded, square or circle. fit="cover", the default, fills the box and crops. fit="contain" shows the whole picture.</Text>
|
|
36
36
|
<View variant="card" direction="row" align="center" gap="large">
|
|
37
37
|
<Image src="statics/logo.png" alt="Rounded" width="56" height="56" shape="rounded" />
|
|
38
38
|
<Image src="statics/logo.png" alt="Square" width="56" height="56" shape="square" />
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
|
|
45
45
|
<View gap="small">
|
|
46
46
|
<Text variant="subtitle">onLoad</Text>
|
|
47
|
-
<Text variant="caption" tone="muted">
|
|
47
|
+
<Text variant="caption" tone="muted">Comes once the picture loads, with its own size in event.detail.width and height. The size on screen comes from state here.</Text>
|
|
48
48
|
<View variant="card" gap="small">
|
|
49
49
|
<Image src="statics/logo.png" alt="Logo" width="{{ size }}" height="{{ size }}" onLoad="logoLoaded" />
|
|
50
50
|
<Text>{{ size }} × {{ size }} on screen, {{ loaded }} in the file</Text>
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<View gap="small">
|
|
59
59
|
<Text variant="subtitle">onError</Text>
|
|
60
|
-
<Text variant="caption" tone="muted">
|
|
60
|
+
<Text variant="caption" tone="muted">Comes when a picture fails to load. event.detail.message says which one.</Text>
|
|
61
61
|
<View variant="card">
|
|
62
62
|
<If condition="{{ failure }}">
|
|
63
63
|
<Text>{{ failure }}</Text>
|
|
@@ -14,7 +14,8 @@ export default definePage({
|
|
|
14
14
|
initialState: state,
|
|
15
15
|
configs: { navigationBar: { title: 'Layout' } },
|
|
16
16
|
hooks: {
|
|
17
|
-
// The shelf's covers come from Apple's catalog.
|
|
17
|
+
// The shelf's covers come from Apple's catalog. Dash sends requests only to the hosts in
|
|
18
|
+
// dot.json's network.hosts. The Network page shows more.
|
|
18
19
|
async onLoad() {
|
|
19
20
|
const ids = this.state.releases.map((release) => release.id).join(',');
|
|
20
21
|
try {
|
|
@@ -45,9 +46,12 @@ export default definePage({
|
|
|
45
46
|
nextAlign: (state) => ({ align: after(ALIGNS, state.align) }),
|
|
46
47
|
nextGap: (state) => ({ gap: after(SPACES, state.gap) }),
|
|
47
48
|
toggleWrap: (state) => ({ wrap: !state.wrap }),
|
|
49
|
+
toggleShelf: (state) => ({ shelfHidden: !state.shelfHidden }),
|
|
50
|
+
toggleCard: (state) => ({ cardLocked: !state.cardLocked }),
|
|
48
51
|
openSection: (_state, event: DataEvent<{ name: string }>) => ({
|
|
49
52
|
section: event.data.name,
|
|
50
53
|
}),
|
|
54
|
+
// Scroll's change carries the index of the child at the start, once the row stops.
|
|
51
55
|
showFirst: (_state, event: IndexEvent) => ({ first: event.detail.index }),
|
|
52
56
|
shelfStart: () => ({ first: 0 }),
|
|
53
57
|
shelfEnd: (state) => ({ first: state.releases.length - 1 }),
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">View</Text>
|
|
7
|
-
<Text variant="caption" tone="muted">A View puts its
|
|
7
|
+
<Text variant="caption" tone="muted">A View puts its children in a column, or in a row with direction="row". variant="card" gives it a card's look. Change the one below.</Text>
|
|
8
8
|
<View variant="card" direction="{{ direction }}" justify="{{ justify }}" align="{{ align }}" gap="{{ gap }}" wrap="{{ wrap }}">
|
|
9
9
|
<Button variant="secondary">Palm-wine</Button>
|
|
10
10
|
<Button variant="secondary">Gumbe</Button>
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
|
|
44
44
|
<View gap="small">
|
|
45
45
|
<Text variant="subtitle">grow and onTap</Text>
|
|
46
|
-
<Text variant="caption" tone="muted">grow
|
|
46
|
+
<Text variant="caption" tone="muted">grow makes a View fill the space left over. The song grows and the year doesn't. A View with onTap can be tapped, so tap the song.</Text>
|
|
47
47
|
<View direction="row" gap="small">
|
|
48
48
|
<View variant="card" grow onTap="playSong">
|
|
49
49
|
<Text>{{ playing ? 'Playing Exodus, by Drizilik' : 'Exodus, by Drizilik' }}</Text>
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
|
|
73
73
|
<View gap="small">
|
|
74
74
|
<Text variant="subtitle">Stack</Text>
|
|
75
|
-
<Text variant="caption" tone="muted">A Stack lays its children on top of each other, such as words over a picture.</Text>
|
|
75
|
+
<Text variant="caption" tone="muted">A Stack lays its children on top of each other, the first at the bottom, such as words over a picture.</Text>
|
|
76
76
|
<Stack radius="large" aspect="16:9">
|
|
77
77
|
<View background="gold" />
|
|
78
78
|
<View justify="end" padding="large">
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
|
|
90
90
|
<View gap="small">
|
|
91
91
|
<Text variant="subtitle">Scroll</Text>
|
|
92
|
-
<Text variant="caption" tone="muted">A Scroll moves a row sideways.
|
|
92
|
+
<Text variant="caption" tone="muted">A Scroll moves a row sideways. snap="start" stops it at the start of a release. Once it stops, onChange sends the index of the first release in view. Setting index scrolls there, as the buttons do.</Text>
|
|
93
93
|
<Scroll gap="medium" snap="start" index="{{ first }}" onChange="showFirst">
|
|
94
94
|
<For each="{{ releases }}" item="release" key="id">
|
|
95
95
|
<View gap="small">
|
|
@@ -111,9 +111,47 @@
|
|
|
111
111
|
</View>
|
|
112
112
|
</View>
|
|
113
113
|
|
|
114
|
+
<View gap="small">
|
|
115
|
+
<Text variant="subtitle">Cards in a Scroll</Text>
|
|
116
|
+
<Text variant="caption" tone="muted">A Scroll leaves room above and below for a low shadow, so a card's shadow isn't cut. A high shadow needs more than that, so use low here. paddingStart and paddingEnd give the first and last card room at the sides.</Text>
|
|
117
|
+
<Scroll gap="medium" paddingStart="medium" paddingEnd="medium">
|
|
118
|
+
<For each="{{ releases }}" item="release" key="id">
|
|
119
|
+
<View variant="card" elevation="low" border="none" width="144" gap="none">
|
|
120
|
+
<Text weight="medium" maxLines="1">{{ release.title }}</Text>
|
|
121
|
+
<Text variant="caption" tone="muted">{{ release.year }}</Text>
|
|
122
|
+
</View>
|
|
123
|
+
</For>
|
|
124
|
+
</Scroll>
|
|
125
|
+
</View>
|
|
126
|
+
|
|
127
|
+
<View gap="small">
|
|
128
|
+
<Text variant="subtitle">hidden</Text>
|
|
129
|
+
<Text variant="caption" tone="muted">hidden takes a View off the screen and keeps what's inside alive. Scroll this row, type a name, then hide and show them: both stay as you left them. An If removes what's inside, so use it when the content should start afresh, or isn't needed until it shows.</Text>
|
|
130
|
+
<View hidden="{{ shelfHidden }}" variant="card" gap="medium">
|
|
131
|
+
<Scroll gap="small">
|
|
132
|
+
<For each="{{ releases }}" item="release" key="id">
|
|
133
|
+
<Chip label="{{ release.title }}" />
|
|
134
|
+
</For>
|
|
135
|
+
</Scroll>
|
|
136
|
+
<Input label="Your name" placeholder="Mariama Kamara" />
|
|
137
|
+
</View>
|
|
138
|
+
<Button variant="secondary" onClick="toggleShelf">{{ shelfHidden ? 'Show' : 'Hide' }}</Button>
|
|
139
|
+
</View>
|
|
140
|
+
|
|
141
|
+
<View gap="small">
|
|
142
|
+
<Text variant="subtitle">disabled</Text>
|
|
143
|
+
<Text variant="caption" tone="muted">disabled dims a View, and nothing in it takes a tap, such as a form that's waiting on something else. Screen readers skip it, so say why outside it, as here.</Text>
|
|
144
|
+
<Text>The waiting list opens on Friday.</Text>
|
|
145
|
+
<View disabled="{{ cardLocked }}" variant="card" gap="medium">
|
|
146
|
+
<Input label="Your phone number" placeholder="+23276123456" />
|
|
147
|
+
<Button>Join the waiting list</Button>
|
|
148
|
+
</View>
|
|
149
|
+
<Button variant="secondary" onClick="toggleCard">{{ cardLocked ? 'Open it' : 'Lock it' }}</Button>
|
|
150
|
+
</View>
|
|
151
|
+
|
|
114
152
|
<View gap="small">
|
|
115
153
|
<Text variant="subtitle">Grid</Text>
|
|
116
|
-
<Text variant="caption" tone="muted">A Grid keeps its columns the same width. A GridItem shows an icon or a picture, with a label.</Text>
|
|
154
|
+
<Text variant="caption" tone="muted">A Grid keeps its columns the same width, 4 unless columns says. A GridItem shows an icon or a picture, with a label and an optional badge. A disabled GridItem can't be tapped.</Text>
|
|
117
155
|
<View variant="card" gap="medium">
|
|
118
156
|
<Grid columns="4" gap="small">
|
|
119
157
|
<GridItem icon="microphone" label="Artists" data-name="Artists" onTap="openSection" />
|
|
@@ -122,7 +160,7 @@
|
|
|
122
160
|
<GridItem icon="star" label="Charts" badge="New" data-name="Charts" onTap="openSection" />
|
|
123
161
|
<GridItem icon="calendar" label="Shows" data-name="Shows" onTap="openSection" />
|
|
124
162
|
<GridItem icon="ticket" label="Tickets" data-name="Tickets" onTap="openSection" />
|
|
125
|
-
<GridItem icon="headphones" label="Library"
|
|
163
|
+
<GridItem icon="headphones" label="Library" disabled onTap="openSection" />
|
|
126
164
|
<GridItem image="statics/logo.png" label="Salone" data-name="Salone" onTap="openSection" />
|
|
127
165
|
</Grid>
|
|
128
166
|
<If condition="{{ section }}">
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<View>
|
|
2
2
|
<Text variant="title">Lists</Text>
|
|
3
|
-
<Text>A List shows rows in a card. A ListItem can show an icon or a picture, a subtitle, and a value or a badge at its end. A row
|
|
3
|
+
<Text>A List shows rows in a card. A ListItem can show an icon or a picture, a subtitle, and a value or a badge at its end. A row with onTap shows an arrow.</Text>
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">List and ListItem</Text>
|
|
7
|
-
<Text variant="caption" tone="muted">
|
|
7
|
+
<Text variant="caption" tone="muted">Tap an artist. The row's data-id tells the page which one. A disabled row dims and can't be tapped.</Text>
|
|
8
8
|
<List>
|
|
9
9
|
<For each="{{ artists }}" item="artist" key="id">
|
|
10
10
|
<ListItem icon="microphone" title="{{ artist.name }}" subtitle="{{ artist.song }}" value="{{ artist.genre }}" data-id="{{ artist.id }}" onTap="choose" />
|
|
11
11
|
</For>
|
|
12
|
+
<ListItem icon="lock" title="Members only" subtitle="Coming soon" disabled onTap="choose" />
|
|
12
13
|
</List>
|
|
13
14
|
<If condition="{{ chosen }}">
|
|
14
15
|
<Text>You chose {{ chosen }}</Text>
|
|
@@ -16,8 +17,8 @@
|
|
|
16
17
|
</View>
|
|
17
18
|
|
|
18
19
|
<View gap="small">
|
|
19
|
-
<Text variant="subtitle">
|
|
20
|
-
<Text variant="caption" tone="muted">
|
|
20
|
+
<Text variant="subtitle">A picture and a badge</Text>
|
|
21
|
+
<Text variant="caption" tone="muted">A ListItem's children show at its end, in place of value. size="md" gives the rows more room and a bigger picture. Lists are size="sm" by default.</Text>
|
|
21
22
|
<List size="md">
|
|
22
23
|
<For each="{{ releases }}" item="release" key="id">
|
|
23
24
|
<ListItem image="statics/logo.png" title="{{ release.title }}" subtitle="{{ release.artist }} · {{ release.year }}">
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
|
|
30
31
|
<View gap="small">
|
|
31
32
|
<Text variant="subtitle">onEndReached</Text>
|
|
32
|
-
<Text variant="caption" tone="muted">Comes
|
|
33
|
+
<Text variant="caption" tone="muted">Comes as the last row nears the screen, so the page can add more. It comes again once there's a new last row. {{ chart.length }} of {{ chartSize }} songs so far.</Text>
|
|
33
34
|
<List onEndReached="showMore">
|
|
34
35
|
<For each="{{ chart }}" item="song" key="id">
|
|
35
36
|
<ListItem title="{{ song.id }}. {{ song.title }}" value="{{ song.plays }}" />
|
|
@@ -52,7 +53,7 @@
|
|
|
52
53
|
|
|
53
54
|
<View gap="small">
|
|
54
55
|
<Text variant="subtitle">Disclosure</Text>
|
|
55
|
-
<Text variant="caption" tone="muted">A row that opens to show more, such as an answer. The person opens and closes it, and open sets how it starts.</Text>
|
|
56
|
+
<Text variant="caption" tone="muted">A row that opens to show more, such as an answer. The person opens and closes it, and open sets how it starts. onToggle sends event.detail.open each time. A disabled one stays as it is.</Text>
|
|
56
57
|
<View variant="card" gap="none">
|
|
57
58
|
<Disclosure title="Can I get a refund?" subtitle="Tickets and refunds" open>
|
|
58
59
|
<Text>Yes, until the Friday before the show. After that, you can give your ticket to someone else.</Text>
|
|
@@ -62,6 +63,10 @@
|
|
|
62
63
|
<Text>At 6 pm. The music starts at 7.</Text>
|
|
63
64
|
</Disclosure>
|
|
64
65
|
<Divider />
|
|
66
|
+
<Disclosure title="Backstage passes" subtitle="Coming soon" disabled>
|
|
67
|
+
<Text>Passes go on sale next month.</Text>
|
|
68
|
+
</Disclosure>
|
|
69
|
+
<Divider />
|
|
65
70
|
<Disclosure title="Is there parking?">
|
|
66
71
|
<Text>Yes, at the Lumley junction car park, a short walk away.</Text>
|
|
67
72
|
</Disclosure>
|
|
@@ -70,7 +75,7 @@
|
|
|
70
75
|
|
|
71
76
|
<View gap="small">
|
|
72
77
|
<Text variant="subtitle">EmptyState</Text>
|
|
73
|
-
<Text variant="caption" tone="muted">Shows
|
|
78
|
+
<Text variant="caption" tone="muted">Shows where a list has nothing yet. Its children, such as a button, show under its text.</Text>
|
|
74
79
|
<View variant="card">
|
|
75
80
|
<If condition="{{ saved.length > 0 }}">
|
|
76
81
|
<For each="{{ saved }}" item="title" key="*this">
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">AmountInput</Text>
|
|
7
|
-
<Text variant="caption" tone="muted">Formats the amount as you type.
|
|
7
|
+
<Text variant="caption" tone="muted">Formats the amount as you type. onChange sends a number in cents, the minor unit, so 150 is SLE 1.50. An empty field sends null.</Text>
|
|
8
8
|
<AmountInput label="Tip for the band" placeholder="0.00" value="{{ amount }}" disabled="{{ locked }}" onChange="setAmount" hint="The QR code below asks for it" />
|
|
9
9
|
<Switch label="Lock the tip" checked="{{ locked }}" onChange="setLocked" />
|
|
10
10
|
</View>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
<View gap="small">
|
|
33
33
|
<Text variant="subtitle">CodeInput</Text>
|
|
34
|
-
<Text variant="caption" tone="muted">A one-time code, one box per digit. Type it, paste it, or let the phone fill it from an SMS. onComplete comes when the last box fills.</Text>
|
|
34
|
+
<Text variant="caption" tone="muted">A one-time code, one box per digit. Type it, paste it, or let the phone fill it from an SMS. onComplete comes when the last box fills, with the code in event.detail.value.</Text>
|
|
35
35
|
<If condition="{{ verified }}">
|
|
36
36
|
<Notice tone="success" title="Code accepted">Your two tickets are confirmed.</Notice>
|
|
37
37
|
<Button variant="secondary" onClick="startAgain">Start again</Button>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import state from './state';
|
|
2
|
+
|
|
3
|
+
export default definePage({
|
|
4
|
+
initialState: state,
|
|
5
|
+
// This page has its own tabs at the bottom, so it hides Dash's. Dash brings them back on leaving.
|
|
6
|
+
configs: { navigationBar: { title: 'Pinned bars' }, tabBar: { hidden: true } },
|
|
7
|
+
mutations: {
|
|
8
|
+
chooseTab: (_state, event: ValueEvent) => ({ tab: event.detail.value }),
|
|
9
|
+
},
|
|
10
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
tab: 'shows',
|
|
3
|
+
shows: [
|
|
4
|
+
{ id: 'lumley', title: 'Lumley Beach Sundown', place: 'Lumley Beach, Freetown', day: 'Fri' },
|
|
5
|
+
{ id: 'aberdeen', title: 'Aberdeen Live', place: 'Aberdeen, Freetown', day: 'Fri' },
|
|
6
|
+
{ id: 'wilberforce', title: 'Hilltop Sessions', place: 'Wilberforce, Freetown', day: 'Sat' },
|
|
7
|
+
{ id: 'bo', title: 'Bo Town Jam', place: 'Coronation Field, Bo', day: 'Sat' },
|
|
8
|
+
{ id: 'kenema', title: 'Eastern Beats', place: 'Kenema', day: 'Sat' },
|
|
9
|
+
{ id: 'makeni', title: 'Makeni Nights', place: 'Wusum Stadium, Makeni', day: 'Sun' },
|
|
10
|
+
{ id: 'tokeh', title: 'Tokeh Sands', place: 'Tokeh Beach', day: 'Sun' },
|
|
11
|
+
{ id: 'kono', title: 'Koidu Block Party', place: 'Koidu, Kono', day: 'Sun' },
|
|
12
|
+
{ id: 'bonthe', title: 'Bonthe Island Drums', place: 'Bonthe, Sherbro Island', day: 'Sun' },
|
|
13
|
+
{ id: 'monrovia', title: 'Mano River Night', place: 'Sinkor, Monrovia', day: 'Mon' },
|
|
14
|
+
],
|
|
15
|
+
saved: [
|
|
16
|
+
{ id: 'lumley', title: 'Lumley Beach Sundown', place: 'Lumley Beach, Freetown' },
|
|
17
|
+
{ id: 'bo', title: 'Bo Town Jam', place: 'Coronation Field, Bo' },
|
|
18
|
+
],
|
|
19
|
+
venues: [
|
|
20
|
+
{ id: 'national', name: 'National Stadium', town: 'Freetown' },
|
|
21
|
+
{ id: 'bintumani', name: 'Bintumani Hotel', town: 'Freetown' },
|
|
22
|
+
{ id: 'coronation', name: 'Coronation Field', town: 'Bo' },
|
|
23
|
+
{ id: 'wusum', name: 'Wusum Stadium', town: 'Makeni' },
|
|
24
|
+
],
|
|
25
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<View>
|
|
2
|
+
<Pinned edge="top" background="surface" border="subtle" paddingTop="medium" paddingBottom="medium">
|
|
3
|
+
<Text weight="bold">Salone gig guide</Text>
|
|
4
|
+
</Pinned>
|
|
5
|
+
|
|
6
|
+
<Text variant="title">Pinned bars</Text>
|
|
7
|
+
<Text>A Pinned keeps its children on an edge of the screen while the page scrolls. Scroll this page: the title above and the tabs below stay put. Put edge="top" first in the page's View, and edge="bottom" last. At the bottom, use a Pinned or a Footer, not both.</Text>
|
|
8
|
+
<Text variant="caption" tone="muted">The bar reaches past the page's padding to both sides of the screen, and its children line up with the page. background fills the bar, and border draws a line on the side facing the page.</Text>
|
|
9
|
+
<Text variant="caption" tone="muted">Tabs in a Pinned make the page's own navigation. variant="bar" shares the width equally, with each Tab's icon over its label and its badge on the icon. The page shows the content for the chosen tab, so the state of each tab stays. This page sets tabBar: { hidden: true } in its configs, so Dash's tabs don't show under its own.</Text>
|
|
10
|
+
|
|
11
|
+
<If condition="{{ tab === 'shows' }}">
|
|
12
|
+
<List>
|
|
13
|
+
<For each="{{ shows }}" item="show" key="id">
|
|
14
|
+
<ListItem icon="music" title="{{ show.title }}" subtitle="{{ show.place }}">
|
|
15
|
+
<Badge>{{ show.day }}</Badge>
|
|
16
|
+
</ListItem>
|
|
17
|
+
</For>
|
|
18
|
+
</List>
|
|
19
|
+
</If>
|
|
20
|
+
<ElseIf condition="{{ tab === 'saved' }}">
|
|
21
|
+
<List>
|
|
22
|
+
<For each="{{ saved }}" item="show" key="id">
|
|
23
|
+
<ListItem icon="heart" title="{{ show.title }}" subtitle="{{ show.place }}" />
|
|
24
|
+
</For>
|
|
25
|
+
</List>
|
|
26
|
+
</ElseIf>
|
|
27
|
+
<Else>
|
|
28
|
+
<List>
|
|
29
|
+
<For each="{{ venues }}" item="venue" key="id">
|
|
30
|
+
<ListItem icon="home" title="{{ venue.name }}" subtitle="{{ venue.town }}" />
|
|
31
|
+
</For>
|
|
32
|
+
</List>
|
|
33
|
+
</Else>
|
|
34
|
+
|
|
35
|
+
<Pinned edge="bottom" background="surface" border="subtle" paddingBottom="medium">
|
|
36
|
+
<Tabs variant="bar" value="{{ tab }}" onChange="chooseTab">
|
|
37
|
+
<Tab value="shows" label="Shows" icon="music" />
|
|
38
|
+
<Tab value="saved" label="Saved" icon="heart" badge="{{ saved.length }}" />
|
|
39
|
+
<Tab value="venues" label="Venues" icon="location" />
|
|
40
|
+
</Tabs>
|
|
41
|
+
</Pinned>
|
|
42
|
+
</View>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
1
|
+
// An article's body in Markdown, as a news app would get it from its server. It's written as
|
|
2
|
+
// joined lines so that the built code keeps it on one line.
|
|
3
3
|
const body = [
|
|
4
4
|
"## What's on sale",
|
|
5
5
|
'',
|
|
@@ -7,7 +7,7 @@ export default definePage({
|
|
|
7
7
|
openRelease: (state, event: DataEvent<{ id: string }>) => ({
|
|
8
8
|
selected: state.releases.find((release) => release.id === event.data.id) ?? null,
|
|
9
9
|
}),
|
|
10
|
-
// A
|
|
10
|
+
// A Sheet doesn't close itself. The page sets open back to false.
|
|
11
11
|
closeRelease: () => ({ selected: null }),
|
|
12
12
|
openRating: () => ({ rating: true }),
|
|
13
13
|
closeRating: () => ({ rating: false }),
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
<View gap="small">
|
|
16
16
|
<Text variant="subtitle">A sheet with a form</Text>
|
|
17
|
-
<Text variant="caption" tone="muted">Any component can go in a sheet. This one has no close icon, and more room
|
|
17
|
+
<Text variant="caption" tone="muted">Any component can go in a sheet. This one has no close icon, and padding="large" gives it more room.</Text>
|
|
18
18
|
<View variant="card" direction="row" align="center" gap="small">
|
|
19
19
|
<View grow>
|
|
20
20
|
<Text>{{ saved ? 'You gave ' + saved + ' stars' : 'Not rated yet' }}</Text>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<View>
|
|
2
2
|
<Text variant="title">Styles</Text>
|
|
3
|
-
<Text>A View
|
|
3
|
+
<Text>A View can set its colour, outline, corners and size. Its colours come from the theme, so a dot looks right in light and dark.</Text>
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">background</Text>
|
|
7
|
-
<Text variant="caption" tone="muted">
|
|
7
|
+
<Text variant="caption" tone="muted">On a primary background, give text tone="onPrimary" so it reads.</Text>
|
|
8
8
|
<View background="primary" radius="large" padding="large" gap="small">
|
|
9
9
|
<Text variant="caption" tone="onPrimary">Your balance</Text>
|
|
10
10
|
<Text variant="display" tone="onPrimary" numeric>{{ balance }}</Text>
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
</View>
|
|
40
40
|
|
|
41
41
|
<View gap="small">
|
|
42
|
-
<Text variant="subtitle">
|
|
43
|
-
<Text variant="caption" tone="muted">The theme in dot.ts can
|
|
42
|
+
<Text variant="subtitle">The dot's own colours</Text>
|
|
43
|
+
<Text variant="caption" tone="muted">The theme in dot.ts can name its own colours, such as gold and ink here. Use them as a background or a text tone. The Theme page has the rest of the theme.</Text>
|
|
44
44
|
<View direction="row" gap="small" align="center">
|
|
45
45
|
<View background="gold" radius="full" paddingTop="small" paddingBottom="small" paddingStart="medium" paddingEnd="medium">
|
|
46
46
|
<Text weight="medium" tone="ink">Gold member</Text>
|
|
@@ -63,6 +63,41 @@
|
|
|
63
63
|
</View>
|
|
64
64
|
</View>
|
|
65
65
|
|
|
66
|
+
<View gap="small">
|
|
67
|
+
<Text variant="subtitle">elevation</Text>
|
|
68
|
+
<Text variant="caption" tone="muted">A shadow lifts a box off the page. low suits a card, and high something that floats over others.</Text>
|
|
69
|
+
<View direction="row" gap="large" padding="medium">
|
|
70
|
+
<View grow variant="card" elevation="low" border="none" align="center">
|
|
71
|
+
<Text>low</Text>
|
|
72
|
+
</View>
|
|
73
|
+
<View grow variant="card" elevation="high" border="none" align="center">
|
|
74
|
+
<Text>high</Text>
|
|
75
|
+
</View>
|
|
76
|
+
</View>
|
|
77
|
+
</View>
|
|
78
|
+
|
|
79
|
+
<View gap="small">
|
|
80
|
+
<Text variant="subtitle">Buttons</Text>
|
|
81
|
+
<Text variant="caption" tone="muted">variant is primary, secondary, outline or ghost. tone colours a button, such as danger for one that deletes. size is small, medium or large.</Text>
|
|
82
|
+
<View direction="row" gap="small" wrap>
|
|
83
|
+
<Button>Primary</Button>
|
|
84
|
+
<Button variant="secondary">Secondary</Button>
|
|
85
|
+
<Button variant="outline">Outline</Button>
|
|
86
|
+
<Button variant="ghost">Ghost</Button>
|
|
87
|
+
</View>
|
|
88
|
+
<View direction="row" gap="small" wrap>
|
|
89
|
+
<Button tone="danger">Delete</Button>
|
|
90
|
+
<Button variant="secondary" tone="success">Mark paid</Button>
|
|
91
|
+
<Button variant="outline" tone="warning">Remind me</Button>
|
|
92
|
+
<Button variant="ghost" tone="danger">Cancel</Button>
|
|
93
|
+
</View>
|
|
94
|
+
<View direction="row" gap="small" align="center" wrap>
|
|
95
|
+
<Button size="small" variant="secondary">Small</Button>
|
|
96
|
+
<Button size="medium" variant="secondary">Medium</Button>
|
|
97
|
+
<Button size="large" variant="secondary">Large</Button>
|
|
98
|
+
</View>
|
|
99
|
+
</View>
|
|
100
|
+
|
|
66
101
|
<View gap="small">
|
|
67
102
|
<Text variant="subtitle">width and height</Text>
|
|
68
103
|
<Text variant="caption" tone="muted">In points, or fill for all the room there is.</Text>
|
|
@@ -40,7 +40,6 @@ const releases: Release[] = [
|
|
|
40
40
|
release('nack', 'Nack', 'The Therapist', 2022, 'song', 'Afropop'),
|
|
41
41
|
release('hannah', 'Hannah', 'Donii Major', 2021, 'song', 'R&B'),
|
|
42
42
|
release('shukubly', 'Shukubly', 'Drizilik', 2018, 'album', 'Kriofusion'),
|
|
43
|
-
release('en-yay-sah', 'En Yay Sah', 'Janka Nabay and the Bubu Gang', 2012, 'album', 'Bubu'),
|
|
44
43
|
release('red-album', 'Red Album', 'LAJ', 2013, 'album', 'Hip hop'),
|
|
45
44
|
release(
|
|
46
45
|
'ghetto-struggle',
|
|
@@ -50,6 +49,7 @@ const releases: Release[] = [
|
|
|
50
49
|
'song',
|
|
51
50
|
'Hip hop',
|
|
52
51
|
),
|
|
52
|
+
release('en-yay-sah', 'En Yay Sah', 'Janka Nabay and the Bubu Gang', 2012, 'album', 'Bubu'),
|
|
53
53
|
release('borbor-bele', 'Borbor Bele', 'Emmerson', 2004, 'album', 'Afropop'),
|
|
54
54
|
release('corruption', 'Corruption', 'Daddy Saj', 2003, 'album', 'Hip hop'),
|
|
55
55
|
release('cry-africa', 'Cry Africa', 'Vicky Fornah', 1999, 'song', 'Gospel'),
|
|
@@ -60,7 +60,7 @@ const releases: Release[] = [
|
|
|
60
60
|
|
|
61
61
|
export default {
|
|
62
62
|
releases,
|
|
63
|
-
// The releases the tab and the
|
|
63
|
+
// The releases left after the tab, the genre and the search filter them.
|
|
64
64
|
shown: releases,
|
|
65
65
|
tab: 'all',
|
|
66
66
|
albums: releases.filter((item) => item.kind === 'album').length,
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<View>
|
|
2
2
|
<Text variant="title">Tabs and chips</Text>
|
|
3
|
-
<Text>Tabs change what the page shows. Chips and a search narrow it down. Try Songs with Palm-wine
|
|
3
|
+
<Text>Tabs change what the page shows. Chips and a search narrow it down. Try Songs with Palm-wine. Nothing matches, so an EmptyState shows.</Text>
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">Tabs and Chip</Text>
|
|
7
|
-
<Text variant="caption" tone="muted">
|
|
7
|
+
<Text variant="caption" tone="muted">Tabs sends onChange with the chosen tab's value in event.detail.value. A Tab's icon goes before its label, and its badge shows a count. A Chip is selected only when the page says so. An Input with type="search" and clearable makes a search box.</Text>
|
|
8
8
|
<Tabs variant="underline" value="{{ tab }}" onChange="chooseTab">
|
|
9
9
|
<Tab value="all" label="All" />
|
|
10
|
-
<Tab value="album" label="Albums" badge="{{ albums }}" />
|
|
11
|
-
<Tab value="song" label="Songs" badge="{{ songs }}" />
|
|
10
|
+
<Tab value="album" label="Albums" icon="playlist" badge="{{ albums }}" />
|
|
11
|
+
<Tab value="song" label="Songs" icon="music" badge="{{ songs }}" />
|
|
12
12
|
</Tabs>
|
|
13
13
|
<Input type="search" placeholder="Search by title" clearable value="{{ query }}" onChange="search" />
|
|
14
14
|
<View direction="row" gap="small" wrap>
|
|
@@ -43,10 +43,11 @@
|
|
|
43
43
|
|
|
44
44
|
<View gap="small">
|
|
45
45
|
<Text variant="subtitle">variant="segmented"</Text>
|
|
46
|
-
<Text variant="caption" tone="muted">For a few short choices. Shows at home and in the Mano River region.</Text>
|
|
46
|
+
<Text variant="caption" tone="muted">For a few short choices. Shows at home and in the Mano River region. A disabled Tab can't be chosen. For a page's own navigation, variant="bar" is on the Pinned bars page.</Text>
|
|
47
47
|
<Tabs variant="segmented" value="{{ where }}" onChange="chooseWhere">
|
|
48
48
|
<Tab value="home" label="Sierra Leone" />
|
|
49
49
|
<Tab value="abroad" label="Abroad" />
|
|
50
|
+
<Tab value="online" label="Online" disabled />
|
|
50
51
|
</Tabs>
|
|
51
52
|
<List>
|
|
52
53
|
<For each="{{ where === 'home' ? home : abroad }}" item="show" key="id">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<View>
|
|
2
2
|
<Text variant="title">Text and links</Text>
|
|
3
|
-
<Text>Text shows words. Its variant sets the size, and
|
|
3
|
+
<Text>Text shows words. Its variant sets the size and weight, and its tone sets the colour from the theme.</Text>
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">variant</Text>
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
|
|
66
66
|
<View gap="small">
|
|
67
67
|
<Text variant="subtitle">leading and selectable</Text>
|
|
68
|
-
<Text variant="caption" tone="muted">leading moves the lines closer or further apart. selectable lets the person copy the text
|
|
68
|
+
<Text variant="caption" tone="muted">leading moves the lines closer or further apart. selectable lets the person select and copy the text. Hold your finger on the last one.</Text>
|
|
69
69
|
<View variant="card" gap="medium">
|
|
70
70
|
<Text leading="tight">Tight lines. Palm-wine music grew in the bars of Freetown, played on guitar and sung in Krio.</Text>
|
|
71
71
|
<Text leading="normal">Normal lines. Palm-wine music grew in the bars of Freetown, played on guitar and sung in Krio.</Text>
|
|
@@ -82,12 +82,12 @@
|
|
|
82
82
|
|
|
83
83
|
<View gap="small">
|
|
84
84
|
<Text variant="subtitle">Link</Text>
|
|
85
|
-
<Text variant="caption" tone="muted">With href, a
|
|
85
|
+
<Text variant="caption" tone="muted">With an https href, a Link opens the web page in the phone's browser. Without one, onTap runs a handler. A disabled Link does neither.</Text>
|
|
86
86
|
<View variant="card" gap="small">
|
|
87
87
|
<Text>Read about <Link href="https://en.wikipedia.org/wiki/Music_of_Sierra_Leone">the music of Sierra Leone</Link>.</Text>
|
|
88
88
|
<View direction="row" gap="medium">
|
|
89
89
|
<Link onTap="like">Like the song</Link>
|
|
90
|
-
<Link tone="danger" onTap="unlike">Take it back</Link>
|
|
90
|
+
<Link tone="danger" onTap="unlike" disabled="{{ likes === 0 }}">Take it back</Link>
|
|
91
91
|
</View>
|
|
92
92
|
<Text tone="muted">{{ likes }} {{ likes === 1 ? 'like' : 'likes' }}</Text>
|
|
93
93
|
</View>
|
|
@@ -9,6 +9,8 @@ export default definePage({
|
|
|
9
9
|
setNonce: (_state, event: ValueEvent) => ({ nonce: event.detail.value }),
|
|
10
10
|
},
|
|
11
11
|
actions: {
|
|
12
|
+
// A nonce longer than 128 characters rejects with 'invalid'. If no one is signed in to Dash, or
|
|
13
|
+
// Dash can't reach Monime, it rejects with 'failed'.
|
|
12
14
|
async signIn(state) {
|
|
13
15
|
try {
|
|
14
16
|
const { fullName, alias, accountIdToken } = await this.dash.account.signIn({
|
|
@@ -20,6 +22,7 @@ export default definePage({
|
|
|
20
22
|
this.setState({ note: errorMessage(error) });
|
|
21
23
|
}
|
|
22
24
|
},
|
|
25
|
+
// Rejects with 'unsupported' until Dash has OpenID Connect.
|
|
23
26
|
async signInWithOidc() {
|
|
24
27
|
try {
|
|
25
28
|
const { id } = await this.dash.account.signIn({ mode: 'oidc', scopes: ['profile'] });
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<View gap="small">
|
|
6
6
|
<Text variant="subtitle">signIn</Text>
|
|
7
|
-
<Text variant="caption" tone="muted">With mode "simple", Dash says who the person is: their full name, the phone number or email address they use Dash with
|
|
7
|
+
<Text variant="caption" tone="muted">With mode "simple", Dash says who the person is: their full name, and the phone number or email address they use Dash with. It also gives a token that names them in this dot. Monime makes it from the dot's id, the person and the nonce, so the same nonce gives the same token on any phone. The token names the person, but proves nothing to the dot's server.</Text>
|
|
8
8
|
<View variant="card" gap="medium">
|
|
9
9
|
<Input label="Nonce" value="{{ nonce }}" onChange="setNonce" />
|
|
10
10
|
<Button onClick="signIn">Sign in with Dash</Button>
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
<View gap="small">
|
|
22
22
|
<Text variant="subtitle">signIn with OpenID Connect</Text>
|
|
23
|
-
<Text variant="caption" tone="muted">With mode "oidc", Dash will give an ID token the dot's server checks with Monime's keys, and only the details the person agrees to share. It isn't ready yet, so
|
|
23
|
+
<Text variant="caption" tone="muted">With mode "oidc", Dash will give an ID token the dot's server checks with Monime's keys, and only the details the person agrees to share. It isn't ready yet, so the call fails with unsupported.</Text>
|
|
24
24
|
<Button variant="secondary" onClick="signInWithOidc">Sign in with OpenID Connect</Button>
|
|
25
25
|
<If condition="{{ oidcNote }}">
|
|
26
26
|
<Notice tone="info">{{ oidcNote }}</Notice>
|