@walkeros/explorer 4.1.0-next-1778668930820 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,17 @@
1
- # walkerOS Explorer
1
+ <p align="left">
2
+ <a href="https://www.walkeros.io">
3
+ <img alt="walkerOS" title="walkerOS" src="https://www.walkeros.io/img/walkerOS_logo.svg" width="256px"/>
4
+ </a>
5
+ </p>
2
6
 
3
- Interactive React components for walkerOS documentation and exploration.
4
- Provides ready-to-use demo components with Monaco Editor integration for live
5
- code editing and event visualization.
7
+ # @walkeros/explorer
8
+
9
+ Interactive React components for walkerOS documentation and exploration, with
10
+ live code editing and event visualization.
11
+
12
+ [Documentation](https://www.walkeros.io/docs) &bull;
13
+ [NPM Package](https://www.npmjs.com/package/@walkeros/explorer) &bull;
14
+ [Source Code](https://github.com/elbwalker/walkerOS/tree/main/apps/explorer)
6
15
 
7
16
  ## Installation
8
17
 
@@ -10,679 +19,35 @@ code editing and event visualization.
10
19
  npm install @walkeros/explorer
11
20
  ```
12
21
 
13
- ## Usage
22
+ ## Quick start
23
+
24
+ Import a component and the stylesheet:
14
25
 
15
26
  ```tsx
16
27
  import { MappingDemo } from '@walkeros/explorer';
17
28
  import '@walkeros/explorer/styles.css';
18
- ```
19
-
20
- ## Architecture
21
-
22
- Components follow atomic design principles:
23
-
24
- - **Atoms**: Basic UI elements (Box, Button, Header, ButtonGroup, Toggle, etc.)
25
- - **Molecules**: Component combinations (AutoSelect, MappingEditor, TreeSidebar)
26
- - **Organisms**: Complex components (MappingBox, CodeBox, MappingEditorTabs)
27
- - **Demos**: Ready-to-use complete demos (MappingDemo, PromotionPlayground)
28
-
29
- ### Design Principles
30
-
31
- **Component Reusability**
32
-
33
- - All components are composable and reusable
34
- - Shared components over duplicate code
35
- - Atomic design ensures scalability
36
-
37
- **No Inline Styles**
38
-
39
- - All styling via CSS classes and CSS variables
40
- - Inline styles are forbidden
41
- - Use CSS modules or SCSS for styling
42
-
43
- **Theme Support Required**
44
29
 
45
- - All components support light/dark themes
46
- - Theme switching via `data-theme` attribute
47
- - CSS variables automatically adapt
48
-
49
- ## Components
50
-
51
- ### Demos (Ready-to-Use)
52
-
53
- #### MappingDemo
54
-
55
- Interactive three-panel editor: input → config → output transformation.
56
-
57
- ```tsx
58
30
  <MappingDemo
59
31
  input='{"name": "example"}'
60
32
  config='{"transform": "uppercase"}'
61
- labelInput="Event"
62
- labelConfig="Rules"
63
- labelOutput="Result"
64
- fn={async (input, config) => {
65
- const data = JSON.parse(input);
66
- const rules = JSON.parse(config);
67
- return JSON.stringify(result, null, 2);
68
- }}
69
- />
70
- ```
71
-
72
- #### PromotionPlayground
73
-
74
- Interactive playground for walkerOS promotion events (used in documentation).
75
-
76
- ### Organisms
77
-
78
- #### MappingBox
79
-
80
- Visual mapping configuration editor with code view toggle.
81
-
82
- ```tsx
83
- import { MappingBox } from '@walkeros/explorer';
84
-
85
- <MappingBox
86
- mapping={{
87
- product: {
88
- view: { name: 'view_item', data: { map: { value: 'data.price' } } },
89
- },
90
- }}
91
- onMappingChange={setMapping}
92
- label="GA4 Mapping"
93
- useNewEditor={true}
94
- showTree={true}
95
- />;
96
- ```
97
-
98
- Features:
99
-
100
- - Visual/Code view toggle
101
- - Tab-based navigation
102
- - Tree sidebar with breadcrumbs
103
- - Property-focused editing panels
104
- - RJSF-based forms with custom widgets
105
-
106
- #### MappingEditorTabs
107
-
108
- Advanced tab-based mapping editor with tree navigation.
109
-
110
- ```tsx
111
- import { MappingEditorTabs } from '@walkeros/explorer';
112
-
113
- <MappingEditorTabs
114
- initialMapping={config}
115
- onChange={handleChange}
116
- layout="responsive"
117
- showTree={true}
118
- />;
119
- ```
120
-
121
- Layouts:
122
-
123
- - `compact`: Single column, mobile-optimized (< 800px)
124
- - `medium`: Two columns with collapsible sidebar (800-1200px)
125
- - `wide`: Three columns with persistent sidebar (> 1200px)
126
- - `responsive`: Auto-detects based on viewport
127
-
128
- #### LiveCode
129
-
130
- Generic live code execution with input/config/output panels.
131
-
132
- ```tsx
133
- <LiveCode
134
- input={{ name: 'test event', data: {} }}
135
- config={{ mapping: 'rules' }}
136
- fn={async (input, config, log) => {
137
- log('Processing...', input);
138
- }}
139
- fnName="myFunction"
140
- />
141
- ```
142
-
143
- #### CodePanel
144
-
145
- Monaco editor with label and formatting controls.
146
-
147
- ```tsx
148
- <CodePanel
149
- label="Configuration"
150
- value='{"key": "value"}'
151
- language="json"
152
- onChange={setValue}
153
- />
154
- ```
155
-
156
- #### BrowserBox
157
-
158
- Multi-tab code editor (HTML/CSS/JS) with live preview.
159
-
160
- ```tsx
161
- <BrowserBox
162
- html="<div>Hello</div>"
163
- css="div { color: red; }"
164
- js="console.log('loaded')"
165
- onHtmlChange={setHtml}
166
- showPreview={true}
167
- initialTab="preview"
168
- />
169
- ```
170
-
171
- #### CollectorBox
172
-
173
- Displays collector processing with mapping and destination output.
174
-
175
- ```tsx
176
- <CollectorBox
177
- event='{"name": "page view"}'
178
- mapping='{"page": {"view": {"name": "pageview"}}}'
179
- destination={destination}
180
- />
181
- ```
182
-
183
- ### Molecules
184
-
185
- #### CodeEditor
186
-
187
- Monaco Editor wrapper.
188
-
189
- ```tsx
190
- <CodeEditor
191
- value="console.log('hello')"
192
- language="javascript"
193
- onChange={setValue}
194
- />
195
- ```
196
-
197
- #### Preview
198
-
199
- HTML preview in isolated iframe with walkerOS event capture.
200
-
201
- ```tsx
202
- <Preview
203
- html="<div data-elb='product'>Item</div>"
204
- css="div { padding: 20px; }"
205
- onEvent={(event) => console.log(event)}
206
- />
207
- ```
208
-
209
- #### MappingTreeSidebar
210
-
211
- Hierarchical tree view for mapping navigation.
212
-
213
- ```tsx
214
- import { MappingTreeSidebar } from '@walkeros/explorer';
215
-
216
- <MappingTreeSidebar
217
- config={mappingConfig}
218
- currentPath={['product', 'view']}
219
- expandedPaths={expandedPaths}
220
- visible={true}
221
- onToggle={handleToggle}
222
- onNavigate={handleNavigate}
223
- onAddAction={handleAddAction}
224
- onAddEntity={handleAddEntity}
225
- />;
226
- ```
227
-
228
- #### AutoSelect
229
-
230
- Dropdown with autocomplete for key selection.
231
-
232
- ```tsx
233
- import { AutoSelect } from '@walkeros/explorer';
234
-
235
- <AutoSelect
236
- value={selectedKey}
237
- options={['data.id', 'data.name', 'user.email']}
238
- onChange={setValue}
239
- placeholder="Select property..."
33
+ fn={async (input, config) => transform(input, config)}
240
34
  />;
241
35
  ```
242
36
 
243
- ### Atoms
244
-
245
- #### Box, Header, Button, ButtonGroup
246
-
247
- Basic UI building blocks. See exported types for prop details.
248
-
249
- ```tsx
250
- import { Box, Button, ButtonGroup } from '@walkeros/explorer';
251
-
252
- <Box header="Title" resizable={true}>
253
- <ButtonGroup
254
- buttons={[
255
- { label: 'Option 1', value: '1', active: true },
256
- { label: 'Option 2', value: '2', active: false },
257
- ]}
258
- onButtonClick={handleClick}
259
- />
260
- </Box>;
261
- ```
262
-
263
- #### Toggle
264
-
265
- Theme-aware toggle switch component.
266
-
267
- ```tsx
268
- import { Toggle } from '@walkeros/explorer';
269
-
270
- <Toggle checked={isEnabled} onChange={setIsEnabled} label="Enable feature" />;
271
- ```
272
-
273
- ### Helpers
274
-
275
- #### Destination Creators
276
-
277
- ```tsx
278
- import {
279
- createGtagDestination,
280
- createFbqDestination,
281
- createPlausibleDestination,
282
- } from '@walkeros/explorer';
283
-
284
- const gtag = createGtagDestination();
285
- gtag.env = { elb: (output) => console.log(output) };
286
- ```
287
-
288
- ## Styling
289
-
290
- **Complete styling documentation:** [STYLE.md](./STYLE.md)
291
-
292
- ### Quick Start
293
-
294
- ```tsx
295
- import '@walkeros/explorer/styles.css';
296
- ```
297
-
298
- ```html
299
- <!-- Theme switching -->
300
- <html data-theme="dark">
301
- ...
302
- </html>
303
- ```
304
-
305
- ### Customization
306
-
307
- ```css
308
- .my-app .elb-explorer {
309
- --color-button-primary: #ff6b35;
310
- --bg-box: #fafafa;
311
- --font-size-base: 16px;
312
- }
313
- ```
314
-
315
- **See [STYLE.md](./STYLE.md) for:**
316
-
317
- - Complete Theme Variables Reference (all CSS variables)
318
- - Grid System (height modes, implementation)
319
- - Monaco Editor (theming, tokens, IntelliSense)
320
- - SCSS Architecture & Design Rules
321
- - Common Tasks & Troubleshooting
322
-
323
- ### Component Styling Guidelines
324
-
325
- When contributing components:
326
-
327
- **✅ DO:**
328
-
329
- - Use CSS classes with the `elb-` prefix
330
- - Use CSS variables for colors, spacing, typography
331
- - Support both light and dark themes
332
- - Use responsive design patterns
333
- - Reuse existing components and styles
334
-
335
- **❌ DON'T:**
336
-
337
- - Use inline `style` attributes
338
- - Hardcode colors or spacing values
339
- - Create duplicate components
340
- - Use theme-specific selectors in component files
341
- - Use magic numbers (use CSS variables instead)
342
-
343
- ### SCSS Architecture (CRITICAL - Must Follow Exactly)
344
-
345
- **IMPORTANCE**: The explorer uses a strict, modular SCSS architecture. All new
346
- components MUST follow the established patterns. Non-compliance breaks the
347
- design system.
348
-
349
- **Architecture:**
350
-
351
- ```
352
- src/styles/
353
- ├── index.scss # Main entry point (import new components here)
354
- ├── theme/
355
- │ ├── _tokens.scss # SCSS tokens ($spacing-md: 12px, $radius-sm: 3px)
356
- │ ├── _variables.scss # CSS variables (--bg-input, --color-text, etc.)
357
- │ └── _dark.scss # Dark theme overrides
358
- ├── foundation/
359
- │ ├── _reset.scss
360
- │ ├── _typography.scss
361
- │ ├── _layout.scss # Grid/flex mixins
362
- │ ├── _spacing.scss # Spacing mixins
363
- │ └── _responsive.scss # Breakpoint mixins
364
- └── components/
365
- ├── atoms/ # _button.scss, _consent-widget.scss, etc.
366
- ├── molecules/ # _rjsf-form.scss, _mapping-editor.scss, etc.
367
- └── organisms/ # _box.scss, _mapping-box.scss, etc.
368
- ```
369
-
370
- #### SCSS Compliance Rules (MANDATORY)
371
-
372
- **✅ DO:**
373
-
374
- 1. **Use ONLY defined CSS variables** from `theme/_variables.scss`:
375
- - `--bg-input`, `--border-input`, `--radius-button` (standard form elements)
376
- - `--color-text`, `--color-text-muted`, `--color-text-label` (typography)
377
- - `--font-family-base`, `--font-mono` (fonts)
378
- - `--font-size-base` (base font size)
379
- 2. **Use `calc()` for font size variations**:
380
- - Small text: `calc(var(--font-size-base) - 1px)` (NOT `--font-size-sm`)
381
- - Tiny text: `calc(var(--font-size-base) - 2px)` (NOT `--font-size-xs`)
382
- 3. **Follow BEM naming**: `elb-{component}-{element}--{modifier}`
383
- - Example: `.elb-settings-widget-wrapper`, `.elb-settings-widget-form`
384
- 4. **Use standard gaps**: `12px` for vertical spacing in flex/grid layouts
385
- 5. **One file per component**: Create `_component-name.scss` in appropriate
386
- directory
387
- 6. **Import alphabetically**: Add `@use './components/atoms/your-widget';` in
388
- `index.scss`
389
-
390
- **❌ DON'T:**
391
-
392
- 1. **NEVER use undefined CSS variables**:
393
- - ❌ `--bg-secondary`, `--bg-code`, `--border-subtle`, `--radius-base` (don't
394
- exist)
395
- - ❌ `--font-size-sm`, `--font-size-xs` (don't exist as CSS variables)
396
- - ❌ `--font-family-mono` (should be `--font-mono`)
397
- 2. **NEVER hardcode values** that have CSS variable equivalents
398
- 3. **NEVER skip the wrapper pattern**: All widgets need `elb-rjsf-widget` →
399
- `elb-{name}-widget-wrapper`
400
- 4. **NEVER create duplicate styles** - check existing components first
401
-
402
- #### CSS Variable Reference (Commonly Used)
403
-
404
- ```scss
405
- // Backgrounds
406
- --bg-input: #ffffff; // Form inputs, fallback containers
407
- --bg-input-hover: #f9f9f9; // Hover states
408
-
409
- // Borders
410
- --border-input: #d1d5db; // Form inputs, containers
411
- --border-input-focus: #3b82f6; // Focus states
412
-
413
- // Border Radius
414
- --radius-button: 3px; // Forms, small elements
415
- --radius-box: 4px; // Boxes, containers
416
-
417
- // Typography
418
- --color-text: #000; // Primary text
419
- --color-text-muted: #666; // Secondary/hint text
420
- --color-text-label: #424242; // Labels
421
- --font-family-base: system-ui, ...; // Body text
422
- --font-mono: 'SF Mono', ...; // Code blocks
423
- --font-size-base: 14px; // Base size
424
-
425
- // Buttons
426
- --color-button-primary: #3b82f6; // Primary actions
427
- --color-button-danger: #ef4444; // Destructive actions
428
- ```
429
-
430
- **Full list**: See `src/styles/theme/_variables.scss`
431
-
432
- #### Example: Widget SCSS (Correct Pattern)
433
-
434
- ```scss
435
- // _my-widget.scss
436
- .elb-my-widget-wrapper {
437
- width: 100%;
438
- }
439
-
440
- .elb-my-widget-form {
441
- display: flex;
442
- flex-direction: column;
443
- gap: 12px; // Standard gap
444
- }
445
-
446
- .elb-my-widget-hint {
447
- font-size: calc(var(--font-size-base) - 1px); // ✅ Correct
448
- color: var(--color-text-muted); // ✅ Defined variable
449
- margin: 0;
450
- }
451
-
452
- .elb-my-widget-code {
453
- padding: 12px;
454
- background-color: var(--bg-input); // ✅ Defined variable
455
- border: 1px solid var(--border-input); // ✅ Defined variable
456
- border-radius: var(--radius-button); // ✅ Defined variable
457
- font-family: var(--font-mono); // ✅ Correct variable name
458
- }
459
- ```
460
-
461
- #### Verification Checklist
462
-
463
- Before submitting SCSS changes:
464
-
465
- - [ ] All CSS variables exist in `theme/_variables.scss`
466
- - [ ] No hardcoded colors, spacing, or font sizes (use CSS variables)
467
- - [ ] BEM naming convention followed (`elb-{component}-{element}`)
468
- - [ ] File imported in `index.scss` (alphabetical order)
469
- - [ ] Build succeeds: `npm run build`
470
- - [ ] Component matches pattern of similar existing components
471
- - [ ] Tested in both light and dark themes
472
-
473
- See [LAYOUT.md](./LAYOUT.md) for the complete SCSS migration plan.
474
-
475
- ## Development
476
-
477
- ```bash
478
- npm install # Install dependencies
479
- npm run start # Start Vite dev server
480
- npm test # Run tests
481
- npm run build # Build package
482
- npm run lint # Lint code
483
- ```
484
-
485
- ### Contributing Components
486
-
487
- Follow these principles when creating new components:
488
-
489
- 1. **Atomic Design**: Place components in correct directory
490
- (atoms/molecules/organisms)
491
- 2. **Reusability**: Extract shared logic into hooks, shared styles into SCSS
492
- modules
493
- 3. **Theme Support**: Use CSS variables, test both light/dark themes
494
- 4. **No Inline Styles**: All styling via CSS classes
495
- 5. **TypeScript**: Strict typing, export all public types
496
- 6. **Accessibility**: Semantic HTML, ARIA attributes, keyboard navigation
497
- 7. **RJSF Patterns**: Follow Field/Widget separation for RJSF components (see
498
- [PATTERNS.md](./PATTERNS.md))
499
-
500
- ### RJSF Component Architecture (CRITICAL)
501
-
502
- **When creating RJSF custom components, you MUST follow the Field/Widget
503
- separation pattern.**
504
-
505
- See [PATTERNS.md](./PATTERNS.md) for comprehensive documentation of:
506
-
507
- - **Field/Widget Separation**: Mandatory two-layer architecture
508
- - **Component Composition**: MappingCollapsible, MappingFormWrapper, IconButton
509
- - **State Management**: Controlled state, external sync, deduplication
510
- - **Data Flow**: Schema passing via `ui:options`, props threading
511
- - **CSS Conventions**: BEM with `elb-` prefix
512
- - **Common Utilities**: `cleanFormData`, type guards, validators
513
- - **Anti-Patterns**: What NOT to do (with examples)
514
-
515
- **Quick Reference - All RJSF Components:**
516
-
517
- | Field | Widget | Purpose |
518
- | ----------------------- | ------------------------ | ------------------------- |
519
- | `MappingConsentField` | `MappingConsentWidget` | Consent states (checkbox) |
520
- | `MappingConditionField` | `MappingConditionWidget` | Condition code editor |
521
- | `MappingDataField` | `MappingDataWidget` | Data transformation rows |
522
- | `MappingGlobalsField` | `MappingGlobalsWidget` | Global properties |
523
- | `MappingContextField` | `MappingContextWidget` | Context properties |
524
- | `MappingNestedField` | `MappingNestedWidget` | Nested entities |
525
- | `MappingSettingsField` | `MappingSettingsWidget` | Destination settings |
526
-
527
- **Field responsibilities** (~20 lines):
528
-
529
- - Convert `FieldProps` → `WidgetProps`
530
- - Pass through props (id, value, onChange, schema, uiSchema, rawErrors,
531
- disabled, readonly)
532
- - No UI logic
533
-
534
- **Widget responsibilities** (100-300 lines):
535
-
536
- - Implement full UI using standard building blocks
537
- - Manage component state (expand/collapse, show/hide, previous values)
538
- - Handle form changes and cleanup
539
- - Sync with external value changes via `useEffect`
540
- - Use `MappingCollapsible` for toggle/checkbox UI
541
- - Use `MappingFormWrapper` for nested forms
542
- - Use `IconButton` for actions
543
- - Use `cleanFormData` to remove empty values
544
-
545
- See [PATTERNS.md](./PATTERNS.md) for detailed examples and implementation
546
- checklist.
547
-
548
- ### Component Checklist
549
-
550
- **Before submitting any component:**
551
-
552
- - [ ] Component placed in correct atomic layer (atoms/molecules/organisms)
553
- - [ ] TypeScript types exported from component file
554
- - [ ] **SCSS compliance verified** (see SCSS Architecture section above):
555
- - [ ] All CSS variables exist in `theme/_variables.scss`
556
- - [ ] BEM naming: `elb-{component}-{element}`
557
- - [ ] SCSS file created in correct directory (`atoms/`, `molecules/`,
558
- `organisms/`)
559
- - [ ] SCSS imported in `index.scss` (alphabetical order)
560
- - [ ] No hardcoded values (colors, spacing, fonts)
561
- - [ ] Uses `calc(var(--font-size-base) - Npx)` for size variations
562
- - [ ] Light and dark theme tested
563
- - [ ] No inline `style` attributes
564
- - [ ] Responsive design considered
565
- - [ ] Reuses existing components where possible (MappingCollapsible, IconButton,
566
- etc.)
567
- - [ ] **RJSF components follow Field/Widget separation pattern** (see
568
- [PATTERNS.md](./PATTERNS.md))
569
- - [ ] Build succeeds: `npm run build`
570
- - [ ] Exported from `src/index.ts` (if public API)
571
-
572
- ## Monaco Editor Height Management
573
-
574
- The explorer uses Monaco Editor with a flexible, responsive height system that
575
- works across all contexts.
576
-
577
- ### Height Modes
578
-
579
- CodeBox supports three height modes:
580
-
581
- 1. **Default (height="100%")**: Fills parent container
582
- - Use in Grid contexts for equal row heights
583
- - Use in Flex contexts to fill available space
584
- - Requires parent with explicit height or bounded context
585
-
586
- 2. **Auto-height (autoHeight prop)**: Dynamically sizes to content
587
- - Grows/shrinks based on Monaco's content height
588
- - Respects min/max boundaries (customizable)
589
- - Eliminates blank space in standalone contexts
590
- - Updates automatically when content changes
591
-
592
- 3. **Explicit height**: Fixed pixel or viewport height
593
- - Override with `height` prop (e.g., `height="600px"` or `height="50vh"`)
594
-
595
- ### Usage Examples
596
-
597
- **Grid Context - Equal Heights:**
598
-
599
- ```tsx
600
- // Don't use autoHeight - maintains equal row heights
601
- <Grid columns={3}>
602
- <CodeBox code={event} label="Event" />
603
- <CodeBox code={mapping} label="Mapping" />
604
- <CodeBox code={output} label="Output" />
605
- </Grid>
606
- ```
607
-
608
- **Standalone - Content-Based Height:**
609
-
610
- ```tsx
611
- // Use autoHeight to eliminate blank space
612
- <CodeBox
613
- code={setupExample}
614
- label="Setup"
615
- autoHeight={{ min: 100, max: 600 }}
616
- disabled
617
- />
618
- ```
619
-
620
- **Flex Context - Fill Parent:**
621
-
622
- ```tsx
623
- // Don't use autoHeight - fills available flex space
624
- <div style={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>
625
- <CodeBox code={largeConfig} onChange={setConfig} />
626
- </div>
627
- ```
628
-
629
- **Explicit Height Override:**
630
-
631
- ```tsx
632
- <CodeBox code={longCode} height="600px" />
633
- ```
634
-
635
- ### How Auto-Height Works
636
-
637
- When `autoHeight` is enabled:
638
-
639
- 1. Monaco Editor's `getContentHeight()` API measures actual content height
640
- 2. Hook listens to `onDidContentSizeChange` events (debounced)
641
- 3. Height calculated and bounded by min/max values
642
- 4. Monaco receives explicit pixel height (e.g., `height="347px"`)
643
- 5. Updates automatically on content changes, typing, or formatting
644
-
645
- **Technical Details:**
646
-
647
- - Uses `useMonacoHeight` hook with Monaco's official APIs
648
- - Avoids infinite loops by not calling `layout()` in content change handler
649
- - Includes overhead calculation for header/borders (45px)
650
- - Default boundaries: min=100px, max=600px (customizable)
651
-
652
- ### Key Files
653
-
654
- - `explorer/src/components/atoms/code.tsx` - Monaco wrapper with autoHeight
655
- integration
656
- - `explorer/src/hooks/useMonacoHeight.ts` - Content height calculation hook
657
- - `explorer/src/styles/components/atoms/_code.scss` - Flex-based Monaco
658
- container
659
- - `explorer/src/styles/components/organisms/_box.scss` - Context-specific height
660
- rules
661
-
662
- ### Troubleshooting
663
-
664
- **Monaco shows wrong height?**
665
-
666
- - Check parent context: Grid, Flex, or standalone?
667
- - Grid/Flex: Don't use autoHeight (use default height="100%")
668
- - Standalone: Add `autoHeight={{ min: 100, max: 600 }}`
669
- - Override with explicit `height` prop if needed
670
-
671
- **AutoHeight not working?**
672
-
673
- - Ensure Monaco has mounted (check browser console for errors)
674
- - Verify min/max boundaries aren't too restrictive
675
- - Check that content is actually rendering (empty code = min height)
37
+ Switch themes via the `data-theme` attribute on a parent element (`light` or
38
+ `dark`).
676
39
 
677
- **Height grows infinitely?**
40
+ ## Documentation
678
41
 
679
- - Should not happen with current implementation
680
- - Hook avoids calling `layout()` in content change handler
681
- - Report if you encounter this bug
42
+ Full component reference, styling, and examples live in the docs:
43
+ **https://www.walkeros.io/docs**
682
44
 
683
- ## Browser Support
45
+ ## Contribute
684
46
 
685
- Chrome 80+, Firefox 75+, Safari 13+, Edge 80+
47
+ Feel free to contribute by submitting an
48
+ [issue](https://github.com/elbwalker/walkerOS/issues), starting a
49
+ [discussion](https://github.com/elbwalker/walkerOS/discussions), or getting in
50
+ [contact](https://calendly.com/elb-alexander/30min).
686
51
 
687
52
  ## License
688
53