pptx-angular-viewer 1.1.57 → 1.1.59

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pptx-angular-viewer",
3
- "version": "1.1.57",
3
+ "version": "1.1.59",
4
4
  "description": "Angular PowerPoint viewer and editor component: render, edit, and export PPTX slides in the browser.",
5
5
  "keywords": [
6
6
  "angular",
@@ -53,11 +53,23 @@
53
53
  "@angular/core": "^22.0.1",
54
54
  "@ngx-translate/core": "^18.0.0",
55
55
  "rxjs": "^7.8.0",
56
- "three": "^0.185.0"
56
+ "three": "^0.185.0",
57
+ "y-webrtc": "^10.3.0",
58
+ "y-websocket": "^3.0.0",
59
+ "yjs": "^13.6.31"
57
60
  },
58
61
  "peerDependenciesMeta": {
59
62
  "three": {
60
63
  "optional": true
64
+ },
65
+ "y-webrtc": {
66
+ "optional": true
67
+ },
68
+ "y-websocket": {
69
+ "optional": true
70
+ },
71
+ "yjs": {
72
+ "optional": true
61
73
  }
62
74
  },
63
75
  "module": "fesm2022/pptx-angular-viewer.mjs",
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-500:oklch(76.9% .188 70.08);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-blue-600:oklch(54.6% .245 262.881);--color-purple-600:oklch(55.8% .288 302.321);--color-slate-900:oklch(20.8% .042 265.755);--color-stone-100:oklch(97% .001 106.424);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-tight:1.25;--radius-sm:calc(var(--pptx-radius,.5rem) - 4px);--radius-lg:var(--pptx-radius,.5rem);--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:var(--pptx-background,#030712);--color-foreground:var(--pptx-foreground,#f3f4f6);--color-card:var(--pptx-card,#111827);--color-popover:var(--pptx-popover,#111827);--color-primary:var(--pptx-primary,#6366f1);--color-primary-foreground:var(--pptx-primary-foreground,#fff);--color-secondary:var(--pptx-secondary,#1f2937);--color-muted:var(--pptx-muted,#1f2937);--color-muted-foreground:var(--pptx-muted-foreground,#9ca3af);--color-accent:var(--pptx-accent,#1f2937);--color-border:var(--pptx-border,#374151)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.pptx-rb-icon{height:calc(var(--spacing) * 7);min-width:calc(var(--spacing) * 7);color:var(--color-foreground);border-radius:.25rem;justify-content:center;align-items:center;font-size:.95rem;display:inline-flex}@media (hover:hover){.pptx-rb-icon:hover{background-color:var(--color-accent)}}.pptx-rb-icon:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-pill{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-muted);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-foreground);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem;display:inline-flex}@media (hover:hover){.pptx-rb-pill:hover{background-color:var(--color-accent)}}.pptx-rb-pill:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-grp{background-color:var(--color-muted);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-foreground);border-radius:.25rem;align-items:center;display:inline-flex;overflow:hidden}.pptx-rb-gb{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--color-border);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){.pptx-rb-gb:hover{background-color:var(--color-accent)}}.pptx-rb-gb:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-gl{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){.pptx-rb-gl:hover{background-color:var(--color-accent)}}.pptx-rb-gl:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-sep{margin-inline:var(--spacing);background-color:var(--color-border);align-self:stretch;width:1px}@supports (color:color-mix(in lab, red, red)){.pptx-rb-sep{background-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.pptx-rb-select{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border);background-color:var(--color-card);padding-inline:var(--spacing);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-foreground);border-radius:.25rem}}@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.top-1{top:var(--spacing)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-1{right:var(--spacing)}.left-0{left:0}.z-20{z-index:20}.z-50{z-index:50}.z-\[1100\]{z-index:1100}.z-\[9999\]{z-index:9999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.my-1{margin-block:var(--spacing)}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.h-1{height:var(--spacing)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-24{height:calc(var(--spacing) * 24)}.h-px{height:1px}.w-1\/3{width:33.3333%}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-28{width:calc(var(--spacing) * 28)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-72{width:calc(var(--spacing) * 72)}.w-\[640px\]{width:640px}.w-full{width:100%}.w-px{width:1px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[420px\]{max-width:420px}.min-w-2{min-width:calc(var(--spacing) * 2)}.min-w-\[3rem\]{min-width:3rem}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.scale-\[1\.02\]{scale:1.02}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border,.border-border\/40{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\/40{border-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.border-border\/60{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--color-border) 60%, transparent)}}.border-primary{border-color:var(--color-primary)}.bg-accent{background-color:var(--color-accent)}.bg-background{background-color:var(--color-background)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-border\/40{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/40{background-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.bg-border\/50{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/50{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.bg-border\/60{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/60{background-color:color-mix(in oklab, var(--color-border) 60%, transparent)}}.bg-card{background-color:var(--color-card)}.bg-green-600{background-color:var(--color-green-600)}.bg-muted{background-color:var(--color-muted)}.bg-popover{background-color:var(--color-popover)}.bg-primary,.bg-primary\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-secondary\/50{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\/50{background-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.bg-transparent{background-color:#0000}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.text-center{text-align:center}.text-right{text-align:right}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.accent-primary{accent-color:var(--color-primary)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-primary{--tw-ring-color:var(--color-primary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:right-0:after{content:var(--tw-content);right:0}.after\:-bottom-px:after{content:var(--tw-content);bottom:-1px}.after\:left-0:after{content:var(--tw-content);left:0}.after\:h-\[2\.5px\]:after{content:var(--tw-content);height:2.5px}.after\:bg-primary:after{content:var(--tw-content);background-color:var(--color-primary)}@media (hover:hover){.hover\:scale-125:hover{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-primary\/50:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\:bg-accent\/60:hover{background-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/60:hover{background-color:color-mix(in oklab, var(--color-accent) 60%, transparent)}}.hover\:bg-green-500:hover{background-color:var(--color-green-500)}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-primary\/80:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary) 90%, transparent)}}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-primary:focus{border-color:var(--color-primary)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-primary:focus{--tw-ring-color:var(--color-primary)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}}pptx-ribbon-file-section,pptx-ribbon-home-section,pptx-ribbon-insert-section,pptx-ribbon-arrange-section,pptx-ribbon-slideshow-section,pptx-ribbon-review-section,pptx-ribbon-view-section,pptx-ribbon-draw-section,pptx-ribbon-design-section,pptx-ribbon-transitions-section,pptx-ribbon-animations-section,pptx-ribbon-paragraph-controls{display:contents}.pptx-ng-viewer{--pptx-background:#030712;--pptx-foreground:#f3f4f6;--pptx-card:#111827;--pptx-border:#374151;--pptx-primary:#6366f1;--pptx-muted-foreground:#9ca3af;background:var(--pptx-background);width:100%;height:100%;min-height:0;color:var(--pptx-foreground);flex-direction:column;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;display:flex}.pptx-ng-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:.75rem;padding:2rem;display:flex}.pptx-ng-error-detail{background:var(--pptx-card);max-width:40rem;color:var(--pptx-muted-foreground);white-space:pre-wrap;border-radius:.5rem;padding:.75rem;font-size:.8rem;overflow:auto}.pptx-ng-spinner{border:3px solid var(--pptx-border);border-top-color:var(--pptx-primary);border-radius:50%;width:2rem;height:2rem;animation:.8s linear infinite pptx-ng-spin}@keyframes pptx-ng-spin{to{transform:rotate(360deg)}}.pptx-ng-toolbar{border-bottom:1px solid var(--pptx-border);background:var(--pptx-card);justify-content:space-between;align-items:center;gap:1rem;padding:.5rem .75rem;display:flex}.pptx-ng-nav,.pptx-ng-zoom{align-items:center;gap:.5rem;display:flex}.pptx-ng-toolbar button{border:1px solid var(--pptx-border);min-width:2rem;height:2rem;color:var(--pptx-foreground);cursor:pointer;background:0 0;border-radius:.375rem;padding:0 .5rem;font-size:1rem;line-height:1}.pptx-ng-toolbar button:hover:not(:disabled){border-color:var(--pptx-primary)}.pptx-ng-toolbar button:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-slide-counter,.pptx-ng-zoom-value{font-variant-numeric:tabular-nums;font-size:.85rem}.pptx-ng-body{flex:1;min-height:0;display:flex}.pptx-ng-thumbnails{border-right:1px solid var(--pptx-border);background:var(--pptx-card);flex-direction:column;gap:.5rem;width:8rem;padding:.75rem;display:flex;overflow-y:auto}.pptx-ng-thumb{aspect-ratio:16/9;border:2px solid var(--pptx-border);cursor:pointer;background:#fff;border-radius:.375rem;position:relative}.pptx-ng-thumb.is-active{border-color:var(--pptx-primary)}.pptx-ng-thumb-index{color:#111827;font-size:.7rem;position:absolute;bottom:.15rem;right:.3rem}.pptx-ng-main{background:#1e293b;flex:1;min-width:0;overflow:auto}.pptx-ng-canvas-viewport{width:100%;height:100%}.pptx-ng-element{box-sizing:border-box}.pptx-ng-canvas-stage.is-editable{cursor:default}.pptx-ng-canvas-stage.is-editable .pptx-ng-element{cursor:pointer}.pptx-ng-selection{box-sizing:border-box;outline-offset:1px;pointer-events:none;z-index:10000;background:#4f86ff14;outline:2px solid #4f86ff;position:absolute}.pptx-ng-handle{box-sizing:border-box;pointer-events:auto;touch-action:none;z-index:10001;background:#fff;border:1px solid #4f86ff;border-radius:2px;position:absolute}.pptx-ng-text-editor{box-sizing:border-box;color:#000;font:inherit;resize:none;z-index:10002;white-space:pre-wrap;background:#fffffff5;border:2px solid #4f86ff;margin:0;padding:2px;line-height:1.2;position:absolute;overflow:auto}.pptx-ng-marquee{box-sizing:border-box;pointer-events:none;z-index:9999;background:#4f86ff1f;border:1px dashed #4f86ff;position:absolute}.pptx-ng-snap-guide{box-sizing:border-box;pointer-events:none;z-index:10003;border-top:1px solid #f43f8e;border-left:1px solid #f43f8e;position:absolute}.pptx-ng-rotate-handle{box-sizing:border-box;cursor:grab;pointer-events:auto;touch-action:none;z-index:10001;background:#fff;border:1px solid #4f86ff;border-radius:50%;position:absolute}.pptx-ng-adjust-handle{box-sizing:border-box;cursor:crosshair;pointer-events:auto;touch-action:none;z-index:10001;background:#fcd34d;border:1px solid #b45309;position:absolute;transform:rotate(45deg)}.pptx-ng-inspector-host{background:#00000005;border-left:1px solid #0000001a;flex:0 0 240px;width:240px;overflow:auto}.pptx-ng-idrawer-grab{display:none}.pptx-ng-idrawer-handle{background:#00000040;border-radius:9999px;width:40px;height:4px}.pptx-ng-slide-props{flex-direction:column;gap:.5rem;padding:.75rem;font-size:.8125rem;display:flex}.pptx-ng-prop-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.pptx-ng-prop-row.pptx-ng-prop-col{flex-direction:column;align-items:stretch}.pptx-ng-prop-row textarea{resize:vertical;width:100%;font:inherit}.pptx-ng-img{object-fit:contain;width:100%;height:100%;display:block}.pptx-ng-para{margin:0}.pptx-ng-bullet{white-space:pre}.pptx-ng-link{color:inherit;cursor:pointer;text-decoration:underline}.pptx-ng-actions{align-items:center;gap:.25rem;display:flex}.pptx-ng-notes{background:#00000005;border-top:1px solid #0000001a;max-height:30%;margin:.5rem 1rem 1rem;padding:.5rem .75rem;font-size:.875rem;line-height:1.4;overflow:auto}.pptx-ng-notes-title{text-transform:uppercase;letter-spacing:.04em;opacity:.6;margin:0 0 .25rem;font-size:.75rem;font-weight:600}.pptx-ng-notes-body{white-space:pre-wrap;word-break:break-word;margin:0}.pptx-ng-mobile-notes-sheet{background:#fff;border-top:1px solid #00000026;flex:none;max-height:50vh;overflow:auto;box-shadow:0 -6px 20px #0000002e}.pptx-ng-mnotes-grab{cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:8px 0 4px;display:flex}.pptx-ng-mnotes-grab:active{cursor:grabbing}.pptx-ng-mnotes-handle{background:#00000040;border-radius:9999px;width:40px;height:4px}.pptx-ng-table-wrapper{width:100%;height:100%;overflow:hidden}.pptx-ng-table-wrapper>.pptx-ng-table{border-collapse:collapse;table-layout:fixed;width:100%;height:100%}.pptx-ng-table-wrapper>.pptx-ng-table td{word-break:break-word;vertical-align:middle;overflow:hidden}.pptx-ng-table-wrapper>.pptx-ng-table td .pptx-ng-cell-input{box-sizing:border-box;width:100%;color:inherit;font:inherit;background:0 0;border:none;outline:none;margin:0;padding:0}.pptx-ng-chart svg{width:100%;height:100%;display:block}.pptx-ng-placeholder{color:#6366f1cc;background:#6366f10f;border:1px dashed #6366f180;justify-content:center;align-items:center;width:100%;height:100%;font-size:.75rem;display:flex}.pptx-ng-overlay-grid{pointer-events:none;z-index:2;position:absolute;inset:0}.pptx-ng-overlay-guides{pointer-events:none;z-index:3;position:absolute;inset:0}.pptx-ng-ruler-corner{pointer-events:none;z-index:52;background:#1e293b;border-bottom:1px solid #ffffff1a;border-right:1px solid #ffffff1a;width:20px;height:20px;position:absolute;top:0;left:0}.pptx-ng-ruler-h{z-index:51;height:20px;position:absolute;top:0;left:20px;overflow:hidden}.pptx-ng-ruler-v{z-index:51;width:20px;position:absolute;top:20px;left:0;overflow:hidden}.pptx-ng-ruler-guide-line{pointer-events:none;z-index:49;background:#facc15d9;position:absolute}.pptx-ng-ruler-guide-handle{pointer-events:auto;touch-action:none;z-index:50;position:absolute}.pptx-rb-eyedropper-active{background-color:var(--color-purple-600);color:var(--color-white)}.pptx-rb-template-active{background-color:var(--color-amber-500);color:var(--color-white)}@media (max-width:640px),(pointer:coarse){.pptx-ng-toolbar{flex-wrap:wrap;gap:.5rem;padding:.5rem}.pptx-ng-actions{-webkit-overflow-scrolling:touch;scrollbar-width:thin;flex:100%;gap:.5rem;padding-bottom:.15rem;overflow-x:auto}.pptx-ng-actions button{flex:none}.pptx-ng-nav button,.pptx-ng-zoom button,.pptx-ng-actions button{min-width:44px;height:auto;min-height:44px;padding:0 .65rem;font-size:1.1rem}.pptx-ng-nav button{font-size:1.5rem;font-weight:600}.pptx-ng-thumbnails{border-right:none;border-bottom:1px solid var(--pptx-border);flex-direction:row;width:auto;max-width:100%;padding:.5rem;overflow:auto hidden}.pptx-ng-thumbnails .pptx-ng-thumb{flex:0 0 4.5rem;width:4.5rem}.pptx-ng-body{flex-direction:column}.pptx-ng-body>pptx-slides-panel{flex:none;max-height:30vh}.pptx-ng-inspector-host{border-left:none;border-top:1px solid var(--pptx-border);flex:none;width:100%;max-height:40vh}.pptx-ng-idrawer-grab{cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;background:inherit;justify-content:center;align-items:center;padding:8px 0 4px;display:flex;position:sticky;top:0}.pptx-ng-main{flex:auto;min-height:50vh}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-500:oklch(76.9% .188 70.08);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-blue-600:oklch(54.6% .245 262.881);--color-purple-600:oklch(55.8% .288 302.321);--color-slate-900:oklch(20.8% .042 265.755);--color-stone-100:oklch(97% .001 106.424);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-tight:1.25;--radius-sm:calc(var(--pptx-radius,.5rem) - 4px);--radius-lg:var(--pptx-radius,.5rem);--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:var(--pptx-background,#030712);--color-foreground:var(--pptx-foreground,#f3f4f6);--color-card:var(--pptx-card,#111827);--color-popover:var(--pptx-popover,#111827);--color-primary:var(--pptx-primary,#6366f1);--color-primary-foreground:var(--pptx-primary-foreground,#fff);--color-secondary:var(--pptx-secondary,#1f2937);--color-muted:var(--pptx-muted,#1f2937);--color-muted-foreground:var(--pptx-muted-foreground,#9ca3af);--color-accent:var(--pptx-accent,#1f2937);--color-border:var(--pptx-border,#374151)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.pptx-rb-icon{height:calc(var(--spacing) * 7);min-width:calc(var(--spacing) * 7);color:var(--color-foreground);border-radius:.25rem;justify-content:center;align-items:center;font-size:.95rem;display:inline-flex}@media (hover:hover){.pptx-rb-icon:hover{background-color:var(--color-accent)}}.pptx-rb-icon:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-pill{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-muted);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-foreground);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem;display:inline-flex}@media (hover:hover){.pptx-rb-pill:hover{background-color:var(--color-accent)}}.pptx-rb-pill:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-grp{background-color:var(--color-muted);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-foreground);border-radius:.25rem;align-items:center;display:inline-flex;overflow:hidden}.pptx-rb-gb{border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--color-border);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){.pptx-rb-gb:hover{background-color:var(--color-accent)}}.pptx-rb-gb:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-gl{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){.pptx-rb-gl:hover{background-color:var(--color-accent)}}.pptx-rb-gl:disabled{cursor:not-allowed;opacity:.4}.pptx-rb-sep{margin-inline:var(--spacing);background-color:var(--color-border);align-self:stretch;width:1px}@supports (color:color-mix(in lab, red, red)){.pptx-rb-sep{background-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.pptx-rb-select{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border);background-color:var(--color-card);padding-inline:var(--spacing);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-foreground);border-radius:.25rem}}@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.top-1{top:var(--spacing)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-1{right:var(--spacing)}.left-0{left:0}.z-20{z-index:20}.z-50{z-index:50}.z-\[1100\]{z-index:1100}.z-\[9999\]{z-index:9999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.my-1{margin-block:var(--spacing)}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.h-1{height:var(--spacing)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-24{height:calc(var(--spacing) * 24)}.h-px{height:1px}.w-1\/3{width:33.3333%}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-28{width:calc(var(--spacing) * 28)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-72{width:calc(var(--spacing) * 72)}.w-\[640px\]{width:640px}.w-full{width:100%}.w-px{width:1px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[420px\]{max-width:420px}.min-w-2{min-width:calc(var(--spacing) * 2)}.min-w-\[3rem\]{min-width:3rem}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.scale-\[1\.02\]{scale:1.02}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border,.border-border\/40{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\/40{border-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.border-border\/60{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--color-border) 60%, transparent)}}.border-primary{border-color:var(--color-primary)}.bg-accent{background-color:var(--color-accent)}.bg-background{background-color:var(--color-background)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-border\/40{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/40{background-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.bg-border\/50{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/50{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.bg-border\/60{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/60{background-color:color-mix(in oklab, var(--color-border) 60%, transparent)}}.bg-card{background-color:var(--color-card)}.bg-green-600{background-color:var(--color-green-600)}.bg-muted{background-color:var(--color-muted)}.bg-popover{background-color:var(--color-popover)}.bg-primary,.bg-primary\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-secondary\/50{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\/50{background-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.bg-transparent{background-color:#0000}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.text-center{text-align:center}.text-right{text-align:right}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.accent-primary{accent-color:var(--color-primary)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-primary{--tw-ring-color:var(--color-primary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:right-0:after{content:var(--tw-content);right:0}.after\:-bottom-px:after{content:var(--tw-content);bottom:-1px}.after\:left-0:after{content:var(--tw-content);left:0}.after\:h-\[2\.5px\]:after{content:var(--tw-content);height:2.5px}.after\:bg-primary:after{content:var(--tw-content);background-color:var(--color-primary)}@media (hover:hover){.hover\:scale-125:hover{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-primary\/50:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\:bg-accent\/60:hover{background-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/60:hover{background-color:color-mix(in oklab, var(--color-accent) 60%, transparent)}}.hover\:bg-green-500:hover{background-color:var(--color-green-500)}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-primary\/80:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary) 90%, transparent)}}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-primary:focus{border-color:var(--color-primary)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-primary:focus{--tw-ring-color:var(--color-primary)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}}pptx-ribbon-file-section,pptx-ribbon-home-section,pptx-ribbon-insert-section,pptx-ribbon-arrange-section,pptx-ribbon-slideshow-section,pptx-ribbon-review-section,pptx-ribbon-view-section,pptx-ribbon-draw-section,pptx-ribbon-design-section,pptx-ribbon-transitions-section,pptx-ribbon-animations-section,pptx-ribbon-paragraph-controls,pptx-ribbon-insert-fields,pptx-ribbon-font-controls{display:contents}.pptx-ng-viewer{--pptx-background:#030712;--pptx-foreground:#f3f4f6;--pptx-card:#111827;--pptx-border:#374151;--pptx-primary:#6366f1;--pptx-muted-foreground:#9ca3af;background:var(--pptx-background);width:100%;height:100%;min-height:0;color:var(--pptx-foreground);flex-direction:column;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;display:flex}.pptx-ng-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:.75rem;padding:2rem;display:flex}.pptx-ng-error-detail{background:var(--pptx-card);max-width:40rem;color:var(--pptx-muted-foreground);white-space:pre-wrap;border-radius:.5rem;padding:.75rem;font-size:.8rem;overflow:auto}.pptx-ng-spinner{border:3px solid var(--pptx-border);border-top-color:var(--pptx-primary);border-radius:50%;width:2rem;height:2rem;animation:.8s linear infinite pptx-ng-spin}@keyframes pptx-ng-spin{to{transform:rotate(360deg)}}.pptx-ng-toolbar{border-bottom:1px solid var(--pptx-border);background:var(--pptx-card);justify-content:space-between;align-items:center;gap:1rem;padding:.5rem .75rem;display:flex}.pptx-ng-nav,.pptx-ng-zoom{align-items:center;gap:.5rem;display:flex}.pptx-ng-toolbar button{border:1px solid var(--pptx-border);min-width:2rem;height:2rem;color:var(--pptx-foreground);cursor:pointer;background:0 0;border-radius:.375rem;padding:0 .5rem;font-size:1rem;line-height:1}.pptx-ng-toolbar button:hover:not(:disabled){border-color:var(--pptx-primary)}.pptx-ng-toolbar button:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-slide-counter,.pptx-ng-zoom-value{font-variant-numeric:tabular-nums;font-size:.85rem}.pptx-ng-body{flex:1;min-height:0;display:flex}.pptx-ng-thumbnails{border-right:1px solid var(--pptx-border);background:var(--pptx-card);flex-direction:column;gap:.5rem;width:8rem;padding:.75rem;display:flex;overflow-y:auto}.pptx-ng-thumb{aspect-ratio:16/9;border:2px solid var(--pptx-border);cursor:pointer;background:#fff;border-radius:.375rem;position:relative}.pptx-ng-thumb.is-active{border-color:var(--pptx-primary)}.pptx-ng-thumb-index{color:#111827;font-size:.7rem;position:absolute;bottom:.15rem;right:.3rem}.pptx-ng-main{background:#1e293b;flex:1;min-width:0;position:relative;overflow:auto}.pptx-ng-collab-follow{z-index:9998;pointer-events:auto;position:absolute;top:.5rem;left:50%;transform:translate(-50%)}.pptx-ng-canvas-viewport{width:100%;height:100%}.pptx-ng-element{box-sizing:border-box}.pptx-ng-canvas-stage.is-editable{cursor:default}.pptx-ng-canvas-stage.is-editable .pptx-ng-element{cursor:pointer}.pptx-ng-selection{box-sizing:border-box;outline-offset:1px;pointer-events:none;z-index:10000;background:#4f86ff14;outline:2px solid #4f86ff;position:absolute}.pptx-ng-handle{box-sizing:border-box;pointer-events:auto;touch-action:none;z-index:10001;background:#fff;border:1px solid #4f86ff;border-radius:2px;position:absolute}.pptx-ng-text-editor{box-sizing:border-box;color:#000;font:inherit;resize:none;z-index:10002;white-space:pre-wrap;background:#fffffff5;border:2px solid #4f86ff;margin:0;padding:2px;line-height:1.2;position:absolute;overflow:auto}.pptx-ng-marquee{box-sizing:border-box;pointer-events:none;z-index:9999;background:#4f86ff1f;border:1px dashed #4f86ff;position:absolute}.pptx-ng-snap-guide{box-sizing:border-box;pointer-events:none;z-index:10003;border-top:1px solid #f43f8e;border-left:1px solid #f43f8e;position:absolute}.pptx-ng-rotate-handle{box-sizing:border-box;cursor:grab;pointer-events:auto;touch-action:none;z-index:10001;background:#fff;border:1px solid #4f86ff;border-radius:50%;position:absolute}.pptx-ng-adjust-handle{box-sizing:border-box;cursor:crosshair;pointer-events:auto;touch-action:none;z-index:10001;background:#fcd34d;border:1px solid #b45309;position:absolute;transform:rotate(45deg)}.pptx-ng-inspector-host{background:#00000005;border-left:1px solid #0000001a;flex:0 0 240px;width:240px;overflow:auto}.pptx-ng-idrawer-grab{display:none}.pptx-ng-idrawer-handle{background:#00000040;border-radius:9999px;width:40px;height:4px}.pptx-ng-slide-props{flex-direction:column;gap:.5rem;padding:.75rem;font-size:.8125rem;display:flex}.pptx-ng-prop-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.pptx-ng-prop-row.pptx-ng-prop-col{flex-direction:column;align-items:stretch}.pptx-ng-prop-row textarea{resize:vertical;width:100%;font:inherit}.pptx-ng-img{object-fit:contain;width:100%;height:100%;display:block}.pptx-ng-para{margin:0}.pptx-ng-bullet{white-space:pre}.pptx-ng-link{color:inherit;cursor:pointer;text-decoration:underline}.pptx-ng-actions{align-items:center;gap:.25rem;display:flex}.pptx-ng-notes{background:#00000005;border-top:1px solid #0000001a;max-height:30%;margin:.5rem 1rem 1rem;padding:.5rem .75rem;font-size:.875rem;line-height:1.4;overflow:auto}.pptx-ng-notes-title{text-transform:uppercase;letter-spacing:.04em;opacity:.6;margin:0 0 .25rem;font-size:.75rem;font-weight:600}.pptx-ng-notes-body{white-space:pre-wrap;word-break:break-word;margin:0}.pptx-ng-mobile-notes-sheet{background:#fff;border-top:1px solid #00000026;flex:none;max-height:50vh;overflow:auto;box-shadow:0 -6px 20px #0000002e}.pptx-ng-mnotes-grab{cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:8px 0 4px;display:flex}.pptx-ng-mnotes-grab:active{cursor:grabbing}.pptx-ng-mnotes-handle{background:#00000040;border-radius:9999px;width:40px;height:4px}.pptx-ng-table-wrapper{width:100%;height:100%;overflow:hidden}.pptx-ng-table-wrapper>.pptx-ng-table{border-collapse:collapse;table-layout:fixed;width:100%;height:100%}.pptx-ng-table-wrapper>.pptx-ng-table td{word-break:break-word;vertical-align:middle;overflow:hidden}.pptx-ng-table-wrapper>.pptx-ng-table td .pptx-ng-cell-input{box-sizing:border-box;width:100%;color:inherit;font:inherit;background:0 0;border:none;outline:none;margin:0;padding:0}.pptx-ng-chart svg{width:100%;height:100%;display:block}.pptx-ng-placeholder{color:#6366f1cc;background:#6366f10f;border:1px dashed #6366f180;justify-content:center;align-items:center;width:100%;height:100%;font-size:.75rem;display:flex}.pptx-ng-overlay-grid{pointer-events:none;z-index:2;position:absolute;inset:0}.pptx-ng-overlay-guides{pointer-events:none;z-index:3;position:absolute;inset:0}.pptx-ng-ruler-corner{pointer-events:none;z-index:52;background:#1e293b;border-bottom:1px solid #ffffff1a;border-right:1px solid #ffffff1a;width:20px;height:20px;position:absolute;top:0;left:0}.pptx-ng-ruler-h{z-index:51;height:20px;position:absolute;top:0;left:20px;overflow:hidden}.pptx-ng-ruler-v{z-index:51;width:20px;position:absolute;top:20px;left:0;overflow:hidden}.pptx-ng-ruler-guide-line{pointer-events:none;z-index:49;background:#facc15d9;position:absolute}.pptx-ng-ruler-guide-handle{pointer-events:auto;touch-action:none;z-index:50;position:absolute}.pptx-rb-eyedropper-active{background-color:var(--color-purple-600);color:var(--color-white)}.pptx-rb-template-active{background-color:var(--color-amber-500);color:var(--color-white)}@media (max-width:640px),(pointer:coarse){.pptx-ng-toolbar{flex-wrap:wrap;gap:.5rem;padding:.5rem}.pptx-ng-actions{-webkit-overflow-scrolling:touch;scrollbar-width:thin;flex:100%;gap:.5rem;padding-bottom:.15rem;overflow-x:auto}.pptx-ng-actions button{flex:none}.pptx-ng-nav button,.pptx-ng-zoom button,.pptx-ng-actions button{min-width:44px;height:auto;min-height:44px;padding:0 .65rem;font-size:1.1rem}.pptx-ng-nav button{font-size:1.5rem;font-weight:600}.pptx-ng-thumbnails{border-right:none;border-bottom:1px solid var(--pptx-border);flex-direction:row;width:auto;max-width:100%;padding:.5rem;overflow:auto hidden}.pptx-ng-thumbnails .pptx-ng-thumb{flex:0 0 4.5rem;width:4.5rem}.pptx-ng-body{flex-direction:column}.pptx-ng-body>pptx-slides-panel{flex:none;max-height:30vh}.pptx-ng-inspector-host{border-left:none;border-top:1px solid var(--pptx-border);flex:none;width:100%;max-height:40vh}.pptx-ng-idrawer-grab{cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;background:inherit;justify-content:center;align-items:center;padding:8px 0 4px;display:flex;position:sticky;top:0}.pptx-ng-main{flex:auto;min-height:50vh}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
@@ -1,8 +1,8 @@
1
+ import * as pptx_angular_viewer from 'pptx-angular-viewer';
1
2
  import * as _angular_core from '@angular/core';
2
3
  import { Signal, WritableSignal, OnDestroy, OnInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
3
4
  import * as pptx_viewer_core from 'pptx-viewer-core';
4
5
  import { PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxElementAnimation, PptxSlide, TextSegment, TextStyle, PptxTransitionType, PptxEmbeddedFont, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, PptxComment, SmartArtLayout, PptxTheme, PptxSlideMaster, PptxCoreProperties, PptxCustomProperty, PptxHeaderFooter, ParsedSignature, PptxTableCell, PptxTableData, PptxCustomShow, PptxPresentationProperties, PptxThemePreset, InkPptxElement, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, TablePptxElement, ChartPptxElement, SmartArtPptxElement, PptxSmartArtData, PptxTableCellStyle, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartSeries, PptxChartType, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, PptxAnimationPreset, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, PptxAnimationSequence, SignatureStatus } from 'pptx-viewer-core';
5
- import * as pptx_angular_viewer from 'pptx-angular-viewer';
6
6
  import { Options } from 'html2canvas-pro';
7
7
  import { SafeHtml } from '@angular/platform-browser';
8
8
 
@@ -125,18 +125,37 @@ interface CanvasSize {
125
125
  }
126
126
  /** Collaboration role within a session. */
127
127
  type CollaborationRole = 'owner' | 'collaborator' | 'viewer';
128
+ /**
129
+ * Collaboration transport.
130
+ *
131
+ * - `'websocket'` (default): y-websocket against `serverUrl`.
132
+ * - `'webrtc'`: y-webrtc peer-to-peer; needs no document server. Peers meet
133
+ * through the `signaling` servers (WebRTC signaling only, no document data)
134
+ * and same-browser tabs additionally sync via BroadcastChannel even without
135
+ * any signaling server, which makes this mode usable from static hosting.
136
+ */
137
+ type CollaborationTransport = 'websocket' | 'webrtc';
128
138
  /**
129
139
  * Real-time collaboration configuration.
130
140
  *
131
- * The collaboration runtime (Yjs) is not yet ported to every binding this
132
- * type exists so the public prop surface stays identical across React, Vue,
133
- * and Angular.
141
+ * The same shape is accepted by the React, Vue, and Angular bindings.
134
142
  */
135
143
  interface CollaborationConfig {
136
144
  /** Unique identifier for the collaboration room (alphanumeric, hyphens, underscores). */
137
145
  roomId: string;
138
- /** WebSocket server URL for the Yjs provider (e.g. "wss://collab.example.com"). */
146
+ /**
147
+ * WebSocket server URL for the Yjs provider (e.g. "wss://collab.example.com").
148
+ * Ignored (may be empty) when `transport` is `'webrtc'`.
149
+ */
139
150
  serverUrl: string;
151
+ /** Transport to use. Defaults to `'websocket'`. */
152
+ transport?: CollaborationTransport;
153
+ /**
154
+ * WebRTC signaling server URLs (only used when `transport` is `'webrtc'`).
155
+ * Defaults to y-webrtc's built-in public signaling list. Same-browser tabs
156
+ * sync via BroadcastChannel regardless of signaling availability.
157
+ */
158
+ signaling?: string[];
140
159
  /** Display name for the local user. */
141
160
  userName: string;
142
161
  /** Avatar URL for the local user (optional). */
@@ -145,7 +164,7 @@ interface CollaborationConfig {
145
164
  userColor?: string;
146
165
  /** Optional authentication token sent with the WebSocket handshake. */
147
166
  authToken?: string;
148
- /** Role in the session defaults to `'collaborator'`. */
167
+ /** Role in the session; defaults to `'collaborator'`. */
149
168
  role?: CollaborationRole;
150
169
  /**
151
170
  * Elected-writer write-back callback (Area 3 of the C3 hardening plan).
@@ -1396,6 +1415,8 @@ declare function resolveHyperlinkHref(url: string | undefined): string | undefin
1396
1415
  * the Angular `collaboration-helpers.ts` (which predates this shared copy).
1397
1416
  */
1398
1417
 
1418
+ /** Connection lifecycle states for the Yjs WebSocket provider. */
1419
+ type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
1399
1420
  /** A single remote collaborator's cursor, in unscaled slide coordinates. */
1400
1421
  interface RemoteCursor {
1401
1422
  /** Stable id for the remote client (awareness clientId or peer id). */
@@ -1964,6 +1985,7 @@ declare function formatRelativeTime(ts: number): string;
1964
1985
  * ng-packagr lib target). `Math.random` is read inside the generator at call
1965
1986
  * time, never at module eval.
1966
1987
  */
1988
+
1967
1989
  /** Default y-websocket server URL used when no default is supplied. */
1968
1990
  declare const DEFAULT_BROADCAST_SERVER_URL = "ws://localhost:1234";
1969
1991
  /** Optional seed values for the broadcast start form. */
@@ -1975,6 +1997,8 @@ interface BroadcastDefaults {
1975
1997
  interface BroadcastConfig {
1976
1998
  roomId: string;
1977
1999
  serverUrl: string;
2000
+ /** Derived from serverUrl: empty server means peer-to-peer (webrtc). */
2001
+ transport?: CollaborationTransport;
1978
2002
  }
1979
2003
  /** Generate a fresh, broadcast-scoped room id (`broadcast-<suffix>`). */
1980
2004
  declare function generateBroadcastRoomId(): string;
@@ -1983,16 +2007,21 @@ declare function generateBroadcastRoomId(): string;
1983
2007
  * when none is supplied and falling back to the default server URL.
1984
2008
  */
1985
2009
  declare function seedBroadcastFields(defaults?: BroadcastDefaults): BroadcastConfig;
1986
- /** Whether both required fields are non-blank (after trimming). */
2010
+ /**
2011
+ * Whether the form can start: the room id is required; the server URL may be
2012
+ * blank, which selects the serverless webrtc transport.
2013
+ */
1987
2014
  declare function canStartBroadcast(fields: BroadcastConfig): boolean;
1988
2015
  /**
1989
2016
  * Assemble a {@link BroadcastConfig} from the (trimmed) form fields, or `null`
1990
- * when incomplete.
2017
+ * when incomplete. A blank server URL yields `transport: 'webrtc'`.
1991
2018
  */
1992
2019
  declare function buildBroadcastConfig(fields: BroadcastConfig): BroadcastConfig | null;
1993
2020
  /**
1994
2021
  * Build the shareable viewer follow-link for a broadcast. Returns just the
1995
2022
  * room id when no `origin`/`pathname` are available (non-browser environments).
2023
+ * A blank server URL produces a `transport=webrtc` link instead of a
2024
+ * `server=` parameter.
1996
2025
  */
1997
2026
  declare function buildBroadcastViewerUrl(roomId: string, serverUrl: string, location?: {
1998
2027
  origin: string;
@@ -2602,11 +2631,20 @@ interface ConnectOptions {
2602
2631
  getTemplateElements?: () => TemplateElementsBySlideId;
2603
2632
  }
2604
2633
  declare class CollaborationService {
2605
- readonly connected: _angular_core.WritableSignal<boolean>;
2634
+ readonly status: _angular_core.WritableSignal<ConnectionStatus>;
2635
+ readonly connected: _angular_core.Signal<boolean>;
2606
2636
  readonly active: _angular_core.WritableSignal<boolean>;
2637
+ /** Role of the local user in the active session, or undefined when idle. */
2638
+ readonly activeRole: _angular_core.WritableSignal<CollaborationRole | undefined>;
2607
2639
  readonly presence: _angular_core.WritableSignal<SanitizedPresence[]>;
2608
2640
  readonly cursors: _angular_core.Signal<RemoteCursor[]>;
2609
2641
  readonly connectedCount: _angular_core.Signal<number>;
2642
+ /** The client id the local user is currently following (null when free). */
2643
+ readonly followedClientId: _angular_core.WritableSignal<number | null>;
2644
+ /** Active-slide index of the followed peer, or null when not following. */
2645
+ readonly followedSlideIndex: _angular_core.Signal<number | null>;
2646
+ /** Active-slide index of the first `owner` peer (the broadcaster), or null. */
2647
+ readonly broadcasterSlideIndex: _angular_core.Signal<number | null>;
2610
2648
  private ydoc;
2611
2649
  private provider;
2612
2650
  private awareness;
@@ -2614,28 +2652,50 @@ declare class CollaborationService {
2614
2652
  private applyingRemote;
2615
2653
  private yFactories;
2616
2654
  private lastSynced;
2617
- private writeBackTimer;
2655
+ private connectTimer;
2618
2656
  private unobserveSlides;
2657
+ private readonly writeBack;
2619
2658
  private onRemoteSlides;
2620
2659
  private canvasWidth;
2621
2660
  private canvasHeight;
2622
2661
  private getSourceBytes;
2623
2662
  private getTemplateElements;
2624
- private userName;
2625
- private userColor;
2626
- private userAvatar;
2627
- private role;
2628
2663
  private currentConfig;
2664
+ private lastConfig;
2665
+ private lastOptions;
2666
+ private localPresence;
2629
2667
  private readonly refreshPresence;
2630
2668
  constructor();
2631
2669
  connect(config: CollaborationConfig, options?: ConnectOptions): Promise<void>;
2670
+ /** Reconnect using the configuration from the most recent {@link connect}. */
2671
+ retry(): Promise<void>;
2672
+ /** Wire the provider status events + (websocket-only) connection timeout. */
2673
+ private wireStatus;
2674
+ /** Handle a remote Y.Doc change, skipping our own local-origin transactions. */
2675
+ private onRemoteChange;
2632
2676
  disconnect(): void;
2633
- /** Broadcast the local slide set to peers via the pptx:slides Y.Array. */
2677
+ /**
2678
+ * Broadcast the local slide set to peers, reconciling only what changed into
2679
+ * the pptx:slides Y.Array. An empty deck is never written (so a late-joiner
2680
+ * that has not yet received the doc cannot clobber it), and an unchanged deck
2681
+ * is skipped.
2682
+ */
2683
+ /**
2684
+ * Record the current local deck as the sync baseline so the first (unchanged)
2685
+ * broadcast after connecting is suppressed. Call right after {@link connect}
2686
+ * for a joiner whose local deck is a placeholder awaiting remote sync, so it
2687
+ * never overwrites the shared document before receiving it.
2688
+ */
2689
+ seedBaseline(slides: readonly PptxSlide[]): void;
2634
2690
  broadcastSlides(slides: readonly PptxSlide[]): void;
2635
2691
  setCursor(x: number, y: number, activeSlideIndex?: number): void;
2636
2692
  setSelection(selectedElementId: string | undefined, activeSlideIndex?: number): void;
2637
- private _publishAwareness;
2638
- private _scheduleWriteBack;
2693
+ /** Publish the local active-slide index (drives follow-along). */
2694
+ setActiveSlide(index: number): void;
2695
+ /** Follow the given peer's active slide, or `null` to stop following. */
2696
+ followUser(clientId: number | null): void;
2697
+ private clearConnectTimer;
2698
+ private scheduleWriteBack;
2639
2699
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollaborationService, never>;
2640
2700
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<CollaborationService>;
2641
2701
  }
@@ -2686,6 +2746,13 @@ declare class EditorStateService {
2686
2746
  * preserves history and selection.
2687
2747
  */
2688
2748
  applyReplacement(newSlides: readonly PptxSlide[], label?: string): void;
2749
+ /**
2750
+ * Apply a remote collaborator's slide set (already template-free, as broadcast
2751
+ * over the CRDT) to the editable deck. Selection, history, and this peer's own
2752
+ * separated template store are left untouched; remote edits are not local undo
2753
+ * steps.
2754
+ */
2755
+ applyRemoteSlides(slides: readonly PptxSlide[]): void;
2689
2756
  /** Capture the current deck + template store as one undo/redo snapshot. */
2690
2757
  private captureSnapshot;
2691
2758
  /** Restore both the deck and the template store from a snapshot. */
@@ -3439,6 +3506,17 @@ interface CollaborationSessionHost {
3439
3506
  readonly authorName: () => string | undefined;
3440
3507
  readonly shareDefaults: () => ShareDefaults$1 | undefined;
3441
3508
  readonly getTemplateElements: () => TemplateElementsBySlideId;
3509
+ /** Apply a remote peer's slide set to the editable deck (echo-guarded in the service). */
3510
+ readonly applyRemoteSlides: (slides: PptxSlide[]) => void;
3511
+ /** Current slide-canvas size (presence bounds). */
3512
+ readonly canvasSize: () => {
3513
+ width: number;
3514
+ height: number;
3515
+ };
3516
+ /** The loaded source `.pptx` bytes for elected-writer write-back, if any. */
3517
+ readonly getSourceBytes: () => Uint8Array | null;
3518
+ /** The current editable deck (seeds the sync baseline after connecting). */
3519
+ readonly currentSlides: () => readonly PptxSlide[];
3442
3520
  readonly emitStart: (config: CollaborationConfig) => void;
3443
3521
  readonly emitStop: () => void;
3444
3522
  }
@@ -3463,6 +3541,20 @@ declare class ViewerCollaborationSessionService {
3463
3541
  readonly shareUrl: _angular_core.Signal<string>;
3464
3542
  /** Shareable follow link for the active broadcast. */
3465
3543
  readonly broadcastViewerUrl: _angular_core.Signal<string>;
3544
+ /** Whether the active session is serverless (peer-to-peer / webrtc). */
3545
+ readonly activeSessionP2p: _angular_core.Signal<boolean>;
3546
+ /**
3547
+ * Assemble the {@link ConnectOptions} shared by every connect call site: apply
3548
+ * remote slides to the editor, size the presence bounds to the canvas, and
3549
+ * expose the source bytes + separated template elements for write-back.
3550
+ */
3551
+ private connectOptions;
3552
+ /**
3553
+ * Connect and immediately seed the sync baseline with the current deck, so a
3554
+ * joiner whose deck is still a placeholder never broadcasts (and overwrites)
3555
+ * the shared document before the first remote sync arrives.
3556
+ */
3557
+ private connectWithBaseline;
3466
3558
  /**
3467
3559
  * Seed values for the Share dialog: the host-supplied `shareDefaults`, with
3468
3560
  * `userName` falling back to `authorName` (then "You") so the local user's
@@ -3888,6 +3980,13 @@ declare class PowerPointViewerComponent {
3888
3980
  protected readonly rootStyle: _angular_core.Signal<Record<string, string>>;
3889
3981
  protected readonly zoom: _angular_core.WritableSignal<number>;
3890
3982
  protected readonly zoomPercent: _angular_core.Signal<number>;
3983
+ /**
3984
+ * Remote cursors filtered to the slide the local user is viewing, so peers'
3985
+ * cursors only appear on the shared slide (mirrors React/Vue).
3986
+ */
3987
+ protected readonly collabCursors: _angular_core.Signal<pptx_angular_viewer.RemoteCursor[]>;
3988
+ /** Timestamp of the last cursor broadcast (throttle gate). */
3989
+ private lastCursorBroadcast;
3891
3990
  /** Fullscreen presentation-mode overlay visibility. */
3892
3991
  protected readonly presenting: _angular_core.WritableSignal<boolean>;
3893
3992
  /** Presenter-view (speaker) overlay visibility. */
@@ -3994,6 +4093,15 @@ declare class PowerPointViewerComponent {
3994
4093
  goTo(index: number): void;
3995
4094
  goPrev(): void;
3996
4095
  goNext(): void;
4096
+ /**
4097
+ * Publish the local cursor while the pointer moves over the canvas. Throttled
4098
+ * to {@link BROADCAST_THROTTLE_MS}; coordinates are mapped from client space
4099
+ * into unscaled slide space (dividing by zoom, matching the cursor overlay)
4100
+ * and clamped to the canvas bounds.
4101
+ */
4102
+ protected onCollabPointerMove(event: PointerEvent): void;
4103
+ /** The loaded source `.pptx` bytes (for elected-writer write-back), if any. */
4104
+ private currentSourceBytes;
3997
4105
  /**
3998
4106
  * Apply a built-in theme preset to the whole deck.
3999
4107
  *
@@ -7498,11 +7606,16 @@ interface ShareFormFields {
7498
7606
  }
7499
7607
  /** Seed the form fields from the (optional) defaults, coercing absent values. */
7500
7608
  declare function seedShareFields(defaults?: ShareDefaults): ShareFormFields;
7501
- /** Whether all three required fields are non-blank (after trimming). */
7609
+ /**
7610
+ * Whether the required fields are non-blank (after trimming). The server URL is
7611
+ * optional: a blank server selects the serverless (webrtc) peer-to-peer
7612
+ * transport, so only the room id and display name are required.
7613
+ */
7502
7614
  declare function canStartShare(fields: ShareFormFields): boolean;
7503
7615
  /**
7504
7616
  * Assemble a {@link CollaborationConfig} from the (trimmed) form fields, or
7505
- * `null` when the form is incomplete.
7617
+ * `null` when the form is incomplete. A blank server URL yields
7618
+ * `transport: 'webrtc'`; otherwise the default websocket transport is used.
7506
7619
  */
7507
7620
  declare function buildCollaborationConfig(fields: ShareFormFields): CollaborationConfig | null;
7508
7621
  /**
@@ -7527,6 +7640,8 @@ declare class ShareDialogComponent {
7527
7640
  readonly userCount: _angular_core.InputSignal<number>;
7528
7641
  /** Shareable join link surfaced while the session is active. */
7529
7642
  readonly shareUrl: _angular_core.InputSignal<string>;
7643
+ /** Whether the active session is peer-to-peer (serverless webrtc). */
7644
+ readonly p2p: _angular_core.InputSignal<boolean>;
7530
7645
  /** Fired with the assembled config when the user starts sharing. */
7531
7646
  readonly start: _angular_core.OutputEmitterRef<CollaborationConfig>;
7532
7647
  /** Fired when the user stops an active session. */
@@ -7538,6 +7653,8 @@ declare class ShareDialogComponent {
7538
7653
  readonly serverUrl: _angular_core.WritableSignal<string>;
7539
7654
  readonly copied: _angular_core.WritableSignal<boolean>;
7540
7655
  readonly canStart: _angular_core.Signal<boolean>;
7656
+ /** Blank server URL selects the serverless peer-to-peer (webrtc) transport. */
7657
+ readonly isP2p: _angular_core.Signal<boolean>;
7541
7658
  readonly canCopy: _angular_core.Signal<boolean>;
7542
7659
  constructor();
7543
7660
  asValue(event: Event): string;
@@ -7546,7 +7663,7 @@ declare class ShareDialogComponent {
7546
7663
  handleStart(): void;
7547
7664
  handleStop(): void;
7548
7665
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShareDialogComponent, never>;
7549
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShareDialogComponent, "pptx-share-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaults": { "alias": "defaults"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "connected": { "alias": "connected"; "required": false; "isSignal": true; }; "userCount": { "alias": "userCount"; "required": false; "isSignal": true; }; "shareUrl": { "alias": "shareUrl"; "required": false; "isSignal": true; }; }, { "start": "start"; "stop": "stop"; "close": "close"; }, never, never, true, never>;
7666
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShareDialogComponent, "pptx-share-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaults": { "alias": "defaults"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "connected": { "alias": "connected"; "required": false; "isSignal": true; }; "userCount": { "alias": "userCount"; "required": false; "isSignal": true; }; "shareUrl": { "alias": "shareUrl"; "required": false; "isSignal": true; }; "p2p": { "alias": "p2p"; "required": false; "isSignal": true; }; }, { "start": "start"; "stop": "stop"; "close": "close"; }, never, never, true, never>;
7550
7667
  }
7551
7668
 
7552
7669
  declare class HyperlinkDialogComponent {
@@ -7585,6 +7702,8 @@ declare class BroadcastDialogComponent {
7585
7702
  readonly viewerCount: _angular_core.InputSignal<number>;
7586
7703
  /** The shareable follow link (shown while `active`). */
7587
7704
  readonly viewerUrl: _angular_core.InputSignal<string | undefined>;
7705
+ /** Whether the active broadcast is peer-to-peer (serverless webrtc). */
7706
+ readonly p2p: _angular_core.InputSignal<boolean>;
7588
7707
  /** Fired when the presenter starts a broadcast. */
7589
7708
  readonly start: _angular_core.OutputEmitterRef<BroadcastConfig>;
7590
7709
  /** Fired when the presenter stops the active broadcast. */
@@ -7595,6 +7714,8 @@ declare class BroadcastDialogComponent {
7595
7714
  readonly serverUrl: _angular_core.WritableSignal<string>;
7596
7715
  readonly copied: _angular_core.WritableSignal<boolean>;
7597
7716
  readonly canStart: _angular_core.Signal<boolean>;
7717
+ /** Blank server URL selects the serverless peer-to-peer (webrtc) transport. */
7718
+ readonly isP2p: _angular_core.Signal<boolean>;
7598
7719
  private readonly broadcastingTitle;
7599
7720
  private readonly startTitle;
7600
7721
  readonly dialogTitle: _angular_core.Signal<any>;
@@ -7607,7 +7728,7 @@ declare class BroadcastDialogComponent {
7607
7728
  onStop(): void;
7608
7729
  onCopyLink(): void;
7609
7730
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BroadcastDialogComponent, never>;
7610
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BroadcastDialogComponent, "pptx-broadcast-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaults": { "alias": "defaults"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "connected": { "alias": "connected"; "required": false; "isSignal": true; }; "viewerCount": { "alias": "viewerCount"; "required": false; "isSignal": true; }; "viewerUrl": { "alias": "viewerUrl"; "required": false; "isSignal": true; }; }, { "start": "start"; "stop": "stop"; "close": "close"; }, never, never, true, never>;
7731
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BroadcastDialogComponent, "pptx-broadcast-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaults": { "alias": "defaults"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "connected": { "alias": "connected"; "required": false; "isSignal": true; }; "viewerCount": { "alias": "viewerCount"; "required": false; "isSignal": true; }; "viewerUrl": { "alias": "viewerUrl"; "required": false; "isSignal": true; }; "p2p": { "alias": "p2p"; "required": false; "isSignal": true; }; }, { "start": "start"; "stop": "stop"; "close": "close"; }, never, never, true, never>;
7611
7732
  }
7612
7733
 
7613
7734
  declare class ViewerCompareService {