@pocketprep/ui-kit 3.5.0 → 3.5.1

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 (85) hide show
  1. package/README.md +2 -2
  2. package/dist/@pocketprep/ui-kit.css +1 -0
  3. package/dist/@pocketprep/ui-kit.js +14256 -14792
  4. package/dist/@pocketprep/ui-kit.js.map +1 -1
  5. package/dist/@pocketprep/ui-kit.umd.cjs +11 -11
  6. package/dist/@pocketprep/ui-kit.umd.cjs.map +1 -1
  7. package/eslint.config.ts +111 -0
  8. package/lib/components/Banners/Banner.vue +2 -2
  9. package/lib/components/Bundles/BundleList.vue +1 -1
  10. package/lib/components/Bundles/BundleSearch.vue +2 -1
  11. package/lib/components/Bundles/PremiumPill.vue +2 -2
  12. package/lib/components/Buttons/Button.vue +19 -18
  13. package/lib/components/Buttons/Link.vue +9 -8
  14. package/lib/components/Buttons/Tab.vue +4 -3
  15. package/lib/components/Calendar/Calendar.vue +14 -2
  16. package/lib/components/Charts/Bar.vue +3 -3
  17. package/lib/components/Charts/Pie.vue +4 -4
  18. package/lib/components/Controls/SegmentControl.vue +8 -7
  19. package/lib/components/Controls/Slider.vue +2 -3
  20. package/lib/components/Controls/ToggleSwitch.vue +3 -2
  21. package/lib/components/EmptyStates/EmptyState.vue +3 -2
  22. package/lib/components/Exams/ExamCard.vue +3 -3
  23. package/lib/components/Exams/ExamMenuCard.vue +2 -2
  24. package/lib/components/Filters/FilterDropdown.vue +2 -2
  25. package/lib/components/Filters/FilterOptions.vue +2 -2
  26. package/lib/components/Forms/Checkbox.vue +2 -2
  27. package/lib/components/Forms/CheckboxOption.vue +2 -2
  28. package/lib/components/Forms/Errors.vue +2 -2
  29. package/lib/components/Forms/Input.vue +2 -2
  30. package/lib/components/Forms/Radio.vue +37 -39
  31. package/lib/components/Forms/RadioButton.vue +1 -1
  32. package/lib/components/Forms/Select.vue +7 -6
  33. package/lib/components/Forms/Textarea.vue +2 -2
  34. package/lib/components/Icons/Icon.vue +1 -0
  35. package/lib/components/Icons/IconEdit.vue +4 -2
  36. package/lib/components/Icons/IconFullViewActive.vue +1 -1
  37. package/lib/components/Icons/IconLoading2.vue +1 -3
  38. package/lib/components/Loaders/SkeletonLoader.vue +2 -2
  39. package/lib/components/Messaging/InfoMessage.vue +2 -2
  40. package/lib/components/Modal/Modal.vue +2 -2
  41. package/lib/components/Modal/ModalContainer.vue +2 -2
  42. package/lib/components/Onboarding/EmailAuth.vue +5 -5
  43. package/lib/components/Onboarding/MagicCodeEntry.vue +3 -4
  44. package/lib/components/Pagination/QuestionReviewPagination.vue +4 -4
  45. package/lib/components/Pagination/TablePagination.vue +2 -2
  46. package/lib/components/Quiz/FlagToggle.vue +2 -2
  47. package/lib/components/Quiz/GlobalMetricsToggle.vue +3 -2
  48. package/lib/components/Quiz/KeyboardShortcutsButton.vue +1 -1
  49. package/lib/components/Quiz/KeyboardShortcutsModal.vue +1 -1
  50. package/lib/components/Quiz/Question/ChoicesContainer.vue +4 -3
  51. package/lib/components/Quiz/Question/DropdownExplanation.vue +2 -2
  52. package/lib/components/Quiz/Question/Explanation.vue +2 -2
  53. package/lib/components/Quiz/Question/MatrixChoicesContainer.vue +12 -17
  54. package/lib/components/Quiz/Question/MatrixRadioGroup.vue +2 -2
  55. package/lib/components/Quiz/Question/MobileMatrixChoicesContainer.vue +19 -26
  56. package/lib/components/Quiz/Question/MobileMatrixRadioGroup.vue +7 -5
  57. package/lib/components/Quiz/Question/PassageAndImage.vue +2 -2
  58. package/lib/components/Quiz/Question/PassageAndImageDropdown.vue +7 -6
  59. package/lib/components/Quiz/Question/Paywall.vue +2 -2
  60. package/lib/components/Quiz/Question/QuestionContext.vue +2 -3
  61. package/lib/components/Quiz/Question/StatsSummary.vue +2 -2
  62. package/lib/components/Quiz/Question/Summary.vue +2 -2
  63. package/lib/components/Quiz/Question.vue +29 -28
  64. package/lib/components/Quiz/QuizContainer.vue +31 -37
  65. package/lib/components/Quiz/QuizProgress.vue +73 -77
  66. package/lib/components/Quiz/QuizProgressBar.vue +3 -2
  67. package/lib/components/Search/Pill.vue +2 -2
  68. package/lib/components/Search/Search.vue +2 -2
  69. package/lib/components/SidePanels/SidePanel.vue +8 -3
  70. package/lib/components/Tables/Table.vue +4 -3
  71. package/lib/components/Tables/TableActions.vue +3 -3
  72. package/lib/components/Tags/Tag.vue +2 -2
  73. package/lib/components/Toasts/Toast.vue +5 -3
  74. package/lib/components/Tooltips/OverflowTooltip.vue +2 -2
  75. package/lib/components/Tooltips/Tooltip.vue +2 -2
  76. package/lib/directives.ts +1 -1
  77. package/lib/pocketprep-export.module.scss +3 -2
  78. package/lib/pocketprep.scss +2 -2
  79. package/lib/styles/_breakpoints.scss +6 -12
  80. package/lib/styles/_colors.scss +0 -1
  81. package/package.json +36 -27
  82. package/stylelint.config.js +38 -0
  83. package/.eslintrc.cjs +0 -74
  84. package/dist/style.css +0 -1
  85. package/stylelint.config.cjs +0 -22
@@ -35,104 +35,100 @@
35
35
  </div>
36
36
  </template>
37
37
 
38
- <script lang="ts">
39
- import { Component, Emit, Prop, Vue } from 'vue-facing-decorator'
38
+ <script setup lang="ts">
39
+ import { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue'
40
40
  import QuizProgressBar from '../Quiz/QuizProgressBar.vue'
41
41
  import { ResizeObserver as ResizeObserverPonyFill } from 'resize-observer'
42
42
 
43
- @Component({
44
- components: {
45
- QuizProgressBar,
46
- },
43
+ const props = withDefaults(defineProps<{
44
+ answeredIndexList: number[]
45
+ selectedIndex: number
46
+ numQuestions: number
47
+ forceSlider?: boolean
48
+ }>(), {
49
+ forceSlider: false,
47
50
  })
48
- export default class QuizProgress extends Vue {
49
- @Prop() answeredIndexList!: number[]
50
- @Prop() selectedIndex!: number
51
- @Prop() numQuestions!: number
52
- @Prop({ default: false }) forceSlider!: boolean
53
51
 
54
- containerWidth = 0
55
- mutationObserver: ResizeObserver | null = null
52
+ const emit = defineEmits<{
53
+ 'barClicked': [ index: number ]
54
+ }>()
56
55
 
57
- get isSlider () {
58
- return this.forceSlider || this.numQuestions > 100
59
- }
56
+ const containerWidth = ref(0)
57
+ const mutationObserver = ref<ResizeObserver | null>(null)
60
58
 
61
- get barMaxMargin () {
62
- return this.numQuestions > 100 || this.forceSlider
63
- ? 0 // No margin for >100 questions or slider mode
64
- : this.numQuestions < 50
65
- ? 2
66
- : 2.5
67
- }
59
+ const isSlider = computed(() => {
60
+ return props.forceSlider || props.numQuestions > 100
61
+ })
68
62
 
69
- get barWidth () {
70
- const numGaps = this.numQuestions - 1
71
- const totalMarginWidth = numGaps * this.barMaxMargin * 2
72
- const availableWidth = this.containerWidth - totalMarginWidth
73
- const barWidth = (this.forceSlider || this.numQuestions > 100)
74
- ? availableWidth / this.numQuestions
75
- : Math.floor(Math.max(availableWidth / this.numQuestions, 1))
76
- return barWidth
77
- }
63
+ const barMaxMargin = computed(() => {
64
+ return props.numQuestions > 100 || props.forceSlider
65
+ ? 0 // No margin for >100 questions or slider mode
66
+ : props.numQuestions < 50
67
+ ? 2
68
+ : 2.5
69
+ })
78
70
 
79
- get barMargin () {
80
- const maxMargin = ((this.containerWidth - (this.barWidth * this.numQuestions)) / (this.numQuestions - 1)) / 2
71
+ const barWidth = computed(() => {
72
+ const numGaps = props.numQuestions - 1
73
+ const totalMarginWidth = numGaps * barMaxMargin.value * 2
74
+ const availableWidth = containerWidth.value - totalMarginWidth
75
+ const calculatedBarWidth = (props.forceSlider || props.numQuestions > 100)
76
+ ? availableWidth / props.numQuestions
77
+ : Math.floor(Math.max(availableWidth / props.numQuestions, 1))
78
+ return calculatedBarWidth
79
+ })
81
80
 
82
- return Math.max(
83
- Math.min(this.barMaxMargin, Math.floor(maxMargin)),
84
- 0
85
- )
86
- }
81
+ const barMargin = computed(() => {
82
+ const maxMargin = ((containerWidth.value - (barWidth.value * props.numQuestions)) / (props.numQuestions - 1)) / 2
87
83
 
88
- get barWidthString () {
89
- return `${this.barWidth}px`
90
- }
84
+ return Math.max(
85
+ Math.min(barMaxMargin.value, Math.floor(maxMargin)),
86
+ 0
87
+ )
88
+ })
91
89
 
92
- get barMarginString () {
93
- return `${this.barMargin}px`
94
- }
90
+ const barWidthString = computed(() => {
91
+ return `${barWidth.value}px`
92
+ })
95
93
 
96
- mounted () {
97
- this.containerWidth = document.querySelector('.uikit-quiz-progress')?.getBoundingClientRect().width || 0
98
- const el = document.querySelector('.uikit-quiz-progress') as Element
99
- const resizeMutationObserver = window.ResizeObserver
100
- ? new ResizeObserver(() => {
101
- this.containerWidth = document.querySelector('.uikit-quiz-progress')?.getBoundingClientRect().width || 0
102
- })
103
- : new ResizeObserverPonyFill(() => {
104
- this.containerWidth = document.querySelector('.uikit-quiz-progress')?.getBoundingClientRect().width || 0
105
- })
106
- this.mutationObserver = resizeMutationObserver
107
- this.mutationObserver.observe(el)
108
- }
94
+ onMounted(() => {
95
+ containerWidth.value = document.querySelector('.uikit-quiz-progress')?.getBoundingClientRect().width || 0
96
+ const el = document.querySelector('.uikit-quiz-progress') as Element
97
+ const resizeMutationObserver = window.ResizeObserver
98
+ ? new ResizeObserver(() => {
99
+ containerWidth.value = document.querySelector('.uikit-quiz-progress')?.getBoundingClientRect().width || 0
100
+ })
101
+ : new ResizeObserverPonyFill(() => {
102
+ containerWidth.value = document.querySelector('.uikit-quiz-progress')?.getBoundingClientRect().width || 0
103
+ })
104
+ mutationObserver.value = resizeMutationObserver
105
+ mutationObserver.value.observe(el)
106
+ })
109
107
 
110
- beforeUnmount () {
111
- this.mutationObserver?.disconnect()
112
- }
108
+ onBeforeUnmount(() => {
109
+ mutationObserver.value?.disconnect()
110
+ })
113
111
 
114
- clickAndFocus (index: number) {
115
- const bars = document.querySelectorAll('.uikit-quiz-progress__bar')
116
- const bar = bars[index - 1] as HTMLElement
117
- if (bar) {
118
- this.emitBarClicked(index)
119
- setTimeout(() => {
120
- this.$nextTick(() => {
121
- bar.focus()
122
- })
123
- }, 50)
124
- }
112
+ const clickAndFocus = (index: number) => {
113
+ const bars = document.querySelectorAll('.uikit-quiz-progress__bar')
114
+ const bar = bars[index - 1] as HTMLElement
115
+ if (bar) {
116
+ emitBarClicked(index)
117
+ setTimeout(() => {
118
+ nextTick(() => {
119
+ bar.focus()
120
+ })
121
+ }, 50)
125
122
  }
123
+ }
126
124
 
127
- @Emit('barClicked')
128
- emitBarClicked (index: number) {
129
- return index
130
- }
125
+ const emitBarClicked = (index: number) => {
126
+ emit('barClicked', index)
131
127
  }
132
128
  </script>
133
129
 
134
130
  <style lang="scss">
135
- @import '../../styles/breakpoints';
131
+ @use '@/styles/breakpoints' as *;
136
132
 
137
133
  .uikit-quiz-progress {
138
134
  display: flex;
@@ -18,6 +18,7 @@ import { Component, Emit, Prop, Vue } from 'vue-facing-decorator'
18
18
  import { breakpoint } from '../../directives'
19
19
 
20
20
  @Component({
21
+ name: 'QuizProgressBar',
21
22
  directives: {
22
23
  breakpoint,
23
24
  },
@@ -40,8 +41,8 @@ export default class QuizProgressBar extends Vue {
40
41
  </script>
41
42
 
42
43
  <style lang="scss">
43
- @import '../../styles/colors';
44
- @import '../../styles/breakpoints';
44
+ @use '@/styles/breakpoints' as *;
45
+ @use '@/styles/colors' as *;
45
46
 
46
47
  .uikit-quiz-progress-bar {
47
48
  flex: 1;
@@ -40,8 +40,8 @@ export default class Pill extends Vue {
40
40
  </script>
41
41
 
42
42
  <style lang="scss">
43
- @import '../../styles/breakpoints';
44
- @import '../../styles/colors';
43
+ @use '@/styles/breakpoints' as *;
44
+ @use '@/styles/colors' as *;
45
45
 
46
46
  .uikit-pill {
47
47
  background: $brand-black;
@@ -124,8 +124,8 @@ export default class Search extends Vue {
124
124
  </script>
125
125
 
126
126
  <style lang="scss">
127
- @import '../../styles/colors';
128
- @import '../../styles/breakpoints';
127
+ @use '@/styles/breakpoints' as *;
128
+ @use '@/styles/colors' as *;
129
129
 
130
130
  .uikit-search {
131
131
  position: relative;
@@ -128,6 +128,7 @@ import Icon from '../Icons/Icon.vue'
128
128
  import { dark } from '../../directives'
129
129
 
130
130
  @Component({
131
+ name: 'SidePanel',
131
132
  components: {
132
133
  Icon,
133
134
  PocketButton: Button,
@@ -150,7 +151,7 @@ export default class SidePanel extends Vue {
150
151
  @Prop({ default: false }) isDarkMode!: boolean
151
152
 
152
153
  openSidePanel = false
153
- notContentHeight = this.tabs && this.tabs.length ? 262 : 218
154
+ notContentHeight = this.tabs?.length ? 262 : 218
154
155
  focusListener: Parameters<typeof addEventListener>[1] | null = null
155
156
  savedYPosition = 0
156
157
  sidePanelNumber = 0
@@ -289,8 +290,8 @@ export default class SidePanel extends Vue {
289
290
  </script>
290
291
 
291
292
  <style lang="scss">
292
- @import '../../styles/colors';
293
- @import '../../styles/breakpoints';
293
+ @use '@/styles/breakpoints' as *;
294
+ @use '@/styles/colors' as *;
294
295
 
295
296
  .uikit-page-overlay {
296
297
  background: rgba($brand-black, 0);
@@ -588,6 +589,10 @@ export default class SidePanel extends Vue {
588
589
 
589
590
  &--teach-side-panel {
590
591
  background-color: $white;
592
+
593
+ &--dark {
594
+ background: $charcoal;
595
+ }
591
596
  }
592
597
 
593
598
  &--dark {
@@ -379,8 +379,9 @@ export default class Table extends Vue {
379
379
  </script>
380
380
 
381
381
  <style lang="scss">
382
- @import '../../styles/colors';
383
- @import '../../styles/breakpoints';
382
+ @use 'sass:color';
383
+ @use '@/styles/breakpoints' as *;
384
+ @use '@/styles/colors' as *;
384
385
 
385
386
  .uikit-table {
386
387
  &__container {
@@ -584,7 +585,7 @@ export default class Table extends Vue {
584
585
 
585
586
  &--hover-focus {
586
587
  &:hover {
587
- background-color: mix($barely-background, $brand-black, 96%);
588
+ background-color: color.mix($barely-background, $brand-black, 96%);
588
589
  }
589
590
 
590
591
  &:focus {
@@ -77,7 +77,7 @@ export default class TableActions extends Vue {
77
77
  }
78
78
 
79
79
  actionClicked (action: ITableAction | ITableSubAction) {
80
- if ('menu' in action && action.menu && action.menu.length) {
80
+ if ('menu' in action && action.menu?.length) {
81
81
  if (this.visibleMenuActionId !== action.id) {
82
82
  this.focusedMenuOptionIndex = null
83
83
  this.visibleMenuActionId = action.id
@@ -139,8 +139,8 @@ export default class TableActions extends Vue {
139
139
  </script>
140
140
 
141
141
  <style lang="scss">
142
- @import '../../styles/colors';
143
- @import '../../styles/breakpoints';
142
+ @use '@/styles/breakpoints' as *;
143
+ @use '@/styles/colors' as *;
144
144
 
145
145
  .uikit-table-actions {
146
146
  display: flex;
@@ -64,8 +64,8 @@ export default class Tag extends Vue {
64
64
  </script>
65
65
 
66
66
  <style lang="scss">
67
- @import '../../styles/breakpoints';
68
- @import '../../styles/colors';
67
+ @use '@/styles/breakpoints' as *;
68
+ @use '@/styles/colors' as *;
69
69
 
70
70
  .uikit-tag {
71
71
  box-sizing: border-box;
@@ -80,7 +80,9 @@ export default class Toast extends Vue {
80
80
  }
81
81
 
82
82
  clearCloseTimeout () {
83
- this.closeTimeout && clearTimeout(this.closeTimeout)
83
+ if (this.closeTimeout) {
84
+ clearTimeout(this.closeTimeout)
85
+ }
84
86
  }
85
87
 
86
88
  @Emit('close')
@@ -91,8 +93,8 @@ export default class Toast extends Vue {
91
93
  </script>
92
94
 
93
95
  <style lang="scss" scoped>
94
- @import '../../styles/breakpoints';
95
- @import '../../styles/colors';
96
+ @use '@/styles/breakpoints' as *;
97
+ @use '@/styles/colors' as *;
96
98
 
97
99
  .toast {
98
100
  background-color: rgba($charcoal, 0.9);
@@ -82,8 +82,8 @@ export default class OverflowTooltip extends Vue {
82
82
  </script>
83
83
 
84
84
  <style lang="scss">
85
- @import '../../styles/breakpoints';
86
- @import '../../styles/colors';
85
+ @use '@/styles/breakpoints' as *;
86
+ @use '@/styles/colors' as *;
87
87
 
88
88
  .uikit-overflow-tooltip {
89
89
  position: relative;
@@ -103,8 +103,8 @@ export default class Tooltip extends Vue {
103
103
  </script>
104
104
 
105
105
  <style lang="scss">
106
- @import '../../styles/colors';
107
- @import '../../styles/breakpoints';
106
+ @use '@/styles/breakpoints' as *;
107
+ @use '@/styles/colors' as *;
108
108
 
109
109
  .uikit-tooltip-popup {
110
110
  color: $white;
package/lib/directives.ts CHANGED
@@ -77,7 +77,7 @@ const eventListeners: Partial<Record<string, () => void>> = {}
77
77
  const mutationObservers: Partial<Record<string, MutationObserver>> = {}
78
78
  const resizeObservers: Partial<Record<string, ResizeObserver>> = {}
79
79
 
80
- export const fixed: Directive = {
80
+ export const fixed: Directive<HTMLElement> = {
81
81
  beforeMount: el => {
82
82
  if (!el.dataset.breakpointId) {
83
83
  const { top, left } = el.getBoundingClientRect()
@@ -1,5 +1,5 @@
1
- @import './styles/breakpoints';
2
- @import './styles/colors';
1
+ @use './styles/breakpoints' as *;
2
+ @use './styles/colors' as *;
3
3
 
4
4
  /* stylelint-disable property-case */
5
5
  :export {
@@ -10,6 +10,7 @@
10
10
  blackBear: $black-bear;
11
11
  koalaBear: $koala-bear;
12
12
  teddyBear: $teddy-bear;
13
+
13
14
  // colors
14
15
  white: $white;
15
16
  pickledBluewood: $pickled-bluewood;
@@ -1,5 +1,5 @@
1
- @import './styles/breakpoints';
2
- @import './styles/colors';
1
+ @use './styles/breakpoints' as *;
2
+ @use './styles/colors' as *;
3
3
 
4
4
  body,
5
5
  html {
@@ -8,23 +8,17 @@ $teddy-bear: 319;
8
8
  @mixin breakpoint($point) {
9
9
  @if $point == 'polar-bear' {
10
10
  @media (max-width: ($polar-bear + 'px')) { @content; }
11
- }
12
- @else if $point == 'grizzly-bear' {
11
+ } @else if $point == 'grizzly-bear' {
13
12
  @media (max-width: ($grizzly-bear + 'px')) { @content; }
14
- }
15
- @else if $point == 'brown-bear' {
13
+ } @else if $point == 'brown-bear' {
16
14
  @media (max-width: ($brown-bear + 'px')) { @content; }
17
- }
18
- @else if $point == 'black-bear' {
15
+ } @else if $point == 'black-bear' {
19
16
  @media (max-width: ($black-bear + 'px')) { @content; }
20
- }
21
- @else if $point == 'koala-bear' {
17
+ } @else if $point == 'koala-bear' {
22
18
  @media (max-width: ($koala-bear + 'px')) { @content; }
23
- }
24
- @else if $point == 'teddy-bear' {
19
+ } @else if $point == 'teddy-bear' {
25
20
  @media (max-width: ($teddy-bear + 'px')) { @content; }
26
- }
27
- @else {
21
+ } @else {
28
22
  @media (max-width: $point) { @content; }
29
23
  }
30
24
  }
@@ -98,6 +98,5 @@ $electric-violet: #d819eb;
98
98
  $aqua-oasis: #bce6dc;
99
99
  $peacock-green: #056c50;
100
100
  $green-hint: #e7f9f5;
101
-
102
101
  $victoria-green: #00664a;
103
102
  $london-rain: #064fc1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pocketprep/ui-kit",
3
- "version": "3.5.0",
3
+ "version": "3.5.1",
4
4
  "description": "Pocket Prep UI Kit",
5
5
  "author": "pocketprep",
6
6
  "scripts": {
@@ -8,7 +8,7 @@
8
8
  "build": "run-p type-check build-only",
9
9
  "build-only": "vite build && vite build --config vite.config.docs.ts",
10
10
  "preview": "vite preview --config vite.config.docs.ts",
11
- "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore && stylelint '**/*.{scss,vue}'",
11
+ "lint": "eslint . && stylelint '**/*.{scss,vue}'",
12
12
  "type-check": "vue-tsc --noEmit -p tsconfig.cypress-ct.json --composite false",
13
13
  "test:e2e": "start-server-and-test preview :4173 'cypress run --e2e'",
14
14
  "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' :4173 'cypress open --e2e'",
@@ -25,8 +25,8 @@
25
25
  "files": [
26
26
  "lib",
27
27
  "dist",
28
- ".eslintrc.cjs",
29
- "stylelint.config.cjs",
28
+ "eslint.config.ts",
29
+ "stylelint.config.js",
30
30
  "index.d.ts"
31
31
  ],
32
32
  "exports": {
@@ -41,8 +41,8 @@
41
41
  }
42
42
  },
43
43
  "./styles": {
44
- "import": "./dist/style.css",
45
- "require": "./dist/style.css"
44
+ "import": "./dist/@pocketprep/ui-kit.css",
45
+ "require": "./dist/@pocketprep/ui-kit.css"
46
46
  },
47
47
  "./pocketprep.scss": {
48
48
  "import": "./lib/pocketprep.scss",
@@ -67,6 +67,10 @@
67
67
  "./colors": {
68
68
  "import": "./lib/styles/_colors.scss",
69
69
  "require": "./lib/styles/_colors.scss"
70
+ },
71
+ "./eslint.config": {
72
+ "import": "./eslint.config.ts",
73
+ "require": "./eslint.config.ts"
70
74
  }
71
75
  },
72
76
  "dependencies": {
@@ -74,29 +78,34 @@
74
78
  "litepicker": "2.0.12",
75
79
  "resize-observer": "1.0.4",
76
80
  "vue": "3.5.13",
77
- "vue-facing-decorator": "2.1.20",
78
- "vue-router": "4.2.5"
81
+ "vue-facing-decorator": "3.0.4",
82
+ "vue-router": "4.5.0"
79
83
  },
80
84
  "devDependencies": {
81
- "@pocketprep/types": "1.14.20",
82
- "@tsconfig/node16": "1.0.3",
83
- "@types/node": "16.18.25",
84
- "@vitejs/plugin-vue": "4.6.2",
85
- "@vue/eslint-config-typescript": "11.0.2",
86
- "@vue/tsconfig": "0.3.2",
87
- "cypress": "12.0.2",
88
- "eslint": "8.34.0",
89
- "eslint-plugin-cypress": "2.12.1",
90
- "eslint-plugin-vue": "9.32.0",
91
- "npm-run-all": "4.1.5",
92
- "postcss-html": "1.5.0",
93
- "sass": "1.58.3",
94
- "stylelint": "15.10.3",
95
- "stylelint-config-recommended-scss": "9.0.1",
96
- "stylelint-config-recommended-vue": "1.4.0",
97
- "typescript": "5.0.4",
98
- "vite": "4.3.4",
99
- "vue-tsc": "1.6.3",
85
+ "@pocketprep/types": "1.14.43",
86
+ "@stylistic/eslint-plugin-ts": "4.2.0",
87
+ "@tsconfig/node22": "22.0.0",
88
+ "@types/node": "22.13.10",
89
+ "@vitejs/plugin-vue": "5.2.3",
90
+ "@vue/eslint-config-typescript": "14.5.0",
91
+ "@vue/tsconfig": "0.7.0",
92
+ "cypress": "14.2.0",
93
+ "eslint": "9.22.0",
94
+ "eslint-plugin-cypress": "4.2.0",
95
+ "eslint-plugin-vue": "10.0.0",
96
+ "jiti": "2.4.2",
97
+ "npm-run-all2": "7.0.2",
98
+ "postcss-html": "1.8.0",
99
+ "sass": "1.86.0",
100
+ "start-server-and-test": "2.0.11",
101
+ "stylelint": "16.16.0",
102
+ "stylelint-config-recommended-scss": "14.1.0",
103
+ "stylelint-config-recommended-vue": "1.6.0",
104
+ "stylelint-config-standard-scss": "14.0.0",
105
+ "typescript": "5.8.2",
106
+ "vite": "6.2.2",
107
+ "vite-plugin-vue-devtools": "7.7.2",
108
+ "vue-tsc": "2.2.8",
100
109
  "yorkie": "2.0.0"
101
110
  },
102
111
  "bugs": {
@@ -0,0 +1,38 @@
1
+ /** @type {import('stylelint').Config} */
2
+ export default {
3
+ 'extends': [
4
+ 'stylelint-config-standard-scss',
5
+ 'stylelint-config-recommended-vue',
6
+ ],
7
+ 'rules': {
8
+ 'at-rule-no-unknown': null,
9
+ 'selector-pseudo-class-no-unknown': [
10
+ true,
11
+ {
12
+ 'ignorePseudoClasses': [ 'export', 'deep' ],
13
+ },
14
+ ],
15
+ 'selector-pseudo-element-no-unknown': null,
16
+ 'selector-type-no-unknown': null,
17
+ 'selector-class-pattern': null,
18
+ 'no-descending-specificity': null,
19
+ 'property-no-unknown': null,
20
+ 'alpha-value-notation': 'number',
21
+ 'scss/at-import-no-partial-leading-underscore': null,
22
+ 'scss/no-global-function-names': null,
23
+ 'declaration-property-value-no-unknown': null,
24
+ 'scss/declaration-property-value-no-unknown': true,
25
+ 'shorthand-property-no-redundant-values': null,
26
+ 'scss/at-else-closing-brace-newline-after': null,
27
+ 'scss/dollar-variable-colon-space-after': null,
28
+ 'scss/at-if-closing-brace-newline-after': null,
29
+ 'scss/at-else-closing-brace-space-after': null,
30
+ 'scss/at-if-closing-brace-space-after': null,
31
+ 'color-function-notation': null,
32
+ 'length-zero-no-unit': null,
33
+ 'declaration-block-no-redundant-longhand-properties': null,
34
+ 'rule-empty-line-before': null,
35
+ 'media-feature-range-notation': null,
36
+ 'declaration-property-value-no-unknown': null,
37
+ },
38
+ }