@policystudio/policy-studio-ui-vue 1.0.11 → 1.0.12
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/package.json +1 -1
- package/src/assets/scss/base.scss +7 -0
- package/src/assets/scss/tailwind.css +2328 -472
- package/src/components/buttons/PsButton.vue +12 -1
- package/src/components/controls/PsCheckbox.vue +26 -38
- package/src/components/controls/PsToggle.vue +39 -0
- package/src/components/forms/PsInput.vue +79 -0
- package/src/stories/Button.stories.js +2 -2
- package/src/stories/Checkbox.stories.js +7 -10
- package/src/stories/Colors.stories.mdx +55 -9
- package/src/stories/ElevationSystem.stories.mdx +7 -7
- package/src/stories/Input.stories.js +85 -0
- package/src/stories/Toggle.stories.js +22 -0
- package/src/stories/Typography.stories.mdx +87 -1
- package/tailwind.config.js +11 -9
|
@@ -54,6 +54,14 @@ export default {
|
|
|
54
54
|
},
|
|
55
55
|
disabled: {
|
|
56
56
|
type: [Boolean, String]
|
|
57
|
+
},
|
|
58
|
+
'text-color': {
|
|
59
|
+
type: String,
|
|
60
|
+
default: ''
|
|
61
|
+
},
|
|
62
|
+
color: {
|
|
63
|
+
type: String,
|
|
64
|
+
default: ''
|
|
57
65
|
}
|
|
58
66
|
},
|
|
59
67
|
data () {
|
|
@@ -67,7 +75,10 @@ export default {
|
|
|
67
75
|
if (this.size === 'small') sizeCss = 'psui-px-2 psui-py-psui-px psui-text-sm'
|
|
68
76
|
if (this.outline) return `${sizeCss} psui-bg-white psui-border ${this.disabled ? 'psui-border-gray-40 psui-text-gray-40' : 'psui-border-blue-60 psui-text-blue-60'}`
|
|
69
77
|
if (this.ghost) return `${sizeCss} ${this.disabled ? 'psui-bg-gray-20 psui-text-gray-40' : 'psui-bg-blue-20 psui-text-blue-60 active:psui-shadow-inner'}`
|
|
70
|
-
if (this.textOnly)
|
|
78
|
+
if (this.textOnly) {
|
|
79
|
+
const textCss = this.disabled ? 'psui-text-gray-40' : this.textColor.length > 0 ? `psui-text-${this.textColor}` : 'psui-text-blue-50 hover:psui-text-blue-60'
|
|
80
|
+
return `${sizeCss} ${textCss}`
|
|
81
|
+
}
|
|
71
82
|
if (this.disabled) return `${sizeCss} psui-bg-gray-20 psui-text-gray-40`
|
|
72
83
|
return `${sizeCss} psui-bg-blue-60 hover:psui-bg-blue-50 psui-text-white active:psui-shadow-inner`
|
|
73
84
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<label class="container">
|
|
2
|
+
<label class="container psui-pl-6" :class="[{ 'psui-text-gray-40': disabled }, { 'psui-text-gray-50': !disabled }, labelClasses]">
|
|
3
3
|
{{ label }}
|
|
4
4
|
<input
|
|
5
5
|
type="checkbox"
|
|
6
|
-
v-model="
|
|
6
|
+
v-model="model"
|
|
7
7
|
:disabled="disabled"
|
|
8
|
+
:value="inputValue"
|
|
8
9
|
/>
|
|
9
|
-
<span class="checkmark"></span>
|
|
10
|
+
<span class="checkmark psui-border-2" :class="classes" :style="getSize"></span>
|
|
10
11
|
</label>
|
|
11
12
|
</template>
|
|
12
13
|
|
|
@@ -15,68 +16,56 @@ export default {
|
|
|
15
16
|
name: 'PsCheckbox',
|
|
16
17
|
props: {
|
|
17
18
|
value: {
|
|
18
|
-
required: true
|
|
19
|
+
required: true,
|
|
19
20
|
},
|
|
21
|
+
inputValue: String,
|
|
20
22
|
label: {
|
|
21
23
|
type: String,
|
|
22
24
|
default: ''
|
|
23
25
|
},
|
|
24
|
-
bg: {
|
|
25
|
-
type: String,
|
|
26
|
-
default: 'blue-20'
|
|
27
|
-
},
|
|
28
|
-
type: {
|
|
29
|
-
type: String,
|
|
30
|
-
default: 'checkbox'
|
|
31
|
-
},
|
|
32
26
|
checkboxClasses: {
|
|
33
27
|
type: String,
|
|
34
|
-
default: '
|
|
28
|
+
default: 'psui-pl-8'
|
|
35
29
|
},
|
|
36
30
|
labelClasses: {
|
|
37
31
|
type: String,
|
|
38
|
-
default: '
|
|
32
|
+
default: ''
|
|
39
33
|
},
|
|
40
34
|
disabled: {
|
|
41
35
|
type: Boolean,
|
|
42
36
|
default: false
|
|
43
37
|
},
|
|
44
|
-
tooltip: {
|
|
45
|
-
type: [Object, Boolean, String, Promise],
|
|
46
|
-
default: false
|
|
47
|
-
},
|
|
48
|
-
prevent: {
|
|
49
|
-
default: false
|
|
50
|
-
},
|
|
51
38
|
size: {
|
|
52
|
-
default:
|
|
39
|
+
default: 18
|
|
53
40
|
}
|
|
54
41
|
},
|
|
55
42
|
computed: {
|
|
56
|
-
|
|
57
|
-
get
|
|
58
|
-
return this.value
|
|
43
|
+
model: {
|
|
44
|
+
get() {
|
|
45
|
+
return this.value;
|
|
59
46
|
},
|
|
60
|
-
set
|
|
61
|
-
console.log(newValue)
|
|
62
|
-
if(this.prevent) return
|
|
47
|
+
set(newValue) {
|
|
63
48
|
this.$emit('input', newValue)
|
|
64
49
|
this.$emit('change', newValue)
|
|
65
|
-
}
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
classes() {
|
|
53
|
+
return `${this.disabled ? 'psui-border-gray-40': 'psui-border-gray-50'} ${checkboxClasses}`
|
|
66
54
|
},
|
|
67
55
|
getSize() {
|
|
68
|
-
return {
|
|
56
|
+
return {
|
|
57
|
+
width: `${this.size}px`,
|
|
58
|
+
height: `${this.size}px`
|
|
59
|
+
}
|
|
69
60
|
}
|
|
70
61
|
}
|
|
71
62
|
}
|
|
72
63
|
</script>
|
|
73
64
|
|
|
74
|
-
<style>
|
|
65
|
+
<style scoped>
|
|
75
66
|
.container {
|
|
76
67
|
display: block;
|
|
77
68
|
position: relative;
|
|
78
|
-
padding-left: 35px;
|
|
79
|
-
margin-bottom: 12px;
|
|
80
69
|
cursor: pointer;
|
|
81
70
|
-webkit-user-select: none;
|
|
82
71
|
-moz-user-select: none;
|
|
@@ -99,7 +88,6 @@ export default {
|
|
|
99
88
|
height: 18px;
|
|
100
89
|
width: 18px;
|
|
101
90
|
background-color: #fff;
|
|
102
|
-
border: solid 2px #A2ACB7;
|
|
103
91
|
border-radius: 2px;
|
|
104
92
|
}
|
|
105
93
|
|
|
@@ -119,10 +107,10 @@ export default {
|
|
|
119
107
|
}
|
|
120
108
|
|
|
121
109
|
.container .checkmark:after {
|
|
122
|
-
left:
|
|
123
|
-
top:
|
|
124
|
-
width:
|
|
125
|
-
height:
|
|
110
|
+
left: 35%;
|
|
111
|
+
top: 8%;
|
|
112
|
+
width: 35%;
|
|
113
|
+
height: 65%;
|
|
126
114
|
border: solid white;
|
|
127
115
|
border-radius: 1px;
|
|
128
116
|
border-width: 0 2px 2px 0;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="psui-rounded-sm psui-inline-flex psui-bg-gray-10 wrapper psui-gap-x-px" role="group">
|
|
3
|
+
<button
|
|
4
|
+
v-for="(item, index) in items"
|
|
5
|
+
:key="index"
|
|
6
|
+
@click="selectOption(item)"
|
|
7
|
+
type="button"
|
|
8
|
+
class="psui-inline-flex psui-rounded-sm psui-text-small psui-text-blue-60 psui-px-2"
|
|
9
|
+
:class="{'psui-bg-blue-60 psui-text-white psui-font-bold': selected === item}"
|
|
10
|
+
>
|
|
11
|
+
{{ item }}
|
|
12
|
+
</button>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script>
|
|
17
|
+
export default {
|
|
18
|
+
name: 'PsSlider',
|
|
19
|
+
props: {
|
|
20
|
+
items: {
|
|
21
|
+
type: Array,
|
|
22
|
+
required: true
|
|
23
|
+
},
|
|
24
|
+
selected: {},
|
|
25
|
+
},
|
|
26
|
+
methods: {
|
|
27
|
+
selectOption(item) {
|
|
28
|
+
this.$emit('update:selected', item)
|
|
29
|
+
this.$emit('change', item)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<style>
|
|
36
|
+
.wrapper {
|
|
37
|
+
padding: 2px;
|
|
38
|
+
}
|
|
39
|
+
</style>
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<div v-if="label" class="psui-font-bold psui-text-gray-80">{{ label }}</div>
|
|
4
|
+
<div class="psui-relative">
|
|
5
|
+
<div class="psui-absolute psui-inset-y-0 psui-left-0 psui-pl-2 psui-flex psui-items-center psui-pointer-events-none" v-if="this.$slots.prepend">
|
|
6
|
+
<slot name="prepend"></slot>
|
|
7
|
+
</div>
|
|
8
|
+
<input
|
|
9
|
+
:type="type"
|
|
10
|
+
:placeholder="placeholder"
|
|
11
|
+
:disabled="disabled"
|
|
12
|
+
:aria-required="required"
|
|
13
|
+
:aria-invalid="validation.hasError"
|
|
14
|
+
:class="[getInputClasses, { 'psui-border-red' : validation.hasError }]"
|
|
15
|
+
/>
|
|
16
|
+
<div class="psui-absolute psui-inset-y-0 psui-right-0 psui-pr-2 psui-flex psui-items-center" v-if="this.$slots.append">
|
|
17
|
+
<slot name="append"></slot>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div v-if="hint && !validation.hasError" class="psui-text-gray-50 psui-text-xsmall">{{ hint }}</div>
|
|
21
|
+
<div v-if="validation.hasError && validation.label" class="psui-text-red psui-text-xsmall">{{ validation.label }}</div>
|
|
22
|
+
</div>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<script>
|
|
26
|
+
export default {
|
|
27
|
+
name: 'PsInput',
|
|
28
|
+
props: {
|
|
29
|
+
type: {
|
|
30
|
+
type: String,
|
|
31
|
+
default: 'text'
|
|
32
|
+
},
|
|
33
|
+
required: {
|
|
34
|
+
type: Boolean
|
|
35
|
+
},
|
|
36
|
+
placeholder: {
|
|
37
|
+
type: String
|
|
38
|
+
},
|
|
39
|
+
label: {
|
|
40
|
+
type: String
|
|
41
|
+
},
|
|
42
|
+
hint: {
|
|
43
|
+
type: String
|
|
44
|
+
},
|
|
45
|
+
disabled: {
|
|
46
|
+
type: Boolean,
|
|
47
|
+
default: false
|
|
48
|
+
},
|
|
49
|
+
mini: {
|
|
50
|
+
type: Boolean,
|
|
51
|
+
default: false
|
|
52
|
+
},
|
|
53
|
+
validation: {
|
|
54
|
+
type: Object,
|
|
55
|
+
default: () => {
|
|
56
|
+
return { hasError: false, checked: false, filled: false, required: false }
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
computed: {
|
|
61
|
+
getInputClasses() {
|
|
62
|
+
return `${this.getPadding} ${this.getText} psui-text-gray-60 psui-bg-white psui-w-full psui-border psui-border-gray-30 psui-rounded-md psui-block hover:psui-border-blue-50 focus:psui-border-blue-50`
|
|
63
|
+
},
|
|
64
|
+
getText() {
|
|
65
|
+
return this.mini ? 'psui-text-small' : ''
|
|
66
|
+
},
|
|
67
|
+
getPadding() {
|
|
68
|
+
return this.mini ? 'psui-px-2 mini-p' : 'psui-py-2 psui-px-4'
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<style>
|
|
75
|
+
.mini-p {
|
|
76
|
+
padding-top: 6px;
|
|
77
|
+
padding-bottom: 6px;
|
|
78
|
+
}
|
|
79
|
+
</style>
|
|
@@ -23,22 +23,19 @@ const Template = (args, { argTypes }) => ({
|
|
|
23
23
|
},
|
|
24
24
|
template: `
|
|
25
25
|
<div>
|
|
26
|
-
<PsCheckbox
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
:label="item.label"
|
|
31
|
-
:value.sync="item.id"
|
|
32
|
-
v-model="selected"
|
|
33
|
-
/>
|
|
34
|
-
{{ selected }}
|
|
26
|
+
<PsCheckbox v-bind="$props" label="Label 1" inputValue="1" v-model="selected" />
|
|
27
|
+
<PsCheckbox v-bind="$props" label="Label 2" inputValue="2" v-model="selected" />
|
|
28
|
+
<PsCheckbox v-bind="$props" label="Label 3" inputValue="3" v-model="selected" />
|
|
29
|
+
<p>Checked: {{ selected }}</p>
|
|
35
30
|
</div>
|
|
36
31
|
`
|
|
37
32
|
});
|
|
38
33
|
|
|
39
34
|
export const Default = Template.bind({});
|
|
40
35
|
Default.args = {
|
|
36
|
+
size: 18,
|
|
37
|
+
disabled: false,
|
|
41
38
|
label: 'Label',
|
|
42
|
-
|
|
39
|
+
labelClasses: '',
|
|
43
40
|
};
|
|
44
41
|
|
|
@@ -10,13 +10,59 @@ import { Canvas, Meta, Story } from '@storybook/addon-docs';
|
|
|
10
10
|
Out colors are designed to be harmonious, ensure accessible text, and distinguish UI elements and surfaces from one another. The support colors are used as a visual support to communicate and provide better and more meaningful feedback.
|
|
11
11
|
|
|
12
12
|
## Blue
|
|
13
|
+
<div class="psui-flex">
|
|
14
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-blue-80">Blue 80</div>
|
|
15
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-blue-70">Blue 70</div>
|
|
16
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-blue-60">Blue 60</div>
|
|
17
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-blue-50">Blue 50</div>
|
|
18
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-blue-70 psui-bg-blue-20">Blue 20</div>
|
|
19
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-blue-70 psui-bg-blue-10">Blue 10</div>
|
|
20
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-blue-70 psui-bg-white ">White</div>
|
|
21
|
+
</div>
|
|
13
22
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<div class="psui-p-2 psui-h-
|
|
17
|
-
<div class="psui-p-2 psui-h-
|
|
18
|
-
<div class="psui-p-2 psui-h-
|
|
19
|
-
<div class="psui-p-2 psui-h-
|
|
20
|
-
<div class="psui-p-2 psui-h-
|
|
21
|
-
<div class="psui-p-2 psui-h-
|
|
22
|
-
</div>
|
|
23
|
+
## Gray
|
|
24
|
+
<div class="psui-flex">
|
|
25
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-gray-80">Gray 80</div>
|
|
26
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-gray-70">Gray 70</div>
|
|
27
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-gray-60">Gray 60</div>
|
|
28
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-gray-50">Gray 50</div>
|
|
29
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-gray-40">Gray 40</div>
|
|
30
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-gray-50 psui-bg-gray-30">Gray 30</div>
|
|
31
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-gray-50 psui-bg-gray-20">Gray 20</div>
|
|
32
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-gray-50 psui-bg-gray-10">Gray 10</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
## Yellow
|
|
36
|
+
<div class="psui-flex">
|
|
37
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-yellow-80">Yellow 80</div>
|
|
38
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-yellow-70">Yellow 70</div>
|
|
39
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-yellow-20">Yellow 20</div>
|
|
40
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-yellow-20 psui-bg-yellow-10">Yellow 10</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
## Green
|
|
44
|
+
<div class="psui-flex">
|
|
45
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-green-80">Green 80</div>
|
|
46
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-green-70">Green 70</div>
|
|
47
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-green-20">Green 20</div>
|
|
48
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-green-20 psui-bg-green-10">Green 10</div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
## Red
|
|
52
|
+
<div class="psui-flex">
|
|
53
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-red-80">Red 80</div>
|
|
54
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-red-70">Red 70</div>
|
|
55
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-red-20">Red 20</div>
|
|
56
|
+
<div class="psui-p-2 psui-h-24 psui-w-32 psui-text-red-20 psui-bg-red-10">Red 10</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
## Chart colors
|
|
60
|
+
<div class="psui-flex">
|
|
61
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-sky">Sky</div>
|
|
62
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-teal">Teal</div>
|
|
63
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-emerald">Emerald</div>
|
|
64
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-mustard">Mustard</div>
|
|
65
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-orange">Orange</div>
|
|
66
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-pink">Pink</div>
|
|
67
|
+
<div class="psui-float-left psui-p-2 psui-h-24 psui-w-32 psui-text-white psui-bg-purple">Purple</div>
|
|
68
|
+
</div>
|
|
@@ -31,11 +31,11 @@ The shadows in our elements are projected by these two light sources: main light
|
|
|
31
31
|
|
|
32
32
|
## 2. Elevation system
|
|
33
33
|
Shadows provide cues about depth, direction of movement, and surface edges. A surface’s shadow is determined by its elevation and relationship to other surfaces.
|
|
34
|
-
<div class="psui-grid grid-cols-2 psui-gap-6 psui-p-6 psui-bg-gray-20">
|
|
35
|
-
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-shadow-
|
|
36
|
-
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-
|
|
37
|
-
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow">Elevation 10</div>
|
|
38
|
-
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-
|
|
39
|
-
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-
|
|
40
|
-
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-
|
|
34
|
+
<div class="psui-grid psui-grid-cols-2 psui-gap-6 psui-p-6 psui-bg-gray-20">
|
|
35
|
+
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-shadow-elevation--5">Elevation -5</div>
|
|
36
|
+
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-elevation-5">Elevation 5</div>
|
|
37
|
+
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-elevation-10">Elevation 10</div>
|
|
38
|
+
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-elevation-20">Elevation 20</div>
|
|
39
|
+
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-elevation-30">Elevation 30</div>
|
|
40
|
+
<div class="psui-rounded-md psui-p-8 psui-h-20 psui-bg-white psui-shadow-elevation-40">Elevation 40</div>
|
|
41
41
|
</div>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import PsInput from '../components/forms/PsInput.vue';
|
|
2
|
+
export default {
|
|
3
|
+
title: 'Components/Input',
|
|
4
|
+
component: PsInput,
|
|
5
|
+
argTypes: {
|
|
6
|
+
disabled: { control: 'boolean' },
|
|
7
|
+
required: { control: 'boolean' },
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const TemplateDefault = (args, { argTypes }) => ({
|
|
12
|
+
props: Object.keys(argTypes),
|
|
13
|
+
components: { PsInput },
|
|
14
|
+
data: () => {
|
|
15
|
+
return {
|
|
16
|
+
validator: {
|
|
17
|
+
hasError: true,
|
|
18
|
+
label: 'Error message!'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
template: `
|
|
23
|
+
<div class="psui-p-8 psui-bg-gray-10">
|
|
24
|
+
<PsInput v-bind="$props" />
|
|
25
|
+
<PsInput v-bind="$props" class="psui-mt-8" :validator="validator" />
|
|
26
|
+
</div>
|
|
27
|
+
`
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const TemplateSlots = (args, { argTypes }) => ({
|
|
31
|
+
props: Object.keys(argTypes),
|
|
32
|
+
components: { PsInput },
|
|
33
|
+
template: `
|
|
34
|
+
<div class="psui-p-8 psui-bg-gray-10">
|
|
35
|
+
<PsInput v-bind="$props" class="psui-mb-4">
|
|
36
|
+
<template v-slot:append>
|
|
37
|
+
ft²
|
|
38
|
+
</template>
|
|
39
|
+
</PsInput>
|
|
40
|
+
<PsInput v-bind="$props" class="psui-mb-4">
|
|
41
|
+
<template v-slot:prepend>
|
|
42
|
+
ft²
|
|
43
|
+
</template>
|
|
44
|
+
</PsInput>
|
|
45
|
+
<PsInput v-bind="$props" class="psui-mb-4">
|
|
46
|
+
<template v-slot:prepend>
|
|
47
|
+
ft²
|
|
48
|
+
</template>
|
|
49
|
+
<template v-slot:append>
|
|
50
|
+
ft²
|
|
51
|
+
</template>
|
|
52
|
+
</PsInput>
|
|
53
|
+
</div>
|
|
54
|
+
`
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export const InputText = TemplateDefault.bind({});
|
|
58
|
+
InputText.args = {
|
|
59
|
+
label: 'Label',
|
|
60
|
+
placeholder: 'Placeholder',
|
|
61
|
+
hint: 'Optional Assistive text',
|
|
62
|
+
disabled: false,
|
|
63
|
+
required: false,
|
|
64
|
+
mini: false,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const InputPassword = TemplateDefault.bind({});
|
|
68
|
+
InputPassword.args = {
|
|
69
|
+
type: 'password',
|
|
70
|
+
label: 'Password',
|
|
71
|
+
hint: 'Optional Assistive text',
|
|
72
|
+
disabled: false,
|
|
73
|
+
required: false,
|
|
74
|
+
mini: false,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const InputSlots = TemplateSlots.bind({});
|
|
78
|
+
InputSlots.args = {
|
|
79
|
+
label: 'Label',
|
|
80
|
+
placeholder: 'Placeholder',
|
|
81
|
+
hint: 'Optional Assistive text',
|
|
82
|
+
disabled: false,
|
|
83
|
+
required: false,
|
|
84
|
+
mini: false,
|
|
85
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import PsToggle from '../components/controls/PsToggle.vue';
|
|
2
|
+
export default {
|
|
3
|
+
title: 'Components/Toggle',
|
|
4
|
+
component: PsToggle,
|
|
5
|
+
argTypes: {},
|
|
6
|
+
};
|
|
7
|
+
const items = ['Option 1', 'Option 2', 'Option 3']
|
|
8
|
+
const selected = 'Option 2'
|
|
9
|
+
|
|
10
|
+
const Template = (args, { argTypes }) => ({
|
|
11
|
+
props: Object.keys(argTypes),
|
|
12
|
+
components: { PsToggle },
|
|
13
|
+
template: `
|
|
14
|
+
<PsToggle v-bind="$props" :selected.sync="selected" />
|
|
15
|
+
`
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const Default = Template.bind({});
|
|
19
|
+
Default.args = {
|
|
20
|
+
items: items,
|
|
21
|
+
selected: selected
|
|
22
|
+
};
|
|
@@ -68,7 +68,7 @@ import { Meta } from '@storybook/addon-docs';
|
|
|
68
68
|
|
|
69
69
|
.link-item img {
|
|
70
70
|
height: 40px;
|
|
71
|
-
width: 40px;
|
|
71
|
+
width: 40px;
|
|
72
72
|
margin-right: 15px;
|
|
73
73
|
flex: none;
|
|
74
74
|
}
|
|
@@ -118,3 +118,89 @@ We use the Lato typographic family: https://fonts.google.com/specimen/Lato
|
|
|
118
118
|
### 1.2. Font sizes
|
|
119
119
|
Keeping typography consistent and sticking to logical hierarchies ensures that elements in the UI are clear and easily recognizable when scanning the page. Text sizes, styles, and layouts were selected to balance content and UI and to foster familiarity.
|
|
120
120
|
|
|
121
|
+
<table>
|
|
122
|
+
<tr>
|
|
123
|
+
<td class="psui-w-48">
|
|
124
|
+
<p class="psui-font-bold">Headline 1</p>
|
|
125
|
+
psui-text-h1
|
|
126
|
+
</td>
|
|
127
|
+
<td class="psui-text-h1">The lazy fox jumped overthe brown dog</td>
|
|
128
|
+
</tr>
|
|
129
|
+
<tr>
|
|
130
|
+
<td>
|
|
131
|
+
<p class="psui-font-bold">Headline 2</p>
|
|
132
|
+
psui-text-h2
|
|
133
|
+
</td>
|
|
134
|
+
<td class="psui-text-h2">The lazy fox jumped over the brown dog</td>
|
|
135
|
+
</tr>
|
|
136
|
+
<tr>
|
|
137
|
+
<td>
|
|
138
|
+
<p class="psui-font-bold">Headline 3</p>
|
|
139
|
+
psui-text-h3
|
|
140
|
+
</td>
|
|
141
|
+
<td class="psui-text-h3">The lazy fox jumped over the brown dog</td>
|
|
142
|
+
</tr>
|
|
143
|
+
<tr>
|
|
144
|
+
<td>
|
|
145
|
+
<p class="psui-font-bold">Headline 4</p>
|
|
146
|
+
psui-text-h4
|
|
147
|
+
</td>
|
|
148
|
+
<td class="psui-text-h4">The lazy fox jumped over the brown dog</td>
|
|
149
|
+
</tr>
|
|
150
|
+
<tr>
|
|
151
|
+
<td>
|
|
152
|
+
<p class="psui-font-bold">Headline 5</p>
|
|
153
|
+
psui-text-h5
|
|
154
|
+
</td>
|
|
155
|
+
<td class="psui-text-h5">The lazy fox jumped over the brown dog</td>
|
|
156
|
+
</tr>
|
|
157
|
+
<tr>
|
|
158
|
+
<td>
|
|
159
|
+
<p class="psui-font-bold">Headline 6</p>
|
|
160
|
+
psui-text-h6
|
|
161
|
+
</td>
|
|
162
|
+
<td class="psui-text-h6">The lazy fox jumped over the brown dog</td>
|
|
163
|
+
</tr>
|
|
164
|
+
<tr>
|
|
165
|
+
<td>
|
|
166
|
+
<p class="psui-font-bold">Paragraph</p>
|
|
167
|
+
psui-text-p
|
|
168
|
+
</td>
|
|
169
|
+
<td class="psui-text-p">
|
|
170
|
+
This tool allows you to dive into the cost-effectiveness findings relevant to your City or County. We’ve also embedded explanations of terms and concepts throughout the tool, as well as much of the supplementary information contained in the cost-effectiveness studies.
|
|
171
|
+
</td>
|
|
172
|
+
</tr>
|
|
173
|
+
<tr>
|
|
174
|
+
<td>
|
|
175
|
+
<p class="psui-font-bold">Small</p>
|
|
176
|
+
psui-text-small
|
|
177
|
+
</td>
|
|
178
|
+
<td class="psui-text-small">
|
|
179
|
+
This tool allows you to dive into the cost-effectiveness findings relevant to your City or County. We’ve also embedded explanations of terms and concepts throughout the tool, as well as much of the supplementary information contained in the cost-effectiveness studies.
|
|
180
|
+
</td>
|
|
181
|
+
</tr>
|
|
182
|
+
<tr>
|
|
183
|
+
<td>
|
|
184
|
+
<p class="psui-font-bold">XSmall</p>
|
|
185
|
+
psui-text-xsmall
|
|
186
|
+
</td>
|
|
187
|
+
<td class="psui-text-xsmall">
|
|
188
|
+
This tool allows you to dive into the cost-effectiveness findings relevant to your City or County. We’ve also embedded explanations of terms and concepts throughout the tool, as well as much of the supplementary information contained in the cost-effectiveness studies.
|
|
189
|
+
</td>
|
|
190
|
+
</tr>
|
|
191
|
+
<tr>
|
|
192
|
+
<td>
|
|
193
|
+
<p class="psui-font-bold">Accent</p>
|
|
194
|
+
psui-text-accent
|
|
195
|
+
</td>
|
|
196
|
+
<td class="psui-text-accent">UPPERCASE THE LAZY FOX JUNPED OVER THE BROWN DOG</td>
|
|
197
|
+
</tr>
|
|
198
|
+
<tr>
|
|
199
|
+
<td>
|
|
200
|
+
<p class="psui-font-bold">Accent Small</p>
|
|
201
|
+
psui-text-accent-small
|
|
202
|
+
</td>
|
|
203
|
+
<td class="psui-text-accent-small">UPPERCASE THE LAZY FOX JUNPED OVER THE BROWN DOG</td>
|
|
204
|
+
</tr>
|
|
205
|
+
</table>
|
|
206
|
+
|
package/tailwind.config.js
CHANGED
|
@@ -37,18 +37,20 @@ module.exports = {
|
|
|
37
37
|
'red-70':'#AA3937',
|
|
38
38
|
'red-80':'#832F2E',
|
|
39
39
|
|
|
40
|
-
'
|
|
40
|
+
'sky': '#518BE2',
|
|
41
41
|
'teal': '#57C0BA',
|
|
42
42
|
'emerald': '#8CCA82',
|
|
43
43
|
'mustard': '#E9CF74',
|
|
44
|
-
'orange': '#FF906D'
|
|
44
|
+
'orange': '#FF906D',
|
|
45
|
+
'pink': '#FF77B8',
|
|
46
|
+
'purple': '#9278C9'
|
|
45
47
|
},
|
|
46
48
|
fontFamily: {
|
|
47
49
|
'sans': ['Lato'],
|
|
48
50
|
},
|
|
49
51
|
fontSize: {
|
|
50
52
|
small: ['14px', '130%'],
|
|
51
|
-
|
|
53
|
+
xsmall: ['12px', '130%'],
|
|
52
54
|
accent: ['14px', '130%', { letterSpacing: '0.6px' }],
|
|
53
55
|
accentSmall: ['12px', '130%', { letterSpacing: '0.6px' }],
|
|
54
56
|
p: ['16px', '120%'],
|
|
@@ -60,12 +62,12 @@ module.exports = {
|
|
|
60
62
|
h6: ['17px', '120%'],
|
|
61
63
|
},
|
|
62
64
|
boxShadow: {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
'elevation--5': '0px 1px 0px #FFFFFF, inset 0px 1px 2px rgba(0, 0, 0, 0.1)',
|
|
66
|
+
'elevation-5': '0px 0px 4px rgba(0, 0, 0, 0.03), 0px 1px 2px rgba(0, 0, 0, 0.1)',
|
|
67
|
+
'elevation-10': '0px 0px 8px rgba(0, 0, 0, 0.04), 0px 2px 5px rgba(0, 0, 0, 0.08)',
|
|
68
|
+
'elevation-20': '0px 0px 8px rgba(0, 0, 0, 0.04), 0px 5px 6px rgba(0, 0, 0, 0.1)',
|
|
69
|
+
'elevation-30': '0px 0px 8px rgba(0, 0, 0, 0.05), 0px 10px 15px rgba(0, 0, 0, 0.15)',
|
|
70
|
+
'elevation-40': '0px 0px 20px rgba(0, 0, 0, 0.05), 0px 30px 60px rgba(0, 0, 0, 0.2)',
|
|
69
71
|
sm: '0px 0px 4px rgba(0, 0, 0, 0.03), 0px 1px 2px rgba(0, 0, 0, 0.1)',
|
|
70
72
|
default: '0px 0px 8px rgba(0, 0, 0, 0.04), 0px 2px 5px rgba(0, 0, 0, 0.08)',
|
|
71
73
|
md: '0px 0px 8px rgba(0, 0, 0, 0.04), 0px 5px 6px rgba(0, 0, 0, 0.1)',
|