@geektech/tsone 0.0.1 → 0.1.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.
Files changed (40) hide show
  1. package/README-zh.md +405 -0
  2. package/README.md +288 -32
  3. package/dist/core/animation/TransitionGroup.d.ts +7 -0
  4. package/dist/core/animation/index.d.ts +2 -0
  5. package/dist/core/animation/list-animation-controller.d.ts +16 -0
  6. package/dist/core/animation/transition-group-strategy.d.ts +15 -0
  7. package/dist/core/animation/types.d.ts +25 -0
  8. package/dist/core/app.d.ts +30 -8
  9. package/dist/core/component/base.d.ts +18 -1
  10. package/dist/core/component/index.d.ts +2 -2
  11. package/dist/core/document.d.ts +32 -0
  12. package/dist/core/form.d.ts +24 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/model.d.ts +18 -0
  15. package/dist/core/reactive/types.d.ts +5 -0
  16. package/dist/core/reactive.d.ts +5 -2
  17. package/dist/core/renderer/element-strategy.d.ts +25 -0
  18. package/dist/core/renderer/types.d.ts +6 -1
  19. package/dist/core/renderer.d.ts +9 -23
  20. package/dist/core/vnode.d.ts +56 -16
  21. package/dist/{index-dgv88dz4.js → index-8wjswsye.js} +6 -2
  22. package/dist/index-8wjswsye.js.map +10 -0
  23. package/dist/index-vpx80nq5.js +32 -0
  24. package/dist/index-vpx80nq5.js.map +10 -0
  25. package/dist/{index-3j2jsdpc.js → index-wv9gyjqt.js} +858 -244
  26. package/dist/index-wv9gyjqt.js.map +25 -0
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.js +380 -20
  29. package/dist/index.js.map +8 -5
  30. package/dist/router/index.d.ts +1 -1
  31. package/dist/router/index.js +6 -4
  32. package/dist/router/index.js.map +1 -1
  33. package/dist/style/StyleManager.d.ts +1 -0
  34. package/dist/style/index.d.ts +1 -0
  35. package/dist/style/index.js +6 -2
  36. package/dist/style/index.js.map +1 -1
  37. package/dist/style/sheet.d.ts +13 -0
  38. package/package.json +4 -14
  39. package/dist/index-3j2jsdpc.js.map +0 -20
  40. package/dist/index-dgv88dz4.js.map +0 -10
@@ -0,0 +1,24 @@
1
+ export type ValidationResult = boolean | string;
2
+ export type ValidationRule<T = unknown> = (value: T, model: object) => ValidationResult;
3
+ export type ValidationRules<TModel extends object> = {
4
+ [TPath in keyof TModel & string]?: readonly ValidationRule[];
5
+ } & Record<string, readonly ValidationRule[] | undefined>;
6
+ export interface FieldValidationResult {
7
+ valid: boolean;
8
+ errors: string[];
9
+ }
10
+ export interface FormValidationResult {
11
+ valid: boolean;
12
+ errors: Record<string, string[]>;
13
+ }
14
+ export interface FormController<TModel extends object> {
15
+ readonly model: TModel;
16
+ readonly errors: Record<string, string[]>;
17
+ validate(): FormValidationResult;
18
+ validateField(path: string): FieldValidationResult;
19
+ resetErrors(): void;
20
+ }
21
+ export declare function required(message?: string): ValidationRule;
22
+ export declare function minLength(length: number, message?: string): ValidationRule;
23
+ export declare function validate(rule: ValidationRule): ValidationRule;
24
+ export declare function createForm<TModel extends object>(model: TModel, rules: ValidationRules<TModel>): FormController<TModel>;
@@ -4,3 +4,7 @@ export * from './reactive';
4
4
  export * from './vnode';
5
5
  export * from './template';
6
6
  export * from './renderer';
7
+ export * from './document';
8
+ export * from './model';
9
+ export * from './form';
10
+ export * from './animation';
@@ -0,0 +1,18 @@
1
+ export interface ModelBindingOptions {
2
+ path: string;
3
+ parse?: (value: unknown) => unknown;
4
+ format?: (value: unknown) => string;
5
+ }
6
+ export type ModelBinding = string | ModelBindingOptions;
7
+ type ModelState = Record<string, unknown>;
8
+ export declare function modelPath(binding: ModelBinding): string;
9
+ export declare function getModelValue(state: ModelState, path: string): unknown;
10
+ export declare function setModelValue(state: ModelState, path: string, value: unknown): void;
11
+ export declare class ModelBindingController {
12
+ private readonly bindings;
13
+ bind(element: HTMLElement, binding: ModelBinding, state: ModelState): void;
14
+ cleanup(element: HTMLElement): void;
15
+ private isSupportedControl;
16
+ private sameBinding;
17
+ }
18
+ export {};
@@ -8,12 +8,17 @@ export interface ReactiveEffect<T = unknown> {
8
8
  export interface ReactiveEffectOptions {
9
9
  lazy?: boolean;
10
10
  scheduler?: (effect: ReactiveEffect) => void;
11
+ throwOnError?: boolean;
11
12
  }
12
13
  export interface ComputedRef<T> {
13
14
  readonly value: T;
14
15
  }
15
16
  export declare const IS_REACTIVE: unique symbol;
16
17
  export declare const IS_READONLY: unique symbol;
18
+ export declare const IS_REF: unique symbol;
19
+ export interface Ref<T = unknown> {
20
+ value: T;
21
+ }
17
22
  export declare const MUTATING_ARRAY_METHODS: readonly ["push", "pop", "shift", "unshift", "splice", "sort", "reverse"];
18
23
  export declare function hasReactiveFlag(value: object, flag: typeof IS_REACTIVE | typeof IS_READONLY): boolean;
19
24
  export declare function isObject(value: unknown): value is object;
@@ -1,5 +1,5 @@
1
- import { ComputedRef, ReactiveEffect, ReactiveEffectOptions } from './reactive/types';
2
- export type { ComputedRef, ReactiveEffect, ReactiveEffectOptions, } from './reactive/types';
1
+ import { ComputedRef, Ref, ReactiveEffect, ReactiveEffectOptions } from './reactive/types';
2
+ export type { ComputedRef, Ref, ReactiveEffect, ReactiveEffectOptions, } from './reactive/types';
3
3
  export declare class ReactiveSystem {
4
4
  private static instance;
5
5
  private activeEffect;
@@ -26,6 +26,9 @@ export declare function reactive<T extends object>(target: T): T;
26
26
  export declare function readonly<T extends object>(target: T): Readonly<T>;
27
27
  export declare function effect<T = unknown>(fn: () => T, options?: ReactiveEffectOptions): ReactiveEffect<T>;
28
28
  export declare function computed<T>(getter: () => T): ComputedRef<T>;
29
+ export declare function ref<T>(value: T): Ref<T>;
30
+ export declare function isRef(value: unknown): value is Ref<unknown>;
31
+ export declare function unref<T>(value: T | Ref<T>): T;
29
32
  export declare function stop(effect: ReactiveEffect): void;
30
33
  export declare function isReactive(value: unknown): boolean;
31
34
  export declare function isReadonly(value: unknown): boolean;
@@ -0,0 +1,25 @@
1
+ import { HTMLNode } from '../vnode';
2
+ import type { RenderRuntimeContext, RenderStrategy, Renderable } from './types';
3
+ export declare class ElementRenderStrategy<TNode extends HTMLNode = HTMLNode> implements RenderStrategy<TNode> {
4
+ private readonly listeners;
5
+ private readonly effects;
6
+ private readonly modelBindings;
7
+ matches(vnode: Renderable): vnode is TNode;
8
+ mount(vnode: TNode, context: RenderRuntimeContext): Node;
9
+ patch(oldVNode: TNode, newVNode: TNode, currentNode: Node, context: RenderRuntimeContext): Node;
10
+ unmount(vnode: TNode, currentNode: Node, context: RenderRuntimeContext): void;
11
+ protected mountChildren(element: HTMLElement, vnode: TNode, context: RenderRuntimeContext): void;
12
+ protected updateChildren(element: HTMLElement, oldVNode: TNode, newVNode: TNode, context: RenderRuntimeContext): void;
13
+ protected unmountChildren(element: HTMLElement, vnode: TNode, context: RenderRuntimeContext): void;
14
+ private applyProps;
15
+ private applyDirections;
16
+ private updateOrdinaryChildren;
17
+ private updateKeyedChildren;
18
+ private hasOnlyKeyedChildren;
19
+ private assertNoDuplicateKeys;
20
+ private getVNodeKey;
21
+ private collectListeners;
22
+ private updateListeners;
23
+ private setupReactiveAttribute;
24
+ private trackEffect;
25
+ }
@@ -1,5 +1,6 @@
1
1
  import type { TemplateEngine } from '../template';
2
2
  import type { ComponentEventListener, ComponentProps } from '../component';
3
+ import type { InjectionKey, InjectionResult } from '../component';
3
4
  import type { VNode } from '../vnode';
4
5
  export interface ComponentInstance {
5
6
  mountToNode(): Node;
@@ -7,8 +8,11 @@ export interface ComponentInstance {
7
8
  unmount(): void;
8
9
  setProps(props: Partial<ComponentProps>): void;
9
10
  setAppContext?(context: unknown): void;
11
+ setParentComponent?(parent: ComponentInstance | null): void;
12
+ setElementChangeListener?(listener: (previousElement: Node, nextElement: Node) => void): void;
13
+ resolveInjection?<T>(key: InjectionKey<T>): InjectionResult<T>;
10
14
  getElement(): Node | null;
11
- on(eventName: string, listener: ComponentEventListener): void;
15
+ on(eventName: string, listener: ComponentEventListener): () => void;
12
16
  }
13
17
  export type Renderable = VNode | string;
14
18
  export interface RendererHost {
@@ -22,6 +26,7 @@ export interface RenderRuntimeContext {
22
26
  renderer: RendererHost;
23
27
  slots: Record<string, Array<VNode | string>>;
24
28
  registerChild(component: ComponentInstance): void;
29
+ unregisterChild(component: ComponentInstance): void;
25
30
  }
26
31
  export interface RenderStrategy<T extends Renderable = Renderable> {
27
32
  matches(vnode: Renderable): vnode is T;
@@ -1,4 +1,5 @@
1
- import { ComponentNode, HTMLNode, SlotProvider } from './vnode';
1
+ import { ComponentNode, SlotProvider } from './vnode';
2
+ export { ElementRenderStrategy } from './renderer/element-strategy';
2
3
  export type { ComponentInstance, RenderRuntimeContext, RenderStrategy, Renderable, RendererHost, } from './renderer/types';
3
4
  import type { RenderRuntimeContext, RenderStrategy, Renderable } from './renderer/types';
4
5
  export declare class RendererContext {
@@ -17,11 +18,17 @@ export declare class TextRenderStrategy implements RenderStrategy<string> {
17
18
  }
18
19
  export declare class ComponentRenderStrategy implements RenderStrategy<ComponentNode> {
19
20
  private readonly instances;
21
+ private readonly instanceNodes;
22
+ private readonly emitterUnsubscribers;
20
23
  matches(vnode: Renderable): vnode is ComponentNode;
21
24
  mount(vnode: ComponentNode, context: RenderRuntimeContext): Node;
22
25
  patch(oldVNode: ComponentNode, newVNode: ComponentNode, currentNode: Node, context: RenderRuntimeContext): Node;
23
- unmount(_vnode: ComponentNode, currentNode: Node): void;
26
+ unmount(_vnode: ComponentNode, currentNode: Node, context: RenderRuntimeContext): void;
24
27
  private createProps;
28
+ private syncEmitters;
29
+ private clearEmitters;
30
+ private trackInstanceNode;
31
+ private clearInstanceNodes;
25
32
  }
26
33
  export declare class SlotRenderStrategy implements RenderStrategy<SlotProvider> {
27
34
  private readonly renderedChildren;
@@ -34,24 +41,3 @@ export declare class SlotRenderStrategy implements RenderStrategy<SlotProvider>
34
41
  private mountSlotChildren;
35
42
  private unmountSlotChildren;
36
43
  }
37
- export declare class ElementRenderStrategy implements RenderStrategy<HTMLNode> {
38
- private readonly listeners;
39
- private readonly effects;
40
- private readonly modelBindings;
41
- matches(vnode: Renderable): vnode is HTMLNode;
42
- mount(vnode: HTMLNode, context: RenderRuntimeContext): Node;
43
- patch(oldVNode: HTMLNode, newVNode: HTMLNode, currentNode: Node, context: RenderRuntimeContext): Node;
44
- unmount(vnode: HTMLNode, currentNode: Node, context: RenderRuntimeContext): void;
45
- private applyProps;
46
- private applyDirections;
47
- private updateChildren;
48
- private updateKeyedChildren;
49
- private hasKeyedChildren;
50
- private getVNodeKey;
51
- private collectListeners;
52
- private updateListeners;
53
- private setupReactiveAttribute;
54
- private setupTwoWayBinding;
55
- private getStateValue;
56
- private trackEffect;
57
- }
@@ -1,8 +1,9 @@
1
1
  import type { AnyComponentConstructor, ComponentConstructor, ComponentEventListener, ComponentProps } from './component';
2
+ import type { ModelBinding } from './model';
2
3
  export interface ComponentType {
3
4
  mount(container: HTMLElement): void;
4
5
  unmount(): void;
5
- on(eventName: string, listener: ComponentEventListener): void;
6
+ on(eventName: string, listener: ComponentEventListener): () => void;
6
7
  }
7
8
  type VNodeComponentProps = ComponentProps;
8
9
  export type VNodeComponentConstructor<P extends VNodeComponentProps = VNodeComponentProps> = ComponentConstructor<P> | AnyComponentConstructor;
@@ -17,48 +18,87 @@ export interface EventListeners {
17
18
  [eventName: string]: (event: Event) => void;
18
19
  }
19
20
  export interface Directions {
20
- model?: string;
21
+ model?: ModelBinding;
21
22
  if?: boolean;
22
23
  show?: boolean;
23
24
  }
24
- export interface HTMLNode {
25
+ export interface VNodeBase {
26
+ key?: string | number;
27
+ slot?: string;
28
+ directions?: Directions;
29
+ }
30
+ export interface HTMLNode extends VNodeBase {
25
31
  tag: string;
26
32
  props?: HTMLProps;
27
33
  children?: Array<VNode | string>;
28
34
  listeners?: EventListeners;
29
- key?: string | number;
30
- slot?: string;
31
- directions?: Directions;
32
35
  }
33
- export interface ComponentNode<P extends VNodeComponentProps = VNodeComponentProps> {
36
+ export interface ComponentNode<P extends VNodeComponentProps = VNodeComponentProps> extends VNodeBase {
34
37
  component: VNodeComponentConstructor<P>;
35
38
  props?: P;
36
39
  children?: Array<VNode | string>;
37
40
  emitters?: Record<string, ComponentEventListener>;
38
- key?: string | number;
39
- slot?: string;
40
- directions?: Directions;
41
41
  }
42
- export interface SlotProvider {
42
+ export interface SlotProvider extends VNodeBase {
43
43
  tag: 'slot';
44
44
  props: {
45
45
  name: string;
46
46
  };
47
47
  children?: Array<VNode | string>;
48
- key?: string | number;
49
- directions?: Directions;
50
48
  }
51
- export interface SlotInjector {
49
+ export interface SlotInjector extends VNodeBase {
52
50
  tag: string;
53
51
  slot: string;
54
- key?: string | number;
55
- directions?: Directions;
56
52
  }
57
53
  export type VNode = HTMLNode | ComponentNode | SlotProvider | SlotInjector;
54
+ export type ElementShortcutOptions = Omit<HTMLNode, 'tag'>;
55
+ export type ElementShortcut = (options?: ElementShortcutOptions) => HTMLNode;
58
56
  export declare function isComponentNode(vnode: VNode): vnode is ComponentNode;
59
57
  export declare function isHTMLNode(vnode: VNode): vnode is HTMLNode;
60
58
  export declare function isSlotProvider(vnode: VNode): vnode is SlotProvider;
61
59
  export declare function h(tag: string, props?: HTMLProps, children?: Array<VNode | string>, listeners?: EventListeners, key?: string | number, directions?: Directions): HTMLNode;
60
+ export declare function Tag(tag: string, options?: ElementShortcutOptions): HTMLNode;
61
+ export declare const Div: ElementShortcut;
62
+ export declare const Span: ElementShortcut;
63
+ export declare const P: ElementShortcut;
64
+ export declare const Button: ElementShortcut;
65
+ export declare const Input: ElementShortcut;
66
+ export declare const Section: ElementShortcut;
67
+ export declare const Main: ElementShortcut;
68
+ export declare const Header: ElementShortcut;
69
+ export declare const Footer: ElementShortcut;
70
+ export declare const Nav: ElementShortcut;
71
+ export declare const Article: ElementShortcut;
72
+ export declare const Aside: ElementShortcut;
73
+ export declare const H1: ElementShortcut;
74
+ export declare const H2: ElementShortcut;
75
+ export declare const H3: ElementShortcut;
76
+ export declare const H4: ElementShortcut;
77
+ export declare const H5: ElementShortcut;
78
+ export declare const H6: ElementShortcut;
79
+ export declare const Strong: ElementShortcut;
80
+ export declare const Em: ElementShortcut;
81
+ export declare const Small: ElementShortcut;
82
+ export declare const Pre: ElementShortcut;
83
+ export declare const Code: ElementShortcut;
84
+ export declare const Blockquote: ElementShortcut;
85
+ export declare const Ul: ElementShortcut;
86
+ export declare const Ol: ElementShortcut;
87
+ export declare const Li: ElementShortcut;
88
+ export declare const A: ElementShortcut;
89
+ export declare const Img: ElementShortcut;
90
+ export declare const Form: ElementShortcut;
91
+ export declare const Label: ElementShortcut;
92
+ export declare const Textarea: ElementShortcut;
93
+ export declare const Select: ElementShortcut;
94
+ export declare const Option: ElementShortcut;
95
+ export declare const Table: ElementShortcut;
96
+ export declare const Thead: ElementShortcut;
97
+ export declare const Tbody: ElementShortcut;
98
+ export declare const Tr: ElementShortcut;
99
+ export declare const Th: ElementShortcut;
100
+ export declare const Td: ElementShortcut;
62
101
  export declare function createComponent<P extends VNodeComponentProps>(componentClass: ComponentConstructor<P>, props?: P, children?: Array<VNode | string>, key?: string | number, directions?: Directions): ComponentNode<P>;
63
102
  export declare function slot(name: string, key?: string | number, directions?: Directions): SlotProvider;
103
+ export declare function each<T>(items: readonly T[], render: (item: T, index: number) => VNode | string, key: (item: T, index: number) => string | number): VNode[];
64
104
  export {};
@@ -18,6 +18,10 @@ class StyleManager {
18
18
  this.styles.clear();
19
19
  this.styleElement.textContent = "";
20
20
  }
21
+ destroy() {
22
+ this.clearStyles();
23
+ this.styleElement.remove();
24
+ }
21
25
  convertToCSS(properties) {
22
26
  return Object.entries(properties).map(([key, value]) => {
23
27
  const cssKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
@@ -55,5 +59,5 @@ ${this.convertToCSS(properties)}
55
59
 
56
60
  export { StyleManager };
57
61
 
58
- //# debugId=16D14DDEF181BE5A64756E2164756E21
59
- //# sourceMappingURL=index-dgv88dz4.js.map
62
+ //# debugId=401A1B62728D384364756E2164756E21
63
+ //# sourceMappingURL=index-8wjswsye.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../lib/style/StyleManager.ts"],
4
+ "sourcesContent": [
5
+ "export interface StyleOptions {\n selector: string;\n properties: Record<string, string | number>;\n hover?: Record<string, string | number>;\n media?: Record<string, Record<string, string | number>>;\n}\n\nexport class StyleManager {\n public styleElement: HTMLStyleElement;\n public styles: Map<string, StyleOptions> = new Map();\n\n constructor() {\n this.styleElement = document.createElement('style');\n document.head.appendChild(this.styleElement);\n }\n\n public addStyle(name: string, options: StyleOptions): void {\n this.styles.set(name, options);\n this.updateStyles();\n }\n\n public removeStyle(name: string): void {\n this.styles.delete(name);\n this.updateStyles();\n }\n\n public clearStyles(): void {\n this.styles.clear();\n this.styleElement.textContent = '';\n }\n\n public destroy(): void {\n this.clearStyles();\n this.styleElement.remove();\n }\n\n private convertToCSS(properties: Record<string, string | number>): string {\n return Object.entries(properties)\n .map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${value};`;\n })\n .join('\\n');\n }\n\n private updateStyles(): void {\n let cssText = '';\n\n this.styles.forEach((style) => {\n // 基础样式\n cssText += `${style.selector} {\\n${this.convertToCSS(style.properties)}\\n}\\n`;\n\n // hover 样式\n if (style.hover) {\n cssText += `${style.selector}:hover {\\n${this.convertToCSS(style.hover)}\\n}\\n`;\n }\n\n // media 查询\n if (style.media) {\n Object.entries(style.media).forEach(([query, properties]) => {\n cssText += `@media ${query} {\\n${style.selector} {\\n${this.convertToCSS(properties)}\\n}\\n}\\n`;\n });\n }\n });\n\n this.styleElement.textContent = cssText;\n }\n}\n"
6
+ ],
7
+ "mappings": ";AAOO,MAAM,aAAa;AAAA,EACjB;AAAA,EACA,SAAoC,IAAI;AAAA,EAE/C,WAAW,GAAG;AAAA,IACZ,KAAK,eAAe,SAAS,cAAc,OAAO;AAAA,IAClD,SAAS,KAAK,YAAY,KAAK,YAAY;AAAA;AAAA,EAGtC,QAAQ,CAAC,MAAc,SAA6B;AAAA,IACzD,KAAK,OAAO,IAAI,MAAM,OAAO;AAAA,IAC7B,KAAK,aAAa;AAAA;AAAA,EAGb,WAAW,CAAC,MAAoB;AAAA,IACrC,KAAK,OAAO,OAAO,IAAI;AAAA,IACvB,KAAK,aAAa;AAAA;AAAA,EAGb,WAAW,GAAS;AAAA,IACzB,KAAK,OAAO,MAAM;AAAA,IAClB,KAAK,aAAa,cAAc;AAAA;AAAA,EAG3B,OAAO,GAAS;AAAA,IACrB,KAAK,YAAY;AAAA,IACjB,KAAK,aAAa,OAAO;AAAA;AAAA,EAGnB,YAAY,CAAC,YAAqD;AAAA,IACxE,OAAO,OAAO,QAAQ,UAAU,EAC7B,IAAI,EAAE,KAAK,WAAW;AAAA,MACrB,MAAM,SAAS,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAAA,MAC1D,OAAO,GAAG,WAAW;AAAA,KACtB,EACA,KAAK;AAAA,CAAI;AAAA;AAAA,EAGN,YAAY,GAAS;AAAA,IAC3B,IAAI,UAAU;AAAA,IAEd,KAAK,OAAO,QAAQ,CAAC,UAAU;AAAA,MAE7B,WAAW,GAAG,MAAM;AAAA,EAAe,KAAK,aAAa,MAAM,UAAU;AAAA;AAAA;AAAA,MAGrE,IAAI,MAAM,OAAO;AAAA,QACf,WAAW,GAAG,MAAM;AAAA,EAAqB,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA;AAAA,MACxE;AAAA,MAGA,IAAI,MAAM,OAAO;AAAA,QACf,OAAO,QAAQ,MAAM,KAAK,EAAE,QAAQ,EAAE,OAAO,gBAAgB;AAAA,UAC3D,WAAW,UAAU;AAAA,EAAY,MAAM;AAAA,EAAe,KAAK,aAAa,UAAU;AAAA;AAAA;AAAA;AAAA,SACnF;AAAA,MACH;AAAA,KACD;AAAA,IAED,KAAK,aAAa,cAAc;AAAA;AAEpC;",
8
+ "debugId": "401A1B62728D384364756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,32 @@
1
+ // lib/style/sheet.ts
2
+ function renderStyleSheet(styles) {
3
+ return styles.map((entry) => renderStyleEntry(entry)).join(`
4
+
5
+ `);
6
+ }
7
+ function renderStyleEntry(entry, indent = "") {
8
+ if ("atRule" in entry) {
9
+ const rules = entry.rules.map((rule) => renderStyleEntry(rule, `${indent} `)).join(`
10
+
11
+ `);
12
+ return `${indent}${entry.atRule} {
13
+ ${rules}
14
+ ${indent}}`;
15
+ }
16
+ const declarations = Object.entries(entry.properties).map(([property, value]) => `${indent} ${toCssProperty(property)}: ${String(value)};`).join(`
17
+ `);
18
+ return `${indent}${entry.selector} {
19
+ ${declarations}
20
+ ${indent}}`;
21
+ }
22
+ function toCssProperty(property) {
23
+ if (property.startsWith("--") || property.includes("-")) {
24
+ return property;
25
+ }
26
+ return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
27
+ }
28
+
29
+ export { renderStyleSheet };
30
+
31
+ //# debugId=61B1187B7ADC17DB64756E2164756E21
32
+ //# sourceMappingURL=index-vpx80nq5.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../lib/style/sheet.ts"],
4
+ "sourcesContent": [
5
+ "export type StyleValue = string | number;\n\nexport type StyleProperties = Record<string, StyleValue>;\n\nexport interface StyleRule {\n selector: string;\n properties: StyleProperties;\n}\n\nexport interface StyleAtRule {\n atRule: string;\n rules: StyleRule[];\n}\n\nexport type StyleSheetEntry = StyleRule | StyleAtRule;\n\nexport type StyleSheet = StyleSheetEntry[];\n\nexport function renderStyleSheet(styles: StyleSheet): string {\n return styles.map((entry) => renderStyleEntry(entry)).join('\\n\\n');\n}\n\nfunction renderStyleEntry(entry: StyleSheetEntry, indent = ''): string {\n if ('atRule' in entry) {\n const rules = entry.rules\n .map((rule) => renderStyleEntry(rule, `${indent} `))\n .join('\\n\\n');\n\n return `${indent}${entry.atRule} {\\n${rules}\\n${indent}}`;\n }\n\n const declarations = Object.entries(entry.properties)\n .map(\n ([property, value]) =>\n `${indent} ${toCssProperty(property)}: ${String(value)};`\n )\n .join('\\n');\n\n return `${indent}${entry.selector} {\\n${declarations}\\n${indent}}`;\n}\n\nfunction toCssProperty(property: string): string {\n if (property.startsWith('--') || property.includes('-')) {\n return property;\n }\n\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n"
6
+ ],
7
+ "mappings": ";AAkBO,SAAS,gBAAgB,CAAC,QAA4B;AAAA,EAC3D,OAAO,OAAO,IAAI,CAAC,UAAU,iBAAiB,KAAK,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA;AAGnE,SAAS,gBAAgB,CAAC,OAAwB,SAAS,IAAY;AAAA,EACrE,IAAI,YAAY,OAAO;AAAA,IACrB,MAAM,QAAQ,MAAM,MACjB,IAAI,CAAC,SAAS,iBAAiB,MAAM,GAAG,UAAU,CAAC,EACnD,KAAK;AAAA;AAAA,CAAM;AAAA,IAEd,OAAO,GAAG,SAAS,MAAM;AAAA,EAAa;AAAA,EAAU;AAAA,EAClD;AAAA,EAEA,MAAM,eAAe,OAAO,QAAQ,MAAM,UAAU,EACjD,IACC,EAAE,UAAU,WACV,GAAG,WAAW,cAAc,QAAQ,MAAM,OAAO,KAAK,IAC1D,EACC,KAAK;AAAA,CAAI;AAAA,EAEZ,OAAO,GAAG,SAAS,MAAM;AAAA,EAAe;AAAA,EAAiB;AAAA;AAG3D,SAAS,aAAa,CAAC,UAA0B;AAAA,EAC/C,IAAI,SAAS,WAAW,IAAI,KAAK,SAAS,SAAS,GAAG,GAAG;AAAA,IACvD,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAS,QAAQ,UAAU,CAAC,UAAU,IAAI,MAAM,YAAY,GAAG;AAAA;",
8
+ "debugId": "61B1187B7ADC17DB64756E2164756E21",
9
+ "names": []
10
+ }