@reni-corp/reni-2c-ui 0.3.28 → 0.3.291

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.
Files changed (101) hide show
  1. package/README.md +0 -196
  2. package/dist/components/elements/Alert.vue.d.ts +21 -3
  3. package/dist/components/elements/Alert.vue.d.ts.map +1 -1
  4. package/dist/components/elements/CheckBox.vue.d.ts +42 -2
  5. package/dist/components/elements/CheckBox.vue.d.ts.map +1 -1
  6. package/dist/components/elements/ComboBox.vue.d.ts +153 -0
  7. package/dist/components/elements/ComboBox.vue.d.ts.map +1 -0
  8. package/dist/components/elements/Icon.vue.d.ts.map +1 -1
  9. package/dist/components/elements/PasswordField.vue.d.ts +75 -25
  10. package/dist/components/elements/PasswordField.vue.d.ts.map +1 -1
  11. package/dist/components/elements/Progress.vue.d.ts +45 -0
  12. package/dist/components/elements/Progress.vue.d.ts.map +1 -0
  13. package/dist/components/elements/SelectBox.vue.d.ts +30 -10
  14. package/dist/components/elements/SelectBox.vue.d.ts.map +1 -1
  15. package/dist/components/elements/SkeletonLoader.vue.d.ts +30 -0
  16. package/dist/components/elements/SkeletonLoader.vue.d.ts.map +1 -0
  17. package/dist/components/elements/SpinButton.vue.d.ts +4 -2
  18. package/dist/components/elements/SpinButton.vue.d.ts.map +1 -1
  19. package/dist/components/elements/TextField.vue.d.ts +21 -6
  20. package/dist/components/elements/TextField.vue.d.ts.map +1 -1
  21. package/dist/components/features/ProductList.vue.d.ts +4 -0
  22. package/dist/components/features/ProductList.vue.d.ts.map +1 -1
  23. package/dist/components/features/ProductListItem.vue.d.ts +4 -0
  24. package/dist/components/features/ProductListItem.vue.d.ts.map +1 -1
  25. package/dist/components/features/ProductPurchase.vue.d.ts +0 -4
  26. package/dist/components/features/ProductPurchase.vue.d.ts.map +1 -1
  27. package/dist/components/foundation/AppBar.vue.d.ts +28 -3
  28. package/dist/components/foundation/AppBar.vue.d.ts.map +1 -1
  29. package/dist/components/foundation/AppFooter.vue.d.ts +51 -1
  30. package/dist/components/foundation/AppFooter.vue.d.ts.map +1 -1
  31. package/dist/components/interactive/Disclosure.vue.d.ts +54 -0
  32. package/dist/components/interactive/Disclosure.vue.d.ts.map +1 -0
  33. package/dist/components/layouts/Page.vue.d.ts +2 -0
  34. package/dist/components/layouts/Page.vue.d.ts.map +1 -1
  35. package/dist/components/renderless/Form.vue.d.ts +27 -1
  36. package/dist/components/renderless/Form.vue.d.ts.map +1 -1
  37. package/dist/index.d.ts +9 -3
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.es.js +7161 -5941
  40. package/dist/script.es.js +8364 -7146
  41. package/dist/script.umd.js +26 -26
  42. package/dist/style.css +1 -1
  43. package/dist/types.d.ts +7 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/utils.d.ts.map +1 -1
  46. package/package.json +18 -13
  47. package/src/stories/Alert.stories.ts +260 -0
  48. package/src/stories/AnnounceBar.stories.ts +138 -0
  49. package/src/stories/AppBar.stories.ts +277 -0
  50. package/src/stories/AppFooter.stories.ts +274 -0
  51. package/src/stories/AppFrame.stories.ts +46 -0
  52. package/src/stories/AppLayout.stories.ts +870 -0
  53. package/src/stories/Button.stories.ts +101 -0
  54. package/src/stories/Card.stories.ts +152 -0
  55. package/src/stories/Carousel.stories.ts +62 -0
  56. package/src/stories/CarouselBanner.stories.ts +103 -0
  57. package/src/stories/CheckBox.stories.ts +76 -0
  58. package/src/stories/ComboBox.stories.ts +524 -0
  59. package/src/stories/Dialog.stories.ts +174 -0
  60. package/src/stories/Disclosure.stories.ts +217 -0
  61. package/src/stories/Divider.stories.ts +68 -0
  62. package/src/stories/Drawer.stories.ts +135 -0
  63. package/src/stories/DropDown.stories.ts +195 -0
  64. package/src/stories/FloatingBanner.stories.ts +79 -0
  65. package/src/stories/Form.stories.ts +704 -0
  66. package/src/stories/Gallery.stories.ts +78 -0
  67. package/src/stories/Grid.stories.ts +357 -0
  68. package/src/stories/Hero.stories.ts +52 -0
  69. package/src/stories/Html.stories.ts +178 -0
  70. package/src/stories/Icon.stories.ts +176 -0
  71. package/src/stories/Image.stories.ts +613 -0
  72. package/src/stories/Label.stories.ts +54 -0
  73. package/src/stories/List.stories.ts +112 -0
  74. package/src/stories/Modal.stories.ts +123 -0
  75. package/src/stories/Notification.stories.ts +82 -0
  76. package/src/stories/Page.stories.ts +414 -0
  77. package/src/stories/PasswordField.stories.ts +304 -0
  78. package/src/stories/ProductLabels.stories.ts +65 -0
  79. package/src/stories/ProductList.stories.ts +679 -0
  80. package/src/stories/ProductPurchase.stories.ts +807 -0
  81. package/src/stories/Progress.stories.ts +192 -0
  82. package/src/stories/Radio.stories.ts +81 -0
  83. package/src/stories/Section.stories.ts +244 -0
  84. package/src/stories/SelectBox.stories.ts +377 -0
  85. package/src/stories/SkeletonLoader.stories.ts +170 -0
  86. package/src/stories/Slider.stories.ts +79 -0
  87. package/src/stories/SnsLink.stories.ts +259 -0
  88. package/src/stories/SoldStacker.stories.ts +68 -0
  89. package/src/stories/SpinButton.stories.ts +134 -0
  90. package/src/stories/Spinner.stories.ts +58 -0
  91. package/src/stories/Stack.stories.ts +104 -0
  92. package/src/stories/Switch.stories.ts +68 -0
  93. package/src/stories/Tab.stories.ts +52 -0
  94. package/src/stories/TabPanels.stories.ts +67 -0
  95. package/src/stories/Tabs.stories.ts +68 -0
  96. package/src/stories/Text.stories.ts +69 -0
  97. package/src/stories/TextArea.stories.ts +78 -0
  98. package/src/stories/TextField.stories.ts +97 -0
  99. package/src/stories/ToolChip.stories.ts +125 -0
  100. package/dist/components/elements/SkeltonLoader.vue.d.ts +0 -7
  101. package/dist/components/elements/SkeltonLoader.vue.d.ts.map +0 -1
@@ -0,0 +1,277 @@
1
+ import Button from '@/components/elements/Button.vue'
2
+ import Icon from '@/components/elements/Icon.vue'
3
+ import Text from '@/components/elements/Text.vue'
4
+ import AppBar, {
5
+ AppBarProps,
6
+ AppBarAction,
7
+ AppBarMenuItem,
8
+ } from '@/components/foundation/AppBar.vue'
9
+ import Stack from '@/components/layouts/Stack.vue'
10
+ import type { Meta, StoryObj } from '@storybook/vue3'
11
+ import { ref } from 'vue'
12
+ import './assets/css/style.css'
13
+
14
+ const meta: Meta<typeof AppBar> = {
15
+ title: 'Foundation/AppBar',
16
+ component: AppBar,
17
+ tags: ['autodocs'],
18
+ argTypes: {
19
+ title: { control: 'text', description: 'タイトル文字列' },
20
+ titleLogo: { control: 'text', description: 'ロゴ画像URL' },
21
+ sticky: { control: 'boolean', description: 'スティッキー表示' },
22
+ flat: { control: 'boolean', description: 'フラット表示(ボーダーなし)' },
23
+ menu: { control: 'object', description: 'メニュー項目の配列' },
24
+ actions: { control: 'object', description: 'アクション項目の配列' },
25
+ },
26
+ args: {
27
+ title: 'ショップ名',
28
+ sticky: true,
29
+ flat: false,
30
+ },
31
+ parameters: {
32
+ docs: {
33
+ description: {
34
+ component: `
35
+ EC向けヘッダーコンポーネント。PC/SPのレスポンシブ対応。
36
+
37
+ ## Slot
38
+ - \`title\`: ショップロゴ、またはショップ名
39
+ - \`menu\`: カテゴリナビゲーション + 固定メニュー(PCは中央表示、SPはドロワー内)
40
+ - \`actions\`: アカウント / カート / 検索などのアクション
41
+ - \`extra\`: 任意(告知・検索展開・2段目UIなど)
42
+
43
+ ## レスポンシブ仕様
44
+ - **PC(768px以上)**: [ title ] [ menu(中央) ] [ actions ]
45
+ - **SP(767px以下)**: [ ハンバーガー ] [ title ] [ actions ] → menuはドロワーで表示
46
+ `,
47
+ },
48
+ },
49
+ },
50
+ }
51
+
52
+ export default meta
53
+ type StoryArgs = AppBarProps & {}
54
+ type Story = StoryObj<StoryArgs>
55
+ type OverridesStory = Omit<Story, 'argTypes'> & {
56
+ argTypes?: Record<string, unknown>
57
+ }
58
+
59
+ // サンプルメニュー
60
+ const sampleMenu: AppBarMenuItem[] = [
61
+ { title: '新着', url: '/new' },
62
+ {
63
+ title: 'カテゴリ',
64
+ children: [
65
+ { title: 'Tシャツ', url: '/category/tshirt' },
66
+ { title: 'パーカー', url: '/category/hoodie' },
67
+ { title: 'キャップ', url: '/category/cap' },
68
+ ],
69
+ },
70
+ { title: 'ランキング', url: '/ranking' },
71
+ { title: 'セール', url: '/sale' },
72
+ ]
73
+
74
+ // サンプルアクション
75
+ const sampleActions: AppBarAction[] = [
76
+ { title: '検索', icon: ['far', 'magnifying-glass'], action: () => alert('検索') },
77
+ { title: 'アカウント', icon: ['far', 'user'], url: '/account' },
78
+ { title: 'カート', icon: ['far', 'cart-shopping'], url: '/cart' },
79
+ ]
80
+
81
+ // ★ Defaultを最初に配置(autodocsのPrimary storyになる)
82
+ export const Default: OverridesStory = {
83
+ args: {
84
+ title: 'ショップ名',
85
+ menu: sampleMenu,
86
+ actions: sampleActions,
87
+ },
88
+ argTypes: {},
89
+ render: (args) => ({
90
+ components: {
91
+ 'rn-app-bar': AppBar,
92
+ },
93
+ setup() {
94
+ return { args }
95
+ },
96
+ template: /* html */ `
97
+ <div class='sb-canvas'>
98
+ <p style="margin-bottom: 16px; font-size: 12px; color: #666;">
99
+ ※ブラウザ幅を767px以下にするとSP表示(ハンバーガーメニュー)に切り替わります
100
+ </p>
101
+ <rn-app-bar v-bind="args" />
102
+ </div>
103
+ `,
104
+ }),
105
+ }
106
+
107
+ export const ロゴ画像: OverridesStory = {
108
+ args: {
109
+ title: 'Sample Shop',
110
+ titleLogo: 'https://official-goods-store.jp/assets/img/naoto/title.png',
111
+ menu: sampleMenu,
112
+ actions: sampleActions,
113
+ },
114
+ argTypes: {},
115
+ render: (args) => ({
116
+ components: {
117
+ 'rn-app-bar': AppBar,
118
+ },
119
+ setup() {
120
+ return { args }
121
+ },
122
+ template: /* html */ `
123
+ <div class='sb-canvas'>
124
+ <p style="margin-bottom: 16px; font-size: 12px; color: #666;">
125
+ ※titleLogoを指定すると、titleより優先してロゴ画像が表示されます
126
+ </p>
127
+ <rn-app-bar v-bind="args" />
128
+ </div>
129
+ `,
130
+ }),
131
+ }
132
+
133
+ export const Slotカスタマイズ: OverridesStory = {
134
+ args: {
135
+ flat: false,
136
+ },
137
+ argTypes: {
138
+ title: { control: { disable: true } },
139
+ },
140
+ render: (args) => ({
141
+ components: {
142
+ 'rn-app-bar': AppBar,
143
+ 'rn-button': Button,
144
+ 'rn-stack': Stack,
145
+ 'rn-icon': Icon,
146
+ 'rn-text': Text,
147
+ },
148
+ setup() {
149
+ return { args }
150
+ },
151
+ template: /* html */ `
152
+ <div class='sb-canvas'>
153
+ <rn-app-bar v-bind="args">
154
+ <template #title>
155
+ <img width="120" src="https://official-goods-store.jp/assets/img/naoto/title.png" alt="Shop Logo" />
156
+ </template>
157
+ <template #menu>
158
+ <rn-stack direction="horizontal" gap="sm">
159
+ <a href="#">新着</a>
160
+ <a href="#">カテゴリ</a>
161
+ <a href="#">ランキング</a>
162
+ </rn-stack>
163
+ </template>
164
+ <template #actions>
165
+ <rn-icon :icon="['far', 'magnifying-glass']" />
166
+ <rn-icon :icon="['far', 'user']" />
167
+ <rn-icon :icon="['far', 'cart-shopping']" />
168
+ </template>
169
+ </rn-app-bar>
170
+ </div>
171
+ `,
172
+ }),
173
+ }
174
+
175
+ export const Slotのみ: OverridesStory = {
176
+ args: {},
177
+ argTypes: {},
178
+ render: (args) => ({
179
+ components: {
180
+ 'rn-app-bar': AppBar,
181
+ 'rn-icon': Icon,
182
+ },
183
+ setup() {
184
+ return { args }
185
+ },
186
+ template: /* html */ `
187
+ <div class='sb-canvas'>
188
+ <p style="margin-bottom: 16px; font-size: 12px; color: #666;">
189
+ ※Slotのみを使用した最小構成の例
190
+ </p>
191
+ <rn-app-bar v-bind="args">
192
+ <template #title>
193
+ <rn-icon :icon="['far', 'bars']" />
194
+ </template>
195
+ <template #actions>
196
+ <rn-icon icon="bell" />
197
+ </template>
198
+ </rn-app-bar>
199
+ </div>
200
+ `,
201
+ }),
202
+ }
203
+
204
+ export const Extra付き: OverridesStory = {
205
+ args: {
206
+ title: 'My Shop',
207
+ menu: sampleMenu,
208
+ actions: sampleActions,
209
+ },
210
+ argTypes: {},
211
+ render: (args) => ({
212
+ components: {
213
+ 'rn-app-bar': AppBar,
214
+ },
215
+ setup() {
216
+ return { args }
217
+ },
218
+ template: /* html */ `
219
+ <div class='sb-canvas'>
220
+ <rn-app-bar v-bind="args">
221
+ <template #extra>
222
+ <div style="background: #fef3c7; padding: 8px 16px; text-align: center; font-size: 12px;">
223
+ 🎉 期間限定セール開催中!全品10%OFF
224
+ </div>
225
+ </template>
226
+ </rn-app-bar>
227
+ </div>
228
+ `,
229
+ }),
230
+ }
231
+
232
+ export const メニューなし: OverridesStory = {
233
+ args: {
234
+ title: 'Simple Header',
235
+ actions: sampleActions,
236
+ },
237
+ argTypes: {},
238
+ render: (args) => ({
239
+ components: {
240
+ 'rn-app-bar': AppBar,
241
+ },
242
+ setup() {
243
+ return { args }
244
+ },
245
+ template: /* html */ `
246
+ <div class='sb-canvas'>
247
+ <p style="margin-bottom: 16px; font-size: 12px; color: #666;">
248
+ ※menuが存在しない場合、ハンバーガーメニューは表示されません
249
+ </p>
250
+ <rn-app-bar v-bind="args" />
251
+ </div>
252
+ `,
253
+ }),
254
+ }
255
+
256
+ export const フラット: OverridesStory = {
257
+ args: {
258
+ title: 'Flat Header',
259
+ flat: true,
260
+ menu: sampleMenu,
261
+ actions: sampleActions,
262
+ },
263
+ argTypes: {},
264
+ render: (args) => ({
265
+ components: {
266
+ 'rn-app-bar': AppBar,
267
+ },
268
+ setup() {
269
+ return { args }
270
+ },
271
+ template: /* html */ `
272
+ <div class='sb-canvas'>
273
+ <rn-app-bar v-bind="args" />
274
+ </div>
275
+ `,
276
+ }),
277
+ }
@@ -0,0 +1,274 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import AppFooter, {
3
+ AppFooterProps,
4
+ SnsLinkItem,
5
+ LogoItem,
6
+ } from '@/components/foundation/AppFooter.vue'
7
+ import { MenuItem } from '@/types'
8
+ import Stack from '@/components/layouts/Stack.vue'
9
+ import Text from '@/components/elements/Text.vue'
10
+ import Button from '@/components/elements/Button.vue'
11
+ import BrandLogo from '@/components/features/BrandLogo.vue'
12
+ import SnsLink from '@/components/features/SnsLink.vue'
13
+ import './assets/css/style.css'
14
+
15
+ const meta: Meta<typeof AppFooter> = {
16
+ title: 'Foundation/AppFooter',
17
+ component: AppFooter,
18
+ tags: ['autodocs'],
19
+ argTypes: {
20
+ copyright: { control: 'text', description: 'コピーライトテキスト' },
21
+ menus: { control: 'object', description: 'メニュー項目の配列' },
22
+ snsLinks: { control: 'object', description: 'SNSリンクの配列' },
23
+ logos: { control: 'object', description: 'ロゴの配列' },
24
+ },
25
+ parameters: {
26
+ layout: 'fullscreen',
27
+ docs: {
28
+ description: {
29
+ component: `
30
+ EC向けフッターコンポーネント。PC/SPのレスポンシブ対応。
31
+
32
+ ## Props
33
+ - \`logos\`: ロゴ画像の配列
34
+ - \`snsLinks\`: SNSリンクの配列
35
+ - \`menus\`: メニュー項目の配列(子供あり/なし対応)
36
+ - \`copyright\`: コピーライトテキスト
37
+
38
+ ## レスポンシブ仕様
39
+ ### 子供ありメニュー
40
+ - **PC**: セクションタイトル + 子リスト縦並び
41
+ - **SP**: Disclosureで折りたたみ
42
+
43
+ ### 子供なしメニュー
44
+ - **PC**: リンク横並び
45
+ - **SP**: リンク縦リスト
46
+
47
+ ## Slot
48
+ - \`logos\`: ロゴ部分のカスタマイズ
49
+ - \`sns-links\`: SNSリンク部分のカスタマイズ
50
+ - \`menus\`: メニュー部分のカスタマイズ
51
+ - \`copyright\`: コピーライト部分のカスタマイズ
52
+ `,
53
+ },
54
+ },
55
+ },
56
+ }
57
+
58
+ export default meta
59
+ type Story = StoryObj<AppFooterProps>
60
+
61
+ // サンプルデータ
62
+ const sampleLogos: LogoItem[] = [
63
+ {
64
+ href: '/',
65
+ logoUrl: 'https://placehold.co/160x40?text=LOGO',
66
+ title: 'Sample Store',
67
+ width: 120,
68
+ },
69
+ ]
70
+
71
+ const sampleSnsLinks: SnsLinkItem[] = [
72
+ { type: 'x-twitter', href: 'https://twitter.com/' },
73
+ { type: 'instagram', href: 'https://instagram.com/' },
74
+ { type: 'youtube', href: 'https://youtube.com/' },
75
+ ]
76
+
77
+ // 子供ありメニュー
78
+ const sampleMenusWithChildren: MenuItem[] = [
79
+ {
80
+ title: 'サポート',
81
+ children: [
82
+ { title: 'FAQ', url: '/faq' },
83
+ { title: 'お問い合わせ', url: '/contact' },
84
+ { title: '配送について', url: '/shipping' },
85
+ ],
86
+ },
87
+ {
88
+ title: '規約・免責',
89
+ children: [
90
+ { title: '利用規約', url: '/terms' },
91
+ { title: 'プライバシーポリシー', url: '/privacy' },
92
+ { title: '特定商取引法に基づく表記', url: '/legal' },
93
+ ],
94
+ },
95
+ {
96
+ title: 'アカウント',
97
+ children: [
98
+ { title: 'サインアップ', url: '/signup' },
99
+ { title: 'ログイン', url: '/login' },
100
+ ],
101
+ },
102
+ ]
103
+
104
+ // 子供なしメニュー
105
+ const sampleMenusWithoutChildren: MenuItem[] = [
106
+ { title: 'FAQ', url: '/faq' },
107
+ { title: 'お問い合わせ', url: '/contact' },
108
+ { title: '配送について', url: '/shipping' },
109
+ { title: '利用規約', url: '/terms' },
110
+ { title: 'プライバシーポリシー', url: '/privacy' },
111
+ ]
112
+
113
+ export const Default: Story = {
114
+ args: {
115
+ logos: sampleLogos,
116
+ snsLinks: sampleSnsLinks,
117
+ menus: sampleMenusWithChildren,
118
+ copyright: '© 2024 Sample Store. All rights reserved.',
119
+ },
120
+ render: (args) => ({
121
+ components: { 'rn-app-footer': AppFooter },
122
+ setup() {
123
+ return { args }
124
+ },
125
+ template: /* html */ `
126
+ <div class="sb-canvas" style="min-height: 100vh; display: flex; flex-direction: column;">
127
+ <div style="flex: 1; padding: 40px; background: #f5f5f5;">
128
+ <p style="color: #666;">※ブラウザ幅を767px以下にするとSP表示に切り替わります</p>
129
+ </div>
130
+ <rn-app-footer v-bind="args" />
131
+ </div>
132
+ `,
133
+ }),
134
+ }
135
+
136
+ export const 子供ありメニュー: Story = {
137
+ args: {
138
+ logos: sampleLogos,
139
+ snsLinks: sampleSnsLinks,
140
+ menus: sampleMenusWithChildren,
141
+ copyright: '© 2024 Sample Store. All rights reserved.',
142
+ },
143
+ render: (args) => ({
144
+ components: { 'rn-app-footer': AppFooter },
145
+ setup() {
146
+ return { args }
147
+ },
148
+ template: /* html */ `
149
+ <div class="sb-canvas">
150
+ <p style="padding: 16px; font-size: 12px; color: #666;">
151
+ PC: セクションタイトル + 子リスト縦並び<br/>
152
+ SP: Disclosureで折りたたみ
153
+ </p>
154
+ <rn-app-footer v-bind="args" />
155
+ </div>
156
+ `,
157
+ }),
158
+ }
159
+
160
+ export const 子供なしメニュー: Story = {
161
+ args: {
162
+ logos: sampleLogos,
163
+ snsLinks: sampleSnsLinks,
164
+ menus: sampleMenusWithoutChildren,
165
+ copyright: '© 2024 Sample Store. All rights reserved.',
166
+ },
167
+ render: (args) => ({
168
+ components: { 'rn-app-footer': AppFooter },
169
+ setup() {
170
+ return { args }
171
+ },
172
+ template: /* html */ `
173
+ <div class="sb-canvas">
174
+ <p style="padding: 16px; font-size: 12px; color: #666;">
175
+ PC: リンク横並び<br/>
176
+ SP: リンク縦リスト
177
+ </p>
178
+ <rn-app-footer v-bind="args" />
179
+ </div>
180
+ `,
181
+ }),
182
+ }
183
+
184
+ export const 混合メニュー: Story = {
185
+ args: {
186
+ logos: sampleLogos,
187
+ snsLinks: sampleSnsLinks,
188
+ menus: [
189
+ ...sampleMenusWithChildren.slice(0, 2),
190
+ { title: '会社概要', url: '/about' },
191
+ { title: '採用情報', url: '/careers' },
192
+ ],
193
+ copyright: '© 2024 Sample Store. All rights reserved.',
194
+ },
195
+ render: (args) => ({
196
+ components: { 'rn-app-footer': AppFooter },
197
+ setup() {
198
+ return { args }
199
+ },
200
+ template: /* html */ `
201
+ <div class="sb-canvas">
202
+ <p style="padding: 16px; font-size: 12px; color: #666;">
203
+ 子供ありメニューと子供なしメニューの混合表示
204
+ </p>
205
+ <rn-app-footer v-bind="args" />
206
+ </div>
207
+ `,
208
+ }),
209
+ }
210
+
211
+ export const Slotカスタマイズ: Story = {
212
+ render: () => ({
213
+ components: {
214
+ 'rn-app-footer': AppFooter,
215
+ 'rn-stack': Stack,
216
+ 'rn-text': Text,
217
+ 'rn-button': Button,
218
+ 'rn-brand-logo': BrandLogo,
219
+ 'rn-sns-link': SnsLink,
220
+ },
221
+ template: /* html */ `
222
+ <div class="sb-canvas">
223
+ <rn-app-footer>
224
+ <template #logos>
225
+ <rn-brand-logo
226
+ href="/"
227
+ title="Custom Logo"
228
+ logo-url="https://placehold.co/160x40?text=CustomLogo"
229
+ width="160"
230
+ />
231
+ </template>
232
+ <template #sns-links>
233
+ <rn-sns-link type="x-twitter" href="#" variant="icon" />
234
+ <rn-sns-link type="instagram" href="#" variant="icon" />
235
+ </template>
236
+ <template #menus>
237
+ <rn-stack direction="horizontal" gap="xl">
238
+ <rn-stack direction="vertical">
239
+ <rn-text weight="bold">カスタムセクション1</rn-text>
240
+ <a href="#">リンク1</a>
241
+ <a href="#">リンク2</a>
242
+ </rn-stack>
243
+ <rn-stack direction="vertical">
244
+ <rn-text weight="bold">カスタムセクション2</rn-text>
245
+ <a href="#">リンク3</a>
246
+ <a href="#">リンク4</a>
247
+ </rn-stack>
248
+ </rn-stack>
249
+ </template>
250
+ <template #copyright>
251
+ <rn-text size="caption">Custom Copyright © 2024</rn-text>
252
+ </template>
253
+ </rn-app-footer>
254
+ </div>
255
+ `,
256
+ }),
257
+ }
258
+
259
+ export const 最小構成: Story = {
260
+ args: {
261
+ copyright: '© 2024 Sample Store.',
262
+ },
263
+ render: (args) => ({
264
+ components: { 'rn-app-footer': AppFooter },
265
+ setup() {
266
+ return { args }
267
+ },
268
+ template: /* html */ `
269
+ <div class="sb-canvas">
270
+ <rn-app-footer v-bind="args" />
271
+ </div>
272
+ `,
273
+ }),
274
+ }
@@ -0,0 +1,46 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import AppFrame from '@/components/foundation/AppFrame.vue'
3
+
4
+ const meta: Meta<typeof AppFrame> = {
5
+ title: 'Foundation/AppFrame',
6
+ component: AppFrame,
7
+ tags: ['autodocs'],
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component: 'AppFrameコンポーネント',
12
+ },
13
+ },
14
+ },
15
+ argTypes: {},
16
+ args: {},
17
+ render: (args) => ({
18
+ components: { 'rn-app-frame': AppFrame },
19
+ setup() {
20
+ return { args }
21
+ },
22
+ template: /* html */ `
23
+ <div class='sb-canvas'>
24
+ <rn-app-frame>
25
+ <template #floating>
26
+ floatingText
27
+ </template>
28
+ </rn-app-frame>
29
+ </div>
30
+ `,
31
+ }),
32
+ }
33
+
34
+ export default meta
35
+ type StoryArgs = {}
36
+ type Story = StoryObj<StoryArgs>
37
+ type OverridesStory = Omit<Story, 'argTypes'> & {
38
+ argTypes?: Record<string, any>
39
+ }
40
+
41
+ export const 基本: OverridesStory = {
42
+ args: {},
43
+ argTypes: {
44
+ default: { table: { disable: true } },
45
+ },
46
+ }