-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathbuttonMenu.stories.svelte
152 lines (139 loc) · 4.33 KB
/
buttonMenu.stories.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<script lang="ts">
import { Meta, Story, Template } from '@storybook/addon-svelte-csf'
import ButtonMenu from './buttonMenu.svelte'
import Icon from '../icon/icon.svelte'
import SlotInfo from '../../storyHelpers/SlotInfo.svelte'
import Slot from '../../storyHelpers/Slot.svelte'
import Toggle from '../toggle/toggle.svelte'
export let toggleIsChecked = false
const handleAction = () => console.log('action')
</script>
<Meta
title="Components/ButtonMenu"
component={ButtonMenu}
argTypes={{
'--leo-menu-control-min-width': {
control: 'text',
description: 'The user provided min width for the menu. The menu may be wider than this value depending on its contents'
},
'--leo-menu-target-width': {
description: '(readonly): Computed width of menu control',
},
'--leo-menu-max-height': {
description: 'user controlled max height',
control: 'text'
}
}}
/>
<Template let:args>
<div class="container">
<ButtonMenu>
<span slot="anchor-content">Click Me!</span>
<!-- svelte-ignore a11y-click-events-have-key-events leo-menu-item peovides key events -->
<leo-menu-item on:click={handleAction}> Copy </leo-menu-item>
<leo-menu-item> Share </leo-menu-item>
<div class="section">Section</div>
<leo-menu-item>
<div class="item">
<div>New Chat</div>
<Icon name="plus-add" />
</div>
</leo-menu-item>
<div class="custom-item">
<div>Suggested questions</div>
<Toggle bind:checked={toggleIsChecked} size="small" />
</div>
<!-- svelte-ignore a11y-click-events-have-key-events -->
<leo-menu-item
class="item"
on:click={(e) => {
handleAction()
toggleIsChecked = !toggleIsChecked
}}
data-is-interactive="true"
>
<div>Suggested questions</div>
<Toggle bind:checked={toggleIsChecked} size="small" />
</leo-menu-item>
</ButtonMenu>
</div>
</Template>
<Story name="Default" />
<!-- TODO(petemill): We should probably only allow leo-menu-item for ButtonMenu, otherwise it gets complicated about event dispatching. Alternatively, we
should cleanup item selection handling in Menu.svelte and have Menu know whether it is in Select mode or not. -->
<Story name="Slots" let:args>
<SlotInfo description="">
<Slot name="default" explanation="The menu items">
<p>
The ButtonMenu provides a default slot for menu items. It accepts
<leo-menu-item> and <leo-option> elements as well as any
other element types.
</p>
<ul>
<li>
Use <leo-menu-item> for menu-style commands and
<leo-option> for select-style selectable choices.
</li>
<li>
Add the data-is-interactive=true attribute if you want the item to not
cause the menu to close when clicked / selected (perhaps its
interactive, like a Toggle and you want the user to see that the
Toggle changed)
</li>
<li>
Use other element types if you want to handle layout and selection
independently (set tabindex to 0 on child interactive elements).
</li>
</ul>
</Slot>
<Slot
name="anchor-content"
explanation="A custom icon inside of anchor button"
>
<ButtonMenu>
<div slot="anchor-content">
<Icon name="more-horizontal" />
</div>
<leo-menu-item> Copy </leo-menu-item>
<leo-menu-item> Share </leo-menu-item>
<leo-menu-item>
<div class="item">
<div>New Chat</div>
<Icon name="plus-add" />
</div>
</leo-menu-item>
</ButtonMenu>
</Slot>
</SlotInfo>
</Story>
<style>
.container {
width: 300px;
}
.item {
--leo-icon-size: 18px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
}
.custom-item {
margin: var(--leo-menu-item-margin);
padding: var(--leo-menu-item-padding);
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
}
.section {
margin: var(--leo-menu-item-margin);
border-top: 1px solid rgba(128, 128, 128, 0.225);
padding-top: 0;
padding-bottom: 0;
font-size: 12px;
color: grey;
}
.section:hover {
color: grey;
}
</style>