@shoprenter/sr-styleguide 1.1.0 → 1.3.0

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 (49) hide show
  1. package/README.md +146 -16
  2. package/dist/demo/src/demo_bootstrap_js.css +26 -28
  3. package/dist/demo/src/demo_bootstrap_js.js +1 -1
  4. package/dist/{demo/src/index.html → index.html} +1 -1
  5. package/dist/stylesheet/sr-styleguide.css +6 -6
  6. package/package.json +1 -2
  7. package/src/components/app-containers/SrModule/SrModule.scss +1 -1
  8. package/src/components/app-containers/SrModule/SrModule.vue +19 -8
  9. package/src/components/app-containers/SrPage/SrPage.vue +19 -16
  10. package/src/components/app-containers/scope.js +12 -0
  11. package/src/components/breadcrumbs/SrBreadcrumbs/SrBreadcrumbs.scss +47 -0
  12. package/src/components/breadcrumbs/SrBreadcrumbs/SrBreadcrumbs.vue +45 -0
  13. package/src/components/breadcrumbs/tests/SrBreadcrumbs.spec.js +109 -0
  14. package/src/components/form/SrFormDivider/SrFormDivider.scss +4 -0
  15. package/src/components/form/SrFormDivider/SrFormDivider.vue +9 -0
  16. package/src/components/form/SrFormRow/SrFormRow.scss +21 -21
  17. package/src/components/form/SrFormRow/SrFormRow.vue +3 -2
  18. package/src/components/inputs/SrDatePicker/SrDatePicker.vue +4 -1
  19. package/src/components/inputs/SrSelect/SrSelect.vue +8 -1
  20. package/src/components/inputs/SrSwitch/SrSwitch.vue +0 -1
  21. package/src/components/inputs/SrTextarea/SrTextarea.vue +20 -0
  22. package/src/components/layouts/slim/SrSlimHeading/SrSlimHeading.scss +9 -0
  23. package/src/components/layouts/slim/SrSlimHeading/SrSlimHeading.vue +2 -2
  24. package/src/components/layouts/slim/SrSlimLayout/SrSlimLayout.vue +8 -0
  25. package/src/components/layouts/standard/SrStandardLayout/SrStandardLayout.scss +4 -0
  26. package/src/components/layouts/standard/SrStandardLayout/SrStandardLayout.vue +21 -0
  27. package/src/components/progress-indicators/SrFinitePreloader/SrFinitePreloader.vue +26 -0
  28. package/src/components/progress-indicators/SrFiniteProgressBar/SrFiniteProgressBar.scss +3 -0
  29. package/src/components/progress-indicators/SrFiniteProgressBar/SrFiniteProgressBar.vue +29 -0
  30. package/src/components/progress-indicators/SrInfinitePreloader/SrInfinitePreloader.vue +22 -0
  31. package/src/components/tables/SrSimpleTableFilterTd/SrSimpleTableFilterTd.vue +27 -0
  32. package/src/components/tabs/SrTabsItems/SrTabsItems.vue +1 -1
  33. package/src/plugins/component-library/index.js +6 -4
  34. package/src/plugins/component-library/library/SrBreadcrumbs.js +7 -0
  35. package/src/plugins/component-library/library/{SrFormRow.js → SrForm.js} +2 -0
  36. package/src/plugins/component-library/library/SrInputs.js +2 -0
  37. package/src/plugins/component-library/library/SrLayouts.js +4 -0
  38. package/src/plugins/component-library/library/SrProgressIndicators.js +17 -0
  39. package/src/plugins/component-library/library/SrTables.js +2 -1
  40. package/src/plugins/vuetify/preset/icons/index.js +4 -0
  41. package/src/plugins/vuetify/preset/locale/sr-en.js +2 -1
  42. package/src/plugins/vuetify/preset/locale/sr-hu.js +2 -1
  43. package/src/plugins/vuetify/preset/style/scss/components/_table.scss +7 -1
  44. package/src/plugins/vuetify/preset/variables.scss +2 -2
  45. package/src/plugins/component-library/library/SrMilestoneIndicators.js +0 -11
  46. /package/src/components/{milestone-indicators → progress-indicators}/multi-step-progress-bar/SrMultiStepProgressBar/SrMultiStepProgressBar.scss +0 -0
  47. /package/src/components/{milestone-indicators → progress-indicators}/multi-step-progress-bar/SrMultiStepProgressBar/SrMultiStepProgressBar.vue +0 -0
  48. /package/src/components/{milestone-indicators → progress-indicators}/multi-step-progress-bar/SrProgressBarStep/SrProgressBarStep.scss +0 -0
  49. /package/src/components/{milestone-indicators → progress-indicators}/multi-step-progress-bar/SrProgressBarStep/SrProgressBarStep.vue +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shoprenter/sr-styleguide",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "",
5
5
  "main": "./src/index.js",
6
6
  "files": [
@@ -44,7 +44,6 @@
44
44
  "sass": "^1.85.1",
45
45
  "sass-loader": "^16.0.5",
46
46
  "style-loader": "^4.0.0",
47
- "tiny-emitter": "^2.1.0",
48
47
  "vue": "^2.6.11",
49
48
  "vue-jest": "^3.0.7",
50
49
  "vue-loader": "^15.11.1",
@@ -1,4 +1,4 @@
1
- #sr-styleguide:has(div.new-style > .sr-module) {
1
+ div:has(div.new-style > .sr-module) {
2
2
  overflow-y:auto;
3
3
  }
4
4
 
@@ -1,17 +1,28 @@
1
1
  <template>
2
- <div id="sr-styleguide">
3
- <div class="new-style">
4
- <v-app class="sr-module">
5
- <v-main>
6
- <slot />
7
- </v-main>
8
- </v-app>
2
+ <div v-bind="$attrs">
3
+ <div v-bind:[attribute]="value">
4
+ <div class="new-style">
5
+ <v-app class="sr-module">
6
+ <v-main>
7
+ <slot/>
8
+ </v-main>
9
+ </v-app>
10
+ </div>
9
11
  </div>
10
12
  </div>
11
13
  </template>
12
14
 
13
15
  <script>
14
16
  export default {
15
- name: 'SrModule'
17
+ name: 'SrModule',
18
+ inheritAttrs: false,
19
+ data () {
20
+ const { attribute, value } = require('../scope')
21
+
22
+ return {
23
+ attribute,
24
+ value
25
+ }
26
+ }
16
27
  }
17
28
  </script>
@@ -1,25 +1,28 @@
1
1
  <template>
2
- <div id="sr-styleguide">
3
- <div class="new-style">
4
- <v-app class="sr-page">
5
- <v-row>
6
- <v-col cols="6">
7
- <!--- breadcrumbs placeholder -->
8
- </v-col>
9
- <v-col cols ="6" class="text-right">
10
- <sr-help-button/>
11
- </v-col>
12
- </v-row>
13
- <v-main>
14
- <slot />
15
- </v-main>
16
- </v-app>
2
+ <div v-bind="$attrs">
3
+ <div v-bind:[attribute]="value">
4
+ <div class="new-style">
5
+ <v-app class="sr-page">
6
+ <v-main>
7
+ <slot />
8
+ </v-main>
9
+ </v-app>
10
+ </div>
17
11
  </div>
18
12
  </div>
19
13
  </template>
20
14
 
21
15
  <script>
22
16
  export default {
23
- name: 'SrPage'
17
+ name: 'SrPage',
18
+ inheritAttrs: false,
19
+ data () {
20
+ const { attribute, value } = require('../scope')
21
+
22
+ return {
23
+ attribute,
24
+ value
25
+ }
26
+ }
24
27
  }
25
28
  </script>
@@ -0,0 +1,12 @@
1
+ const attribute = 'id'
2
+
3
+ const value = addVersionTo('sr-styleguide')
4
+
5
+ const selector = '#' + value
6
+
7
+ function addVersionTo (value) {
8
+ const currentVersion = require('../../../package.json').version.toString()
9
+ return value + '-' + currentVersion.replaceAll('.', '-')
10
+ }
11
+
12
+ module.exports = { attribute, value, selector }
@@ -0,0 +1,47 @@
1
+ .admin-breadcrumbs {
2
+ padding: 0;
3
+ padding-left: 0 !important;
4
+
5
+ .v-breadcrumbs {
6
+ &__item {
7
+ transition: none;
8
+ color: var(--sr-link-grey) !important;
9
+
10
+ &:hover {
11
+ color: var(--sr-dark-grey) !important;
12
+ }
13
+
14
+ .v-icon {
15
+ margin-right: 5px;
16
+ color: inherit;
17
+ }
18
+ }
19
+
20
+ &__divider {
21
+ padding: 0 5px !important;
22
+ }
23
+ }
24
+
25
+ li:last-child {
26
+ font-weight: 500;
27
+ }
28
+ }
29
+
30
+ .page-layout--base {
31
+ div:has(> .breadcrumb-container):has(> .help-btn-container) {
32
+ display: grid;
33
+ align-items: center;
34
+ justify-content: space-between;
35
+ margin-top: $container-padding-x;
36
+ grid-template-columns: 3fr 1fr;
37
+ }
38
+
39
+ .breadcrumb-container {
40
+ flex: 1;
41
+ }
42
+
43
+ .help-btn-container {
44
+ flex: 1;
45
+ text-align: right;
46
+ }
47
+ }
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <v-breadcrumbs class="admin-breadcrumbs" :items="breadcrumbs" v-if="breadcrumbs.length">
3
+ <template #item="{item}">
4
+ <v-breadcrumbs-item
5
+ :href="item.href"
6
+ :to="item.to"
7
+ exact
8
+ :disabled="false"
9
+ >
10
+ {{ item.text }}
11
+ </v-breadcrumbs-item>
12
+ </template>
13
+ <template #divider>
14
+ <v-icon>mdi-chevron-right</v-icon>
15
+ </template>
16
+ </v-breadcrumbs>
17
+ </template>
18
+
19
+ <script>
20
+ export default {
21
+ name: 'SrBreadcrumbs',
22
+ computed: {
23
+ breadcrumbs () {
24
+ try {
25
+ const lastIndex = this.$route.meta.breadcrumbs.length - 1
26
+ return this.$route.meta.breadcrumbs.map((breadcrumb, index) => ({
27
+ ...breadcrumb,
28
+ text: breadcrumb.text.replace(/:(.*)/, (matches, p1) => {
29
+ return this.$route.params[p1]
30
+ }),
31
+ disabled: false,
32
+ last: index === lastIndex
33
+ }))
34
+ } catch (e) {
35
+ return []
36
+ }
37
+ }
38
+ },
39
+ methods: {
40
+ reloadPage () {
41
+ location.reload()
42
+ }
43
+ }
44
+ }
45
+ </script>
@@ -0,0 +1,109 @@
1
+ import Vue from 'vue'
2
+ import VueRouter from 'vue-router'
3
+ import Vuetify from 'vuetify'
4
+ import { mount, createLocalVue } from '@vue/test-utils'
5
+ import SrBreadcrumbs from '../SrBreadcrumbs/SrBreadcrumbs.vue'
6
+
7
+ Vue.use(Vuetify)
8
+
9
+ const localVue = createLocalVue()
10
+ localVue.use(VueRouter)
11
+
12
+ describe('SrBreadcrumbs.vue', () => {
13
+ let vuetify
14
+ let router
15
+
16
+ const createWrapper = (routeOptions) => {
17
+ const routes = [
18
+ {
19
+ path: '/user/:id',
20
+ component: { template: '<div></div>' },
21
+ meta: {
22
+ breadcrumbs: routeOptions.breadcrumbs || []
23
+ }
24
+ }
25
+ ]
26
+
27
+ router = new VueRouter({ routes })
28
+ router.push(routeOptions.path || '/user/42')
29
+
30
+ vuetify = new Vuetify()
31
+
32
+ return mount(SrBreadcrumbs, {
33
+ localVue,
34
+ vuetify,
35
+ router,
36
+ mocks: {
37
+ translate: (text) => text
38
+ }
39
+ })
40
+ }
41
+
42
+ it('renders breadcrumbs when route meta has breadcrumb data', () => {
43
+ const wrapper = createWrapper({
44
+ breadcrumbs: [{ text: 'Home', to: '/' }],
45
+ path: '/user/42'
46
+ })
47
+
48
+ expect(
49
+ wrapper.findComponent({ name: 'v-breadcrumbs' }).exists()
50
+ ).toBe(true)
51
+
52
+ expect(
53
+ wrapper.findAllComponents({ name: 'v-breadcrumbs-item' }).length
54
+ ).toBe(1)
55
+ })
56
+
57
+ it('replaces dynamic params in breadcrumb text (e.g., ":id") with actual route params', () => {
58
+ const wrapper = createWrapper({
59
+ breadcrumbs: [{ text: 'User :id', to: '/user/:id' }],
60
+ path: '/user/99'
61
+ })
62
+
63
+ expect(wrapper.text()).toContain('User 99')
64
+ })
65
+
66
+ it('renders correct number of breadcrumb items based on route meta', () => {
67
+ const wrapper = createWrapper({
68
+ breadcrumbs: [
69
+ { text: 'Home', to: '/' },
70
+ { text: 'Profile', to: '/profile' }
71
+ ]
72
+ })
73
+
74
+ expect(
75
+ wrapper.findAllComponents({ name: 'v-breadcrumbs-item' }).length
76
+ ).toBe(2)
77
+ })
78
+
79
+ it('does not render breadcrumbs if route.meta.breadcrumbs is empty', () => {
80
+ const wrapper = createWrapper({
81
+ breadcrumbs: []
82
+ })
83
+
84
+ expect(
85
+ wrapper.findComponent({ name: 'v-breadcrumbs' }).exists()
86
+ ).toBe(false)
87
+ })
88
+
89
+ it('does not throw if breadcrumbs computation fails (e.g., no meta)', () => {
90
+ router = new VueRouter({
91
+ routes: [{ path: '/no-meta', component: { template: '<div></div>' } }]
92
+ })
93
+ router.push('/no-meta')
94
+ vuetify = new Vuetify()
95
+
96
+ const mountComponent = () => {
97
+ mount(SrBreadcrumbs, {
98
+ localVue,
99
+ vuetify,
100
+ router,
101
+ mocks: {
102
+ translate: (text) => text
103
+ }
104
+ })
105
+ }
106
+
107
+ expect(mountComponent).not.toThrow()
108
+ })
109
+ })
@@ -0,0 +1,4 @@
1
+ .sr-form-divider {
2
+ border-bottom: 1px solid var(--sr-light-grey);
3
+ margin: 2rem 0
4
+ }
@@ -0,0 +1,9 @@
1
+ <template>
2
+ <div class="sr-form-divider"></div>
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ name: 'SrFormDivider'
8
+ }
9
+ </script>
@@ -1,26 +1,26 @@
1
- .admin-form-row {
2
- margin-bottom: 16px;
3
- }
1
+ .sr-form-row {
2
+ margin-bottom: $sr-form-row-margin-bottom;
4
3
 
5
- .admin-form-row__label {
6
- margin-bottom: 5px;
7
- word-break: break-word;
8
- }
4
+ .admin-form-row__label {
5
+ margin-bottom: 5px;
6
+ word-break: break-word;
7
+ }
9
8
 
10
- .admin-form-row__element {
11
- width: 100%;
12
- }
9
+ .admin-form-row__element {
10
+ width: 100%;
11
+ }
13
12
 
14
- .new-style .form-help,
15
- .new-style .help {
16
- color: var(--sr-dark-grey);
17
- font-size: 12px;
18
- font-weight: 400;
19
- display: block;
20
- text-transform: none;
21
- margin-top: 4px;
22
- }
13
+ .form-help,
14
+ .help {
15
+ color: var(--sr-dark-grey);
16
+ font-size: 12px;
17
+ font-weight: 400;
18
+ display: block;
19
+ text-transform: none;
20
+ margin-top: 4px;
21
+ }
23
22
 
24
- .required-form-row {
25
- color: var(--sr-error);
23
+ .required-form-row {
24
+ color: var(--sr-error);
25
+ }
26
26
  }
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <v-row dense>
2
+ <v-row dense class="sr-form-row">
3
3
  <v-col cols="12" sm="3">
4
- <div class="admin-form-row">
4
+ <div>
5
5
  <div class="admin-form-row__label">
6
6
  <slot name="label">
7
7
  <v-label><span v-if="required" class="required-form-row">* </span>{{ label }}</v-label>
@@ -18,6 +18,7 @@
18
18
  </div>
19
19
  </v-col>
20
20
  <v-col cols="5" class="d-none d-sm-block">
21
+ <slot name="extra-content" />
21
22
  </v-col>
22
23
  </v-row>
23
24
  </template>
@@ -8,7 +8,8 @@
8
8
  <v-text-field
9
9
  :value="value"
10
10
  :placeholder="placeholder"
11
- :clearable="clearable"
11
+ @change="$emit('input', $event)"
12
+ clearable
12
13
  dense hide-details outlined
13
14
  append-icon="mdi-chevron-down"
14
15
  readonly
@@ -19,7 +20,9 @@
19
20
  <v-date-picker
20
21
  :value="value"
21
22
  @input="selectDate"
23
+ clearable
22
24
  first-day-of-week="1"
25
+ :locale="this.$vuetify.lang.current"
23
26
  />
24
27
  </v-menu>
25
28
  </template>
@@ -2,6 +2,7 @@
2
2
  <v-select
3
3
  v-bind="$attrs"
4
4
  v-on="$listeners"
5
+ :placeholder="placeholder || $vuetify.lang.t('$vuetify.pleaseSelect')"
5
6
  menu-props="offset-y"
6
7
  clearable
7
8
  dense hide-details outlined
@@ -18,6 +19,12 @@
18
19
  <script>
19
20
  export default {
20
21
  name: 'SrSelect',
21
- inheritAttrs: false
22
+ inheritAttrs: false,
23
+ props: {
24
+ placeholder: {
25
+ type: String,
26
+ default: null
27
+ }
28
+ }
22
29
  }
23
30
  </script>
@@ -3,7 +3,6 @@
3
3
  :input-value="value"
4
4
  :label="getLabel"
5
5
  :ripple="false"
6
- hide-details
7
6
  inset
8
7
  v-bind="$attrs"
9
8
  v-on="$listeners"
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <v-textarea
3
+ class="sr-textarea"
4
+ v-bind="$attrs"
5
+ v-on="$listeners"
6
+ dense
7
+ outlined
8
+ persistent-hint
9
+ clearable
10
+ auto-grow
11
+ row-height="1"
12
+ />
13
+ </template>
14
+
15
+ <script>
16
+ export default {
17
+ name: 'SrTextarea',
18
+ inheritAttrs: false
19
+ }
20
+ </script>
@@ -0,0 +1,9 @@
1
+ .sr-heading {
2
+ margin-top: 50px;
3
+ margin-bottom: 40px;
4
+ }
5
+
6
+ .sr-heading .btn-container {
7
+ display: flex;
8
+ gap: 1rem;
9
+ }
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <div class="d-flex w-100 justify-space-between mb-4">
2
+ <div class="sr-heading d-flex w-100 justify-space-between">
3
3
  <h1 class="text-h1">{{ title }}</h1>
4
- <div>
4
+ <div class="btn-container">
5
5
  <slot></slot>
6
6
  </div>
7
7
  </div>
@@ -1,5 +1,13 @@
1
1
  <template>
2
2
  <div class="page-layout--base page-layout--slim">
3
+ <div>
4
+ <div class="breadcrumb-container">
5
+ <sr-breadcrumbs />
6
+ </div>
7
+ <div class="help-btn-container">
8
+ <sr-help-button />
9
+ </div>
10
+ </div>
3
11
  <slot></slot>
4
12
  </div>
5
13
  </template>
@@ -0,0 +1,4 @@
1
+ .page-layout--standard {
2
+ margin: 0 auto 70px auto;
3
+ padding: 0 30px;
4
+ }
@@ -0,0 +1,21 @@
1
+ <template>
2
+ <div class="page-layout--base page-layout--standard">
3
+ <div>
4
+ <div class="breadcrumb-container">
5
+ <sr-breadcrumbs />
6
+ </div>
7
+ <div class="help-btn-container">
8
+ <sr-help-button />
9
+ </div>
10
+ </div>
11
+ <slot></slot>
12
+ </div>
13
+ </template>
14
+
15
+ <script>
16
+
17
+ export default {
18
+ name: 'SrStandardLayout',
19
+ props: ['title']
20
+ }
21
+ </script>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <v-progress-circular
3
+ color="primary"
4
+ class="text-center"
5
+ :size="size"
6
+ v-bind="$attrs"
7
+ :value="percentage"
8
+ v-on="$listeners">
9
+ {{ percentage }}%
10
+ </v-progress-circular>
11
+ </template>
12
+
13
+ <script>
14
+ export default {
15
+ name: 'SrFinitePreloader',
16
+ inheritAttrs: false,
17
+ props: {
18
+ size: {
19
+ default: 200
20
+ },
21
+ percentage: {
22
+ default: 0
23
+ }
24
+ }
25
+ }
26
+ </script>
@@ -0,0 +1,3 @@
1
+ .sr-finite-progress-bar span.percentage {
2
+ text-shadow: 0px 0px 2px var(--sr-dark-grey);
3
+ }
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <v-progress-linear
3
+ v-bind="$attrs"
4
+ v-on="$listeners"
5
+ color="success"
6
+ class="sr-finite-progress-bar"
7
+ striped
8
+ :height="height"
9
+ rounded
10
+ :value="percentage"
11
+ background-color="var(--sr-light-grey)">
12
+ <span class="white--text caption font-weight-bold percentage">{{ percentage }}%</span>
13
+ </v-progress-linear>
14
+ </template>
15
+
16
+ <script>
17
+ export default {
18
+ name: 'SrFiniteProgressBar',
19
+ inheritAttrs: false,
20
+ props: {
21
+ percentage: {
22
+ default: 0
23
+ },
24
+ height: {
25
+ default: 21
26
+ }
27
+ }
28
+ }
29
+ </script>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <v-progress-circular
3
+ indeterminate
4
+ color="primary"
5
+ class="text-center"
6
+ :size="size"
7
+ v-bind="$attrs"
8
+ v-on="$listeners"
9
+ />
10
+ </template>
11
+
12
+ <script>
13
+ export default {
14
+ name: 'SrInfinitePreloader',
15
+ inheritAttrs: false,
16
+ props: {
17
+ size: {
18
+ default: 200
19
+ }
20
+ }
21
+ }
22
+ </script>
@@ -0,0 +1,27 @@
1
+ <template>
2
+ <td
3
+ class="sr-simple-table-filter-td"
4
+ v-bind="$attrs"
5
+ v-on="$listeners"
6
+ :style="{ maxWidth: maxWidth, minWidth: minWidth }"
7
+ >
8
+ <slot/>
9
+ </td>
10
+ </template>
11
+
12
+ <script>
13
+ export default {
14
+ name: 'SrSimpleTableFilterTd',
15
+ inheritAttrs: false,
16
+ props: {
17
+ maxWidth: {
18
+ type: String,
19
+ default: '150px'
20
+ },
21
+ minWidth: {
22
+ type: String,
23
+ default: null
24
+ }
25
+ }
26
+ }
27
+ </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-tabs-items v-bind="$attrs" v-on="$listeners">
2
+ <v-tabs-items v-bind="$attrs" v-on="$listeners" class="sr-tabs-items">
3
3
  <slot />
4
4
  </v-tabs-items>
5
5
  </template>