diff --git a/editor/components/app-runner/vanilla-app-runner.tsx b/editor/components/app-runner/vanilla-app-runner.tsx
index 1ec30c96..c3fab11a 100644
--- a/editor/components/app-runner/vanilla-app-runner.tsx
+++ b/editor/components/app-runner/vanilla-app-runner.tsx
@@ -43,7 +43,7 @@ export function VanillaRunner({
if (ref.current && enableInspector) {
ref.current.onload = () => {
const matches = ref.current.contentDocument.querySelectorAll(
- "div, span, button, img, image, svg"
+ "div, span, img, image, svg" // button, input - disabled due to interaction testing (for users)
);
matches.forEach((el) => {
const tint = "rgba(20, 0, 255, 0.2)";
diff --git a/editor/components/editor/editor-browser-meta-head/index.tsx b/editor/components/editor/editor-browser-meta-head/index.tsx
new file mode 100644
index 00000000..e0c3104e
--- /dev/null
+++ b/editor/components/editor/editor-browser-meta-head/index.tsx
@@ -0,0 +1,22 @@
+import React from "react";
+import Head from "next/head";
+import { useEditorState } from "core/states";
+
+export function EditorBrowserMetaHead({
+ children,
+}: {
+ children: React.ReactChild;
+}) {
+ const [state] = useEditorState();
+
+ return (
+ <>
+
+
+ {state?.design?.name ? `Grida | ${state?.design?.name}` : "Loading.."}
+
+
+ {children}
+ >
+ );
+}
diff --git a/editor/components/editor/index.ts b/editor/components/editor/index.ts
index 97ceb318..5d4287c9 100644
--- a/editor/components/editor/index.ts
+++ b/editor/components/editor/index.ts
@@ -1,3 +1,4 @@
export * from "./editor-appbar";
+export * from "./editor-browser-meta-head";
export * from "./editor-layer-hierarchy";
export * from "./editor-sidebar";
diff --git a/editor/core/reducers/editor-reducer.ts b/editor/core/reducers/editor-reducer.ts
index 7a2128d5..b50c8803 100644
--- a/editor/core/reducers/editor-reducer.ts
+++ b/editor/core/reducers/editor-reducer.ts
@@ -16,8 +16,14 @@ export function editorReducer(state: EditorState, action: Action): EditorState {
console.info("cleard console by editorReducer#select-node");
// update router
- router.query.node = node ?? state.selectedPage;
- router.push(router);
+ router.push(
+ {
+ pathname: router.pathname,
+ query: { ...router.query, node: node ?? state.selectedPage },
+ },
+ undefined,
+ {}
+ );
return produce(state, (draft) => {
const _canvas_state_store = new CanvasStateStore(
@@ -42,8 +48,14 @@ export function editorReducer(state: EditorState, action: Action): EditorState {
console.info("cleard console by editorReducer#select-page");
// update router
- router.query.node = page;
- router.push(router);
+ router.push(
+ {
+ pathname: router.pathname,
+ query: { ...router.query, node: page },
+ },
+ undefined,
+ {}
+ );
return produce(state, (draft) => {
const _canvas_state_store = new CanvasStateStore(filekey, page);
diff --git a/editor/core/states/editor-state.ts b/editor/core/states/editor-state.ts
index 7b3c3965..7e9494dd 100644
--- a/editor/core/states/editor-state.ts
+++ b/editor/core/states/editor-state.ts
@@ -24,6 +24,11 @@ export interface EditorSnapshot {
}
export interface FigmaReflectRepository {
+ /**
+ * name of the file
+ */
+ name: string;
+
/**
* fileid; filekey
*/
diff --git a/editor/pages/files/[key]/index.tsx b/editor/pages/files/[key]/index.tsx
index 94bb2374..43e6d673 100644
--- a/editor/pages/files/[key]/index.tsx
+++ b/editor/pages/files/[key]/index.tsx
@@ -8,6 +8,7 @@ import { useDesignFile } from "hooks";
import { warmup } from "scaffolds/editor";
import { FileResponse } from "@design-sdk/figma-remote-types";
+import { EditorBrowserMetaHead } from "components/editor";
export default function FileEntryEditor() {
const router = useRouter();
@@ -64,6 +65,7 @@ export default function FileEntryEditor() {
selectedPage: warmup.selectedPage(prevstate, pages, nodeid && [nodeid]),
selectedLayersOnPreview: [],
design: {
+ name: file.name,
input: null,
components: components,
// styles: null,
@@ -131,7 +133,9 @@ export default function FileEntryEditor() {
-
+
+
+
diff --git a/editor/pages/files/index.tsx b/editor/pages/files/index.tsx
index 8811055b..8ec7c948 100644
--- a/editor/pages/files/index.tsx
+++ b/editor/pages/files/index.tsx
@@ -1,4 +1,5 @@
import React, { useEffect, useState } from "react";
+import Head from "next/head";
import { DefaultEditorWorkspaceLayout } from "layouts/default-editor-workspace-layout";
import {
Cards,
@@ -19,6 +20,9 @@ export default function FilesPage() {
return (
<>
+
+ Grida | files
+
}
diff --git a/editor/pages/index.tsx b/editor/pages/index.tsx
index 57c1f8be..becaba28 100644
--- a/editor/pages/index.tsx
+++ b/editor/pages/index.tsx
@@ -1,13 +1,22 @@
+import React from "react";
+import Head from "next/head";
+
import { HomeInput } from "scaffolds/home-input";
import { HomeDashboard } from "scaffolds/home-dashboard";
-import React from "react";
import { useAuthState } from "hooks/use-auth-state";
export default function Home() {
const authstate = useAuthState();
// region - dev injected
- return ;
+ return (
+ <>
+
+ Grida | Home
+
+
+ >
+ );
// endregion
switch (authstate) {
diff --git a/editor/scaffolds/editor/warmup.ts b/editor/scaffolds/editor/warmup.ts
index 906f57bd..382f9916 100644
--- a/editor/scaffolds/editor/warmup.ts
+++ b/editor/scaffolds/editor/warmup.ts
@@ -7,13 +7,11 @@ import {
import { createInitialWorkspaceState } from "core/states";
import { workspaceReducer } from "core/reducers";
import { PendingState } from "core/utility-types";
-import { DesignInput } from "@designto/config/input";
-import { TargetNodeConfig } from "query/target-node";
import { WorkspaceAction } from "core/actions";
import { FileResponse } from "@design-sdk/figma-remote-types";
import { convert } from "@design-sdk/figma-node-conversion";
import { mapper } from "@design-sdk/figma-remote";
-import { find, visit } from "tree-visit";
+import { visit } from "tree-visit";
const pending_workspace_state = createPendingWorkspaceState();
//
@@ -98,24 +96,6 @@ export function componentsFrom(
.reduce(tomap, {});
}
-export function initializeDesign(design: TargetNodeConfig): EditorSnapshot {
- return {
- selectedNodes: [design.node],
- selectedLayersOnPreview: [],
- selectedPage: null,
- design: {
- pages: [],
- components: null,
- // styles: null,
- key: design.file,
- input: DesignInput.fromApiResponse({
- ...design,
- entry: design.reflect,
- }),
- },
- };
-}
-
export function safestate(initialState) {
return initialState.type === "success"
? initialState.value
diff --git a/externals/coli b/externals/coli
index 86802c58..cafda00d 160000
--- a/externals/coli
+++ b/externals/coli
@@ -1 +1 @@
-Subproject commit 86802c58f19f5acc1de059faabc62dd2709291bc
+Subproject commit cafda00d9e3979dd1a1692c35a6a27da58d1fc50
diff --git a/externals/design-sdk b/externals/design-sdk
index 6c54a532..6265f64c 160000
--- a/externals/design-sdk
+++ b/externals/design-sdk
@@ -1 +1 @@
-Subproject commit 6c54a532cec8a4ca016a43a8d75461e0a961ff13
+Subproject commit 6265f64ce67e84d490c1739a77cb0df42c2f75b1
diff --git a/externals/reflect-core b/externals/reflect-core
index 7e792b1f..2b4fd615 160000
--- a/externals/reflect-core
+++ b/externals/reflect-core
@@ -1 +1 @@
-Subproject commit 7e792b1fff930f3b1f49956b9ab2f9d40aa6f682
+Subproject commit 2b4fd6153dbc3b01e59c0a5399ba080cdb9ce139
diff --git a/packages/builder-css-styles/border/index.ts b/packages/builder-css-styles/border/index.ts
index 4576467d..f8925a20 100644
--- a/packages/builder-css-styles/border/index.ts
+++ b/packages/builder-css-styles/border/index.ts
@@ -33,6 +33,10 @@ export function border(border: Border): CSSProperties {
}
export function borderSide(borderSide: BorderSide): CSSProperty.Border {
+ if (borderSide.style === "none") {
+ return "none";
+ }
+
return `${borderSide.style ?? "solid"} ${px(borderSide.width)} ${color(
borderSide.color
)}`;
diff --git a/packages/builder-css-styles/color/index.ts b/packages/builder-css-styles/color/index.ts
index 4d0b8117..31fd85bf 100644
--- a/packages/builder-css-styles/color/index.ts
+++ b/packages/builder-css-styles/color/index.ts
@@ -19,8 +19,8 @@ export function color(input: CssColorInputLike | Color): string {
} else if (input instanceof CssNamedColor) {
return input.name;
} else if (typeof input == "object") {
- // with alpha
- if ("r" in input && "a" in input) {
+ // with alpha (if alpha is 1, use rgb format instead)
+ if ("r" in input && "a" in input && input.a !== 1) {
const a = safe_alpha_fallback(validAlphaValue(input.a));
const rgba = input as ICssRGBA;
const _r = validColorValue(rgba.r) ?? 0;
@@ -31,6 +31,11 @@ export function color(input: CssColorInputLike | Color): string {
// no alpha
else if ("r" in input && "a"! in input) {
const rgb = input as RGB;
+ const named = namedcolor(rgb);
+ if (named) {
+ return named;
+ }
+
return `rgb(${validColorValue(rgb.r) ?? 0}, ${
validColorValue(rgb.g) ?? 0
}, ${validColorValue(rgb.b) ?? 0})`;
@@ -42,6 +47,29 @@ export function color(input: CssColorInputLike | Color): string {
}
}
+/**
+ * rgb value of white, black as named colors
+ * @param rgb
+ */
+const namedcolor = (rgb: RGB) => {
+ // black
+ if (rgb.r === 0 && rgb.g === 0 && rgb.b === 0) {
+ return "black";
+ }
+ // white
+ if (rgb.r === 1 && rgb.g === 1 && rgb.b === 1) {
+ return "white";
+ }
+ // blue
+ if (rgb.r === 0 && rgb.g === 0 && rgb.b === 1) {
+ return "blue";
+ }
+ // red
+ if (rgb.r === 1 && rgb.g === 0 && rgb.b === 0) {
+ return "red";
+ }
+};
+
const validColorValue = (f: number) => {
if (f === undefined) {
return;
diff --git a/packages/builder-css-styles/index.ts b/packages/builder-css-styles/index.ts
index 7453ef0b..951bd0c1 100644
--- a/packages/builder-css-styles/index.ts
+++ b/packages/builder-css-styles/index.ts
@@ -9,6 +9,7 @@ export * from "./font-weight";
export * from "./font-family";
export * from "./text-decoration";
export * from "./text-shadow";
+export * from "./text-transform";
export * from "./gradient";
export * from "./padding";
export * from "./margin";
diff --git a/packages/builder-css-styles/padding/index.ts b/packages/builder-css-styles/padding/index.ts
index 93172c4d..5f8a30c1 100644
--- a/packages/builder-css-styles/padding/index.ts
+++ b/packages/builder-css-styles/padding/index.ts
@@ -8,8 +8,13 @@ import { px } from "../dimensions";
type PaddingValue = number | "auto";
-export function padding(p: EdgeInsets): CSSProperties {
- switch (edgeInsetsShorthandMode(p)) {
+export function padding(
+ p: EdgeInsets,
+ options?: {
+ explicit?: boolean;
+ }
+): CSSProperties {
+ switch (edgeInsetsShorthandMode(p, options)) {
case EdgeInsetsShorthandMode.empty: {
return {};
}
@@ -31,10 +36,10 @@ export function padding(p: EdgeInsets): CSSProperties {
case EdgeInsetsShorthandMode.trbl:
default: {
return {
- "padding-bottom": _makeifRequired(p?.bottom),
- "padding-top": _makeifRequired(p?.top),
- "padding-left": _makeifRequired(p?.left),
- "padding-right": _makeifRequired(p?.right),
+ "padding-bottom": _makeifRequired(p?.bottom, options?.explicit),
+ "padding-top": _makeifRequired(p?.top, options?.explicit),
+ "padding-left": _makeifRequired(p?.left, options?.explicit),
+ "padding-right": _makeifRequired(p?.right, options?.explicit),
};
}
}
@@ -55,8 +60,8 @@ function _pv(pv: PaddingValue) {
return px(pv);
}
-function _makeifRequired(val: number): string | undefined {
- if (val && val > 0) {
+function _makeifRequired(val: number, explicit?: boolean): string | undefined {
+ if (explicit || (val && val > 0)) {
return px(val);
}
}
diff --git a/packages/builder-css-styles/text-shadow/index.ts b/packages/builder-css-styles/text-shadow/index.ts
index 676370fe..9b2a722e 100644
--- a/packages/builder-css-styles/text-shadow/index.ts
+++ b/packages/builder-css-styles/text-shadow/index.ts
@@ -3,7 +3,7 @@ import { color } from "../color";
import { px } from "../dimensions";
export function textShadow(ts: TextShadowManifest[]): string {
- if (ts.length === 0) {
+ if (!ts || ts.length === 0) {
return;
}
diff --git a/packages/builder-css-styles/text-transform/index.ts b/packages/builder-css-styles/text-transform/index.ts
new file mode 100644
index 00000000..289f02fb
--- /dev/null
+++ b/packages/builder-css-styles/text-transform/index.ts
@@ -0,0 +1,20 @@
+import { TextTransform } from "@reflect-ui/core";
+
+export function textTransform(tt: TextTransform) {
+ switch (tt) {
+ case TextTransform.capitalize:
+ return "capitalize";
+ case TextTransform.lowercase:
+ return "lowercase";
+ case TextTransform.uppercase:
+ return "uppercase";
+ case TextTransform.fullwidth:
+ return "full-width";
+ case TextTransform.fullsizekana:
+ return "full-size-kana";
+ case TextTransform.none:
+ default:
+ // for none, we don't explicitly set it - to make it shorter.
+ return;
+ }
+}
diff --git a/packages/builder-css-styles/tricks/trick-flex-sizing/index.ts b/packages/builder-css-styles/tricks/trick-flex-sizing/index.ts
index b3553240..33e4604d 100644
--- a/packages/builder-css-styles/tricks/trick-flex-sizing/index.ts
+++ b/packages/builder-css-styles/tricks/trick-flex-sizing/index.ts
@@ -30,6 +30,8 @@ export function flexsizing({
case MainAxisSize.max: {
return {
"align-self": "stretch",
+ width: width && length(width),
+ height: height && length(height),
};
}
case MainAxisSize.min: {
@@ -37,7 +39,7 @@ export function flexsizing({
case Axis.horizontal:
case Axis.vertical:
return {
- flex: "none",
+ flex: flex > 0 ? flex : "none", // 1+
width: width && length(width),
height: height && length(height),
};
diff --git a/packages/builder-react-native/rn-build-inline-style-widget/rn-inline-style-module-builder.ts b/packages/builder-react-native/rn-build-inline-style-widget/rn-inline-style-module-builder.ts
index 379a57fc..74fcd7b9 100644
--- a/packages/builder-react-native/rn-build-inline-style-widget/rn-inline-style-module-builder.ts
+++ b/packages/builder-react-native/rn-build-inline-style-widget/rn-inline-style-module-builder.ts
@@ -11,7 +11,7 @@ import {
} from "@web-builder/react-core";
import {
buildJsx,
- getWidgetStylesConfigMap,
+ StylesConfigMapBuilder,
JSXWithoutStyleElementConfig,
JSXWithStyleElementConfig,
WidgetStyleConfigMap,
@@ -48,7 +48,8 @@ export class ReactNativeInlineStyleBuilder {
private readonly widgetName: string;
readonly config: reactnative_config.ReactNativeInlineStyleConfig;
private readonly namer: ScopedVariableNamer;
- private readonly stylesConfigWidgetMap: WidgetStyleConfigMap;
+ private readonly stylesMapper: StylesConfigMapBuilder;
+ // private readonly stylesConfigWidgetMap: WidgetStyleConfigMap;
constructor({
entry,
@@ -64,7 +65,8 @@ export class ReactNativeInlineStyleBuilder {
entry.key.id,
ReservedKeywordPlatformPresets.react
);
- this.stylesConfigWidgetMap = getWidgetStylesConfigMap(entry, {
+
+ this.stylesMapper = new StylesConfigMapBuilder(entry, {
namer: this.namer,
rename_tag: false,
});
@@ -73,7 +75,7 @@ export class ReactNativeInlineStyleBuilder {
private stylesConfig(
id: string
): JSXWithStyleElementConfig | JSXWithoutStyleElementConfig {
- return this.stylesConfigWidgetMap.get(id);
+ return this.stylesMapper.map.get(id);
}
private jsxBuilder(widget: JsxWidget) {
diff --git a/packages/builder-react-native/rn-build-styled-component-widget/rn-styled-components-module-builder.ts b/packages/builder-react-native/rn-build-styled-component-widget/rn-styled-components-module-builder.ts
index a95de471..1d8d3436 100644
--- a/packages/builder-react-native/rn-build-styled-component-widget/rn-styled-components-module-builder.ts
+++ b/packages/builder-react-native/rn-build-styled-component-widget/rn-styled-components-module-builder.ts
@@ -9,11 +9,7 @@ import {
styled_components_imports,
} from "@web-builder/react-core";
import { JsxWidget } from "@web-builder/core";
-import {
- buildJsx,
- getWidgetStylesConfigMap,
- WidgetStyleConfigMap,
-} from "@web-builder/core/builders";
+import { buildJsx, StylesConfigMapBuilder } from "@web-builder/core/builders";
import {
react as react_config,
reactnative as rn_config,
@@ -28,7 +24,7 @@ import {
export class ReactNativeStyledComponentsModuleBuilder {
private readonly entry: JsxWidget;
private readonly widgetName: string;
- private readonly styledConfigWidgetMap: WidgetStyleConfigMap;
+ private readonly stylesMapper: StylesConfigMapBuilder;
private readonly namer: ScopedVariableNamer;
readonly config: rn_config.ReactNativeStyledComponentsConfig;
@@ -45,17 +41,21 @@ export class ReactNativeStyledComponentsModuleBuilder {
entry.key.id,
ReservedKeywordPlatformPresets.react
);
- this.styledConfigWidgetMap = getWidgetStylesConfigMap(entry, {
+
+ StylesConfigMapBuilder;
+
+ this.stylesMapper = new StylesConfigMapBuilder(entry, {
namer: this.namer,
rename_tag: true /** styled component tag shoule be renamed */,
});
+
this.config = config;
}
private styledConfig(
id: string
): StyledComponentJSXElementConfig | NoStyleJSXElementConfig {
- return this.styledConfigWidgetMap.get(id);
+ return this.stylesMapper.map.get(id);
}
private jsxBuilder(widget: JsxWidget) {
@@ -101,11 +101,10 @@ export class ReactNativeStyledComponentsModuleBuilder {
}
partDeclarations() {
- return Array.from(this.styledConfigWidgetMap.keys())
+ return Array.from(this.stylesMapper.map.keys())
.map((k) => {
- return (
- this.styledConfigWidgetMap.get(k) as StyledComponentJSXElementConfig
- ).styledComponent;
+ return (this.stylesMapper.map.get(k) as StyledComponentJSXElementConfig)
+ .styledComponent;
})
.filter((s) => s);
}
diff --git a/packages/builder-react-native/rn-build-stylesheet-widget/rn-style-sheet-module-builder.ts b/packages/builder-react-native/rn-build-stylesheet-widget/rn-style-sheet-module-builder.ts
index 8ef4d621..24d478b6 100644
--- a/packages/builder-react-native/rn-build-stylesheet-widget/rn-style-sheet-module-builder.ts
+++ b/packages/builder-react-native/rn-build-stylesheet-widget/rn-style-sheet-module-builder.ts
@@ -18,10 +18,9 @@ import {
import { JsxWidget } from "@web-builder/core";
import {
buildJsx,
- getWidgetStylesConfigMap,
+ StylesConfigMapBuilder,
JSXWithoutStyleElementConfig,
JSXWithStyleElementConfig,
- WidgetStyleConfigMap,
} from "@web-builder/core/builders";
import {
react as react_config,
@@ -33,7 +32,7 @@ import { StyleSheetDeclaration } from "../rn-style-sheet";
export class ReactNativeStyleSheetModuleBuilder {
private readonly entry: JsxWidget;
private readonly widgetName: string;
- private readonly stylesConfigWidgetMap: WidgetStyleConfigMap;
+ private readonly stylesMapper: StylesConfigMapBuilder;
private readonly namer: ScopedVariableNamer;
readonly config: rn_config.ReactNativeStyleSheetConfig;
@@ -50,17 +49,19 @@ export class ReactNativeStyleSheetModuleBuilder {
entry.key.id,
ReservedKeywordPlatformPresets.react
);
- this.stylesConfigWidgetMap = getWidgetStylesConfigMap(entry, {
+
+ this.stylesMapper = new StylesConfigMapBuilder(entry, {
namer: this.namer,
rename_tag: false /** rn StyleSheet tag shoule not be renamed */,
});
+
this.config = config;
}
private stylesConfig(
id: string
): JSXWithStyleElementConfig | JSXWithoutStyleElementConfig {
- return this.stylesConfigWidgetMap.get(id);
+ return this.stylesMapper.map.get(id);
}
private jsxBuilder(widget: JsxWidget) {
@@ -136,16 +137,13 @@ export class ReactNativeStyleSheetModuleBuilder {
}
partStyleSheetDeclaration(): StyleSheetDeclaration {
- const styles = Array.from(this.stylesConfigWidgetMap.keys()).reduce(
- (p, c) => {
- const cfg = this.stylesConfig(c);
- return {
- ...p,
- [cfg.id]: "style" in cfg && cfg.style,
- };
- },
- {}
- );
+ const styles = Array.from(this.stylesMapper.map.keys()).reduce((p, c) => {
+ const cfg = this.stylesConfig(c);
+ return {
+ ...p,
+ [cfg.id]: "style" in cfg && cfg.style,
+ };
+ }, {});
return new StyleSheetDeclaration("styles", {
styles: styles,
diff --git a/packages/builder-web-core/builders/build-style-map.ts b/packages/builder-web-core/builders/build-style-map.ts
index 6396a5df..08c96645 100644
--- a/packages/builder-web-core/builders/build-style-map.ts
+++ b/packages/builder-web-core/builders/build-style-map.ts
@@ -2,6 +2,7 @@ import { CSSProperties } from "@coli.codes/css";
import { WidgetKeyId, StylableJsxWidget, JsxWidget } from "@web-builder/core";
import { JSXAttributes, JSXIdentifier, ScopedVariableNamer } from "coli";
import { buildStyledComponentConfig } from "@web-builder/styled";
+import assert from "assert";
export interface JSXWithStyleElementConfig {
id: string;
@@ -21,43 +22,50 @@ export type WidgetStyleConfigMap = Map<
JSXWithStyleElementConfig | JSXWithoutStyleElementConfig
>;
-export function getWidgetStylesConfigMap(
- rootWidget: JsxWidget,
- preferences: {
- namer: ScopedVariableNamer;
- rename_tag: boolean;
+interface StylesConfigMapBuilderPreference {
+ namer: ScopedVariableNamer;
+ rename_tag: boolean;
+}
+
+export class StylesConfigMapBuilder {
+ readonly root: JsxWidget;
+ readonly preferences: StylesConfigMapBuilderPreference;
+ private readonly _map: WidgetStyleConfigMap = new Map();
+ //
+ constructor(root: JsxWidget, preferences: StylesConfigMapBuilderPreference) {
+ this.root = root;
+ this.preferences = preferences;
+
+ this._mapper(this.root);
}
-): WidgetStyleConfigMap {
- const styledConfigWidgetMap: WidgetStyleConfigMap = new Map();
- function mapper(widget: JsxWidget) {
- if (!widget) {
- throw `cannot map trough ${widget}`;
- }
+ private _mapper(widget: JsxWidget) {
+ assert(widget, "widget is required for building style config map");
+
if (widget.jsxConfig().type === "static-tree") {
return;
}
- const isRoot = widget.key.id == rootWidget.key.id;
+ const isRoot = widget.key.id == this.root.key.id;
const id = widget.key.id;
if (widget instanceof StylableJsxWidget) {
const styledConfig = buildStyledComponentConfig(widget, {
transformRootName: true,
- namer: preferences.namer,
- rename_tag: preferences.rename_tag,
+ namer: this.preferences.namer,
+ rename_tag: this.preferences.rename_tag,
context: {
root: isRoot,
},
});
- styledConfigWidgetMap.set(id, styledConfig);
+ this._map.set(id, styledConfig);
}
widget.children?.map((childwidget) => {
- mapper(childwidget);
+ this._mapper(childwidget);
});
}
- mapper(rootWidget);
-
- return styledConfigWidgetMap;
+ public get map(): WidgetStyleConfigMap {
+ return this._map;
+ }
}
diff --git a/packages/builder-web-core/widget-core/widget-with-style.ts b/packages/builder-web-core/widget-core/widget-with-style.ts
index b3ff95a4..16d8171b 100644
--- a/packages/builder-web-core/widget-core/widget-with-style.ts
+++ b/packages/builder-web-core/widget-core/widget-with-style.ts
@@ -1,5 +1,5 @@
import { JsxWidget, IMultiChildJsxWidget, JSXElementConfig } from ".";
-import { CSSProperties } from "@coli.codes/css";
+import { ElementCssProperties, ElementCssStyleData } from "@coli.codes/css";
import {
Color,
DimensionLength,
@@ -15,13 +15,13 @@ import { WidgetKey } from "../widget-key";
import { positionAbsolute } from "@web-builder/styles";
export interface IWidgetWithStyle {
- styleData(): CSSProperties;
+ styleData(): ElementCssStyleData;
}
/**
* Since html based framework's widget can be represented withou any style definition, this WidgetWithStyle class indicates, that the sub instance of this class will contain style data within it.
*/
-export abstract class WidgetWithStyle
+export abstract class WidgetWithStyle
extends JsxWidget
implements
IWHStyleWidget,
@@ -81,8 +81,8 @@ export abstract class WidgetWithStyle
abstract jsxConfig(): JSXElementConfig;
- private extendedStyle: CSSProperties = {};
- extendStyle(style: T) {
+ private extendedStyle: ElementCssProperties = {};
+ extendStyle(style: T) {
this.extendedStyle = {
...this.extendedStyle,
...style,
@@ -102,7 +102,7 @@ export abstract class MultiChildWidgetWithStyle
constructor({ key }: { key: WidgetKey }) {
super({ key: key });
}
- abstract styleData(): CSSProperties;
+ abstract styleData(): ElementCssStyleData;
abstract jsxConfig(): JSXElementConfig;
}
diff --git a/packages/builder-web-core/widgets-native/flex/index.ts b/packages/builder-web-core/widgets-native/flex/index.ts
index cb37a797..b21d1987 100644
--- a/packages/builder-web-core/widgets-native/flex/index.ts
+++ b/packages/builder-web-core/widgets-native/flex/index.ts
@@ -124,13 +124,15 @@ export class Flex extends MultiChildWidget implements CssMinHeightMixin {
...css.justifyContent(this.mainAxisAlignment),
"flex-direction": direction(this.direction),
"align-items": flex_align_items(this.crossAxisAlignment),
- flex: this.flex,
+ flex: this.flex > 0 ? this.flex : undefined,
"flex-wrap": this.flexWrap,
gap:
// if justify-content is set to space-between, do not set the gap.
this.mainAxisAlignment == MainAxisAlignment.spaceBetween
? undefined
- : this.itemSpacing && css.px(this.itemSpacing),
+ : this.itemSpacing > 0
+ ? css.px(this.itemSpacing)
+ : undefined,
"box-shadow": css.boxshadow(...(this.boxShadow ?? [])),
...css.border(this.border),
...css.borderRadius(this.borderRadius),
diff --git a/packages/builder-web-core/widgets-native/html-button/index.ts b/packages/builder-web-core/widgets-native/html-button/index.ts
index d55d7f81..26e69324 100644
--- a/packages/builder-web-core/widgets-native/html-button/index.ts
+++ b/packages/builder-web-core/widgets-native/html-button/index.ts
@@ -1,29 +1,196 @@
-import { JSXElementConfig, WidgetKey } from "@web-builder/core";
-import { JSX, JSXAttribute, Snippet } from "coli";
-import { ReactWidget } from "..";
+import type { CSSProperties, ElementCssStyleData } from "@coli.codes/css";
+import type { JSXElementConfig, StylableJsxWidget } from "@web-builder/core";
+import type {
+ IButtonStyleButton,
+ IButtonStyleButtonProps,
+ ITextStyle,
+ ButtonStyle,
+ IWHStyleWidget,
+ Widget,
+} from "@reflect-ui/core";
+import { Text } from "@reflect-ui/core";
+import { Container } from "..";
+import { WidgetKey } from "../../widget-key";
+import { JSX } from "coli";
+import * as css from "@web-builder/styles";
-export class Button extends ReactWidget {
- constructor({ key }: { key: WidgetKey }) {
- super({ key });
- }
+/**
+ * Html5 Button Will have built in support for...
+ *
+ *
+ * - onClick callback
+ * - hover styles
+ * - focus styles
+ * - disabled styles
+ * - active styles
+ *
+ *
+ * Learn more at
+ * - [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button)
+ * - [html spec](https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element)
+ *
+ */
+export class HtmlButton extends Container implements IButtonStyleButton {
+ _type = "button";
+
+ /**
+ * The name of the button, submitted as a pair with the button’s value as part of the form data, when that button is used to submit the form.
+ */
+ name?: string;
+
+ /**
+ * The default behavior of the button. Possible values are:
+ * - `submit`: The button submits the form data to the server. This is the default if the attribute is not specified for buttons associated with a