pptx-vanilla-viewer 3.37.0 → 3.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/dist/i18n/de.cjs +84 -1
- package/dist/i18n/de.mjs +84 -1
- package/dist/i18n/es.cjs +84 -1
- package/dist/i18n/es.mjs +84 -1
- package/dist/i18n/fr.cjs +84 -1
- package/dist/i18n/fr.mjs +84 -1
- package/dist/i18n/zh-CN.cjs +84 -1
- package/dist/i18n/zh-CN.mjs +84 -1
- package/dist/index.cjs +360 -103
- package/dist/index.d.ts +156 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +360 -103
- package/dist/styles.css +302 -44
- package/package.json +3 -3
package/dist/styles.css
CHANGED
|
@@ -23,6 +23,112 @@
|
|
|
23
23
|
--pptx-radius: 0.5rem;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/* ── Inspector baseline for bare form markup ─────────────────────────── */
|
|
27
|
+
.pptxv-inspector :where(input:not([type='checkbox']):not([type='radio']):not([type='color']):not([type='range']):not([type='file']):not([type='button']):not([type='submit']):not([type='reset']):not([type='hidden']), textarea) {
|
|
28
|
+
box-sizing: border-box;
|
|
29
|
+
min-width: 0;
|
|
30
|
+
height: 26px;
|
|
31
|
+
margin: 0;
|
|
32
|
+
padding: 2px 6px;
|
|
33
|
+
border: 1px solid var(--pptx-border);
|
|
34
|
+
border-radius: var(--pptx-radius);
|
|
35
|
+
background: var(--pptx-background);
|
|
36
|
+
color: var(--pptx-foreground);
|
|
37
|
+
font: inherit;
|
|
38
|
+
font-size: 12px;
|
|
39
|
+
}
|
|
40
|
+
.pptxv-inspector :where(textarea) {
|
|
41
|
+
display: block;
|
|
42
|
+
width: 100%;
|
|
43
|
+
height: auto;
|
|
44
|
+
min-height: 52px;
|
|
45
|
+
resize: vertical;
|
|
46
|
+
}
|
|
47
|
+
.pptxv-inspector :where(input, textarea)::placeholder { color: var(--pptx-muted-foreground); opacity: 1; }
|
|
48
|
+
.pptxv-inspector :where(input, textarea):disabled { opacity: 0.5; }
|
|
49
|
+
.pptxv-inspector :where(input[type='color']) {
|
|
50
|
+
box-sizing: border-box;
|
|
51
|
+
flex: none;
|
|
52
|
+
width: 28px;
|
|
53
|
+
height: 20px;
|
|
54
|
+
margin: 0;
|
|
55
|
+
padding: 0;
|
|
56
|
+
border: 1px solid var(--pptx-border);
|
|
57
|
+
border-radius: 4px;
|
|
58
|
+
background: none;
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
}
|
|
61
|
+
.pptxv-inspector :where(fieldset) {
|
|
62
|
+
min-width: 0;
|
|
63
|
+
margin: 0 0 8px;
|
|
64
|
+
padding: 0;
|
|
65
|
+
border: 0;
|
|
66
|
+
}
|
|
67
|
+
.pptxv-inspector :where(legend) {
|
|
68
|
+
margin-bottom: 4px;
|
|
69
|
+
padding: 0;
|
|
70
|
+
color: var(--pptx-foreground);
|
|
71
|
+
font-size: 11px;
|
|
72
|
+
font-weight: 600;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* One field per row: caption on the left, control on the right. A checkbox
|
|
76
|
+
or radio goes first and its caption follows it, as in PowerPoint's panes.
|
|
77
|
+
Only unclassed labels (and the chart helpers' field classes, which carry no
|
|
78
|
+
rule of their own) take part: a classed label such as `.pptxv-field` has its
|
|
79
|
+
own layout, and these flex declarations would otherwise leak into it. */
|
|
80
|
+
.pptxv-inspector-section :where(label:not([class]), .pptxv-exhaustive-field, .pptxv-chart-filters-range-field) {
|
|
81
|
+
display: flex;
|
|
82
|
+
flex-wrap: wrap;
|
|
83
|
+
align-items: center;
|
|
84
|
+
gap: 4px 8px;
|
|
85
|
+
min-width: 0;
|
|
86
|
+
margin-bottom: 6px;
|
|
87
|
+
color: var(--pptx-muted-foreground);
|
|
88
|
+
font-size: 11px;
|
|
89
|
+
}
|
|
90
|
+
/* A field toggled off with the hidden attribute must stay off: the flex
|
|
91
|
+
display above would otherwise override the user-agent display: none. */
|
|
92
|
+
.pptxv-inspector-section :where(label:not([class]), .pptxv-exhaustive-field, .pptxv-chart-filters-range-field)[hidden] { display: none; }
|
|
93
|
+
.pptxv-inspector-section :where(label:not([class]), .pptxv-exhaustive-field, .pptxv-chart-filters-range-field) > :where(input, textarea, select, pptx-ui-select) {
|
|
94
|
+
flex: 0 1 60%;
|
|
95
|
+
margin-left: auto;
|
|
96
|
+
}
|
|
97
|
+
.pptxv-inspector-section :where(label:not([class]), .pptxv-exhaustive-field, .pptxv-chart-filters-range-field) > :where(input[type='color']) {
|
|
98
|
+
flex: none;
|
|
99
|
+
margin-left: auto;
|
|
100
|
+
}
|
|
101
|
+
.pptxv-inspector-section :where(label:not([class]), .pptxv-exhaustive-field, .pptxv-chart-filters-range-field) > :where(pptx-ui-checkbox, pptx-ui-radio, input[type='checkbox'], input[type='radio']) {
|
|
102
|
+
flex: none;
|
|
103
|
+
order: -1;
|
|
104
|
+
}
|
|
105
|
+
.pptxv-inspector-section :where(label:not([class]), .pptxv-exhaustive-field, .pptxv-chart-filters-range-field) > :where(textarea) {
|
|
106
|
+
flex-basis: 100%;
|
|
107
|
+
margin-left: 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Chart sub-blocks: a gap and a rule between the groups instead of one run. */
|
|
111
|
+
.pptxv-inspector :where(.pptxv-chart-advanced, .pptxv-chart-exhaustive, .pptxv-chart-subtype, .pptxv-chart-filters, .pptxv-chart-usershapes) {
|
|
112
|
+
margin-top: 8px;
|
|
113
|
+
padding-top: 8px;
|
|
114
|
+
border-top: 1px solid var(--pptx-border);
|
|
115
|
+
}
|
|
116
|
+
.pptxv-inspector :where(.pptxv-chart-advanced, .pptxv-chart-exhaustive, .pptxv-chart-subtype, .pptxv-chart-filters, .pptxv-chart-usershapes)[hidden] { display: none; }
|
|
117
|
+
.pptxv-inspector :where(.pptxv-chart-advanced, .pptxv-chart-exhaustive, .pptxv-chart-filters, .pptxv-chart-usershapes) :where(button:not([class]), .pptxv-chart-clear-series-color) {
|
|
118
|
+
min-height: 24px;
|
|
119
|
+
padding: 2px 8px;
|
|
120
|
+
border: 1px solid var(--pptx-border);
|
|
121
|
+
border-radius: var(--pptx-radius);
|
|
122
|
+
background: var(--pptx-secondary);
|
|
123
|
+
color: var(--pptx-secondary-foreground);
|
|
124
|
+
font: inherit;
|
|
125
|
+
font-size: 11px;
|
|
126
|
+
cursor: pointer;
|
|
127
|
+
}
|
|
128
|
+
.pptxv-inspector :where(.pptxv-chart-clear-series-color) { margin-bottom: 6px; }
|
|
129
|
+
.pptxv-inspector :where(.pptxv-chart-clear-series-color)[hidden] { display: none; }
|
|
130
|
+
|
|
131
|
+
|
|
26
132
|
.pptxv {
|
|
27
133
|
position: relative;
|
|
28
134
|
display: flex;
|
|
@@ -1131,7 +1237,12 @@
|
|
|
1131
1237
|
.pptxv-smartart-layout-button:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
|
|
1132
1238
|
.pptxv-smartart-layout-button.is-active { border-color: var(--pptx-primary); background: color-mix(in srgb, var(--pptx-primary) 16%, transparent); color: var(--pptx-primary); }
|
|
1133
1239
|
.pptxv-smartart-nodes { display: flex; max-height: 208px; flex-direction: column; gap: 5px; overflow-y: auto; }
|
|
1134
|
-
|
|
1240
|
+
/* One row per node: index, text, fill, font colour, bold, italic; the
|
|
1241
|
+
hierarchy actions (inspector-extras-css.ts) wrap onto a second row under
|
|
1242
|
+
the text. With two columns the six controls used to scatter over four. */
|
|
1243
|
+
.pptxv-smartart-node { display: grid; grid-template-columns: 20px minmax(0, 1fr) repeat(4, auto); align-items: center; gap: 5px; }
|
|
1244
|
+
.pptxv-smartart-node > input[type='color'] { width: 22px; height: 22px; }
|
|
1245
|
+
.pptxv-smartart-node > button { min-width: 22px; height: 22px; padding: 0 4px; border: 1px solid var(--pptx-border); border-radius: var(--pptx-radius); background: transparent; color: var(--pptx-foreground); font: inherit; font-weight: 600; cursor: pointer; }
|
|
1135
1246
|
.pptxv-smartart-node-index { color: var(--pptx-muted-foreground); text-align: center; }
|
|
1136
1247
|
.pptxv-smartart-node-input { min-width: 0; height: 26px; box-sizing: border-box; padding: 2px 6px; border: 1px solid var(--pptx-border); border-radius: var(--pptx-radius); background: var(--pptx-background); color: var(--pptx-foreground); font: inherit; }
|
|
1137
1248
|
.pptxv-smartart-node-input:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
|
|
@@ -2870,8 +2981,6 @@
|
|
|
2870
2981
|
.pptxv-ole-edit-table input:focus { background: var(--pptx-accent); outline: none; }
|
|
2871
2982
|
.pptxv-ole-edit-paragraphs, .pptxv-ole-edit-deck { display: flex; flex-direction: column; gap: 8px; }
|
|
2872
2983
|
.pptxv-ole-edit-paragraphs textarea { padding: 6px 8px; border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-muted); color: inherit; resize: vertical; }
|
|
2873
|
-
.pptxv-ole-edit-deck-row { display: flex; flex-direction: column; gap: 4px; color: var(--pptx-muted-foreground); }
|
|
2874
|
-
.pptxv-ole-edit-deck-row input { padding: 6px 8px; border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-muted); color: var(--pptx-foreground); }
|
|
2875
2984
|
/* Touch target: matches MIN_TOUCH_TARGET_PX (44) from pptx-viewer-shared's
|
|
2876
2985
|
render/responsive module, below MOBILE_BREAKPOINT (768). The workspace
|
|
2877
2986
|
Comments pane's "Add Comment" button (comments-panel.ts) carries no class
|
|
@@ -2883,17 +2992,6 @@
|
|
|
2883
2992
|
}
|
|
2884
2993
|
|
|
2885
2994
|
|
|
2886
|
-
/* ── Dialog shell override: the Options dialog is wider than parity dialogs ── */
|
|
2887
|
-
.pptxv-options-dialog { width: min(56rem, calc(100vw - 32px)); height: min(620px, 88vh); }
|
|
2888
|
-
.pptxv-options-dialog .pptxv-parity-body { flex: 1; min-height: 0; padding: 0; gap: 0; }
|
|
2889
|
-
.pptxv-options-body { display: flex; flex: 1; min-height: 0; }
|
|
2890
|
-
.pptxv-options-nav { display: flex; flex-direction: column; gap: 2px; flex: none; width: 172px; overflow-y: auto; padding: 8px; border-right: 1px solid var(--pptx-border); }
|
|
2891
|
-
.pptxv-options-nav button { padding: 8px 10px; border: 0; border-radius: 4px; background: transparent; color: var(--pptx-foreground); font: inherit; font-size: 12px; text-align: left; cursor: pointer; white-space: nowrap; }
|
|
2892
|
-
.pptxv-options-nav button:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
|
|
2893
|
-
.pptxv-options-nav button.is-active { background: color-mix(in srgb, var(--pptx-primary) 14%, transparent); color: var(--pptx-primary); font-weight: 600; }
|
|
2894
|
-
.pptxv-options-pane { flex: 1; min-width: 0; overflow-y: auto; padding: 14px 18px; font-size: 12px; }
|
|
2895
|
-
.pptxv-options-headline { margin: 0 0 12px; font-size: 12px; font-weight: 600; }
|
|
2896
|
-
|
|
2897
2995
|
/* ── Sections + control rows ── */
|
|
2898
2996
|
.pptxv-options-section { margin: 0 0 16px; }
|
|
2899
2997
|
.pptxv-options-section > h3 { margin: 0 0 4px; padding-bottom: 3px; border-bottom: 1px solid var(--pptx-border); color: var(--pptx-muted-foreground); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }
|
|
@@ -2908,17 +3006,6 @@
|
|
|
2908
3006
|
gap: 2px;
|
|
2909
3007
|
font-size: 12px;
|
|
2910
3008
|
}
|
|
2911
|
-
.pptxv-options-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 28px; padding: 2px 0; }
|
|
2912
|
-
.pptxv-options-row.is-indent { padding-left: 22px; }
|
|
2913
|
-
label.pptxv-options-row { cursor: pointer; }
|
|
2914
|
-
.pptxv-options-row-label { display: inline-flex; align-items: center; gap: 5px; min-width: 0; }
|
|
2915
|
-
.pptxv-options-info { display: inline-grid; place-items: center; width: 13px; height: 13px; flex: none; border: 1px solid currentcolor; border-radius: 50%; color: var(--pptx-primary); font-size: 9px; font-style: normal; cursor: help; opacity: .75; }
|
|
2916
|
-
.pptxv-options-row select, .pptxv-options-row input[type='text'], .pptxv-options-row input[type='number'] { max-width: 55%; padding: 5px 7px; border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-muted); color: inherit; font: inherit; font-size: 12px; }
|
|
2917
|
-
.pptxv-options-row input[type='number'] { width: 72px; text-align: right; }
|
|
2918
|
-
.pptxv-options-row input[type='text'] { width: 180px; }
|
|
2919
|
-
.pptxv-options-row pptx-ui-checkbox { flex: none; }
|
|
2920
|
-
.pptxv-options-unit { color: var(--pptx-muted-foreground); font-size: 11px; }
|
|
2921
|
-
.pptxv-options-number { display: inline-flex; align-items: center; gap: 6px; }
|
|
2922
3009
|
.pptxv-options-action { padding: 6px 11px; border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-muted); color: inherit; font: inherit; font-size: 12px; cursor: pointer; }
|
|
2923
3010
|
.pptxv-options-action:hover:not(:disabled) { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
|
|
2924
3011
|
.pptxv-options-action:disabled { opacity: .45; cursor: default; }
|
|
@@ -2967,23 +3054,6 @@ label.pptxv-options-row { cursor: pointer; }
|
|
|
2967
3054
|
opacity/pointer-events on mousemove; !important here is required to win
|
|
2968
3055
|
over that inline style regardless of the JS auto-show timer. */
|
|
2969
3056
|
.pptxv.pptxv-no-show-popup .pptxv-present-toolbar-wrap { opacity: 0 !important; pointer-events: none !important; }
|
|
2970
|
-
@media (max-width: 767px) {
|
|
2971
|
-
.pptxv-options-body { flex-direction: column; }
|
|
2972
|
-
.pptxv-options-nav { flex-direction: row; width: 100%; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--pptx-border); }
|
|
2973
|
-
/* Matches isDensePanelCompact()/MOBILE_BREAKPOINT (768) in
|
|
2974
|
-
pptx-viewer-shared: getDensePanelTouchTargetPx(width) returns
|
|
2975
|
-
MIN_TOUCH_TARGET_PX (44). Every schema-driven control row (toggle /
|
|
2976
|
-
select / number / text, across every tab) gets a touch-sized hit area:
|
|
2977
|
-
the row itself (a <label> for a toggle, so enlarging it is enough there)
|
|
2978
|
-
and each select/text/number control. */
|
|
2979
|
-
.pptxv-options-row { min-height: 44px; }
|
|
2980
|
-
.pptxv-options-row select, .pptxv-options-row input[type='text'], .pptxv-options-row input[type='number'] { min-height: 44px; }
|
|
2981
|
-
/* The category rail's own tab buttons are discrete one-per-row controls
|
|
2982
|
-
too, so they get the same touch target as everything else in this
|
|
2983
|
-
dialog below the breakpoint - CLAUDE.md Rule 1 (React's SettingsDialog
|
|
2984
|
-
navBtnStyle already covers its own nav for the same reason). */
|
|
2985
|
-
.pptxv-options-nav button { min-height: 44px; }
|
|
2986
|
-
}
|
|
2987
3057
|
|
|
2988
3058
|
|
|
2989
3059
|
.pptxv-motion-path-row { display: grid; gap: 2px; font-size: 11px; }
|
|
@@ -3257,7 +3327,7 @@ svg[data-pptx-motion-path-overlay] [data-pptx-motion-path-handle] { pointer-even
|
|
|
3257
3327
|
.pptxv-text3d-color { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
|
3258
3328
|
|
|
3259
3329
|
/* ── Chart data grid ─────────────────────────────────────────────────── */
|
|
3260
|
-
.pptxv-chart-grid { display: grid; gap: 4px; margin: 6px 0; }
|
|
3330
|
+
.pptxv-chart-grid { display: grid; gap: 4px; margin: 6px 0; max-width: 100%; overflow-x: auto; }
|
|
3261
3331
|
.pptxv-chart-grid[hidden] { display: none; }
|
|
3262
3332
|
.pptxv-chart-grid-toolbar { display: flex; justify-content: flex-end; gap: 4px; }
|
|
3263
3333
|
.pptxv-chart-grid-btn {
|
|
@@ -3695,6 +3765,184 @@ svg[data-pptx-motion-path-overlay] [data-pptx-motion-path-handle] { pointer-even
|
|
|
3695
3765
|
.pptxv-theme-swatch-grid-swatch.is-selected { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
|
|
3696
3766
|
|
|
3697
3767
|
|
|
3768
|
+
/* ── Media ───────────────────────────────────────────────────────────── */
|
|
3769
|
+
.pptxv-media-preview {
|
|
3770
|
+
display: block;
|
|
3771
|
+
width: 100%;
|
|
3772
|
+
max-height: 160px;
|
|
3773
|
+
margin-bottom: 8px;
|
|
3774
|
+
border: 1px solid var(--pptx-border);
|
|
3775
|
+
border-radius: var(--pptx-radius);
|
|
3776
|
+
background: #000;
|
|
3777
|
+
}
|
|
3778
|
+
.pptxv-media-preview[hidden] { display: none; }
|
|
3779
|
+
.pptxv-media-poster {
|
|
3780
|
+
display: block;
|
|
3781
|
+
max-width: 100%;
|
|
3782
|
+
max-height: 96px;
|
|
3783
|
+
margin-bottom: 8px;
|
|
3784
|
+
border-radius: var(--pptx-radius);
|
|
3785
|
+
object-fit: contain;
|
|
3786
|
+
}
|
|
3787
|
+
.pptxv-media-poster[hidden],
|
|
3788
|
+
.pptxv-media-poster:not([src]) { display: none; }
|
|
3789
|
+
.pptxv-media-reset-trim {
|
|
3790
|
+
align-self: flex-start;
|
|
3791
|
+
margin: 2px 0 8px;
|
|
3792
|
+
padding: 2px 8px;
|
|
3793
|
+
border: 1px solid var(--pptx-border);
|
|
3794
|
+
border-radius: var(--pptx-radius);
|
|
3795
|
+
background: var(--pptx-secondary);
|
|
3796
|
+
color: var(--pptx-secondary-foreground);
|
|
3797
|
+
font: inherit;
|
|
3798
|
+
font-size: 11px;
|
|
3799
|
+
cursor: pointer;
|
|
3800
|
+
}
|
|
3801
|
+
.pptxv-media-reset-trim:disabled { opacity: 0.5; cursor: default; }
|
|
3802
|
+
.pptxv-media-metadata {
|
|
3803
|
+
display: block;
|
|
3804
|
+
margin-top: 6px;
|
|
3805
|
+
color: var(--pptx-muted-foreground);
|
|
3806
|
+
font-size: 10px;
|
|
3807
|
+
font-variant-numeric: tabular-nums;
|
|
3808
|
+
white-space: pre-line;
|
|
3809
|
+
}
|
|
3810
|
+
|
|
3811
|
+
/* ── Animation rows ──────────────────────────────────────────────────── */
|
|
3812
|
+
.pptxv-effect-sound-row,
|
|
3813
|
+
.pptxv-after-animation-row {
|
|
3814
|
+
display: flex;
|
|
3815
|
+
flex-direction: column;
|
|
3816
|
+
gap: 4px;
|
|
3817
|
+
margin-bottom: 8px;
|
|
3818
|
+
color: var(--pptx-muted-foreground);
|
|
3819
|
+
font-size: 11px;
|
|
3820
|
+
}
|
|
3821
|
+
.pptxv-effect-sound-controls {
|
|
3822
|
+
display: flex;
|
|
3823
|
+
align-items: center;
|
|
3824
|
+
gap: 6px;
|
|
3825
|
+
min-width: 0;
|
|
3826
|
+
}
|
|
3827
|
+
.pptxv-effect-sound-controls > :first-child { flex: 1; min-width: 0; }
|
|
3828
|
+
.pptxv-effect-sound-preview {
|
|
3829
|
+
flex: none;
|
|
3830
|
+
width: 26px;
|
|
3831
|
+
height: 26px;
|
|
3832
|
+
padding: 0;
|
|
3833
|
+
border: 1px solid var(--pptx-border);
|
|
3834
|
+
border-radius: var(--pptx-radius);
|
|
3835
|
+
background: var(--pptx-secondary);
|
|
3836
|
+
color: var(--pptx-secondary-foreground);
|
|
3837
|
+
font-size: 10px;
|
|
3838
|
+
cursor: pointer;
|
|
3839
|
+
}
|
|
3840
|
+
.pptxv-effect-sound-preview:disabled { opacity: 0.5; cursor: default; }
|
|
3841
|
+
/* The picker opens from the "Other sound..." option; the input itself stays out of sight. */
|
|
3842
|
+
.pptxv-effect-sound-file-input {
|
|
3843
|
+
position: absolute;
|
|
3844
|
+
width: 1px;
|
|
3845
|
+
height: 1px;
|
|
3846
|
+
overflow: hidden;
|
|
3847
|
+
clip-path: inset(50%);
|
|
3848
|
+
white-space: nowrap;
|
|
3849
|
+
}
|
|
3850
|
+
.pptxv-after-animation-row > label,
|
|
3851
|
+
.pptxv-after-animation-color {
|
|
3852
|
+
display: flex;
|
|
3853
|
+
align-items: center;
|
|
3854
|
+
justify-content: space-between;
|
|
3855
|
+
gap: 8px;
|
|
3856
|
+
}
|
|
3857
|
+
.pptxv-after-animation-row > label > :last-child { flex: 0 1 60%; min-width: 0; }
|
|
3858
|
+
.pptxv-after-animation-color[hidden] { display: none; }
|
|
3859
|
+
|
|
3860
|
+
/* ── Slide size: rescale prompt ──────────────────────────────────────── */
|
|
3861
|
+
.pptxv-slide-size-rescale {
|
|
3862
|
+
display: grid;
|
|
3863
|
+
gap: 6px;
|
|
3864
|
+
margin-top: 8px;
|
|
3865
|
+
padding: 8px;
|
|
3866
|
+
border: 1px solid var(--pptx-primary);
|
|
3867
|
+
border-radius: 6px;
|
|
3868
|
+
background: color-mix(in srgb, var(--pptx-primary) 8%, transparent);
|
|
3869
|
+
}
|
|
3870
|
+
.pptxv-slide-size-rescale[hidden] { display: none; }
|
|
3871
|
+
.pptxv-slide-size-rescale-title { color: var(--pptx-foreground); font-size: 12px; font-weight: 600; }
|
|
3872
|
+
.pptxv-slide-size-rescale-description { margin: 0; color: var(--pptx-muted-foreground); font-size: 11px; line-height: 1.4; }
|
|
3873
|
+
.pptxv-slide-size-rescale-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(96px, 1fr)); gap: 6px; }
|
|
3874
|
+
.pptxv-slide-size-rescale-btn {
|
|
3875
|
+
min-height: 28px;
|
|
3876
|
+
padding: 4px 8px;
|
|
3877
|
+
border: 1px solid var(--pptx-border);
|
|
3878
|
+
border-radius: var(--pptx-radius);
|
|
3879
|
+
background: var(--pptx-background);
|
|
3880
|
+
color: var(--pptx-foreground);
|
|
3881
|
+
font: inherit;
|
|
3882
|
+
font-size: 11px;
|
|
3883
|
+
cursor: pointer;
|
|
3884
|
+
}
|
|
3885
|
+
.pptxv-slide-size-rescale-btn:hover { border-color: var(--pptx-primary); background: var(--pptx-accent); }
|
|
3886
|
+
|
|
3887
|
+
/* ── Fill: pattern panel, alt text, tags ─────────────────────────────── */
|
|
3888
|
+
.pptxv-inspector-pattern {
|
|
3889
|
+
display: grid;
|
|
3890
|
+
gap: 6px;
|
|
3891
|
+
margin: 4px 0 8px;
|
|
3892
|
+
padding-left: 4px;
|
|
3893
|
+
border-left: 2px solid var(--pptx-border);
|
|
3894
|
+
}
|
|
3895
|
+
.pptxv-inspector-pattern[hidden],
|
|
3896
|
+
.pptxv-inspector-pattern:empty { display: none; }
|
|
3897
|
+
.pptxv-accessibility-alt {
|
|
3898
|
+
display: flex;
|
|
3899
|
+
flex-direction: column;
|
|
3900
|
+
align-items: stretch;
|
|
3901
|
+
gap: 4px;
|
|
3902
|
+
margin-bottom: 8px;
|
|
3903
|
+
}
|
|
3904
|
+
.pptxv-accessibility-alt-input { width: 100%; }
|
|
3905
|
+
.pptxv-accessibility-title-input { flex: 1 1 auto; min-width: 0; }
|
|
3906
|
+
.pptxv-tags-toggle-label {
|
|
3907
|
+
color: var(--pptx-foreground);
|
|
3908
|
+
font-size: 11px;
|
|
3909
|
+
font-weight: 600;
|
|
3910
|
+
}
|
|
3911
|
+
|
|
3912
|
+
/* ── SmartArt text pane: per-node hierarchy actions ──────────────────── */
|
|
3913
|
+
.pptxv-smartart-hierarchy {
|
|
3914
|
+
display: flex;
|
|
3915
|
+
flex-wrap: wrap;
|
|
3916
|
+
grid-column: 2 / -1;
|
|
3917
|
+
gap: 4px;
|
|
3918
|
+
margin-top: 2px;
|
|
3919
|
+
}
|
|
3920
|
+
.pptxv-smartart-hierarchy button {
|
|
3921
|
+
padding: 1px 6px;
|
|
3922
|
+
border: 1px solid var(--pptx-border);
|
|
3923
|
+
border-radius: var(--pptx-radius);
|
|
3924
|
+
background: transparent;
|
|
3925
|
+
color: var(--pptx-muted-foreground);
|
|
3926
|
+
font: inherit;
|
|
3927
|
+
font-size: 10px;
|
|
3928
|
+
cursor: pointer;
|
|
3929
|
+
}
|
|
3930
|
+
.pptxv-smartart-hierarchy button:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
|
|
3931
|
+
|
|
3932
|
+
/* ── OLE editor dialog: nested deck tab ──────────────────────────────── */
|
|
3933
|
+
.pptxv-ole-edit-content { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
|
|
3934
|
+
.pptxv-ole-edit-deck-slide { display: flex; flex-direction: column; gap: 4px; color: var(--pptx-muted-foreground); }
|
|
3935
|
+
.pptxv-ole-edit-deck-caption { font-size: 11px; font-weight: 600; }
|
|
3936
|
+
.pptxv-ole-edit-deck-slide input {
|
|
3937
|
+
padding: 6px 8px;
|
|
3938
|
+
border: 1px solid var(--pptx-border);
|
|
3939
|
+
border-radius: 4px;
|
|
3940
|
+
background: var(--pptx-muted);
|
|
3941
|
+
color: var(--pptx-foreground);
|
|
3942
|
+
font: inherit;
|
|
3943
|
+
}
|
|
3944
|
+
|
|
3945
|
+
|
|
3698
3946
|
.pptxv-account { display: flex; flex-direction: column; gap: 28px; max-width: 640px; margin-top: 24px; }
|
|
3699
3947
|
.pptxv-account-section { padding: 20px; border: 1px solid var(--pptx-border); border-radius: 8px; background: var(--pptx-card); color: var(--pptx-card-foreground); }
|
|
3700
3948
|
.pptxv-account-section h2 { margin: 0 0 14px; font-size: 14px; }
|
|
@@ -4554,6 +4802,15 @@ svg[data-pptx-motion-path-overlay] [data-pptx-motion-path-handle] { pointer-even
|
|
|
4554
4802
|
.pptxv-run-program-notice-dismiss svg { width: 12px; height: 12px; margin: 0; }
|
|
4555
4803
|
|
|
4556
4804
|
|
|
4805
|
+
.pptxv-region { display: block; box-sizing: border-box; width: 100%; height: 100%; min-width: 0; min-height: 0; overflow: auto; }
|
|
4806
|
+
.pptxv-region-replaced > :not(.pptxv-region) { display: none !important; }
|
|
4807
|
+
.pptxv-notes.pptxv-region-replaced[data-collapsed='true'] { display: none; }
|
|
4808
|
+
.pptxv-statusbar.pptxv-region { height: auto; flex: none; }
|
|
4809
|
+
.pptxv-modal-panel > .pptxv-region,
|
|
4810
|
+
.pptxv-parity-dialog > .pptxv-region { height: auto; flex: 1 1 auto; }
|
|
4811
|
+
.pptxv-backstage main > .pptxv-region { height: auto; flex: 1 1 auto; }
|
|
4812
|
+
|
|
4813
|
+
|
|
4557
4814
|
[data-pptx-editor-chrome] [data-pptx-chrome][hidden] { display: none !important; }
|
|
4558
4815
|
@media (min-width: 768px) {
|
|
4559
4816
|
[data-pptx-editor-chrome] [data-pptx-title-bar] {
|
|
@@ -4658,8 +4915,9 @@ svg[data-pptx-motion-path-overlay] [data-pptx-motion-path-handle] { pointer-even
|
|
|
4658
4915
|
padding: 0; gap: 0; border: 0; scrollbar-width: none;
|
|
4659
4916
|
}
|
|
4660
4917
|
[data-pptx-editor-chrome] [data-pptx-chrome="ribbon-tabs"]:has([data-pptx-chrome="ribbon-tab-scroll"]) { overflow: visible; }
|
|
4918
|
+
/* Tabs keep their labels whole; a narrow editor scrolls the strip, as Office does. */
|
|
4661
4919
|
[data-pptx-editor-chrome] [data-pptx-chrome="ribbon-tabs"] [role="tab"] {
|
|
4662
|
-
position: relative; height: 34px; padding: 8px 14px;
|
|
4920
|
+
position: relative; flex: none; height: 34px; padding: 8px 14px;
|
|
4663
4921
|
border: 0; border-radius: 0; font-size: 12px; line-height: 18px;
|
|
4664
4922
|
font-weight: 500; white-space: nowrap; background: transparent;
|
|
4665
4923
|
color: var(--pptx-muted-foreground);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pptx-vanilla-viewer",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.38.0",
|
|
4
4
|
"description": "pptx-viewer for vanilla JS: a zero-framework PowerPoint viewer and editor to render, edit, present, and export PPTX slides with plain DOM, no React/Vue/Angular required.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"javascript",
|
|
@@ -107,8 +107,8 @@
|
|
|
107
107
|
"jspdf": "^4.2.1",
|
|
108
108
|
"jszip": "^3.10.2",
|
|
109
109
|
"lucide": "^1.54.0",
|
|
110
|
-
"ooxml-core": "^1.
|
|
111
|
-
"ooxml-ui": "^1.
|
|
110
|
+
"ooxml-core": "^1.14.0",
|
|
111
|
+
"ooxml-ui": "^1.14.0",
|
|
112
112
|
"opentype.js": "^2.0.0"
|
|
113
113
|
},
|
|
114
114
|
"devDependencies": {
|