@meoslabs/save-in-meos 0.0.1

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.
@@ -0,0 +1,156 @@
1
+ /**
2
+ * WHY: Embeddable save-in-meos widget — builds MDP import URLs on user gesture.
3
+ * WHAT: initSaveButton mounts a branded chip (shadow DOM or fixed classes) + navigates.
4
+ * WHERE: Bundled as dist/widget.iife.js for script-tag consumers.
5
+ * GUARDED: No label/style overrides — branding enforced by implementation + checker.
6
+ */
7
+ import { buildImportIntentV1, buildMeosLink, } from "../import-intent-v1.js";
8
+ import { applyChipPresentation, resolveChipLabel, } from "./chip-theme.js";
9
+ import { buildSaveIconSvg } from "./icon.js";
10
+ import { MEOS_SAVE_DOCUMENT_CSS, MEOS_SAVE_SHADOW_CSS } from "./styles.js";
11
+ export { SAVE_CHIP_HOST_VARS, SAVE_CHIP_PRESETS, resolveChipLabel, } from "./chip-theme.js";
12
+ export const MEOS_SAVE_LABEL = "save in meos";
13
+ /** Visible label when `chipPreset: "compact"` — aria-label stays MEOS_SAVE_LABEL. */
14
+ export const MEOS_SAVE_COMPACT_LABEL = "save";
15
+ export const MEOS_SAVE_CHIP_CLASS = "meos-save-chip";
16
+ export const MEOS_SAVE_ICON_CLASS = "meos-save-chip__icon";
17
+ export const MEOS_SAVE_LABEL_CLASS = "meos-save-chip__label";
18
+ const STYLE_TAG_ID = "meos-save-widget-styles";
19
+ const SHADOW_HOST_ATTR = "data-meos-save-host";
20
+ const WIRE_CLICK_ABORT = Symbol("meos-wire-click-abort");
21
+ let stylesInjected = false;
22
+ /**
23
+ * Build inner HTML for the branded chip (icon + label).
24
+ * Pass `chipPreset: "compact"` for the short **save** label.
25
+ */
26
+ export function buildSaveChipMarkup(preset) {
27
+ const label = resolveChipLabel(preset);
28
+ return `${buildSaveIconSvg(MEOS_SAVE_ICON_CLASS)}<span class="${MEOS_SAVE_LABEL_CLASS}">${label}</span>`;
29
+ }
30
+ /** Inject widget styles once at document level (npm hosts that import widget.css may skip). */
31
+ export function ensureWidgetStyles() {
32
+ if (stylesInjected || typeof document === "undefined")
33
+ return;
34
+ if (document.getElementById(STYLE_TAG_ID)) {
35
+ stylesInjected = true;
36
+ return;
37
+ }
38
+ const style = document.createElement("style");
39
+ style.id = STYLE_TAG_ID;
40
+ style.setAttribute("data-meos-save", "");
41
+ style.textContent = MEOS_SAVE_DOCUMENT_CSS;
42
+ document.head.appendChild(style);
43
+ stylesInjected = true;
44
+ }
45
+ function isEmptyMount(el) {
46
+ return el.childNodes.length === 0 && !el.textContent?.trim();
47
+ }
48
+ function applyBrandedChip(button, preset) {
49
+ button.type = "button";
50
+ button.className = MEOS_SAVE_CHIP_CLASS;
51
+ button.setAttribute("data-meos-save", "");
52
+ button.setAttribute("aria-label", MEOS_SAVE_LABEL);
53
+ if (preset === "compact") {
54
+ button.setAttribute("data-meos-chip-preset", "compact");
55
+ }
56
+ button.innerHTML = buildSaveChipMarkup(preset);
57
+ }
58
+ function shadowHostButton(host) {
59
+ const button = host.shadowRoot?.querySelector("button");
60
+ return button instanceof HTMLButtonElement ? button : null;
61
+ }
62
+ function mountInShadowHost(host, options) {
63
+ applyChipPresentation(host, options.theme ?? "auto", options.chip, options.chipPreset);
64
+ host.setAttribute(SHADOW_HOST_ATTR, "");
65
+ const existing = shadowHostButton(host);
66
+ if (existing) {
67
+ applyBrandedChip(existing, options.chipPreset);
68
+ wireClick(existing, options, true);
69
+ return existing;
70
+ }
71
+ const shadow = host.attachShadow({ mode: "closed" });
72
+ const style = document.createElement("style");
73
+ style.textContent = MEOS_SAVE_SHADOW_CSS;
74
+ shadow.appendChild(style);
75
+ const button = document.createElement("button");
76
+ applyBrandedChip(button, options.chipPreset);
77
+ shadow.appendChild(button);
78
+ wireClick(button, options);
79
+ return button;
80
+ }
81
+ function wireClick(button, options, replace = false) {
82
+ const host = button;
83
+ if (replace && host[WIRE_CLICK_ABORT]) {
84
+ host[WIRE_CLICK_ABORT].abort();
85
+ }
86
+ const ac = new AbortController();
87
+ host[WIRE_CLICK_ABORT] = ac;
88
+ let capturedSelection;
89
+ button.addEventListener("pointerdown", () => {
90
+ capturedSelection = getSelectionText();
91
+ }, { signal: ac.signal });
92
+ button.addEventListener("click", (event) => {
93
+ event.preventDefault();
94
+ try {
95
+ const pageUrl = typeof location !== "undefined"
96
+ ? location.href
97
+ : (options.u ?? "");
98
+ const intent = buildImportIntentV1({
99
+ u: pageUrl,
100
+ t: options.t ?? capturedSelection ?? getSelectionText(),
101
+ images: options.images,
102
+ blocks: options.blocks,
103
+ });
104
+ const href = buildMeosLink(intent, options.widgetId);
105
+ if (typeof location !== "undefined") {
106
+ location.href = href;
107
+ }
108
+ }
109
+ catch (err) {
110
+ console.error("[save-in-meos] failed to build import link", err);
111
+ }
112
+ }, { signal: ac.signal });
113
+ }
114
+ /**
115
+ * Wire a mount point (or existing button) to build and navigate to a meos import deeplink.
116
+ *
117
+ * - Empty container → closed shadow root with branded chip (integrators cannot restyle).
118
+ * - Existing button/anchor → branded markup + document-level styles (classes are fixed).
119
+ */
120
+ export function initSaveButton(target, options = {
121
+ u: typeof location !== "undefined" ? location.href : "",
122
+ }) {
123
+ const el = typeof target === "string"
124
+ ? document.querySelector(target)
125
+ : target;
126
+ if (!el)
127
+ return null;
128
+ if (isEmptyMount(el) || el.hasAttribute(SHADOW_HOST_ATTR)) {
129
+ return mountInShadowHost(el, options);
130
+ }
131
+ ensureWidgetStyles();
132
+ let button;
133
+ if (el instanceof HTMLButtonElement) {
134
+ button = el;
135
+ }
136
+ else if (el instanceof HTMLAnchorElement) {
137
+ button = document.createElement("button");
138
+ button.type = "button";
139
+ el.replaceWith(button);
140
+ }
141
+ else {
142
+ button = document.createElement("button");
143
+ el.appendChild(button);
144
+ }
145
+ applyBrandedChip(button, options.chipPreset);
146
+ applyChipPresentation(button, options.theme ?? "auto", options.chip, options.chipPreset);
147
+ wireClick(button, options, true);
148
+ return button;
149
+ }
150
+ function getSelectionText() {
151
+ if (typeof window === "undefined" || !window.getSelection)
152
+ return undefined;
153
+ const text = window.getSelection()?.toString().trim();
154
+ return text && text.length > 0 ? text : undefined;
155
+ }
156
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widget/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * WHY: initSaveButton injects styles without a separate network fetch (IIFE + npm).
3
+ * WHAT: Runtime chip CSS — theme tokens + bounded size vars; mirrors widget.css.
4
+ * WHERE: Injected into document head or shadow root on first initSaveButton call.
5
+ * GUARDED: check-widget-branding compares required tokens with widget.css.
6
+ */
7
+ /** Injected into closed shadow roots (:host theme selectors). */
8
+ export declare const MEOS_SAVE_SHADOW_CSS = "\n:host {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n color-scheme: light;\n}\n\n:host([data-meos-theme=\"light\"]) {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n color-scheme: light;\n}\n\n:host([data-meos-theme=\"dark\"]) {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n :host([data-meos-theme=\"auto\"]) {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n color-scheme: dark;\n }\n}\n\n\n.meos-save-chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--meos-save-chip-gap, 0.3125rem);\n min-height: calc(var(--meos-save-chip-height, 31px) - 1px);\n max-height: calc(var(--meos-save-chip-height, 31px) + 1px);\n height: var(--meos-save-chip-height, 31px);\n padding: 0 var(--meos-save-chip-padding-x, 0.625rem);\n margin: 0;\n font-family: var(--meos-font, \"Inconsolata\", ui-monospace, monospace);\n font-size: 11px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.02em;\n text-transform: lowercase;\n color: var(--meos-save-fg, #000000);\n background: transparent;\n border: 1px solid var(--meos-save-border, rgba(0, 0, 0, 0.24));\n border-radius: var(--meos-save-chip-radius, var(--meos-radius, 2px));\n cursor: pointer;\n box-sizing: border-box;\n -webkit-tap-highlight-color: transparent;\n pointer-events: auto;\n user-select: none;\n transition:\n background 0.12s ease,\n border-color 0.12s ease,\n opacity 0.12s ease,\n transform 0.08s ease;\n appearance: none;\n vertical-align: middle;\n}\n\n.meos-save-chip:hover {\n background: var(--meos-save-hover-bg, rgba(0, 0, 0, 0.06));\n border-color: var(--meos-save-hover-border, rgba(0, 0, 0, 0.42));\n}\n\n.meos-save-chip:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.meos-save-chip:active {\n opacity: 0.9;\n transform: scale(0.98);\n}\n\n.meos-save-chip__icon {\n width: calc(var(--meos-save-icon-size, 16px) * 27.275015 / 30.362297);\n height: var(--meos-save-icon-size, 16px);\n flex-shrink: 0;\n display: block;\n pointer-events: none;\n shape-rendering: geometricPrecision;\n overflow: visible;\n}\n\n.meos-save-chip__label {\n white-space: nowrap;\n pointer-events: none;\n}\n\n";
9
+ /** Document-level chip (npm hosts importing widget.css). */
10
+ export declare const MEOS_SAVE_DOCUMENT_CSS = "\n.meos-save-chip,\n.meos-save-chip[data-meos-theme=\"auto\"] {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n}\n\n.meos-save-chip[data-meos-theme=\"light\"] {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n}\n\n.meos-save-chip[data-meos-theme=\"dark\"] {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n}\n\n@media (prefers-color-scheme: dark) {\n .meos-save-chip[data-meos-theme=\"auto\"] {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n }\n}\n\n\n.meos-save-chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--meos-save-chip-gap, 0.3125rem);\n min-height: calc(var(--meos-save-chip-height, 31px) - 1px);\n max-height: calc(var(--meos-save-chip-height, 31px) + 1px);\n height: var(--meos-save-chip-height, 31px);\n padding: 0 var(--meos-save-chip-padding-x, 0.625rem);\n margin: 0;\n font-family: var(--meos-font, \"Inconsolata\", ui-monospace, monospace);\n font-size: 11px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.02em;\n text-transform: lowercase;\n color: var(--meos-save-fg, #000000);\n background: transparent;\n border: 1px solid var(--meos-save-border, rgba(0, 0, 0, 0.24));\n border-radius: var(--meos-save-chip-radius, var(--meos-radius, 2px));\n cursor: pointer;\n box-sizing: border-box;\n -webkit-tap-highlight-color: transparent;\n pointer-events: auto;\n user-select: none;\n transition:\n background 0.12s ease,\n border-color 0.12s ease,\n opacity 0.12s ease,\n transform 0.08s ease;\n appearance: none;\n vertical-align: middle;\n}\n\n.meos-save-chip:hover {\n background: var(--meos-save-hover-bg, rgba(0, 0, 0, 0.06));\n border-color: var(--meos-save-hover-border, rgba(0, 0, 0, 0.42));\n}\n\n.meos-save-chip:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.meos-save-chip:active {\n opacity: 0.9;\n transform: scale(0.98);\n}\n\n.meos-save-chip__icon {\n width: calc(var(--meos-save-icon-size, 16px) * 27.275015 / 30.362297);\n height: var(--meos-save-icon-size, 16px);\n flex-shrink: 0;\n display: block;\n pointer-events: none;\n shape-rendering: geometricPrecision;\n overflow: visible;\n}\n\n.meos-save-chip__label {\n white-space: nowrap;\n pointer-events: none;\n}\n\n";
11
+ /** Full injection bundle for initSaveButton (shadow + document fallback). */
12
+ export declare const MEOS_SAVE_WIDGET_CSS = "\n:host {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n color-scheme: light;\n}\n\n:host([data-meos-theme=\"light\"]) {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n color-scheme: light;\n}\n\n:host([data-meos-theme=\"dark\"]) {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n :host([data-meos-theme=\"auto\"]) {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n color-scheme: dark;\n }\n}\n\n\n.meos-save-chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--meos-save-chip-gap, 0.3125rem);\n min-height: calc(var(--meos-save-chip-height, 31px) - 1px);\n max-height: calc(var(--meos-save-chip-height, 31px) + 1px);\n height: var(--meos-save-chip-height, 31px);\n padding: 0 var(--meos-save-chip-padding-x, 0.625rem);\n margin: 0;\n font-family: var(--meos-font, \"Inconsolata\", ui-monospace, monospace);\n font-size: 11px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.02em;\n text-transform: lowercase;\n color: var(--meos-save-fg, #000000);\n background: transparent;\n border: 1px solid var(--meos-save-border, rgba(0, 0, 0, 0.24));\n border-radius: var(--meos-save-chip-radius, var(--meos-radius, 2px));\n cursor: pointer;\n box-sizing: border-box;\n -webkit-tap-highlight-color: transparent;\n pointer-events: auto;\n user-select: none;\n transition:\n background 0.12s ease,\n border-color 0.12s ease,\n opacity 0.12s ease,\n transform 0.08s ease;\n appearance: none;\n vertical-align: middle;\n}\n\n.meos-save-chip:hover {\n background: var(--meos-save-hover-bg, rgba(0, 0, 0, 0.06));\n border-color: var(--meos-save-hover-border, rgba(0, 0, 0, 0.42));\n}\n\n.meos-save-chip:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.meos-save-chip:active {\n opacity: 0.9;\n transform: scale(0.98);\n}\n\n.meos-save-chip__icon {\n width: calc(var(--meos-save-icon-size, 16px) * 27.275015 / 30.362297);\n height: var(--meos-save-icon-size, 16px);\n flex-shrink: 0;\n display: block;\n pointer-events: none;\n shape-rendering: geometricPrecision;\n overflow: visible;\n}\n\n.meos-save-chip__label {\n white-space: nowrap;\n pointer-events: none;\n}\n\n\n\n.meos-save-chip,\n.meos-save-chip[data-meos-theme=\"auto\"] {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n}\n\n.meos-save-chip[data-meos-theme=\"light\"] {\n \n --meos-save-fg: #000000;\n --meos-save-border: rgba(0, 0, 0, 0.24);\n --meos-save-hover-bg: rgba(0, 0, 0, 0.06);\n --meos-save-hover-border: rgba(0, 0, 0, 0.42);\n\n}\n\n.meos-save-chip[data-meos-theme=\"dark\"] {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n}\n\n@media (prefers-color-scheme: dark) {\n .meos-save-chip[data-meos-theme=\"auto\"] {\n \n --meos-save-fg: #ffffff;\n --meos-save-border: rgba(255, 255, 255, 0.3);\n --meos-save-hover-bg: rgba(255, 255, 255, 0.08);\n --meos-save-hover-border: rgba(255, 255, 255, 0.46);\n\n }\n}\n\n\n.meos-save-chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--meos-save-chip-gap, 0.3125rem);\n min-height: calc(var(--meos-save-chip-height, 31px) - 1px);\n max-height: calc(var(--meos-save-chip-height, 31px) + 1px);\n height: var(--meos-save-chip-height, 31px);\n padding: 0 var(--meos-save-chip-padding-x, 0.625rem);\n margin: 0;\n font-family: var(--meos-font, \"Inconsolata\", ui-monospace, monospace);\n font-size: 11px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.02em;\n text-transform: lowercase;\n color: var(--meos-save-fg, #000000);\n background: transparent;\n border: 1px solid var(--meos-save-border, rgba(0, 0, 0, 0.24));\n border-radius: var(--meos-save-chip-radius, var(--meos-radius, 2px));\n cursor: pointer;\n box-sizing: border-box;\n -webkit-tap-highlight-color: transparent;\n pointer-events: auto;\n user-select: none;\n transition:\n background 0.12s ease,\n border-color 0.12s ease,\n opacity 0.12s ease,\n transform 0.08s ease;\n appearance: none;\n vertical-align: middle;\n}\n\n.meos-save-chip:hover {\n background: var(--meos-save-hover-bg, rgba(0, 0, 0, 0.06));\n border-color: var(--meos-save-hover-border, rgba(0, 0, 0, 0.42));\n}\n\n.meos-save-chip:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.meos-save-chip:active {\n opacity: 0.9;\n transform: scale(0.98);\n}\n\n.meos-save-chip__icon {\n width: calc(var(--meos-save-icon-size, 16px) * 27.275015 / 30.362297);\n height: var(--meos-save-icon-size, 16px);\n flex-shrink: 0;\n display: block;\n pointer-events: none;\n shape-rendering: geometricPrecision;\n overflow: visible;\n}\n\n.meos-save-chip__label {\n white-space: nowrap;\n pointer-events: none;\n}\n\n";
13
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/widget/styles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmFH,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,iwFAwBhC,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,+uFAqBlC,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,6+KAAuD,CAAA"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * WHY: initSaveButton injects styles without a separate network fetch (IIFE + npm).
3
+ * WHAT: Runtime chip CSS — theme tokens + bounded size vars; mirrors widget.css.
4
+ * WHERE: Injected into document head or shadow root on first initSaveButton call.
5
+ * GUARDED: check-widget-branding compares required tokens with widget.css.
6
+ */
7
+ /** Shared chip rules (shadow :host + document .meos-save-chip). */
8
+ const CHIP_RULES = `
9
+ .meos-save-chip {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ gap: var(--meos-save-chip-gap, 0.3125rem);
14
+ min-height: calc(var(--meos-save-chip-height, 31px) - 1px);
15
+ max-height: calc(var(--meos-save-chip-height, 31px) + 1px);
16
+ height: var(--meos-save-chip-height, 31px);
17
+ padding: 0 var(--meos-save-chip-padding-x, 0.625rem);
18
+ margin: 0;
19
+ font-family: var(--meos-font, "Inconsolata", ui-monospace, monospace);
20
+ font-size: 11px;
21
+ font-weight: 500;
22
+ line-height: 1;
23
+ letter-spacing: 0.02em;
24
+ text-transform: lowercase;
25
+ color: var(--meos-save-fg, #000000);
26
+ background: transparent;
27
+ border: 1px solid var(--meos-save-border, rgba(0, 0, 0, 0.24));
28
+ border-radius: var(--meos-save-chip-radius, var(--meos-radius, 2px));
29
+ cursor: pointer;
30
+ box-sizing: border-box;
31
+ -webkit-tap-highlight-color: transparent;
32
+ pointer-events: auto;
33
+ user-select: none;
34
+ transition:
35
+ background 0.12s ease,
36
+ border-color 0.12s ease,
37
+ opacity 0.12s ease,
38
+ transform 0.08s ease;
39
+ appearance: none;
40
+ vertical-align: middle;
41
+ }
42
+
43
+ .meos-save-chip:hover {
44
+ background: var(--meos-save-hover-bg, rgba(0, 0, 0, 0.06));
45
+ border-color: var(--meos-save-hover-border, rgba(0, 0, 0, 0.42));
46
+ }
47
+
48
+ .meos-save-chip:focus-visible {
49
+ outline: 2px solid currentColor;
50
+ outline-offset: 2px;
51
+ }
52
+
53
+ .meos-save-chip:active {
54
+ opacity: 0.9;
55
+ transform: scale(0.98);
56
+ }
57
+
58
+ .meos-save-chip__icon {
59
+ width: calc(var(--meos-save-icon-size, 16px) * 27.275015 / 30.362297);
60
+ height: var(--meos-save-icon-size, 16px);
61
+ flex-shrink: 0;
62
+ display: block;
63
+ pointer-events: none;
64
+ shape-rendering: geometricPrecision;
65
+ overflow: visible;
66
+ }
67
+
68
+ .meos-save-chip__label {
69
+ white-space: nowrap;
70
+ pointer-events: none;
71
+ }
72
+ `;
73
+ const LIGHT_THEME_VARS = `
74
+ --meos-save-fg: #000000;
75
+ --meos-save-border: rgba(0, 0, 0, 0.24);
76
+ --meos-save-hover-bg: rgba(0, 0, 0, 0.06);
77
+ --meos-save-hover-border: rgba(0, 0, 0, 0.42);
78
+ `;
79
+ const DARK_THEME_VARS = `
80
+ --meos-save-fg: #ffffff;
81
+ --meos-save-border: rgba(255, 255, 255, 0.3);
82
+ --meos-save-hover-bg: rgba(255, 255, 255, 0.08);
83
+ --meos-save-hover-border: rgba(255, 255, 255, 0.46);
84
+ `;
85
+ /** Injected into closed shadow roots (:host theme selectors). */
86
+ export const MEOS_SAVE_SHADOW_CSS = `
87
+ :host {
88
+ ${LIGHT_THEME_VARS}
89
+ color-scheme: light;
90
+ }
91
+
92
+ :host([data-meos-theme="light"]) {
93
+ ${LIGHT_THEME_VARS}
94
+ color-scheme: light;
95
+ }
96
+
97
+ :host([data-meos-theme="dark"]) {
98
+ ${DARK_THEME_VARS}
99
+ color-scheme: dark;
100
+ }
101
+
102
+ @media (prefers-color-scheme: dark) {
103
+ :host([data-meos-theme="auto"]) {
104
+ ${DARK_THEME_VARS}
105
+ color-scheme: dark;
106
+ }
107
+ }
108
+
109
+ ${CHIP_RULES}
110
+ `;
111
+ /** Document-level chip (npm hosts importing widget.css). */
112
+ export const MEOS_SAVE_DOCUMENT_CSS = `
113
+ .meos-save-chip,
114
+ .meos-save-chip[data-meos-theme="auto"] {
115
+ ${LIGHT_THEME_VARS}
116
+ }
117
+
118
+ .meos-save-chip[data-meos-theme="light"] {
119
+ ${LIGHT_THEME_VARS}
120
+ }
121
+
122
+ .meos-save-chip[data-meos-theme="dark"] {
123
+ ${DARK_THEME_VARS}
124
+ }
125
+
126
+ @media (prefers-color-scheme: dark) {
127
+ .meos-save-chip[data-meos-theme="auto"] {
128
+ ${DARK_THEME_VARS}
129
+ }
130
+ }
131
+
132
+ ${CHIP_RULES}
133
+ `;
134
+ /** Full injection bundle for initSaveButton (shadow + document fallback). */
135
+ export const MEOS_SAVE_WIDGET_CSS = `${MEOS_SAVE_SHADOW_CSS}\n${MEOS_SAVE_DOCUMENT_CSS}`;
136
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/widget/styles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mEAAmE;AACnE,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgElB,CAAA;AAED,MAAM,gBAAgB,GAAG;;;;;CAKxB,CAAA;AAED,MAAM,eAAe,GAAG;;;;;CAKvB,CAAA;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG;;IAEhC,gBAAgB;;;;;IAKhB,gBAAgB;;;;;IAKhB,eAAe;;;;;;MAMb,eAAe;;;;;EAKnB,UAAU;CACX,CAAA;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;IAGlC,gBAAgB;;;;IAIhB,gBAAgB;;;;IAIhB,eAAe;;;;;MAKb,eAAe;;;;EAInB,UAAU;CACX,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,oBAAoB,KAAK,sBAAsB,EAAE,CAAA"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * WHY: Canonical branded save chip — social-share row size, meos B/W ghost style.
3
+ * WHAT: Scoped `meos-save-` classes; theme via data-meos-theme + bounded CSS vars.
4
+ * WHERE: import '@meoslabs/save-in-meos/widget.css' (pairs with fonts.css).
5
+ * GUARDED: check-widget-branding enforces selectors, theme tokens, and allowed host vars.
6
+ */
7
+
8
+ .meos-save-chip,
9
+ .meos-save-chip[data-meos-theme="auto"] {
10
+ --meos-save-fg: #000000;
11
+ --meos-save-border: rgba(0, 0, 0, 0.24);
12
+ --meos-save-hover-bg: rgba(0, 0, 0, 0.06);
13
+ --meos-save-hover-border: rgba(0, 0, 0, 0.42);
14
+ }
15
+
16
+ .meos-save-chip[data-meos-theme="light"] {
17
+ --meos-save-fg: #000000;
18
+ --meos-save-border: rgba(0, 0, 0, 0.24);
19
+ --meos-save-hover-bg: rgba(0, 0, 0, 0.06);
20
+ --meos-save-hover-border: rgba(0, 0, 0, 0.42);
21
+ }
22
+
23
+ .meos-save-chip[data-meos-theme="dark"] {
24
+ --meos-save-fg: #ffffff;
25
+ --meos-save-border: rgba(255, 255, 255, 0.3);
26
+ --meos-save-hover-bg: rgba(255, 255, 255, 0.08);
27
+ --meos-save-hover-border: rgba(255, 255, 255, 0.46);
28
+ }
29
+
30
+ @media (prefers-color-scheme: dark) {
31
+ .meos-save-chip[data-meos-theme="auto"] {
32
+ --meos-save-fg: #ffffff;
33
+ --meos-save-border: rgba(255, 255, 255, 0.3);
34
+ --meos-save-hover-bg: rgba(255, 255, 255, 0.08);
35
+ --meos-save-hover-border: rgba(255, 255, 255, 0.46);
36
+ }
37
+ }
38
+
39
+ .meos-save-chip {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ gap: var(--meos-save-chip-gap, 0.3125rem);
44
+ min-height: calc(var(--meos-save-chip-height, 31px) - 1px);
45
+ max-height: calc(var(--meos-save-chip-height, 31px) + 1px);
46
+ height: var(--meos-save-chip-height, 31px);
47
+ padding: 0 var(--meos-save-chip-padding-x, 0.625rem);
48
+ margin: 0;
49
+ font-family: var(--meos-font, "Inconsolata", ui-monospace, monospace);
50
+ font-size: 11px;
51
+ font-weight: 500;
52
+ line-height: 1;
53
+ letter-spacing: 0.02em;
54
+ text-transform: lowercase;
55
+ color: var(--meos-save-fg, #000000);
56
+ background: transparent;
57
+ border: 1px solid var(--meos-save-border, rgba(0, 0, 0, 0.24));
58
+ border-radius: var(--meos-save-chip-radius, var(--meos-radius, 2px));
59
+ cursor: pointer;
60
+ box-sizing: border-box;
61
+ -webkit-tap-highlight-color: transparent;
62
+ pointer-events: auto;
63
+ user-select: none;
64
+ transition:
65
+ background 0.12s ease,
66
+ border-color 0.12s ease,
67
+ opacity 0.12s ease,
68
+ transform 0.08s ease;
69
+ appearance: none;
70
+ vertical-align: middle;
71
+ }
72
+
73
+ .meos-save-chip:hover {
74
+ background: var(--meos-save-hover-bg, rgba(0, 0, 0, 0.06));
75
+ border-color: var(--meos-save-hover-border, rgba(0, 0, 0, 0.42));
76
+ }
77
+
78
+ .meos-save-chip:focus-visible {
79
+ outline: 2px solid currentColor;
80
+ outline-offset: 2px;
81
+ }
82
+
83
+ .meos-save-chip:active {
84
+ opacity: 0.9;
85
+ transform: scale(0.98);
86
+ }
87
+
88
+ .meos-save-chip__icon {
89
+ width: calc(var(--meos-save-icon-size, 16px) * 27.275015 / 30.362297);
90
+ height: var(--meos-save-icon-size, 16px);
91
+ flex-shrink: 0;
92
+ display: block;
93
+ pointer-events: none;
94
+ shape-rendering: geometricPrecision;
95
+ overflow: visible;
96
+ }
97
+
98
+ .meos-save-chip__label {
99
+ white-space: nowrap;
100
+ pointer-events: none;
101
+ }