@wheelhouse/ui 0.2.3 → 0.2.4
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/dist/blocks/floating-menu-widget/floating-menu-widget.d.ts +26 -0
- package/dist/blocks/floating-menu-widget/floating-menu-widget.d.ts.map +1 -0
- package/dist/blocks/floating-menu-widget/floating-menu-widget.js +200 -0
- package/dist/blocks/floating-menu-widget/floating-menu-widget.stories.d.ts +15 -0
- package/dist/blocks/floating-menu-widget/floating-menu-widget.stories.d.ts.map +1 -0
- package/dist/blocks/floating-menu-widget/floating-menu-widget.stories.js +22 -0
- package/dist/blocks/floating-menu-widget/index.d.ts +3 -0
- package/dist/blocks/floating-menu-widget/index.d.ts.map +1 -0
- package/dist/blocks/floating-menu-widget/index.js +1 -0
- package/dist/blocks/index.d.ts +1 -0
- package/dist/blocks/index.d.ts.map +1 -1
- package/dist/blocks/index.js +1 -0
- package/dist/components/button/button.d.ts +18 -11
- package/dist/components/button/button.d.ts.map +1 -1
- package/dist/components/button/button.js +27 -14
- package/dist/components/button/button.stories.d.ts +11 -0
- package/dist/components/button/button.stories.d.ts.map +1 -1
- package/dist/components/button/button.stories.js +84 -0
- package/dist/components/filters/filter-date-metric-value.d.ts.map +1 -1
- package/dist/components/filters/filter-date-metric-value.js +83 -8
- package/dist/components/filters/filter-fields-listing-demo.d.ts +12 -0
- package/dist/components/filters/filter-fields-listing-demo.d.ts.map +1 -0
- package/dist/components/filters/filter-fields-listing-demo.js +565 -0
- package/dist/components/filters/filters-types.d.ts +7 -0
- package/dist/components/filters/filters-types.d.ts.map +1 -1
- package/dist/components/filters/filters.stories.d.ts.map +1 -1
- package/dist/components/filters/filters.stories.js +8 -149
- package/dist/components/filters/index.d.ts +1 -0
- package/dist/components/filters/index.d.ts.map +1 -1
- package/dist/components/filters/index.js +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/index.d.ts.map +1 -1
- package/dist/components/popover/index.js +1 -0
- package/dist/components/popover/popover-handle.d.ts +6 -0
- package/dist/components/popover/popover-handle.d.ts.map +1 -0
- package/dist/components/popover/popover-handle.js +6 -0
- package/dist/components/popover/popover.d.ts +41 -7
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/popover/popover.js +50 -3
- package/dist/components/progress/progress.js +1 -1
- package/dist/components/progress/progress.stories.d.ts +11 -2
- package/dist/components/progress/progress.stories.d.ts.map +1 -1
- package/dist/components/progress/progress.stories.js +77 -4
- package/dist/components/sidebar/index.d.ts +2 -0
- package/dist/components/sidebar/index.d.ts.map +1 -0
- package/dist/components/sidebar/index.js +1 -0
- package/dist/components/sidebar/sidebar.d.ts +64 -0
- package/dist/components/sidebar/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar.js +255 -0
- package/dist/components/sidebar/sidebar.stories.d.ts +20 -0
- package/dist/components/sidebar/sidebar.stories.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar.stories.js +184 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.d.ts.map +1 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/skeleton/skeleton.d.ts +7 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.js +8 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
|
@@ -183,6 +183,9 @@ const METRIC_EMPTY_AMOUNT = '\u2013';
|
|
|
183
183
|
/** Spaces around the en dash so empty segments don’t feel cramped (e.g. `$ – `). */
|
|
184
184
|
const METRIC_EMPTY_DISPLAY = ` ${METRIC_EMPTY_AMOUNT} `;
|
|
185
185
|
const metricAmountFormatters = new Map();
|
|
186
|
+
const metricIntegerFormatters = new Map();
|
|
187
|
+
const metricPercentFormatters = new Map();
|
|
188
|
+
const metricPercentSuffixLiteralByLocale = new Map();
|
|
186
189
|
function formatMetricAmountDigits(value, locale) {
|
|
187
190
|
let nf = metricAmountFormatters.get(locale);
|
|
188
191
|
if (!nf) {
|
|
@@ -204,11 +207,82 @@ function formatMetricAmountDigits(value, locale) {
|
|
|
204
207
|
}
|
|
205
208
|
return nf.format(value);
|
|
206
209
|
}
|
|
207
|
-
|
|
208
|
-
|
|
210
|
+
function formatMetricIntegerDigits(value, locale) {
|
|
211
|
+
let nf = metricIntegerFormatters.get(locale);
|
|
212
|
+
if (!nf) {
|
|
213
|
+
try {
|
|
214
|
+
nf = new Intl.NumberFormat(locale, { maximumFractionDigits: 0, useGrouping: true });
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
nf = new Intl.NumberFormat('en-US', { maximumFractionDigits: 0, useGrouping: true });
|
|
218
|
+
}
|
|
219
|
+
metricIntegerFormatters.set(locale, nf);
|
|
220
|
+
}
|
|
221
|
+
return nf.format(value);
|
|
222
|
+
}
|
|
223
|
+
function dateMetricBarValueFormat(field) {
|
|
224
|
+
return field.dateMetricValueFormat ?? 'currency';
|
|
225
|
+
}
|
|
226
|
+
/** Suffix literals from `Intl` for an empty percent segment (locale-specific spacing, RTL, etc.). */
|
|
227
|
+
function percentBarSuffixLiteral(locale) {
|
|
228
|
+
let s = metricPercentSuffixLiteralByLocale.get(locale);
|
|
229
|
+
if (s !== undefined)
|
|
230
|
+
return s;
|
|
231
|
+
try {
|
|
232
|
+
const nf = new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 });
|
|
233
|
+
s = nf
|
|
234
|
+
.formatToParts(1)
|
|
235
|
+
.filter((p) => p.type === 'literal')
|
|
236
|
+
.map((p) => p.value)
|
|
237
|
+
.join('');
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
s = '%';
|
|
241
|
+
}
|
|
242
|
+
if (!s)
|
|
243
|
+
s = '%';
|
|
244
|
+
metricPercentSuffixLiteralByLocale.set(locale, s);
|
|
245
|
+
return s;
|
|
246
|
+
}
|
|
247
|
+
/** `value` is percentage points (e.g. 85 → 85%); `Intl` expects a ratio, so divide by 100. */
|
|
248
|
+
function formatMetricPercentFromPercentagePoints(value, locale) {
|
|
249
|
+
let nf = metricPercentFormatters.get(locale);
|
|
250
|
+
if (!nf) {
|
|
251
|
+
try {
|
|
252
|
+
nf = new Intl.NumberFormat(locale, {
|
|
253
|
+
style: 'percent',
|
|
254
|
+
minimumFractionDigits: 0,
|
|
255
|
+
maximumFractionDigits: 20,
|
|
256
|
+
useGrouping: true,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
nf = new Intl.NumberFormat('en-US', {
|
|
261
|
+
style: 'percent',
|
|
262
|
+
minimumFractionDigits: 0,
|
|
263
|
+
maximumFractionDigits: 20,
|
|
264
|
+
useGrouping: true,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
metricPercentFormatters.set(locale, nf);
|
|
268
|
+
}
|
|
269
|
+
return nf.format(value / 100);
|
|
270
|
+
}
|
|
271
|
+
/** Bar label for a single threshold: currency, percent, or integer locale formatting. */
|
|
272
|
+
function formatDateMetricBarAmount(value, format, locale, currencySym) {
|
|
273
|
+
if (format === 'currency') {
|
|
274
|
+
if (value == null || Number.isNaN(value))
|
|
275
|
+
return `${currencySym}${METRIC_EMPTY_DISPLAY}`;
|
|
276
|
+
return `${currencySym}${formatMetricAmountDigits(value, locale)}`;
|
|
277
|
+
}
|
|
278
|
+
if (format === 'integer') {
|
|
279
|
+
if (value == null || Number.isNaN(value))
|
|
280
|
+
return METRIC_EMPTY_DISPLAY;
|
|
281
|
+
return formatMetricIntegerDigits(value, locale);
|
|
282
|
+
}
|
|
209
283
|
if (value == null || Number.isNaN(value))
|
|
210
|
-
return `${
|
|
211
|
-
return
|
|
284
|
+
return `${METRIC_EMPTY_DISPLAY}${percentBarSuffixLiteral(locale)}`;
|
|
285
|
+
return formatMetricPercentFromPercentagePoints(value, locale);
|
|
212
286
|
}
|
|
213
287
|
function parseDraftNumber(raw, previous) {
|
|
214
288
|
if (raw.trim() === '')
|
|
@@ -277,6 +351,7 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
|
|
|
277
351
|
const valueAnyOperator = operators.find((o) => o.value === 'value_any');
|
|
278
352
|
const sym = i18n.defaultCurrency;
|
|
279
353
|
const numberLocale = i18n.numberFormatLocale;
|
|
354
|
+
const barValueFormat = dateMetricBarValueFormat(field);
|
|
280
355
|
const inputSizeProp = size === 'lg' ? 'default' : 'sm';
|
|
281
356
|
const buttonSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'default';
|
|
282
357
|
const valueSegment = (() => {
|
|
@@ -290,7 +365,7 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
|
|
|
290
365
|
}
|
|
291
366
|
if (operator === 'value_greater_than') {
|
|
292
367
|
const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
|
|
293
|
-
const summary =
|
|
368
|
+
const summary = formatDateMetricBarAmount(payload.min ?? undefined, barValueFormat, numberLocale, sym);
|
|
294
369
|
const triggerLabel = `${i18n.operators.greaterThan}: ${summary}`;
|
|
295
370
|
return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMinValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
|
|
296
371
|
const v = e.target.value;
|
|
@@ -300,7 +375,7 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
|
|
|
300
375
|
}
|
|
301
376
|
if (operator === 'value_less_than') {
|
|
302
377
|
const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
|
|
303
|
-
const summary =
|
|
378
|
+
const summary = formatDateMetricBarAmount(payload.max ?? undefined, barValueFormat, numberLocale, sym);
|
|
304
379
|
const triggerLabel = `${i18n.operators.lessThan}: ${summary}`;
|
|
305
380
|
return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMax, onChange: (e) => {
|
|
306
381
|
const v = e.target.value;
|
|
@@ -311,8 +386,8 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
|
|
|
311
386
|
if (operator === 'value_between') {
|
|
312
387
|
const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
|
|
313
388
|
const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
|
|
314
|
-
const minPart =
|
|
315
|
-
const maxPart =
|
|
389
|
+
const minPart = formatDateMetricBarAmount(payload.min ?? undefined, barValueFormat, numberLocale, sym);
|
|
390
|
+
const maxPart = formatDateMetricBarAmount(payload.max ?? undefined, barValueFormat, numberLocale, sym);
|
|
316
391
|
const summary = `${minPart} - ${maxPart}`;
|
|
317
392
|
const triggerLabel = `${i18n.operators.between}: ${summary}`;
|
|
318
393
|
return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_WIDE, !hasMinValue && !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsxs("div", { className: "flex w-full flex-col gap-1.5", children: [_jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { i18n as I18nInstance, TFunction } from 'i18next';
|
|
2
|
+
import type { DateSelectorI18nConfig } from '../../blocks/date-selector/date-selector-types';
|
|
3
|
+
import type { FilterFieldConfig, FilterFieldsConfig } from './filters-types';
|
|
4
|
+
/** Flat fields for minimal `Default` / `WithOneFilter` stories (real listing keys). */
|
|
5
|
+
export declare function buildListingDemoFields(t: TFunction): FilterFieldConfig[];
|
|
6
|
+
/** Grouped listing catalog for `GroupedFieldsAndSearch` (keys and shapes mirror app listing filters). */
|
|
7
|
+
export declare function buildListingGroupedFields(t: TFunction, dateSelectorI18n: DateSelectorI18nConfig, i18n: I18nInstance): FilterFieldsConfig;
|
|
8
|
+
/** Flat listing fields for docs previews (no filter i18n bundle required). */
|
|
9
|
+
export declare function buildListingDemoFieldsForDocs(): FilterFieldConfig[];
|
|
10
|
+
/** Grouped listing catalog for docs previews; pass docs `I18nextProvider` instance and date-selector copy. */
|
|
11
|
+
export declare function buildListingGroupedFieldsForDocs(dateSelectorI18n: DateSelectorI18nConfig, i18n: I18nInstance): FilterFieldsConfig;
|
|
12
|
+
//# sourceMappingURL=filter-fields-listing-demo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-fields-listing-demo.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-fields-listing-demo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAyB/D,OAAO,KAAK,EAAE,sBAAsB,EAA8C,MAAM,gDAAgD,CAAC;AACzI,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAkB,MAAM,iBAAiB,CAAC;AA0D7F,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,SAAS,GAAG,iBAAiB,EAAE,CA+BxE;AAED,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,GAAG,kBAAkB,CA0dxI;AAED,8EAA8E;AAC9E,wBAAgB,6BAA6B,IAAI,iBAAiB,EAAE,CAEnE;AAED,8GAA8G;AAC9G,wBAAgB,gCAAgC,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,GAAG,kBAAkB,CAEjI"}
|