hs-uix 1.5.1 → 1.6.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 +221 -0
- package/common-components.d.ts +127 -0
- package/dist/common-components.js +491 -16
- package/dist/common-components.mjs +465 -10
- package/dist/form.js +18 -1
- package/dist/form.mjs +18 -1
- package/dist/index.js +1743 -15
- package/dist/index.mjs +1753 -14
- package/dist/kanban.js +1410 -0
- package/dist/kanban.mjs +1408 -0
- package/dist/utils.js +60 -0
- package/dist/utils.mjs +58 -0
- package/form.d.ts +1 -0
- package/index.d.ts +65 -0
- package/kanban.d.ts +1 -0
- package/package.json +7 -1
package/README.md
CHANGED
|
@@ -29,6 +29,9 @@ Requires `react` >= 18.0.0 and `@hubspot/ui-extensions` >= 0.12.0 as peer depend
|
|
|
29
29
|
|-----------|-------------|------|
|
|
30
30
|
| **DataTable** | Filterable, sortable, paginated table with auto-sized columns, inline editing, row grouping, and more | [Full documentation](https://github.com/05bmckay/hs-uix/blob/main/packages/datatable/README.md) |
|
|
31
31
|
| **FormBuilder** | Declarative, config-driven form with validation, multi-step wizards, and 20+ field types | [Full documentation](https://github.com/05bmckay/hs-uix/blob/main/packages/form/README.md) |
|
|
32
|
+
| **Kanban** | Stage-based board with filters, sort, headline metrics, card action bars, and DataTable-parity card field config | See the [Kanban section](#kanban) below |
|
|
33
|
+
| **Common Components** | Thin visual wrappers over HubSpot primitives — `AutoTag`, `AutoStatusTag`, `AvatarStack`, `SectionHeader`, `KeyValueList`, `StyledText` | [Full documentation](https://github.com/05bmckay/hs-uix/blob/main/src/common-components/README.md) |
|
|
34
|
+
| **Utils** | Pure helpers for formatting, options, HubSpot value guards, and tag-variant inference | [Full documentation](https://github.com/05bmckay/hs-uix/blob/main/src/utils/README.md) |
|
|
32
35
|
|
|
33
36
|
---
|
|
34
37
|
|
|
@@ -192,6 +195,224 @@ const fields = [
|
|
|
192
195
|
|
|
193
196
|
---
|
|
194
197
|
|
|
198
|
+
# Kanban
|
|
199
|
+
|
|
200
|
+
A stage-based board view that shares DataTable's config vocabulary (`cardFields` ≈ `columns`, filters, sort, selection) so you can offer users a table-or-board toggle without rewriting the data layer. Drag-and-drop isn't available inside HubSpot UI Extensions, so stage changes happen through an inline `Select` (or menu) on each card.
|
|
201
|
+
|
|
202
|
+

|
|
203
|
+
|
|
204
|
+
## Quick Start
|
|
205
|
+
|
|
206
|
+
```jsx
|
|
207
|
+
import { Kanban } from "hs-uix/kanban";
|
|
208
|
+
import { AutoTag } from "hs-uix/common-components";
|
|
209
|
+
import { formatCurrencyCompact, formatDate } from "hs-uix/utils";
|
|
210
|
+
|
|
211
|
+
const STAGES = [
|
|
212
|
+
{ value: "qualified", label: "Qualified", variant: "info" },
|
|
213
|
+
{ value: "proposal", label: "Proposal", variant: "info" },
|
|
214
|
+
{ value: "negotiation", label: "Negotiation", variant: "warning" },
|
|
215
|
+
{ value: "closed_won", label: "Closed Won", variant: "success", terminal: true },
|
|
216
|
+
{ value: "closed_lost", label: "Closed Lost", variant: "default", terminal: true },
|
|
217
|
+
];
|
|
218
|
+
|
|
219
|
+
const CARD_FIELDS = [
|
|
220
|
+
{ field: "name", placement: "title" },
|
|
221
|
+
{ field: "company", placement: "subtitle" },
|
|
222
|
+
{ field: "amount", placement: "meta", render: (val) => formatCurrencyCompact(val) },
|
|
223
|
+
{ field: "segment", placement: "body", render: (val) => <AutoTag value={val} /> },
|
|
224
|
+
{ field: "closeDate", placement: "footer", render: (val) => formatDate(val) },
|
|
225
|
+
];
|
|
226
|
+
|
|
227
|
+
<Kanban
|
|
228
|
+
data={deals}
|
|
229
|
+
stages={STAGES}
|
|
230
|
+
groupBy="stage"
|
|
231
|
+
cardFields={CARD_FIELDS}
|
|
232
|
+
onStageChange={(row, newStage) => updateDealStage(row.id, newStage)}
|
|
233
|
+
/>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Features
|
|
237
|
+
|
|
238
|
+
- **Stage-based columns** with variant-colored headers (`success` / `warning` / `info` / `default`), collapse-to-rail, and stage-level count badges
|
|
239
|
+
- **`cardFields` with placement** (`title` / `subtitle` / `meta` / `body` / `footer`) — same render/truncate/visible hooks as DataTable columns
|
|
240
|
+
- **Filters and sort** with the same config shape as DataTable (`select`, `multiselect`, `dateRange`)
|
|
241
|
+
- **Headline metrics** rendered above the board (deal totals, weighted pipeline, win rate) via a `metrics` prop
|
|
242
|
+
- **Stage transition prompts** — async confirmation or extra-property capture before committing a stage change, declared per-stage via `stage.onEnterRequired.render`
|
|
243
|
+
- **Selection bar + card actions** for bulk moves, deletes, or custom handlers (`KanbanCardActions`)
|
|
244
|
+
- **Empty / loading / error render slots** that mirror DataTable's override API
|
|
245
|
+
- **Paired view adapters** — use `deriveCardFieldsFromColumns` from `hs-uix/utils` to project a DataTable `columns` config into Kanban `cardFields` with a single function call
|
|
246
|
+
|
|
247
|
+
## Highlights
|
|
248
|
+
|
|
249
|
+
### HubSpot Deals preset
|
|
250
|
+
|
|
251
|
+

|
|
252
|
+
|
|
253
|
+
Drop-in preset shaped like HubSpot's native deals pipeline: stage-variant headers, per-stage amount totals in the header metric, and an avatar-stack footer row. Hide the summary row with `showMetrics={false}` for dashboards that already surface totals elsewhere.
|
|
254
|
+
|
|
255
|
+

|
|
256
|
+
|
|
257
|
+
### Compact lead board
|
|
258
|
+
|
|
259
|
+

|
|
260
|
+
|
|
261
|
+
`cardDensity="compact"` with trimmed `cardFields` for high-volume boards (leads, tickets, tasks) where you want to fit 8-12 cards per column on a typical viewport without horizontal scrolling.
|
|
262
|
+
|
|
263
|
+
### Load-more & stage controls
|
|
264
|
+
|
|
265
|
+

|
|
266
|
+
|
|
267
|
+
Per-stage pagination via an `onLoadMore` handler and `stageMeta.hasMore`, plus inline `Select` stage controls on each card (`stageControl="select"`). Switch to `"menu"` for action-menu style transitions, or `"none"` for read-only boards.
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
# Common Components
|
|
272
|
+
|
|
273
|
+
Thin, composable visual wrappers built on HubSpot's native primitives — the reusable pieces that show up across DataTable rows, FormBuilder cells, and Kanban cards. Use them to skip rewriting the same status-tag / avatar-stack / label-value block on every surface.
|
|
274
|
+
|
|
275
|
+
## Quick Start
|
|
276
|
+
|
|
277
|
+
```jsx
|
|
278
|
+
import {
|
|
279
|
+
AutoStatusTag,
|
|
280
|
+
AutoTag,
|
|
281
|
+
AvatarStack,
|
|
282
|
+
SectionHeader,
|
|
283
|
+
KeyValueList,
|
|
284
|
+
StyledText,
|
|
285
|
+
HS_DATE_PRESETS,
|
|
286
|
+
} from "hs-uix/common-components";
|
|
287
|
+
import { formatCurrency } from "hs-uix/utils";
|
|
288
|
+
|
|
289
|
+
<SectionHeader
|
|
290
|
+
title="Deal Summary"
|
|
291
|
+
description="A compact summary block using common components."
|
|
292
|
+
/>
|
|
293
|
+
|
|
294
|
+
<KeyValueList
|
|
295
|
+
items={[
|
|
296
|
+
{ label: "Status", value: <AutoStatusTag value="At risk" /> },
|
|
297
|
+
{ label: "Segment", value: <AutoTag value="Enterprise" /> },
|
|
298
|
+
{ label: "Owners", value: <AvatarStack items={["AR", "JK", "SP", "MB", "LM"]} maxVisible={4} /> },
|
|
299
|
+
{ label: "Pipeline", value: formatCurrency(245000) },
|
|
300
|
+
]}
|
|
301
|
+
/>
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## What's inside
|
|
305
|
+
|
|
306
|
+
- `AutoStatusTag` — `StatusTag` with variant inferred from the value (`Active` → success, `At risk` → warning, `Failed` → danger, etc.)
|
|
307
|
+
- `AutoTag` — `Tag` with the same inference, for non-status labels
|
|
308
|
+
- `AvatarStack` — overlapping circular avatars as a single SVG (letters, image URLs, or mixed); `+N` overflow chip past `maxVisible`
|
|
309
|
+
- `SectionHeader` — title + optional description + actions slot
|
|
310
|
+
- `KeyValueList` — vertical list of label/value rows via `DescriptionList`
|
|
311
|
+
- `StyledText` — SVG-rendered text with rotation, custom color, and pill backgrounds for cases native `<Text>` can't express
|
|
312
|
+
|
|
313
|
+
Plus low-level builders (`makeAvatarStackDataUri`, `makeStyledTextDataUri`) that return `{ src, width, height }` for composing into larger SVGs, and style constants (`HS_FONT_FAMILY`, `HS_TEXT_COLOR`, `HS_SUBTLE_BG`, `HS_MUTED_TEXT`, `HS_NEUTRAL_CHIP`) that mirror HubSpot's native CSS — so custom SVGs sit alongside the rest of the UI without a color mismatch.
|
|
314
|
+
|
|
315
|
+
## Highlights
|
|
316
|
+
|
|
317
|
+
### AutoTag & AutoStatusTag
|
|
318
|
+
|
|
319
|
+

|
|
320
|
+
|
|
321
|
+

|
|
322
|
+
|
|
323
|
+
Pass a free-form status string and get a properly-colored tag back. Matching is case-insensitive and tolerates underscores / dashes / phrases (`"in_progress"`, `"on hold"`, `"at-risk"` all resolve). Override via `overrides={{ "Processing": "warning" }}` and `fallback="info"` for values that don't match built-in heuristics.
|
|
324
|
+
|
|
325
|
+
### AvatarStack
|
|
326
|
+
|
|
327
|
+

|
|
328
|
+
|
|
329
|
+
Overlapping avatars rendered as a single SVG via `<Image>`. T-shirt sizing (`xs` → `xl`) or a raw pixel number. Letters auto-color from the built-in palette; image URLs get circular-clipped. Extras past `maxVisible` collapse into a neutral `+N` chip.
|
|
330
|
+
|
|
331
|
+
### SectionHeader & KeyValueList
|
|
332
|
+
|
|
333
|
+

|
|
334
|
+
|
|
335
|
+
Pair `SectionHeader` (title / description / action slot) with `KeyValueList` (`DescriptionList` rows) for compact summary panels. `direction="column"` on the list switches to stacked label-on-top rows.
|
|
336
|
+
|
|
337
|
+
### StyledText
|
|
338
|
+
|
|
339
|
+

|
|
340
|
+
|
|
341
|
+
Reach for `StyledText` when native `<Text>` can't do what you need: vertical rail labels (`orientation="vertical-down"`), HubSpot-style pill badges (`background={{ preset: "tag" }}`), or a specific glyph color. Plain horizontal `preset: "tag"` usage renders through native HubSpot `Tag`; rotated/custom tag cases still use the SVG fallback. Use native `<Text>` anywhere copy-paste matters.
|
|
342
|
+
|
|
343
|
+
### HS_DATE_PRESETS
|
|
344
|
+
|
|
345
|
+
HubSpot's native quick-date preset list (`Today`, `Last 7 days`, `This quarter`, …) as a ready-to-use `options` array for `DataTable` / `Kanban` select filters. Values are stable identifiers (`"today"`, `"7d"`, `"this_quarter"`) — translate to date bounds via `filterFn` or server-side in `onFilterChange`.
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
# Utils
|
|
350
|
+
|
|
351
|
+
Pure helper functions for formatting values, building option arrays, detecting HubSpot-shaped date/time objects, and inferring tag variants from raw data. Zero side effects, no JSX — drop them into `renderCell`, `sortComparator`, or a server handler.
|
|
352
|
+
|
|
353
|
+
## Quick Start
|
|
354
|
+
|
|
355
|
+
```jsx
|
|
356
|
+
import {
|
|
357
|
+
formatCurrency,
|
|
358
|
+
formatCurrencyCompact,
|
|
359
|
+
formatDate,
|
|
360
|
+
formatDateTime,
|
|
361
|
+
formatPercentage,
|
|
362
|
+
buildOptions,
|
|
363
|
+
findOptionLabel,
|
|
364
|
+
getAutoTagVariant,
|
|
365
|
+
createStatusTagSortComparator,
|
|
366
|
+
sumBy,
|
|
367
|
+
} from "hs-uix/utils";
|
|
368
|
+
|
|
369
|
+
formatCurrency(1234.56); // → "$1,235"
|
|
370
|
+
formatCurrencyCompact(123_580_000); // → "$123.6M"
|
|
371
|
+
formatDate("2026-04-15"); // → "Apr 15, 2026"
|
|
372
|
+
formatPercentage(0.1567); // → "16%"
|
|
373
|
+
|
|
374
|
+
const statusOptions = buildOptions(
|
|
375
|
+
[{ name: "Open", id: "o" }, { name: "Closed", id: "c" }],
|
|
376
|
+
{ labelKey: "name", valueKey: "id" },
|
|
377
|
+
);
|
|
378
|
+
findOptionLabel(statusOptions, "o"); // → "Open"
|
|
379
|
+
|
|
380
|
+
getAutoTagVariant("At risk"); // → "warning"
|
|
381
|
+
sumBy(deals, "amount"); // → total
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## What's inside
|
|
385
|
+
|
|
386
|
+
- **`formatters.js`** — locale-aware `Intl`-based number / currency / date / percentage formatters. Every formatter accepts a trailing options object that spreads into the underlying `Intl` call, so anything `Intl.NumberFormat` supports (narrow symbol, specific fraction digits, grouping) is reachable without a new helper.
|
|
387
|
+
- **`options.js`** — `buildOptions(items, opts?)` to shape raw arrays into `{ label, value }` for HubSpot `Select` / `MultiSelect`; `findOptionLabel(options, value, fallback?)` for the reverse lookup.
|
|
388
|
+
- **`hubspotValues.js`** — type guards for HubSpot's `DateInput` / `TimeInput` / `DateTimeInput` value shapes (`isDateValueObject`, `isTimeValueObject`, `isDateTimeValueObject`). Use in `filterFn` or `sortComparator` to distinguish a HubSpot date-object from a raw string/Date.
|
|
389
|
+
- **`tagVariants.js`** — heuristic mappers from free-form status strings to semantic tag variants (`getAutoTagVariant`, `getAutoStatusTagVariant`, `getAutoTagDisplayValue`) plus `createStatusTagSortComparator` for DataTable columns grouped by color, then alphabetical within each color.
|
|
390
|
+
- **`collections.js`** — `sumBy(items, keyOrFn)` for total / weighted-total rows, safe against `null` / missing values.
|
|
391
|
+
|
|
392
|
+
## Highlights
|
|
393
|
+
|
|
394
|
+
### Formatters
|
|
395
|
+
|
|
396
|
+
```js
|
|
397
|
+
formatCurrency(9500, { currency: "EUR" }); // → "€9,500"
|
|
398
|
+
formatCurrencyCompact(4160); // → "$4.2K"
|
|
399
|
+
formatDate(Date.now(), { month: "numeric" }); // → "4/15/2026"
|
|
400
|
+
formatDateTime("2026-04-15T14:30:00Z"); // → "Apr 15, 2026, 9:30 AM" (local)
|
|
401
|
+
formatPercentage(0.1567, { maximumFractionDigits: 1 });// → "15.6%"
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Every formatter treats `null` / `undefined` as safe — `formatCurrency(null)` → `"$0"`, `formatDate(null)` → `""` — so they're safe to drop into cells rendering partially-loaded data.
|
|
405
|
+
|
|
406
|
+
### Tag Variants
|
|
407
|
+
|
|
408
|
+
The same inference that powers `AutoTag` / `AutoStatusTag`, exposed as plain functions for use in custom cells and sort comparators. Default ordering: `success → warning → danger/error → info → default`; override via `variantOrder` on `createStatusTagSortComparator`.
|
|
409
|
+
|
|
410
|
+
### Options & HubSpot Value Guards
|
|
411
|
+
|
|
412
|
+
Build select options from CRM records, resolve labels back to values, and detect HubSpot's structured date/time value objects in one import — no more ad-hoc `.map(r => ({ label: r.name, value: r.id }))` at every call site.
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
195
416
|
## Migrating from `@hs-uix/datatable` or `@hs-uix/form`
|
|
196
417
|
|
|
197
418
|
Both packages have been merged into `hs-uix`. Update your imports:
|
package/common-components.d.ts
CHANGED
|
@@ -49,7 +49,134 @@ export interface KeyValueListProps {
|
|
|
49
49
|
gap?: string;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
export interface DatePresetOption {
|
|
53
|
+
label: string;
|
|
54
|
+
value: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface DateDirectionLabels {
|
|
58
|
+
asc: string;
|
|
59
|
+
desc: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface AvatarStackItemObject {
|
|
63
|
+
letter?: string;
|
|
64
|
+
color?: string;
|
|
65
|
+
src?: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type AvatarStackItem = string | AvatarStackItemObject;
|
|
69
|
+
|
|
70
|
+
export interface AvatarStackDataUriResult {
|
|
71
|
+
src: string;
|
|
72
|
+
width: number;
|
|
73
|
+
height: number;
|
|
74
|
+
count: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface AvatarStackProps {
|
|
78
|
+
items?: AvatarStackItem[] | null;
|
|
79
|
+
size?:
|
|
80
|
+
| number
|
|
81
|
+
| "xs"
|
|
82
|
+
| "extra-small"
|
|
83
|
+
| "sm"
|
|
84
|
+
| "small"
|
|
85
|
+
| "md"
|
|
86
|
+
| "med"
|
|
87
|
+
| "medium"
|
|
88
|
+
| "lg"
|
|
89
|
+
| "large"
|
|
90
|
+
| "xl"
|
|
91
|
+
| "extra-large";
|
|
92
|
+
overlap?: number;
|
|
93
|
+
step?: number;
|
|
94
|
+
maxVisible?: number;
|
|
95
|
+
colors?: string[];
|
|
96
|
+
overflowBg?: string;
|
|
97
|
+
overflowColor?: string;
|
|
98
|
+
fontFamily?: string;
|
|
99
|
+
alt?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface StyledTextFormat {
|
|
103
|
+
fontWeight?: "bold" | "demibold" | "regular" | number;
|
|
104
|
+
italic?: boolean;
|
|
105
|
+
lineDecoration?: "underline" | "strikethrough";
|
|
106
|
+
textTransform?: "uppercase" | "lowercase" | "capitalize" | "sentenceCase" | "none";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface StyledTextBackground {
|
|
110
|
+
preset?: "tag";
|
|
111
|
+
variant?: "default" | "success" | "warning" | "error" | "danger" | "info";
|
|
112
|
+
color?: string;
|
|
113
|
+
textColor?: string;
|
|
114
|
+
borderColor?: string;
|
|
115
|
+
borderWidth?: number;
|
|
116
|
+
radius?: number;
|
|
117
|
+
paddingX?: number;
|
|
118
|
+
paddingY?: number;
|
|
119
|
+
height?: number;
|
|
120
|
+
fontSize?: number;
|
|
121
|
+
canvasPaddingX?: number;
|
|
122
|
+
canvasPaddingY?: number;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface StyledTextDataUriResult {
|
|
126
|
+
src: string;
|
|
127
|
+
width: number;
|
|
128
|
+
height: number;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface StyledTextSharedProps {
|
|
132
|
+
text?: string;
|
|
133
|
+
children?: ReactNode;
|
|
134
|
+
alt?: string;
|
|
135
|
+
variant?: "bodytext" | "microcopy";
|
|
136
|
+
format?: StyledTextFormat;
|
|
137
|
+
orientation?: "horizontal" | "vertical-up" | "vertical-down" | number;
|
|
138
|
+
color?: string;
|
|
139
|
+
background?: StyledTextBackground | null;
|
|
140
|
+
fontFamily?: string;
|
|
141
|
+
fontSize?: number;
|
|
142
|
+
paddingX?: number;
|
|
143
|
+
paddingY?: number;
|
|
144
|
+
width?: number;
|
|
145
|
+
height?: number;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export interface StyledTextDataUriOptions extends Omit<StyledTextSharedProps, "children" | "text" | "alt"> {}
|
|
149
|
+
|
|
150
|
+
export interface StyledTextProps extends StyledTextSharedProps {}
|
|
151
|
+
|
|
52
152
|
export declare function AutoTag(props: AutoTagProps): ReactNode;
|
|
53
153
|
export declare function AutoStatusTag(props: AutoStatusTagProps): ReactNode;
|
|
54
154
|
export declare function SectionHeader(props: SectionHeaderProps): ReactNode;
|
|
55
155
|
export declare function KeyValueList(props: KeyValueListProps): ReactNode;
|
|
156
|
+
export declare function AvatarStack(props: AvatarStackProps): ReactNode;
|
|
157
|
+
export declare function StyledText(props: StyledTextProps): ReactNode;
|
|
158
|
+
export declare function makeAvatarStackDataUri(
|
|
159
|
+
items?: AvatarStackItem[] | null,
|
|
160
|
+
options?: Omit<AvatarStackProps, "items" | "alt">
|
|
161
|
+
): AvatarStackDataUriResult | null;
|
|
162
|
+
export declare function makeStyledTextDataUri(
|
|
163
|
+
text: string,
|
|
164
|
+
options?: StyledTextDataUriOptions
|
|
165
|
+
): StyledTextDataUriResult;
|
|
166
|
+
|
|
167
|
+
export declare const HS_DATE_PRESETS: DatePresetOption[];
|
|
168
|
+
export declare const HS_DATE_DIRECTION_LABELS: DateDirectionLabels;
|
|
169
|
+
export declare const HS_FONT_FAMILY: string;
|
|
170
|
+
export declare const HS_TEXT_COLOR: string;
|
|
171
|
+
export declare const HS_SUBTLE_BG: string;
|
|
172
|
+
export declare const HS_MUTED_TEXT: string;
|
|
173
|
+
export declare const HS_NEUTRAL_CHIP: string;
|
|
174
|
+
export declare const HS_TAG_SUBTLE_BORDER: string;
|
|
175
|
+
export declare const HS_TAG_TEXT_COLOR: string;
|
|
176
|
+
export declare const HS_TAG_FONT_SIZE: number;
|
|
177
|
+
export declare const HS_TAG_LINE_HEIGHT: number;
|
|
178
|
+
export declare const HS_TAG_PADDING_X: number;
|
|
179
|
+
export declare const HS_TAG_PADDING_Y: number;
|
|
180
|
+
export declare const HS_TAG_BORDER_RADIUS: number;
|
|
181
|
+
export declare const HS_TAG_BORDER_WIDTH: number;
|
|
182
|
+
export declare const DEFAULT_SVG_FONT_WEIGHT: number;
|