@m3ui-vue/m3ui-vue 0.1.11 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/{MMenuItem-_n5OG5MT.js → MMenuItem-CIDblhtb.js} +45 -33
  2. package/dist/MMenuItem-CIDblhtb.js.map +1 -0
  3. package/dist/components/MCarousel.vue.d.ts +36 -0
  4. package/dist/components/MDataTable.vue.d.ts +17 -0
  5. package/dist/components/MFab.vue.d.ts +1 -1
  6. package/dist/components/MFlex.vue.d.ts +1 -1
  7. package/dist/components/MMaskField.vue.d.ts +24 -0
  8. package/dist/components/MMultiSelect.vue.d.ts +7 -5
  9. package/dist/components/MNavigationDrawer.vue.d.ts +9 -3
  10. package/dist/components/MNumberField.vue.d.ts +27 -0
  11. package/dist/components/MSelect.vue.d.ts +12 -9
  12. package/dist/components/MSplitter.vue.d.ts +1 -1
  13. package/dist/components/MStack.vue.d.ts +1 -1
  14. package/dist/components/MTable.vue.d.ts +1 -1
  15. package/dist/components/MTextField.vue.d.ts +2 -5
  16. package/dist/components/_MDrawerItemList.vue.d.ts +57 -0
  17. package/dist/index.d.ts +8 -1
  18. package/dist/m3ui-vue.css +1 -1
  19. package/dist/m3ui.js +1864 -1162
  20. package/dist/m3ui.js.map +1 -1
  21. package/dist/rich-text-editor.js +1 -1
  22. package/dist/styles.css +1 -1
  23. package/package.json +1 -1
  24. package/src/components/MCarousel.vue +203 -0
  25. package/src/components/MDataTable.vue +60 -5
  26. package/src/components/MMaskField.vue +198 -0
  27. package/src/components/MMultiSelect.vue +42 -17
  28. package/src/components/MNavigationDrawer.vue +282 -107
  29. package/src/components/MNumberField.vue +176 -0
  30. package/src/components/MSelect.vue +41 -14
  31. package/src/components/MTextField.vue +19 -10
  32. package/src/components/_MDrawerItemList.vue +105 -0
  33. package/src/index.ts +8 -1
  34. package/dist/MMenuItem-_n5OG5MT.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { i as e, n as t, o as n, r, t as i } from "./MMenuItem-_n5OG5MT.js";
1
+ import { i as e, n as t, o as n, r, t as i } from "./MMenuItem-CIDblhtb.js";
2
2
  import { t as a } from "./MIcon-CaEooCmZ.js";
3
3
  import { t as o } from "./_plugin-vue_export-helper-B3ysoDQm.js";
4
4
  import { Fragment as s, computed as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createTextVNode as f, createVNode as p, defineComponent as m, normalizeClass as h, normalizeStyle as g, onBeforeUnmount as _, onMounted as v, openBlock as y, ref as b, renderList as x, shallowRef as S, toDisplayString as C, watch as w, withCtx as T, withKeys as E } from "vue";
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
- .code-editor-container[data-v-b0a66a4b] .cm-editor{height:100%;min-height:inherit;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.8125rem;line-height:1.6}.code-editor-container[data-v-b0a66a4b] .cm-editor.cm-focused{outline:none}.code-editor-container[data-v-b0a66a4b] .cm-scroller{min-height:inherit}.code-editor-container[data-v-b0a66a4b] .cm-content{padding:12px 0}.code-editor-container[data-v-b0a66a4b] .cm-line{padding:0 16px}.code-editor-container[data-v-b0a66a4b] .cm-gutters{background:var(--color-surface-container);border-right:1px solid var(--color-outline-variant);color:var(--color-outline);padding:0 4px;font-size:.75rem}.code-editor-container[data-v-b0a66a4b] .cm-activeLineGutter{background:var(--color-surface-container-high);color:var(--color-on-surface-variant)}.code-editor-container[data-v-b0a66a4b] .cm-activeLine{background:var(--color-surface-container-lowest)}.code-editor-container[data-v-b0a66a4b] .cm-selectionBackground{background:var(--color-primary-container)!important}.code-editor-container[data-v-b0a66a4b] .cm-cursor{border-left-color:var(--color-primary);border-left-width:2px}.code-editor-container[data-v-b0a66a4b] .cm-matchingBracket{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px}.code-editor-container[data-v-b0a66a4b] .cm-foldGutter span{color:var(--color-on-surface-variant)}@keyframes m3-wavy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes m3-wavy-travel{0%{stroke-dashoffset:0}to{stroke-dashoffset:calc(var(--m3-wave-len) * -1px)}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wavy-spin_2\.8s_linear_infinite\]{animation:2.8s linear infinite m3-wavy-spin}.animate-\[m3-wavy-travel_2s_linear_infinite\]{animation:none!important}}.m3-dialog-enter-active[data-v-e7dfca29],.m3-dialog-leave-active[data-v-e7dfca29]{transition:opacity .15s}.m3-dialog-enter-from[data-v-e7dfca29],.m3-dialog-leave-to[data-v-e7dfca29]{opacity:0}.m3-dialog-enter-active .dialog-box[data-v-e7dfca29],.m3-dialog-leave-active .dialog-box[data-v-e7dfca29]{transition:transform .15s}.m3-dialog-enter-from .dialog-box[data-v-e7dfca29],.m3-dialog-leave-to .dialog-box[data-v-e7dfca29]{transform:scale(.95)}.bs-scrim[data-v-5b1fb748]{transition:opacity .3s}.bs-enter-from .bs-scrim[data-v-5b1fb748],.bs-leave-to .bs-scrim[data-v-5b1fb748]{opacity:0}.bs-panel[data-v-5b1fb748]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.bs-enter-from .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(40%)}.bs-leave-to .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(100%)!important}.hue-slider[data-v-872ab758]{background:linear-gradient(90deg,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.hue-slider[data-v-872ab758]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-872ab758]::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.m3-cmd-enter-active[data-v-da578f14],.m3-cmd-leave-active[data-v-da578f14]{transition:opacity .15s}.m3-cmd-enter-from[data-v-da578f14],.m3-cmd-leave-to[data-v-da578f14]{opacity:0}.m3-cmd-enter-active .cmd-box[data-v-da578f14],.m3-cmd-leave-active .cmd-box[data-v-da578f14]{transition:transform .15s}.m3-cmd-enter-from .cmd-box[data-v-da578f14],.m3-cmd-leave-to .cmd-box[data-v-da578f14]{transform:scale(.95)translateY(-10px)}.dt-expand-grid[data-v-fcd73278]{grid-template-rows:0fr;transition:grid-template-rows .25s cubic-bezier(.2,0,0,1);display:grid}.dt-expand-grid.dt-expand-open[data-v-fcd73278]{grid-template-rows:1fr}.dt-expand-body[data-v-fcd73278]{min-height:0;overflow:hidden}.expand-grid[data-v-89e4475b]{grid-template-rows:1fr;display:grid}.expand-body[data-v-89e4475b]{min-height:0;overflow:hidden}.expand-enter-active[data-v-89e4475b]{transition:grid-template-rows .28s cubic-bezier(.2,0,0,1)}.expand-enter-active>.expand-body[data-v-89e4475b]{transition:opacity .22s}.expand-enter-from[data-v-89e4475b]{grid-template-rows:0fr}.expand-enter-from>.expand-body[data-v-89e4475b]{opacity:0}.expand-leave-active[data-v-89e4475b]{transition:grid-template-rows .22s cubic-bezier(.4,0,1,1)}.expand-leave-active>.expand-body[data-v-89e4475b]{transition:opacity .15s}.expand-leave-to[data-v-89e4475b]{grid-template-rows:0fr}.expand-leave-to>.expand-body[data-v-89e4475b]{opacity:0}.m3-file-enter-active[data-v-34a862f0],.m3-file-leave-active[data-v-34a862f0]{transition:all .2s}.m3-file-enter-from[data-v-34a862f0],.m3-file-leave-to[data-v-34a862f0]{opacity:0;transform:translateY(-8px)}.mli-expand-grid{grid-template-rows:1fr;display:grid}.mli-expand-body{min-height:0;padding-left:2rem;overflow:hidden}.mli-expand-enter-active{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1)}.mli-expand-enter-active>.mli-expand-body{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.mli-expand-enter-from{grid-template-rows:0fr}.mli-expand-enter-from>.mli-expand-body{opacity:0}.mli-expand-leave-active{transition:grid-template-rows .25s cubic-bezier(.4,0,1,1)}.mli-expand-leave-active>.mli-expand-body{transition:opacity .12s cubic-bezier(.4,0,1,1)}.mli-expand-leave-to{grid-template-rows:0fr}.mli-expand-leave-to>.mli-expand-body{opacity:0}.nd-scrim[data-v-ae3b65c3]{transition:opacity .28s}.nd-enter-from .nd-scrim[data-v-ae3b65c3],.nd-leave-to .nd-scrim[data-v-ae3b65c3]{opacity:0}.nd-panel[data-v-ae3b65c3]{transition:transform .3s cubic-bezier(.2,0,0,1)}.nd-enter-from .nd-panel[data-v-ae3b65c3],.nd-leave-to .nd-panel[data-v-ae3b65c3]{transform:translate(-100%)}.nd-section-grid[data-v-ae3b65c3]{grid-template-rows:1fr;display:grid}.nd-section-body[data-v-ae3b65c3]{min-height:0;overflow:hidden}.nd-section-enter-active[data-v-ae3b65c3]{transition:grid-template-rows .35s cubic-bezier(.2,0,0,1)}.nd-section-enter-active>.nd-section-body[data-v-ae3b65c3]{transition:opacity .25s cubic-bezier(.2,0,0,1) 80ms}.nd-section-enter-from[data-v-ae3b65c3]{grid-template-rows:0fr}.nd-section-enter-from>.nd-section-body[data-v-ae3b65c3]{opacity:0}.nd-section-leave-active[data-v-ae3b65c3]{transition:grid-template-rows .28s cubic-bezier(.4,0,1,1)}.nd-section-leave-active>.nd-section-body[data-v-ae3b65c3]{transition:opacity .15s cubic-bezier(.4,0,1,1)}.nd-section-leave-to[data-v-ae3b65c3]{grid-template-rows:0fr}.nd-section-leave-to>.nd-section-body[data-v-ae3b65c3]{opacity:0}.nd-inline[data-v-ae3b65c3]{transition:width .3s cubic-bezier(.2,0,0,1);overflow:hidden}.nd-inline[data-v-ae3b65c3]>*{min-width:18rem}.nd-inline.nd-collapsed[data-v-ae3b65c3]>*{min-width:0}.nd-label[data-v-ae3b65c3]{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.nd-inline.nd-collapsed .nd-label[data-v-ae3b65c3]{opacity:0;transition:opacity .1s cubic-bezier(.2,0,0,1)}.nd-inline .nd-collapse-h[data-v-ae3b65c3]{max-height:80px;transition:max-height .3s cubic-bezier(.2,0,0,1)}.nd-inline.nd-collapsed .nd-collapse-h[data-v-ae3b65c3]{max-height:0}.nd-inline .nd-section-body[data-v-ae3b65c3]>*{transition:padding .3s cubic-bezier(.2,0,0,1)}@keyframes m3-wave-flow{0%{transform:translate(0)}to{transform:translate(-20px)}}@keyframes m3-progress-indeterminate{0%{left:-40%}to{left:100%}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wave-flow_1\.2s_linear_infinite\],.animate-\[m3-wave-flow_0\.9s_linear_infinite\],.animate-\[m3-progress-indeterminate_1\.6s_ease-in-out_infinite\]{animation:none!important}}.m3-radio-dot[data-v-cdb650b5]{transform-box:fill-box;transform-origin:50%;transition:transform .15s;transform:scale(0)}.m3-radio-dot.is-checked[data-v-cdb650b5]{transform:scale(1)}.ss-scrim[data-v-ba5b6f4b]{transition:opacity .28s}.ss-enter-from .ss-scrim[data-v-ba5b6f4b],.ss-leave-to .ss-scrim[data-v-ba5b6f4b]{opacity:0}.ss-panel[data-v-ba5b6f4b]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.ss-enter-from .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(40%)}.ss-leave-to .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(100%)!important}@keyframes skeleton-wave-move-32ecf05b{0%{transform:translate(-100%)}60%{transform:translate(100%)}to{transform:translate(100%)}}.skeleton-wave[data-v-32ecf05b]{position:relative;overflow:hidden}.skeleton-wave[data-v-32ecf05b]:after{content:"";background:linear-gradient(90deg, transparent 0%, var(--color-on-surface) 50%, transparent 100%);opacity:.06;animation:1.8s ease-in-out infinite skeleton-wave-move-32ecf05b;position:absolute;inset:0}.toast-row[data-v-746fa345]{grid-template-rows:1fr;padding-bottom:8px;display:grid}.toast-row>.toast-inner[data-v-746fa345]{min-height:0}.m3-toast-bot-enter-active[data-v-746fa345]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-bot-enter-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-bot-enter-from[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-enter-from>.toast-inner[data-v-746fa345]{opacity:0;transform:translateY(20px)scale(.94)}.m3-toast-bot-leave-active[data-v-746fa345]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-bot-leave-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .18s}.m3-toast-bot-leave-to[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-leave-to>.toast-inner[data-v-746fa345]{opacity:0;transform:scale(.92)}.m3-toast-top-enter-active[data-v-746fa345]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-top-enter-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-top-enter-from[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-enter-from>.toast-inner[data-v-746fa345]{opacity:0;transform:translateY(-20px)scale(.94)}.m3-toast-top-leave-active[data-v-746fa345]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-top-leave-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .18s}.m3-toast-top-leave-to[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-leave-to>.toast-inner[data-v-746fa345]{opacity:0;transform:scale(.92)}@keyframes m3-toast-progress-746fa345{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.m3-spot-enter-active[data-v-51b103ff],.m3-spot-leave-active[data-v-51b103ff]{transition:opacity .15s}.m3-spot-enter-from[data-v-51b103ff],.m3-spot-leave-to[data-v-51b103ff]{opacity:0}.m3-spot-enter-active .spot-box[data-v-51b103ff],.m3-spot-leave-active .spot-box[data-v-51b103ff]{transition:transform .15s,opacity .15s}.m3-spot-enter-from .spot-box[data-v-51b103ff]{opacity:0;transform:scale(.96)translateY(-8px)}.m3-spot-leave-to .spot-box[data-v-51b103ff]{opacity:0;transform:scale(.98)}.m3-tour-highlight{box-shadow:0 0 0 4px var(--color-primary);border-radius:8px;position:relative;z-index:201!important}.m3-tour-enter-active,.m3-tour-leave-active{transition:opacity .2s}.m3-tour-enter-from,.m3-tour-leave-to{opacity:0}.m3-markdown[data-v-23db2c2c] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] h4{font-size:var(--text-title-large);line-height:var(--text-title-large--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] p{margin:.5em 0}.m3-markdown[data-v-23db2c2c] a{color:var(--color-primary);text-underline-offset:2px;text-decoration:underline}.m3-markdown[data-v-23db2c2c] a:hover{opacity:.8}.m3-markdown[data-v-23db2c2c] strong{color:var(--color-on-surface);font-weight:600}.m3-markdown[data-v-23db2c2c] em{font-style:italic}.m3-markdown[data-v-23db2c2c] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.m3-markdown[data-v-23db2c2c] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.m3-markdown[data-v-23db2c2c] li{margin:.25em 0}.m3-markdown[data-v-23db2c2c] li::marker{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] blockquote{border-left:3px solid var(--color-primary);background:var(--color-surface-container);color:var(--color-on-surface-variant);border-radius:0 8px 8px 0;margin:.75em 0;padding:.5em 1em}.m3-markdown[data-v-23db2c2c] code{background:var(--color-surface-container-highest);color:var(--color-primary);border-radius:4px;padding:.15em .4em;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.875em}.m3-markdown[data-v-23db2c2c] pre{background:var(--color-surface-container-highest);border:1px solid var(--color-outline-variant);border-radius:12px;margin:.75em 0;padding:1em;overflow-x:auto}.m3-markdown[data-v-23db2c2c] pre code{color:var(--color-on-surface);background:0 0;padding:0;font-size:.8125rem;line-height:1.6}.m3-markdown[data-v-23db2c2c] .hljs-keyword,.m3-markdown[data-v-23db2c2c] .hljs-selector-tag,.m3-markdown[data-v-23db2c2c] .hljs-built_in,.m3-markdown[data-v-23db2c2c] .hljs-tag .hljs-keyword{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-string,.m3-markdown[data-v-23db2c2c] .hljs-regexp,.m3-markdown[data-v-23db2c2c] .hljs-template-variable{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-number,.m3-markdown[data-v-23db2c2c] .hljs-literal{color:var(--color-error)}.m3-markdown[data-v-23db2c2c] .hljs-title.function_,.m3-markdown[data-v-23db2c2c] .hljs-title.function_>.hljs-keyword{color:var(--color-secondary);font-weight:500}.m3-markdown[data-v-23db2c2c] .hljs-type,.m3-markdown[data-v-23db2c2c] .hljs-title.class_{color:var(--color-primary);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-comment,.m3-markdown[data-v-23db2c2c] .hljs-quote{color:var(--color-outline);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-attr,.m3-markdown[data-v-23db2c2c] .hljs-attribute{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-tag{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-name{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-punctuation,.m3-markdown[data-v-23db2c2c] .hljs-operator,.m3-markdown[data-v-23db2c2c] .hljs-meta,.m3-markdown[data-v-23db2c2c] .hljs-meta .hljs-keyword{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-variable,.m3-markdown[data-v-23db2c2c] .hljs-property,.m3-markdown[data-v-23db2c2c] .hljs-symbol,.m3-markdown[data-v-23db2c2c] .hljs-params{color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-block{position:relative}.m3-markdown[data-v-23db2c2c] .m3-code-copy{background:var(--color-surface-container);width:28px;height:28px;color:var(--color-on-surface-variant);cursor:pointer;opacity:0;z-index:1;border:none;border-radius:6px;justify-content:center;align-items:center;transition:opacity .15s;display:flex;position:absolute;top:8px;right:8px}.m3-markdown[data-v-23db2c2c] .m3-code-block:hover .m3-code-copy{opacity:1}.m3-markdown[data-v-23db2c2c] .m3-code-copy:hover{background:var(--color-surface-container-high);color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-line{display:block}.m3-markdown[data-v-23db2c2c] .m3-line-hl{background:color-mix(in srgb, var(--color-primary) 8%, transparent);border-left:2px solid color-mix(in srgb, var(--color-primary) 40%, transparent);margin:0 -1em;padding:0 1em 0 calc(1em - 2px)}.m3-markdown[data-v-23db2c2c] hr{border:none;border-top:1px solid var(--color-outline-variant);margin:1.5em 0}.m3-markdown[data-v-23db2c2c] table{border-collapse:collapse;width:100%;margin:.75em 0}.m3-markdown[data-v-23db2c2c] th{background:var(--color-surface-container);text-align:left;border-bottom:2px solid var(--color-outline-variant);font-weight:600;font-size:var(--text-label-large);color:var(--color-on-surface);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] td{border-bottom:1px solid var(--color-outline-variant);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] img{border-radius:12px;max-width:100%;height:auto;margin:.5em 0}.rte-content[data-v-c59a60e3] .tiptap{min-height:inherit;outline:none}.rte-content[data-v-c59a60e3] .tiptap p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;color:var(--color-on-surface-variant);opacity:.5;pointer-events:none;height:0}.rte-content[data-v-c59a60e3] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-c59a60e3] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-c59a60e3] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-c59a60e3] p{margin:.5em 0}.rte-content[data-v-c59a60e3] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.rte-content[data-v-c59a60e3] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.rte-content[data-v-c59a60e3] blockquote{border-left:3px solid var(--color-primary);color:var(--color-on-surface-variant);margin:.5em 0;padding-left:1em}.rte-content[data-v-c59a60e3] code{background:var(--color-surface-container-highest);border-radius:4px;padding:.15em .4em;font-size:.875em}.rte-content[data-v-c59a60e3] pre{background:var(--color-surface-container-highest);border-radius:8px;margin:.5em 0;padding:1em;overflow-x:auto}.rte-content[data-v-c59a60e3] pre code{background:0 0;padding:0}.rte-content[data-v-c59a60e3] a{color:var(--color-primary);text-decoration:underline}.rte-content[data-v-c59a60e3] mark{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px;padding:.1em .2em}.rte-content[data-v-c59a60e3] img{border-radius:8px;max-width:100%;height:auto;margin:.5em 0}
1
+ .code-editor-container[data-v-b0a66a4b] .cm-editor{height:100%;min-height:inherit;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.8125rem;line-height:1.6}.code-editor-container[data-v-b0a66a4b] .cm-editor.cm-focused{outline:none}.code-editor-container[data-v-b0a66a4b] .cm-scroller{min-height:inherit}.code-editor-container[data-v-b0a66a4b] .cm-content{padding:12px 0}.code-editor-container[data-v-b0a66a4b] .cm-line{padding:0 16px}.code-editor-container[data-v-b0a66a4b] .cm-gutters{background:var(--color-surface-container);border-right:1px solid var(--color-outline-variant);color:var(--color-outline);padding:0 4px;font-size:.75rem}.code-editor-container[data-v-b0a66a4b] .cm-activeLineGutter{background:var(--color-surface-container-high);color:var(--color-on-surface-variant)}.code-editor-container[data-v-b0a66a4b] .cm-activeLine{background:var(--color-surface-container-lowest)}.code-editor-container[data-v-b0a66a4b] .cm-selectionBackground{background:var(--color-primary-container)!important}.code-editor-container[data-v-b0a66a4b] .cm-cursor{border-left-color:var(--color-primary);border-left-width:2px}.code-editor-container[data-v-b0a66a4b] .cm-matchingBracket{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px}.code-editor-container[data-v-b0a66a4b] .cm-foldGutter span{color:var(--color-on-surface-variant)}@keyframes m3-wavy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes m3-wavy-travel{0%{stroke-dashoffset:0}to{stroke-dashoffset:calc(var(--m3-wave-len) * -1px)}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wavy-spin_2\.8s_linear_infinite\]{animation:2.8s linear infinite m3-wavy-spin}.animate-\[m3-wavy-travel_2s_linear_infinite\]{animation:none!important}}.m3-dialog-enter-active[data-v-e7dfca29],.m3-dialog-leave-active[data-v-e7dfca29]{transition:opacity .15s}.m3-dialog-enter-from[data-v-e7dfca29],.m3-dialog-leave-to[data-v-e7dfca29]{opacity:0}.m3-dialog-enter-active .dialog-box[data-v-e7dfca29],.m3-dialog-leave-active .dialog-box[data-v-e7dfca29]{transition:transform .15s}.m3-dialog-enter-from .dialog-box[data-v-e7dfca29],.m3-dialog-leave-to .dialog-box[data-v-e7dfca29]{transform:scale(.95)}.bs-scrim[data-v-5b1fb748]{transition:opacity .3s}.bs-enter-from .bs-scrim[data-v-5b1fb748],.bs-leave-to .bs-scrim[data-v-5b1fb748]{opacity:0}.bs-panel[data-v-5b1fb748]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.bs-enter-from .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(40%)}.bs-leave-to .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(100%)!important}.m3-carousel-right-enter-active,.m3-carousel-right-leave-active,.m3-carousel-left-enter-active,.m3-carousel-left-leave-active{transition:transform .5s cubic-bezier(.2,0,0,1),opacity .5s cubic-bezier(.2,0,0,1)}.m3-carousel-right-enter-from{opacity:0;transform:translate(100%)}.m3-carousel-right-leave-to,.m3-carousel-left-enter-from{opacity:0;transform:translate(-100%)}.m3-carousel-left-leave-to{opacity:0;transform:translate(100%)}.hue-slider[data-v-872ab758]{background:linear-gradient(90deg,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.hue-slider[data-v-872ab758]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-872ab758]::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.m3-cmd-enter-active[data-v-da578f14],.m3-cmd-leave-active[data-v-da578f14]{transition:opacity .15s}.m3-cmd-enter-from[data-v-da578f14],.m3-cmd-leave-to[data-v-da578f14]{opacity:0}.m3-cmd-enter-active .cmd-box[data-v-da578f14],.m3-cmd-leave-active .cmd-box[data-v-da578f14]{transition:transform .15s}.m3-cmd-enter-from .cmd-box[data-v-da578f14],.m3-cmd-leave-to .cmd-box[data-v-da578f14]{transform:scale(.95)translateY(-10px)}.dt-expand-grid[data-v-891083a3]{grid-template-rows:0fr;transition:grid-template-rows .25s cubic-bezier(.2,0,0,1);display:grid}.dt-expand-grid.dt-expand-open[data-v-891083a3]{grid-template-rows:1fr}.dt-expand-body[data-v-891083a3]{min-height:0;overflow:hidden}.expand-grid[data-v-89e4475b]{grid-template-rows:1fr;display:grid}.expand-body[data-v-89e4475b]{min-height:0;overflow:hidden}.expand-enter-active[data-v-89e4475b]{transition:grid-template-rows .28s cubic-bezier(.2,0,0,1)}.expand-enter-active>.expand-body[data-v-89e4475b]{transition:opacity .22s}.expand-enter-from[data-v-89e4475b]{grid-template-rows:0fr}.expand-enter-from>.expand-body[data-v-89e4475b]{opacity:0}.expand-leave-active[data-v-89e4475b]{transition:grid-template-rows .22s cubic-bezier(.4,0,1,1)}.expand-leave-active>.expand-body[data-v-89e4475b]{transition:opacity .15s}.expand-leave-to[data-v-89e4475b]{grid-template-rows:0fr}.expand-leave-to>.expand-body[data-v-89e4475b]{opacity:0}.m3-file-enter-active[data-v-34a862f0],.m3-file-leave-active[data-v-34a862f0]{transition:all .2s}.m3-file-enter-from[data-v-34a862f0],.m3-file-leave-to[data-v-34a862f0]{opacity:0;transform:translateY(-8px)}.mli-expand-grid{grid-template-rows:1fr;display:grid}.mli-expand-body{min-height:0;padding-left:2rem;overflow:hidden}.mli-expand-enter-active{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1)}.mli-expand-enter-active>.mli-expand-body{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.mli-expand-enter-from{grid-template-rows:0fr}.mli-expand-enter-from>.mli-expand-body{opacity:0}.mli-expand-leave-active{transition:grid-template-rows .25s cubic-bezier(.4,0,1,1)}.mli-expand-leave-active>.mli-expand-body{transition:opacity .12s cubic-bezier(.4,0,1,1)}.mli-expand-leave-to{grid-template-rows:0fr}.mli-expand-leave-to>.mli-expand-body{opacity:0}input[type=number][data-v-9068433a]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-9068433a]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-9068433a]{-moz-appearance:textfield}.nd-scrim[data-v-51e30965]{transition:opacity .28s}.nd-enter-from .nd-scrim[data-v-51e30965],.nd-leave-to .nd-scrim[data-v-51e30965]{opacity:0}.nd-panel[data-v-51e30965]{transition:transform .3s cubic-bezier(.2,0,0,1)}.nd-enter-from .nd-panel[data-v-51e30965],.nd-leave-to .nd-panel[data-v-51e30965]{transform:translate(-100%)}.nd-section-grid[data-v-51e30965]{grid-template-rows:1fr;display:grid}.nd-section-body[data-v-51e30965]{min-height:0;overflow:hidden}.nd-section-enter-active[data-v-51e30965]{transition:grid-template-rows .35s cubic-bezier(.2,0,0,1)}.nd-section-enter-active>.nd-section-body[data-v-51e30965]{transition:opacity .25s cubic-bezier(.2,0,0,1) 80ms}.nd-section-enter-from[data-v-51e30965]{grid-template-rows:0fr}.nd-section-enter-from>.nd-section-body[data-v-51e30965]{opacity:0}.nd-section-leave-active[data-v-51e30965]{transition:grid-template-rows .28s cubic-bezier(.4,0,1,1)}.nd-section-leave-active>.nd-section-body[data-v-51e30965]{transition:opacity .15s cubic-bezier(.4,0,1,1)}.nd-section-leave-to[data-v-51e30965]{grid-template-rows:0fr}.nd-section-leave-to>.nd-section-body[data-v-51e30965]{opacity:0}.nd-inline[data-v-51e30965]{transition:width .3s cubic-bezier(.2,0,0,1);overflow:hidden}.nd-inline[data-v-51e30965]>*{min-width:18rem}.nd-inline.nd-collapsed[data-v-51e30965]>*{min-width:0}.nd-label[data-v-51e30965]{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.nd-inline.nd-collapsed .nd-label[data-v-51e30965],.nd-inline.nd-collapsed[data-v-51e30965] .nd-label{opacity:0;transition:opacity .1s cubic-bezier(.2,0,0,1)}.nd-inline .nd-collapse-h[data-v-51e30965]{max-height:80px;transition:max-height .3s cubic-bezier(.2,0,0,1)}.nd-inline.nd-collapsed .nd-collapse-h[data-v-51e30965]{max-height:0}.nd-inline .nd-section-body[data-v-51e30965]>*,.nd-inline[data-v-51e30965] .nd-section-body>*{transition:padding .3s cubic-bezier(.2,0,0,1)}.nd-children-divider[data-v-51e30965]{border-top:1px solid #0000;height:0;margin:0 .75rem;transition:border-color .1s,margin .1s}.nd-inline.nd-collapsed .nd-children-divider[data-v-51e30965]{border-top-color:var(--color-outline-variant);margin:.25rem .75rem;transition:border-color .2s .3s,margin .2s .3s}@keyframes m3-wave-flow{0%{transform:translate(0)}to{transform:translate(-20px)}}@keyframes m3-progress-indeterminate{0%{left:-40%}to{left:100%}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wave-flow_1\.2s_linear_infinite\],.animate-\[m3-wave-flow_0\.9s_linear_infinite\],.animate-\[m3-progress-indeterminate_1\.6s_ease-in-out_infinite\]{animation:none!important}}.m3-radio-dot[data-v-cdb650b5]{transform-box:fill-box;transform-origin:50%;transition:transform .15s;transform:scale(0)}.m3-radio-dot.is-checked[data-v-cdb650b5]{transform:scale(1)}.ss-scrim[data-v-ba5b6f4b]{transition:opacity .28s}.ss-enter-from .ss-scrim[data-v-ba5b6f4b],.ss-leave-to .ss-scrim[data-v-ba5b6f4b]{opacity:0}.ss-panel[data-v-ba5b6f4b]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.ss-enter-from .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(40%)}.ss-leave-to .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(100%)!important}@keyframes skeleton-wave-move-32ecf05b{0%{transform:translate(-100%)}60%{transform:translate(100%)}to{transform:translate(100%)}}.skeleton-wave[data-v-32ecf05b]{position:relative;overflow:hidden}.skeleton-wave[data-v-32ecf05b]:after{content:"";background:linear-gradient(90deg, transparent 0%, var(--color-on-surface) 50%, transparent 100%);opacity:.06;animation:1.8s ease-in-out infinite skeleton-wave-move-32ecf05b;position:absolute;inset:0}.toast-row[data-v-746fa345]{grid-template-rows:1fr;padding-bottom:8px;display:grid}.toast-row>.toast-inner[data-v-746fa345]{min-height:0}.m3-toast-bot-enter-active[data-v-746fa345]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-bot-enter-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-bot-enter-from[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-enter-from>.toast-inner[data-v-746fa345]{opacity:0;transform:translateY(20px)scale(.94)}.m3-toast-bot-leave-active[data-v-746fa345]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-bot-leave-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .18s}.m3-toast-bot-leave-to[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-leave-to>.toast-inner[data-v-746fa345]{opacity:0;transform:scale(.92)}.m3-toast-top-enter-active[data-v-746fa345]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-top-enter-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-top-enter-from[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-enter-from>.toast-inner[data-v-746fa345]{opacity:0;transform:translateY(-20px)scale(.94)}.m3-toast-top-leave-active[data-v-746fa345]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1);overflow:hidden}.m3-toast-top-leave-active>.toast-inner[data-v-746fa345]{transition:opacity .18s,transform .18s}.m3-toast-top-leave-to[data-v-746fa345]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-leave-to>.toast-inner[data-v-746fa345]{opacity:0;transform:scale(.92)}@keyframes m3-toast-progress-746fa345{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.m3-spot-enter-active[data-v-51b103ff],.m3-spot-leave-active[data-v-51b103ff]{transition:opacity .15s}.m3-spot-enter-from[data-v-51b103ff],.m3-spot-leave-to[data-v-51b103ff]{opacity:0}.m3-spot-enter-active .spot-box[data-v-51b103ff],.m3-spot-leave-active .spot-box[data-v-51b103ff]{transition:transform .15s,opacity .15s}.m3-spot-enter-from .spot-box[data-v-51b103ff]{opacity:0;transform:scale(.96)translateY(-8px)}.m3-spot-leave-to .spot-box[data-v-51b103ff]{opacity:0;transform:scale(.98)}.m3-tour-highlight{box-shadow:0 0 0 4px var(--color-primary);border-radius:8px;position:relative;z-index:201!important}.m3-tour-enter-active,.m3-tour-leave-active{transition:opacity .2s}.m3-tour-enter-from,.m3-tour-leave-to{opacity:0}.m3-markdown[data-v-23db2c2c] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] h4{font-size:var(--text-title-large);line-height:var(--text-title-large--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] p{margin:.5em 0}.m3-markdown[data-v-23db2c2c] a{color:var(--color-primary);text-underline-offset:2px;text-decoration:underline}.m3-markdown[data-v-23db2c2c] a:hover{opacity:.8}.m3-markdown[data-v-23db2c2c] strong{color:var(--color-on-surface);font-weight:600}.m3-markdown[data-v-23db2c2c] em{font-style:italic}.m3-markdown[data-v-23db2c2c] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.m3-markdown[data-v-23db2c2c] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.m3-markdown[data-v-23db2c2c] li{margin:.25em 0}.m3-markdown[data-v-23db2c2c] li::marker{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] blockquote{border-left:3px solid var(--color-primary);background:var(--color-surface-container);color:var(--color-on-surface-variant);border-radius:0 8px 8px 0;margin:.75em 0;padding:.5em 1em}.m3-markdown[data-v-23db2c2c] code{background:var(--color-surface-container-highest);color:var(--color-primary);border-radius:4px;padding:.15em .4em;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.875em}.m3-markdown[data-v-23db2c2c] pre{background:var(--color-surface-container-highest);border:1px solid var(--color-outline-variant);border-radius:12px;margin:.75em 0;padding:1em;overflow-x:auto}.m3-markdown[data-v-23db2c2c] pre code{color:var(--color-on-surface);background:0 0;padding:0;font-size:.8125rem;line-height:1.6}.m3-markdown[data-v-23db2c2c] .hljs-keyword,.m3-markdown[data-v-23db2c2c] .hljs-selector-tag,.m3-markdown[data-v-23db2c2c] .hljs-built_in,.m3-markdown[data-v-23db2c2c] .hljs-tag .hljs-keyword{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-string,.m3-markdown[data-v-23db2c2c] .hljs-regexp,.m3-markdown[data-v-23db2c2c] .hljs-template-variable{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-number,.m3-markdown[data-v-23db2c2c] .hljs-literal{color:var(--color-error)}.m3-markdown[data-v-23db2c2c] .hljs-title.function_,.m3-markdown[data-v-23db2c2c] .hljs-title.function_>.hljs-keyword{color:var(--color-secondary);font-weight:500}.m3-markdown[data-v-23db2c2c] .hljs-type,.m3-markdown[data-v-23db2c2c] .hljs-title.class_{color:var(--color-primary);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-comment,.m3-markdown[data-v-23db2c2c] .hljs-quote{color:var(--color-outline);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-attr,.m3-markdown[data-v-23db2c2c] .hljs-attribute{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-tag{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-name{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-punctuation,.m3-markdown[data-v-23db2c2c] .hljs-operator,.m3-markdown[data-v-23db2c2c] .hljs-meta,.m3-markdown[data-v-23db2c2c] .hljs-meta .hljs-keyword{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-variable,.m3-markdown[data-v-23db2c2c] .hljs-property,.m3-markdown[data-v-23db2c2c] .hljs-symbol,.m3-markdown[data-v-23db2c2c] .hljs-params{color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-block{position:relative}.m3-markdown[data-v-23db2c2c] .m3-code-copy{background:var(--color-surface-container);width:28px;height:28px;color:var(--color-on-surface-variant);cursor:pointer;opacity:0;z-index:1;border:none;border-radius:6px;justify-content:center;align-items:center;transition:opacity .15s;display:flex;position:absolute;top:8px;right:8px}.m3-markdown[data-v-23db2c2c] .m3-code-block:hover .m3-code-copy{opacity:1}.m3-markdown[data-v-23db2c2c] .m3-code-copy:hover{background:var(--color-surface-container-high);color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-line{display:block}.m3-markdown[data-v-23db2c2c] .m3-line-hl{background:color-mix(in srgb, var(--color-primary) 8%, transparent);border-left:2px solid color-mix(in srgb, var(--color-primary) 40%, transparent);margin:0 -1em;padding:0 1em 0 calc(1em - 2px)}.m3-markdown[data-v-23db2c2c] hr{border:none;border-top:1px solid var(--color-outline-variant);margin:1.5em 0}.m3-markdown[data-v-23db2c2c] table{border-collapse:collapse;width:100%;margin:.75em 0}.m3-markdown[data-v-23db2c2c] th{background:var(--color-surface-container);text-align:left;border-bottom:2px solid var(--color-outline-variant);font-weight:600;font-size:var(--text-label-large);color:var(--color-on-surface);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] td{border-bottom:1px solid var(--color-outline-variant);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] img{border-radius:12px;max-width:100%;height:auto;margin:.5em 0}.rte-content[data-v-c59a60e3] .tiptap{min-height:inherit;outline:none}.rte-content[data-v-c59a60e3] .tiptap p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;color:var(--color-on-surface-variant);opacity:.5;pointer-events:none;height:0}.rte-content[data-v-c59a60e3] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-c59a60e3] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-c59a60e3] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-c59a60e3] p{margin:.5em 0}.rte-content[data-v-c59a60e3] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.rte-content[data-v-c59a60e3] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.rte-content[data-v-c59a60e3] blockquote{border-left:3px solid var(--color-primary);color:var(--color-on-surface-variant);margin:.5em 0;padding-left:1em}.rte-content[data-v-c59a60e3] code{background:var(--color-surface-container-highest);border-radius:4px;padding:.15em .4em;font-size:.875em}.rte-content[data-v-c59a60e3] pre{background:var(--color-surface-container-highest);border-radius:8px;margin:.5em 0;padding:1em;overflow-x:auto}.rte-content[data-v-c59a60e3] pre code{background:0 0;padding:0}.rte-content[data-v-c59a60e3] a{color:var(--color-primary);text-decoration:underline}.rte-content[data-v-c59a60e3] mark{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px;padding:.1em .2em}.rte-content[data-v-c59a60e3] img{border-radius:8px;max-width:100%;height:auto;margin:.5em 0}
2
2
  /*$vite$:1*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m3ui-vue/m3ui-vue",
3
- "version": "0.1.11",
3
+ "version": "0.2.0",
4
4
  "description": "Material 3 component library for Vue 3 + Tailwind CSS v4",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,203 @@
1
+ <script setup lang="ts">
2
+ import { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
3
+ import MIcon from './MIcon.vue'
4
+
5
+ export interface CarouselItem {
6
+ src: string
7
+ alt?: string
8
+ title?: string
9
+ subtitle?: string
10
+ }
11
+
12
+ const props = withDefaults(
13
+ defineProps<{
14
+ items: CarouselItem[]
15
+ autoplay?: boolean
16
+ interval?: number
17
+ showArrows?: boolean
18
+ showIndicators?: boolean
19
+ aspectRatio?: string
20
+ rounded?: boolean
21
+ }>(),
22
+ {
23
+ autoplay: false,
24
+ interval: 5000,
25
+ showArrows: true,
26
+ showIndicators: true,
27
+ aspectRatio: '16/9',
28
+ rounded: true,
29
+ },
30
+ )
31
+
32
+ const emit = defineEmits<{ change: [index: number] }>()
33
+
34
+ const current = ref(0)
35
+ const direction = ref<'left' | 'right'>('right')
36
+ const transitioning = ref(false)
37
+ let timer: ReturnType<typeof setInterval> | null = null
38
+ let touchStartX = 0
39
+
40
+ const total = computed(() => props.items.length)
41
+ const currentItem = computed(() => props.items[current.value])
42
+
43
+ function goTo(index: number) {
44
+ if (transitioning.value || index === current.value) return
45
+ direction.value = index > current.value ? 'right' : 'left'
46
+ transitioning.value = true
47
+ current.value = ((index % total.value) + total.value) % total.value
48
+ emit('change', current.value)
49
+ }
50
+
51
+ function next() {
52
+ goTo(current.value + 1)
53
+ }
54
+
55
+ function prev() {
56
+ goTo(current.value - 1)
57
+ }
58
+
59
+ function onTransitionEnd() {
60
+ transitioning.value = false
61
+ }
62
+
63
+ function startAutoplay() {
64
+ stopAutoplay()
65
+ if (props.autoplay && total.value > 1) {
66
+ timer = setInterval(next, props.interval)
67
+ }
68
+ }
69
+
70
+ function stopAutoplay() {
71
+ if (timer) { clearInterval(timer); timer = null }
72
+ }
73
+
74
+ function onTouchStart(e: TouchEvent) {
75
+ touchStartX = e.touches[0]!.clientX
76
+ stopAutoplay()
77
+ }
78
+
79
+ function onTouchEnd(e: TouchEvent) {
80
+ const dx = e.changedTouches[0]!.clientX - touchStartX
81
+ if (Math.abs(dx) > 50) {
82
+ dx < 0 ? next() : prev()
83
+ }
84
+ startAutoplay()
85
+ }
86
+
87
+ function onKeydown(e: KeyboardEvent) {
88
+ if (e.key === 'ArrowRight') next()
89
+ else if (e.key === 'ArrowLeft') prev()
90
+ }
91
+
92
+ watch(() => props.autoplay, startAutoplay)
93
+ onMounted(startAutoplay)
94
+ onBeforeUnmount(stopAutoplay)
95
+
96
+ defineExpose({ next, prev, goTo })
97
+ </script>
98
+
99
+ <template>
100
+ <div
101
+ class="group relative overflow-hidden bg-surface-container-highest"
102
+ :class="rounded ? 'rounded-2xl' : ''"
103
+ :style="{ aspectRatio }"
104
+ tabindex="0"
105
+ @keydown="onKeydown"
106
+ @touchstart.passive="onTouchStart"
107
+ @touchend.passive="onTouchEnd"
108
+ @mouseenter="stopAutoplay"
109
+ @mouseleave="startAutoplay"
110
+ >
111
+ <!-- Slides -->
112
+ <TransitionGroup
113
+ :name="direction === 'right' ? 'm3-carousel-right' : 'm3-carousel-left'"
114
+ tag="div"
115
+ class="relative h-full w-full"
116
+ @after-enter="onTransitionEnd"
117
+ @after-leave="onTransitionEnd"
118
+ >
119
+ <div
120
+ v-for="(item, i) in items"
121
+ v-show="i === current"
122
+ :key="i"
123
+ class="absolute inset-0"
124
+ >
125
+ <img
126
+ :src="item.src"
127
+ :alt="item.alt ?? item.title ?? ''"
128
+ class="h-full w-full object-cover"
129
+ />
130
+
131
+ <!-- Overlay with text -->
132
+ <div
133
+ v-if="item.title || item.subtitle"
134
+ class="absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/70 via-black/30 to-transparent px-6 pb-6 pt-16"
135
+ >
136
+ <h3 v-if="item.title" class="text-title-large font-medium text-white">{{ item.title }}</h3>
137
+ <p v-if="item.subtitle" class="mt-1 text-body-medium text-white/80">{{ item.subtitle }}</p>
138
+ </div>
139
+ </div>
140
+ </TransitionGroup>
141
+
142
+ <!-- Arrows -->
143
+ <template v-if="showArrows && total > 1">
144
+ <button
145
+ type="button"
146
+ class="absolute left-3 top-1/2 z-10 flex h-10 w-10 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-surface/80 text-on-surface shadow-elevation-1 opacity-0 backdrop-blur-sm transition-all duration-200 hover:bg-surface hover:shadow-elevation-2 group-hover:opacity-100"
147
+ @click="prev"
148
+ >
149
+ <MIcon name="chevron_left" :size="24" />
150
+ </button>
151
+ <button
152
+ type="button"
153
+ class="absolute right-3 top-1/2 z-10 flex h-10 w-10 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-surface/80 text-on-surface shadow-elevation-1 opacity-0 backdrop-blur-sm transition-all duration-200 hover:bg-surface hover:shadow-elevation-2 group-hover:opacity-100"
154
+ @click="next"
155
+ >
156
+ <MIcon name="chevron_right" :size="24" />
157
+ </button>
158
+ </template>
159
+
160
+ <!-- Indicators -->
161
+ <div
162
+ v-if="showIndicators && total > 1"
163
+ class="absolute inset-x-0 bottom-0 z-10 flex justify-center gap-2 pb-3"
164
+ :class="currentItem?.title || currentItem?.subtitle ? 'pb-20' : 'pb-3'"
165
+ >
166
+ <button
167
+ v-for="(_, i) in items"
168
+ :key="i"
169
+ type="button"
170
+ class="h-2 cursor-pointer rounded-full transition-all duration-300"
171
+ :class="i === current ? 'w-6 bg-white' : 'w-2 bg-white/50 hover:bg-white/70'"
172
+ @click="goTo(i)"
173
+ />
174
+ </div>
175
+ </div>
176
+ </template>
177
+
178
+ <style>
179
+ .m3-carousel-right-enter-active,
180
+ .m3-carousel-right-leave-active,
181
+ .m3-carousel-left-enter-active,
182
+ .m3-carousel-left-leave-active {
183
+ transition: transform 500ms cubic-bezier(0.2, 0, 0, 1), opacity 500ms cubic-bezier(0.2, 0, 0, 1);
184
+ }
185
+
186
+ .m3-carousel-right-enter-from {
187
+ transform: translateX(100%);
188
+ opacity: 0;
189
+ }
190
+ .m3-carousel-right-leave-to {
191
+ transform: translateX(-100%);
192
+ opacity: 0;
193
+ }
194
+
195
+ .m3-carousel-left-enter-from {
196
+ transform: translateX(-100%);
197
+ opacity: 0;
198
+ }
199
+ .m3-carousel-left-leave-to {
200
+ transform: translateX(100%);
201
+ opacity: 0;
202
+ }
203
+ </style>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, ref, useSlots, watch } from 'vue'
2
+ import { computed, ref, useSlots, watch, onMounted } from 'vue'
3
3
  import MCheckbox from './MCheckbox.vue'
4
4
  import MIcon from './MIcon.vue'
5
5
  import MIconButton from './MIconButton.vue'
@@ -43,6 +43,9 @@ const props = withDefaults(defineProps<{
43
43
  groupBy?: string
44
44
  columnToggle?: boolean
45
45
  exportable?: boolean
46
+ serverSide?: boolean
47
+ total?: number
48
+ page?: number
46
49
  }>(), {
47
50
  loading: false,
48
51
  emptyText: 'Sin resultados',
@@ -57,11 +60,24 @@ const props = withDefaults(defineProps<{
57
60
  stickyHeader: false,
58
61
  columnToggle: false,
59
62
  exportable: false,
63
+ serverSide: false,
64
+ total: 0,
65
+ page: 1,
60
66
  })
61
67
 
68
+ export interface DataTableFetchParams {
69
+ page: number
70
+ perPage: number
71
+ search: string
72
+ sortKey: string
73
+ sortDir: 'asc' | 'desc' | ''
74
+ }
75
+
62
76
  const emit = defineEmits<{
63
77
  'update:modelValue': [Record<string, any>[]]
78
+ 'update:page': [number]
64
79
  rowClick: [Record<string, any>]
80
+ fetch: [DataTableFetchParams]
65
81
  }>()
66
82
 
67
83
  const slots = useSlots()
@@ -87,7 +103,16 @@ function toggleSort(key: string) {
87
103
  else { sortKey.value = ''; sortDir.value = '' }
88
104
  }
89
105
 
106
+ const currentPage = computed({
107
+ get: () => props.serverSide ? (props.page ?? 1) : internalPage.value,
108
+ set: (val: number) => {
109
+ if (props.serverSide) emit('update:page', val)
110
+ else internalPage.value = val
111
+ },
112
+ })
113
+
90
114
  const processedRows = computed(() => {
115
+ if (props.serverSide) return props.rows
91
116
  let result = props.rows
92
117
  if (search.value.trim()) {
93
118
  const q = search.value.toLowerCase()
@@ -119,13 +144,43 @@ const groupedRows = computed(() => {
119
144
  return map
120
145
  })
121
146
 
122
- const totalCount = computed(() => processedRows.value.length)
147
+ const totalCount = computed(() => props.serverSide ? (props.total ?? 0) : processedRows.value.length)
123
148
  const visibleRows = computed(() => {
124
- const start = (internalPage.value - 1) * props.perPage
149
+ if (props.serverSide) return props.rows
150
+ const start = (currentPage.value - 1) * props.perPage
125
151
  return processedRows.value.slice(start, start + props.perPage)
126
152
  })
127
153
 
128
- watch([search, sortKey, sortDir], () => { internalPage.value = 1 })
154
+ watch([search, sortKey, sortDir], () => {
155
+ if (!props.serverSide) internalPage.value = 1
156
+ })
157
+
158
+ function emitFetch() {
159
+ emit('fetch', {
160
+ page: currentPage.value,
161
+ perPage: props.perPage,
162
+ search: search.value,
163
+ sortKey: sortKey.value,
164
+ sortDir: sortDir.value,
165
+ })
166
+ }
167
+
168
+ const mounted = ref(false)
169
+ onMounted(() => {
170
+ mounted.value = true
171
+ if (props.serverSide) emitFetch()
172
+ })
173
+
174
+ watch([search, sortKey, sortDir], () => {
175
+ if (!props.serverSide || !mounted.value) return
176
+ internalPage.value = 1
177
+ emitFetch()
178
+ })
179
+
180
+ watch(currentPage, () => {
181
+ if (!props.serverSide || !mounted.value) return
182
+ emitFetch()
183
+ })
129
184
 
130
185
  const selected = computed({
131
186
  get: () => props.modelValue ?? [],
@@ -376,7 +431,7 @@ function colStyle(col: DataTableColumn) {
376
431
  <span class="text-label-small text-on-surface-variant">
377
432
  {{ totalCount }} registro{{ totalCount !== 1 ? 's' : '' }}
378
433
  </span>
379
- <MPagination :page="internalPage" :per-page="perPage" :total="totalCount" @update:page="internalPage = $event" />
434
+ <MPagination :page="currentPage" :per-page="perPage" :total="totalCount" @update:page="currentPage = $event" />
380
435
  </div>
381
436
  </div>
382
437
  </template>
@@ -0,0 +1,198 @@
1
+ <script setup lang="ts">
2
+ import { computed, ref, useId, watch } from 'vue'
3
+ import MIcon from './MIcon.vue'
4
+ import { useFieldBg } from '../composables/useFieldBg'
5
+
6
+ export type MaskPreset = 'credit-card' | 'phone' | 'date' | 'time' | 'cpf' | 'cnpj' | 'zip'
7
+
8
+ const PRESETS: Record<MaskPreset, string> = {
9
+ 'credit-card': '#### #### #### ####',
10
+ phone: '(###) ###-####',
11
+ date: '##/##/####',
12
+ time: '##:##',
13
+ cpf: '###.###.###-##',
14
+ cnpj: '##.###.###/####-##',
15
+ zip: '#####-####',
16
+ }
17
+
18
+ const props = withDefaults(
19
+ defineProps<{
20
+ modelValue: string
21
+ label: string
22
+ mask: string | MaskPreset
23
+ variant?: 'filled' | 'outlined'
24
+ error?: string
25
+ hint?: string
26
+ disabled?: boolean
27
+ required?: boolean
28
+ leadingIcon?: string
29
+ clearable?: boolean
30
+ fieldBg?: string
31
+ }>(),
32
+ {
33
+ variant: 'filled',
34
+ clearable: false,
35
+ },
36
+ )
37
+
38
+ const emit = defineEmits<{ 'update:modelValue': [string] }>()
39
+
40
+ const id = useId()
41
+ const fieldBgEl = ref<HTMLElement | null>(null)
42
+ const { resolvedFieldBg } = useFieldBg(fieldBgEl, () => props.fieldBg)
43
+ const inputEl = ref<HTMLInputElement | null>(null)
44
+
45
+ const resolvedMask = computed(() => PRESETS[props.mask as MaskPreset] ?? props.mask)
46
+
47
+ const showClear = computed(() => props.clearable && props.modelValue.length > 0 && !props.disabled)
48
+
49
+ function rawToMasked(raw: string, mask: string): string {
50
+ let result = ''
51
+ let ri = 0
52
+ for (let mi = 0; mi < mask.length && ri < raw.length; mi++) {
53
+ if (mask[mi] === '#') {
54
+ result += raw[ri++]
55
+ } else {
56
+ result += mask[mi]
57
+ if (raw[ri] === mask[mi]) ri++
58
+ }
59
+ }
60
+ return result
61
+ }
62
+
63
+ function maskedToRaw(masked: string): string {
64
+ const mask = resolvedMask.value
65
+ let raw = ''
66
+ for (let i = 0; i < masked.length && i < mask.length; i++) {
67
+ if (mask[i] === '#') raw += masked[i]
68
+ }
69
+ return raw
70
+ }
71
+
72
+ function onInput(e: Event) {
73
+ const input = e.target as HTMLInputElement
74
+ const raw = input.value.replace(/[^\d]/g, '')
75
+ const masked = rawToMasked(raw, resolvedMask.value)
76
+ emit('update:modelValue', masked)
77
+
78
+ requestAnimationFrame(() => {
79
+ if (inputEl.value) inputEl.value.value = masked
80
+ })
81
+ }
82
+
83
+ function onKeydown(e: KeyboardEvent) {
84
+ if (e.key === 'Backspace' && props.modelValue.length > 0) {
85
+ const raw = maskedToRaw(props.modelValue)
86
+ if (raw.length > 0) {
87
+ e.preventDefault()
88
+ const newRaw = raw.slice(0, -1)
89
+ const masked = rawToMasked(newRaw, resolvedMask.value)
90
+ emit('update:modelValue', masked)
91
+ requestAnimationFrame(() => {
92
+ if (inputEl.value) inputEl.value.value = masked
93
+ })
94
+ }
95
+ }
96
+ }
97
+
98
+ const hasTrailing = computed(() => props.clearable)
99
+
100
+ const inputClasses = computed(() => {
101
+ const pl = props.leadingIcon ? 'pl-12' : 'pl-4'
102
+ const pr = hasTrailing.value ? 'pr-12' : 'pr-4'
103
+ const base = [
104
+ 'peer block w-full text-body-large text-on-surface outline-none placeholder:text-transparent',
105
+ 'transition-[border-color,border-width] duration-150',
106
+ 'disabled:cursor-not-allowed disabled:opacity-[0.38]',
107
+ 'h-14', pl, pr,
108
+ ]
109
+ if (props.variant === 'outlined') {
110
+ return [...base,
111
+ 'rounded-sm border bg-transparent py-4',
112
+ props.error
113
+ ? 'border-error focus:border-2 focus:border-error'
114
+ : 'border-outline hover:border-on-surface focus:border-2 focus:border-primary',
115
+ ].join(' ')
116
+ }
117
+ return [...base,
118
+ 'rounded-t-sm bg-surface-container-highest border-b pt-6 pb-2',
119
+ props.error
120
+ ? 'border-error focus:border-b-2 focus:border-error'
121
+ : 'border-on-surface-variant hover:border-on-surface focus:border-b-2 focus:border-primary',
122
+ ].join(' ')
123
+ })
124
+
125
+ const labelClasses = computed(() => {
126
+ const left = props.leadingIcon
127
+ ? (props.variant === 'outlined' ? 'left-11' : 'left-12')
128
+ : (props.variant === 'outlined' ? 'left-3' : 'left-4')
129
+ const unfloatedTop = props.variant === 'filled' ? 'top-[53%]' : 'top-1/2'
130
+ const base = [
131
+ 'pointer-events-none absolute truncate transition-all duration-200',
132
+ left, 'right-4', `${unfloatedTop} -translate-y-1/2 text-body-large`,
133
+ ]
134
+ if (props.variant === 'outlined') {
135
+ return [...base,
136
+ 'peer-focus:-top-2.5 peer-focus:translate-y-0 peer-focus:text-label-small peer-focus:right-auto peer-focus:max-w-[calc(100%-1.5rem)] peer-focus:bg-[var(--field-bg)] peer-focus:px-1',
137
+ 'peer-[&:not(:placeholder-shown)]:-top-2.5 peer-[&:not(:placeholder-shown)]:translate-y-0 peer-[&:not(:placeholder-shown)]:right-auto peer-[&:not(:placeholder-shown)]:max-w-[calc(100%-1.5rem)]',
138
+ 'peer-[&:not(:placeholder-shown)]:text-label-small peer-[&:not(:placeholder-shown)]:bg-[var(--field-bg)] peer-[&:not(:placeholder-shown)]:px-1',
139
+ props.error ? 'text-error peer-focus:text-error' : 'text-on-surface-variant peer-focus:text-primary',
140
+ ].join(' ')
141
+ }
142
+ return [...base,
143
+ 'peer-focus:top-2 peer-focus:translate-y-0 peer-focus:text-label-small',
144
+ 'peer-[&:not(:placeholder-shown)]:top-2 peer-[&:not(:placeholder-shown)]:translate-y-0 peer-[&:not(:placeholder-shown)]:text-label-small',
145
+ props.error ? 'text-error peer-focus:text-error' : 'text-on-surface-variant peer-focus:text-primary',
146
+ ].join(' ')
147
+ })
148
+ </script>
149
+
150
+ <template>
151
+ <div class="flex flex-col gap-1">
152
+ <div
153
+ ref="fieldBgEl"
154
+ class="relative"
155
+ :class="variant === 'outlined' ? 'mt-2' : ''"
156
+ :style="variant === 'outlined' ? { '--field-bg': resolvedFieldBg } : undefined"
157
+ >
158
+ <div
159
+ v-if="leadingIcon"
160
+ class="pointer-events-none absolute left-3.5 text-on-surface-variant"
161
+ :class="variant === 'filled' ? 'top-[57%] -translate-y-1/2' : 'top-[55%] -translate-y-1/2'"
162
+ >
163
+ <MIcon :name="leadingIcon" :size="20" />
164
+ </div>
165
+
166
+ <input
167
+ :id="id"
168
+ ref="inputEl"
169
+ type="text"
170
+ inputmode="numeric"
171
+ :value="modelValue"
172
+ :disabled="disabled"
173
+ :required="required"
174
+ placeholder=" "
175
+ :class="inputClasses"
176
+ @input="onInput"
177
+ @keydown="onKeydown"
178
+ />
179
+
180
+ <label :for="id" :class="labelClasses">
181
+ {{ label }}<span v-if="required" class="text-error">&nbsp;*</span>
182
+ </label>
183
+
184
+ <button
185
+ v-if="showClear"
186
+ type="button"
187
+ class="absolute right-3 flex h-6 w-6 cursor-pointer items-center justify-center rounded-full text-on-surface-variant transition-colors hover:bg-on-surface/8 hover:text-on-surface"
188
+ :class="variant === 'filled' ? 'top-[57%] -translate-y-1/2' : 'top-[55%] -translate-y-1/2'"
189
+ @click="emit('update:modelValue', '')"
190
+ >
191
+ <MIcon name="close" :size="18" />
192
+ </button>
193
+ </div>
194
+
195
+ <p v-if="error" class="px-4 text-body-small text-error">{{ error }}</p>
196
+ <p v-else-if="hint" class="px-4 text-body-small text-on-surface-variant">{{ hint }}</p>
197
+ </div>
198
+ </template>