@histoire/controls 0.2.2 → 0.2.3

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/dist/style.css CHANGED
@@ -266,6 +266,15 @@
266
266
  z-index:10
267
267
  }
268
268
 
269
+ .htw-m-4{
270
+ margin:1rem
271
+ }
272
+
273
+ .htw-my-0{
274
+ margin-top:0px;
275
+ margin-bottom:0px
276
+ }
277
+
269
278
  .-htw-my-1{
270
279
  margin-top:-0.25rem;
271
280
  margin-bottom:-0.25rem
@@ -283,14 +292,38 @@
283
292
  display:flex
284
293
  }
285
294
 
295
+ .htw-grid{
296
+ display:grid
297
+ }
298
+
299
+ .htw-hidden{
300
+ display:none
301
+ }
302
+
303
+ .htw-h-4{
304
+ height:1rem
305
+ }
306
+
286
307
  .htw-h-\[16px\]{
287
308
  height:16px
288
309
  }
289
310
 
311
+ .htw-h-\[100px\]{
312
+ height:100px
313
+ }
314
+
315
+ .htw-h-16{
316
+ height:4rem
317
+ }
318
+
290
319
  .htw-min-h-\[26px\]{
291
320
  min-height:26px
292
321
  }
293
322
 
323
+ .htw-w-4{
324
+ width:1rem
325
+ }
326
+
294
327
  .htw-w-28{
295
328
  width:7rem
296
329
  }
@@ -299,6 +332,10 @@
299
332
  width:16px
300
333
  }
301
334
 
335
+ .htw-w-16{
336
+ width:4rem
337
+ }
338
+
302
339
  .htw-w-full{
303
340
  width:100%
304
341
  }
@@ -334,10 +371,22 @@
334
371
  resize:vertical
335
372
  }
336
373
 
374
+ .htw-grid-cols-\[repeat\(auto-fill\,minmax\(100px\,1fr\)\)\]{
375
+ grid-template-columns:repeat(auto-fill,minmax(100px,1fr))
376
+ }
377
+
378
+ .htw-flex-col{
379
+ flex-direction:column
380
+ }
381
+
337
382
  .htw-flex-wrap{
338
383
  flex-wrap:wrap
339
384
  }
340
385
 
386
+ .htw-items-end{
387
+ align-items:flex-end
388
+ }
389
+
341
390
  .htw-items-center{
342
391
  align-items:center
343
392
  }
@@ -346,6 +395,14 @@
346
395
  gap:0.5rem
347
396
  }
348
397
 
398
+ .htw-gap-4{
399
+ gap:1rem
400
+ }
401
+
402
+ .htw-gap-1{
403
+ gap:0.25rem
404
+ }
405
+
349
406
  .htw-overflow-hidden{
350
407
  overflow:hidden
351
408
  }
@@ -362,6 +419,14 @@
362
419
  border-radius:0.25rem
363
420
  }
364
421
 
422
+ .htw-rounded{
423
+ border-radius:0.375rem
424
+ }
425
+
426
+ .htw-rounded-full{
427
+ border-radius:9999px
428
+ }
429
+
365
430
  .htw-border{
366
431
  border-width:1px
367
432
  }
@@ -370,6 +435,10 @@
370
435
  border-width:8px
371
436
  }
372
437
 
438
+ .htw-border-2{
439
+ border-width:2px
440
+ }
441
+
373
442
  .htw-border-solid{
374
443
  border-style:solid
375
444
  }
@@ -413,6 +482,11 @@
413
482
  padding-left:0.5rem
414
483
  }
415
484
 
485
+ .htw-text-5xl{
486
+ font-size:3rem;
487
+ line-height:1
488
+ }
489
+
416
490
  .htw-text-white{
417
491
  --tw-text-opacity:1;
418
492
  color:rgb(255 255 255 / var(--tw-text-opacity))
@@ -422,6 +496,10 @@
422
496
  color:inherit
423
497
  }
424
498
 
499
+ .htw-opacity-50{
500
+ opacity:0.5
501
+ }
502
+
425
503
  .htw-outline-none{
426
504
  outline:2px solid transparent;
427
505
  outline-offset:2px
@@ -483,11 +561,24 @@ body {
483
561
  background-color:rgb(209 250 229 / var(--tw-bg-opacity))
484
562
  }
485
563
 
564
+ .hover\:htw-text-primary-500:hover{
565
+ --tw-text-opacity:1;
566
+ color:rgb(16 185 129 / var(--tw-text-opacity))
567
+ }
568
+
569
+ .hover\:htw-opacity-100:hover{
570
+ opacity:1
571
+ }
572
+
486
573
  .focus\:htw-border-primary-500:focus{
487
574
  --tw-border-opacity:1;
488
575
  border-color:rgb(16 185 129 / var(--tw-border-opacity))
489
576
  }
490
577
 
578
+ .htw-group:hover .group-hover\:htw-block{
579
+ display:block
580
+ }
581
+
491
582
  .htw-group:active .group-active\:htw-bg-gray-500\/20{
492
583
  background-color:rgb(113 113 122 / 0.2)
493
584
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@histoire/controls",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Prebuilt controls components",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -30,23 +30,28 @@
30
30
  "*.postcss",
31
31
  "*.vue"
32
32
  ],
33
+ "dependencies": {
34
+ "@iconify/vue": "^3.2.1",
35
+ "@vueuse/core": "^8.2.5",
36
+ "floating-vue": "^2.0.0-beta.14"
37
+ },
33
38
  "devDependencies": {
34
39
  "@peeky/test": "^0.13.5",
35
- "@types/node": "^17.0.18",
40
+ "@types/node": "^17.0.23",
36
41
  "@vitejs/plugin-vue": "^2.3.1",
37
- "@vue/test-utils": "^2.0.0-rc.17",
38
- "@vueuse/core": "^8.1.1",
39
- "autoprefixer": "^10.4.2",
40
- "concurrently": "^7.0.0",
41
- "floating-vue": "^2.0.0-beta.6",
42
+ "@vue/test-utils": "^2.0.0-rc.19",
43
+ "@vueuse/core": "^8.2.5",
44
+ "autoprefixer": "^10.4.4",
45
+ "concurrently": "^7.1.0",
46
+ "floating-vue": "^2.0.0-beta.14",
42
47
  "histoire": "^0.2.2",
43
- "postcss": "^8.4.6",
44
- "postcss-import": "^14.0.2",
48
+ "postcss": "^8.4.12",
49
+ "postcss-import": "^14.1.0",
45
50
  "tailwindcss": "^3.0.23",
46
- "typescript": "^4.5.5",
47
- "vite": "^2.9.0",
51
+ "typescript": "^4.6.3",
52
+ "vite": "^2.9.1",
48
53
  "vue": "^3.2.31",
49
- "vue-tsc": "^0.33.0"
54
+ "vue-tsc": "^0.33.9"
50
55
  },
51
56
  "scripts": {
52
57
  "build": "rimraf dist && vite build && pnpm run build:types && pnpm run build:css",
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ export default {
3
+ name: 'HstCopyIcon',
4
+ }
5
+ </script>
6
+
7
+ <script lang="ts" setup>
8
+ import { Icon } from '@iconify/vue'
9
+ import { useClipboard } from '@vueuse/core'
10
+ import { VTooltip as vTooltip } from 'floating-vue'
11
+
12
+ const props = defineProps<{
13
+ content: string
14
+ }>()
15
+
16
+ const { copy, copied } = useClipboard()
17
+
18
+ const action = () => copy(props.content)
19
+ </script>
20
+
21
+ <template>
22
+ <Icon
23
+ v-tooltip="{
24
+ content: 'Copied!',
25
+ triggers: [],
26
+ shown: copied,
27
+ distance: 12,
28
+ delay: 0,
29
+ }"
30
+ icon="carbon:copy-file"
31
+ class="htw-w-4 htw-h-4 htw-opacity-50 hover:htw-opacity-100 hover:htw-text-primary-500 htw-cursor-pointer"
32
+ @click="action()"
33
+ />
34
+ </template>
@@ -0,0 +1,381 @@
1
+ <script lang="ts" setup>
2
+ import HstColorShades from './HstColorShades.vue'
3
+
4
+ const colors = {
5
+ slate: {
6
+ 50: '#f8fafc',
7
+ 100: '#f1f5f9',
8
+ 200: '#e2e8f0',
9
+ 300: '#cbd5e1',
10
+ 400: '#94a3b8',
11
+ 500: '#64748b',
12
+ 600: '#475569',
13
+ 700: '#334155',
14
+ 750: '#283548',
15
+ 800: '#1e293b',
16
+ 850: '#151f32',
17
+ 900: '#0f172a',
18
+ 950: '#09101f',
19
+ },
20
+ gray: {
21
+ 50: '#f9fafb',
22
+ 100: '#f3f4f6',
23
+ 200: '#e5e7eb',
24
+ 300: '#d1d5db',
25
+ 400: '#9ca3af',
26
+ 500: '#6b7280',
27
+ 600: '#4b5563',
28
+ 700: '#374151',
29
+ 750: '#2b3546',
30
+ 800: '#1f2937',
31
+ 850: '#18212f',
32
+ 900: '#111827',
33
+ 950: '#0c101d',
34
+ },
35
+ zinc: {
36
+ 50: '#fafafa',
37
+ 100: '#f4f4f5',
38
+ 200: '#e4e4e7',
39
+ 300: '#d4d4d8',
40
+ 400: '#a1a1aa',
41
+ 500: '#71717a',
42
+ 600: '#52525b',
43
+ 700: '#3f3f46',
44
+ 750: '#323238',
45
+ 800: '#27272a',
46
+ 850: '#1f1f21',
47
+ 900: '#18181b',
48
+ 950: '#101012',
49
+ },
50
+ neutral: {
51
+ 50: '#fafafa',
52
+ 100: '#f5f5f5',
53
+ 200: '#e5e5e5',
54
+ 300: '#d4d4d4',
55
+ 400: '#a3a3a3',
56
+ 500: '#737373',
57
+ 600: '#525252',
58
+ 700: '#404040',
59
+ 750: '#333333',
60
+ 800: '#262626',
61
+ 850: '#1f1f1f',
62
+ 900: '#171717',
63
+ 950: '#0f0f0f',
64
+ },
65
+ stone: {
66
+ 50: '#fafaf9',
67
+ 100: '#f5f5f4',
68
+ 200: '#e7e5e4',
69
+ 300: '#d6d3d1',
70
+ 400: '#a8a29e',
71
+ 500: '#78716c',
72
+ 600: '#57534e',
73
+ 700: '#44403c',
74
+ 750: '#363230',
75
+ 800: '#292524',
76
+ 850: '#211e1c',
77
+ 900: '#1c1917',
78
+ 950: '#171412',
79
+ },
80
+ red: {
81
+ 50: '#fef2f2',
82
+ 100: '#fee2e2',
83
+ 200: '#fecaca',
84
+ 300: '#fca5a5',
85
+ 400: '#f87171',
86
+ 500: '#ef4444',
87
+ 600: '#dc2626',
88
+ 700: '#b91c1c',
89
+ 800: '#991b1b',
90
+ 900: '#7f1d1d',
91
+ },
92
+ orange: {
93
+ 50: '#fff7ed',
94
+ 100: '#ffedd5',
95
+ 200: '#fed7aa',
96
+ 300: '#fdba74',
97
+ 400: '#fb923c',
98
+ 500: '#f97316',
99
+ 600: '#ea580c',
100
+ 700: '#c2410c',
101
+ 800: '#9a3412',
102
+ 900: '#7c2d12',
103
+ },
104
+ amber: {
105
+ 50: '#fffbeb',
106
+ 100: '#fef3c7',
107
+ 200: '#fde68a',
108
+ 300: '#fcd34d',
109
+ 400: '#fbbf24',
110
+ 500: '#f59e0b',
111
+ 600: '#d97706',
112
+ 700: '#b45309',
113
+ 800: '#92400e',
114
+ 900: '#78350f',
115
+ },
116
+ yellow: {
117
+ 50: '#fefce8',
118
+ 100: '#fef9c3',
119
+ 200: '#fef08a',
120
+ 300: '#fde047',
121
+ 400: '#facc15',
122
+ 500: '#eab308',
123
+ 600: '#ca8a04',
124
+ 700: '#a16207',
125
+ 800: '#854d0e',
126
+ 900: '#713f12',
127
+ },
128
+ lime: {
129
+ 50: '#f7fee7',
130
+ 100: '#ecfccb',
131
+ 200: '#d9f99d',
132
+ 300: '#bef264',
133
+ 400: '#a3e635',
134
+ 500: '#84cc16',
135
+ 600: '#65a30d',
136
+ 700: '#4d7c0f',
137
+ 800: '#3f6212',
138
+ 900: '#365314',
139
+ },
140
+ green: {
141
+ 50: '#f0fdf4',
142
+ 100: '#dcfce7',
143
+ 200: '#bbf7d0',
144
+ 300: '#86efac',
145
+ 400: '#4ade80',
146
+ 500: '#22c55e',
147
+ 600: '#16a34a',
148
+ 700: '#15803d',
149
+ 800: '#166534',
150
+ 900: '#14532d',
151
+ },
152
+ emerald: {
153
+ 50: '#ecfdf5',
154
+ 100: '#d1fae5',
155
+ 200: '#a7f3d0',
156
+ 300: '#6ee7b7',
157
+ 400: '#34d399',
158
+ 500: '#10b981',
159
+ 600: '#059669',
160
+ 700: '#047857',
161
+ 800: '#065f46',
162
+ 900: '#064e3b',
163
+ },
164
+ teal: {
165
+ 50: '#f0fdfa',
166
+ 100: '#ccfbf1',
167
+ 200: '#99f6e4',
168
+ 300: '#5eead4',
169
+ 400: '#2dd4bf',
170
+ 500: '#14b8a6',
171
+ 600: '#0d9488',
172
+ 700: '#0f766e',
173
+ 800: '#115e59',
174
+ 900: '#134e4a',
175
+ },
176
+ cyan: {
177
+ 50: '#ecfeff',
178
+ 100: '#cffafe',
179
+ 200: '#a5f3fc',
180
+ 300: '#67e8f9',
181
+ 400: '#22d3ee',
182
+ 500: '#06b6d4',
183
+ 600: '#0891b2',
184
+ 700: '#0e7490',
185
+ 800: '#155e75',
186
+ 900: '#164e63',
187
+ },
188
+ sky: {
189
+ 50: '#f0f9ff',
190
+ 100: '#e0f2fe',
191
+ 200: '#bae6fd',
192
+ 300: '#7dd3fc',
193
+ 400: '#38bdf8',
194
+ 500: '#0ea5e9',
195
+ 600: '#0284c7',
196
+ 700: '#0369a1',
197
+ 800: '#075985',
198
+ 900: '#0c4a6e',
199
+ },
200
+ blue: {
201
+ 50: '#eff6ff',
202
+ 100: '#dbeafe',
203
+ 200: '#bfdbfe',
204
+ 300: '#93c5fd',
205
+ 400: '#60a5fa',
206
+ 500: '#3b82f6',
207
+ 600: '#2563eb',
208
+ 700: '#1d4ed8',
209
+ 800: '#1e40af',
210
+ 900: '#1e3a8a',
211
+ },
212
+ indigo: {
213
+ 50: '#eef2ff',
214
+ 100: '#e0e7ff',
215
+ 200: '#c7d2fe',
216
+ 300: '#a5b4fc',
217
+ 400: '#818cf8',
218
+ 500: '#6366f1',
219
+ 600: '#4f46e5',
220
+ 700: '#4338ca',
221
+ 800: '#3730a3',
222
+ 900: '#312e81',
223
+ },
224
+ violet: {
225
+ 50: '#f5f3ff',
226
+ 100: '#ede9fe',
227
+ 200: '#ddd6fe',
228
+ 300: '#c4b5fd',
229
+ 400: '#a78bfa',
230
+ 500: '#8b5cf6',
231
+ 600: '#7c3aed',
232
+ 700: '#6d28d9',
233
+ 800: '#5b21b6',
234
+ 900: '#4c1d95',
235
+ },
236
+ purple: {
237
+ 50: '#faf5ff',
238
+ 100: '#f3e8ff',
239
+ 200: '#e9d5ff',
240
+ 300: '#d8b4fe',
241
+ 400: '#c084fc',
242
+ 500: '#a855f7',
243
+ 600: '#9333ea',
244
+ 700: '#7e22ce',
245
+ 800: '#6b21a8',
246
+ 900: '#581c87',
247
+ },
248
+ fuchsia: {
249
+ 50: '#fdf4ff',
250
+ 100: '#fae8ff',
251
+ 200: '#f5d0fe',
252
+ 300: '#f0abfc',
253
+ 400: '#e879f9',
254
+ 500: '#d946ef',
255
+ 600: '#c026d3',
256
+ 700: '#a21caf',
257
+ 800: '#86198f',
258
+ 900: '#701a75',
259
+ },
260
+ pink: {
261
+ 50: '#fdf2f8',
262
+ 100: '#fce7f3',
263
+ 200: '#fbcfe8',
264
+ 300: '#f9a8d4',
265
+ 400: '#f472b6',
266
+ 500: '#ec4899',
267
+ 600: '#db2777',
268
+ 700: '#be185d',
269
+ 800: '#9d174d',
270
+ 900: '#831843',
271
+ },
272
+ rose: {
273
+ 50: '#fff1f2',
274
+ 100: '#ffe4e6',
275
+ 200: '#fecdd3',
276
+ 300: '#fda4af',
277
+ 400: '#fb7185',
278
+ 500: '#f43f5e',
279
+ 600: '#e11d48',
280
+ 700: '#be123c',
281
+ 800: '#9f1239',
282
+ 900: '#881337',
283
+ },
284
+ }
285
+ </script>
286
+
287
+ <template>
288
+ <Story
289
+ title="design-tokens/HstColorShades"
290
+ responsive-disabled
291
+ >
292
+ <Variant title="default">
293
+ <HstColorShades
294
+ v-for="(shades, key) of colors"
295
+ :key="key"
296
+ :shades="shades"
297
+ :get-name="shade => `${key}-${shade}`"
298
+ />
299
+ </Variant>
300
+
301
+ <Variant title="background">
302
+ <HstColorShades
303
+ v-for="(shades, key) of colors"
304
+ :key="key"
305
+ :shades="shades"
306
+ :get-name="shade => `${key}-${shade}`"
307
+ >
308
+ <template #default="{ color }">
309
+ <div
310
+ class="htw-rounded htw-h-[100px]"
311
+ :style="{
312
+ backgroundColor: color,
313
+ }"
314
+ />
315
+ </template>
316
+ </HstColorShades>
317
+ </Variant>
318
+
319
+ <Variant title="text">
320
+ <HstColorShades
321
+ v-for="(shades, key) of colors"
322
+ :key="key"
323
+ :shades="shades"
324
+ :get-name="shade => `${key}-${shade}`"
325
+ >
326
+ <template #default="{ color }">
327
+ <div
328
+ class="htw-rounded htw-h-[100px] htw-text-5xl htw-flex htw-items-end"
329
+ :style="{
330
+ color: color,
331
+ }"
332
+ >
333
+ Aa
334
+ </div>
335
+ </template>
336
+ </HstColorShades>
337
+ </Variant>
338
+
339
+ <Variant title="border">
340
+ <HstColorShades
341
+ v-for="(shades, key) of colors"
342
+ :key="key"
343
+ :shades="shades"
344
+ :get-name="shade => `${key}-${shade}`"
345
+ >
346
+ <template #default="{ color }">
347
+ <div
348
+ class="htw-rounded htw-h-[100px] htw-border-solid htw-border-2"
349
+ :style="{
350
+ borderColor: color,
351
+ }"
352
+ />
353
+ </template>
354
+ </HstColorShades>
355
+ </Variant>
356
+
357
+ <Variant
358
+ title="with search"
359
+ :init-state="() => ({
360
+ search: '',
361
+ })"
362
+ >
363
+ <template #default="{ state }">
364
+ <HstColorShades
365
+ v-for="(shades, key) of colors"
366
+ :key="key"
367
+ :shades="shades"
368
+ :get-name="shade => `${key}-${shade}`"
369
+ :search="state.search"
370
+ />
371
+ </template>
372
+
373
+ <template #controls="{ state }">
374
+ <HstText
375
+ v-model="state.search"
376
+ title="Filter colors..."
377
+ />
378
+ </template>
379
+ </Variant>
380
+ </Story>
381
+ </template>
@@ -0,0 +1,80 @@
1
+ <script lang="ts">
2
+ export default {
3
+ name: 'HstColorShades',
4
+ }
5
+ </script>
6
+
7
+ <script lang="ts" setup>
8
+ import { computed, ref } from 'vue'
9
+ import HstCopyIcon from '../HstCopyIcon.vue'
10
+
11
+ const props = defineProps<{
12
+ shades: Record<string, string>
13
+ // @TODO report eslint bug
14
+ // eslint-disable-next-line func-call-spacing
15
+ getName?: (key: string, color: string) => string
16
+ search?: string
17
+ }>()
18
+
19
+ const shadesWithName = computed(() => {
20
+ const shades = props.shades
21
+ const getName = props.getName
22
+ return Object.entries(shades).map(([key, color]) => {
23
+ const name = getName ? getName(key, color) : key
24
+ return {
25
+ key,
26
+ color,
27
+ name,
28
+ }
29
+ })
30
+ })
31
+
32
+ const displayedShades = computed(() => {
33
+ let list = shadesWithName.value
34
+ if (props.search) {
35
+ const reg = new RegExp(props.search, 'i')
36
+ list = list.filter(({ name }) => reg.test(name))
37
+ }
38
+ return list
39
+ })
40
+ </script>
41
+
42
+ <template>
43
+ <div
44
+ v-if="displayedShades.length"
45
+ class="htw-grid htw-gap-4 htw-grid-cols-[repeat(auto-fill,minmax(100px,1fr))] htw-m-4"
46
+ >
47
+ <div
48
+ v-for="shade of displayedShades"
49
+ :key="shade.key"
50
+ class="htw-flex htw-flex-col htw-gap-2 htw-group"
51
+ >
52
+ <slot
53
+ :color="shade.color"
54
+ >
55
+ <div
56
+ class="htw-rounded-full htw-w-16 htw-h-16"
57
+ :style="{
58
+ backgroundColor: shade.color,
59
+ }"
60
+ />
61
+ </slot>
62
+ <div>
63
+ <div class="htw-flex htw-gap-1">
64
+ <pre class="htw-my-0">{{ shade.name }}</pre>
65
+ <HstCopyIcon
66
+ :content="shade.name"
67
+ class="htw-hidden group-hover:htw-block"
68
+ />
69
+ </div>
70
+ <div class="htw-flex htw-gap-1">
71
+ <pre class="htw-my-0 htw-opacity-50">{{ shade.color }}</pre>
72
+ <HstCopyIcon
73
+ :content="shade.color"
74
+ class="htw-hidden group-hover:htw-block"
75
+ />
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </template>