jobdone-shared-files 0.0.1-beta.10

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 (112) hide show
  1. package/ProjectManagement/projectNavbar.vue +168 -0
  2. package/README.md +27 -0
  3. package/common/directives/collapse.js +13 -0
  4. package/common/format.js +13 -0
  5. package/index.js +15 -0
  6. package/package.json +18 -0
  7. package/paginate.vue +139 -0
  8. package/style/css/vue-loading-overlay/index.css +40 -0
  9. package/style/scss/Bootstrap/_accordion.scss +158 -0
  10. package/style/scss/Bootstrap/_alert.scss +68 -0
  11. package/style/scss/Bootstrap/_badge.scss +38 -0
  12. package/style/scss/Bootstrap/_breadcrumb.scss +40 -0
  13. package/style/scss/Bootstrap/_button-group.scss +142 -0
  14. package/style/scss/Bootstrap/_buttons.scss +207 -0
  15. package/style/scss/Bootstrap/_card.scss +238 -0
  16. package/style/scss/Bootstrap/_carousel.scss +238 -0
  17. package/style/scss/Bootstrap/_close.scss +61 -0
  18. package/style/scss/Bootstrap/_containers.scss +41 -0
  19. package/style/scss/Bootstrap/_dropdown.scss +250 -0
  20. package/style/scss/Bootstrap/_forms.scss +9 -0
  21. package/style/scss/Bootstrap/_functions.scss +302 -0
  22. package/style/scss/Bootstrap/_grid.scss +33 -0
  23. package/style/scss/Bootstrap/_helpers.scss +10 -0
  24. package/style/scss/Bootstrap/_images.scss +42 -0
  25. package/style/scss/Bootstrap/_list-group.scss +204 -0
  26. package/style/scss/Bootstrap/_maps.scss +121 -0
  27. package/style/scss/Bootstrap/_mixins.scss +42 -0
  28. package/style/scss/Bootstrap/_modal.scss +237 -0
  29. package/style/scss/Bootstrap/_nav.scss +172 -0
  30. package/style/scss/Bootstrap/_navbar.scss +286 -0
  31. package/style/scss/Bootstrap/_offcanvas.scss +146 -0
  32. package/style/scss/Bootstrap/_pagination.scss +109 -0
  33. package/style/scss/Bootstrap/_placeholders.scss +51 -0
  34. package/style/scss/Bootstrap/_popover.scss +196 -0
  35. package/style/scss/Bootstrap/_progress.scss +68 -0
  36. package/style/scss/Bootstrap/_reboot.scss +610 -0
  37. package/style/scss/Bootstrap/_root.scss +195 -0
  38. package/style/scss/Bootstrap/_spinners.scss +85 -0
  39. package/style/scss/Bootstrap/_tables.scss +164 -0
  40. package/style/scss/Bootstrap/_toasts.scss +73 -0
  41. package/style/scss/Bootstrap/_tooltip.scss +120 -0
  42. package/style/scss/Bootstrap/_transitions.scss +27 -0
  43. package/style/scss/Bootstrap/_type.scss +106 -0
  44. package/style/scss/Bootstrap/_utilities.scss +748 -0
  45. package/style/scss/Bootstrap/_variables-dark.scss +70 -0
  46. package/style/scss/Bootstrap/_variables.scss +1703 -0
  47. package/style/scss/Bootstrap/bootstrap-grid.scss +66 -0
  48. package/style/scss/Bootstrap/bootstrap-reboot.scss +10 -0
  49. package/style/scss/Bootstrap/bootstrap-utilities.scss +19 -0
  50. package/style/scss/Bootstrap/bootstrap.scss +52 -0
  51. package/style/scss/Bootstrap/forms/_floating-labels.scss +90 -0
  52. package/style/scss/Bootstrap/forms/_form-check.scss +188 -0
  53. package/style/scss/Bootstrap/forms/_form-control.scss +201 -0
  54. package/style/scss/Bootstrap/forms/_form-range.scss +91 -0
  55. package/style/scss/Bootstrap/forms/_form-select.scss +81 -0
  56. package/style/scss/Bootstrap/forms/_form-text.scss +11 -0
  57. package/style/scss/Bootstrap/forms/_input-group.scss +132 -0
  58. package/style/scss/Bootstrap/forms/_labels.scss +36 -0
  59. package/style/scss/Bootstrap/forms/_validation.scss +12 -0
  60. package/style/scss/Bootstrap/helpers/_clearfix.scss +3 -0
  61. package/style/scss/Bootstrap/helpers/_color-bg.scss +10 -0
  62. package/style/scss/Bootstrap/helpers/_colored-links.scss +12 -0
  63. package/style/scss/Bootstrap/helpers/_position.scss +36 -0
  64. package/style/scss/Bootstrap/helpers/_ratio.scss +26 -0
  65. package/style/scss/Bootstrap/helpers/_stacks.scss +15 -0
  66. package/style/scss/Bootstrap/helpers/_stretched-link.scss +15 -0
  67. package/style/scss/Bootstrap/helpers/_text-truncation.scss +7 -0
  68. package/style/scss/Bootstrap/helpers/_visually-hidden.scss +8 -0
  69. package/style/scss/Bootstrap/helpers/_vr.scss +8 -0
  70. package/style/scss/Bootstrap/mixins/_alert.scss +18 -0
  71. package/style/scss/Bootstrap/mixins/_backdrop.scss +14 -0
  72. package/style/scss/Bootstrap/mixins/_banner.scss +7 -0
  73. package/style/scss/Bootstrap/mixins/_border-radius.scss +78 -0
  74. package/style/scss/Bootstrap/mixins/_box-shadow.scss +18 -0
  75. package/style/scss/Bootstrap/mixins/_breakpoints.scss +127 -0
  76. package/style/scss/Bootstrap/mixins/_buttons.scss +70 -0
  77. package/style/scss/Bootstrap/mixins/_caret.scss +69 -0
  78. package/style/scss/Bootstrap/mixins/_clearfix.scss +9 -0
  79. package/style/scss/Bootstrap/mixins/_color-mode.scss +21 -0
  80. package/style/scss/Bootstrap/mixins/_color-scheme.scss +7 -0
  81. package/style/scss/Bootstrap/mixins/_container.scss +11 -0
  82. package/style/scss/Bootstrap/mixins/_deprecate.scss +10 -0
  83. package/style/scss/Bootstrap/mixins/_forms.scss +153 -0
  84. package/style/scss/Bootstrap/mixins/_gradients.scss +47 -0
  85. package/style/scss/Bootstrap/mixins/_grid.scss +151 -0
  86. package/style/scss/Bootstrap/mixins/_image.scss +16 -0
  87. package/style/scss/Bootstrap/mixins/_list-group.scss +27 -0
  88. package/style/scss/Bootstrap/mixins/_lists.scss +7 -0
  89. package/style/scss/Bootstrap/mixins/_pagination.scss +10 -0
  90. package/style/scss/Bootstrap/mixins/_reset-text.scss +17 -0
  91. package/style/scss/Bootstrap/mixins/_resize.scss +6 -0
  92. package/style/scss/Bootstrap/mixins/_table-variants.scss +24 -0
  93. package/style/scss/Bootstrap/mixins/_text-truncate.scss +8 -0
  94. package/style/scss/Bootstrap/mixins/_transition.scss +26 -0
  95. package/style/scss/Bootstrap/mixins/_utilities.scss +97 -0
  96. package/style/scss/Bootstrap/mixins/_visually-hidden.scss +29 -0
  97. package/style/scss/Bootstrap/utilities/_api.scss +47 -0
  98. package/style/scss/Bootstrap/vendor/_rfs.scss +354 -0
  99. package/style/scss/Layout/LayoutBase.scss +942 -0
  100. package/style/scss/Layout/LayoutProject.scss +126 -0
  101. package/style/scss/Layout/LayoutSinglePage.scss +14 -0
  102. package/style/scss/Layout/LayoutTwoColumn.scss +56 -0
  103. package/style/scss/Settings/_Mixins.scss +229 -0
  104. package/style/scss/Settings/_basic-import.scss +5 -0
  105. package/style/scss/Settings/_bs-variables-dark.scss +70 -0
  106. package/style/scss/Settings/_bs-variables.scss +1703 -0
  107. package/style/scss/Settings/_color-mode.scss +123 -0
  108. package/style/scss/Settings/_custom-variables.scss +10 -0
  109. package/tagEditor.vue +264 -0
  110. package/tree.vue +62 -0
  111. package/treeItem.vue +367 -0
  112. package/vueLoadingOverlay.vue +77 -0
@@ -0,0 +1,942 @@
1
+ // ====================================
2
+ // Plugin
3
+ // ====================================
4
+
5
+ // Custom Bootstrap
6
+ @import "../Bootstrap/functions";
7
+ @import "../Settings/bs-variables";
8
+ @import "../Bootstrap/bootstrap.scss";
9
+
10
+
11
+ // ====================================
12
+ // Helpers
13
+ // ====================================
14
+
15
+ // Mixins
16
+ @import "../Settings/Mixins";
17
+
18
+
19
+ // ====================================
20
+ // Custom Style
21
+ // ====================================
22
+
23
+ @import "../Settings/color-mode";
24
+ @import "../Settings/custom-variables";
25
+
26
+
27
+ @mixin gradient-bg(){
28
+ &:before{
29
+ content: "";
30
+ display: block;
31
+ @include position-center();
32
+ z-index: 0;
33
+ background: $gradient-blue-light;
34
+ pointer-events: none;
35
+ transition: $transition-base;
36
+ }
37
+ }
38
+
39
+ @mixin gradient-bg-hover-to-show($opacity: 1){
40
+ @include gradient-bg();
41
+ &:before{ opacity: 0; }
42
+ &:hover:before{ opacity: $opacity; }
43
+ }
44
+
45
+ // general ------------------------------------------
46
+ [v-cloak]{
47
+ display: none !important;
48
+ }
49
+
50
+ body,
51
+ .overflow-auto, .overflow-scroll,
52
+ .overflow-y-auto, .overflow-y-scroll,
53
+ .offcanvas-body, textarea{
54
+ @include scrollbar();
55
+ }
56
+
57
+ .overflow-x-auto, .overflow-x-scroll, .scrollbar-sm, .table-responsive{
58
+ @include scrollbar();
59
+ --scrollbar-width: 6px;
60
+ overflow-x: auto;
61
+ -webkit-overflow-scrolling: touch;
62
+ }
63
+
64
+ .scrollbar-gutter-stable{
65
+ // Safari 暫不支援
66
+ scrollbar-gutter: stable;
67
+ }
68
+
69
+ body{
70
+ background-color: var(--gray-200);
71
+ --maz-color-primary: var(--bs-primary);
72
+ --maz-color-secondary: var(--bs-secondary);
73
+ --maz-color-info: var(--bs-info);
74
+ --maz-color-success: var(--bs-success);
75
+ --maz-color-warning: var(--bs-warning);
76
+ --maz-color-danger: var(--bs-danger);
77
+ --maz-color-bg: var(--bs-body-bg);
78
+ --maz-color-text: var(--bs-body-color);
79
+ --maz-color-muted: var(--bs-secondary-color);
80
+ }
81
+
82
+ ul, ol{
83
+ &.list-reset{
84
+ list-style-type: none;
85
+ padding-left: 0;
86
+ }
87
+ }
88
+ // general ------------------------------------------
89
+
90
+
91
+ // text / link ------------------------------------------
92
+ a{
93
+ text-decoration: none;
94
+ // 如果需要底線使用 <u></u> tag
95
+ transition: $transition-base;
96
+ &.a-reset-color{
97
+ color: inherit;
98
+ }
99
+ &.a-hover-gradient{
100
+ position: relative;
101
+ @include gradient-bg-hover-to-show();
102
+ }
103
+ }
104
+
105
+ .text-link{
106
+ color: var(--bs-link-color);
107
+ &:hover{
108
+ color: var(--bs-link-hover-color);
109
+ }
110
+ }
111
+
112
+ .text-overflow{
113
+ @include text-overflow();
114
+ }
115
+
116
+ @for $i from 1 through 5 {
117
+ .text-line-clamp-#{$i} {
118
+ @include text-line-clamp(#{$i});
119
+ }
120
+ }
121
+
122
+ @for $i from 1 through 5 {
123
+ .letter-spacing-#{$i} {
124
+ letter-spacing: #{$i}px;
125
+ }
126
+ }
127
+
128
+ // text / link ------------------------------------------
129
+
130
+
131
+
132
+ // badge outline ------------------------------------------
133
+
134
+ @each $color, $value in $colors {
135
+ .badge-outline-#{$color}{
136
+ color: $value;
137
+ border: $border-width solid rgba($value, .5);
138
+ background-color: rgba($value, .1);
139
+ }
140
+ }
141
+
142
+ // badge outline ------------------------------------------
143
+
144
+
145
+
146
+ // checkbox / radio ------------------------------------------
147
+
148
+ .check-label{
149
+ cursor: pointer;
150
+ &, &:before, span{
151
+ vertical-align: middle;
152
+ transition: $transition-base;
153
+ }
154
+ &:before{
155
+ content: "check_box_outline_blank";
156
+ display: inline-block;
157
+ margin-right: .1em;
158
+ color: var(--gray-500);
159
+ font-family: 'Material Icons';
160
+ font-size: 120%;
161
+ line-height: inherit;
162
+ white-space: nowrap;
163
+ -webkit-font-feature-settings: 'liga';
164
+ -webkit-font-smoothing: antialiased;
165
+ }
166
+ &:not(.badge):hover{
167
+ &, &:before, span{
168
+ color: $primary;
169
+ }
170
+ }
171
+ }
172
+
173
+ .check-group{
174
+ position: relative;
175
+ display: inline-block;
176
+ vertical-align: middle;
177
+ &:not(:last-child){
178
+ margin-right: 1em;
179
+ }
180
+ > input[type="checkbox"], > input[type="radio"]{
181
+ position: absolute;
182
+ opacity: 0;
183
+ pointer-events: none;
184
+ &:checked ~ .check-label:before{
185
+ color: $primary;
186
+ }
187
+ // disabled style
188
+ &:disabled ~ .check-label{
189
+ cursor: not-allowed;
190
+ span, &:hover span,
191
+ &:before, &:hover &:before{
192
+ color: var(--gray-500);
193
+ }
194
+ }
195
+ &:checked:disabled ~ .check-label{
196
+ &:before, &:hover &:before{
197
+ color: var(--gray-600);
198
+ }
199
+ }
200
+ }
201
+ > input[type="checkbox"] ~ .check-label:before{ content: "check_box_outline_blank"; }
202
+ > input[type="radio"] ~ .check-label:before{ content: "radio_button_unchecked"; }
203
+ > input[type="checkbox"]:checked ~ .check-label:before{ content: "check_box"; }
204
+ > input[type="radio"]:checked ~ .check-label:before{ content: "radio_button_checked"; }
205
+ }
206
+ // checkbox / radio ------------------------------------------
207
+
208
+ // star ------------------------------------------
209
+ .check-star-group{
210
+ > input[type="checkbox"], > input[type="radio"]{
211
+ ~ .check-label:before{
212
+ content: "star_border";
213
+ font-size: 1.5em;
214
+ }
215
+ ~ .check-label:hover:before{
216
+ color: $warning;
217
+ }
218
+ &:checked ~ .check-label:before{
219
+ content: "star";
220
+ color: $warning;
221
+ }
222
+ }
223
+ }
224
+ // star ------------------------------------------
225
+
226
+
227
+ // switch ------------------------------------------
228
+
229
+ :root{
230
+ --switch-w: 24px;
231
+ --switch-h: 12px;
232
+ --switch-padding: 2px;
233
+ --switch-ball-size: calc( var(--switch-h) - var(--switch-padding)*2);
234
+
235
+ }
236
+ .check-switch-group{
237
+ // reset
238
+ .check-label:before{ content: ""; }
239
+ .check-label .switch-item{
240
+ position: relative;
241
+ display: inline-block;
242
+ width: var(--switch-w);
243
+ height: var(--switch-h);
244
+ border-radius: var(--switch-h);
245
+ background-color: var(--gray-500);
246
+ vertical-align: middle;
247
+ &, &:before{
248
+ transition: $transition-base;
249
+ }
250
+ &:before{
251
+ content: "";
252
+ position: absolute;
253
+ top: 0;
254
+ left: var(--switch-padding);
255
+ bottom: 0;
256
+ margin: auto;
257
+ @include size(var(--switch-ball-size));
258
+ border-radius: 50%;
259
+ background-color: $white;
260
+ }
261
+ }
262
+ > input[type="checkbox"], > input[type="radio"]{
263
+ // reset
264
+ ~ .check-label:before{ content: ""; }
265
+ &:checked ~ .check-label:before{ content: ""; }
266
+
267
+ &:not(:disabled) ~ .check-label:hover .switch-item:before{
268
+ will-change: left;
269
+ }
270
+
271
+ &:checked ~ .check-label .switch-item:before{
272
+ left: calc( var(--switch-w) - var(--switch-padding) - var(--switch-ball-size));
273
+ }
274
+
275
+ // disabled style
276
+ &:disabled ~ .check-label .switch-item{
277
+ background-color: var(--gray-400);
278
+ }
279
+ &:checked:disabled ~ .check-label .switch-item{
280
+ background-color: var(--gray-600);
281
+ }
282
+ }
283
+ &-md{
284
+ --switch-w: 30px;
285
+ --switch-h: 15px;
286
+ --switch-padding: 3px;
287
+ --switch-ball-size: calc( var(--switch-h) - var(--switch-padding)*2);
288
+ }
289
+ &-lg{
290
+ --switch-w: 36px;
291
+ --switch-h: 18px;
292
+ --switch-padding: 3px;
293
+ --switch-ball-size: calc( var(--switch-h) - var(--switch-padding)*2);
294
+ }
295
+ &-with-description{
296
+ .switch-item{
297
+ margin-top: .35em;
298
+ }
299
+ .check-label{
300
+ display: flex;
301
+ }
302
+ }
303
+ &-display .check-label{
304
+ cursor: auto;
305
+ }
306
+ }
307
+ @each $color, $value in $colors {
308
+ .check-switch-group.check-switch-group-#{$color}{
309
+ &:hover .check-label .switch-item{
310
+ background-color: rgba($value, .5);
311
+ }
312
+ > input[type="checkbox"], > input[type="radio"]{
313
+ &:checked:not(:disabled) ~ .check-label .switch-item{
314
+ background-color: $value;
315
+ }
316
+ }
317
+ &.check-switch-group-display{
318
+ pointer-events: none;
319
+ }
320
+ &.check-switch-group-display.active .check-label .switch-item{
321
+ background-color: $value;
322
+ &:before{
323
+ left: calc( var(--switch-w) - var(--switch-padding) - var(--switch-ball-size));
324
+ }
325
+ }
326
+ }
327
+ }
328
+
329
+ // badge 版本
330
+ .check-label.badge{
331
+ --bs-badge-padding-x: 1em;
332
+ --bs-badge-padding-y: 0.5em;
333
+ --bs-badge-font-size: var(--bs-body-font-size);
334
+ --bs-badge-font-weight: --bs-body-font-weight;
335
+ }
336
+ .check-switch-group.check-switch-group{
337
+ input:not(:checked) ~ .check-label.badge{
338
+ background-color: var(--gray-100);
339
+ border-color: var(--gray-300);
340
+ span{
341
+ color: var(--gray-500);
342
+ }
343
+ }
344
+ input:not(:checked):disabled ~ .check-label.badge{
345
+ &:hover{
346
+ background-color: var(--gray-100);
347
+ border-color: var(--gray-300);
348
+ }
349
+ &:hover span, span{
350
+ color: var(--gray-400);
351
+ }
352
+ }
353
+ input:checked ~ .check-label.badge{
354
+ &:hover span, span{
355
+ color: currentColor;
356
+ }
357
+ .switch-item{
358
+ background-color: currentColor;
359
+ }
360
+ }
361
+ }
362
+ @each $color, $value in $colors {
363
+ .check-switch-group.check-switch-group-#{$color}{
364
+ input:not(:disabled):not(:checked) ~ .check-label.badge:hover{
365
+ background-color: rgba($value, .05);
366
+ border-color: rgba($value, .25);
367
+ .switch-item{
368
+ background-color: rgba($value, .5);
369
+ }
370
+ span{
371
+ color: rgba($value, .75);
372
+ }
373
+ }
374
+ }
375
+ }
376
+ // switch ------------------------------------------
377
+
378
+
379
+
380
+
381
+ // table ------------------------------------------
382
+ th, td{
383
+ transition: $transition-base;
384
+ }
385
+ .table > .thead-default:not(caption) > * > *{
386
+ font-size: $font-size-sm;
387
+ background-color: var(--gray-200);
388
+ letter-spacing: 0.5px;
389
+ }
390
+
391
+ // firefox 暫不支援
392
+ .table tr:has(.dropdown-delete:hover){
393
+ th:not([scope="col"]), td:not([scope="col"]){
394
+ --bs-table-accent-bg: transparent;
395
+ --bs-table-bg: transparent;
396
+ background-color: $table-danger-bg;
397
+ color: var(--bs-danger);
398
+ }
399
+ }
400
+
401
+ // table ------------------------------------------
402
+
403
+
404
+
405
+ // icon ------------------------------------------
406
+ .text-with-icon > *{
407
+ vertical-align: middle;
408
+ }
409
+
410
+ .material-icons{
411
+ $icon-sizes: 14, 18, 24, 28, 32;
412
+
413
+ font-size: 24px;
414
+ @each $size in $icon-sizes{
415
+ &.icon-#{$size} { font-size: #{$size}px; }
416
+ }
417
+ }
418
+ // icon ------------------------------------------
419
+
420
+
421
+ // button ------------------------------------------
422
+ .btn > *{
423
+ vertical-align: middle;
424
+ }
425
+
426
+ .btn-round-effect{
427
+ position: relative;
428
+ display: inline-flex;
429
+ align-items: center;
430
+ justify-content: center;
431
+ @include size(2em);
432
+ padding: 0;
433
+ text-decoration: none;
434
+ *{
435
+ z-index: 2;
436
+ }
437
+ &:before{
438
+ content: "";
439
+ display: block;
440
+ @include position-center();
441
+ border-radius: 50%;
442
+ background-color: var(--bs-link-color);
443
+ z-index: 1;
444
+ opacity: 0;
445
+ transform: scale(0);
446
+ transition: $transition-base;
447
+ }
448
+ &:hover:before{
449
+ opacity: .1;
450
+ transform: scale(1);
451
+ }
452
+ }
453
+
454
+ .btn-link-light-bg {
455
+ text-decoration: none;
456
+ &:hover {
457
+ color: var(--bs-btn-color);
458
+ background-color: rgba(var(--bs-link-color-rgb), .1);
459
+ }
460
+ }
461
+
462
+
463
+ @keyframes gradient-position {
464
+ 0% {
465
+ transform: translateX(0);
466
+ }
467
+ 50% {
468
+ transform: translateX(-50%);
469
+ }
470
+ 100% {
471
+ transform: translateX(0);
472
+ }
473
+ }
474
+ .btn-gradient-effect{
475
+ --bs-btn-color: #fff;
476
+ --bs-btn-hover-color: #fff;
477
+ --bs-btn-active-color: #fff;
478
+
479
+ position: relative;
480
+ overflow: hidden;
481
+ border: 0;
482
+
483
+ &:before{
484
+ content: "";
485
+ display: block;
486
+ position: absolute;
487
+ top: 0; left: 0;
488
+ width: 200%; height: 100%;
489
+ background: linear-gradient(110deg, $cyan 0%, $purple 50%, $cyan 100%);
490
+ animation: gradient-position 3s ease-in-out infinite;
491
+ animation-fill-mode: both;
492
+ z-index: 1;
493
+ transition: $transition-base;
494
+ }
495
+ &, &:hover, &:hover:active{
496
+ background-color: $primary;
497
+ }
498
+ &:hover:before{
499
+ opacity: .4;
500
+ }
501
+ &:focus{
502
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
503
+ }
504
+ > *{
505
+ position: relative;
506
+ z-index: 2;
507
+ }
508
+ }
509
+ // button ------------------------------------------
510
+
511
+
512
+ // input ------------------------------------------
513
+ .form-group{
514
+ > label, .form-label{
515
+ margin-bottom: 0.25rem;
516
+ color: var(--gray-500);
517
+ font-size: $font-size-sm;
518
+ font-weight: $font-weight-bold;
519
+ }
520
+ }
521
+
522
+ .form-group-frame{
523
+ padding: 1rem;
524
+ border-bottom: $border-width solid $border-color;
525
+ }
526
+ // input ------------------------------------------
527
+
528
+
529
+ // image ------------------------------------------
530
+ .thumbnail-content{
531
+ $thumbnail-sizes: 32, 50, 100, 150;
532
+
533
+ @include size(50px);
534
+ background-color: $white;
535
+ background-position: 50% 50%;
536
+ background-size: cover;
537
+ border: $border-width solid var(--#{$prefix}border-color);
538
+ border-radius: 50%;
539
+ overflow: hidden;
540
+ @each $size in $thumbnail-sizes{
541
+ &.thumbnail-#{$size} { @include solid-size(#{$size}px); }
542
+ }
543
+ &.thumbnail-rwd{
544
+ @include rwd-square(100%);
545
+ }
546
+ }
547
+ // image ------------------------------------------
548
+
549
+
550
+ // dropdown ------------------------------------------
551
+ .dropdown-menu{
552
+ box-shadow: $box-shadow;
553
+ }
554
+ .dropdown-delete{
555
+ color: $danger;
556
+ &:hover{
557
+ --bs-dropdown-link-hover-bg: var(--bs-danger);
558
+ background-color: $danger;
559
+ }
560
+ }
561
+ .dropdown-menu{
562
+ --scrollbar-width: 8px;
563
+ --scrollbar-hover-color: rgba(var(--bs-link-color-rgb), 0.5);
564
+ overflow: auto;
565
+ overscroll-behavior: contain;
566
+ @include scrollbar();
567
+ }
568
+ // dropdown ------------------------------------------
569
+
570
+
571
+ // modal ------------------------------------------
572
+ .modal{
573
+ backdrop-filter: blur(2px);
574
+ }
575
+
576
+ .modal-md{
577
+ min-width: 650px;
578
+ }
579
+ // modal ------------------------------------------
580
+
581
+
582
+ // offcanvas ------------------------------------------
583
+ .offcanvas{
584
+ &-md-size{
585
+ --bs-offcanvas-width: 550px;
586
+ }
587
+ &-lg-size{
588
+ --bs-offcanvas-width: 800px;
589
+ }
590
+ &-xl-size{
591
+ --bs-offcanvas-width: 1000px;
592
+ }
593
+ }
594
+ // offcanvas ------------------------------------------
595
+
596
+
597
+ // navbar ------------------------------------------
598
+ $navbar-h: 60px;
599
+ .navbar-main{
600
+ &, .btn.btn-normal, .navbar-line-item {
601
+ min-height: $navbar-h;
602
+ }
603
+ .btn.btn-normal{
604
+ @include flex-center();
605
+ border-radius: 0;
606
+ color: var(--bs-nav-link-color);
607
+ &:hover{
608
+ color: var(--bs-link-color);
609
+ background-color: $primary-bg-light;
610
+ }
611
+ }
612
+ .btn-square{
613
+ @include size($navbar-h);
614
+ }
615
+ }
616
+ // navbar ------------------------------------------
617
+
618
+
619
+ // 側邊的清單 ------------------------------------------
620
+
621
+ $list-highlight-border-w: .4rem;
622
+
623
+ @mixin list-group-active(){
624
+ font-weight: $font-weight-medium;
625
+ border-left-color: currentColor;
626
+ --bs-list-group-active-color: var(--bs-link-color);
627
+ --bs-list-group-active-bg: transparent;
628
+ @include gradient-bg();
629
+ }
630
+
631
+ .list-group{
632
+ overflow: hidden;
633
+ > li{
634
+ position: relative;
635
+ }
636
+ .material-icon-more{
637
+ transition: $transition-base;
638
+ }
639
+ }
640
+
641
+ // 一般選單 style
642
+ $list-item-padding-x: 1rem;
643
+
644
+ .list-group-aside{
645
+ border-radius: 0;
646
+ .list-group-item{
647
+ display: flex;
648
+ align-items: center;
649
+ padding: .8rem $list-item-padding-x;
650
+ border-right: 0;
651
+ border-color: transparent;
652
+ border-left: $list-highlight-border-w solid transparent;
653
+ background-color: var(--bs-body-bg);
654
+ cursor: pointer;
655
+ transition: $transition-base;
656
+ &:before{ content: ""; }
657
+ &.active{
658
+ @include list-group-active();
659
+ }
660
+ &:not(.active):hover{
661
+ border-top-color: var(--bs-body-bg);
662
+ border-bottom-color: rgba(var(--bs-link-color-rgb), .1);
663
+ border-left-color: $primary-sub-highlight;
664
+ --bs-list-group-action-hover-color: rgba(var(--bs-link-color-rgb), .8);
665
+ --bs-list-group-action-hover-bg: transparent;
666
+ @include gradient-bg-hover-to-show(.7);
667
+ }
668
+ &:hover .material-icon-more{
669
+ color: var(--bs-link-color);
670
+ }
671
+ }
672
+ }
673
+
674
+ // 子選單 style
675
+ .child-body, .child-container{
676
+ width: 100%;
677
+ }
678
+ .child-body{
679
+ background: var(--gray-100);
680
+ }
681
+ .child-container{
682
+ border-left: $list-highlight-border-w solid var(--gray-400);
683
+ }
684
+ .child-list-head{
685
+ padding: .25rem $list-item-padding-x;
686
+ color: var(--gray-500);
687
+ background-color: var(--gray-200);
688
+ font-weight: $font-weight-bold;
689
+ border-bottom: $border-width solid var(--gray-400);
690
+ }
691
+ a.child-list-item{
692
+ position: relative;
693
+ display: block;
694
+ padding: .5rem $list-item-padding-x;
695
+ font-size: $font-size-sm;
696
+
697
+ &:hover{
698
+ color: var(--bs-link-color);
699
+ }
700
+ &.active{
701
+ color: var(--bs-link-color);
702
+ @include gradient-bg();
703
+ }
704
+ &.disabled, &:disabled{
705
+ color: var(--bs-list-group-disabled-color);
706
+ pointer-events: none;
707
+ }
708
+ @include gradient-bg-hover-to-show(.7);
709
+ }
710
+
711
+
712
+ // 子選單開合
713
+ // https://stackoverflow.com/questions/3508605/how-can-i-transition-height-0-to-height-auto-using-css
714
+ $list-toogle-speed: .35s;
715
+ $list-toogle-in-background: $list-toogle-speed linear;
716
+
717
+ .list-group-haschild:hover ~ .child-body{
718
+ &:after{ will-change: height, max-height; }
719
+ > .child-container { will-change: max-height, margin-bottom; }
720
+ }
721
+
722
+ .child-body{
723
+ position: relative;
724
+ display: flex;
725
+ overflow: hidden;
726
+ &:after { content: ''; }
727
+ // 關閉 -----------------
728
+ &:after{
729
+ height: 0;
730
+ max-height: 50px;
731
+ transition: height $list-toogle-in-background;
732
+ }
733
+ > .child-container {
734
+ margin-bottom: -2000px;
735
+ visibility: hidden;
736
+ max-height: 0;
737
+ transition: margin-bottom $list-toogle-speed cubic-bezier(1, 0, 1, 1),
738
+ visibility 0s $list-toogle-speed,
739
+ max-height 0s $list-toogle-speed;
740
+ }
741
+ // 關閉 -----------------
742
+ }
743
+
744
+ .list-group-haschild-input:checked{
745
+ ~ .list-group-item{
746
+ @include list-group-active();
747
+ .material-icon-more{
748
+ transform: rotate(-180deg);
749
+ }
750
+ }
751
+ ~ .child-body{
752
+ // 打開 -----------------
753
+ &:after {
754
+ height: 50px;
755
+ transition: height $list-toogle-in-background,
756
+ max-height 0s $list-toogle-in-background;
757
+ max-height: 0px;
758
+ }
759
+ > .child-container{
760
+ transition: margin-bottom $list-toogle-speed cubic-bezier(0, 0, 0, 1);
761
+ margin-bottom: 0;
762
+ visibility: visible;
763
+ max-height: 1000000px;
764
+ }
765
+ // 打開 -----------------
766
+ }
767
+ }
768
+
769
+ // 側邊的清單 ------------------------------------------
770
+
771
+
772
+
773
+ // navbar ------------------------------------------
774
+ .nav-link.active{
775
+ font-weight: $font-weight-bold;
776
+ }
777
+ // navbar ------------------------------------------
778
+
779
+
780
+ // 有底線的 tab bar ------------------------------------------
781
+ .navbar-line{
782
+ &:hover .navbar-line-item{
783
+ &:before { will-change: width, left; }
784
+ ~ .navbar-line-item:before{ will-change: left; }
785
+ }
786
+ // LG 版本 (底線較粗)
787
+ &.navbar-line-lg .navbar-line-item:before{
788
+ border-bottom-width: 4px;
789
+ }
790
+ }
791
+
792
+ a.navbar-line-item{
793
+ --bs-link-color-rgb: 100, 122, 241;
794
+ }
795
+ .navbar-line-item{
796
+ position: relative;
797
+ @include flex-center();
798
+ --bs-navbar-nav-link-padding-x: 1.5rem;
799
+ color: var(--bs-nav-link-color);
800
+ &:before{
801
+ content: "";
802
+ position: absolute;
803
+ top: 0;
804
+ left: 100%;
805
+ width: 0;
806
+ height: 100%;
807
+ border-bottom: 2px solid var(--bs-link-color);
808
+ transition: $transition-base;
809
+ pointer-events: none;
810
+ z-index: 1;
811
+ }
812
+ &:hover{
813
+ background: $primary-bg-light;
814
+ &:before {
815
+ width: 100%;
816
+ left: 0;
817
+ }
818
+ ~ .navbar-line-item:before{
819
+ left: 0;
820
+ }
821
+ }
822
+ &:not(.active):hover:before{
823
+ border-color: $primary-sub-highlight;
824
+ }
825
+ &.active:before{
826
+ width: 100%;
827
+ left: 0;
828
+ }
829
+ }
830
+ // dropdown 版本
831
+ .navbar-line-item.dropdown{
832
+ padding: 0;
833
+ padding-left: 0 !important;
834
+ padding-right: 0 !important;
835
+ // (firefox 暫不支援)
836
+ &:has(.dropdown-toggle[aria-expanded="true"]){
837
+ background: $primary-bg-light;
838
+ &:before{
839
+ width: 100%;
840
+ left: 0;
841
+ border-bottom-color: $primary-sub-highlight;
842
+ }
843
+ }
844
+ &:not(.active) .dropdown-link{
845
+ color: var(--bs-nav-link-color);
846
+ }
847
+ .dropdown-link{
848
+ @include flex-center();
849
+ height: 100%;
850
+ padding: var(--bs-nav-link-padding-y) var(--bs-navbar-nav-link-padding-x);
851
+ }
852
+ .dropdown-toggle[aria-expanded="true"]{
853
+ color: $primary;
854
+ }
855
+ }
856
+
857
+
858
+ .navbar[data-bs-theme="dark"]{
859
+ .navbar-line-item.dropdown:not(.active) .dropdown-link{
860
+ color: lighten($primary, 15%);
861
+ }
862
+ .navbar-nav .show > .nav-link, .navbar-nav .nav-link.active{
863
+ &, a{
864
+ color: $white;
865
+ }
866
+ }
867
+ .navbar-line-item:before{
868
+ border-bottom-color: lighten($primary, 15%);
869
+ }
870
+ .navbar-line-item.dropdown:not(.active) .dropdown-link,
871
+ .navbar-line-item:before{
872
+ opacity: .9;
873
+ }
874
+ }
875
+ // 有底線的 tab bar ------------------------------------------
876
+
877
+
878
+
879
+ // 固定寬度 ------------------------------------------
880
+ .w-33{
881
+ width: 33.33%;
882
+ }
883
+ .w-66{
884
+ width: 66.66%;
885
+ }
886
+ @for $i from 1 through 10 {
887
+ .w-#{$i}rem {
888
+ width: #{$i}rem;
889
+ }
890
+ }
891
+
892
+ // 固定寬度 ------------------------------------------
893
+
894
+
895
+
896
+ // 無內容物 UI ------------------------------------------
897
+ .no-content{
898
+ padding-top: 10rem;
899
+ .content-img > .material-icons, p{
900
+ opacity: .7;
901
+ }
902
+ .content-img > .material-icons{
903
+ font-size: 7rem;
904
+ opacity: .5;
905
+ }
906
+ p{
907
+ font-size: 1.25rem;
908
+ }
909
+ }
910
+ // 無內容物 UI ------------------------------------------
911
+
912
+
913
+
914
+ // 暫定:螢幕寬度小於 992px 不可使用 ------------------------------------------
915
+ .mobile-forbidden{
916
+ display: none;
917
+ }
918
+ @media (max-width: 992px) {
919
+ body{
920
+ overflow: hidden;
921
+ }
922
+ .mobile-forbidden{
923
+ position: fixed;
924
+ top: 0;
925
+ left: 0;
926
+ right: 0;
927
+ bottom: 0;
928
+ margin: auto;
929
+ @include flex-center();
930
+ flex-direction: column;
931
+ padding: 2rem;
932
+ font-size: $font-size-lg;
933
+ text-align: center;
934
+ color: var(--gray-500);
935
+ background: $white $gradient-blue-light;
936
+ z-index: $zindex-max;
937
+ img {
938
+ width: 20rem;
939
+ }
940
+ }
941
+ }
942
+ // 暫定:螢幕寬度小於 992px 不可使用 ------------------------------------------