pptx-angular-viewer 1.1.58 → 1.1.60

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.58",
3
+ "version": "1.1.60",
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,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;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,pptx-viewer-extra-dialogs,pptx-font-embedding-list,pptx-element-renderer{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,72 @@ 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;
2658
+ /**
2659
+ * First-write gate: local broadcasts are suppressed (captured as pending)
2660
+ * until the provider confirms its initial sync or the grace period lifts
2661
+ * the gate, so a late joiner never seeds its placeholder deck into a room
2662
+ * whose real content has not arrived yet.
2663
+ */
2664
+ private readonly syncGate;
2665
+ private pendingBroadcast;
2619
2666
  private onRemoteSlides;
2620
2667
  private canvasWidth;
2621
2668
  private canvasHeight;
2622
2669
  private getSourceBytes;
2623
2670
  private getTemplateElements;
2624
- private userName;
2625
- private userColor;
2626
- private userAvatar;
2627
- private role;
2628
2671
  private currentConfig;
2672
+ private lastConfig;
2673
+ private lastOptions;
2674
+ private localPresence;
2629
2675
  private readonly refreshPresence;
2630
2676
  constructor();
2631
2677
  connect(config: CollaborationConfig, options?: ConnectOptions): Promise<void>;
2678
+ /** Reconnect using the configuration from the most recent {@link connect}. */
2679
+ retry(): Promise<void>;
2680
+ /** Wire the provider status events + (websocket-only) connection timeout. */
2681
+ private wireStatus;
2682
+ /**
2683
+ * Open the first-write gate on the provider's initial-sync confirmation.
2684
+ * y-websocket emits 'sync' with a boolean; y-webrtc emits 'synced' with an
2685
+ * object carrying a `synced` flag (and only once a peer syncs, hence the
2686
+ * grace timer). Listen to both; opening is idempotent.
2687
+ */
2688
+ private wireSynced;
2689
+ /**
2690
+ * Perform the deferred first broadcast once the gate opens. When the doc is
2691
+ * still empty (fresh room, or nobody else present), clear the baseline so
2692
+ * the pending deck actually seeds it; when remote content already arrived,
2693
+ * the pending deck matches the applied baseline and the write is a no-op.
2694
+ */
2695
+ private flushPendingBroadcast;
2696
+ /** Handle a remote Y.Doc change, skipping our own local-origin transactions. */
2697
+ private onRemoteChange;
2632
2698
  disconnect(): void;
2633
- /** Broadcast the local slide set to peers via the pptx:slides Y.Array. */
2699
+ /**
2700
+ * Broadcast the local slide set to peers, reconciling only what changed into
2701
+ * the pptx:slides Y.Array. An empty deck is never written (so a late-joiner
2702
+ * that has not yet received the doc cannot clobber it), and an unchanged deck
2703
+ * is skipped.
2704
+ */
2705
+ /**
2706
+ * Record the current local deck as the sync baseline so the first (unchanged)
2707
+ * broadcast after connecting is suppressed. Call right after {@link connect}
2708
+ * for a joiner whose local deck is a placeholder awaiting remote sync, so it
2709
+ * never overwrites the shared document before receiving it.
2710
+ */
2711
+ seedBaseline(slides: readonly PptxSlide[]): void;
2634
2712
  broadcastSlides(slides: readonly PptxSlide[]): void;
2635
2713
  setCursor(x: number, y: number, activeSlideIndex?: number): void;
2636
2714
  setSelection(selectedElementId: string | undefined, activeSlideIndex?: number): void;
2637
- private _publishAwareness;
2638
- private _scheduleWriteBack;
2715
+ /** Publish the local active-slide index (drives follow-along). */
2716
+ setActiveSlide(index: number): void;
2717
+ /** Follow the given peer's active slide, or `null` to stop following. */
2718
+ followUser(clientId: number | null): void;
2719
+ private clearConnectTimer;
2720
+ private scheduleWriteBack;
2639
2721
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollaborationService, never>;
2640
2722
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<CollaborationService>;
2641
2723
  }
@@ -2686,6 +2768,13 @@ declare class EditorStateService {
2686
2768
  * preserves history and selection.
2687
2769
  */
2688
2770
  applyReplacement(newSlides: readonly PptxSlide[], label?: string): void;
2771
+ /**
2772
+ * Apply a remote collaborator's slide set (already template-free, as broadcast
2773
+ * over the CRDT) to the editable deck. Selection, history, and this peer's own
2774
+ * separated template store are left untouched; remote edits are not local undo
2775
+ * steps.
2776
+ */
2777
+ applyRemoteSlides(slides: readonly PptxSlide[]): void;
2689
2778
  /** Capture the current deck + template store as one undo/redo snapshot. */
2690
2779
  private captureSnapshot;
2691
2780
  /** Restore both the deck and the template store from a snapshot. */
@@ -3439,6 +3528,17 @@ interface CollaborationSessionHost {
3439
3528
  readonly authorName: () => string | undefined;
3440
3529
  readonly shareDefaults: () => ShareDefaults$1 | undefined;
3441
3530
  readonly getTemplateElements: () => TemplateElementsBySlideId;
3531
+ /** Apply a remote peer's slide set to the editable deck (echo-guarded in the service). */
3532
+ readonly applyRemoteSlides: (slides: PptxSlide[]) => void;
3533
+ /** Current slide-canvas size (presence bounds). */
3534
+ readonly canvasSize: () => {
3535
+ width: number;
3536
+ height: number;
3537
+ };
3538
+ /** The loaded source `.pptx` bytes for elected-writer write-back, if any. */
3539
+ readonly getSourceBytes: () => Uint8Array | null;
3540
+ /** The current editable deck (seeds the sync baseline after connecting). */
3541
+ readonly currentSlides: () => readonly PptxSlide[];
3442
3542
  readonly emitStart: (config: CollaborationConfig) => void;
3443
3543
  readonly emitStop: () => void;
3444
3544
  }
@@ -3463,6 +3563,20 @@ declare class ViewerCollaborationSessionService {
3463
3563
  readonly shareUrl: _angular_core.Signal<string>;
3464
3564
  /** Shareable follow link for the active broadcast. */
3465
3565
  readonly broadcastViewerUrl: _angular_core.Signal<string>;
3566
+ /** Whether the active session is serverless (peer-to-peer / webrtc). */
3567
+ readonly activeSessionP2p: _angular_core.Signal<boolean>;
3568
+ /**
3569
+ * Assemble the {@link ConnectOptions} shared by every connect call site: apply
3570
+ * remote slides to the editor, size the presence bounds to the canvas, and
3571
+ * expose the source bytes + separated template elements for write-back.
3572
+ */
3573
+ private connectOptions;
3574
+ /**
3575
+ * Connect and immediately seed the sync baseline with the current deck, so a
3576
+ * joiner whose deck is still a placeholder never broadcasts (and overwrites)
3577
+ * the shared document before the first remote sync arrives.
3578
+ */
3579
+ private connectWithBaseline;
3466
3580
  /**
3467
3581
  * Seed values for the Share dialog: the host-supplied `shareDefaults`, with
3468
3582
  * `userName` falling back to `authorName` (then "You") so the local user's
@@ -3888,6 +4002,13 @@ declare class PowerPointViewerComponent {
3888
4002
  protected readonly rootStyle: _angular_core.Signal<Record<string, string>>;
3889
4003
  protected readonly zoom: _angular_core.WritableSignal<number>;
3890
4004
  protected readonly zoomPercent: _angular_core.Signal<number>;
4005
+ /**
4006
+ * Remote cursors filtered to the slide the local user is viewing, so peers'
4007
+ * cursors only appear on the shared slide (mirrors React/Vue).
4008
+ */
4009
+ protected readonly collabCursors: _angular_core.Signal<pptx_angular_viewer.RemoteCursor[]>;
4010
+ /** Timestamp of the last cursor broadcast (throttle gate). */
4011
+ private lastCursorBroadcast;
3891
4012
  /** Fullscreen presentation-mode overlay visibility. */
3892
4013
  protected readonly presenting: _angular_core.WritableSignal<boolean>;
3893
4014
  /** Presenter-view (speaker) overlay visibility. */
@@ -3994,6 +4115,15 @@ declare class PowerPointViewerComponent {
3994
4115
  goTo(index: number): void;
3995
4116
  goPrev(): void;
3996
4117
  goNext(): void;
4118
+ /**
4119
+ * Publish the local cursor while the pointer moves over the canvas. Throttled
4120
+ * to {@link BROADCAST_THROTTLE_MS}; coordinates are mapped from client space
4121
+ * into unscaled slide space (dividing by zoom, matching the cursor overlay)
4122
+ * and clamped to the canvas bounds.
4123
+ */
4124
+ protected onCollabPointerMove(event: PointerEvent): void;
4125
+ /** The loaded source `.pptx` bytes (for elected-writer write-back), if any. */
4126
+ private currentSourceBytes;
3997
4127
  /**
3998
4128
  * Apply a built-in theme preset to the whole deck.
3999
4129
  *
@@ -7498,11 +7628,16 @@ interface ShareFormFields {
7498
7628
  }
7499
7629
  /** Seed the form fields from the (optional) defaults, coercing absent values. */
7500
7630
  declare function seedShareFields(defaults?: ShareDefaults): ShareFormFields;
7501
- /** Whether all three required fields are non-blank (after trimming). */
7631
+ /**
7632
+ * Whether the required fields are non-blank (after trimming). The server URL is
7633
+ * optional: a blank server selects the serverless (webrtc) peer-to-peer
7634
+ * transport, so only the room id and display name are required.
7635
+ */
7502
7636
  declare function canStartShare(fields: ShareFormFields): boolean;
7503
7637
  /**
7504
7638
  * Assemble a {@link CollaborationConfig} from the (trimmed) form fields, or
7505
- * `null` when the form is incomplete.
7639
+ * `null` when the form is incomplete. A blank server URL yields
7640
+ * `transport: 'webrtc'`; otherwise the default websocket transport is used.
7506
7641
  */
7507
7642
  declare function buildCollaborationConfig(fields: ShareFormFields): CollaborationConfig | null;
7508
7643
  /**
@@ -7527,6 +7662,8 @@ declare class ShareDialogComponent {
7527
7662
  readonly userCount: _angular_core.InputSignal<number>;
7528
7663
  /** Shareable join link surfaced while the session is active. */
7529
7664
  readonly shareUrl: _angular_core.InputSignal<string>;
7665
+ /** Whether the active session is peer-to-peer (serverless webrtc). */
7666
+ readonly p2p: _angular_core.InputSignal<boolean>;
7530
7667
  /** Fired with the assembled config when the user starts sharing. */
7531
7668
  readonly start: _angular_core.OutputEmitterRef<CollaborationConfig>;
7532
7669
  /** Fired when the user stops an active session. */
@@ -7538,6 +7675,8 @@ declare class ShareDialogComponent {
7538
7675
  readonly serverUrl: _angular_core.WritableSignal<string>;
7539
7676
  readonly copied: _angular_core.WritableSignal<boolean>;
7540
7677
  readonly canStart: _angular_core.Signal<boolean>;
7678
+ /** Blank server URL selects the serverless peer-to-peer (webrtc) transport. */
7679
+ readonly isP2p: _angular_core.Signal<boolean>;
7541
7680
  readonly canCopy: _angular_core.Signal<boolean>;
7542
7681
  constructor();
7543
7682
  asValue(event: Event): string;
@@ -7546,7 +7685,7 @@ declare class ShareDialogComponent {
7546
7685
  handleStart(): void;
7547
7686
  handleStop(): void;
7548
7687
  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>;
7688
+ 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
7689
  }
7551
7690
 
7552
7691
  declare class HyperlinkDialogComponent {
@@ -7585,6 +7724,8 @@ declare class BroadcastDialogComponent {
7585
7724
  readonly viewerCount: _angular_core.InputSignal<number>;
7586
7725
  /** The shareable follow link (shown while `active`). */
7587
7726
  readonly viewerUrl: _angular_core.InputSignal<string | undefined>;
7727
+ /** Whether the active broadcast is peer-to-peer (serverless webrtc). */
7728
+ readonly p2p: _angular_core.InputSignal<boolean>;
7588
7729
  /** Fired when the presenter starts a broadcast. */
7589
7730
  readonly start: _angular_core.OutputEmitterRef<BroadcastConfig>;
7590
7731
  /** Fired when the presenter stops the active broadcast. */
@@ -7595,6 +7736,8 @@ declare class BroadcastDialogComponent {
7595
7736
  readonly serverUrl: _angular_core.WritableSignal<string>;
7596
7737
  readonly copied: _angular_core.WritableSignal<boolean>;
7597
7738
  readonly canStart: _angular_core.Signal<boolean>;
7739
+ /** Blank server URL selects the serverless peer-to-peer (webrtc) transport. */
7740
+ readonly isP2p: _angular_core.Signal<boolean>;
7598
7741
  private readonly broadcastingTitle;
7599
7742
  private readonly startTitle;
7600
7743
  readonly dialogTitle: _angular_core.Signal<any>;
@@ -7607,7 +7750,7 @@ declare class BroadcastDialogComponent {
7607
7750
  onStop(): void;
7608
7751
  onCopyLink(): void;
7609
7752
  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>;
7753
+ 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
7754
  }
7612
7755
 
7613
7756
  declare class ViewerCompareService {