@mptw/skylens-ui 1.4.109 → 1.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 (130) hide show
  1. package/AGENTS.md +59 -0
  2. package/CLAUDE.md +36 -0
  3. package/README.md +7 -7
  4. package/app/app.config.ts +14 -0
  5. package/app/app.vue +5 -0
  6. package/app/assets/css/layout.css +134 -0
  7. package/app/assets/css/main.css +189 -0
  8. package/{components → app/components}/SLAlertModal.vue +24 -16
  9. package/{components → app/components}/SLBreadcrumbs.vue +12 -8
  10. package/app/components/SLButton.vue +370 -0
  11. package/{components → app/components}/SLCalendarButton.vue +40 -34
  12. package/{components → app/components}/SLCalendarPopup.vue +79 -53
  13. package/{components → app/components}/SLCard.vue +57 -41
  14. package/{components → app/components}/SLChart.vue +6 -3
  15. package/{components → app/components}/SLCheckbox.vue +92 -49
  16. package/{components → app/components}/SLCircleButton.vue +25 -16
  17. package/{components → app/components}/SLCollapsableBlock.vue +44 -33
  18. package/{components → app/components}/SLCollapsableMulitPillSelect.vue +20 -15
  19. package/{components → app/components}/SLConfirmModal.vue +9 -6
  20. package/{components → app/components}/SLContextMenu.vue +88 -48
  21. package/{components → app/components}/SLDateInput.vue +109 -92
  22. package/{components → app/components}/SLDatePicker.vue +9 -7
  23. package/{components → app/components}/SLDistributor.vue +1 -1
  24. package/{components → app/components}/SLDownloadButton.vue +39 -29
  25. package/{components → app/components}/SLDraggable.vue +2 -2
  26. package/{components → app/components}/SLDropdown.vue +33 -25
  27. package/{components → app/components}/SLDropdownItem.vue +9 -5
  28. package/{components → app/components}/SLElementWithTitle.vue +12 -7
  29. package/{components → app/components}/SLEyeCheckbox.vue +44 -31
  30. package/{components → app/components}/SLFileInput.vue +23 -16
  31. package/{components → app/components}/SLGenderAgeSelect.vue +52 -36
  32. package/{components → app/components}/SLHourRangeInput.vue +45 -32
  33. package/{components → app/components}/SLIOSSwitch.vue +81 -60
  34. package/{components → app/components}/SLIcon.vue +4 -3
  35. package/{components → app/components}/SLIconButton.vue +31 -29
  36. package/{components → app/components}/SLInfoTip.vue +51 -40
  37. package/{components → app/components}/SLInsightSitePage.vue +12 -7
  38. package/{components → app/components}/SLLegend.vue +19 -12
  39. package/app/components/SLLinearProgressBar.vue +22 -0
  40. package/{components → app/components}/SLLink.vue +12 -8
  41. package/{components → app/components}/SLLoading.vue +34 -31
  42. package/{components → app/components}/SLMapChart.vue +5 -4
  43. package/{components → app/components}/SLModal.vue +90 -66
  44. package/{components → app/components}/SLMonthCalendarButton.vue +91 -45
  45. package/{components → app/components}/SLMonthPicker.vue +42 -37
  46. package/{components → app/components}/SLMultiEmailInput.vue +163 -113
  47. package/{components → app/components}/SLMultiSelect.vue +37 -26
  48. package/{components → app/components}/SLNoData.vue +16 -11
  49. package/app/components/SLNotification.vue +155 -0
  50. package/{components → app/components}/SLPageModal.vue +14 -9
  51. package/{components → app/components}/SLPagination.vue +45 -33
  52. package/{components → app/components}/SLPillCheckbox.vue +50 -42
  53. package/{components → app/components}/SLPillLabel.vue +43 -28
  54. package/{components → app/components}/SLPopupMenuButton.vue +26 -17
  55. package/{components → app/components}/SLProfileButton.vue +28 -20
  56. package/{components → app/components}/SLProjectShareItem.vue +30 -17
  57. package/{components → app/components}/SLRadioButton.vue +41 -33
  58. package/{components → app/components}/SLRadioButtonGroup.vue +28 -23
  59. package/app/components/SLRadioGroup.vue +221 -0
  60. package/{components → app/components}/SLRangeInput.vue +53 -38
  61. package/{components → app/components}/SLRegionsMapChart.vue +5 -4
  62. package/{components → app/components}/SLRightSider.vue +50 -40
  63. package/{components → app/components}/SLSearchInput.vue +24 -19
  64. package/{components → app/components}/SLSelect.vue +114 -87
  65. package/{components → app/components}/SLSelectAllToggle.vue +52 -37
  66. package/app/components/SLSidebarNav.vue +487 -0
  67. package/{components → app/components}/SLSidebarNavGroupItem.vue +13 -10
  68. package/{components → app/components}/SLSidebarNavGroupItemSection.vue +240 -179
  69. package/{components → app/components}/SLSidebarNavLinkItem.vue +131 -109
  70. package/{components → app/components}/SLSidebarNavSectionItem.vue +21 -18
  71. package/{components → app/components}/SLSitePage.vue +35 -24
  72. package/{components → app/components}/SLSkyInsightSitePage.vue +13 -8
  73. package/{components → app/components}/SLSortByDropdown.vue +35 -22
  74. package/{components → app/components}/SLSpinIcon.vue +6 -3
  75. package/{components → app/components}/SLStayRangeInput.vue +47 -36
  76. package/{components → app/components}/SLTab.vue +7 -2
  77. package/app/components/SLTable.vue +472 -0
  78. package/{components → app/components}/SLTableTooltip.vue +44 -30
  79. package/app/components/SLTabs.vue +528 -0
  80. package/{components → app/components}/SLTextInput.vue +162 -134
  81. package/{components → app/components}/SLTextarea.vue +40 -29
  82. package/{components → app/components}/SLToast.vue +19 -11
  83. package/{components → app/components}/SLToggleButton.vue +18 -11
  84. package/{components → app/components}/SLTwoLayerMultiSelect.vue +180 -85
  85. package/{components → app/components}/SLTwoLayerSelect.vue +47 -37
  86. package/{components → app/components}/SLTwoLayerSingleSelect.vue +52 -33
  87. package/{components → app/components}/SLWarnModal.vue +9 -7
  88. package/app/interface/commons.ts +7 -0
  89. package/{utils → app/utils}/index.ts +213 -146
  90. package/eslint.config.js +3 -0
  91. package/nuxt.config.ts +17 -14
  92. package/package.json +10 -9
  93. package/skills-lock.json +59 -0
  94. package/tsconfig.json +1 -6
  95. package/.eslintrc.cjs +0 -4
  96. package/app.config.ts +0 -5
  97. package/assets/css/layout.styl +0 -98
  98. package/assets/css/tailwind.css +0 -3
  99. package/components/SLButton.vue +0 -337
  100. package/components/SLLinearProgressBar.vue +0 -35
  101. package/components/SLNotification.vue +0 -151
  102. package/components/SLRadioGroup.vue +0 -209
  103. package/components/SLSidebarNav.vue +0 -427
  104. package/components/SLTable.vue +0 -455
  105. package/components/SLTabs.vue +0 -475
  106. package/interface/commons.ts +0 -7
  107. package/pages/index.vue +0 -15
  108. package/tailwind.config.js +0 -271
  109. /package/{assets → app/assets}/css/fonts/MEShPlus-font-icon.eot +0 -0
  110. /package/{assets → app/assets}/css/fonts/MEShPlus-font-icon.svg +0 -0
  111. /package/{assets → app/assets}/css/fonts/MEShPlus-font-icon.ttf +0 -0
  112. /package/{assets → app/assets}/css/fonts/MEShPlus-font-icon.woff +0 -0
  113. /package/{assets → app/assets}/css/icons.css +0 -0
  114. /package/{assets → app/assets}/images/commons/app-logo-white.png +0 -0
  115. /package/{assets → app/assets}/images/commons/app-logo.png +0 -0
  116. /package/{assets → app/assets}/images/commons/empty-box.png +0 -0
  117. /package/{interface → app/interface}/IDateRange.ts +0 -0
  118. /package/{interface → app/interface}/IHourRange.ts +0 -0
  119. /package/{interface → app/interface}/IInputOption.ts +0 -0
  120. /package/{interface → app/interface}/ILegendItem.ts +0 -0
  121. /package/{interface → app/interface}/IOrganization.ts +0 -0
  122. /package/{interface → app/interface}/IPopupMenuButton.ts +0 -0
  123. /package/{interface → app/interface}/IStayRange.ts +0 -0
  124. /package/{interface → app/interface}/ITableField.ts +0 -0
  125. /package/{interface → app/interface}/IWeb.ts +0 -0
  126. /package/{interface → app/interface}/NavConfigType.ts +0 -0
  127. /package/{models → app/models}/DateRange.ts +0 -0
  128. /package/{plugins → app/plugins}/v-calendar.ts +0 -0
  129. /package/{utils → app/utils}/constants.ts +0 -0
  130. /package/{utils → app/utils}/generateSheet.ts +0 -0
@@ -1,427 +0,0 @@
1
- <template lang="pug">
2
- .sidebar(:class="{ closure: closuredProxy, dark, introing }")
3
- .sidebar-modal(@click="onClickedToggle")
4
- .sidebar-intro-modal
5
- .sidebar-wrapper
6
- .sidebar-logo
7
- a.logo(href="javascript:;" @click="onClickedLogo")
8
- img.color-big(src="~/assets/images/commons/app-logo-big.svg", @load='onLogoLoaded')
9
- img.white-big(src="~/assets/images/commons/app-logo-big-white.svg", @load='onLogoLoaded')
10
- img.color-small(src='~/assets/images/commons/app-logo-small.svg', @load='onLogoLoaded')
11
- img.white-small(src='~/assets/images/commons/app-logo-small-white.svg', @load='onLogoLoaded')
12
- nav.site-nav
13
- .nav-wrapper.custom-scrollbar-y
14
- template(v-for='item in config')
15
- SLSidebarNavLinkItem(
16
- v-if='item.navType === "link"'
17
- :nav-collapsed='closured'
18
- :item-config='item'
19
- @click:item='onClickedItem'
20
- )
21
- SLSidebarNavSectionItem(
22
- v-else-if='item.navType === "section"'
23
- :nav-collapsed='closured'
24
- :item-config='item'
25
- @click:item='onClickedItem'
26
- )
27
- SLSidebarNavGroupItem(
28
- v-else-if='item.navType === "group"'
29
- :nav-collapsed='closured'
30
- :nav-dark='dark'
31
- :item-config='item'
32
- @click:item='onClickedItem'
33
- )
34
- .sidebar-nav-divide-item(
35
- v-else
36
- )
37
- .sidebar-mode-setting
38
- .sidebar-mode-setting-title 選單模式
39
- SLIOSSwitch(
40
- :modelValue="dark"
41
- trueLabel="深色"
42
- minTrueLabel="深"
43
- falseLabel="淺色"
44
- minFalseLabel="淺"
45
- :size="closuredProxy ? 'min' : 'xs'"
46
- :color='switchColor'
47
- @update:modelValue="onUpdatedMode"
48
- )
49
- a.sidebar-toggle(href="javascript:;", @click="onClickedToggle")
50
- SLIcon(icon="chevron-left")
51
- SLIcon(icon="chevron-right")
52
- .sidebar-nav-intro(ref='introEl')
53
- .sidebar-nav-intro-header {{ navLinkIntro ? navLinkIntro.title : '' }}
54
- .sidebar-nav-intro-body {{ navLinkIntro ? navLinkIntro.content : '' }}
55
- .sidebar-nav-intro-footer
56
- SLButton(
57
- title='我知道了',
58
- color='primary'
59
- size='sm'
60
- @click='onClickedCloseIntro'
61
- )
62
- .sidebar-nav-intro-arrow
63
- </template>
64
-
65
- <script lang="ts">
66
- import type { PropType } from "vue";
67
- import { createPopper } from '@popperjs/core';
68
- import type { Instance as PopperInstance } from '@popperjs/core';
69
- import { NavType, type NavConfigType } from "~/interface/NavConfigType";
70
-
71
- export default defineComponent({
72
- name: "SLSidebarNav",
73
- props: {
74
- dark: {
75
- type: Boolean,
76
- default: false,
77
- },
78
- closured: {
79
- type: Boolean,
80
- default: false,
81
- },
82
- config: {
83
- type: Array as PropType<NavConfigType>,
84
- default: () => [],
85
- },
86
- navIntros: {
87
- type: Array as PropType<{
88
- code: string;
89
- title: string;
90
- content: string;
91
- targetCode: string;
92
- }[]>,
93
- default: () => [],
94
- },
95
- switchColor: {
96
- type: String,
97
- default: '',
98
- validator: (v: string) => ['', 'primary-600', 'primary'].includes(v),
99
- },
100
- },
101
- emits: ["click:logo", "update:dark", "update:closured", "click:insight", 'close:intro', 'logo:loaded'],
102
- setup(props, { emit }) {
103
- const { closured, navIntros } = toRefs(props);
104
-
105
- const introEl = ref<HTMLElement | null>(null);
106
- const introing = ref(false);
107
-
108
- const closuredProxy = computed({
109
- get: () => closured.value,
110
- set: (newValue) => emit('update:closured', newValue),
111
- });
112
-
113
- let introPopperInstance: PopperInstance | null = null;
114
-
115
- const navLinkIntro = computed(() => navIntros.value[0]);
116
-
117
- function onClickedToggle() {
118
- if (introing.value) return;
119
-
120
- closuredProxy.value = !closuredProxy.value;
121
- }
122
-
123
- function onClickedLogo() {
124
- emit("click:logo");
125
- }
126
-
127
- function onClickedItem(
128
- eventName:
129
- | "click:logo"
130
- | "update:dark"
131
- | "update:closured"
132
- | "click:insight"
133
- ) {
134
- emit(eventName);
135
- }
136
-
137
- function onUpdatedMode(isDark: boolean) {
138
- emit("update:dark", isDark);
139
- }
140
-
141
- function createIntroPopper() {
142
- destroyIntroPopper();
143
-
144
- if (!navLinkIntro.value) return;
145
-
146
- const navLinkIndexEl = document.getElementById(`nav-link-${navLinkIntro.value.targetCode}`);
147
-
148
- if (!introEl.value || !navLinkIndexEl) return;
149
-
150
- introPopperInstance = createPopper(navLinkIndexEl, introEl.value, {
151
- modifiers: [
152
- {
153
- name: 'offset',
154
- options: {
155
- offset: [-6, 39],
156
- },
157
- },
158
- ],
159
- placement: 'right-start',
160
- });
161
- }
162
-
163
- function destroyIntroPopper() {
164
- if (introPopperInstance) {
165
- introPopperInstance.destroy();
166
- }
167
- introPopperInstance = null;
168
- }
169
-
170
- async function showLinkIntro() {
171
- await nextTick();
172
-
173
- if (!introEl.value || !introPopperInstance) return;
174
-
175
- introEl.value.setAttribute('data-show', '');
176
- introPopperInstance.setOptions((options) => ({
177
- ...options,
178
- modifiers: [
179
- ...(options.modifiers || []),
180
- { name: 'eventListeners', enabled: true },
181
- ],
182
- }));
183
- introPopperInstance.update();
184
- introing.value = true;
185
- }
186
-
187
- function hideLinkIntro() {
188
- introing.value = false;
189
-
190
- if (!introEl.value || !introPopperInstance) return;
191
-
192
- introEl.value.removeAttribute('data-show');
193
- introPopperInstance.setOptions((options) => ({
194
- ...options,
195
- modifiers: [
196
- ...(options.modifiers || []),
197
- { name: 'eventListeners', enabled: false },
198
- ],
199
- }));
200
- }
201
-
202
- function displayLinkIntro() {
203
- if (!navLinkIntro.value) return;
204
-
205
- createIntroPopper();
206
- showLinkIntro();
207
- }
208
-
209
- function onClickedCloseIntro() {
210
- hideLinkIntro();
211
-
212
- if (!navLinkIntro.value) return;
213
-
214
- emit('close:intro', navLinkIntro.value.code);
215
- }
216
-
217
- function onLogoLoaded() {
218
- emit('logo:loaded');
219
- }
220
-
221
- return {
222
- introEl,
223
- introing,
224
- closuredProxy,
225
- navLinkIntro,
226
- onClickedToggle,
227
- onClickedLogo,
228
- onClickedItem,
229
- onUpdatedMode,
230
- displayLinkIntro,
231
- onClickedCloseIntro,
232
- onLogoLoaded,
233
- };
234
- },
235
- });
236
- </script>
237
-
238
- <style lang="stylus">
239
- .sidebar
240
- @apply relative h-full
241
-
242
- &.dark
243
- .sidebar-wrapper
244
- @apply bg-primary-800
245
-
246
- &.closure
247
- .sidebar-logo
248
- .logo
249
- img.color-small
250
- @apply s('lg:hidden')
251
-
252
- img.white-big
253
- @apply s('lg:hidden')
254
-
255
- img.white-small
256
- @apply s('lg:block')
257
-
258
- .sidebar-toggle
259
- @apply bg-primary-900
260
-
261
- &:hover
262
- @apply bg-primary-600
263
-
264
- .sidebar-logo
265
- .logo
266
- img.color-big
267
- @apply hidden
268
-
269
- img.white-big
270
- @apply block
271
-
272
- nav
273
- .nav-wrapper.custom-scrollbar-y
274
- /* Handle */
275
- &::-webkit-scrollbar-thumb
276
- @apply bg-primary-600
277
-
278
- /* Handle on hover */
279
- &::-webkit-scrollbar-thumb:hover
280
- @apply bg-primary-600
281
-
282
- .sidebar-mode-setting
283
- @apply text-white
284
-
285
- .ios-switch
286
- label
287
- @apply bg-nav-color-switch-bg border-primary-600
288
-
289
- &:before
290
- @apply border-primary-600 bg-primary-300
291
-
292
- .sidebar-toggle
293
- @apply bg-primary-900 text-white
294
-
295
- &:hover
296
- @apply bg-primary-600
297
-
298
- &.closure
299
- .sidebar-modal
300
- @apply hidden
301
-
302
- .sidebar-wrapper
303
- @apply s('-ml-[188px]')
304
- @apply s('lg:ml-0') s('lg:w-[84px]')
305
-
306
- .sidebar-logo
307
- @apply s('lg:py-3') s('lg:px-0')
308
- .logo
309
- img.color-big
310
- @apply s('lg:hidden')
311
-
312
- img.color-small
313
- @apply s('lg:block')
314
-
315
- .sidebar-toggle
316
- @apply s('-mr-5') bg-primary-300 rounded-l-none rounded-r-xl text-white
317
-
318
- &:hover
319
- @apply bg-primary-400 text-white
320
-
321
- .icon-chevron-left
322
- @apply hidden
323
-
324
- .icon-chevron-right
325
- @apply inline-block
326
-
327
- nav.site-nav
328
- .nav-wrapper
329
- @apply s('lg:items-center')
330
-
331
- .sidebar-mode-setting
332
- @apply p-0 justify-center space-x-0
333
-
334
- &-title
335
- @apply hidden
336
-
337
- .ios-switch
338
- @apply flex-grow-0 flex-shrink-0
339
-
340
- &.introing
341
- .sidebar-intro-modal
342
- @apply block
343
-
344
- .sidebar-wrapper
345
- @apply pointer-events-none
346
-
347
- &-modal
348
- @apply fixed top-0 left-0 w-full h-full bg-white opacity-0
349
- @apply s('lg:hidden')
350
-
351
- &-intro-modal
352
- @apply fixed top-0 left-0 w-full h-full s('bg-mask/80') hidden
353
-
354
- &-wrapper
355
- @apply relative flex flex-col s('w-[188px]') h-full bg-white rounded-r-lg shadow transition-all
356
-
357
- &-logo
358
- @apply flex-grow-0 flex-shrink-0 relative flex justify-center py-4 pr-11 pl-6 transition-all
359
-
360
- .logo
361
- @apply block
362
-
363
- img.white-big, img.white-small, img.color-small
364
- @apply hidden
365
-
366
- nav.site-nav
367
- @apply flex-grow px-1 overflow-hidden
368
-
369
- .nav-wrapper
370
- @apply flex flex-col h-full px-3
371
-
372
- .sidebar-nav-divide-item
373
- @apply w-full h-px my-2 bg-primary-200
374
-
375
- .sidebar-mode-setting
376
- @apply flex-grow-0 flex-shrink-0 flex items-center justify-start my-4 pl-4 space-x-2 text-xs text-primary
377
-
378
- &-title
379
- @apply flex-grow-0 flex-shrink-0
380
-
381
- .ios-switch
382
- @apply flex-grow-0 flex-shrink-0
383
-
384
- label
385
- @apply border-primary-100 bg-primary-25
386
-
387
- &:before
388
- @apply border-primary-100
389
-
390
- &-toggle
391
- @apply absolute top-0 right-0 flex justify-center items-center w-5 h-10 s('mt-2.5') bg-primary-50 rounded-l-xl text-sm text-primary-500 leading-none transition-all
392
-
393
- &:hover
394
- @apply bg-primary-300 text-white
395
-
396
- .icon-chevron-right
397
- @apply hidden
398
-
399
- &-nav-intro
400
- @apply s('w-[288px]') p-4 bg-white rounded-lg hidden
401
-
402
- &[data-show]
403
- @apply block
404
-
405
- &[data-popper-placement^='right'] > &-arrow
406
- @apply s('-left-3.75') s('top-4')
407
-
408
- &-header
409
- @apply mb-2 text-base font-bold text-primary
410
-
411
- &-body
412
- @apply mb-4 text-base text-pgray-2 whitespace-pre-line
413
-
414
- &-footer
415
- @apply text-right
416
-
417
- &-arrow, &-arrow:before
418
- @apply absolute s('w-[17px]') s('h-[20px]') bg-contain
419
- background url('~/assets/images/commons/nav-intro-arrow.svg') top left no-repeat
420
-
421
- &-arrow
422
- @apply invisible
423
-
424
- &:before
425
- content ''
426
- @apply visible
427
- </style>