@seeqdev/qomponents 0.0.246-beta.970c2728b5.20261002 → 0.0.247-beta.07c08cf155.20261013

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 (87) hide show
  1. package/README-internal.md +274 -0
  2. package/README.md +21 -15
  3. package/dist/example/{.eslintrc.js → .eslintrc.cjs} +2 -1
  4. package/dist/example/.gitignore +24 -0
  5. package/dist/example/README.md +3 -1
  6. package/dist/example/package.json +5 -7
  7. package/dist/example/src/Example.tsx +79 -96
  8. package/dist/example/src/index.css +132 -3
  9. package/dist/example/tsconfig.json +3 -2
  10. package/dist/example/vite.config.ts +12 -7
  11. package/dist/index.esm.js +29 -298
  12. package/dist/index.esm.js.map +1 -1
  13. package/dist/index.js +23 -484
  14. package/dist/index.js.map +1 -1
  15. package/dist/src/Accordion/Accordion.d.ts +3 -2
  16. package/dist/src/Accordion/Accordion.types.d.ts +5 -0
  17. package/dist/src/Alert/Alert.d.ts +1 -0
  18. package/dist/src/Alert/Alert.types.d.ts +3 -0
  19. package/dist/src/Badge/Badge.d.ts +3 -8
  20. package/dist/src/Badge/Badge.types.d.ts +3 -0
  21. package/dist/src/Button/Button.d.ts +4 -2
  22. package/dist/src/Button/Button.styles.d.ts +131 -0
  23. package/dist/src/Button/Button.types.d.ts +3 -0
  24. package/dist/src/ButtonGroup/ButtonGroup.d.ts +2 -2
  25. package/dist/src/ButtonGroup/ButtonGroup.types.d.ts +3 -0
  26. package/dist/src/ButtonWithDropdown/ButtonWithDropdown.d.ts +5 -3
  27. package/dist/src/ButtonWithDropdown/ButtonWithDropdown.types.d.ts +10 -0
  28. package/dist/src/ButtonWithPopover/ButtonWithPopover.d.ts +4 -2
  29. package/dist/src/ButtonWithPopover/ButtonWithPopover.types.d.ts +6 -0
  30. package/dist/src/Carousel/Carousel.d.ts +4 -2
  31. package/dist/src/Carousel/Carousel.types.d.ts +5 -0
  32. package/dist/src/Checkbox/Checkbox.d.ts +2 -2
  33. package/dist/src/Checkbox/Checkbox.types.d.ts +7 -0
  34. package/dist/src/Collapse/Collapse.d.ts +2 -2
  35. package/dist/src/ColorPickerControl/ColorPickerControl.d.ts +4 -2
  36. package/dist/src/ColorPickerControl/ColorPickerControl.types.d.ts +6 -0
  37. package/dist/src/ColorSwatch/ColorSwatch.types.d.ts +4 -0
  38. package/dist/src/EditorPanel/EditorPanel.d.ts +1 -0
  39. package/dist/src/EditorPanel/EditorPanel.types.d.ts +3 -0
  40. package/dist/src/ExternalLink/ExternalLink.d.ts +6 -6
  41. package/dist/src/ExternalLink/ExternalLink.types.d.ts +7 -5
  42. package/dist/src/Icon/Icon.types.d.ts +3 -0
  43. package/dist/src/LoadingIndicator/LoadingIndicator.d.ts +3 -2
  44. package/dist/src/LoadingIndicator/LoadingIndicator.types.d.ts +5 -2
  45. package/dist/src/Modal/Modal.d.ts +3 -2
  46. package/dist/src/Modal/Modal.types.d.ts +4 -0
  47. package/dist/src/Paginator/Paginator.d.ts +11 -3
  48. package/dist/src/Paginator/Paginator.styles.d.ts +130 -0
  49. package/dist/src/Paginator/Paginator.types.d.ts +1 -6
  50. package/dist/src/Paginator/Paginator.utilities.d.ts +2 -14
  51. package/dist/src/Pill/Pill.d.ts +4 -3
  52. package/dist/src/Pill/Pill.types.d.ts +3 -0
  53. package/dist/src/ProgressBar/ProgressBar.d.ts +3 -2
  54. package/dist/src/ProgressBar/ProgressBar.types.d.ts +7 -0
  55. package/dist/src/SeeqActionDropdown/SeeqActionDropdown.d.ts +4 -2
  56. package/dist/src/SeeqActionDropdown/SeeqActionDropdown.types.d.ts +10 -0
  57. package/dist/src/SeeqActionDropdown/variants.d.ts +4 -4
  58. package/dist/src/SegmentedControl/SegmentedControl.d.ts +3 -2
  59. package/dist/src/SegmentedControl/SegmentedControl.types.d.ts +4 -0
  60. package/dist/src/Select/Select.d.ts +5 -2
  61. package/dist/src/Select/Select.types.d.ts +8 -0
  62. package/dist/src/Slider/Slider.d.ts +6 -2
  63. package/dist/src/Slider/Slider.types.d.ts +11 -0
  64. package/dist/src/SvgIcon/SvgIcon.d.ts +3 -2
  65. package/dist/src/SvgIcon/SvgIcon.types.d.ts +3 -0
  66. package/dist/src/Tabs/Tabs.d.ts +3 -2
  67. package/dist/src/Tabs/Tabs.types.d.ts +9 -0
  68. package/dist/src/TextArea/TextArea.types.d.ts +3 -0
  69. package/dist/src/TextField/TextField.d.ts +2 -0
  70. package/dist/src/TextField/TextField.types.d.ts +4 -1
  71. package/dist/src/ToolbarButton/ToolbarButton.d.ts +7 -2
  72. package/dist/src/ToolbarButton/ToolbarButton.types.d.ts +18 -0
  73. package/dist/src/Tooltip/Qtip.d.ts +2 -2
  74. package/dist/src/TriggerWithDropdown/TriggerWithDropdown.types.d.ts +6 -1
  75. package/dist/src/index.build.d.ts +3 -2
  76. package/dist/src/index.d.ts +3 -2
  77. package/dist/src/styles/controls.d.ts +24 -0
  78. package/dist/src/styles/overlays.d.ts +119 -0
  79. package/dist/src/theme/colors.stylex.d.ts +100 -0
  80. package/dist/src/theme/controls.stylex.d.ts +21 -0
  81. package/dist/src/theme/palette.stylex.d.ts +32 -0
  82. package/dist/src/theme/themes.d.ts +958 -0
  83. package/dist/src/types.d.ts +2 -2
  84. package/dist/styles.css +144 -3535
  85. package/package.json +8 -11
  86. package/dist/src/Paginator/Paginator.constants.d.ts +0 -35
  87. package/dist/src/utils/fieldStyleClasses.d.ts +0 -4
@@ -0,0 +1,274 @@
1
+ # Qomponents
2
+
3
+ WARNING: Any change to files under `src/` will be published publicly to the
4
+ `@seeqdev/qomponents` package on npm. Review changes carefully and follow the
5
+ release process.
6
+
7
+ Qomponents is the UI component library used at Seeq. It's built with React, StyleX, and headless UI component
8
+ libraries to codify the design standards of Seeq's web assets.
9
+
10
+ ## StyleX styling and themes
11
+
12
+ The migration keeps qomponents a conventional StyleX library: named token exports in `.stylex.ts` modules,
13
+ `createTheme` overrides, and component styles composed with `stylex.props`. Legacy CSS names, Tailwind mappings,
14
+ and old theme selectors belong in a webserver compatibility adapter, not the permanent token API.
15
+
16
+ ### Shared control styles
17
+
18
+ `TextField`, `TextArea`, `Select`, and `Checkbox` compose the shared border, hover/focus, invalid, and disabled
19
+ styles in `src/styles/controls.ts`. Fixed border widths, radii, dimensions, and typography use `defineConsts`, so
20
+ compiled CSS contains literal values. Components retain their own layout and native behavior. Checkbox and radio
21
+ borders now use the same neutral/hover/disabled color contract as the other controls.
22
+
23
+ ### StyleX token modules
24
+
25
+ - `src/theme/colors.stylex.ts` defines one color contract for the UI, including neutral colors and product accents.
26
+ Add future semantic color roles to this contract rather than introducing independently applied sub-themes.
27
+ - `src/theme/controls.stylex.ts` contains fixed control dimensions and typography as compile-time constants.
28
+ Monorepo consumers can import them from the source-only `@seeqdev/qomponents/stylex` subpath.
29
+ This subpath is not published; external consumers use the compiled components and exported `themes`.
30
+ - `src/theme/palette.stylex.ts` shares literal product accent values with the temporary webserver adapter.
31
+ - `src/theme/themes.ts` exports `themes[product][mode]`, a complete theme for each product and light/dark mode.
32
+ Apply one theme with `stylex.props` at each boundary, including portal roots. Nested themes reset the whole
33
+ color contract; adding colors does not add more theme classes to the boundary.
34
+
35
+ These modules use ordinary StyleX-generated variable names. Import definitions directly from their `.stylex`
36
+ module; do not add a legacy-name token API or hardcode generated identifiers. Webserver's temporary
37
+ [`legacyTheme.utilities.ts`](../webserver/app/src/styles/legacyTheme.utilities.ts) applies a complete product/mode
38
+ theme alongside its existing `color_*`, `tw-dark`, and `light` classes. Its main switcher, standalone page roots,
39
+ and local home screen dark boundaries use the adapter. Standalone page updates remove stale theme classes while
40
+ preserving unrelated body classes. Portals mounted under `body` inherit the global theme; components that portal out
41
+ of a local boundary must explicitly carry that boundary's theme during their migration.
42
+
43
+ The adapter preserves legacy palette variables; it does not globally remap broad tokens such as disabled-gray,
44
+ whose meanings differ across existing controls. Add role-specific Tailwind aliases only with the consumers that
45
+ need them. Delete the class adapter once webserver's legacy theme selectors have no consumers.
46
+
47
+ Components use these tokens and shared state styles. Colors use `defineVars` for theme switching; fixed
48
+ dimensions and typography use `defineConsts` so generated CSS contains readable literal values. `themes` is exported from the
49
+ public component barrel and compiled into the published package. Definitions for authoring new StyleX styles still
50
+ come directly from the workspace `.stylex` modules.
51
+
52
+ TextField keeps its current dimensions, font sizes, joined edges, placeholder colors, native disabled/read-only
53
+ behavior, and number-input handling. Light fields inherit their containing surface; dark fields use the dark control
54
+ surface. `fieldBackground` defaults to CSS `initial`, and `firstThatWorks` supplies the `inherit` fallback. Webserver's
55
+ adapter overrides this token to white in light mode, preserving its legacy forms reset without coupling the library
56
+ to that reset.
57
+
58
+ `showError` also sets `aria-invalid` on the input. Consumer validation tests should assert invalid state
59
+ (`toBeInvalid()`) rather than styling classes. When testing
60
+ whether an error is surfaced before validation (for example, during loading), check `aria-invalid` directly:
61
+ `toBeInvalid()` also checks native constraints such as `required`.
62
+
63
+ Use `xstyle` for StyleX overrides; it is composed after the field's built-in styles. `extraClassNames` remains available
64
+ for layout utilities, test hooks, and legacy CSS. Class-string order does not determine precedence. During migration,
65
+ webserver declares its layer order before importing Tailwind: `theme, base, components, stylex, utilities`.
66
+ This temporary host-side bridge preserves existing utility overrides while keeping resets below component styles.
67
+ It does not change the library's generated CSS or StyleX composition API. Remove the bridge after webserver's
68
+ utility overrides are migrated; new StyleX overrides should use `xstyle`.
69
+ The existing `inputWidth` and `inputHeight` props remain explicit dimension overrides and preserve dynamic `xstyle`
70
+ custom properties.
71
+
72
+ ```tsx
73
+ import * as stylex from '@stylexjs/stylex';
74
+ import { TextField, themes } from '@seeqdev/qomponents';
75
+
76
+ <div {...stylex.props(themes.analysis.dark)}>
77
+ <TextField placeholder="Name" />
78
+ </div>;
79
+ ```
80
+
81
+ Selecting these compiled themes requires only the StyleX runtime, not a compiler. Import the published `styles.css`
82
+ as usual. Authoring new styles with `stylex.create` still requires a StyleX compiler.
83
+
84
+ The shared `src/styles/controls.ts` definitions compose as base, invalid (when applicable), then disabled.
85
+ Invalid and disabled styles replace every hover/focus/active border override as well as the default border.
86
+ Components retain their own layout, shape, native disabled/read-only behavior, and focus accessibility treatment.
87
+ TextField, TextArea, Select, and Checkbox share these definitions.
88
+
89
+ Qomponents' source test projects compile StyleX locally. Browser tests use runtime injection because Vitest disables
90
+ Vite HMR, which the compiler uses to refresh extracted development CSS. The published-package smoke test checks
91
+ extracted default styles and an exported theme. Other
92
+ workspace packages' Vitest pipelines are unchanged; webserver's Jest adapter now compiles StyleX before SWC.
93
+
94
+ ### Verification and legacy compatibility
95
+
96
+ The component migration is complete. Qomponents' source, stories, Ladle, tests, published bundle, and example no
97
+ longer need Tailwind. `src/styles.css` retains ordinary base typography, icon-font assets, and legacy font-icon
98
+ support; `src/styles.build.css` adds the StyleX extraction marker for published builds and source previews.
99
+ PostCSS remains a build-only dependency to resolve ordinary CSS imports before extraction; it generates no utilities.
100
+
101
+ Webserver still uses Tailwind. Its temporary `app/src/styles/qomponentsLegacyTheme.css` owns the legacy CSS
102
+ variables and utility aliases that previously came from qomponents. The existing `legacyTheme.utilities.ts`
103
+ continues to apply StyleX themes alongside legacy selectors. Remove those adapters when their webserver consumers
104
+ are migrated, not when publishing qomponents.
105
+
106
+ Run the component/browser tests, type checks, lint, and `pnpm test:build`. The latter consumes the actual
107
+ `dist/index.esm.js` and `dist/styles.css` in Chromium without a StyleX or Tailwind compiler. Check Ladle as well:
108
+ a successful source transform cannot prove extracted CSS is delivered to its preview. Migration commits include
109
+ webserver consumer-test updates; assertions should describe invalid, selected, or variant state rather than utility
110
+ classes or StyleX hashes.
111
+
112
+ ## Local Development
113
+
114
+ Note: ensure your local machine has updated dependencies first by running
115
+ `gradlew :client:packages-qomponents:npmInstall`.
116
+
117
+ Ladle is a component playground web application that takes our components' stories and lets you interact with them
118
+ in a web browser. To start the Ladle server, run: `pnpm dev`.
119
+
120
+ The shared Ladle Vite config preserves StyleX token imports through React's SWC transform so CSS extraction can
121
+ load their definitions. Qomponents uses the `@stylex` marker in `src/styles.build.css` to deliver extracted CSS through
122
+ Vite's normal CSS pipeline. Its shared Ladle and Vitest configs set `tailwind: false`. The standalone StyleX CSS
123
+ endpoint is incompatible with Ladle's Koa middleware server.
124
+
125
+ - Add or update components under `src/`.
126
+ - Export public components and types from `src/index.ts`.
127
+ - Components and stories use StyleX; themeable colors belong in the shared color contract.
128
+ - Verify changes in both light and dark mode and across themes when applicable.
129
+
130
+ ### Ladle providers
131
+
132
+ Other packages can import `QomponentsLadleProvider` from `@seeqdev/qomponents/ladle` into their `.ladle/components.tsx` to allow Qomponents to work properly.
133
+
134
+ ```tsx
135
+ import { QomponentsLadleProvider } from '@seeqdev/qomponents/ladle';
136
+
137
+ export const Provider = ({ children }) => <QomponentsLadleProvider>{children}</QomponentsLadleProvider>;
138
+ ```
139
+
140
+ If your package also needs Ladle i18n integration, wrap `QomponentsLadleProvider` with `LadleProvider`:
141
+
142
+ ```tsx
143
+ import { LadleProvider, createLadleI18n } from '@seeqdev/tools/ladle';
144
+ import { QomponentsLadleProvider } from '@seeqdev/qomponents/ladle';
145
+
146
+ export const Provider = ({ children }) => (
147
+ <LadleProvider i18n={myI18nInstance}>
148
+ <QomponentsLadleProvider>{children}</QomponentsLadleProvider>
149
+ </LadleProvider>
150
+ );
151
+ ```
152
+
153
+ ## Typecheck
154
+
155
+ To run `tsgo` on Qomponents, use: `gradlew :client:packages-qomponents:tsc`.
156
+
157
+ ## Format
158
+
159
+ Format code with: `gradlew :client:packages-qomponents:pnpmLint`
160
+
161
+ ## Testing
162
+
163
+ Vitest is split into projects:
164
+
165
+ - `unit`: `src/**/*.unit.test.{ts,tsx}` (node fastest)
166
+ - `component`: `src/**/*.test.{ts,tsx}` (happy-dom fast)
167
+ - `browser`: `src/**/*.test.{ts,tsx}` with the browser runner (Playwright + Chromium, headless by default, slowest)
168
+
169
+ You can run the full check suite by using: `gradlew :client:packages-qomponents:check`
170
+
171
+ ### Run a subset of tests
172
+
173
+ Use these when iterating quickly on a specific test category.
174
+
175
+ - Run the runtime test suite (unit + component + browser, excludes build verification) when you want fast feedback on
176
+ component behavior without rebuilding `dist/`: `gradlew :client:packages-qomponents:test`
177
+ - Run unit tests only when you want the fastest feedback and no DOM simulation overhead (pure Node): `pnpm test:unit`
178
+ - Run component tests only when you need DOM rendering via happy-dom but don't need real browser behavior:
179
+ `pnpm test:component`
180
+ - Run browser tests only when validating real browser behavior (Playwright/Chromium headless): `pnpm test:browser`
181
+ - Run browser tests with a visible browser when debugging flaky UI interactions: `pnpm test:browser:ui`
182
+ - Watch mode for rapid iteration while editing tests or components: `pnpm test:watch`
183
+ - Collect test coverage when you need signal on what code paths are exercised: `pnpm test:coverage`
184
+
185
+ ### Run build verification tests
186
+
187
+ You can validate the built `dist/` output (bundles, types, assets, example app) by running:
188
+ `gradlew :client:packages-qomponents:testBuild`
189
+
190
+ ## Icons
191
+
192
+ Qomponents uses the `@seeqdev/icons` package for SVG icons. Icons are tree-shakeable (a.k.a. only imported icons are in the final web app bundle).
193
+
194
+ The `Icon` component and icon-accepting props (like `<Button icon>`) support two formats:
195
+
196
+ 1. **IconDefinition objects** (recommended): Import from `@seeqdev/icons/*` sub-paths
197
+ 2. **Legacy string format**: Font Awesome class names like `"fa-solid fa-check"`
198
+
199
+ ```tsx
200
+ import { Icon, Button } from '@seeqdev/qomponents';
201
+ import { fcDelete, fcMagGlass } from '@seeqdev/icons/seeq';
202
+
203
+ <Icon icon={fcDelete} />
204
+ <Button icon={fcMagGlass} label="Search" />
205
+ ```
206
+
207
+ See `client/packages/icons/README.md` for the full list of available sub-paths and how to add new Seeq icons.
208
+
209
+ ## Styles and theming
210
+
211
+ Qomponents supports Seeq themes and dark mode. Many recent changes target visual polish, so validate styling in
212
+ light/dark and in relevant themes before publishing.
213
+
214
+ ## Publishing
215
+
216
+ Publishing is handled by the Gradle task. This cannot be run locally unless you have `NPM_TOKEN` set to a valid NPM
217
+ token.
218
+
219
+ ```sh
220
+ gradlew :client:packages-qomponents:npmPublish
221
+ ```
222
+
223
+ Notes:
224
+
225
+ - The package version is read from `client/packages/qomponents/package.json`.
226
+ - `package.json` only publishes `dist/` (via `files`), but `README.md` is always included by npm.
227
+ - The build produces ESM/CJS bundles, CSS, and type declarations under `dist/`, and copies icon fonts plus the
228
+ `example/` app into `dist/example` so consumers can run a working sample aligned to the published package.
229
+
230
+ ## CI publishing and version checks
231
+
232
+ Publishing runs in CI. The checked-in `client/packages/qomponents/package.json` provides the base version, and the CI
233
+ publish step will append a [prerelease](https://semver.org/#spec-item-9) suffix to distinguish published versions:
234
+ `-beta.{10-char-sha}.YYYYMMDD`
235
+
236
+ For the full internal process, see:
237
+
238
+ ```
239
+ https://seeq.atlassian.net/wiki/spaces/SQ/pages/3416031265/How+To+Add+or+Modify+a+Qomponent+Seeq+Component+Library
240
+ ```
241
+
242
+ ## StyleX build support
243
+
244
+ The build compiles component styles, token defaults, and exported themes together.
245
+
246
+ Inside the monorepo, consumers compile qomponents source using the shared Rust/SWC `@seeqdev/tools/stylex` configuration.
247
+ Named token definitions in `src/theme/<name>.stylex.ts` are directly importable from
248
+ `@seeqdev/qomponents/theme/<name>.stylex`. Keep theme overrides in ordinary `.ts` modules and include public themes in
249
+ the library's export graph so the publish build emits their CSS.
250
+
251
+ The `@stylex;` marker in `src/styles.build.css` receives minified extracted CSS during publication.
252
+ Published consumers use compiled JavaScript and import `@seeqdev/qomponents/styles.css`; no StyleX compiler is required.
253
+ The source-only theme subpath is not published. Supporting external StyleX compilation of shared definitions will
254
+ need an explicit module-identity and export contract before it is enabled.
255
+
256
+ StyleX emits atomic CSS by default. Shared compiler options enable native CSS layers to coexist with existing styles;
257
+ normal unlayered CSS still takes precedence. See [the build documentation](../tools/src/stylex/README.md) for the
258
+ layer ordering, migration constraints and test commands. The published CSS keeps the stable `styles.css` filename.
259
+
260
+ ### Build artifact tests
261
+
262
+ `pnpm test:build` builds once and runs both artifact checks: `build.test.ts` checks files, exports, and copied
263
+ resources in Node/happy-dom; `build.browser.test.tsx` checks the built JavaScript and CSS in Chromium. The browser
264
+ project intentionally has no StyleX or Tailwind compiler, so it detects missing published styles and token defaults.
265
+ The two files share the build test configuration but need separate runtimes: happy-dom cannot validate the CSS
266
+ cascade, and Chromium cannot run the filesystem checks.
267
+
268
+ Locally themed dropdowns pass the same theme to `contentXstyle` so the portaled menu and submenus receive it:
269
+
270
+ ```tsx
271
+ <ButtonWithDropdown contentXstyle={themes.topic.dark} dropdownItems={items} />
272
+ ```
273
+
274
+ A theme applied to `body` is inherited by portals automatically.
package/README.md CHANGED
@@ -46,7 +46,7 @@ function App() {
46
46
  To make sure all styles are properly applied be sure to include the qomponents css file in your main css file.
47
47
 
48
48
  ```css
49
- @import '@seeqdev/qomponents/dist/styles.css';
49
+ @import '@seeqdev/qomponents/styles.css';
50
50
  ```
51
51
 
52
52
  <b>A note on CSS:</b> Seeq's qomponents come fully styled and ready to use. While it is tempting to use the
@@ -57,6 +57,11 @@ Seeq's look and feel changes.
57
57
  <b>Tip:</b>: to indicate missing or wrong user input use the <i>showError</i> property available on TextField,
58
58
  TextArea, as well as Select.
59
59
 
60
+ ## StyleX support
61
+
62
+ Published components include compiled JavaScript and extracted CSS. Import
63
+ `@seeqdev/qomponents/styles.css` as shown above; no StyleX compiler is required.
64
+
60
65
  ## Frequently asked questions
61
66
 
62
67
  <h3>1) I use webpack and I get a strange error once I added qomponents to my package.json!</h3>
@@ -78,28 +83,29 @@ Add the following to the <code>rules</code> array in your <code>webpack.config</
78
83
  If you're using webpack + scss be sure to include a <code>~</code> as part of the css import path:
79
84
 
80
85
  ```
81
- @import '~@seeqdev/qomponents/dist/styles.css';
86
+ @import '~@seeqdev/qomponents/styles.css';
82
87
  @import '~@fortawesome/fontawesome-free/css/all.css';
83
88
  ```
84
89
 
85
90
  <h3>2) How do I get my Button to be green?</h3>
86
91
 
87
- The colors of your qomponents are controlled by the "theme". </br>
88
- If you do not provide a theme your qomponents will use the default blue or also known as Topic-based theme.
89
- Themes are applied by adding the class of the desired theme to a wrapper of your application. The theme class can
90
- also be applied to the body tag.
92
+ Themes are selected with `themes[product][mode]` and applied to an application wrapper using `stylex.props`.
93
+ Without an explicit theme, components use Topic light colors.
91
94
 
92
- ```html
93
- <div class="color_analysis">... your application here</div>
94
- ```
95
+ ```tsx
96
+ import * as stylex from '@stylexjs/stylex';
97
+ import { Button, themes } from '@seeqdev/qomponents';
98
+ import '@seeqdev/qomponents/styles.css';
95
99
 
96
- There are 3 themes available:
100
+ <div {...stylex.props(themes.analysis.light)}>
101
+ <Button label="Save" />
102
+ </div>;
103
+ ```
97
104
 
98
- | Theme | Color | Class | Example |
99
- | :------- | :----- | :------------- | :--------------------- |
100
- | Topic | blue | color_topic | class="color_topic" |
101
- | Analysis | green | color_analysis | class="color_analysis" |
102
- | DataLab | orange | color_datalab | class="color_datalab" |
105
+ Available products are `topic`, `analysis`, `datalab`, `vantage`, and `insights`; each supports `light` and `dark`.
106
+ Use `themes.analysis.dark` for the dark Analysis theme. Selecting a compiled theme requires the StyleX runtime,
107
+ but no consumer-side StyleX compiler. Apply the same theme to portal roots when they are outside the themed wrapper.
108
+ The former `color_*` classes are no longer part of the published stylesheet.
103
109
 
104
110
  <h3>3) How do I use Fontawesome Icons?</h3>
105
111
  Before you can use Fontawesome icons you must install FontAwesome.
@@ -1,4 +1,5 @@
1
- export default {
1
+ module.exports = {
2
+ root: true,
2
3
  env: { browser: true, es2020: true },
3
4
  extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'],
4
5
  parser: '@typescript-eslint/parser',
@@ -0,0 +1,24 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
@@ -12,7 +12,9 @@ This application is built using [vite](https://vitejs.dev/).
12
12
 
13
13
  ## Installation
14
14
 
15
- First, be sure to install all dependencies (React, and qomponents):
15
+ This example uses the compiled qomponents bundle next to it, without a StyleX or Tailwind compiler.
16
+ When running from the source repository, first run `pnpm build` in the qomponents package. The example included
17
+ in a published package already has that bundle. Then install the example's React and Vite dependencies:
16
18
 
17
19
  ```sh
18
20
  npm install
@@ -11,15 +11,13 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@fortawesome/fontawesome-free": "^6.4.0",
14
- "@seeqdev/qomponents": "0.0.243-beta.8c6897da6a.20260807",
15
- "@tailwindcss/vite": "4.1.8",
16
- "react": "18.2.0",
17
- "react-dom": "18.2.0",
18
- "tailwindcss": "4.1.8"
14
+ "@stylexjs/stylex": "0.19.1",
15
+ "react": "19.2.0",
16
+ "react-dom": "19.2.0"
19
17
  },
20
18
  "devDependencies": {
21
- "@types/react": "18.0.37",
22
- "@types/react-dom": "18.0.11",
19
+ "@types/react": "19.2.10",
20
+ "@types/react-dom": "19.2.3",
23
21
  "@typescript-eslint/eslint-plugin": "5.59.0",
24
22
  "@typescript-eslint/parser": "5.59.0",
25
23
  "@vitejs/plugin-react": "4.5.1",