@wordpress/boot 0.3.0 → 0.3.1-next.738bb1424.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 (76) hide show
  1. package/build-module/components/app/index.js +3 -3
  2. package/build-module/components/app/router.js +68 -67
  3. package/build-module/components/app/router.js.map +2 -2
  4. package/build-module/components/app/use-route-title.js +50 -0
  5. package/build-module/components/app/use-route-title.js.map +7 -0
  6. package/build-module/components/canvas/back-button.js +8 -4
  7. package/build-module/components/canvas/back-button.js.map +2 -2
  8. package/build-module/components/canvas/index.js +1 -1
  9. package/build-module/components/canvas-renderer/index.js +35 -0
  10. package/build-module/components/canvas-renderer/index.js.map +7 -0
  11. package/build-module/components/navigation/drilldown-item/index.js +1 -1
  12. package/build-module/components/navigation/dropdown-item/index.js +3 -3
  13. package/build-module/components/navigation/index.js +6 -6
  14. package/build-module/components/navigation/navigation-item/index.js +4 -4
  15. package/build-module/components/navigation/navigation-item/index.js.map +1 -1
  16. package/build-module/components/navigation/router-link-item.js +1 -1
  17. package/build-module/components/navigation/use-sidebar-parent.js +3 -3
  18. package/build-module/components/root/index.js +276 -21
  19. package/build-module/components/root/index.js.map +2 -2
  20. package/build-module/components/root/single-page.js +181 -19
  21. package/build-module/components/root/single-page.js.map +2 -2
  22. package/build-module/components/save-button/index.js +1 -1
  23. package/build-module/components/save-panel/index.js +1 -1
  24. package/build-module/components/sidebar/index.js +3 -3
  25. package/build-module/components/site-hub/index.js +30 -12
  26. package/build-module/components/site-hub/index.js.map +2 -2
  27. package/build-module/components/site-icon/index.js +2 -2
  28. package/build-module/components/site-icon/index.js.map +1 -1
  29. package/build-module/components/site-icon-link/index.js +5 -5
  30. package/build-module/components/site-icon-link/index.js.map +1 -1
  31. package/build-module/components/user-theme-provider/index.js +33 -0
  32. package/build-module/components/user-theme-provider/index.js.map +7 -0
  33. package/build-module/index.js +298 -75
  34. package/build-module/index.js.map +4 -4
  35. package/build-module/store/index.js +3 -3
  36. package/build-style/style-rtl.css +95 -75
  37. package/build-style/style.css +95 -75
  38. package/build-style/view-transitions-rtl.css +199 -0
  39. package/build-style/view-transitions.css +199 -0
  40. package/build-types/components/app/router.d.ts.map +1 -1
  41. package/build-types/components/app/use-route-title.d.ts +8 -0
  42. package/build-types/components/app/use-route-title.d.ts.map +1 -0
  43. package/build-types/components/canvas-renderer/index.d.ts +27 -0
  44. package/build-types/components/canvas-renderer/index.d.ts.map +1 -0
  45. package/build-types/components/root/index.d.ts.map +1 -1
  46. package/build-types/components/root/single-page.d.ts.map +1 -1
  47. package/build-types/components/site-hub/index.d.ts.map +1 -1
  48. package/build-types/components/user-theme-provider/index.d.ts +6 -0
  49. package/build-types/components/user-theme-provider/index.d.ts.map +1 -0
  50. package/build-types/index.d.ts +1 -0
  51. package/build-types/index.d.ts.map +1 -1
  52. package/build-types/store/index.d.ts +1 -1
  53. package/build-types/store/index.d.ts.map +1 -1
  54. package/build-types/store/types.d.ts +64 -7
  55. package/build-types/store/types.d.ts.map +1 -1
  56. package/package.json +30 -21
  57. package/src/components/app/router.tsx +93 -111
  58. package/src/components/app/use-route-title.ts +80 -0
  59. package/src/components/canvas/back-button.scss +7 -2
  60. package/src/components/canvas-renderer/index.tsx +72 -0
  61. package/src/components/navigation/navigation-item/style.scss +1 -1
  62. package/src/components/root/index.tsx +154 -27
  63. package/src/components/root/single-page.tsx +24 -10
  64. package/src/components/root/style.scss +123 -4
  65. package/src/components/site-hub/index.tsx +6 -1
  66. package/src/components/site-hub/style.scss +23 -8
  67. package/src/components/site-icon/style.scss +1 -1
  68. package/src/components/site-icon-link/style.scss +2 -2
  69. package/src/components/user-theme-provider/index.tsx +35 -0
  70. package/src/components/user-theme-provider/test/index.test.ts +11 -0
  71. package/src/index.tsx +1 -0
  72. package/src/store/types.ts +71 -7
  73. package/src/style.scss +19 -33
  74. package/src/view-transitions.scss +239 -0
  75. package/tsconfig.json +0 -26
  76. package/tsconfig.tsbuildinfo +0 -1
@@ -9,19 +9,20 @@ import clsx from 'clsx';
9
9
  import { privateApis as routePrivateApis } from '@wordpress/route';
10
10
  // @ts-expect-error Commands is not typed properly.
11
11
  import { CommandMenu } from '@wordpress/commands';
12
- import { privateApis as themePrivateApis } from '@wordpress/theme';
13
12
  import { EditorSnackbars } from '@wordpress/editor';
14
13
 
15
14
  /**
16
15
  * Internal dependencies
17
16
  */
18
17
  import SavePanel from '../save-panel';
18
+ import CanvasRenderer from '../canvas-renderer';
19
19
  import { unlock } from '../../lock-unlock';
20
20
  import type { CanvasData } from '../../store/types';
21
21
  import './style.scss';
22
+ import useRouteTitle from '../app/use-route-title';
23
+ import { UserThemeProvider } from '../user-theme-provider';
22
24
 
23
25
  const { useMatches, Outlet } = unlock( routePrivateApis );
24
- const { ThemeProvider } = unlock( themePrivateApis );
25
26
 
26
27
  /**
27
28
  * Root component for single page mode (no sidebar).
@@ -34,11 +35,15 @@ export default function RootSinglePage() {
34
35
  | CanvasData
35
36
  | null
36
37
  | undefined;
38
+ const routeContentModule = ( currentMatch?.loaderData as any )
39
+ ?.routeContentModule as string | undefined;
37
40
  const isFullScreen = canvas && ! canvas.isPreview;
38
41
 
42
+ useRouteTitle();
43
+
39
44
  return (
40
- <ThemeProvider isRoot color={ { bg: '#f8f8f8', primary: '#3858e9' } }>
41
- <ThemeProvider color={ { bg: '#1d2327', primary: '#3858e9' } }>
45
+ <UserThemeProvider isRoot color={ { bg: '#f8f8f8' } }>
46
+ <UserThemeProvider color={ { bg: '#1d2327' } }>
42
47
  <div
43
48
  className={ clsx( 'boot-layout boot-layout--single-page', {
44
49
  'has-canvas': !! canvas || canvas === null,
@@ -49,14 +54,23 @@ export default function RootSinglePage() {
49
54
  <SavePanel />
50
55
  <EditorSnackbars />
51
56
  <div className="boot-layout__surfaces">
52
- <ThemeProvider
53
- color={ { bg: '#ffffff', primary: '#3858e9' } }
54
- >
57
+ <UserThemeProvider color={ { bg: '#ffffff' } }>
55
58
  <Outlet />
56
- </ThemeProvider>
59
+ { /* Render Canvas in Root to prevent remounting on route changes */ }
60
+ { ( canvas || canvas === null ) && (
61
+ <div className="boot-layout__canvas">
62
+ <CanvasRenderer
63
+ canvas={ canvas }
64
+ routeContentModule={
65
+ routeContentModule
66
+ }
67
+ />
68
+ </div>
69
+ ) }
70
+ </UserThemeProvider>
57
71
  </div>
58
72
  </div>
59
- </ThemeProvider>
60
- </ThemeProvider>
73
+ </UserThemeProvider>
74
+ </UserThemeProvider>
61
75
  );
62
76
  }
@@ -1,4 +1,5 @@
1
1
  @use "@wordpress/base-styles/variables";
2
+ @use "@wordpress/base-styles/mixins";
2
3
 
3
4
  .boot-layout {
4
5
  height: 100%;
@@ -10,37 +11,155 @@
10
11
  background: var(--wpds-color-bg-surface-neutral-weak, #f0f0f0);
11
12
  }
12
13
 
14
+ .boot-layout__sidebar-backdrop {
15
+ position: fixed;
16
+ top: 0;
17
+ left: 0;
18
+ right: 0;
19
+ bottom: 0;
20
+ background-color: rgba(0, 0, 0, 0.5);
21
+ z-index: 100002;
22
+ cursor: pointer;
23
+ }
24
+
13
25
  .boot-layout__sidebar {
14
26
  height: 100%;
15
27
  flex-shrink: 0;
16
28
  width: 240px;
17
29
  position: relative;
18
30
  overflow: hidden;
31
+
32
+ &.is-mobile {
33
+ position: fixed;
34
+ top: 0;
35
+ bottom: 0;
36
+ left: 0;
37
+ width: 300px;
38
+ max-width: 85vw;
39
+ background: var(--wpds-color-bg-surface-neutral-weak, #f0f0f0);
40
+ z-index: 100003;
41
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.2);
42
+ }
43
+ }
44
+
45
+ .boot-layout__mobile-sidebar-drawer {
46
+ position: fixed;
47
+ top: 0;
48
+ left: 0;
49
+ right: 0;
50
+ z-index: 3;
51
+ background: var(--wpds-color-bg-surface-neutral, #fff);
52
+ padding: variables.$grid-unit-20;
53
+ border-bottom: 1px solid var(--wpds-color-stroke-surface-neutral-weak, #ddd);
54
+ display: flex;
55
+ justify-content: flex-start;
56
+ align-items: center;
57
+ }
58
+
59
+ .boot-layout__canvas.has-mobile-drawer {
60
+ position: relative;
61
+ padding-top: 65px;
19
62
  }
20
63
 
21
64
  .boot-layout__surfaces {
22
65
  display: flex;
23
66
  flex-grow: 1;
24
- margin: variables.$grid-unit-10;
67
+ margin: 0;
25
68
  gap: variables.$grid-unit-10;
69
+
70
+ @include mixins.break-medium {
71
+ margin: variables.$grid-unit-10;
72
+
73
+ .boot-layout--single-page & {
74
+ margin-top: 0;
75
+ margin-left: 0;
76
+ }
77
+ }
26
78
  }
27
79
 
28
80
  .boot-layout__stage,
29
- .boot-layout__inspector,
81
+ .boot-layout__inspector {
82
+ flex: 1;
83
+ overflow-y: auto;
84
+ background: var(--wpds-color-bg-surface-neutral, #fff);
85
+ color: var(--wpds-color-fg-content-neutral, #1e1e1e);
86
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
87
+ border: 1px solid var(--wpds-color-stroke-surface-neutral-weak, #ddd);
88
+ position: relative;
89
+
90
+ // Mobile-first: surfaces take full screen with fixed positioning
91
+ position: fixed;
92
+ top: 0;
93
+ left: 0;
94
+ right: 0;
95
+ bottom: 0;
96
+ width: 100vw;
97
+ height: 100vh;
98
+ border-radius: 0;
99
+ margin: 0;
100
+
101
+ // Desktop: restore original styles
102
+ @include mixins.break-medium {
103
+ position: static;
104
+ width: auto;
105
+ height: auto;
106
+ border-radius: 8px;
107
+ margin: 0;
108
+ }
109
+ }
110
+
111
+ .boot-layout__stage {
112
+ z-index: 2; // Highest surface priority on mobile
113
+
114
+ @include mixins.break-medium {
115
+ z-index: auto;
116
+ }
117
+ }
118
+
119
+ .boot-layout__inspector {
120
+ z-index: 3; // Medium surface priority on mobile
121
+
122
+ @include mixins.break-medium {
123
+ z-index: auto;
124
+ }
125
+ }
126
+
30
127
  .boot-layout__canvas {
31
128
  flex: 1;
32
129
  overflow-y: auto;
33
130
  background: var(--wpds-color-bg-surface-neutral, #fff);
34
131
  color: var(--wpds-color-fg-content-neutral, #1e1e1e);
35
- border-radius: 8px;
36
132
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
37
133
  border: 1px solid var(--wpds-color-stroke-surface-neutral-weak, #ddd);
38
134
  position: relative;
135
+
136
+ // Mobile-first: full screen with lowest priority
137
+ position: fixed;
138
+ top: 0;
139
+ left: 0;
140
+ right: 0;
141
+ bottom: 0;
142
+ width: 100vw;
143
+ height: 100vh;
144
+ z-index: 1; // Lowest surface priority
145
+ border-radius: 0;
146
+ margin: 0;
147
+
148
+ // Desktop: restore original styles
149
+ @include mixins.break-medium {
150
+ position: static;
151
+ width: auto;
152
+ height: auto;
153
+ border-radius: 8px;
154
+ z-index: auto;
155
+ }
39
156
  }
40
157
 
41
158
  .boot-layout.has-canvas .boot-layout__stage,
42
159
  .boot-layout__inspector {
43
- max-width: 400px;
160
+ @include mixins.break-medium {
161
+ max-width: 400px;
162
+ }
44
163
  }
45
164
 
46
165
  .boot-layout__canvas .interface-interface-skeleton {
@@ -48,7 +48,12 @@ function SiteHub() {
48
48
  href={ homeUrl ?? '/' }
49
49
  className="boot-site-hub__title"
50
50
  >
51
- { siteTitle && decodeEntities( siteTitle ) }
51
+ <div className="boot-site-hub__title-text">
52
+ { siteTitle && decodeEntities( siteTitle ) }
53
+ </div>
54
+ <div className="boot-site-hub__url">
55
+ { filterURLForDisplay( homeUrl ?? '' ) }
56
+ </div>
52
57
  </ExternalLink>
53
58
  <HStack className="boot-site-hub__actions">
54
59
  <Button
@@ -17,17 +17,15 @@
17
17
  }
18
18
 
19
19
  .boot-site-hub__title {
20
- color: var(--wpds-color-fg-content-neutral, #1e1e1e);
21
- font-size: variables.$font-size-medium;
22
- font-weight: variables.$font-weight-medium;
23
- overflow: hidden;
24
- text-overflow: ellipsis;
25
- white-space: nowrap;
20
+ display: flex;
21
+ align-items: center;
26
22
  text-decoration: none;
27
23
 
28
24
  .components-external-link__contents {
29
25
  text-decoration: none;
30
26
  margin-inline-start: variables.$grid-unit-05;
27
+ overflow: hidden;
28
+ max-width: 140px;
31
29
  }
32
30
 
33
31
  // Show icon on hover
@@ -47,8 +45,25 @@
47
45
 
48
46
  &:focus:not(:active) {
49
47
  outline:
50
- var(--wpds-border-width-focus, 2px) solid
48
+ var(--wpds-border-width-interactive-focus, 2px) solid
51
49
  var(--wpds-color-stroke-focus-brand, #0073aa);
52
- outline-offset: calc(-1 * var(--wpds-border-width-focus, 2px));
50
+ outline-offset: calc(-1 * var(--wpds-border-width-interactive-focus, 2px));
53
51
  }
54
52
  }
53
+
54
+ .boot-site-hub__title-text {
55
+ color: var(--wpds-color-fg-content-neutral, #1e1e1e);
56
+ font-size: variables.$font-size-medium;
57
+ font-weight: variables.$font-weight-medium;
58
+ overflow: hidden;
59
+ text-overflow: ellipsis;
60
+ white-space: nowrap;
61
+ }
62
+
63
+ .boot-site-hub__url {
64
+ color: var(--wpds-color-fg-content-neutral-weak, #757575);
65
+ font-size: variables.$font-size-small;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
69
+ }
@@ -15,5 +15,5 @@
15
15
  height: variables.$grid-unit-40;
16
16
  object-fit: cover;
17
17
  aspect-ratio: 1 / 1;
18
- border-radius: var(--wpds-border-radius-medium, 4px);
18
+ border-radius: var(--wpds-border-radius-surface-md, 4px);
19
19
  }
@@ -17,8 +17,8 @@ $header-height: variables.$header-height;
17
17
 
18
18
  &:focus:not(:active) {
19
19
  outline:
20
- var(--wpds-border-width-focus, 2px) solid
20
+ var(--wpds-border-width-interactive-focus, 2px) solid
21
21
  var(--wpds-color-stroke-focus-brand, #0073aa);
22
- outline-offset: calc(-1 * var(--wpds-border-width-focus, 2px));
22
+ outline-offset: calc(-1 * var(--wpds-border-width-interactive-focus, 2px));
23
23
  }
24
24
  }
@@ -0,0 +1,35 @@
1
+ import {
2
+ type ThemeProvider as ThemeProviderType,
3
+ privateApis as themePrivateApis,
4
+ } from '@wordpress/theme';
5
+ import { unlock } from '../../lock-unlock';
6
+
7
+ const ThemeProvider: typeof ThemeProviderType =
8
+ unlock( themePrivateApis ).ThemeProvider;
9
+
10
+ const THEME_PRIMARY_COLORS = new Map< string, string >( [
11
+ [ 'light', '#0085ba' ],
12
+ [ 'modern', '#3858e9' ],
13
+ [ 'blue', '#096484' ],
14
+ [ 'coffee', '#46403c' ],
15
+ [ 'ectoplasm', '#523f6d' ],
16
+ [ 'midnight', '#e14d43' ],
17
+ [ 'ocean', '#627c83' ],
18
+ [ 'sunrise', '#dd823b' ],
19
+ ] );
20
+
21
+ export function getAdminThemePrimaryColor(): string | undefined {
22
+ const theme =
23
+ document.body.className.match( /admin-color-([a-z]+)/ )?.[ 1 ];
24
+
25
+ return theme && THEME_PRIMARY_COLORS.get( theme );
26
+ }
27
+
28
+ export function UserThemeProvider( {
29
+ color,
30
+ ...restProps
31
+ }: React.ComponentProps< typeof ThemeProvider > ) {
32
+ const primary = getAdminThemePrimaryColor();
33
+
34
+ return <ThemeProvider { ...restProps } color={ { primary, ...color } } />;
35
+ }
@@ -0,0 +1,11 @@
1
+ import { getAdminThemePrimaryColor } from '../index';
2
+
3
+ describe( 'getAdminThemePrimaryColor', () => {
4
+ it( 'should return the primary color for the admin theme from the body class', () => {
5
+ document.body.className = 'foo admin-color-coffee bar';
6
+
7
+ const primaryColor = getAdminThemePrimaryColor();
8
+
9
+ expect( primaryColor ).toBe( '#46403c' );
10
+ } );
11
+ } );
package/src/index.tsx CHANGED
@@ -2,5 +2,6 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  import './style.scss';
5
+ import './view-transitions.scss';
5
6
  export { init, initSinglePage } from './components/app';
6
7
  export { store } from './store';
@@ -63,6 +63,75 @@ export interface CanvasData {
63
63
  editLink?: string;
64
64
  }
65
65
 
66
+ /**
67
+ * Route lifecycle configuration exported from route_module.
68
+ * The module should export a named `route` object with these optional functions.
69
+ */
70
+ export interface RouteConfig {
71
+ /**
72
+ * Pre-navigation hook for authentication, validation, or redirects.
73
+ * Called before the route is loaded.
74
+ */
75
+ beforeLoad?: ( context: RouteLoaderContext ) => void | Promise< void >;
76
+
77
+ /**
78
+ * Data preloading function.
79
+ * Called when the route is being loaded.
80
+ */
81
+ loader?: ( context: RouteLoaderContext ) => Promise< unknown >;
82
+
83
+ /**
84
+ * Function that returns canvas data for rendering.
85
+ * - Returns CanvasData to use default editor canvas
86
+ * - Returns null to use custom canvas component from content_module
87
+ * - Returns undefined to show no canvas
88
+ */
89
+ canvas?: (
90
+ context: RouteLoaderContext
91
+ ) => Promise< CanvasData | null | undefined >;
92
+
93
+ /**
94
+ * Function that determines whether to show the inspector panel.
95
+ * When not defined, defaults to true (always show inspector if component exists).
96
+ * When it returns false, the inspector is hidden even if an inspector component is exported.
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * export const route = {
101
+ * inspector: ({ search }) => {
102
+ * // Only show inspector when items are selected
103
+ * return search.selectedIds?.length > 0;
104
+ * },
105
+ * };
106
+ * ```
107
+ */
108
+ inspector?: ( context: RouteLoaderContext ) => boolean | Promise< boolean >;
109
+
110
+ /**
111
+ * Function that returns the document title for the route.
112
+ * The returned title will be formatted as: "{title} ‹ {siteTitle} — WordPress"
113
+ * and announced to screen readers for accessibility.
114
+ *
115
+ * @param context Route context with params and search
116
+ * @return The document title string or a Promise resolving to a string
117
+ *
118
+ * @example
119
+ * ```tsx
120
+ * export const route = {
121
+ * title: async ({ params }) => {
122
+ * const post = await resolveSelect(coreStore).getEntityRecord(
123
+ * 'postType',
124
+ * params.type,
125
+ * params.id
126
+ * );
127
+ * return post?.title?.rendered || 'Edit Post';
128
+ * },
129
+ * };
130
+ * ```
131
+ */
132
+ title?: ( context: RouteLoaderContext ) => string | Promise< string >;
133
+ }
134
+
66
135
  /**
67
136
  * Route configuration interface.
68
137
  * Routes specify content_module for surfaces and optionally route_module for lifecycle functions.
@@ -85,13 +154,8 @@ export interface Route {
85
154
 
86
155
  /**
87
156
  * Module path for route lifecycle functions.
88
- * The module should export a named export `route` containing:
89
- * - beforeLoad?: Pre-navigation hook (authentication, validation, redirects)
90
- * - loader?: Data preloading function
91
- * - canvas?: Function that returns canvas data for rendering
92
- * - Returns CanvasData to use default editor canvas
93
- * - Returns null to use custom canvas component from content_module
94
- * - Returns undefined to show no canvas
157
+ * The module should export a named `route` object implementing RouteConfig.
158
+ * @see RouteConfig for available lifecycle functions.
95
159
  */
96
160
  route_module?: string;
97
161
  }
package/src/style.scss CHANGED
@@ -1,46 +1,32 @@
1
1
  @use "@wordpress/theme/src/prebuilt/css/design-tokens.css" as *;
2
2
  @use "@wordpress/admin-ui/build-style/style.css" as *;
3
3
  @use "@wordpress/base-styles/mixins" as *;
4
- @use "@wordpress/base-styles/variables";
4
+ @use "@wordpress/base-styles/variables" as *;
5
5
 
6
- // Reset wp-admin layout styles when loaded inside wp-admin.
7
6
  .boot-layout-container .boot-layout {
8
- height: calc(100vh - #{variables.$admin-bar-height});
9
- }
10
-
11
- body:has(.boot-layout-container) {
12
- background: #1d2327; // Same as WP-Admin sidebar
13
- overflow: hidden;
14
- }
15
-
16
- #wpcontent {
17
- padding-left: 0;
18
- }
19
-
20
- #wpbody-content {
21
- padding-bottom: 0;
22
- }
23
-
24
- #wpfooter {
25
- display: none;
26
- }
7
+ // On mobile the main content area has to scroll, otherwise you can invoke
8
+ // the overscroll bounce on the non-scrolling container, for a bad experience.
9
+ @include break-small {
10
+ position: absolute;
11
+ top: 0;
12
+ right: 0;
13
+ bottom: 0;
14
+ left: 0;
15
+ min-height: calc(100vh - #{$admin-bar-height-big});
16
+ }
27
17
 
28
- body:has(.boot-layout.has-full-canvas) {
18
+ // The WP header height changes at this breakpoint.
29
19
  @include break-medium {
30
- // Reset the html.wp-topbar padding.
31
- // Because this uses negative margins, we have to compensate for the height.
32
- margin-top: - variables.$admin-bar-height;
33
- height: calc(100% + #{ variables.$admin-bar-height });
20
+ min-height: calc(100vh - #{$admin-bar-height});
34
21
 
35
- #adminmenumain,
36
- #wpadminbar {
37
- display: none;
22
+ body:has(.boot-layout.has-full-canvas) & {
23
+ min-height: 100vh;
38
24
  }
25
+ }
39
26
 
40
- #wpcontent,
41
- #wpfooter {
42
- margin-left: 0;
43
- }
27
+ img {
28
+ max-width: 100%;
29
+ height: auto;
44
30
  }
45
31
  }
46
32