@reni-corp/reni-2c-ui 0.3.27 → 0.3.29

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 +139 -16
  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 +102 -0
  26. package/dist/components/features/ProductPurchase.vue.d.ts.map +1 -0
  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 +11 -3
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.es.js +7442 -6048
  40. package/dist/script.es.js +8881 -7489
  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 +22 -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,613 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import Image, { type ImageProps } from '@/components/elements/Image.vue'
3
+ import Stack from '@/components/layouts/Stack.vue'
4
+
5
+ const meta: Meta<typeof Image> = {
6
+ title: 'Elements/Image',
7
+ component: Image,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ src: {
11
+ control: 'text',
12
+ description: '画像のURL(文字列またはレスポンシブ設定オブジェクト)',
13
+ },
14
+ alt: {
15
+ control: 'text',
16
+ description: '代替テキスト',
17
+ },
18
+ size: {
19
+ control: 'select',
20
+ options: ['sm', 'md', 'lg', 'xl', 'auto'],
21
+ description: '画像のサイズ',
22
+ },
23
+ loading: {
24
+ control: 'select',
25
+ options: ['lazy', 'eager'],
26
+ description: '読み込み方式',
27
+ },
28
+ fallback: {
29
+ control: 'text',
30
+ description: 'エラー時のフォールバック画像URL',
31
+ },
32
+ width: {
33
+ control: 'text',
34
+ description: '画像の幅(数値、文字列、またはレスポンシブ設定)',
35
+ },
36
+ height: {
37
+ control: 'text',
38
+ description: '画像の高さ(数値、文字列、またはレスポンシブ設定)',
39
+ },
40
+ title: {
41
+ control: 'text',
42
+ description: 'タイトルテキスト',
43
+ },
44
+ description: {
45
+ control: 'text',
46
+ description: '説明文',
47
+ },
48
+ textPosition: {
49
+ control: 'select',
50
+ options: ['normal', 'overlay'],
51
+ description: 'テキストの表示位置',
52
+ },
53
+ textAlignment: {
54
+ control: 'select',
55
+ options: ['left', 'center', 'right'],
56
+ description: 'テキストの配置',
57
+ },
58
+ textSize: {
59
+ control: 'select',
60
+ options: ['auto', 'sm', 'md', 'lg'],
61
+ description: 'テキストサイズ',
62
+ },
63
+ },
64
+ args: {
65
+ src: 'https://picsum.photos/400/300',
66
+ alt: 'サンプル画像',
67
+ size: 'auto',
68
+ loading: 'lazy',
69
+ fallback: '',
70
+ width: '',
71
+ height: '',
72
+ title: '',
73
+ description: '',
74
+ textPosition: 'normal',
75
+ textAlignment: 'left',
76
+ textSize: 'auto',
77
+ },
78
+ }
79
+
80
+ export default meta
81
+ type StoryArgs = ImageProps
82
+ type Story = StoryObj<StoryArgs>
83
+ type OverridesStory = Omit<Story, 'argTypes'> & {
84
+ argTypes?: Record<string, any>
85
+ }
86
+
87
+ export const 基本: OverridesStory = {
88
+ args: {
89
+ src: 'https://picsum.photos/400/300',
90
+ alt: 'サンプル画像',
91
+ },
92
+ render: (args: StoryArgs) => ({
93
+ components: { 'rn-image': Image },
94
+ setup() {
95
+ return { args }
96
+ },
97
+ template: /* html */ `
98
+ <div class='sb-canvas'>
99
+ <rn-image
100
+ :src="args.src"
101
+ :alt="args.alt"
102
+ :size="args.size"
103
+ :loading="args.loading"
104
+ :fallback="args.fallback"
105
+ :width="args.width"
106
+ :height="args.height"
107
+ :title="args.title"
108
+ :description="args.description"
109
+ :text-position="args.textPosition"
110
+ :text-alignment="args.textAlignment"
111
+ :text-size="args.textSize"
112
+ />
113
+ </div>
114
+ `,
115
+ }),
116
+ }
117
+
118
+ export const サイズ設定: OverridesStory = {
119
+ args: {
120
+ src: 'https://picsum.photos/400/300',
121
+ alt: 'サンプル画像',
122
+ },
123
+ argTypes: {
124
+ src: { control: { disable: true } },
125
+ alt: { control: { disable: true } },
126
+ loading: { control: { disable: true } },
127
+ fallback: { control: { disable: true } },
128
+ width: { control: { disable: true } },
129
+ height: { control: { disable: true } },
130
+ },
131
+ render: (args: StoryArgs) => ({
132
+ components: { 'rn-image': Image, 'rn-stack': Stack },
133
+ setup() {
134
+ return { args }
135
+ },
136
+ template: /* html */ `
137
+ <div class='sb-canvas'>
138
+ <rn-stack direction="vertical" gap="md">
139
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start">
140
+ <rn-stack direction="vertical" gap="xs">
141
+ <div>Size: sm</div>
142
+ <rn-image src="https://picsum.photos/400/300" alt="サンプル画像" size="sm" />
143
+ </rn-stack>
144
+ <rn-stack direction="vertical" gap="xs">
145
+ <div>Size: md</div>
146
+ <rn-image src="https://picsum.photos/400/300" alt="サンプル画像" size="md" />
147
+ </rn-stack>
148
+ <rn-stack direction="vertical" gap="xs">
149
+ <div>Size: lg</div>
150
+ <rn-image src="https://picsum.photos/400/300" alt="サンプル画像" size="lg" />
151
+ </rn-stack>
152
+ </rn-stack>
153
+ <rn-stack direction="vertical" gap="xs">
154
+ <div>Size: xl</div>
155
+ <rn-image src="https://picsum.photos/400/300" alt="サンプル画像" size="xl" />
156
+ </rn-stack>
157
+ </rn-stack>
158
+ </div>
159
+ `,
160
+ }),
161
+ }
162
+
163
+ export const レスポンシブ画像: OverridesStory = {
164
+ args: {},
165
+ argTypes: {
166
+ src: { control: { disable: true } },
167
+ alt: { control: { disable: true } },
168
+ size: { control: { disable: true } },
169
+ loading: { control: { disable: true } },
170
+ fallback: { control: { disable: true } },
171
+ width: { control: { disable: true } },
172
+ height: { control: { disable: true } },
173
+ },
174
+ render: (args: StoryArgs) => ({
175
+ components: { 'rn-image': Image, 'rn-stack': Stack },
176
+ setup() {
177
+ const responsiveSrc = {
178
+ xs: 'https://picsum.photos/300/200',
179
+ sm: 'https://picsum.photos/400/300',
180
+ md: 'https://picsum.photos/600/400',
181
+ lg: 'https://picsum.photos/800/600',
182
+ xl: 'https://picsum.photos/1200/800',
183
+ }
184
+ return { args, responsiveSrc }
185
+ },
186
+ template: /* html */ `
187
+ <div class='sb-canvas'>
188
+ <rn-stack direction="vertical" gap="md">
189
+ <div>レスポンシブ画像(画面サイズに応じて異なる画像を表示)</div>
190
+ <rn-image
191
+ :src="responsiveSrc"
192
+ alt="レスポンシブサンプル画像"
193
+ />
194
+ </rn-stack>
195
+ </div>
196
+ `,
197
+ }),
198
+ }
199
+
200
+ export const エラー処理: OverridesStory = {
201
+ args: {},
202
+ argTypes: {
203
+ src: { control: { disable: true } },
204
+ alt: { control: { disable: true } },
205
+ size: { control: { disable: true } },
206
+ loading: { control: { disable: true } },
207
+ fallback: { control: { disable: true } },
208
+ width: { control: { disable: true } },
209
+ height: { control: { disable: true } },
210
+ },
211
+ render: (args: StoryArgs) => ({
212
+ components: { 'rn-image': Image, 'rn-stack': Stack },
213
+ setup() {
214
+ return { args }
215
+ },
216
+ template: /* html */ `
217
+ <div class='sb-canvas'>
218
+ <rn-stack direction="vertical" gap="md">
219
+ <rn-stack direction="vertical" gap="xs">
220
+ <div>エラー画像(フォールバックなし)</div>
221
+ <rn-image
222
+ src="https://invalid-url.com/not-found.jpg"
223
+ alt="存在しない画像"
224
+ size="md"
225
+ />
226
+ </rn-stack>
227
+ <rn-stack direction="vertical" gap="xs">
228
+ <div>エラー画像(フォールバックあり)</div>
229
+ <rn-image
230
+ src="https://invalid-url.com/not-found.jpg"
231
+ alt="存在しない画像"
232
+ size="md"
233
+ fallback="https://picsum.photos/200/200?grayscale"
234
+ />
235
+ </rn-stack>
236
+ </rn-stack>
237
+ </div>
238
+ `,
239
+ }),
240
+ }
241
+
242
+ export const テキスト付き画像: OverridesStory = {
243
+ args: {},
244
+ argTypes: {
245
+ src: { control: { disable: true } },
246
+ alt: { control: { disable: true } },
247
+ size: { control: { disable: true } },
248
+ loading: { control: { disable: true } },
249
+ fallback: { control: { disable: true } },
250
+ width: { control: { disable: true } },
251
+ height: { control: { disable: true } },
252
+ title: { control: { disable: true } },
253
+ description: { control: { disable: true } },
254
+ textPosition: { control: { disable: true } },
255
+ textAlignment: { control: { disable: true } },
256
+ textSize: { control: { disable: true } },
257
+ },
258
+ render: (args: StoryArgs) => ({
259
+ components: { 'rn-image': Image, 'rn-stack': Stack },
260
+ setup() {
261
+ return { args }
262
+ },
263
+ template: /* html */ `
264
+ <div class='sb-canvas'>
265
+ <rn-stack direction="vertical" gap="lg">
266
+ <rn-stack direction="vertical" gap="sm">
267
+ <h3>通常配置(Normal)</h3>
268
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start" wrap>
269
+ <rn-stack direction="vertical" gap="xs">
270
+ <div>左寄せ・サイズmd</div>
271
+ <rn-image
272
+ src="https://picsum.photos/seed/nature1/300/200"
273
+ alt="自然風景"
274
+ size="md"
275
+ title="美しい自然風景"
276
+ description="山と湖の美しいコントラスト"
277
+ text-position="normal"
278
+ text-alignment="left"
279
+ />
280
+ </rn-stack>
281
+ <rn-stack direction="vertical" gap="xs">
282
+ <div>中央寄せ・サイズmd</div>
283
+ <rn-image
284
+ src="https://picsum.photos/seed/nature2/300/200"
285
+ alt="都市風景"
286
+ size="md"
287
+ title="モダンな都市"
288
+ description="夜景が美しい近代都市"
289
+ text-position="normal"
290
+ text-alignment="center"
291
+ />
292
+ </rn-stack>
293
+ </rn-stack>
294
+ </rn-stack>
295
+
296
+ <rn-stack direction="vertical" gap="sm">
297
+ <h3>オーバーレイ配置(Overlay)</h3>
298
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start" wrap>
299
+ <rn-stack direction="vertical" gap="xs">
300
+ <div>左寄せ・サイズlg</div>
301
+ <rn-image
302
+ src="https://picsum.photos/seed/city1/400/300"
303
+ alt="街並み"
304
+ size="lg"
305
+ title="歴史ある街並み"
306
+ description="古い建物と新しい建物が共存する美しい街"
307
+ text-position="overlay"
308
+ text-alignment="left"
309
+ />
310
+ </rn-stack>
311
+ <rn-stack direction="vertical" gap="xs">
312
+ <div>中央寄せ・サイズlg</div>
313
+ <rn-image
314
+ src="https://picsum.photos/seed/city2/400/300"
315
+ alt="現代建築"
316
+ size="lg"
317
+ title="現代建築の美"
318
+ description="シンプルで洗練されたデザイン"
319
+ text-position="overlay"
320
+ text-alignment="center"
321
+ />
322
+ </rn-stack>
323
+ </rn-stack>
324
+ </rn-stack>
325
+ </rn-stack>
326
+ </div>
327
+ `,
328
+ }),
329
+ }
330
+
331
+ export const テキストサイズバリエーション: OverridesStory = {
332
+ args: {},
333
+ argTypes: {
334
+ src: { control: { disable: true } },
335
+ alt: { control: { disable: true } },
336
+ size: { control: { disable: true } },
337
+ loading: { control: { disable: true } },
338
+ fallback: { control: { disable: true } },
339
+ width: { control: { disable: true } },
340
+ height: { control: { disable: true } },
341
+ title: { control: { disable: true } },
342
+ description: { control: { disable: true } },
343
+ textPosition: { control: { disable: true } },
344
+ textAlignment: { control: { disable: true } },
345
+ textSize: { control: { disable: true } },
346
+ },
347
+ render: (args: StoryArgs) => ({
348
+ components: { 'rn-image': Image, 'rn-stack': Stack },
349
+ setup() {
350
+ return { args }
351
+ },
352
+ template: /* html */ `
353
+ <div class='sb-canvas'>
354
+ <rn-stack direction="vertical" gap="lg">
355
+ <rn-stack direction="vertical" gap="sm">
356
+ <h3>画像サイズと横幅比例のテキストサイズ(textSize="auto")</h3>
357
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start" wrap>
358
+ <rn-stack direction="vertical" gap="xs">
359
+ <div>サイズ: sm</div>
360
+ <rn-image
361
+ src="https://picsum.photos/seed/auto1/300/300"
362
+ alt="小サイズ"
363
+ size="sm"
364
+ title="小さな画像"
365
+ description="テキストも小さくなります"
366
+ text-position="overlay"
367
+ text-alignment="center"
368
+ text-size="auto"
369
+ />
370
+ </rn-stack>
371
+ <rn-stack direction="vertical" gap="xs">
372
+ <div>サイズ: md</div>
373
+ <rn-image
374
+ src="https://picsum.photos/seed/auto2/300/300"
375
+ alt="中サイズ"
376
+ size="md"
377
+ title="中くらいの画像"
378
+ description="テキストサイズも中くらい"
379
+ text-position="overlay"
380
+ text-alignment="center"
381
+ text-size="auto"
382
+ />
383
+ </rn-stack>
384
+ <rn-stack direction="vertical" gap="xs">
385
+ <div>サイズ: lg</div>
386
+ <rn-image
387
+ src="https://picsum.photos/seed/auto3/300/300"
388
+ alt="大サイズ"
389
+ size="lg"
390
+ title="大きな画像"
391
+ description="テキストも大きくなります"
392
+ text-position="overlay"
393
+ text-alignment="center"
394
+ text-size="auto"
395
+ />
396
+ </rn-stack>
397
+ </rn-stack>
398
+ </rn-stack>
399
+
400
+ <rn-stack direction="vertical" gap="sm">
401
+ <h3>固定テキストサイズ</h3>
402
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start" wrap>
403
+ <rn-stack direction="vertical" gap="xs">
404
+ <div>textSize: sm</div>
405
+ <rn-image
406
+ src="https://picsum.photos/seed/fixed1/300/200"
407
+ alt="固定小"
408
+ size="md"
409
+ title="固定小サイズ"
410
+ description="常に小さなテキスト"
411
+ text-position="normal"
412
+ text-alignment="center"
413
+ text-size="sm"
414
+ />
415
+ </rn-stack>
416
+ <rn-stack direction="vertical" gap="xs">
417
+ <div>textSize: md</div>
418
+ <rn-image
419
+ src="https://picsum.photos/seed/fixed2/300/200"
420
+ alt="固定中"
421
+ size="md"
422
+ title="固定中サイズ"
423
+ description="常に中くらいのテキスト"
424
+ text-position="normal"
425
+ text-alignment="center"
426
+ text-size="md"
427
+ />
428
+ </rn-stack>
429
+ <rn-stack direction="vertical" gap="xs">
430
+ <div>textSize: lg</div>
431
+ <rn-image
432
+ src="https://picsum.photos/seed/fixed3/300/200"
433
+ alt="固定大"
434
+ size="md"
435
+ title="固定大サイズ"
436
+ description="常に大きなテキスト"
437
+ text-position="normal"
438
+ text-alignment="center"
439
+ text-size="lg"
440
+ />
441
+ </rn-stack>
442
+ </rn-stack>
443
+ </rn-stack>
444
+ </rn-stack>
445
+ </div>
446
+ `,
447
+ }),
448
+ }
449
+
450
+ export const カード風レイアウト: OverridesStory = {
451
+ args: {},
452
+ argTypes: {
453
+ src: { control: { disable: true } },
454
+ alt: { control: { disable: true } },
455
+ size: { control: { disable: true } },
456
+ loading: { control: { disable: true } },
457
+ fallback: { control: { disable: true } },
458
+ width: { control: { disable: true } },
459
+ height: { control: { disable: true } },
460
+ title: { control: { disable: true } },
461
+ description: { control: { disable: true } },
462
+ textPosition: { control: { disable: true } },
463
+ textAlignment: { control: { disable: true } },
464
+ textSize: { control: { disable: true } },
465
+ },
466
+ render: (args: StoryArgs) => ({
467
+ components: { 'rn-image': Image, 'rn-stack': Stack },
468
+ setup() {
469
+ return { args }
470
+ },
471
+ template: /* html */ `
472
+ <div class='sb-canvas'>
473
+ <rn-stack direction="vertical" gap="lg">
474
+ <h3>商品カード風</h3>
475
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start" wrap>
476
+ <rn-image
477
+ src="https://picsum.photos/seed/product1/300/300"
478
+ alt="商品1"
479
+ :width="250"
480
+ :height="250"
481
+ size="md"
482
+ title="プレミアム商品A\n限定モデル"
483
+ description="高品質な素材を使用\n限定アイテムです"
484
+ text-position="normal"
485
+ text-alignment="left"
486
+ >
487
+ <template #top-right>
488
+ <span style="background: #ff4444; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: bold;">SALE</span>
489
+ </template>
490
+ <template #extra>
491
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-top: 8px;">
492
+ <span style="font-size: 18px; font-weight: bold; color: #e74c3c;">¥1,200</span>
493
+ <button style="background: #3498db; color: white; border: none; padding: 6px 12px; border-radius: 4px; font-size: 12px; cursor: pointer;">詳細</button>
494
+ </div>
495
+ </template>
496
+ </rn-image>
497
+ <rn-image
498
+ src="https://picsum.photos/seed/product2/300/300"
499
+ alt="商品2"
500
+ :width="250"
501
+ :height="250"
502
+ size="md"
503
+ title="スタンダード商品B"
504
+ description="日常使いに最適なベーシックアイテム"
505
+ text-position="normal"
506
+ text-alignment="left"
507
+ >
508
+ <template #top-left>
509
+ <span style="background: #2ecc71; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">エコ</span>
510
+ </template>
511
+ <template #extra>
512
+ <div style="margin-top: 8px;">
513
+ <div style="display: flex; align-items: center; gap: 8px;">
514
+ <span style="font-size: 16px; font-weight: bold;">¥800</span>
515
+ <div style="display: flex; gap: 4px;">
516
+ <span style="color: #f39c12;">★★★★☆</span>
517
+ <span style="font-size: 12px; color: #7f8c8d;">(24)</span>
518
+ </div>
519
+ </div>
520
+ </div>
521
+ </template>
522
+ </rn-image>
523
+ <rn-image
524
+ src="https://picsum.photos/seed/product3/300/300"
525
+ alt="商品3"
526
+ :width="250"
527
+ :height="250"
528
+ size="md"
529
+ title="エコ商品C"
530
+ description="環境に配慮した持続可能な商品"
531
+ text-position="normal"
532
+ text-alignment="left"
533
+ >
534
+ <template #bottom-right>
535
+ <button style="background: white; border: 2px solid #e74c3c; color: #e74c3c; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer;">♥</button>
536
+ </template>
537
+ </rn-image>
538
+ </rn-stack>
539
+
540
+ <h3>スロット配置デモ</h3>
541
+ <rn-stack direction="horizontal" gap="md" horizontal-align="start" wrap>
542
+ <rn-image
543
+ src="https://picsum.photos/seed/demo1/300/200"
544
+ alt="スロットデモ"
545
+ :width="300"
546
+ :height="200"
547
+ size="md"
548
+ >
549
+ <template #top-left>
550
+ <span style="background: #e74c3c; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">TL</span>
551
+ </template>
552
+ <template #top-center>
553
+ <span style="background: #3498db; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">TC</span>
554
+ </template>
555
+ <template #top-right>
556
+ <span style="background: #2ecc71; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">TR</span>
557
+ </template>
558
+ <template #left-center>
559
+ <span style="background: #f39c12; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">LC</span>
560
+ </template>
561
+ <template #right-center>
562
+ <span style="background: #9b59b6; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">RC</span>
563
+ </template>
564
+ <template #bottom-left>
565
+ <span style="background: #34495e; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">BL</span>
566
+ </template>
567
+ <template #bottom-center>
568
+ <span style="background: #e67e22; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">BC</span>
569
+ </template>
570
+ <template #bottom-right>
571
+ <span style="background: #95a5a6; color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px;">BR</span>
572
+ </template>
573
+ </rn-image>
574
+ </rn-stack>
575
+
576
+ <h3>バナー風</h3>
577
+ <rn-stack direction="vertical" gap="md">
578
+ <rn-image
579
+ src="https://picsum.photos/seed/banner1/800/300"
580
+ alt="キャンペーンバナー"
581
+ :width="600"
582
+ :height="200"
583
+ size="lg"
584
+ title="春のセール\n開催中!"
585
+ description="全商品最大50%OFF\n期間限定です"
586
+ text-position="overlay"
587
+ text-alignment="center"
588
+ >
589
+ <template #top-right>
590
+ <span style="background: rgba(255,255,255,0.9); color: #e74c3c; padding: 8px 16px; border-radius: 8px; font-weight: bold;">最大50%OFF</span>
591
+ </template>
592
+ </rn-image>
593
+ <rn-image
594
+ src="https://picsum.photos/seed/banner2/800/300"
595
+ alt="新商品告知"
596
+ :width="600"
597
+ :height="200"
598
+ size="lg"
599
+ title="新商品登場"
600
+ description="革新的なデザインと機能性を兼ね備えた新シリーズ"
601
+ text-position="overlay"
602
+ text-alignment="left"
603
+ >
604
+ <template #bottom-center>
605
+ <button style="background: white; color: #2c3e50; border: none; padding: 12px 24px; border-radius: 6px; font-weight: bold; cursor: pointer; margin-bottom: 16px;">詳しく見る</button>
606
+ </template>
607
+ </rn-image>
608
+ </rn-stack>
609
+ </rn-stack>
610
+ </div>
611
+ `,
612
+ }),
613
+ }
@@ -0,0 +1,54 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import Label, { type LabelProps } from '@/components/elements/Label.vue'
3
+
4
+ const meta: Meta<typeof Label> = {
5
+ title: 'Elements/Label',
6
+ component: Label,
7
+ tags: ['autodocs'],
8
+ argTypes: {
9
+ color: {
10
+ control: 'select',
11
+ options: ['warning', 'danger', 'success', 'info', 'default'],
12
+ },
13
+ size: {
14
+ control: 'select',
15
+ options: ['sm', 'md'],
16
+ },
17
+ },
18
+ args: {
19
+ color: 'default',
20
+ size: 'md',
21
+ },
22
+ }
23
+
24
+ export default meta
25
+ type StoryArgs = LabelProps & { slotText: string }
26
+ type Story = StoryObj<StoryArgs>
27
+ type OverridesStory = Omit<Story, 'argTypes'> & {
28
+ argTypes?: Record<string, any>
29
+ }
30
+
31
+ export const 基本: OverridesStory = {
32
+ args: {
33
+ slotText: 'Label',
34
+ },
35
+ argTypes: {
36
+ default: { table: { disable: true } },
37
+ },
38
+ render: (args: StoryArgs) => ({
39
+ components: { 'rn-label': Label },
40
+ setup() {
41
+ return { args }
42
+ },
43
+ template: /* html */ `
44
+ <div class='sb-canvas'>
45
+ <rn-label
46
+ :color=args.color
47
+ :size=args.size
48
+ >
49
+ {{ args.slotText }}
50
+ </rn-label>
51
+ </div>
52
+ `,
53
+ }),
54
+ }