diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 118f97f..73bbdb3 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -40,5 +40,9 @@ module.exports = { "no-await-in-loop": 1, // sometimes it's easier to debug when requests run sequentially }, }, + { + files: ["*.stimulus.ts", "src/front/*.ts"], + env: { browser: true }, + }, ], }; diff --git a/src/back/routes/component-preview/component-debugger.stimulus.ts b/src/back/routes/component-preview/component-debugger.stimulus.ts index fb8aad2..8597496 100644 --- a/src/back/routes/component-preview/component-debugger.stimulus.ts +++ b/src/back/routes/component-preview/component-debugger.stimulus.ts @@ -56,11 +56,22 @@ export default class ComponentDebugger extends Controller { resizeHandler(e: MouseEvent) { const width_offset = this.origin_x - e.clientX; - const new_width = Math.max(this.origin_width + width_offset, 1); - document - .getElementById("component-debugger") - .style.setProperty("--resizable-column-width", new_width.toString() + "px"); + this.setPreviewWidth(new_width); this.update_width_display(); } + + setPreviewWidth(width: number) { + document + .getElementById("component-debugger") + .style.setProperty("--resizable-column-width", width.toString() + "px"); + this.update_width_display(); + } + + handleWidthDropdown() { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const dropdown = this.targets.find("size-select") as HTMLSelectElement; + const value = dropdown.value; + this.setPreviewWidth(parseInt(value)); + } } diff --git a/src/back/routes/component-preview/component-preview-actions.ts b/src/back/routes/component-preview/component-preview-actions.ts index 50c3ffe..374f763 100644 --- a/src/back/routes/component-preview/component-preview-actions.ts +++ b/src/back/routes/component-preview/component-preview-actions.ts @@ -1,5 +1,4 @@ import { isTableData, isTableRegularRow, TableData } from "@sealcode/jdd"; -import { is, predicates } from "@sealcode/ts-predicates"; import objectPath from "object-path"; import { registry } from "../../jdd-components/components.js"; import type { ComponentPreviewState } from "../components.sreact.js"; @@ -105,10 +104,15 @@ export const ComponentPreviewActions = { empty_value: unknown ) => { const component_args = state.component_args; - const tableData = objectPath.get(component_args, arg_path); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const tableData: TableData = objectPath.get( + component_args, + arg_path + ); if (!isTableData(tableData)) { throw new Error("wrong table data"); } + // eslint-disable-next-line @typescript-eslint/no-for-in-array for (const i in tableData.rows) { const row = tableData.rows[i]; if (isTableRegularRow(row)) { @@ -129,10 +133,15 @@ export const ComponentPreviewActions = { column_index_to_remove: number ) => { const component_args = state.component_args; - const tableData = objectPath.get(component_args, arg_path); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const tableData: TableData = objectPath.get( + component_args, + arg_path + ); if (!isTableData(tableData)) { throw new Error("wrong table data"); } + // eslint-disable-next-line @typescript-eslint/no-for-in-array for (const i in tableData.rows) { const row = tableData.rows[i]; if (isTableRegularRow(row)) { @@ -202,4 +211,12 @@ export const ComponentPreviewActions = { }; return result; }, + + change_size: (state: ComponentPreviewState, inputs: Record) => { + return { + ...state, + ...inputs, + current_size: inputs.size, + }; + }, }; diff --git a/src/back/routes/components.css b/src/back/routes/components.css index 0f4a1dc..c19070c 100644 --- a/src/back/routes/components.css +++ b/src/back/routes/components.css @@ -80,3 +80,13 @@ transition: all 150ms; } } + +@media (scripting: none) { + body { + min-width: max-content; + } +} + +.component-preview-size-select { + margin-left: 10px; +} diff --git a/src/back/routes/components.sreact.tsx b/src/back/routes/components.sreact.tsx index 8bb9d7f..9551020 100644 --- a/src/back/routes/components.sreact.tsx +++ b/src/back/routes/components.sreact.tsx @@ -14,6 +14,7 @@ export const actionName = "Components"; export type ComponentPreviewState = { component: string; component_args: Record; + current_size?: string; }; export default new (class ComponentsPage extends StatefulPage< @@ -107,6 +108,8 @@ export default new (class ComponentsPage extends StatefulPage< return overrides; } + containerSizes = ["320", "600", "800", "1024", "1300", "1920"]; + render(_ctx: BaseContext, state: ComponentPreviewState) { const all_components = registry.getAll(); const component = @@ -162,6 +165,25 @@ export default new (class ComponentsPage extends StatefulPage< Preview{" "} + + {render( registry,