@gtkx/css 0.21.0 → 1.0.0-rc.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,98 @@
1
+ import type { CSSInterpolation, RegisteredCache, SerializedStyles } from "@emotion/serialize";
2
+ import { serializeStyles } from "@emotion/serialize";
3
+ import type { Element } from "stylis";
4
+ import { compile, middleware, rulesheet, stringify, serialize as stylisSerialize } from "stylis";
5
+ import { escapeNamedColors, restoreNamedColors } from "./named-colors.js";
6
+ import { StyleSheet } from "./stylesheet.js";
7
+
8
+ const KEY = "gtkx";
9
+
10
+ const LABEL_DECL_FIRST_CHAR = 108;
11
+ const LABEL_DECL_THIRD_CHAR = 98;
12
+
13
+ type CxToken = string | boolean | undefined | null;
14
+
15
+ export type Css = {
16
+ css: (...args: CSSInterpolation[]) => string;
17
+ cx: (...classNames: CxToken[]) => string[];
18
+ injectGlobal: (...args: CSSInterpolation[]) => void;
19
+ };
20
+
21
+ export const removeLabel = (element: Element): void => {
22
+ if (
23
+ element.type === "decl" &&
24
+ element.value.codePointAt(0) === LABEL_DECL_FIRST_CHAR &&
25
+ element.value.codePointAt(2) === LABEL_DECL_THIRD_CHAR
26
+ ) {
27
+ element.return = "";
28
+ element.value = "";
29
+ }
30
+ };
31
+
32
+ const classNameFor = (serialized: SerializedStyles): string => `${KEY}-${serialized.name}`;
33
+
34
+ const runStylis = (sheet: StyleSheet, input: string): void => {
35
+ stylisSerialize(
36
+ compile(escapeNamedColors(input)),
37
+ middleware([
38
+ removeLabel,
39
+ stringify,
40
+ rulesheet((rule) => {
41
+ sheet.insert(restoreNamedColors(rule));
42
+ }),
43
+ ]),
44
+ );
45
+ };
46
+
47
+ export const createCss = (): Css => {
48
+ const sheet = new StyleSheet();
49
+ const inserted = new Set<string>();
50
+ const registered: RegisteredCache = {};
51
+
52
+ const serialize = (args: CSSInterpolation[]): SerializedStyles => serializeStyles(args, registered);
53
+
54
+ const insertStyles = (serialized: SerializedStyles): void => {
55
+ if (inserted.has(serialized.name)) return;
56
+ inserted.add(serialized.name);
57
+ const className = classNameFor(serialized);
58
+ runStylis(sheet, `.${className}{${serialized.styles}}`);
59
+ registered[className] = serialized.styles;
60
+ };
61
+
62
+ const insertWithoutScoping = (serialized: SerializedStyles): void => {
63
+ if (inserted.has(serialized.name)) return;
64
+ inserted.add(serialized.name);
65
+ runStylis(sheet, serialized.styles);
66
+ };
67
+
68
+ const css = (...args: CSSInterpolation[]): string => {
69
+ const serialized = serialize(args);
70
+ insertStyles(serialized);
71
+ return classNameFor(serialized);
72
+ };
73
+
74
+ const cx = (...classNames: CxToken[]): string[] => {
75
+ const tokens = classNames.filter((cn): cn is string => typeof cn === "string" && cn.length > 0);
76
+
77
+ const rawClasses: string[] = [];
78
+ const registeredStyles: string[] = [];
79
+ for (const token of tokens) {
80
+ const styles = registered[token];
81
+ if (styles === undefined) {
82
+ rawClasses.push(token);
83
+ } else {
84
+ registeredStyles.push(styles);
85
+ }
86
+ }
87
+
88
+ if (registeredStyles.length < 2) return tokens;
89
+
90
+ return [...rawClasses, css(registeredStyles.join(""))];
91
+ };
92
+
93
+ const injectGlobal = (...args: CSSInterpolation[]): void => {
94
+ insertWithoutScoping(serialize(args));
95
+ };
96
+
97
+ return { css, cx, injectGlobal };
98
+ };
package/src/index.ts CHANGED
@@ -1,3 +1,19 @@
1
- export { css, cx, injectGlobal } from "./css.js";
1
+ import { type Css, createCss } from "./create-css.js";
2
2
 
3
- import "./style-sheet.js";
3
+ const instance = createCss();
4
+
5
+ /**
6
+ * Serializes the given style interpolations, inserts the resulting rules into
7
+ * the default stylesheet, and returns the generated GTK4 CSS class name.
8
+ */
9
+ export const css: Css["css"] = instance.css;
10
+ /**
11
+ * Combines class name tokens, filtering out falsy values and merging any
12
+ * gtkx-registered styles into a single generated class.
13
+ */
14
+ export const cx: Css["cx"] = instance.cx;
15
+ /**
16
+ * Serializes and inserts the given styles into the default stylesheet globally,
17
+ * without scoping them to a generated class.
18
+ */
19
+ export const injectGlobal: Css["injectGlobal"] = instance.injectGlobal;
@@ -0,0 +1,14 @@
1
+ export const AT_RULE_KEYWORDS: Set<string> = new Set(["define-color", "import", "keyframes", "media"]);
2
+
3
+ const AT_IDENTIFIER_PATTERN = /@([A-Za-z_][\w-]*)/g;
4
+
5
+ export const NAMED_COLOR_TOKEN = "gtkx-named-color__";
6
+
7
+ const NAMED_COLOR_TOKEN_PATTERN = new RegExp(`${NAMED_COLOR_TOKEN}([\\w-]+)`, "g");
8
+
9
+ export const escapeNamedColors = (input: string): string =>
10
+ input.replace(AT_IDENTIFIER_PATTERN, (match, name: string) =>
11
+ AT_RULE_KEYWORDS.has(name) ? match : `${NAMED_COLOR_TOKEN}${name}`,
12
+ );
13
+
14
+ export const restoreNamedColors = (rule: string): string => rule.replace(NAMED_COLOR_TOKEN_PATTERN, "@$1");
@@ -0,0 +1,31 @@
1
+ import { type Display, DisplayManager } from "@gtkx/gi/gdk";
2
+ import { CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION, StyleContext } from "@gtkx/gi/gtk";
3
+ import type { Logger } from "@gtkx/utils";
4
+
5
+ export const registerProviderForDefaultDisplay = (
6
+ priority: number = STYLE_PROVIDER_PRIORITY_APPLICATION,
7
+ ): CssProvider => {
8
+ const provider = new CssProvider();
9
+ const manager = DisplayManager.get();
10
+
11
+ const attach = (display: Display): void => {
12
+ StyleContext.addProviderForDisplay(display, provider, priority);
13
+ };
14
+
15
+ const initialDisplay = manager.getDefaultDisplay();
16
+ if (initialDisplay) {
17
+ attach(initialDisplay);
18
+ } else {
19
+ manager.once("display-opened", (openedDisplay: Display): void => attach(openedDisplay));
20
+ }
21
+
22
+ return provider;
23
+ };
24
+
25
+ export const attachParsingErrorLogger = (provider: CssProvider, log: Logger, subject: string): void => {
26
+ if (process.env.NODE_ENV !== "production") {
27
+ provider.on("parsing-error", (section, error) => {
28
+ log.warn(`GTK4 rejected ${subject} at ${section.toString()}: ${error.message}`);
29
+ });
30
+ }
31
+ };
@@ -0,0 +1,33 @@
1
+ import type * as Gtk from "@gtkx/gi/gtk";
2
+ import { createLogger } from "@gtkx/utils";
3
+ import { attachParsingErrorLogger, registerProviderForDefaultDisplay } from "./provider.js";
4
+
5
+ const log = createLogger("css");
6
+
7
+ export class StyleSheet {
8
+ private css = "";
9
+ private provider: Gtk.CssProvider | null = null;
10
+ private updateScheduled = false;
11
+
12
+ private ensureProvider(): Gtk.CssProvider {
13
+ if (this.provider) return this.provider;
14
+ const provider = registerProviderForDefaultDisplay();
15
+ this.provider = provider;
16
+ attachParsingErrorLogger(provider, log, "CSS");
17
+ return provider;
18
+ }
19
+
20
+ private scheduleUpdate(): void {
21
+ if (this.updateScheduled) return;
22
+ this.updateScheduled = true;
23
+ queueMicrotask(() => {
24
+ this.updateScheduled = false;
25
+ this.ensureProvider().loadFromString(this.css);
26
+ });
27
+ }
28
+
29
+ insert(rule: string): void {
30
+ this.css += this.css.length > 0 ? `\n${rule}` : rule;
31
+ this.scheduleUpdate();
32
+ }
33
+ }
package/dist/cache.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import type { EmotionCache } from "@emotion/cache";
2
- export declare const getGtkCache: () => EmotionCache;
3
- //# sourceMappingURL=cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMnD,eAAO,MAAM,WAAW,QAAO,YAa9B,CAAC"}
package/dist/cache.js DELETED
@@ -1,15 +0,0 @@
1
- import createCache from "@emotion/cache";
2
- import { StyleSheet } from "./style-sheet.js";
3
- let gtkCache = null;
4
- export const getGtkCache = () => {
5
- if (!gtkCache) {
6
- const sheet = new StyleSheet({ key: "gtkx" });
7
- gtkCache = createCache({
8
- key: "gtkx",
9
- container: null,
10
- });
11
- gtkCache.sheet = sheet;
12
- }
13
- return gtkCache;
14
- };
15
- //# sourceMappingURL=cache.js.map
package/dist/cache.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,IAAI,QAAQ,GAAwB,IAAI,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAiB,EAAE;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,QAAQ,GAAG,WAAW,CAAC;YACnB,GAAG,EAAE,MAAM;YACX,SAAS,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,QAAQ,CAAC,KAAK,GAAG,KAAyC,CAAC;IAC/D,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC"}
package/dist/css.d.ts DELETED
@@ -1,95 +0,0 @@
1
- import type { CSSInterpolation } from "@emotion/serialize";
2
- /**
3
- * Branded type for CSS class names generated by {@link css}.
4
- * @internal
5
- */
6
- type CSSClassName = string & {
7
- __brand: "css";
8
- };
9
- /**
10
- * Creates a CSS class from style definitions.
11
- *
12
- * Uses Emotion's CSS-in-JS system adapted for GTK CSS. Supports nested selectors
13
- * using `&` for the parent selector reference.
14
- *
15
- * @param args - CSS style definitions (objects, template literals, or interpolations)
16
- * @returns A unique class name to use with `cssClasses` prop
17
- *
18
- * @example
19
- * ```tsx
20
- * import { css } from "@gtkx/css";
21
- *
22
- * const buttonStyle = css({
23
- * padding: "8px 16px",
24
- * borderRadius: "4px",
25
- * "&:hover": {
26
- * backgroundColor: "@accent_bg_color",
27
- * },
28
- * });
29
- *
30
- * <GtkButton cssClasses={[buttonStyle]} label="Styled Button" />
31
- * ```
32
- *
33
- * @example
34
- * ```tsx
35
- * // Template literal syntax
36
- * const labelStyle = css`
37
- * font-size: 14px;
38
- * color: @theme_text_color;
39
- * `;
40
- * ```
41
- *
42
- * @see {@link cx} for combining class names
43
- * @see {@link injectGlobal} for global styles
44
- */
45
- export declare const css: (...args: CSSInterpolation[]) => CSSClassName;
46
- /**
47
- * Combines multiple class names into an array for use with cssClasses prop.
48
- *
49
- * Filters out falsy values, allowing conditional class application.
50
- *
51
- * @param classNames - Class names, booleans, undefined, or null values
52
- * @returns Array of valid class names
53
- *
54
- * @example
55
- * ```tsx
56
- * import { css, cx } from "@gtkx/css";
57
- *
58
- * const base = css({ padding: "8px" });
59
- * const active = css({ backgroundColor: "@accent_bg_color" });
60
- *
61
- * <GtkButton
62
- * cssClasses={cx(base, isActive && active, "custom-class")}
63
- * label="Button"
64
- * />
65
- * ```
66
- */
67
- export declare const cx: (...classNames: (string | boolean | undefined | null)[]) => string[];
68
- /**
69
- * Injects global CSS styles without a wrapping class.
70
- *
71
- * Use for application-wide styles, CSS variables, or styling native GTK widgets.
72
- *
73
- * @param args - CSS style definitions
74
- *
75
- * @example
76
- * ```tsx
77
- * import { injectGlobal } from "@gtkx/css";
78
- *
79
- * injectGlobal`
80
- * window {
81
- * background-color: @theme_bg_color;
82
- * }
83
- *
84
- * .title-1 {
85
- * font-size: 24px;
86
- * font-weight: bold;
87
- * }
88
- * `;
89
- * ```
90
- *
91
- * @see {@link css} for scoped class-based styles
92
- */
93
- export declare const injectGlobal: (...args: CSSInterpolation[]) => void;
94
- export {};
95
- //# sourceMappingURL=css.d.ts.map
package/dist/css.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3D;;;GAGG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AA6ChD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,gBAAgB,EAAE,KAAG,YAcjD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,EAAE,GAAI,GAAG,YAAY,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,KAAG,MAAM,EACE,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,gBAAgB,EAAE,KAAG,IAQ1D,CAAC"}
package/dist/css.js DELETED
@@ -1,145 +0,0 @@
1
- import { serializeStyles } from "@emotion/serialize";
2
- import { getGtkCache } from "./cache.js";
3
- function expandNestedRules(styles, className) {
4
- const selector = `.${className}`;
5
- const expandedStyles = styles.replace(/&/g, selector);
6
- const rules = [];
7
- let topLevelProperties = "";
8
- let currentSegment = "";
9
- let braceDepth = 0;
10
- for (let i = 0; i < expandedStyles.length; i++) {
11
- const char = expandedStyles[i];
12
- if (char === "{") {
13
- currentSegment += char;
14
- braceDepth++;
15
- }
16
- else if (char === "}") {
17
- braceDepth--;
18
- currentSegment += char;
19
- if (braceDepth === 0) {
20
- rules.push(currentSegment.trim());
21
- currentSegment = "";
22
- }
23
- }
24
- else if (char === ";" && braceDepth === 0) {
25
- topLevelProperties += currentSegment + char;
26
- currentSegment = "";
27
- }
28
- else {
29
- currentSegment += char;
30
- }
31
- }
32
- if (currentSegment.trim() && braceDepth === 0) {
33
- topLevelProperties += currentSegment;
34
- }
35
- const allRules = [];
36
- if (topLevelProperties.trim()) {
37
- allRules.push(`${selector}{${topLevelProperties.trim()}}`);
38
- }
39
- allRules.push(...rules);
40
- return allRules.join("\n");
41
- }
42
- /**
43
- * Creates a CSS class from style definitions.
44
- *
45
- * Uses Emotion's CSS-in-JS system adapted for GTK CSS. Supports nested selectors
46
- * using `&` for the parent selector reference.
47
- *
48
- * @param args - CSS style definitions (objects, template literals, or interpolations)
49
- * @returns A unique class name to use with `cssClasses` prop
50
- *
51
- * @example
52
- * ```tsx
53
- * import { css } from "@gtkx/css";
54
- *
55
- * const buttonStyle = css({
56
- * padding: "8px 16px",
57
- * borderRadius: "4px",
58
- * "&:hover": {
59
- * backgroundColor: "@accent_bg_color",
60
- * },
61
- * });
62
- *
63
- * <GtkButton cssClasses={[buttonStyle]} label="Styled Button" />
64
- * ```
65
- *
66
- * @example
67
- * ```tsx
68
- * // Template literal syntax
69
- * const labelStyle = css`
70
- * font-size: 14px;
71
- * color: @theme_text_color;
72
- * `;
73
- * ```
74
- *
75
- * @see {@link cx} for combining class names
76
- * @see {@link injectGlobal} for global styles
77
- */
78
- export const css = (...args) => {
79
- const cache = getGtkCache();
80
- const serialized = serializeStyles(args, cache.registered);
81
- const className = `${cache.key}-${serialized.name}`;
82
- if (cache.inserted[serialized.name] === undefined) {
83
- const cssRule = expandNestedRules(serialized.styles, className);
84
- cache.sheet.insert(cssRule);
85
- cache.inserted[serialized.name] = serialized.styles;
86
- cache.registered[className] = serialized.styles;
87
- }
88
- return className;
89
- };
90
- /**
91
- * Combines multiple class names into an array for use with cssClasses prop.
92
- *
93
- * Filters out falsy values, allowing conditional class application.
94
- *
95
- * @param classNames - Class names, booleans, undefined, or null values
96
- * @returns Array of valid class names
97
- *
98
- * @example
99
- * ```tsx
100
- * import { css, cx } from "@gtkx/css";
101
- *
102
- * const base = css({ padding: "8px" });
103
- * const active = css({ backgroundColor: "@accent_bg_color" });
104
- *
105
- * <GtkButton
106
- * cssClasses={cx(base, isActive && active, "custom-class")}
107
- * label="Button"
108
- * />
109
- * ```
110
- */
111
- export const cx = (...classNames) => classNames.filter((cn) => typeof cn === "string" && cn.length > 0);
112
- /**
113
- * Injects global CSS styles without a wrapping class.
114
- *
115
- * Use for application-wide styles, CSS variables, or styling native GTK widgets.
116
- *
117
- * @param args - CSS style definitions
118
- *
119
- * @example
120
- * ```tsx
121
- * import { injectGlobal } from "@gtkx/css";
122
- *
123
- * injectGlobal`
124
- * window {
125
- * background-color: @theme_bg_color;
126
- * }
127
- *
128
- * .title-1 {
129
- * font-size: 24px;
130
- * font-weight: bold;
131
- * }
132
- * `;
133
- * ```
134
- *
135
- * @see {@link css} for scoped class-based styles
136
- */
137
- export const injectGlobal = (...args) => {
138
- const cache = getGtkCache();
139
- const serialized = serializeStyles(args, cache.registered);
140
- if (cache.inserted[`global-${serialized.name}`] === undefined) {
141
- cache.sheet.insert(serialized.styles);
142
- cache.inserted[`global-${serialized.name}`] = serialized.styles;
143
- }
144
- };
145
- //# sourceMappingURL=css.js.map
package/dist/css.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- type StyleSheetOptions = {
2
- key: string;
3
- container?: unknown;
4
- nonce?: string;
5
- speedy?: boolean;
6
- prepend?: boolean;
7
- };
8
- export declare class StyleSheet {
9
- key: string;
10
- private rules;
11
- private provider;
12
- private display;
13
- private isRegistered;
14
- private hasPendingRules;
15
- private updateScheduled;
16
- constructor(options: StyleSheetOptions);
17
- private ensureProvider;
18
- private updateProvider;
19
- private scheduleUpdate;
20
- insert(rule: string): void;
21
- applyQueuedRules(): void;
22
- flush(): void;
23
- hydrate(_elements: unknown[]): void;
24
- }
25
- export {};
26
- //# sourceMappingURL=style-sheet.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"style-sheet.d.ts","sourceRoot":"","sources":["../src/style-sheet.ts"],"names":[],"mappings":"AAIA,KAAK,iBAAiB,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAqBF,qBAAa,UAAU;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;gBAEpB,OAAO,EAAE,iBAAiB;IAItC,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAUtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW1B,gBAAgB,IAAI,IAAI;IAQxB,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI;CACtC"}
@@ -1,85 +0,0 @@
1
- import { events, isStarted } from "@gtkx/ffi";
2
- import * as Gdk from "@gtkx/ffi/gdk";
3
- import * as Gtk from "@gtkx/ffi/gtk";
4
- const STYLE_PROVIDER_PRIORITY_APPLICATION = 600;
5
- const pendingSheets = [];
6
- const flushPendingStyles = () => {
7
- for (const sheet of pendingSheets) {
8
- sheet.applyQueuedRules();
9
- }
10
- pendingSheets.length = 0;
11
- };
12
- const registerStartListener = () => {
13
- events.once("start", flushPendingStyles);
14
- };
15
- if (!isStarted()) {
16
- registerStartListener();
17
- }
18
- export class StyleSheet {
19
- key;
20
- rules = [];
21
- provider = null;
22
- display = null;
23
- isRegistered = false;
24
- hasPendingRules = false;
25
- updateScheduled = false;
26
- constructor(options) {
27
- this.key = options.key;
28
- }
29
- ensureProvider() {
30
- if (!this.provider) {
31
- this.provider = new Gtk.CssProvider();
32
- this.display = Gdk.DisplayManager.get().getDefaultDisplay();
33
- if (this.display) {
34
- Gtk.StyleContext.addProviderForDisplay(this.display, this.provider, STYLE_PROVIDER_PRIORITY_APPLICATION);
35
- this.isRegistered = true;
36
- }
37
- }
38
- }
39
- updateProvider() {
40
- if (this.provider && this.rules.length > 0) {
41
- const css = this.rules.join("\n");
42
- this.provider.loadFromString(css);
43
- }
44
- }
45
- scheduleUpdate() {
46
- if (this.updateScheduled)
47
- return;
48
- this.updateScheduled = true;
49
- queueMicrotask(() => {
50
- this.updateScheduled = false;
51
- this.ensureProvider();
52
- this.updateProvider();
53
- });
54
- }
55
- insert(rule) {
56
- this.rules.push(rule);
57
- if (isStarted()) {
58
- this.scheduleUpdate();
59
- }
60
- else if (!this.hasPendingRules) {
61
- this.hasPendingRules = true;
62
- pendingSheets.push(this);
63
- }
64
- }
65
- applyQueuedRules() {
66
- if (this.rules.length > 0) {
67
- this.ensureProvider();
68
- this.updateProvider();
69
- }
70
- this.hasPendingRules = false;
71
- }
72
- flush() {
73
- if (this.provider && this.display && this.isRegistered) {
74
- Gtk.StyleContext.removeProviderForDisplay(this.display, this.provider);
75
- this.isRegistered = false;
76
- }
77
- this.rules = [];
78
- this.provider = null;
79
- this.display = null;
80
- this.hasPendingRules = false;
81
- this.updateScheduled = false;
82
- }
83
- hydrate(_elements) { }
84
- }
85
- //# sourceMappingURL=style-sheet.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"style-sheet.js","sourceRoot":"","sources":["../src/style-sheet.ts"],"names":[],"mappings":"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"}
package/src/cache.ts DELETED
@@ -1,20 +0,0 @@
1
- import type { EmotionCache } from "@emotion/cache";
2
- import createCache from "@emotion/cache";
3
- import { StyleSheet } from "./style-sheet.js";
4
-
5
- let gtkCache: EmotionCache | null = null;
6
-
7
- export const getGtkCache = (): EmotionCache => {
8
- if (!gtkCache) {
9
- const sheet = new StyleSheet({ key: "gtkx" });
10
-
11
- gtkCache = createCache({
12
- key: "gtkx",
13
- container: null,
14
- });
15
-
16
- gtkCache.sheet = sheet as unknown as typeof gtkCache.sheet;
17
- }
18
-
19
- return gtkCache;
20
- };