diff --git a/CHANGELOG.md b/CHANGELOG.md index c63443dfb..fe4b9e997 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ # Changelog +## [3.51.0](https://github.com/primefaces/primevue/tree/3.51.0) (2024-04-04) + +[Full Changelog](https://github.com/primefaces/primevue/compare/3.50.0...3.51.0) + +**Fixed bugs:** + +- tree: loadingMode [\#5509](https://github.com/primefaces/primevue/issues/5509) +- Upload File doen'st show invalidFileSizeMessage [\#5497](https://github.com/primefaces/primevue/issues/5497) +- Stepper: changing step is making the StepperPanel a render [\#5495](https://github.com/primefaces/primevue/issues/5495) +- Multiselect - Filter - Duplicate keys on search. [\#5455](https://github.com/primefaces/primevue/issues/5455) +- Slider: Focus on slider on mouse click not working [\#5446](https://github.com/primefaces/primevue/issues/4833) +- Dropdown: throws error when grouped item is selected [\#5445](https://github.com/primefaces/primevue/issues/5445) +- Stepper: number element box-shadow defect [\#5442](https://github.com/primefaces/primevue/issues/5442) +- Autocomplete: isSelected(option) doesn't work correctly when 'multiple' is true [\#5435](https://github.com/primefaces/primevue/issues/5435) +- Carousel: Unable to scroll vertically on mobile [\#5320](https://github.com/primefaces/primevue/issues/5320) +- InputOtp: Unable to input integers in integerOnly [\#5422](https://github.com/primefaces/primevue/issues/5422) +- Menu components: Hidden Menu-Item can still be activated (focused) on Keyboard-Navigation [\#5318](https://github.com/primefaces/primevue/issues/5318) +- Slider: [Violation] Non-passive event [\#5213](https://github.com/primefaces/primevue/issues/5213) +- DataTable: improve globalFilterFields type [\#5212](https://github.com/primefaces/primevue/issues/5212) +- DataTable: resizableColumns and paginator bug [\#5210](https://github.com/primefaces/primevue/issues/5210) +- Calendar: no enter transition when used in inline mode inside HeadlessUI dialog [\#5294](https://github.com/primefaces/primevue/issues/5294) +- InputNumber: Cut or Paste via keyboard shortcuts in Safari doesn't work [\#3928](https://github.com/primefaces/primevue/issues/3928) +- Calendar: Invalid typings for modelValue. [\#3609](https://github.com/primefaces/primevue/issues/3609) + +**Implemented New Features and Enhancements:** + +- PrimeIcons: version 7 [\#5524](https://github.com/primefaces/primevue/issues/5524) +- Carousel Enhancement - Empty Slot [\#5474](https://github.com/primefaces/primevue/issues/5474) +- Dropdown Pass Through: item [\#5470](https://github.com/primefaces/primevue/issues/5470) +- Tree: Style Classes not passed to nodeicon slot [\#5452](https://github.com/primefaces/primevue/issues/5452) +- fix(types): augment GlobalComponent interface in vue module [\#5419](https://github.com/primefaces/primevue/pull/5419) +- Twice render if $attrs.id not defined [\#5412](https://github.com/primefaces/primevue/issues/5412) +- TieredMenu: Pressing Escape-Key in submenu moves focus to first menuitem [\#5327](https://github.com/primefaces/primevue/issues/5327) + ## [3.50.0](https://github.com/primefaces/primevue/tree/3.50.0) (2024-03-15) [Full Changelog](https://github.com/primefaces/primevue/compare/3.49.1...3.50.0) diff --git a/api-generator/components/carousel.js b/api-generator/components/carousel.js index 7cb397595..5b75bb88d 100644 --- a/api-generator/components/carousel.js +++ b/api-generator/components/carousel.js @@ -121,6 +121,10 @@ const CarouselSlots = [ { name: 'nexticon', description: 'Custom next icon template.' + }, + { + name: 'empty', + description: 'Custom content when there is no data to display.' } ]; diff --git a/assets/styles/layout/_mixins.scss b/assets/styles/layout/_mixins.scss index cafb39b8b..7093f943b 100644 --- a/assets/styles/layout/_mixins.scss +++ b/assets/styles/layout/_mixins.scss @@ -16,4 +16,10 @@ &:hover { text-decoration: underline; } -} \ No newline at end of file +} + +@mixin mobile { + @media (max-width: 900px) { + @content; + } +} diff --git a/assets/styles/layout/layout.scss b/assets/styles/layout/layout.scss index 39ea4e9d6..f8fe35895 100644 --- a/assets/styles/layout/layout.scss +++ b/assets/styles/layout/layout.scss @@ -15,3 +15,13 @@ @import './_responsive'; @import './_animation'; @import './landing/_landing'; +@import './templates/_apollo'; +@import './templates/_atlantis'; +@import './templates/_ultima'; +@import './templates/_freya'; +@import './templates/_verona'; +@import './templates/_diamond'; +@import './templates/_avalon'; +@import './templates/_poseidon'; +@import './templates/_sakai'; +@import './templates/_templates'; diff --git a/assets/styles/layout/templates/_apollo.scss b/assets/styles/layout/templates/_apollo.scss new file mode 100644 index 000000000..a4da19e74 --- /dev/null +++ b/assets/styles/layout/templates/_apollo.scss @@ -0,0 +1,31 @@ +.apollo { + .template { + &-hero { + &-pattern { + width: 96rem; + height: auto; + position: absolute; + bottom: 0; + left: 0; + z-index: 6; + mix-blend-mode: overlay; + } + } + } + +} + +@media only screen and (max-width: 768px) { + .apollo { + .template { + &-hero { + &-pattern { + width: 90rem; + bottom: 20rem; + } + + } + } + + } +} diff --git a/assets/styles/layout/templates/_atlantis.scss b/assets/styles/layout/templates/_atlantis.scss new file mode 100644 index 000000000..44ddb0ab0 --- /dev/null +++ b/assets/styles/layout/templates/_atlantis.scss @@ -0,0 +1,49 @@ +.atlantis { + .template { + &-hero { + &-pattern { + width: 50rem; + height: auto; + position: absolute; + bottom: -7rem; + left: -7rem; + z-index: 6; + } + &-dashboard1, + &-dashboard2{ + border-radius: 1.12rem; + } + } + } + +} + +@media only screen and (max-width: 1200px) { + .atlantis { + .template{ + &-hero { + &-pattern { + width: 45rem; + bottom: -5.75rem; + left: -9.5rem; + } + } + } + + } +} + +@media only screen and (max-width: 768px) { + .atlantis { + .template{ + &-hero { + &-pattern { + width: 50rem; + bottom: 16.75rem; + left: -10.5rem; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_avalon.scss b/assets/styles/layout/templates/_avalon.scss new file mode 100644 index 000000000..2e4397741 --- /dev/null +++ b/assets/styles/layout/templates/_avalon.scss @@ -0,0 +1,60 @@ +.avalon { + .template { + &-hero { + &-pattern { + width: 56rem; + height: auto; + position: absolute; + bottom: 0px; + left: -3.06; + z-index: 6; + + + } + &-rectangle{ + opacity: 0.5; + } + &-light{ + opacity: 0.75; + } + } + &-separator { + &-icon { + width: 7rem; + height: 3.5rem; + border-radius: 99px; + } + } + } + +} +@media only screen and (max-width: 1200px) { + .avalon { + .template{ + &-hero { + &-pattern { + width: 68rem; + height: auto; + bottom: -8rem; + left: -12rem; + } + } + } + + } +} +@media only screen and (max-width: 768px) { + .avalon { + .template{ + &-hero { + &-pattern { + width: 88rem; + height: auto; + bottom: 0rem; + left: -16rem; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_diamond.scss b/assets/styles/layout/templates/_diamond.scss new file mode 100644 index 000000000..a4702d263 --- /dev/null +++ b/assets/styles/layout/templates/_diamond.scss @@ -0,0 +1,45 @@ +.diamond { + .template { + &-hero { + &-pattern { + width: 62.3125rem; + height: 44.8125rem; + position: absolute; + top: -3.62; + left: -3.06; + z-index: 6; + } + } + } + +} +@media only screen and (max-width: 1200px) { + .diamond { + .template{ + &-hero { + &-pattern { + width: 60rem; + height: auto; + bottom: -8rem; + left: -8rem; + } + } + } + + } +} +@media only screen and (max-width: 768px) { + .diamond { + .template{ + &-hero { + &-pattern { + width: 64rem; + height: auto; + bottom: 2rem; + left: -8rem; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_freya.scss b/assets/styles/layout/templates/_freya.scss new file mode 100644 index 000000000..052683627 --- /dev/null +++ b/assets/styles/layout/templates/_freya.scss @@ -0,0 +1,33 @@ +.freya { + .template { + &-hero { + + &-pattern { + height: auto; + width: 45rem; + position: absolute; + bottom: -9rem; + left: 0rem; + z-index: 6; + } + } + } + +} + +@media only screen and (max-width: 768px) { + .freya { + .template { + &-hero { + + &-pattern { + width: 55rem; + height: auto; + bottom: -2rem; + left: 0; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_poseidon.scss b/assets/styles/layout/templates/_poseidon.scss new file mode 100644 index 000000000..6f6aaa58d --- /dev/null +++ b/assets/styles/layout/templates/_poseidon.scss @@ -0,0 +1,47 @@ +.poseidon { + .template { + &-hero { + &-pattern { + width: 102.3125rem; + height: auto; + position: absolute; + bottom: 0rem; + left: -26rem; + z-index: 6; + } + &-dashboard1, + &-dashboard2{ + width: 45rem; + } + } + } + +} +@media only screen and (max-width: 1200px) { + .poseidon { + .template{ + &-hero { + &-pattern { + height: auto; + bottom: 0rem; + left: -34rem; + } + } + } + + } +} +@media only screen and (max-width: 768px) { + .poseidon { + .template{ + &-hero { + &-pattern { + height: auto; + bottom: 21rem; + left: -35rem; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_sakai.scss b/assets/styles/layout/templates/_sakai.scss new file mode 100644 index 000000000..4de81a9f0 --- /dev/null +++ b/assets/styles/layout/templates/_sakai.scss @@ -0,0 +1,54 @@ +.sakai { + .template { + &-hero { + &-pattern { + width: 72.3125rem; + height: auto; + position: absolute; + bottom: -1rem; + left: -1rem; + z-index: 6; + } + &-dashboard1, + &-dashboard2{ + width: 42rem; + } + } + &-features-horizontal-card{ + width: 30rem; + } + } + +} + +@media only screen and (max-width: 1200px) { + .sakai { + .template { + &-hero { + &-pattern { + width: 72.3125rem; + height: auto; + bottom: -1rem; + left: -2rem; + } + } + } + + } +} + +@media only screen and (max-width: 768px) { + .sakai { + .template { + &-hero { + &-pattern { + width: 64.3125rem; + height: auto; + bottom: 20rem; + left: -2rem; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_templates.scss b/assets/styles/layout/templates/_templates.scss new file mode 100644 index 000000000..f7a3a18fd --- /dev/null +++ b/assets/styles/layout/templates/_templates.scss @@ -0,0 +1,1529 @@ +.template { + display: flex; + flex-direction: column; + gap: 2.19rem; +} + +// TEMPLATE YOUTUBE +.template { + &-youtube { + &-wrapper { + padding: 5rem 0; + background-color: var(--surface-card); + border-radius: 2rem; + } + + &-title { + h2 { + margin: 0; + text-align: center; + font-size: 3rem; + font-weight: 600; + color: var(--surface-900); + + @include mobile { + font-size: 1.5rem; + } + } + } + + &-video { + position: relative; + padding-bottom: 56.25%; + height: 100%; + overflow: hidden; + + iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 0.5rem; + } + } + + &-description { + font-size: 0.875rem; + font-weight: 400; + line-height: 1.25rem; + text-align: center; + color: var(--surface-900); + width: 45rem; + margin: 1.25rem auto 0; + + @include mobile { + font-size: 0.875rem; + line-height: 1.25rem; + width: 96%; + } + } + + &-screen { + margin: 3rem auto 0; + width: 75%; + max-width: 70rem; + box-shadow: 0px 8px 32px 0px rgba(0, 0, 0, 0.02); + cursor: pointer; + position: relative; + background-color: var(--primary-100); + padding: 1.88rem 1.88rem 0; + border-radius: 1.5rem; + overflow: hidden; + + &-blur { + width: 100%; + position: absolute; + height: 100%; + top: 0; + left: 0; + z-index: 4; + backdrop-filter: blur(1.4px); + background: rgba(255, 255, 255, 0.06); + border-radius: inherit; + } + + &:hover &-play svg { + transform: scale(1.6); + } + + &-play { + position: absolute; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + z-index: 5; + transform-origin: center; + + svg { + width: 180px; + height: 180px; + transition: all 0.2s ease; + } + } + + img { + width: 100%; + height: auto; + border-top-right-radius: 1rem; + border-top-left-radius: 1rem; + margin-bottom: -0.25rem; + box-shadow: 0px 0px 120px 0px rgba(0, 0, 0, 0.08); + } + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-youtube { + &-wrapper { + padding: 3rem 0 1.5rem; + border-radius: 1.25rem; + } + + &-title { + h2 { + @include mobile { + font-size: 1.5rem; + } + } + } + + &-description { + @include mobile { + font-size: 0.875rem; + line-height: 1.25rem; + width: 90%; + } + } + + &-screen { + width: 90%; + padding: 1.25rem 1.25rem 0; + border-radius: 1rem; + + &-blur { + backdrop-filter: blur(0.5px); + } + + &-play { + svg { + width: 100px; + height: 100px; + } + } + + img { + border-top-right-radius: 0.5rem; + border-top-left-radius: 0.5rem; + } + } + } + } +} + +// TEMPLATE FEATURES TYPE 1 +.template { + &-features-horizontal { + &-wrapper { + padding: 5rem 2rem; + border-radius: 2rem; + background: var(--surface-card, #FFF); + } + + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 1.5rem; + margin: 0 auto; + width: fit-content; + + &-card { + width: 21.125rem; + padding: 1.25rem; + border-radius: 1.3125rem; + border: 1px solid var(--surface-border, #EEE); + background: var(--surface-0, #FFF); + + &-top { + width: 100%; + margin-bottom: 1.25rem; + background: var(--surface-100, #FFF); + border-radius: 0.65625rem; + overflow: hidden; + display: flex; + + img { + width: 100%; + border-radius: inherit; + } + } + + &-bottom { + &-title { + color: var(--surface-900); + font-size: 1.09375rem; + font-weight: 600; + line-height: 1.3125rem; + margin-top: 0; + margin-bottom: 0.75rem; + } + + &-description { + color: var(--surface-600); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.3125rem; + margin: 0; + } + } + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-features-horizontal { + &-wrapper { + padding: 2rem 1.25rem; + border-radius: 1.25rem; + } + + &-card { + padding: 1rem; + border-radius: 1rem; + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-features-horizontal { + &-wrapper { + padding: 1.5rem 1rem; + } + + width: 98%; + + &-card { + width: 100%; + } + } + } +} + +// TEMPLATE FEATURES TYPE 2 +.template { + &-features-vertical { + &-wrapper { + padding: 7rem 2rem; + border-radius: 2rem; + background: var(--surface-card, #FFF); + } + + margin: 0 auto; + width: 70%; + max-width: 52.75rem; + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 1.5rem; + + &-col { + display: flex; + flex-direction: column; + gap: 1.5rem; + flex: 1; + + &:last-child { + margin-top: 7.5rem; + } + } + + &-card { + width: 100%; + padding: 1.25rem; + border-radius: 1.3125rem; + border: 1px solid var(--surface-border); + background: var(--surface-0); + + &-image { + width: auto; + background: var(--surface-100); + border-radius: 0.65625rem; + display: flex; + + img { + border-radius: inherit; + width: 100%; + height: auto; + } + } + + h2 { + margin: 1.25rem 0 0; + color: var(--surface-900, var(--surface-900, #212121)); + font-size: 1.09375rem; + font-weight: 600; + line-height: 1.3125rem; + } + + p { + margin: 0.75rem 0 0; + color: var(--surface-600, #757575); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.3125rem; + } + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-features-vertical { + &-wrapper { + padding: 2.5rem 1rem; + border-radius: 1.25rem; + } + + max-width: 100%; + width: 100%; + align-items: center; + justify-content: center; + + &-card { + padding: 1rem; + border-radius: 1rem; + + &-img { + height: auto; + width: 100%; + border-radius: 0.5rem; + } + + &-withMargin { + margin-top: 0rem; + } + + &-withoutMargin { + margin-top: 0rem; + } + } + } + } +} + +@media only screen and (max-width: 768px) { + .template { + &-features-vertical { + width: 70%; + flex-direction: column; + + &-col { + &:last-child { + margin-top: 0rem; + } + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-features-vertical { + flex-direction: column; + width: 100%; + } + } +} + +// TEMPLATE RELATED +.template { + &-related { + &-wrapper { + padding: 5rem 2rem; + border-radius: 2rem; + background: var(--surface-card, #FFF); + } + + &-title { + text-align: center; + color: var(--surface-900); + font-size: 3rem; + font-weight: 600; + } + + &-slide { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + width: fit-content; + margin: 3rem auto 0; + gap: 1.5rem; + + &-card { + border-radius: 1.3125rem; + border: 1px solid var(--surface-border, #EEE); + background: var(--surface-0, #FFF); + padding: 1.25rem; + display: flex; + img { + width: 18.625rem; + height: auto; + border-radius: 0.65625rem; + } + } + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-related { + &-wrapper { + padding: 2.5rem 1.25rem; + border-radius: 1.25rem; + } + + &-title { + padding-top: 1.5rem; + font-size: 1.5rem; + } + + &-slide { + gap: 2rem; + + width: 90%; + margin: 2rem auto 0; + + &-card { + border-radius: 1rem; + padding: 1rem; + max-width: 24rem; + + img { + width: 100%; + height: auto; + border-radius: 0.5rem; + } + } + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-related { + &-wrapper { + padding: 1.5rem 1rem; + } + + &-slide { + width: 98%; + max-width: 100%; + margin: 2rem auto 0; + + &-card { + max-width: 100%; + width: 100%; + } + } + } + } +} + +// TEMPLATE CONFIGURATION +.layout-dark { + .template { + &-configuration { + &-screen { + &-bottom { + background: var(--surface-card) !important; + + p { + color: var(--surface-900); + } + } + } + } + } +} + +.template { + &-configuration { + &-wrapper { + padding: 5rem 2rem; + border-radius: 2rem; + background: var(--surface-card, #FFF); + } + + padding: 2rem; + border-radius: 1.75rem; + border: 1px solid var(--surface-border, #EEE); + background: var(--surface-0, #FFF); + width: 49.25rem; + margin: 0 auto; + + &-title { + font-size: 1.53125rem; + font-weight: 700; + line-height: 1.8125rem; + color: var(--surface-900, var(--surface-900, #212121)); + } + + &-description { + color: var(--surface-600, #757575); + font-size: 1.09375rem; + font-weight: 400; + line-height: 1.64375rem; + margin: 0.75rem 0 0; + } + + &-screen { + border-radius: 0.875rem; + border: 1px solid var(--surface-border, #DFE7EF); + + &-top { + border-radius: 0.75rem 0.75rem 0rem 0rem; + background: var(--surface-0, #FFF); + padding: 0.25rem 1.5rem; + height: 3.5rem; + display: flex; + align-items: center; + gap: 0.5rem; + + &-circle { + width: 0.75rem; + height: 0.75rem; + border-radius: 999px; + } + + &-close { + background-color: #ED6B5D; + } + + &-minimize { + background-color: #F4BE50; + } + + &-zoom { + background-color: #61C554; + } + } + + &-bottom { + padding: 1.5rem; + background: var(--surface-900); + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + display: flex; + flex-direction: column; + gap: 1rem; + position: relative; + + p { + color: var(--surface-0); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.0625rem; + margin: 0; + } + + &-logo { + width: 7.5rem; + height: 7.5rem; + position: absolute; + right: 1.5rem; + bottom: 1.38rem; + } + } + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-configuration { + &-wrapper { + padding: 2.5rem 1.25rem; + border-radius: 1.25rem; + } + + &-title { + font-size: 1.25rem; + } + + &-description { + font-size: 0.85rem; + line-height: 1.25rem; + } + + width: 80%; + padding: 1rem; + border-radius: 1rem; + + &-screen { + border-radius: 0.5rem; + + &-top { + border-radius: 0.5rem 0.5rem 0rem 0rem; + } + + &-bottom { + border-radius: 0rem 0rem 0.5rem 0.5rem; + + + } + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-configuration { + &-wrapper { + padding: 1.5rem 1rem; + } + + width: 98%; + + &-screen { + &-bottom { + &-logo { + width: 5.25rem; + height: 5.25rem; + right: 0.88rem; + bottom: 0.88rem; + } + } + } + } + } +} + +// TEMPLATE FEATURES ANIMATION +.template { + &-features-animation { + &-wrapper { + border-radius: 2rem; + background: var(--surface-card, #FFF); + padding: 5rem 2rem; + } + + &-title { + max-width: 45rem; + margin: 0 auto 3rem; + + h2 { + margin: 0; + color: var(--surface-900); + text-align: center; + font-size: 3rem; + font-weight: 600; + text-align: center; + } + } + + display: flex; + gap: 2.5rem; + width: fit-content; + margin: 0 auto; + padding: 1.75rem; + border-radius: 1.75rem; + border: 1px solid var(--surface-border, #EEE); + + &-left { + width: 100%; + max-width: 30rem; + display: flex; + flex-direction: column; + gap: 1rem; + + &-card { + padding: 1rem; + display: flex; + align-items: flex-start; + gap: 1.5rem; + cursor: pointer; + transition: all 0.2s ease; + + &-active { + border-radius: 0.75rem; + background: var(--surface-100, #F5F5F5); + transition: all 0.2s ease; + } + + &:hover { + border-radius: 0.75rem; + background: var(--surface-100, #F5F5F5); + } + + &:hover &-order { + + div { + &:nth-child(2) { + color: var(--surface-100); + + } + + &:nth-child(3) { + animation: FeaturesOrderAnimation 2.5s ease-in-out; + color: var(--primary-400); + } + } + } + + &-active &-order { + div { + &:nth-child(2) { + color: var(--surface-100); + + } + + &:nth-child(3) { + animation: FeaturesOrderAnimation 2.5s ease-in-out; + color: var(--primary-400); + } + } + } + + &-order { + width: 3.5rem; + height: 100%; + margin-top: -0.25rem; + position: relative; + transition: all 0.2s ease; + + div { + font-size: 2.5rem; + font-weight: 700; + position: absolute; + top: 0; + left: 0; + + &:nth-child(1) { + color: var(--primary-400); + -webkit-text-stroke: 1.2px var(--primary-400); + } + + &:nth-child(2) { + color: var(--surface-card); + transition: all 0.2s ease; + } + + &:nth-child(3) { + color: transparent; + } + } + } + + + + &-content { + flex: 1; + + h5 { + color: var(--surface-900, var(--color-surface-900, #212121)); + font-size: 1.09375rem; + font-weight: 600; + line-height: 1.3125rem; + margin: 0; + } + + p { + color: var(--surface-600, #757575); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.3125rem; + margin: 0.38rem 0 0; + + a { + color: var(--primary-400); + + &:hover { + text-decoration: underline; + } + } + } + + } + } + } + + &-right { + width: 30rem; + height: fit-content; + border-radius: 0.875rem; + background-color: var(--surface-100); + display: flex; + overflow: hidden; + img { + width: 100%; + height: auto; + } + + &-inline { + width: 100%; + padding: 2rem 0; + border-radius: 0.75rem; + background: var(--surface-100); + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + &-image { + width: 90%; + overflow: hidden; + position: relative; + display: flex; + margin-top: 1.25rem; + border-radius: 0.5rem; + box-shadow: 0px 0px 48px 0px rgba(0, 0, 0, 0.08); + + img { + max-height: 24rem; + } + } + + &-tabs { + display: flex; + align-items: center; + gap: 0.25rem; + border-radius: 2.5rem; + border: 1px solid var(--surface-border); + background: var(--surface-0); + padding: 0.25rem; + width: 90%; + + button { + flex: 1; + width: 100%; + padding: 0.21875rem 0.5rem; + border-radius: 2.25rem; + color: var(--surface-900); + background: var(--surface-0); + border: none; + outline: none; + font-size: 0.75rem; + font-weight: 500; + line-height: 1rem; + letter-spacing: -0.015rem; + cursor: pointer; + transition: all 0.15s ease; + + &:hover { + background: var(--surface-100); + } + + + } + + &-btnActive { + background: var(--surface-100) !important; + + } + } + } + } + } +} + +@keyframes FeaturesOrderAnimation { + 0% { + clip-path: polygon(0% 100%, 15% 100%, 32% 100%, 54% 100%, 70% 100%, 84% 100%, 100% 100%, + 100% 100%, 0% 100%); + } + + 20% { + clip-path: polygon(0% 45%, 15% 44%, 32% 50%, 54% 60%, 70% 61%, 84% 59%, 100% 52%, + 100% 100%, 0% 100%); + } + + 40% { + clip-path: polygon(0% 60%, 16% 65%, 34% 66%, 51% 62%, 67% 50%, 84% 45%, 100% 46%, 100% 100%, 0% 100%); + } + + 60% { + clip-path: polygon(0 51%, 14% 31%, 33% 42%, 49% 53%, 68% 55%, 85% 50%, 100% 60%, 100% 100%, 0 100%); + } + + 100% { + clip-path: polygon(0 0, 18% 0, 39% 0, 53% 0, 62% 0, 87% 0, 100% 0, 100% 100%, 0 100%); + } +} + +@media only screen and (max-width: 1440px) { + .template { + &-features-animation { + + &-left { + flex: 0.4; + } + + &-right { + flex: 0.6; + &-inline { + &-image { + width: 92%; + } + + &-tabs { + width: 92%; + + button { + padding: 0.21875rem 0.25rem; + } + } + } + } + + + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-features-animation { + &-wrapper { + padding: 2.5rem 1.25rem; + } + + &-title { + padding-top: 1.5rem; + + h2 { + font-size: 1.5rem; + } + } + + flex-direction: column-reverse; + gap: 1.31rem; + padding: 1rem; + border-radius: 1rem; + width: 70%; + + &-left { + width: 100%; + max-width: 100%; + } + + &-right { + border-radius: 0.75rem; + width: 100%; + min-width: 0rem; + max-width: 100%; + + &-inline { + height: fit-content; + padding: 2rem 0; + + &-image { + width: 90%; + margin: 0; + height: auto; + } + + &-tabs { + display: none; + } + } + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-features-animation { + &-wrapper { + padding: 1.5rem 1rem; + } + + width: 98%; + + + } + } +} + +// TEMPLATE HERO +.template { + display: flex; + flex-direction: column; + gap: 2.19rem; + + &-hero { + width: 100%; + height: 36.25rem; + background: var(--primary-500); + border-radius: 2rem; + position: relative; + overflow: hidden; + + &-card { + position: relative; + z-index: 15; + width: 29rem; + margin-left: 10rem; + margin-top: 9.81rem; + border-radius: 1.5rem; + border: 1px solid rgba(255, 255, 255, 0.24); + background: linear-gradient(180deg, rgba(170, 140, 255, 0.00) 0%, var(--primary-400)/0.8 100%), rgba(255, 255, 255, 0.10); + box-shadow: 0px 2px 4px 0px rgba(255, 255, 255, 0.24) inset, 0px 48px 80px 0px rgba(0, 0, 0, 0.08), 0px -5px 13px -2px rgba(255, 255, 255, 0.55) inset; + backdrop-filter: blur(2px); + padding: 2.25rem 1.75rem; + + + &-logo { + height: 2.5rem; + + svg { + height: 100%; + width: auto; + } + } + + p { + font-size: 0.875rem; + font-weight: 400; + line-height: normal; + margin: 1rem 0 0; + color: var(--surface-0); + } + + &-buttons { + display: flex; + align-items: center; + gap: 1rem; + margin-top: 2rem; + + a { + text-decoration: none; + height: 2.5rem; + flex: 1; + border-radius: 3rem; + + font-size: 0.875rem; + font-weight: 700; + line-height: 1.0625rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + } + + &-btn1 { + border: 1px solid #212121; + background: #212121; + color: white; + + &:hover { + border-color: #444444; + background-color: #444444; + } + } + + &-btn2 { + background-color: var(--primary-600); + border-color: var(--primary-600); + + &:hover { + background-color: var(--primary-700); + border-color: var(--primary-700); + } + } + + } + + &-links { + margin-top: 1rem; + display: flex; + align-items: center; + gap: 1rem; + + a { + display: flex; + align-items: flex-end; + gap: 0.5rem; + color: var(--surface-0); + + span { + font-size: 0.75rem; + font-weight: 300; + line-height: normal; + text-decoration-line: underline; + } + } + } + } + + &-rectangle { + position: absolute; + top: 0rem; + left: -8rem; + z-index: 4; + height: 100%; + width: auto; + } + + &-light { + position: absolute; + top: -4rem; + left: 6rem; + z-index: 5; + + } + + &-dashboard1 { + z-index: 9; + position: absolute; + top: 2.02rem; + left: 60rem; + width: 37.875rem; + box-shadow: 0px 0px 43.64997px 0px rgba(0, 0, 0, 0.12); + border-radius: 0.25rem; + } + + &-dashboard2 { + z-index: 8; + position: absolute; + top: 2.02rem; + left: 42rem; + width: 37.875rem; + box-shadow: 0px 0px 43.64997px 0px rgba(0, 0, 0, 0.12); + border-radius: 0.25rem; + } + } + +} + +@media only screen and (max-width: 1440px) { + .template { + &-hero { + height: 32.25rem; + + &-card { + margin-left: 3.5rem; + margin-top: 7.81rem; + padding: 2rem 1.5rem; + border-radius: 1.25rem; + width: 26.25rem; + } + + &-rectangle { + left: -8rem; + } + + &-light { + left: 2rem; + } + + &-dashboard1 { + top: 2.5rem; + left: 44rem; + width: 36rem; + } + + &-dashboard2 { + top: 2.5rem; + left: 32rem; + width: 36rem; + } + } + } +} + +@media only screen and (max-width: 768px) { + .template { + &-hero { + height: 53.25rem; + padding: 7.5rem 1.25rem 1.25rem; + border-radius: 1rem; + + &-card { + width: 100%; + margin-left: 0rem; + margin-top: 0rem; + padding: 2rem 1.5rem; + border-radius: 1.25rem; + + &-links { + justify-content: center; + } + } + + &-rectangle { + left: -2rem; + height: auto; + width: 80rem; + } + + &-light { + left: 50%; + transform: translateX(-50%); + } + + &-dashboard1 { + top: 28.5rem; + left: 12rem; + width: 80%; + } + + &-dashboard2 { + top: 28.5rem; + left: 1.5rem; + width: 80%; + } + } + + } +} + +@media only screen and (max-width: 576px) { + .template { + &-hero { + &-rectangle { + left: -10rem; + } + + &-dashboard1 { + width: 36rem; + } + + &-dashboard2 { + width: 36rem; + } + } + + } +} + +//TEMPLATE INTRO +.template { + &-intro { + border-radius: 2rem; + background: var(--surface-card, #FFF); + padding: 5rem 2rem; + + h2 { + color: var(--surface-900); + text-align: center; + font-size: 3.42857rem; + font-weight: 600; + line-height: 4rem; + margin: 0; + } + + p { + color: var(--surface-900); + text-align: center; + font-size: 1rem; + font-weight: 400; + line-height: 1.5rem; + max-width: 50rem; + margin: 1.5rem auto 0; + } + + &-image { + position: relative; + background-color: var(--primary-600); + max-width: 75rem; + margin: 3.5rem auto 0; + border-radius: 1.15rem; + display: flex; + + &::after { + content: ''; + position: absolute; + inset: 0; + z-index: 5; + background-color: var(--primary-100); + opacity: 0.15; + border-radius: inherit; + } + + img { + width: 100%; + height: auto; + } + } + } +} + + +@media only screen and (max-width: 992px) { + .template { + &-intro { + padding: 2.5rem 1.25rem; + + h2 { + font-size: 1.5rem; + line-height: normal; + } + + p { + line-height: 1.5; + margin: 1rem auto 0; + font-size: 1rem; + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-intro { + padding: 3rem 1rem; + + h2 { + font-size: 1.5rem; + } + + &-image { + margin: 1.5rem auto 0; + } + } + } +} + + +// TEMPALTE SEPARATOR +.template { + &-separator { + gap: 1.5rem; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + + &::before { + content: ''; + flex: 1; + height: 1px; + background-color: var(--surface-border) + } + + &::after { + content: ''; + flex: 1; + height: 1px; + background-color: var(--surface-border) + } + + &-icon { + width: 3rem; + height: 3rem; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid var(--surface-border); + border-radius: 100%; + background-color: var(--surface-card); + } + } + + +} + +//TEMPLATE LICENCE + +.template { + &-license { + &-wrapper { + padding: 5rem 2rem; + border-radius: 2rem; + background: var(--surface-card, #FFF); + } + + &-cards { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: center; + gap: 1.5rem; + } + + &-card { + width: 21.25rem; + padding: 1.5rem; + border-radius: 1rem; + border: 1px solid var(--surface-200); + background-color: var(--surface-card); + span { + color: var(--surface-900); + font-weight: 600; + line-height: 1.5rem; + } + + h2 { + color: var(--surface-900); + font-size: 2.5rem; + font-weight: 600; + line-height: 3rem; + letter-spacing: -0.025rem; + margin: 1rem 0 1.25rem; + } + + button { + padding: 0.25rem 0.75rem; + border-radius: 0.375rem; + background: var(--surface-900); + text-align: center; + width: 100%; + outline: none; + border: none; + min-height: 2rem; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: var(--surface-700); + } + + color: var(--surface-0); + text-align: center; + font-size: 0.875rem; + font-weight: 500; + line-height: 1.5rem; + letter-spacing: -0.00875rem; + } + + &-included { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 1.25rem; + + p { + color: var(--surface-500); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.5rem; + letter-spacing: -0.00875rem; + margin: 0; + } + } + } + + &-description { + color: var(--surface-500); + text-align: center; + font-size: 0.875rem; + line-height: 1.5rem; + letter-spacing: -0.00875rem; + max-width: 46.75rem; + margin: 1.5rem auto 0; + } + + &-visit { + font-size: 0.875rem; + font-weight: 400; + line-height: 1.5rem; + letter-spacing: -0.00875rem; + text-align: center; + margin: 1.5rem auto 0; + + a { + color: var(--primary-500); + text-decoration-line: underline; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + color: var(--primary-300); + } + } + } + } +} + +@media only screen and (max-width: 992px) { + .template { + &-license { + &-wrapper { + padding: 2.5rem 1.25rem; + border-radius: 1.25rem; + } + &-description{ + max-width: 36.5rem; + } + } + } +} +@media only screen and (max-width: 721px) { + .template { + &-license { + &-card { + width: 80%; + } + &-description{ + max-width: 32rem; + } + } + } +} + +@media only screen and (max-width: 576px) { + .template { + &-license { + &-wrapper { + padding: 1.5rem 1rem; + } + + &-card { + width: 100%; + padding: 1.25rem; + border-radius: 0.75rem; + } + } + } +} diff --git a/assets/styles/layout/templates/_ultima.scss b/assets/styles/layout/templates/_ultima.scss new file mode 100644 index 000000000..7a94dc552 --- /dev/null +++ b/assets/styles/layout/templates/_ultima.scss @@ -0,0 +1,39 @@ +.ultima { + .template { + &-hero { + + &-pattern { + width: 80rem; + height: auto; + position: absolute; + bottom: -26rem; + left: -22.5rem; + z-index: 6; + mix-blend-mode: overlay; + } + + &-dashboard1, + &-dashboard2{ + border-radius: 0.42857rem; + } + + } + } + +} + +@media only screen and (max-width: 768px) { + .ultima { + .template { + &-hero { + + &-pattern { + width: 90rem; + left: -25rem; + bottom: -10rem; + } + } + } + + } +} diff --git a/assets/styles/layout/templates/_verona.scss b/assets/styles/layout/templates/_verona.scss new file mode 100644 index 000000000..d500cb31e --- /dev/null +++ b/assets/styles/layout/templates/_verona.scss @@ -0,0 +1,48 @@ +.verona { + .template { + &-hero { + + &-pattern { + width: 110rem; + height: auto; + position: absolute; + bottom: -2rem; + left: -1rem; + z-index: 6; + } + + } + } + +} + +@media only screen and (max-width: 1200px) { + .verona { + .template { + &-hero { + &-pattern { + width: 120rem; + left: -7.5rem; + bottom: -10rem; + } + } + } + + } +} + +@media only screen and (max-width: 768px) { + .verona { + .template { + &-hero { + + &-pattern { + width: 124rem; + left: -8.5rem; + bottom: 0; + } + } + } + + } +} diff --git a/components/lib/accordion/Accordion.vue b/components/lib/accordion/Accordion.vue index e9fb3fa53..534e9b37f 100755 --- a/components/lib/accordion/Accordion.vue +++ b/components/lib/accordion/Accordion.vue @@ -73,16 +73,16 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeIndex(newValue) { this.d_activeIndex = newValue; } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { isAccordionTab(child) { return child.type.name === 'AccordionTab'; diff --git a/components/lib/autocomplete/AutoComplete.vue b/components/lib/autocomplete/AutoComplete.vue index 77dd800bb..090a7df33 100755 --- a/components/lib/autocomplete/AutoComplete.vue +++ b/components/lib/autocomplete/AutoComplete.vue @@ -218,8 +218,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, suggestions() { if (this.searching) { @@ -232,7 +235,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); this.autoUpdateModel(); }, updated() { diff --git a/components/lib/calendar/Calendar.vue b/components/lib/calendar/Calendar.vue index db5cf0c84..f8ec80005 100755 --- a/components/lib/calendar/Calendar.vue +++ b/components/lib/calendar/Calendar.vue @@ -540,8 +540,11 @@ export default { }; }, watch: { - id: function (newValue) { - this.d_id = newValue || UniqueComponentId(); + id: { + immediate: true, + handler: function (newValue) { + this.d_id = newValue || UniqueComponentId(); + } }, modelValue(newValue) { this.updateCurrentMetaData(); @@ -592,7 +595,6 @@ export default { this.updateCurrentMetaData(); }, mounted() { - this.d_id = this.d_id || UniqueComponentId(); this.createResponsiveStyle(); this.bindMatchMediaListener(); diff --git a/components/lib/carousel/Carousel.d.ts b/components/lib/carousel/Carousel.d.ts index 7b890a0e7..4cfa9f355 100755 --- a/components/lib/carousel/Carousel.d.ts +++ b/components/lib/carousel/Carousel.d.ts @@ -350,6 +350,10 @@ export interface CarouselSlots { * Custom next icon template. */ nexticon(): VNode[]; + /** + * Custom empty template. + */ + empty(): VNode[]; } /** diff --git a/components/lib/carousel/Carousel.vue b/components/lib/carousel/Carousel.vue index 4a0019af4..3b9a3e0c5 100755 --- a/components/lib/carousel/Carousel.vue +++ b/components/lib/carousel/Carousel.vue @@ -3,7 +3,7 @@
-
+
+ + {{ emptyMessageText }} +
@@ -186,75 +189,73 @@ export default { } }, updated() { - const isCircular = this.isCircular(); - let stateChanged = false; - let totalShiftedItems = this.totalShiftedItems; + if (!this.empty) { + const isCircular = this.isCircular(); + let stateChanged = false; + let totalShiftedItems = this.totalShiftedItems; - if (this.autoplayInterval) { - this.stopAutoplay(); - } - - if (this.d_oldNumScroll !== this.d_numScroll || this.d_oldNumVisible !== this.d_numVisible || this.d_oldValue.length !== this.value.length) { - this.remainingItems = (this.value.length - this.d_numVisible) % this.d_numScroll; - - let page = this.d_page; - - if (this.totalIndicators !== 0 && page >= this.totalIndicators) { - page = this.totalIndicators - 1; - - this.$emit('update:page', page); - this.d_page = page; - - stateChanged = true; + if (this.autoplayInterval) { + this.stopAutoplay(); } - totalShiftedItems = page * this.d_numScroll * -1; + if (this.d_oldNumScroll !== this.d_numScroll || this.d_oldNumVisible !== this.d_numVisible || this.d_oldValue.length !== this.value.length) { + this.remainingItems = (this.value.length - this.d_numVisible) % this.d_numScroll; + + let page = this.d_page; + + if (this.totalIndicators !== 0 && page >= this.totalIndicators) { + page = this.totalIndicators - 1; + this.$emit('update:page', page); + this.d_page = page; + stateChanged = true; + } + + totalShiftedItems = page * this.d_numScroll * -1; + + if (isCircular) { + totalShiftedItems -= this.d_numVisible; + } + + if (page === this.totalIndicators - 1 && this.remainingItems > 0) { + totalShiftedItems += -1 * this.remainingItems + this.d_numScroll; + this.isRemainingItemsAdded = true; + } else { + this.isRemainingItemsAdded = false; + } + + if (totalShiftedItems !== this.totalShiftedItems) { + this.totalShiftedItems = totalShiftedItems; + stateChanged = true; + } + + this.d_oldNumScroll = this.d_numScroll; + this.d_oldNumVisible = this.d_numVisible; + this.d_oldValue = this.value; + this.$refs.itemsContainer.style.transform = this.isVertical() ? `translate3d(0, ${totalShiftedItems * (100 / this.d_numVisible)}%, 0)` : `translate3d(${totalShiftedItems * (100 / this.d_numVisible)}%, 0, 0)`; + } if (isCircular) { - totalShiftedItems -= this.d_numVisible; - } + if (this.d_page === 0) { + totalShiftedItems = -1 * this.d_numVisible; + } else if (totalShiftedItems === 0) { + totalShiftedItems = -1 * this.value.length; - if (page === this.totalIndicators - 1 && this.remainingItems > 0) { - totalShiftedItems += -1 * this.remainingItems + this.d_numScroll; - this.isRemainingItemsAdded = true; - } else { - this.isRemainingItemsAdded = false; - } + if (this.remainingItems > 0) { + this.isRemainingItemsAdded = true; + } + } - if (totalShiftedItems !== this.totalShiftedItems) { - this.totalShiftedItems = totalShiftedItems; + if (totalShiftedItems !== this.totalShiftedItems) { + this.totalShiftedItems = totalShiftedItems; - stateChanged = true; - } - - this.d_oldNumScroll = this.d_numScroll; - this.d_oldNumVisible = this.d_numVisible; - this.d_oldValue = this.value; - - this.$refs.itemsContainer.style.transform = this.isVertical() ? `translate3d(0, ${totalShiftedItems * (100 / this.d_numVisible)}%, 0)` : `translate3d(${totalShiftedItems * (100 / this.d_numVisible)}%, 0, 0)`; - } - - if (isCircular) { - if (this.d_page === 0) { - totalShiftedItems = -1 * this.d_numVisible; - } else if (totalShiftedItems === 0) { - totalShiftedItems = -1 * this.value.length; - - if (this.remainingItems > 0) { - this.isRemainingItemsAdded = true; + stateChanged = true; } } - if (totalShiftedItems !== this.totalShiftedItems) { - this.totalShiftedItems = totalShiftedItems; - - stateChanged = true; + if (!stateChanged && this.isAutoplay()) { + this.startAutoplay(); } } - - if (!stateChanged && this.isAutoplay()) { - this.startAutoplay(); - } }, beforeUnmount() { if (this.responsiveOptions) { @@ -408,7 +409,10 @@ export default { }; }, onTouchMove(e) { - if (e.cancelable) { + const touchobj = e.changedTouches[0]; + const diff = this.isVertical() ? touchobj.pageY - this.startPos.y : touchobj.pageX - this.startPos.x; + + if (Math.abs(diff) > this.swipeThreshold && e.cancelable) { e.preventDefault(); } }, @@ -624,6 +628,12 @@ export default { }, attributeSelector() { return UniqueComponentId(); + }, + empty() { + return !this.value || this.value.length === 0; + }, + emptyMessageText() { + return this.$primevue.config?.locale?.emptyMessage || ''; } }, components: { diff --git a/components/lib/cascadeselect/CascadeSelect.vue b/components/lib/cascadeselect/CascadeSelect.vue index 07762eaf3..f154895d8 100644 --- a/components/lib/cascadeselect/CascadeSelect.vue +++ b/components/lib/cascadeselect/CascadeSelect.vue @@ -110,15 +110,17 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, options() { this.autoUpdateModel(); } }, mounted() { - this.id = this.id || UniqueComponentId(); this.autoUpdateModel(); }, beforeUnmount() { diff --git a/components/lib/chips/Chips.vue b/components/lib/chips/Chips.vue index f3ab1305f..ddce4478e 100755 --- a/components/lib/chips/Chips.vue +++ b/components/lib/chips/Chips.vue @@ -76,13 +76,13 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { onWrapperClick() { this.$refs.input.focus(); diff --git a/components/lib/contextmenu/ContextMenu.vue b/components/lib/contextmenu/ContextMenu.vue index f159f8f69..ddd0c4624 100755 --- a/components/lib/contextmenu/ContextMenu.vue +++ b/components/lib/contextmenu/ContextMenu.vue @@ -64,8 +64,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeItemPath(newPath) { if (ObjectUtils.isNotEmpty(newPath)) { @@ -78,8 +81,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.global) { this.bindDocumentContextMenuListener(); } @@ -106,6 +107,9 @@ export default { isItemDisabled(item) { return this.getItemProp(item, 'disabled'); }, + isItemVisible(item) { + return this.getItemProp(item, 'visible') !== false; + }, isItemGroup(item) { return ObjectUtils.isNotEmpty(this.getItemProp(item, 'items')); }, @@ -459,7 +463,7 @@ export default { return this.isValidItem(processedItem) && this.getProccessedItemLabel(processedItem)?.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()); }, isValidItem(processedItem) { - return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item); + return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item); }, isValidSelectedItem(processedItem) { return this.isValidItem(processedItem) && this.isSelected(processedItem); diff --git a/components/lib/datatable/ColumnFilter.vue b/components/lib/datatable/ColumnFilter.vue index d16f506a1..c332048d8 100644 --- a/components/lib/datatable/ColumnFilter.vue +++ b/components/lib/datatable/ColumnFilter.vue @@ -294,8 +294,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, overlay: null, @@ -313,8 +316,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.filters && this.filters[this.field]) { let fieldFilters = this.filters[this.field]; diff --git a/components/lib/dialog/Dialog.vue b/components/lib/dialog/Dialog.vue index 762db37f9..708044f70 100755 --- a/components/lib/dialog/Dialog.vue +++ b/components/lib/dialog/Dialog.vue @@ -88,8 +88,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, documentKeydownListener: null, @@ -124,8 +127,6 @@ export default { this.mask = null; }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.breakpoints) { this.createStyle(); } diff --git a/components/lib/dock/DockSub.vue b/components/lib/dock/DockSub.vue index 51e85cfc7..ad96d8067 100644 --- a/components/lib/dock/DockSub.vue +++ b/components/lib/dock/DockSub.vue @@ -106,13 +106,13 @@ export default { }; }, watch: { - menuId(newValue) { - this.id = newValue || UniqueComponentId(); + menuId: { + immediate: true, + handler(newValue) { + this.id = newValue || UniqueComponentId(); + } } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { getItemId(index) { return `${this.id}_${index}`; diff --git a/components/lib/dropdown/Dropdown.vue b/components/lib/dropdown/Dropdown.vue index 8ada4cbd9..d85a8fc7f 100755 --- a/components/lib/dropdown/Dropdown.vue +++ b/components/lib/dropdown/Dropdown.vue @@ -224,8 +224,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, modelValue() { this.isModelValueChanged = true; @@ -235,7 +238,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); this.autoUpdateModel(); this.bindLabelClickListener(); }, diff --git a/components/lib/fieldset/Fieldset.vue b/components/lib/fieldset/Fieldset.vue index 95fb7c7ec..22ecc2303 100755 --- a/components/lib/fieldset/Fieldset.vue +++ b/components/lib/fieldset/Fieldset.vue @@ -54,16 +54,16 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, collapsed(newValue) { this.d_collapsed = newValue; } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { toggle(event) { this.d_collapsed = !this.d_collapsed; diff --git a/components/lib/galleria/GalleriaContent.vue b/components/lib/galleria/GalleriaContent.vue index 6ab095b66..de8e91df0 100755 --- a/components/lib/galleria/GalleriaContent.vue +++ b/components/lib/galleria/GalleriaContent.vue @@ -76,15 +76,18 @@ export default { emits: ['activeitem-change', 'mask-hide'], data() { return { - id: this.$attrs.id || UniqueComponentId(), + id: this.$attrs.id, activeIndex: this.$attrs.activeIndex, numVisible: this.$attrs.numVisible, slideShowActive: false }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, '$attrs.value': function (newVal) { if (newVal && newVal.length < this.numVisible) { @@ -101,9 +104,6 @@ export default { newVal ? this.startSlideShow() : this.stopSlideShow(); } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, updated() { this.$emit('activeitem-change', this.activeIndex); }, diff --git a/components/lib/listbox/Listbox.vue b/components/lib/listbox/Listbox.vue index 6d5e874f1..d8ac7177c 100755 --- a/components/lib/listbox/Listbox.vue +++ b/components/lib/listbox/Listbox.vue @@ -155,15 +155,17 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, options() { this.autoUpdateModel(); } }, mounted() { - this.id = this.id || UniqueComponentId(); this.autoUpdateModel(); }, methods: { diff --git a/components/lib/megamenu/MegaMenu.vue b/components/lib/megamenu/MegaMenu.vue index 6f934efa9..4e9ee6879 100755 --- a/components/lib/megamenu/MegaMenu.vue +++ b/components/lib/megamenu/MegaMenu.vue @@ -86,8 +86,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeItem(newItem) { if (ObjectUtils.isNotEmpty(newItem)) { @@ -100,7 +103,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); this.bindMatchMediaListener(); }, beforeUnmount() { @@ -119,6 +121,9 @@ export default { isItemDisabled(item) { return this.getItemProp(item, 'disabled'); }, + isItemVisible(item) { + return this.getItemProp(item, 'visible') !== false; + }, isItemGroup(item) { return ObjectUtils.isNotEmpty(this.getItemProp(item, 'items')); }, @@ -515,7 +520,7 @@ export default { return this.isValidItem(processedItem) && this.getProccessedItemLabel(processedItem)?.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()); }, isValidItem(processedItem) { - return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item); + return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item); }, isValidSelectedItem(processedItem) { return this.isValidItem(processedItem) && this.isSelected(processedItem); diff --git a/components/lib/menu/Menu.vue b/components/lib/menu/Menu.vue index 87f8b928e..ece3fa078 100644 --- a/components/lib/menu/Menu.vue +++ b/components/lib/menu/Menu.vue @@ -72,8 +72,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, target: null, @@ -83,8 +86,6 @@ export default { container: null, list: null, mounted() { - this.id = this.id || UniqueComponentId(); - if (!this.popup) { this.bindResizeListener(); this.bindOutsideClickListener(); diff --git a/components/lib/menubar/Menubar.vue b/components/lib/menubar/Menubar.vue index 67e845a25..be2aece2d 100755 --- a/components/lib/menubar/Menubar.vue +++ b/components/lib/menubar/Menubar.vue @@ -79,8 +79,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeItemPath(newPath) { if (ObjectUtils.isNotEmpty(newPath)) { @@ -96,7 +99,6 @@ export default { container: null, menubar: null, mounted() { - this.id = this.id || UniqueComponentId(); this.bindMatchMediaListener(); }, beforeUnmount() { @@ -121,6 +123,9 @@ export default { isItemDisabled(item) { return this.getItemProp(item, 'disabled'); }, + isItemVisible(item) { + return this.getItemProp(item, 'visible') !== false; + }, isItemGroup(item) { return ObjectUtils.isNotEmpty(this.getItemProp(item, 'items')); }, @@ -500,7 +505,7 @@ export default { return this.isValidItem(processedItem) && this.getProccessedItemLabel(processedItem)?.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()); }, isValidItem(processedItem) { - return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item); + return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item); }, isValidSelectedItem(processedItem) { return this.isValidItem(processedItem) && this.isSelected(processedItem); diff --git a/components/lib/multiselect/MultiSelect.vue b/components/lib/multiselect/MultiSelect.vue index ccb4de33f..93d3c461a 100755 --- a/components/lib/multiselect/MultiSelect.vue +++ b/components/lib/multiselect/MultiSelect.vue @@ -237,15 +237,17 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, options() { this.autoUpdateModel(); } }, mounted() { - this.id = this.id || UniqueComponentId(); this.autoUpdateModel(); }, beforeUnmount() { diff --git a/components/lib/orderlist/OrderList.vue b/components/lib/orderlist/OrderList.vue index 3f4a36d7c..3e3977eb8 100755 --- a/components/lib/orderlist/OrderList.vue +++ b/components/lib/orderlist/OrderList.vue @@ -92,8 +92,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, beforeUnmount() { @@ -106,8 +109,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.responsive) { this.createStyle(); } diff --git a/components/lib/panel/Panel.vue b/components/lib/panel/Panel.vue index 1e831fc09..91aaff1ba 100755 --- a/components/lib/panel/Panel.vue +++ b/components/lib/panel/Panel.vue @@ -58,16 +58,16 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, collapsed(newValue) { this.d_collapsed = newValue; } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { toggle(event) { this.d_collapsed = !this.d_collapsed; diff --git a/components/lib/panelmenu/PanelMenu.vue b/components/lib/panelmenu/PanelMenu.vue index 950969a10..03f7573df 100644 --- a/components/lib/panelmenu/PanelMenu.vue +++ b/components/lib/panelmenu/PanelMenu.vue @@ -73,13 +73,13 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { getItemProp(item, name) { return item ? ObjectUtils.getItemValue(item[name]) : undefined; diff --git a/components/lib/password/Password.vue b/components/lib/password/Password.vue index 7645e6bdc..c0fd068dd 100755 --- a/components/lib/password/Password.vue +++ b/components/lib/password/Password.vue @@ -77,8 +77,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, mediumCheckRegExp: null, @@ -87,7 +90,6 @@ export default { scrollHandler: null, overlay: null, mounted() { - this.id = this.id || UniqueComponentId(); this.infoText = this.promptText; this.mediumCheckRegExp = new RegExp(this.mediumRegex); this.strongCheckRegExp = new RegExp(this.strongRegex); diff --git a/components/lib/picklist/PickList.vue b/components/lib/picklist/PickList.vue index 880c4c12a..d1a9a4570 100755 --- a/components/lib/picklist/PickList.vue +++ b/components/lib/picklist/PickList.vue @@ -196,8 +196,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, selection(newValue) { this.d_selection = newValue; @@ -219,8 +222,6 @@ export default { this.destroyMedia(); }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.responsive) { this.createStyle(); this.initMedia(); diff --git a/components/lib/rating/Rating.vue b/components/lib/rating/Rating.vue index 2586f8c94..1f9543726 100755 --- a/components/lib/rating/Rating.vue +++ b/components/lib/rating/Rating.vue @@ -68,13 +68,13 @@ export default { }; }, watch: { - '$attrs.name': function (newValue) { - this.name = newValue || UniqueComponentId(); + '$attrs.name': { + immediate: true, + handler: function (newValue) { + this.name = newValue || UniqueComponentId(); + } } }, - mounted() { - this.name = this.name || UniqueComponentId(); - }, methods: { getPTOptions(key, value) { return this.ptm(key, { diff --git a/components/lib/scrollpanel/ScrollPanel.vue b/components/lib/scrollpanel/ScrollPanel.vue index 99f315991..1adef1ee6 100644 --- a/components/lib/scrollpanel/ScrollPanel.vue +++ b/components/lib/scrollpanel/ScrollPanel.vue @@ -69,13 +69,14 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.$el.offsetParent) { this.initialize(); } diff --git a/components/lib/speeddial/SpeedDial.vue b/components/lib/speeddial/SpeedDial.vue index 56af25988..8d8c8b548 100644 --- a/components/lib/speeddial/SpeedDial.vue +++ b/components/lib/speeddial/SpeedDial.vue @@ -80,16 +80,17 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, visible(newValue) { this.d_visible = newValue; } }, mounted() { - this.id = this.id || UniqueComponentId(); - if (this.type !== 'linear') { const button = DomHandler.findSingle(this.container, '[data-pc-name="button"]'); const firstItem = DomHandler.findSingle(this.list, '[data-pc-section="menuitem"]'); diff --git a/components/lib/splitbutton/SplitButton.vue b/components/lib/splitbutton/SplitButton.vue index 1efd3c116..fcd0a1c4c 100755 --- a/components/lib/splitbutton/SplitButton.vue +++ b/components/lib/splitbutton/SplitButton.vue @@ -78,13 +78,14 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } } }, mounted() { - this.id = this.id || UniqueComponentId(); - this.$watch('$refs.menu.visible', (newValue) => { this.isExpanded = newValue; }); diff --git a/components/lib/stepper/Stepper.vue b/components/lib/stepper/Stepper.vue index 7ba3d49cf..532108d0f 100644 --- a/components/lib/stepper/Stepper.vue +++ b/components/lib/stepper/Stepper.vue @@ -154,16 +154,16 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeStep(newValue) { this.d_activeStep = newValue; } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, methods: { isStep(child) { return child.type.name === 'StepperPanel'; diff --git a/components/lib/tabview/TabView.vue b/components/lib/tabview/TabView.vue index 5528c38b9..39ea5b461 100755 --- a/components/lib/tabview/TabView.vue +++ b/components/lib/tabview/TabView.vue @@ -113,8 +113,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeIndex(newValue) { this.d_activeIndex = newValue; @@ -123,7 +126,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); this.updateInkBar(); this.scrollable && this.updateButtonState(); }, diff --git a/components/lib/tieredmenu/TieredMenu.vue b/components/lib/tieredmenu/TieredMenu.vue index ea172a540..2ccedef02 100755 --- a/components/lib/tieredmenu/TieredMenu.vue +++ b/components/lib/tieredmenu/TieredMenu.vue @@ -71,8 +71,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, activeItemPath(newPath) { if (!this.popup) { @@ -86,9 +89,6 @@ export default { } } }, - mounted() { - this.id = this.id || UniqueComponentId(); - }, beforeUnmount() { this.unbindOutsideClickListener(); this.unbindResizeListener(); @@ -115,6 +115,9 @@ export default { isItemDisabled(item) { return this.getItemProp(item, 'disabled'); }, + isItemVisible(item) { + return this.getItemProp(item, 'visible') !== false; + }, isItemGroup(item) { return ObjectUtils.isNotEmpty(this.getItemProp(item, 'items')); }, @@ -380,8 +383,12 @@ export default { this.onEnterKey(event); }, onEscapeKey(event) { - this.hide(event, true); - !this.popup && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex()); + if (this.focusedItemInfo.level !== 0) { + const _focusedItemInfo = this.focusedItemInfo; + + this.hide(event, false); + !this.popup && (this.focusedItemInfo = { index: Number(_focusedItemInfo.parentKey.split('_')[0]), level: 0, parentKey: '' }); + } event.preventDefault(); }, @@ -489,7 +496,7 @@ export default { return this.isValidItem(processedItem) && this.getProccessedItemLabel(processedItem)?.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()); }, isValidItem(processedItem) { - return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item); + return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item); }, isValidSelectedItem(processedItem) { return this.isValidItem(processedItem) && this.isSelected(processedItem); diff --git a/components/lib/tree/TreeNode.vue b/components/lib/tree/TreeNode.vue index b5b5d6f41..97b9bd372 100755 --- a/components/lib/tree/TreeNode.vue +++ b/components/lib/tree/TreeNode.vue @@ -45,6 +45,7 @@ :node="childNode" :templates="templates" :level="level + 1" + :loadingMode="loadingMode" :expandedKeys="expandedKeys" @node-toggle="onChildNodeToggle" @node-click="onChildNodeClick" diff --git a/components/lib/treeselect/TreeSelect.vue b/components/lib/treeselect/TreeSelect.vue index 26f63e9ea..ffe72d09e 100644 --- a/components/lib/treeselect/TreeSelect.vue +++ b/components/lib/treeselect/TreeSelect.vue @@ -128,8 +128,11 @@ export default { }; }, watch: { - '$attrs.id': function (newValue) { - this.id = newValue || UniqueComponentId(); + '$attrs.id': { + immediate: true, + handler: function (newValue) { + this.id = newValue || UniqueComponentId(); + } }, modelValue: { handler: function () { @@ -166,7 +169,6 @@ export default { } }, mounted() { - this.id = this.id || UniqueComponentId(); this.updateTreeState(); }, methods: { diff --git a/components/template/Configuration.vue b/components/template/Configuration.vue new file mode 100644 index 000000000..7647134ea --- /dev/null +++ b/components/template/Configuration.vue @@ -0,0 +1,37 @@ + + + diff --git a/components/template/Features/Animation/Inline.vue b/components/template/Features/Animation/Inline.vue new file mode 100644 index 000000000..467393c90 --- /dev/null +++ b/components/template/Features/Animation/Inline.vue @@ -0,0 +1,94 @@ + + + diff --git a/components/template/Features/Animation/index.vue b/components/template/Features/Animation/index.vue new file mode 100644 index 000000000..64df0968c --- /dev/null +++ b/components/template/Features/Animation/index.vue @@ -0,0 +1,141 @@ + + + diff --git a/components/template/Features/index.vue b/components/template/Features/index.vue new file mode 100644 index 000000000..5c9dd5b1d --- /dev/null +++ b/components/template/Features/index.vue @@ -0,0 +1,60 @@ + + + diff --git a/components/template/Hero/Light.vue b/components/template/Hero/Light.vue new file mode 100644 index 000000000..c483ef5f9 --- /dev/null +++ b/components/template/Hero/Light.vue @@ -0,0 +1,58 @@ + diff --git a/components/template/Hero/Rectangle.vue b/components/template/Hero/Rectangle.vue new file mode 100644 index 000000000..9284dbb30 --- /dev/null +++ b/components/template/Hero/Rectangle.vue @@ -0,0 +1,18 @@ + diff --git a/components/template/Hero/index.vue b/components/template/Hero/index.vue new file mode 100644 index 000000000..9162de39b --- /dev/null +++ b/components/template/Hero/index.vue @@ -0,0 +1,42 @@ + + + diff --git a/components/template/License.vue b/components/template/License.vue new file mode 100644 index 000000000..1b6a27f55 --- /dev/null +++ b/components/template/License.vue @@ -0,0 +1,38 @@ + + + diff --git a/components/template/Related.vue b/components/template/Related.vue new file mode 100644 index 000000000..75ff8d1c0 --- /dev/null +++ b/components/template/Related.vue @@ -0,0 +1,25 @@ + + + diff --git a/components/template/Separator.vue b/components/template/Separator.vue new file mode 100644 index 000000000..735f0c262 --- /dev/null +++ b/components/template/Separator.vue @@ -0,0 +1,7 @@ + diff --git a/components/template/Youtube.vue b/components/template/Youtube.vue new file mode 100644 index 000000000..9ab7da4c7 --- /dev/null +++ b/components/template/Youtube.vue @@ -0,0 +1,66 @@ +