efficient-web-builder 1.0.0 → 2.0.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.
- package/CHANGELOG.md +30 -0
- package/README.md +2 -1
- package/dist/components/AddBlockRow.d.ts +1 -7
- package/dist/components/AddBlockRow.js +1 -1
- package/dist/components/AddChildRow.d.ts +1 -6
- package/dist/components/AddChildRow.js +1 -1
- package/dist/components/AddSidePanel.d.ts +2 -39
- package/dist/components/AddSidePanel.js +1 -1
- package/dist/components/BlockGapField.js +1 -1
- package/dist/components/BlogPostSource.js +1 -1
- package/dist/components/CardShadowField.js +1 -1
- package/dist/components/ChatSettingsPanel.js +1 -1
- package/dist/components/CornersField.d.ts +0 -1
- package/dist/components/CornersField.js +1 -1
- package/dist/components/DuplicateToPageMenu.js +1 -1
- package/dist/components/EditorScreenMount.d.ts +1 -0
- package/dist/components/EditorScreenMount.js +1 -0
- package/dist/components/EditorStoreProvider.d.ts +1 -0
- package/dist/components/EditorStoreProvider.js +1 -0
- package/dist/components/HeroImageField.js +1 -1
- package/dist/components/HeroSection.d.ts +2 -6
- package/dist/components/HeroSection.js +4 -4
- package/dist/components/HoverEffectField.js +1 -1
- package/dist/components/ImageFocusRow.js +1 -1
- package/dist/components/KeepHint.d.ts +5 -0
- package/dist/components/KeepHint.js +1 -0
- package/dist/components/LocationsGroupedField.js +1 -1
- package/dist/components/MediaSidePanel.d.ts +1 -6
- package/dist/components/MediaSidePanel.js +1 -1
- package/dist/components/MediaUploadField.js +1 -1
- package/dist/components/MultiSelectField.d.ts +4 -1
- package/dist/components/MultiSelectField.js +1 -1
- package/dist/components/NodeContextMenu.d.ts +2 -96
- package/dist/components/NodeContextMenu.js +1 -1
- package/dist/components/PageEditGuardNotices.d.ts +1 -1
- package/dist/components/PageEditGuardNotices.js +1 -1
- package/dist/components/PanelToggleIcon.d.ts +1 -3
- package/dist/components/PanelToggleIcon.js +1 -1
- package/dist/components/PartSettingsPanel.d.ts +5 -0
- package/dist/components/PartSettingsPanel.js +1 -1
- package/dist/components/PhotographyField.js +1 -1
- package/dist/components/PreviewDeviceContext.d.ts +2 -4
- package/dist/components/PreviewDeviceContext.js +1 -1
- package/dist/components/PreviewPartsContext.d.ts +1 -3
- package/dist/components/PreviewPartsContext.js +1 -1
- package/dist/components/SearchSelectField.d.ts +3 -1
- package/dist/components/SearchSelectField.js +1 -1
- package/dist/components/SectionEditor.d.ts +2 -5
- package/dist/components/SectionEditor.js +1 -1
- package/dist/components/SectionEditorShell.d.ts +1 -1
- package/dist/components/SectionEditorShell.js +1 -1
- package/dist/components/SectionThemePicker.d.ts +3 -1
- package/dist/components/SectionThemePicker.js +1 -1
- package/dist/components/ShadowColourField.js +1 -1
- package/dist/components/SidePanelHead.d.ts +1 -23
- package/dist/components/SidePanelHead.js +1 -1
- package/dist/components/SideSpaceField.d.ts +0 -1
- package/dist/components/SideSpaceField.js +1 -1
- package/dist/components/SiteEditorProvider.d.ts +3 -10
- package/dist/components/SiteEditorProvider.js +1 -1
- package/dist/components/SiteWidthField.d.ts +0 -1
- package/dist/components/SiteWidthField.js +1 -1
- package/dist/components/SlotChildActionsContext.d.ts +2 -13
- package/dist/components/SlotChildActionsContext.js +1 -1
- package/dist/components/SocialLinksPanel.js +1 -1
- package/dist/components/SourceStatus.js +1 -1
- package/dist/components/StandaloneSectionEditor.d.ts +1 -0
- package/dist/components/StandaloneSectionEditor.js +1 -1
- package/dist/components/StorefrontDocumentContext.d.ts +2 -67
- package/dist/components/StorefrontDocumentContext.js +1 -1
- package/dist/components/StorefrontEditor.d.ts +1 -0
- package/dist/components/StorefrontEditor.js +1 -1
- package/dist/components/StorefrontEditorChrome.d.ts +1 -1
- package/dist/components/StorefrontEditorChrome.js +1 -1
- package/dist/components/StorefrontLinkField.d.ts +9 -0
- package/dist/components/StorefrontLinkField.js +1 -1
- package/dist/components/ThemeField.js +1 -1
- package/dist/components/TickerSettingsPanel.js +1 -1
- package/dist/components/UiIcon.d.ts +2 -10
- package/dist/components/UiIcon.js +1 -1
- package/dist/components/WebsiteScreenParts.d.ts +2 -0
- package/dist/components/WebsiteScreenParts.js +1 -0
- package/dist/components/WidthFollowField.js +1 -1
- package/dist/components/panel-widths.d.ts +2 -12
- package/dist/components/panel-widths.js +1 -1
- package/dist/components/storefront-editor.css +125 -986
- package/dist/components/useFooterFocus.d.ts +2 -0
- package/dist/components/useFooterFocus.js +1 -0
- package/dist/components/useLocationsTree.d.ts +6 -0
- package/dist/components/useLocationsTree.js +1 -0
- package/dist/components/usePartBridge.d.ts +1 -9
- package/dist/components/usePartBridge.js +1 -1
- package/dist/components/usePinnedChromeSeed.d.ts +2 -0
- package/dist/components/usePinnedChromeSeed.js +1 -0
- package/dist/components/useSocialSettings.js +1 -1
- package/dist/components/useStorefrontBlogPosts.js +1 -1
- package/dist/lib/client-only.d.ts +1 -0
- package/dist/lib/client-only.js +1 -0
- package/dist/lib/content/view-tiers.d.ts +2 -6
- package/dist/lib/content/view-tiers.js +1 -1
- package/dist/lib/editor-admin-bridge.d.ts +2 -29
- package/dist/lib/editor-admin-bridge.js +1 -1
- package/dist/lib/editor-backend-error.d.ts +2 -0
- package/dist/lib/editor-backend-error.js +1 -0
- package/dist/lib/editor-blocks.d.ts +2 -2
- package/dist/lib/editor-chrome.d.ts +2 -52
- package/dist/lib/editor-chrome.js +1 -1
- package/dist/lib/editor-document-adapter.d.ts +3 -51
- package/dist/lib/editor-document-adapter.js +1 -1
- package/dist/lib/editor-document-addressing.d.ts +2 -0
- package/dist/lib/editor-document-addressing.js +1 -0
- package/dist/lib/editor-document-contract.d.ts +1 -0
- package/dist/lib/editor-document-contract.js +0 -0
- package/dist/lib/editor-document-hooks.d.ts +1 -15
- package/dist/lib/editor-document-switch.d.ts +2 -0
- package/dist/lib/editor-document-switch.js +1 -0
- package/dist/lib/editor-failure.d.ts +1 -4
- package/dist/lib/editor-failure.js +1 -1
- package/dist/lib/editor-host-inbound.d.ts +1 -1
- package/dist/lib/editor-host-inbound.js +1 -1
- package/dist/lib/editor-host.d.ts +2 -135
- package/dist/lib/editor-host.js +1 -1
- package/dist/lib/editor-key-scope.d.ts +1 -3
- package/dist/lib/editor-key-scope.js +1 -1
- package/dist/lib/editor-load-error.d.ts +1 -4
- package/dist/lib/editor-load-error.js +1 -1
- package/dist/lib/editor-media-panel.d.ts +2 -23
- package/dist/lib/editor-media-panel.js +1 -1
- package/dist/lib/editor-media-picker.d.ts +2 -12
- package/dist/lib/editor-media-picker.js +1 -1
- package/dist/lib/editor-page-lock.d.ts +1 -1
- package/dist/lib/editor-page-lock.js +1 -1
- package/dist/lib/editor-screen.d.ts +2 -0
- package/dist/lib/editor-screen.js +1 -0
- package/dist/lib/editor-section-templates.d.ts +1 -2
- package/dist/lib/editor-section-templates.js +1 -1
- package/dist/lib/editor-session-context.d.ts +1 -7
- package/dist/lib/editor-session-context.js +1 -1
- package/dist/lib/editor-session.d.ts +2 -45
- package/dist/lib/editor-session.js +1 -1
- package/dist/lib/editor-site-slug.js +1 -1
- package/dist/lib/editor-theme.d.ts +1 -1
- package/dist/lib/editor-theme.js +1 -1
- package/dist/lib/hero-arrows.d.ts +1 -1
- package/dist/lib/links/link-filters.d.ts +1 -0
- package/dist/lib/links/link-filters.js +0 -0
- package/dist/lib/links/link-picker-setup.d.ts +29 -0
- package/dist/lib/links/link-picker-setup.js +1 -0
- package/dist/lib/puck/ColourControl.d.ts +4 -1
- package/dist/lib/puck/ColourControl.js +1 -1
- package/dist/lib/puck/add-palette.d.ts +3 -9
- package/dist/lib/puck/add-palette.js +1 -1
- package/dist/lib/puck/add-target-types.d.ts +1 -0
- package/dist/lib/puck/add-target-types.js +0 -0
- package/dist/lib/puck/add-target.d.ts +2 -9
- package/dist/lib/puck/block-choice.d.ts +2 -0
- package/dist/lib/puck/block-choice.js +1 -0
- package/dist/lib/puck/block-offer.js +1 -1
- package/dist/lib/puck/block-types-in.d.ts +1 -1
- package/dist/lib/puck/block-types-in.js +1 -1
- package/dist/lib/puck/blocks/general/index.d.ts +2 -2
- package/dist/lib/puck/content-tree.d.ts +2 -43
- package/dist/lib/puck/content-tree.js +1 -1
- package/dist/lib/puck/controls.d.ts +11 -22
- package/dist/lib/puck/controls.js +1 -1
- package/dist/lib/puck/device-fields.d.ts +2 -24
- package/dist/lib/puck/device-fields.js +1 -1
- package/dist/lib/puck/field-buckets.d.ts +2 -0
- package/dist/lib/puck/field-buckets.js +1 -0
- package/dist/lib/puck/field-groups.d.ts +3 -3
- package/dist/lib/puck/field-groups.js +1 -1
- package/dist/lib/puck/field-markers.d.ts +2 -16
- package/dist/lib/puck/field-markers.js +1 -1
- package/dist/lib/puck/footer-block-row-name.d.ts +4 -0
- package/dist/lib/puck/footer-block-row-name.js +1 -0
- package/dist/lib/puck/footer-blocks.d.ts +2 -10
- package/dist/lib/puck/footer-blocks.js +1 -1
- package/dist/lib/puck/hidable.d.ts +2 -9
- package/dist/lib/puck/hidable.js +1 -1
- package/dist/lib/puck/palette-sections.d.ts +2 -0
- package/dist/lib/puck/palette-sections.js +1 -0
- package/dist/lib/puck/panel-fields.d.ts +2 -12
- package/dist/lib/puck/panel-fields.js +1 -1
- package/dist/lib/puck/panel-no-control-mark.d.ts +2 -7
- package/dist/lib/puck/panel-no-control-mark.js +1 -1
- package/dist/lib/puck/part-id.d.ts +1 -0
- package/dist/lib/puck/part-id.js +1 -0
- package/dist/lib/puck/pinned-seed-gate.d.ts +2 -12
- package/dist/lib/puck/pinned-seed-gate.js +1 -1
- package/dist/lib/puck/preview-click.d.ts +1 -2
- package/dist/lib/puck/preview-click.js +1 -1
- package/dist/lib/puck/preview-dom.d.ts +1 -6
- package/dist/lib/puck/preview-dom.js +1 -1
- package/dist/lib/puck/preview-events.d.ts +2 -0
- package/dist/lib/puck/preview-events.js +1 -0
- package/dist/lib/puck/preview-selection-context.d.ts +2 -19
- package/dist/lib/puck/preview-selection-context.js +1 -1
- package/dist/lib/puck/section-doc.d.ts +1 -5
- package/dist/lib/puck/section-doc.js +1 -1
- package/dist/lib/puck/section-groups.d.ts +1 -1
- package/dist/lib/puck/slot-child-name.d.ts +2 -8
- package/dist/lib/puck/slot-child-name.js +1 -1
- package/dist/lib/puck/slot-heal.d.ts +1 -2
- package/dist/lib/puck/slot-heal.js +1 -1
- package/dist/lib/puck/slot-section-spec.d.ts +1 -0
- package/dist/lib/puck/slot-section-spec.js +0 -0
- package/dist/lib/puck/slot-specs.d.ts +2 -13
- package/dist/lib/puck/style-clipboard.d.ts +1 -19
- package/dist/lib/puck/style-clipboard.js +1 -1
- package/dist/lib/puck/text-control-kinds.d.ts +2 -13
- package/dist/lib/puck/text-control-kinds.js +1 -1
- package/dist/lib/puck/text-parts.d.ts +2 -5
- package/dist/lib/puck/text-parts.js +1 -1
- package/dist/lib/puck/tree-reveal.d.ts +1 -11
- package/dist/lib/puck/tree-reveal.js +1 -1
- package/dist/lib/puck/use-section-ops.d.ts +2 -25
- package/dist/lib/puck/use-section-ops.js +1 -1
- package/dist/lib/reel.d.ts +1 -1
- package/dist/lib/section-template-types.d.ts +1 -21
- package/dist/lib/sections/new-section-node.d.ts +2 -0
- package/dist/lib/sections/new-section-node.js +1 -0
- package/dist/lib/source-rules/accent-token-name.d.ts +20 -0
- package/dist/lib/source-rules/accent-token-name.js +4 -0
- package/dist/lib/source-rules/button-corners.d.ts +13 -0
- package/dist/lib/source-rules/button-corners.js +2 -0
- package/dist/lib/source-rules/editor-chrome-note.d.ts +16 -0
- package/dist/lib/source-rules/editor-chrome-note.js +13 -0
- package/dist/lib/source-rules/editor-context-menu.d.ts +5 -0
- package/dist/lib/source-rules/editor-context-menu.js +4 -0
- package/dist/lib/source-rules/editor-puck-drag-off.d.ts +8 -0
- package/dist/lib/source-rules/editor-puck-drag-off.js +4 -0
- package/dist/lib/source-rules/efficient-easel-version.d.ts +9 -0
- package/dist/lib/source-rules/efficient-easel-version.js +2 -0
- package/dist/lib/source-rules/every-button-follows-the-button-colour.d.ts +12 -0
- package/dist/lib/source-rules/every-button-follows-the-button-colour.js +7 -0
- package/dist/lib/source-rules/flat-theme-palette.d.ts +10 -0
- package/dist/lib/source-rules/flat-theme-palette.js +8 -0
- package/dist/lib/source-rules/full-width-means-full.d.ts +8 -0
- package/dist/lib/source-rules/full-width-means-full.js +2 -0
- package/dist/lib/source-rules/heading-ceiling-sweep.d.ts +11 -0
- package/dist/lib/source-rules/heading-ceiling-sweep.js +8 -0
- package/dist/lib/source-rules/label-hints.d.ts +7 -0
- package/dist/lib/source-rules/label-hints.js +5 -0
- package/dist/lib/source-rules/label-vocabulary.d.ts +14 -0
- package/dist/lib/source-rules/label-vocabulary.js +5 -0
- package/dist/lib/source-rules/mirrored-rows-agree.d.ts +19 -0
- package/dist/lib/source-rules/mirrored-rows-agree.js +10 -0
- package/dist/lib/source-rules/no-comment-in-jsx.d.ts +9 -0
- package/dist/lib/source-rules/no-comment-in-jsx.js +7 -0
- package/dist/lib/source-rules/no-glyph-rows.d.ts +15 -0
- package/dist/lib/source-rules/no-glyph-rows.js +4 -0
- package/dist/lib/source-rules/one-colour-control.d.ts +7 -0
- package/dist/lib/source-rules/one-colour-control.js +2 -0
- package/dist/lib/source-rules/one-dropdown.d.ts +10 -0
- package/dist/lib/source-rules/one-dropdown.js +4 -0
- package/dist/lib/source-rules/one-editable-list.d.ts +16 -0
- package/dist/lib/source-rules/one-editable-list.js +6 -0
- package/dist/lib/source-rules/one-editor-list.d.ts +7 -0
- package/dist/lib/source-rules/one-editor-list.js +3 -0
- package/dist/lib/source-rules/one-right-click.d.ts +10 -0
- package/dist/lib/source-rules/one-right-click.js +2 -0
- package/dist/lib/source-rules/one-switch.d.ts +9 -0
- package/dist/lib/source-rules/one-switch.js +7 -0
- package/dist/lib/source-rules/one-up-level-link.d.ts +16 -0
- package/dist/lib/source-rules/one-up-level-link.js +18 -0
- package/dist/lib/source-rules/panel-colour-tokens.d.ts +48 -0
- package/dist/lib/source-rules/panel-colour-tokens.js +20 -0
- package/dist/lib/source-rules/panel-no-divider-lines.d.ts +14 -0
- package/dist/lib/source-rules/panel-no-divider-lines.js +10 -0
- package/dist/lib/source-rules/panel-one-arrow.d.ts +21 -0
- package/dist/lib/source-rules/panel-one-arrow.js +1 -0
- package/dist/lib/source-rules/panel-one-hover.d.ts +8 -0
- package/dist/lib/source-rules/panel-one-hover.js +2 -0
- package/dist/lib/source-rules/panel-rows-use-the-shared-row.d.ts +23 -0
- package/dist/lib/source-rules/panel-rows-use-the-shared-row.js +22 -0
- package/dist/lib/source-rules/part-slider-fills-row.d.ts +11 -0
- package/dist/lib/source-rules/part-slider-fills-row.js +29 -0
- package/dist/lib/source-rules/part-style-naming.d.ts +10 -0
- package/dist/lib/source-rules/part-style-naming.js +2 -0
- package/dist/lib/source-rules/puck-document-surfaces.d.ts +16 -0
- package/dist/lib/source-rules/puck-document-surfaces.js +8 -0
- package/dist/lib/source-rules/reduced-motion.d.ts +26 -0
- package/dist/lib/source-rules/reduced-motion.js +9 -0
- package/dist/lib/source-rules/route-content-width.d.ts +22 -0
- package/dist/lib/source-rules/route-content-width.js +5 -0
- package/dist/lib/source-rules/rule.d.ts +21 -0
- package/dist/lib/source-rules/rule.js +1 -0
- package/dist/lib/source-rules/section-theme-preview.d.ts +9 -0
- package/dist/lib/source-rules/section-theme-preview.js +8 -0
- package/dist/lib/source-rules/site-gutter.d.ts +6 -0
- package/dist/lib/source-rules/site-gutter.js +4 -0
- package/dist/lib/source-rules/site-square-by-default.d.ts +17 -0
- package/dist/lib/source-rules/site-square-by-default.js +3 -0
- package/dist/lib/source-rules/site-width.d.ts +11 -0
- package/dist/lib/source-rules/site-width.js +7 -0
- package/dist/lib/source-rules/size-token-paints.d.ts +8 -0
- package/dist/lib/source-rules/size-token-paints.js +11 -0
- package/dist/lib/source-rules/social-icons-import.d.ts +6 -0
- package/dist/lib/source-rules/social-icons-import.js +6 -0
- package/dist/lib/source-rules/source-status-is-shared.d.ts +7 -0
- package/dist/lib/source-rules/source-status-is-shared.js +1 -0
- package/dist/lib/source-rules/style-face-matches-size.d.ts +10 -0
- package/dist/lib/source-rules/style-face-matches-size.js +4 -0
- package/dist/lib/source-rules/support/accent-rename-bytes.d.ts +5 -0
- package/dist/lib/source-rules/support/accent-rename-bytes.js +1 -0
- package/dist/lib/source-rules/support/css-box-model.d.ts +5 -0
- package/dist/lib/source-rules/support/css-box-model.js +1 -0
- package/dist/lib/source-rules/support/css-length.d.ts +2 -0
- package/dist/lib/source-rules/support/css-length.js +1 -0
- package/dist/lib/source-rules/support/css-rules.d.ts +12 -0
- package/dist/lib/source-rules/support/css-rules.js +1 -0
- package/dist/lib/source-rules/support/css-source.d.ts +2 -0
- package/dist/lib/source-rules/support/css-source.js +3 -0
- package/dist/lib/source-rules/support/label-extraction.d.ts +14 -0
- package/dist/lib/source-rules/support/label-extraction.js +5 -0
- package/dist/lib/source-rules/support/panel-select-cascade.d.ts +72 -0
- package/dist/lib/source-rules/support/panel-select-cascade.js +2 -0
- package/dist/lib/source-rules/support/part-slider-call-sites.d.ts +9 -0
- package/dist/lib/source-rules/support/part-slider-call-sites.js +17 -0
- package/dist/lib/source-rules/support/registry-source.d.ts +14 -0
- package/dist/lib/source-rules/support/registry-source.js +3 -0
- package/dist/lib/source-rules/support/ts-source.d.ts +2 -0
- package/dist/lib/source-rules/support/ts-source.js +3 -0
- package/dist/lib/source-rules/theme-mode-controls-gone.d.ts +10 -0
- package/dist/lib/source-rules/theme-mode-controls-gone.js +5 -0
- package/dist/lib/source-rules/upload-intake-guard.d.ts +11 -0
- package/dist/lib/source-rules/upload-intake-guard.js +6 -0
- package/dist/lib/source-rules/word-styles.d.ts +8 -0
- package/dist/lib/source-rules/word-styles.js +4 -0
- package/dist/lib/theme-row-persist.js +1 -1
- package/dist/lib/theme-save-message.js +1 -1
- package/dist/lib/web-backend.d.ts +4 -59
- package/dist/lib/web-backend.js +1 -1
- package/dist/lib/website-document-addressing.d.ts +2 -0
- package/dist/lib/website-document-addressing.js +1 -0
- package/dist/lib/website-host-inbound.d.ts +1 -0
- package/dist/lib/website-host-inbound.js +1 -0
- package/dist/lib/website-session.d.ts +5 -0
- package/dist/lib/website-session.js +1 -0
- package/package.json +15 -5
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type * as TS from "typescript";
|
|
2
|
+
import type { SourceFile } from "../rule.js";
|
|
3
|
+
import type { Rule } from "./css-rules.js";
|
|
4
|
+
export declare function importsOf(ts: typeof TS, file: SourceFile): string[];
|
|
5
|
+
export type PanelSelect = {
|
|
6
|
+
file: string;
|
|
7
|
+
line: number;
|
|
8
|
+
kind: string;
|
|
9
|
+
engineDrawn: boolean;
|
|
10
|
+
classes: string[];
|
|
11
|
+
};
|
|
12
|
+
export type SelectHelper = {
|
|
13
|
+
readonly file: string;
|
|
14
|
+
readonly modules?: readonly string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function census(ts: typeof TS, files: readonly SourceFile[], helper: SelectHelper): {
|
|
17
|
+
population: PanelSelect[];
|
|
18
|
+
helperDeclared: boolean;
|
|
19
|
+
};
|
|
20
|
+
export type Shape = {
|
|
21
|
+
name: string;
|
|
22
|
+
own: string[];
|
|
23
|
+
ancestors: string[];
|
|
24
|
+
rows: number;
|
|
25
|
+
};
|
|
26
|
+
export type Spec = [number, number, number];
|
|
27
|
+
export declare const specCmp: (a: Spec, b: Spec) => number;
|
|
28
|
+
export declare const specStr: (s: Spec) => string;
|
|
29
|
+
export type State = "rest" | "hover";
|
|
30
|
+
export declare function splitDecls(body: string): {
|
|
31
|
+
prop: string;
|
|
32
|
+
value: string;
|
|
33
|
+
}[];
|
|
34
|
+
export declare function splitCombinators(sel: string): string[];
|
|
35
|
+
export type Compound = {
|
|
36
|
+
type: string | null;
|
|
37
|
+
classes: string[];
|
|
38
|
+
needsState: string[];
|
|
39
|
+
};
|
|
40
|
+
export declare function compound(src: string): Compound | null;
|
|
41
|
+
export declare const specOf: (parts: Compound[]) => Spec;
|
|
42
|
+
export declare function mediaHolds(cond: string | null): boolean | null;
|
|
43
|
+
export declare const mediaLabel: (cond: string | null) => string;
|
|
44
|
+
export type Applied = {
|
|
45
|
+
spec: Spec;
|
|
46
|
+
order: number;
|
|
47
|
+
decls: string;
|
|
48
|
+
selector: string;
|
|
49
|
+
sheet: string;
|
|
50
|
+
};
|
|
51
|
+
export type Undecided = {
|
|
52
|
+
sheet: string;
|
|
53
|
+
selector: string;
|
|
54
|
+
media: string;
|
|
55
|
+
decls: string;
|
|
56
|
+
};
|
|
57
|
+
export declare function applicable(rules: Rule[], shape: Shape, sheet: string, base: number, state?: State): {
|
|
58
|
+
applied: Applied[];
|
|
59
|
+
unreadable: string[];
|
|
60
|
+
undecided: Undecided[];
|
|
61
|
+
};
|
|
62
|
+
export declare const INITIAL: Record<string, string>;
|
|
63
|
+
export declare function colorIn(value: string): string | null;
|
|
64
|
+
export declare function readVars(css: string): Map<string, string>;
|
|
65
|
+
export declare function derefVars(value: string, vars: Map<string, string>, depth?: number): string;
|
|
66
|
+
export declare function resolve(applied: Applied[], prop: string, vars?: Map<string, string>): {
|
|
67
|
+
value: string;
|
|
68
|
+
from: string;
|
|
69
|
+
};
|
|
70
|
+
export declare const ANCESTORS: string[];
|
|
71
|
+
export declare function deriveShapes(population: PanelSelect[], panelCss: string): Shape[];
|
|
72
|
+
export declare function chainInMarkup(ts: typeof TS, files: readonly SourceFile[], chain: string[]): Map<string, string[]>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function N(t,i){const r=t.createSourceFile(i.path,i.text,t.ScriptTarget.Latest,!0),s=[],n=o=>{(t.isImportDeclaration(o)||t.isExportDeclaration(o))&&o.moduleSpecifier&&t.isStringLiteral(o.moduleSpecifier)&&s.push(o.moduleSpecifier.text),t.isCallExpression(o)&&(o.expression.kind===t.SyntaxKind.ImportKeyword||t.isIdentifier(o.expression)&&o.expression.text==="require")&&o.arguments.length>0&&t.isStringLiteral(o.arguments[0])&&s.push(o.arguments[0].text),o.forEachChild(n)};return n(r),s}const k=t=>/\.(tsx?|mts)$/.test(t)&&!t.endsWith(".d.ts");function L(t,i){const r=new Map,s=new Set(["/"]);for(const e of i){if(!k(e.path))continue;r.set(`/${e.path}`,e.text);const c=e.path.split("/");for(let u=1;u<c.length;u++)s.add(`/${c.slice(0,u).join("/")}`)}const n={noLib:!0,types:[],noEmit:!0,jsx:t.JsxEmit.Preserve,target:t.ScriptTarget.ESNext,module:t.ModuleKind.ESNext,moduleResolution:t.ModuleResolutionKind.Bundler,baseUrl:"/",paths:{"@/*":["./*"]}},o={fileExists:e=>r.has(e),readFile:e=>r.get(e),directoryExists:e=>s.has(e.replace(/\/+$/,"")||"/"),getDirectories:()=>[],realpath:e=>e,getSourceFile:(e,c)=>{const u=r.get(e);return u===void 0?void 0:t.createSourceFile(e,u,c,!0)},getDefaultLibFileName:()=>"/lib.d.ts",writeFile:()=>{},getCurrentDirectory:()=>"/",getCanonicalFileName:e=>e,useCaseSensitiveFileNames:()=>!0,getNewLine:()=>`
|
|
2
|
+
`};return t.createProgram({rootNames:[...r.keys()],options:n,host:o})}function M(t,i,r){const s=L(t,i),n=s.getTypeChecker();let o;s.getSourceFile(`/${r.file}`)?.forEachChild(a=>{t.isFunctionDeclaration(a)&&a.name?.text==="select"&&(o=a)});const e=new Set(r.modules??[]),c=a=>{if(!t.isImportSpecifier(a))return!1;const m=a.parent.parent.parent;return(a.propertyName??a.name).text==="select"&&t.isStringLiteral(m.moduleSpecifier)&&e.has(m.moduleSpecifier.text)},u=[];for(const a of s.getSourceFiles()){if(a.isDeclarationFile)continue;const m=a.fileName.slice(1),g=l=>a.getLineAndCharacterOfPosition(l.getStart()).line+1;let S=!1;const d=l=>{t.isStringLiteral(l)&&/(^|\s)sf-[a-z0-9-]/.test(l.text)&&(S=!0),t.isImportDeclaration(l)&&t.isStringLiteral(l.moduleSpecifier)&&/^(editor-shell|efficient-easel)(\/|$)/.test(l.moduleSpecifier.text)&&(S=!0),l.forEachChild(d)};d(a);const h=l=>{if(t.isPropertyAssignment(l)&&t.isIdentifier(l.name)&&l.name.text==="type"&&t.isStringLiteral(l.initializer)&&l.initializer.text==="select"&&u.push({file:m,line:g(l),kind:'field: type "select"',engineDrawn:!0,classes:[]}),t.isCallExpression(l)&&t.isIdentifier(l.expression)){const p=n.getSymbolAtLocation(l.expression),x=p&&p.flags&t.SymbolFlags.Alias?n.getAliasedSymbol(p):p;[...p?.declarations??[],...x?.declarations??[]].some(f=>o!==void 0&&f===o||c(f))&&u.push({file:m,line:g(l),kind:"field: select() helper",engineDrawn:!0,classes:[]})}if(t.isJsxOpeningLikeElement(l)&&l.tagName.getText()==="select"&&S&&m!==r.file){const p=l.attributes.properties.find(b=>t.isJsxAttribute(b)&&t.isIdentifier(b.name)&&b.name.text==="className"),x=p&&p.initializer&&t.isStringLiteral(p.initializer)?p.initializer.text:"";u.push({file:m,line:g(l),kind:"element: <select> in panel markup",engineDrawn:!1,classes:x.split(/\s+/).filter(Boolean)})}l.forEachChild(h)};h(a)}return{population:u,helperDeclared:o!==void 0}}const v=(t,i)=>t[0]-i[0]||t[1]-i[1]||t[2]-i[2],O=t=>`(${t[0]},${t[1]},${t[2]})`;function $(t){const i=[];let r=0,s=null,n="";const o=()=>{const e=n.indexOf(":");e>0&&i.push({prop:n.slice(0,e).trim(),value:n.slice(e+1).trim()}),n=""};for(const e of t){if(s){n+=e,e===s&&(s=null);continue}if(e==='"'||e==="'")s=e;else if(e==="(")r+=1;else if(e===")")r=Math.max(0,r-1);else if(e===";"&&r===0){o();continue}n+=e}return o(),i}function A(t){const i=[];let r=0,s="";for(const n of t){if(n==="("&&(r+=1),n===")"&&(r-=1),r===0&&/[\s>+~]/.test(n)){s.trim()&&i.push(s.trim()),s="";continue}s+=n}return s.trim()&&i.push(s.trim()),i}function C(t){let i=t.trim();const r=[],s=[];let n=null;const o=/^[a-zA-Z][a-zA-Z0-9-]*/.exec(i);for(o&&(n=o[0],i=i.slice(o[0].length));i.length;){let e;if(e=/^\.([A-Za-z0-9_-]+)/.exec(i))r.push(e[1]);else if(e=/^:(focus-visible|focus-within|hover|focus|active|checked|disabled)\b/.exec(i))s.push(e[1]);else if(e=/^:dir\([^)]*\)/.exec(i))s.push("dir");else if(e=/^:not\(\[([A-Za-z-]+)\]\)/.exec(i))r.push(`@not-${e[1]}`);else if(e=/^\[([A-Za-z-]+)(?:[~^$*|]?=[^\]]*)?\]/.exec(i))s.push(`[${e[1]}]`);else if(e=/^:has\(([^)]*)\)/.exec(i)){if(!/^\s*>?\s*[a-z]+\s*$/.test(e[1]))return null;r.push("@has-type")}else return null;i=i.slice(e[0].length)}return{type:n,classes:r,needsState:s}}const D=t=>t.reduce((i,r)=>[i[0],i[1]+r.classes.filter(s=>s!=="@has-type").length+r.needsState.length,i[2]+(r.type?1:0)+(r.classes.includes("@has-type")?1:0)],[0,0,0]);function F(t){if(t===null)return!0;let i=!0;for(const r of t.replace(/^@media\s*/i,"").split(/\s+and\s+/i)){const s=r.trim().replace(/^\(|\)$/g,"").trim(),n=/^([a-z-]+)\s*:\s*(.+)$/.exec(s);if(!n)return null;const o=n[1],e=n[2].trim();if(o==="hover"||o==="any-hover"){if(e==="hover")continue;return e==="none"?!1:null}if(o==="pointer"||o==="any-pointer"){if(e==="fine")continue;return e==="coarse"||e==="none"?!1:null}i=null}return i}const T=t=>t??"(no media query)";function Z(t,i,r,s,n="rest"){const o=[],e=[],c=[],u=n==="hover"?new Set(["hover"]):new Set;return t.forEach((a,m)=>{const g=n==="rest"?a.media===null:F(a.media);for(const S of a.selector.split(",")){const d=S.trim();if(!d||!/(^|[\s,>+~])select\b/.test(d)&&!i.own.some(f=>d.includes(`.${f}`)))continue;const h=A(d).map(C),l=h[h.length-1];if(h.some(f=>f===null)||!l){e.push(`${r}: ${d}`);continue}const p=h;if(l.type&&l.type!=="select")continue;const x=l.classes.filter(f=>!f.startsWith("@"));if(!(!x.every(f=>i.own.includes(f))||!l.type&&x.length===0||!l.needsState.every(f=>u.has(f))||!p.slice(0,-1).every(f=>(!f.type||f.type==="div")&&f.classes.filter(y=>!y.startsWith("@")).every(y=>i.ancestors.includes(y))&&f.needsState.every(y=>u.has(y))))&&g!==!1){if(g===null){c.push({sheet:r,selector:d,media:a.media??"",decls:a.decls});continue}o.push({spec:D(p),order:s+m,decls:a.decls,selector:d,sheet:r})}}}),{applied:o,unreadable:e,undecided:c}}const w={appearance:"auto","background-image":"none","background-size":"auto","background-repeat":"repeat","background-position":"0% 0%","background-color":"transparent","border-color":"currentcolor"};function z(t){const i=t.replace(/url\([\s\S]*?\)/g," "),r=/var\(--[A-Za-z0-9-]+(?:\s*,[^()]*)?\)|#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?|color-mix|color)\([^()]*(?:\([^()]*\)[^()]*)*\)|\b(?:transparent|currentcolor|white|black)\b/i.exec(i);return r?r[0]:null}function W(t){const i=new Map;for(const r of $(t.replace(/[^{}]*\{|\}/g,";")))r.prop.startsWith("--")&&i.set(r.prop,r.value);return i}function E(t,i,r=0){if(r>8)return t;let s=!1;const n=t.replace(/var\(\s*(--[A-Za-z0-9-]+)\s*(?:,([^()]*(?:\([^()]*\)[^()]*)*))?\)/g,(o,e)=>{const c=i.get(e);return c===void 0?o:(s=!0,c)});return s?E(n,i,r+1):n}function j(t,i,r=new Map){let s=null;const n=(e,c)=>{(!s||v(e.spec,s.spec)>0||v(e.spec,s.spec)===0&&e.order>=s.order)&&(s={value:c.trim(),from:`${e.sheet} { ${e.selector} }`,spec:e.spec,order:e.order})};for(const e of t)for(const c of $(e.decls)){if(c.prop===i||i==="appearance"&&c.prop==="-webkit-appearance"){n(e,c.value);continue}if(c.prop==="border"&&i==="border-color"){n(e,z(c.value)??w[i]);continue}if(c.prop!=="background"||!i.startsWith("background-"))continue;const u=c.value;n(e,i==="background-image"?/url\([\s\S]*?\)|linear-gradient\([\s\S]*?\)|image-set\([\s\S]*?\)/.exec(u)?.[0]??"none":i==="background-repeat"?/\b(no-repeat|repeat-x|repeat-y|round|space|repeat)\b/.exec(u)?.[0]??"repeat":i==="background-color"?z(u)??w[i]:w[i])}const o=s??{value:w[i],from:"(nothing declares one)"};return{value:E(o.value,r),from:o.from}}const I=["sf-editor","sf-body","sf-panel","sf-insp-body","sf-styles","sf-field","es-field","sf-copybox"];function K(t,i){const r=t.filter(e=>!e.engineDrawn),s=e=>new RegExp(`\\.${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\b`).test(i),n=e=>[...e.classes].filter(s).sort().join(" "),o=new Set([""]);for(const e of r)o.add(n(e));return[...o].sort().map(e=>({name:e?`house .${e.split(" ").join(".")}`:"house (bare)",own:e?e.split(" "):[],ancestors:[...I],rows:r.filter(c=>n(c)===e).length}))}function P(t,i,r){const s=new Map;for(const n of r)s.set(n,[]);for(const n of i){if(!k(n.path))continue;const o=t.createSourceFile(n.path,n.text,t.ScriptTarget.Latest,!0),e=c=>{if(t.isJsxAttribute(c)&&t.isIdentifier(c.name)&&c.name.text==="className"&&c.initializer&&t.isStringLiteral(c.initializer)){const u=c.initializer.text.split(/\s+/).filter(Boolean);for(const a of r)u.includes(a)&&s.get(a)?.push(n.path)}c.forEachChild(e)};e(o)}return s}export{I as ANCESTORS,w as INITIAL,Z as applicable,M as census,P as chainInMarkup,z as colorIn,C as compound,E as derefVars,K as deriveShapes,N as importsOf,F as mediaHolds,T as mediaLabel,W as readVars,j as resolve,v as specCmp,D as specOf,O as specStr,A as splitCombinators,$ as splitDecls};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const PART_PANEL = "components/PartSettingsPanel.tsx";
|
|
2
|
+
export interface SliderCallSite {
|
|
3
|
+
fields: string[];
|
|
4
|
+
line: number;
|
|
5
|
+
readoutOff: boolean;
|
|
6
|
+
labelFor(field: string): string;
|
|
7
|
+
}
|
|
8
|
+
export declare function readSliderCallSites(source: string): SliderCallSite[];
|
|
9
|
+
export declare const sliderFields: (sites: readonly SliderCallSite[]) => string[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const a="components/PartSettingsPanel.tsx";function w(t){let n="",e=0,o=null;for(;e<t.length;){const s=t[e],i=t[e+1];if(o){if(n+=s,s==="\\"){n+=i??"",e+=2;continue}s===o&&(o=null),e+=1;continue}if(s==='"'||s==="'"||s==="`"){o=s,n+=s,e+=1;continue}if(s==="/"&&i==="/"){for(;e<t.length&&t[e]!==`
|
|
2
|
+
`;)e+=1;continue}if(s==="/"&&i==="*"){for(e+=2;e<t.length&&!(t[e]==="*"&&t[e+1]==="/");)t[e]===`
|
|
3
|
+
`&&(n+=`
|
|
4
|
+
`),e+=1;e+=2;continue}n+=s,e+=1}return n}function l(t){throw new Error(t)}function S(t){const n=/const PART_FIELDS\s*=\s*\[([\s\S]*?)\]\s*as const/.exec(t);n||l(`${a}: no \`const PART_FIELDS = [ \u2026 ] as const\` \u2014 this reader takes the panel's row labels from that one table, and cannot find it. Has it been renamed?`);const e=new Map;for(const o of n[1].matchAll(/\{\s*key:\s*"([^"]+)"\s*,\s*label:\s*"([^"]+)"/g))e.set(o[1],o[2]);return e.size===0&&l(`${a}: PART_FIELDS holds no \`key\`/\`label\` pairs.`),e}function m(t){const n=w(t),e=S(n),o=[];for(const s of n.matchAll(/<Slider[\s/>]/g)){const i=s.index??0,d=n.indexOf("/>",i);d===-1&&l(`${a}: a <Slider at offset ${i} is not self-closing. This reader reads a call site's props up to \`/>\`; a Slider with children needs a different reader.`);const u=n.slice(i,d),c=n.slice(0,i),h=/((?:\s*case\s+"[^"]+"\s*:)+)\s*return\s*\(\s*$/.exec(c),f=h?[...h[1].matchAll(/case\s+"([^"]+)"\s*:/g)].map(r=>r[1]):[];f.length===0&&l(`${a}: the <Slider at line ${c.split(`
|
|
5
|
+
`).length} is not returned DIRECTLY by a
|
|
6
|
+
\`case "\u2026": return (\` branch, so this reader cannot say which field it draws.
|
|
7
|
+
|
|
8
|
+
IF SOMETHING NOW WRAPS THE SLIDER, THAT ROW IS BACK TO 129px AND NOTHING ELSE WOULD SAY SO.
|
|
9
|
+
The rule that gives it the row is \`.es-field-ctl > .sf-slider\` \u2014 a DIRECT child, because the
|
|
10
|
+
slot is the flex container and only its own children are flex items. A wrapper becomes the
|
|
11
|
+
item, sizes to the track it holds, and the track fills the wrapper instead of the row. A
|
|
12
|
+
descendant selector would NOT save it: it would paint \`flex: 1\` on an element whose parent
|
|
13
|
+
is the wrapper, not the slot, and the row would look fixed while measuring the same 129px.
|
|
14
|
+
|
|
15
|
+
So a wrap needs a decision, not a wider selector \u2014 either unwrap it, or give the wrapper the
|
|
16
|
+
row and say why in \`components/storefront-editor.css\`. Card 66247.`),o.push({fields:f,line:c.split(`
|
|
17
|
+
`).length,readoutOff:/readout=\{false\}/.test(u),labelFor(r){const p=e.get(r);return p||l(`${a}: field \`${r}\` draws a slider but is not in PART_FIELDS, so it has no row label. The two declarations have drifted apart.`),p}})}return o}const b=t=>t.flatMap(n=>n.fields);export{a as PART_PANEL,m as readSliderCallSites,b as sliderFields};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as TS from "typescript";
|
|
2
|
+
import type { SourceFile } from "../rule.js";
|
|
3
|
+
export declare const CONFIG_FILE = "lib/puck/config.tsx";
|
|
4
|
+
export declare const REGISTRY_DIRS: readonly ["lib/puck/blocks", "lib/puck/passes"];
|
|
5
|
+
export declare const REGISTRY_MODULES: readonly ["lib/puck/page-root.tsx", "lib/puck/page-root-fields.tsx", "lib/puck/registry.ts"];
|
|
6
|
+
export declare function isRegistryPath(p: string): boolean;
|
|
7
|
+
export declare function registryFiles(files: readonly SourceFile[]): SourceFile[];
|
|
8
|
+
export declare function registryText(files: readonly SourceFile[]): string;
|
|
9
|
+
export declare function splitBlockTypes(files: readonly SourceFile[]): string[];
|
|
10
|
+
export declare function blockFiles(files: readonly SourceFile[], type: string): string[];
|
|
11
|
+
export declare function registeredBlockKeys(ts: typeof TS, files: readonly SourceFile[]): string[];
|
|
12
|
+
export declare function blocksWrittenInConfig(ts: typeof TS, files: readonly SourceFile[]): string[];
|
|
13
|
+
export declare function registeredAs(ts: typeof TS, files: readonly SourceFile[], key: string): string | undefined;
|
|
14
|
+
export declare function blockSource(ts: typeof TS, files: readonly SourceFile[], type: string): string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const o="lib/puck/config.tsx",x=["lib/puck/blocks","lib/puck/passes"],g=["lib/puck/page-root.tsx","lib/puck/page-root-fields.tsx","lib/puck/registry.ts"],d=t=>/\.tsx?$/.test(t)&&!t.endsWith(".d.ts");function m(t){return t===o||g.includes(t)?!0:d(t)&&x.some(e=>t.startsWith(`${e}/`))}function k(t){const e=new Map(t.map(n=>[n.path,n])),r=[o,...g].map(n=>e.get(n)).filter(n=>!!n),i=x.flatMap(n=>t.filter(s=>d(s.path)&&s.path.startsWith(`${n}/`)).sort((s,c)=>s.path<c.path?-1:1));return[...r,...i]}function y(t){return k(t).map(e=>e.text).join(`
|
|
2
|
+
`)}function h(t,e){const r=t.find(i=>new RegExp(`^lib/puck/blocks/[^/]+/${e}/render\\.tsx$`).test(i.path));return r?r.path.slice(0,-11):null}function E(t){return t.map(e=>/^lib\/puck\/blocks\/[^/]+\/([^/]+)\/render\.tsx$/.exec(e.path)?.[1]).filter(e=>!!e).sort()}function b(t,e){const r=h(t,e);return r?[`${r}/render.tsx`,`${r}/fields.tsx`].filter(i=>t.some(n=>n.path===i)):t.some(i=>i.path===o)?[o]:[]}function p(t,e){const r=e.find(l=>l.path===o);if(!r)return null;const i=r.text,n=t.createSourceFile(o,i,t.ScriptTarget.Latest,!0,t.ScriptKind.TSX),s={keys:[],literals:new Map,registeredAs:new Map};let c=!1;const f=l=>{if(!c){if(t.isPropertyAssignment(l)&&l.name.getText(n)==="components"&&t.isObjectLiteralExpression(l.initializer)){c=!0;for(const a of l.initializer.properties){if(!t.isPropertyAssignment(a))continue;const u=a.name.getText(n);s.keys.push(u),t.isObjectLiteralExpression(a.initializer)?s.literals.set(u,i.slice(a.getFullStart(),a.end)):s.registeredAs.set(u,a.initializer.getText(n))}return}t.forEachChild(l,f)}};if(f(n),!c)throw new Error(`registry-source: no \`components\` object in ${o}`);return s}function S(t,e){return[...p(t,e)?.keys??[]]}function $(t,e){return[...p(t,e)?.literals.keys()??[]]}function T(t,e,r){return p(t,e)?.registeredAs.get(r)}function w(t,e,r){if(h(e,r))return b(e,r).map(s=>e.find(c=>c.path===s).text).join(`
|
|
3
|
+
`);const n=p(t,e)?.literals.get(r);if(n===void 0)throw new Error(`registry-source: no block "${r}" among the files handed in \u2014 no folder under lib/puck/blocks/ and no literal in ${o}'s \`components\``);return n}export{o as CONFIG_FILE,x as REGISTRY_DIRS,g as REGISTRY_MODULES,b as blockFiles,w as blockSource,$ as blocksWrittenInConfig,m as isRegistryPath,T as registeredAs,S as registeredBlockKeys,k as registryFiles,y as registryText,E as splitBlockTypes};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const f={single:"'",double:'"',template:"`"};function s(c){let t="",n="code",o=0;for(;o<c.length;){const e=c[o],i=c[o+1];if(n==="code"){if(e==="/"&&i==="/"){n="line",t+=" ",o+=2;continue}if(e==="/"&&i==="*"){n="block",t+=" ",o+=2;continue}e==="'"?n="single":e==='"'?n="double":e==="`"&&(n="template"),t+=e,o+=1;continue}if(n==="line"){e===`
|
|
2
|
+
`?(n="code",t+=e):t+=" ",o+=1;continue}if(n==="block"){if(e==="*"&&i==="/"){n="code",t+=" ",o+=2;continue}t+=e===`
|
|
3
|
+
`?e:" ",o+=1;continue}if(e==="\\"){t+=e+(i??""),o+=2;continue}e===f[n]&&(n="code"),t+=e,o+=1}return t}function r(c,t){const n=s(c),o=n.indexOf(t);if(o<0)throw new Error(`ts-source: marker not found: ${t}`);const e=n.indexOf("{",o+t.length-1);if(e<0)throw new Error(`ts-source: no block opens after: ${t}`);let i=0;for(let l=e;l<n.length;l+=1)if(n[l]==="{")i+=1;else if(n[l]==="}"&&(i-=1,i===0))return c.slice(e,l+1);throw new Error(`ts-source: unbalanced block after: ${t}`)}export{r as balancedBlockAfter,s as stripComments};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type RuleReport, type SourceFile } from "./rule.js";
|
|
2
|
+
export type ThemeModeControlsGoneOptions = {
|
|
3
|
+
readonly mustRead?: readonly string[];
|
|
4
|
+
readonly liveWiring?: {
|
|
5
|
+
readonly layout: string;
|
|
6
|
+
readonly chrome: string;
|
|
7
|
+
};
|
|
8
|
+
readonly minFiles: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function themeModeControlsGone(files: readonly SourceFile[], options: ThemeModeControlsGoneOptions): RuleReport;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{ruleChecks as $}from"./rule.js";const n=["Default","mode"].join(" "),r=["Show Light","Dark switch"].join(" / "),p=[["Theme","Switch","Field"].join(""),["Theme","Mode","Root","Field"].join("")],w=`components/${p[0]}.tsx`,m=c=>c.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*\/\/.*$/gm,"");function S(c,h){const{check:t,report:u}=$("theme mode controls gone"),i=c.filter(e=>/\.tsx?$/.test(e.path)),l=e=>i.find(o=>o.path===e)?.text;{const e=m(`export const Row = () => <label>${n}</label>; // ${r}`);t(`the matcher sees "${n}" in code that plainly says it`,e.includes(n));const o=m(`// card 66312 removed the ${n} row
|
|
2
|
+
/* and the ${r} one */
|
|
3
|
+
export const x = 1;`);t("\u2026and a note that names a row, on its own line or in a block, is prose, not code",!o.includes(n)&&!o.includes(r))}t(`\xA71a the component that drew both rows is gone (${w})`,!i.some(e=>e.path===w),`${w} still exists \u2014 it drew both rows and has no other job`),t(`\xA71b the sweep is real (${i.length} TS/TSX files, at least ${h.minFiles})`,i.length>=h.minFiles,"too few to be this repository, so the absence checks below are passing over nothing");for(const e of h.mustRead??[])t(`\xA71b the sweep reaches ${e}, a file the rows lived in`,l(e)!==void 0);const a=[],d=[];for(const e of i){const o=m(e.text);for(const s of[n,r])o.includes(s)&&a.push(`${e.path} still names the "${s}" row`);for(const s of p)o.includes(s)&&d.push(`${e.path} still references ${s}`)}if(t("\xA71b no file names either row",a.length===0,a.join(`
|
|
4
|
+
`)),t("\xA71c no file wires the retired field or its root",d.length===0,d.join(`
|
|
5
|
+
`)),h.liveWiring){const{layout:e,chrome:o}=h.liveWiring,s=l(e)??"";t(`\xA73d ${e} builds the boot script from the site's STORED defaultMode / showThemeSwitch`,/buildThemeBootScript\(\{\s*mode:\s*theme\.defaultMode,\s*switchShown:\s*theme\.showThemeSwitch,?\s*\}\)/.test(s),"every site would paint whatever replaced them");for(const f of["loaded.defaultMode","loaded.showThemeSwitch"])t(`\xA73d \u2026and still reads ${f} from the backend theme row`,s.includes(f));t("\xA73d \u2026and threads showThemeSwitch to the chrome",/showThemeSwitch=\{theme\.showThemeSwitch\}/.test(s)),t(`\xA73d ${o} threads the site's switch setting to the Header`,/showThemeToggle=\{showThemeSwitch\}/.test(l(o)??""))}return u()}export{S as themeModeControlsGone};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type RuleReport, type SourceFile } from "./rule.js";
|
|
2
|
+
export type UploadIntakeGuardOptions = {
|
|
3
|
+
readonly allowlist?: Readonly<Record<string, {
|
|
4
|
+
readonly max: number;
|
|
5
|
+
readonly why: string;
|
|
6
|
+
}>>;
|
|
7
|
+
readonly migrated?: readonly string[];
|
|
8
|
+
readonly minFiles: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function intakeMarkerCount(text: string): number;
|
|
11
|
+
export declare function uploadIntakeGuard(files: readonly SourceFile[], options: UploadIntakeGuardOptions): RuleReport;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{ruleChecks as w}from"./rule.js";const j=/\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/,b=[/type=["']file["']/g,/dataTransfer\??\.files/g,/clipboardData\??\.(files|items)/g],c=/from\s+["']efficient-shell["']/;function p(r){return b.reduce((s,n)=>s+(r.match(n)?.length??0),0)}function I(r,s){const{check:n,report:$}=w("upload intake guard"),f=s.allowlist??{};{const e=o=>["type=",o,"file",o].join(""),t=["dataTransfer","files"],h=["clipboardData","items"],k=["clipboardData","files"],y=[["a double-quoted file input",`<input ${e('"')} accept="image/*" />`],["a single-quoted file input",`<input ${e("'")} />`],["a drop zone reading files",`openPicker(e.${t.join(".")}?.[0] ?? null)`],["\u2026through optional chaining",`const f = e.${t.join("?.")};`],["a paste handler reading items",`Array.from(e.${h.join(".")})`],["a paste handler reading files",`e.${k.join("?.")}`]];for(const[o,l]of y)n(`the scan flags ${o}`,p(l)===1,l);const x=[["a text input",'<input type="text" />'],["a drop zone that only reads the types","e.dataTransfer.types.includes('Files')"],["a paste handler that only reads text","e.clipboardData.getData('text/plain')"],["the shell's own input spread","<input {...intake.inputProps} hidden />"]];for(const[o,l]of x)n(`the scan stays quiet on ${o}`,p(l)===0,l);const g=["efficient","shell"].join("-");n("the root-entry reader finds an import of the shell's root",c.test(`import { x } from "${g}";`)),n("\u2026and not one of a subpath",!c.test(`import { useFileIntake } from "${g}/file-intake";`))}const a=r.filter(e=>j.test(e.path));n(`read the source (${a.length} JS/TS files, at least ${s.minFiles})`,a.length>=s.minFiles,"the walk found too few source files \u2014 it is looking in the wrong place, and every check below is vacuous");const i=new Map;for(const e of a){const t=p(e.text);t>0&&i.set(e.path,t)}const d=[...i].filter(([e])=>!(e in f)).map(([e,t])=>`${e} (${t})`);n("no file outside the allowlist hand-rolls a file input, drop zone or paste handler",d.length===0,`take files through useFileIntake from efficient-shell/file-intake (harness UI-15 / PAT-10):
|
|
2
|
+
${d.join(`
|
|
3
|
+
`)}`);const u=Object.entries(f).filter(([e,t])=>(i.get(e)??0)>t.max).map(([e,t])=>`${e}: ${i.get(e)} > ${t.max}`);n("no allowlisted file grows its hand-rolled intake",u.length===0,u.join(`
|
|
4
|
+
`));for(const[e,t]of Object.entries(f))n(`the allowlist entry is still real: ${e} (${t.why})`,i.has(e),"remove the entry \u2014 the ratchet only tightens");for(const e of s.migrated??[]){const t=a.find(h=>h.path===e);!n(`read the migrated surface ${e}`,!!t,"it is not among the files handed in")||!t||(n(`${e} imports the shell's intake`,/from "efficient-shell\/file-intake"/.test(t.text)),n(`${e} drives its zone with useFileIntake`,/useFileIntake\(/.test(t.text)),n(`${e} spreads the intake's drop handlers on its zone`,/\.\.\.intake\.zoneProps/.test(t.text)))}const m=a.filter(e=>c.test(e.text)).map(e=>e.path);return n("nothing imports the shell's root entry",m.length===0,`the root pulls the shell's toasts, stylesheet and window manager; take a React-only subpath:
|
|
5
|
+
${m.join(`
|
|
6
|
+
`)}`),$()}export{p as intakeMarkerCount,I as uploadIntakeGuard};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type RuleReport, type SourceFile } from "./rule.js";
|
|
2
|
+
export type WordStylesOptions = {
|
|
3
|
+
readonly exempt?: Readonly<Record<string, string>>;
|
|
4
|
+
readonly minFiles: number;
|
|
5
|
+
readonly labelFloor: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function labelsIn(text: string): string[];
|
|
8
|
+
export declare function wordStyles(files: readonly SourceFile[], options: WordStylesOptions): RuleReport;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{ruleChecks as p}from"./rule.js";const m=/(?:\baria-label|\blabel|\btitle|\bplaceholder)\s*[:=]\s*\{?\s*(["'])([^"']*)\1/g,u=/^(Emphasis|Strong)\b/;function i(s){return[...s.matchAll(m)].map(e=>e[2])}function h(s){return i(s.text).filter(e=>u.test(e)).map(e=>`${s.path}: "${e}"`)}function y(s,e){const{check:l,report:f}=p("word styles"),g=e.exempt??{};{const t={path:"fixture.tsx",text:['const a = { style: "wordHighlight", title: "Emphasis word style" };','const b = <button aria-label="Strong word style" />;','const c = <input placeholder={"Emphasis"} />;',"const d = { label: 'Strong' };","// the Emphasis button and the Strong one are upstream's",'toggle("Strong", false);','const e = { title: "Highlight word style", label: "Bold" };','const f = { title: "A strong claim", label: "Strongest" };'].join(`
|
|
2
|
+
`)},r=i(t.text),a=["Emphasis word style","Strong word style","Emphasis","Strong","Highlight word style","Bold","A strong claim","Strongest"];l("the reader reads a label, title, aria-label and placeholder, and neither prose nor a positional argument",JSON.stringify(r)===JSON.stringify(a),JSON.stringify(r));const o=h(t);l("the rule flags a label that begins Emphasis or Strong, and passes Highlight, Bold, `A strong \u2026` and `Strongest`",JSON.stringify(o)===JSON.stringify(a.slice(0,4).map(b=>`fixture.tsx: "${b}"`)),JSON.stringify(o))}const n=s.filter(t=>/\.tsx?$/.test(t.path)),d=n.reduce((t,r)=>t+i(r.text).length,0);l(`read the source (${n.length} .ts/.tsx files, at least ${e.minFiles})`,n.length>=e.minFiles),l(`read the labels (${d}, at least ${e.labelFloor})`,d>=e.labelFloor,"fewer means the label reader broke, and an absence over a reader that matches nothing is free");const c=n.filter(t=>!(t.path in g)).flatMap(h);l("no merchant-visible label calls our word styles Emphasis or Strong",c.length===0,`our word styles are called Highlight and Bold (2026-10-04) \u2014 Emphasis and Strong belong to the upstream \u25C6 and bold buttons, whose descriptors live in efficient-easel and are not written here:
|
|
3
|
+
${c.join(`
|
|
4
|
+
`)}`);for(const[t,r]of Object.entries(g)){const a=n.find(o=>o.path===t);l(`the exemption is still real: ${t} (${r})`,!!a&&h(a).length>0,"the file is gone or no longer writes the retired words \u2014 remove the stale entry")}return f()}export{i as labelsIn,y as wordStyles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as m,useEffect as y,useRef as l}from"react";import{
|
|
1
|
+
import{useCallback as m,useEffect as y,useRef as l}from"react";import{currentEditorSession as b}from"./editor-session.js";import{backendOf as v}from"./website-session.js";import{useEditorSession as x}from"./editor-session-context.js";import{WebsiteBackendError as E}from"./web-backend.js";function h(e=b()){return(t,i,n)=>{const r=v(e).theme;return r?r.update(t,n?{siteId:n}:void 0):Promise.reject(new E("invalid","This backend stores no site theme."))}}function w(e){return e.themeFromDocument?{status:"skipped",reason:"template"}:e.token?null:{status:"skipped",reason:"no-token"}}async function S(e,t=h()){const{themeFromDocument:i,token:n,siteId:r,patch:s}=e,a=w({themeFromDocument:i,token:n});if(a)return a;if(Object.keys(s).length===0)return{status:"skipped",reason:"empty"};try{return await t(s,n,r??void 0),{status:"saved"}}catch(f){return{status:"failed",error:f}}}function B({themeFromDocument:e,tokenRef:t,siteId:i,onResult:n}){const r=l(null),s=l({}),a=x(),f=l(n);f.current=n;const d=l(null),p=m(u=>{if(u.status==="skipped"){const o=`skipped:${u.reason}`;if(d.current===o)return;d.current=o}else d.current=null;f.current?.(u)},[]),c=m(async()=>{r.current&&(clearTimeout(r.current),r.current=null);const u=s.current;s.current={};const o=await S({themeFromDocument:e,token:t?.current,siteId:i,patch:u},h(a));return p(o),o},[e,t,i,p,a]),T=m((u,o=!1)=>{const k=w({themeFromDocument:e,token:t?.current});if(k){p(k);return}s.current={...s.current,...u},r.current&&clearTimeout(r.current),o?c():r.current=setTimeout(()=>{c()},500)},[e,t,c,p]);return y(()=>()=>{c()},[c]),{persist:T,flush:c}}export{w as refusalToQueue,h as themeRowSender,B as useThemeRowPersist,S as writeThemeRow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function t(e){switch(e.status){case"saved":return null;case"failed":return{msg:"Not saved. Try again.",tone:"error"};case"skipped":switch(e.reason){case"empty":return null;case"no-token":return{msg:"Not saved. Reload the page.",tone:"error"};case"template":return{msg:"Templates keep their look. Press
|
|
1
|
+
function t(e){switch(e.status){case"saved":return null;case"failed":return{msg:"Not saved. Try again.",tone:"error"};case"skipped":switch(e.reason){case"empty":return null;case"no-token":return{msg:"Not saved. Reload the page.",tone:"error"};case"template":return{msg:"Templates keep their look. Press Done.",tone:"success"}}}}export{t as themeSaveNotice};
|
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { EditorPageRow, SiteRecord, SiteRecordPatch, WebsiteEditLock } from "./editor-document-contract.js";
|
|
2
2
|
import type { HostPickedMedia } from "./editor-host.js";
|
|
3
3
|
import type { SiteThemeRow, SiteThemeRowPatch } from "./site-theme-row.js";
|
|
4
4
|
import type { SectionTemplate, SectionTemplateRecord } from "./section-template-types.js";
|
|
5
5
|
export type PageLayout = Record<string, unknown>;
|
|
6
|
-
export type EditorPageRow
|
|
7
|
-
id: string;
|
|
8
|
-
slug: string;
|
|
9
|
-
label: string;
|
|
10
|
-
group?: string | null;
|
|
11
|
-
groupKey?: string;
|
|
12
|
-
draft: boolean;
|
|
13
|
-
kind?: string | null;
|
|
14
|
-
};
|
|
6
|
+
export type { EditorPageRow, SiteRecord, SiteRecordPatch, WebsiteEditLock };
|
|
15
7
|
export type PageBundle = {
|
|
16
8
|
layout: PageLayout;
|
|
17
9
|
translations?: Record<string, unknown>;
|
|
@@ -64,21 +56,6 @@ export interface WebsitePages {
|
|
|
64
56
|
remove?(id: string): Promise<void>;
|
|
65
57
|
linkTargets?(scope?: SiteScope): Promise<LinkTargetPage[]>;
|
|
66
58
|
}
|
|
67
|
-
export interface WebsiteEditLock {
|
|
68
|
-
claim(id: string, clientId: string, takeover: boolean): Promise<{
|
|
69
|
-
heartbeatSeconds: number;
|
|
70
|
-
}>;
|
|
71
|
-
release(id: string, clientId: string): Promise<void>;
|
|
72
|
-
}
|
|
73
|
-
export interface SiteRecord {
|
|
74
|
-
name: string;
|
|
75
|
-
slug?: string | null;
|
|
76
|
-
mapsApiKey?: string | null;
|
|
77
|
-
mapsMapId?: string | null;
|
|
78
|
-
}
|
|
79
|
-
export type SiteRecordPatch = {
|
|
80
|
-
mapsApiKey?: string;
|
|
81
|
-
};
|
|
82
59
|
export interface WebsiteSite {
|
|
83
60
|
get(scope?: SiteScope): Promise<SiteRecord>;
|
|
84
61
|
update?(patch: SiteRecordPatch, scope?: SiteScope): Promise<SiteRecord>;
|
|
@@ -157,37 +134,5 @@ export interface WebsiteBackend {
|
|
|
157
134
|
social?: WebsiteSocial;
|
|
158
135
|
theme?: WebsiteTheme;
|
|
159
136
|
}
|
|
160
|
-
export
|
|
161
|
-
export
|
|
162
|
-
readonly kind: WebsiteBackendErrorKind;
|
|
163
|
-
readonly conflict?: SaveConflict;
|
|
164
|
-
readonly holder?: LockHolder;
|
|
165
|
-
readonly fields?: Readonly<Record<string, string>>;
|
|
166
|
-
constructor(kind: WebsiteBackendErrorKind, message?: string, detail?: {
|
|
167
|
-
conflict?: SaveConflict;
|
|
168
|
-
holder?: LockHolder;
|
|
169
|
-
fields?: Readonly<Record<string, string>>;
|
|
170
|
-
cause?: unknown;
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
export declare function isBackendError(err: unknown, kind?: WebsiteBackendErrorKind): err is WebsiteBackendError;
|
|
174
|
-
export declare const STATUS_UNREACHABLE = 0;
|
|
175
|
-
export interface HostFailure {
|
|
176
|
-
status: number;
|
|
177
|
-
data: unknown;
|
|
178
|
-
message: string;
|
|
179
|
-
}
|
|
180
|
-
interface HostFailures {
|
|
181
|
-
read(err: unknown): HostFailure | null;
|
|
182
|
-
unreachableMessage: string;
|
|
183
|
-
loadRefusal?(err: unknown, document: {
|
|
184
|
-
slug: string;
|
|
185
|
-
}): string | null;
|
|
186
|
-
}
|
|
187
|
-
export declare function provideHostFailures(failures: HostFailures): void;
|
|
188
|
-
export declare function readHostFailure(err: unknown): HostFailure | null;
|
|
189
|
-
export declare function hostLoadRefusalOf(err: unknown, document: {
|
|
190
|
-
slug: string;
|
|
191
|
-
}): string | null;
|
|
192
|
-
export declare function hostUnreachableMessage(): string;
|
|
193
|
-
export {};
|
|
137
|
+
export { WebsiteBackendError, isBackendError, STATUS_UNREACHABLE, provideHostFailures, readHostFailure, hostLoadRefusalOf, hostUnreachableMessage } from "./editor-backend-error.js";
|
|
138
|
+
export type { WebsiteBackendErrorKind, HostFailure } from "./editor-backend-error.js";
|
package/dist/lib/web-backend.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{WebsiteBackendError as a,isBackendError as o,STATUS_UNREACHABLE as s,provideHostFailures as t,readHostFailure as d,hostLoadRefusalOf as i,hostUnreachableMessage as l}from"./editor-backend-error.js";export{s as STATUS_UNREACHABLE,a as WebsiteBackendError,i as hostLoadRefusalOf,l as hostUnreachableMessage,o as isBackendError,t as provideHostFailures,d as readHostFailure};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SITE_FOOTER_SLUG as i}from"./content/footer.js";import{makeSitePageAdapter as p,makeTemplatePageAdapter as d}from"./editor-document-adapter.js";import{clearFooterReturn as m,readFooterReturn as n}from"./puck/footer-return.js";import{HOME_PAGE_SLUG as t}from"./puck/home-page.js";import{migrateRenamedProps as l}from"./puck/renamed-props.js";import{offeredSets as a}from"./editor-blocks.js";const E={homeSlug:t,entryMayBounce:e=>e.kind==="template"||e.kind==="page"&&e.slug===i,entryBounce:(e,r)=>{if(e.kind==="page"&&e.slug===i){const o=n();return{kind:"page",slug:o&&o!==i?o:t,siteId:e.siteId}}return e.kind!=="template"||new URLSearchParams(r).get("editTemplate")==="1"?null:{kind:"page",slug:t}},onSwitch:e=>{if(e.kind==="page"){const r=n();e.slug!==i&&e.slug!==r&&m()}else m()},tellsHost:e=>e.kind==="page"&&e.slug!==i,adapterFor:(e,r,o)=>e.kind==="template"?d(e.id,r,a(o)):p(e.siteId,r,a(o)),migrateRenamedProps:l};export{E as WEBSITE_ADDRESSING};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function routeWebsiteHostMessage(raw: unknown): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{emitCollectionCategoriesChanged as s,emitHeaderMenusChanged as n,emitStorefrontFormsChanged as r}from"./editor-events.js";import{resolveFormEdit as o}from"./editor-form-window.js";function f(t){switch(t?.type){case"storefront-editor:category-updated":return s(),!0;case"storefront-editor:menus-updated":return n(),!0;case"storefront-editor:form-saved":{const e=t;return r(),e.requestId&&o(e.requestId,e.form??null),!0}case"storefront-editor:form-closed":{const e=t;return r(),e.requestId&&o(e.requestId,null),!0}default:return!1}}export{f as routeWebsiteHostMessage};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type EditorSession } from "./editor-session.js";
|
|
2
|
+
import type { EditorBlocks } from "./editor-blocks.js";
|
|
3
|
+
import type { WebsiteBackend } from "./web-backend.js";
|
|
4
|
+
export declare const backendOf: (session?: EditorSession) => WebsiteBackend;
|
|
5
|
+
export declare const blocksOf: (session: EditorSession) => EditorBlocks | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{backendOf as s}from"./editor-session.js";const e=s,n=o=>o.blocks;export{e as backendOf,n as blocksOf};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "efficient-web-builder",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "The EFFICIENT website builder: the website editor, the general sections and the renderer that draws them, compiled. Hostable by any EFFICIENT product; nothing here imports a host.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Efficient Pty Ltd",
|
|
@@ -30,19 +30,27 @@
|
|
|
30
30
|
"scripts": {
|
|
31
31
|
"typecheck": "tsc --noEmit",
|
|
32
32
|
"test:boundary": "node scripts/test-boundary.mjs",
|
|
33
|
+
"test:screen": "node scripts/test-screen-in-easel.mjs",
|
|
33
34
|
"build": "node scripts/build.mjs",
|
|
34
35
|
"verify:dist": "node scripts/verify-dist.mjs",
|
|
35
|
-
"verify": "pnpm run typecheck && pnpm run test:boundary && pnpm run build && pnpm run verify:dist"
|
|
36
|
+
"verify": "pnpm run typecheck && pnpm run test:boundary && pnpm run test:screen && pnpm run test:guards && pnpm run build && pnpm run verify:dist",
|
|
37
|
+
"test:guards": "tsc --noEmit -p scripts/tsconfig.json && node scripts/run-guards.mjs"
|
|
36
38
|
},
|
|
37
39
|
"peerDependencies": {
|
|
38
40
|
"@tabler/icons-react": "^3.46.0",
|
|
39
|
-
"efficient-easel": "^0.
|
|
41
|
+
"efficient-easel": "^0.106.0",
|
|
40
42
|
"efficient-shell": "^4.131.0",
|
|
41
43
|
"isomorphic-dompurify": "^3.18.0",
|
|
42
44
|
"next": ">=16",
|
|
43
45
|
"react": ">=19",
|
|
44
46
|
"react-dom": ">=19",
|
|
45
|
-
"simple-icons": "^16.26.0"
|
|
47
|
+
"simple-icons": "^16.26.0",
|
|
48
|
+
"typescript": "^5"
|
|
49
|
+
},
|
|
50
|
+
"peerDependenciesMeta": {
|
|
51
|
+
"typescript": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
46
54
|
},
|
|
47
55
|
"devDependencies": {
|
|
48
56
|
"@tabler/icons-react": "^3.46.0",
|
|
@@ -50,14 +58,16 @@
|
|
|
50
58
|
"@types/node": "^20",
|
|
51
59
|
"@types/react": "^19",
|
|
52
60
|
"@types/react-dom": "^19",
|
|
53
|
-
"efficient-easel": "^0.
|
|
61
|
+
"efficient-easel": "^0.106.0",
|
|
54
62
|
"efficient-shell": "^4.131.0",
|
|
55
63
|
"esbuild": "^0.28.0",
|
|
64
|
+
"happy-dom": "^20.14.5",
|
|
56
65
|
"isomorphic-dompurify": "^3.18.0",
|
|
57
66
|
"next": "16.2.11",
|
|
58
67
|
"react": "19.2.4",
|
|
59
68
|
"react-dom": "19.2.4",
|
|
60
69
|
"simple-icons": "^16.26.0",
|
|
70
|
+
"tsx": "4.22.3",
|
|
61
71
|
"typescript": "^5"
|
|
62
72
|
}
|
|
63
73
|
}
|