@hjmds/react 1.41.1 → 1.42.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 +2 -2
- package/dist/actions.d.ts +41 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +40 -3
- package/dist/actions.js.map +1 -1
- package/dist/activity-chip.d.ts.map +1 -1
- package/dist/activity-chip.js +1 -0
- package/dist/activity-chip.js.map +1 -1
- package/dist/advanced-display.d.ts +47 -14
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +72 -17
- package/dist/advanced-display.js.map +1 -1
- package/dist/advanced-forms.d.ts.map +1 -1
- package/dist/advanced-forms.js +1 -0
- package/dist/advanced-forms.js.map +1 -1
- package/dist/affix.d.ts +6 -1
- package/dist/affix.d.ts.map +1 -1
- package/dist/affix.js +5 -3
- package/dist/affix.js.map +1 -1
- package/dist/agreement.d.ts.map +1 -1
- package/dist/agreement.js +1 -0
- package/dist/agreement.js.map +1 -1
- package/dist/alert-dialog-queue.d.ts +24 -0
- package/dist/alert-dialog-queue.d.ts.map +1 -0
- package/dist/alert-dialog-queue.js +44 -0
- package/dist/alert-dialog-queue.js.map +1 -0
- package/dist/anchor.d.ts.map +1 -1
- package/dist/anchor.js +1 -0
- package/dist/anchor.js.map +1 -1
- package/dist/asset.d.ts.map +1 -1
- package/dist/asset.js +1 -0
- package/dist/asset.js.map +1 -1
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +1 -0
- package/dist/auth-screen.js.map +1 -1
- package/dist/avatar-blobatar-motion.d.ts.map +1 -1
- package/dist/avatar-blobatar-motion.js +1 -0
- package/dist/avatar-blobatar-motion.js.map +1 -1
- package/dist/avatar-blobatar.d.ts.map +1 -1
- package/dist/avatar-blobatar.js +1 -0
- package/dist/avatar-blobatar.js.map +1 -1
- package/dist/bottom-cta.d.ts.map +1 -1
- package/dist/bottom-cta.js +1 -0
- package/dist/bottom-cta.js.map +1 -1
- package/dist/bottom-info.d.ts.map +1 -1
- package/dist/bottom-info.js +1 -0
- package/dist/bottom-info.js.map +1 -1
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +1 -0
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/breadcrumb.d.ts.map +1 -1
- package/dist/breadcrumb.js +1 -0
- package/dist/breadcrumb.js.map +1 -1
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +1 -0
- package/dist/calendar.js.map +1 -1
- package/dist/carousel-motion.d.ts.map +1 -1
- package/dist/carousel-motion.js +1 -0
- package/dist/carousel-motion.js.map +1 -1
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js +1 -0
- package/dist/carousel.js.map +1 -1
- package/dist/celebration.d.ts.map +1 -1
- package/dist/celebration.js +1 -0
- package/dist/celebration.js.map +1 -1
- package/dist/chart.d.ts +7 -2
- package/dist/chart.d.ts.map +1 -1
- package/dist/chart.js +6 -3
- package/dist/chart.js.map +1 -1
- package/dist/choice-row.d.ts +24 -7
- package/dist/choice-row.d.ts.map +1 -1
- package/dist/choice-row.js +11 -6
- package/dist/choice-row.js.map +1 -1
- package/dist/clipboard.d.ts.map +1 -1
- package/dist/clipboard.js +1 -0
- package/dist/clipboard.js.map +1 -1
- package/dist/collapsible.d.ts.map +1 -1
- package/dist/collapsible.js +1 -0
- package/dist/collapsible.js.map +1 -1
- package/dist/collection-rail.d.ts.map +1 -1
- package/dist/collection-rail.js +3 -1
- package/dist/collection-rail.js.map +1 -1
- package/dist/color-picker.d.ts.map +1 -1
- package/dist/color-picker.js +1 -0
- package/dist/color-picker.js.map +1 -1
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +1 -0
- package/dist/command-palette.js.map +1 -1
- package/dist/content-transition.d.ts.map +1 -1
- package/dist/content-transition.js +1 -0
- package/dist/content-transition.js.map +1 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/context-menu.js +1 -0
- package/dist/context-menu.js.map +1 -1
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +1 -0
- package/dist/conversation-row.js.map +1 -1
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +1 -0
- package/dist/data-table.js.map +1 -1
- package/dist/date-entry.d.ts.map +1 -1
- package/dist/date-entry.js +1 -0
- package/dist/date-entry.js.map +1 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +1 -0
- package/dist/date-picker.js.map +1 -1
- package/dist/date-range.d.ts.map +1 -1
- package/dist/date-range.js +1 -0
- package/dist/date-range.js.map +1 -1
- package/dist/design-profile.d.ts.map +1 -1
- package/dist/design-profile.js +1 -0
- package/dist/design-profile.js.map +1 -1
- package/dist/display.d.ts +21 -1
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +34 -8
- package/dist/display.js.map +1 -1
- package/dist/duration-field.d.ts.map +1 -1
- package/dist/duration-field.js +1 -0
- package/dist/duration-field.js.map +1 -1
- package/dist/effect-surface.d.ts.map +1 -1
- package/dist/effect-surface.js +1 -0
- package/dist/effect-surface.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/evidence.js.map +1 -1
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +1 -0
- package/dist/feedback.js.map +1 -1
- package/dist/field-group.d.ts.map +1 -1
- package/dist/field-group.js +1 -0
- package/dist/field-group.js.map +1 -1
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +1 -0
- package/dist/file-picker.js.map +1 -1
- package/dist/floating-action-button.d.ts.map +1 -1
- package/dist/floating-action-button.js +1 -0
- package/dist/floating-action-button.js.map +1 -1
- package/dist/folder-preview.d.ts.map +1 -1
- package/dist/folder-preview.js +1 -0
- package/dist/folder-preview.js.map +1 -1
- package/dist/forms.d.ts +30 -6
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +56 -14
- package/dist/forms.js.map +1 -1
- package/dist/gravity-letters.d.ts.map +1 -1
- package/dist/gravity-letters.js +1 -0
- package/dist/gravity-letters.js.map +1 -1
- package/dist/grid-reveal.d.ts.map +1 -1
- package/dist/grid-reveal.js +1 -0
- package/dist/grid-reveal.js.map +1 -1
- package/dist/heading.d.ts.map +1 -1
- package/dist/heading.js +1 -0
- package/dist/heading.js.map +1 -1
- package/dist/image-choice.d.ts.map +1 -1
- package/dist/image-choice.js +1 -0
- package/dist/image-choice.js.map +1 -1
- package/dist/image-comparison.d.ts.map +1 -1
- package/dist/image-comparison.js +1 -0
- package/dist/image-comparison.js.map +1 -1
- package/dist/image-viewer.d.ts +22 -1
- package/dist/image-viewer.d.ts.map +1 -1
- package/dist/image-viewer.js +14 -1
- package/dist/image-viewer.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inline-confirm.d.ts.map +1 -1
- package/dist/inline-confirm.js +1 -0
- package/dist/inline-confirm.js.map +1 -1
- package/dist/internal/document-resource.d.ts.map +1 -1
- package/dist/internal/document-resource.js +1 -0
- package/dist/internal/document-resource.js.map +1 -1
- package/dist/internal/initial-focus.d.ts.map +1 -1
- package/dist/internal/initial-focus.js +1 -0
- package/dist/internal/initial-focus.js.map +1 -1
- package/dist/internal/media-album.d.ts.map +1 -1
- package/dist/internal/media-album.js +1 -0
- package/dist/internal/media-album.js.map +1 -1
- package/dist/internal/message-reactions.d.ts.map +1 -1
- package/dist/internal/message-reactions.js +1 -0
- package/dist/internal/message-reactions.js.map +1 -1
- package/dist/internal/overlay-origin-motion.d.ts.map +1 -1
- package/dist/internal/overlay-origin-motion.js +1 -0
- package/dist/internal/overlay-origin-motion.js.map +1 -1
- package/dist/internal/pending-content.d.ts.map +1 -1
- package/dist/internal/pending-content.js +1 -0
- package/dist/internal/pending-content.js.map +1 -1
- package/dist/internal/photo-source-icon.d.ts.map +1 -1
- package/dist/internal/photo-source-icon.js +1 -0
- package/dist/internal/photo-source-icon.js.map +1 -1
- package/dist/internal/screen-exit.d.ts.map +1 -1
- package/dist/internal/screen-exit.js +1 -0
- package/dist/internal/screen-exit.js.map +1 -1
- package/dist/internal/screen-footer.d.ts.map +1 -1
- package/dist/internal/screen-footer.js +1 -0
- package/dist/internal/screen-footer.js.map +1 -1
- package/dist/internal/spinner.d.ts.map +1 -1
- package/dist/internal/spinner.js +1 -0
- package/dist/internal/spinner.js.map +1 -1
- package/dist/internal/use-composition-action.d.ts.map +1 -1
- package/dist/internal/use-composition-action.js +1 -0
- package/dist/internal/use-composition-action.js.map +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -1
- package/dist/layout.d.ts +11 -1
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +8 -4
- package/dist/layout.js.map +1 -1
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +1 -0
- package/dist/mentions.js.map +1 -1
- package/dist/menu-morph.d.ts.map +1 -1
- package/dist/menu-morph.js +1 -0
- package/dist/menu-morph.js.map +1 -1
- package/dist/menubar.d.ts.map +1 -1
- package/dist/menubar.js +1 -0
- package/dist/menubar.js.map +1 -1
- package/dist/modal.d.ts.map +1 -1
- package/dist/modal.js +1 -0
- package/dist/modal.js.map +1 -1
- package/dist/navigation-bar.d.ts.map +1 -1
- package/dist/navigation-bar.js +1 -0
- package/dist/navigation-bar.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +1 -0
- package/dist/navigation.js.map +1 -1
- package/dist/notification-bell.d.ts +1 -1
- package/dist/notification-bell.d.ts.map +1 -1
- package/dist/notification-bell.js +5 -1
- package/dist/notification-bell.js.map +1 -1
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +1 -0
- package/dist/number-field.js.map +1 -1
- package/dist/overlay-stack.d.ts.map +1 -1
- package/dist/overlay-stack.js +1 -0
- package/dist/overlay-stack.js.map +1 -1
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +11 -2
- package/dist/overlays.js.map +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +1 -0
- package/dist/pagination.js.map +1 -1
- package/dist/popover.d.ts.map +1 -1
- package/dist/popover.js +1 -0
- package/dist/popover.js.map +1 -1
- package/dist/portal.d.ts.map +1 -1
- package/dist/portal.js +1 -0
- package/dist/portal.js.map +1 -1
- package/dist/progressive-blur.d.ts.map +1 -1
- package/dist/progressive-blur.js +1 -0
- package/dist/progressive-blur.js.map +1 -1
- package/dist/provider-button.d.ts.map +1 -1
- package/dist/provider-button.js +1 -0
- package/dist/provider-button.js.map +1 -1
- package/dist/provider.d.ts +9 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +2 -2
- package/dist/provider.js.map +1 -1
- package/dist/public-exports.generated.d.ts +3 -0
- package/dist/public-exports.generated.d.ts.map +1 -1
- package/dist/public-exports.generated.js +9 -0
- package/dist/public-exports.generated.js.map +1 -1
- package/dist/rating.d.ts.map +1 -1
- package/dist/rating.js +1 -0
- package/dist/rating.js.map +1 -1
- package/dist/reaction-picker.d.ts.map +1 -1
- package/dist/reaction-picker.js +1 -0
- package/dist/reaction-picker.js.map +1 -1
- package/dist/saved-items.d.ts.map +1 -1
- package/dist/saved-items.js +1 -0
- package/dist/saved-items.js.map +1 -1
- package/dist/screen-flows.d.ts +5 -1
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +13 -4
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +24 -4
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +38 -11
- package/dist/screens.js.map +1 -1
- package/dist/scroll-progress.d.ts.map +1 -1
- package/dist/scroll-progress.js +1 -0
- package/dist/scroll-progress.js.map +1 -1
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +1 -0
- package/dist/select.js.map +1 -1
- package/dist/selection.d.ts +7 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +33 -10
- package/dist/selection.js.map +1 -1
- package/dist/side-panel.d.ts.map +1 -1
- package/dist/side-panel.js +1 -0
- package/dist/side-panel.js.map +1 -1
- package/dist/sidebar.d.ts +21 -2
- package/dist/sidebar.d.ts.map +1 -1
- package/dist/sidebar.js +40 -20
- package/dist/sidebar.js.map +1 -1
- package/dist/skip-nav.d.ts.map +1 -1
- package/dist/skip-nav.js +1 -0
- package/dist/skip-nav.js.map +1 -1
- package/dist/slider.d.ts.map +1 -1
- package/dist/slider.js +1 -0
- package/dist/slider.js.map +1 -1
- package/dist/sortable.d.ts.map +1 -1
- package/dist/sortable.js +1 -0
- package/dist/sortable.js.map +1 -1
- package/dist/splitter.d.ts.map +1 -1
- package/dist/splitter.js +1 -0
- package/dist/splitter.js.map +1 -1
- package/dist/statistic-motion.d.ts.map +1 -1
- package/dist/statistic-motion.js +1 -0
- package/dist/statistic-motion.js.map +1 -1
- package/dist/status-text.d.ts.map +1 -1
- package/dist/status-text.js +1 -0
- package/dist/status-text.js.map +1 -1
- package/dist/step-player.d.ts.map +1 -1
- package/dist/step-player.js +1 -0
- package/dist/step-player.js.map +1 -1
- package/dist/steps.d.ts +16 -14
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +26 -9
- package/dist/steps.js.map +1 -1
- package/dist/styles.css +140 -35
- package/dist/styles.layered.css +140 -35
- package/dist/supplemental-display.d.ts.map +1 -1
- package/dist/supplemental-display.js +1 -0
- package/dist/supplemental-display.js.map +1 -1
- package/dist/supplemental-navigation.d.ts.map +1 -1
- package/dist/supplemental-navigation.js +1 -0
- package/dist/supplemental-navigation.js.map +1 -1
- package/dist/swipe-actions.d.ts.map +1 -1
- package/dist/swipe-actions.js +1 -0
- package/dist/swipe-actions.js.map +1 -1
- package/dist/table-family.d.ts.map +1 -1
- package/dist/table-family.js +1 -0
- package/dist/table-family.js.map +1 -1
- package/dist/table-sort-button.d.ts.map +1 -1
- package/dist/table-sort-button.js +1 -0
- package/dist/table-sort-button.js.map +1 -1
- package/dist/tags-input.d.ts.map +1 -1
- package/dist/tags-input.js +1 -0
- package/dist/tags-input.js.map +1 -1
- package/dist/task-list.d.ts.map +1 -1
- package/dist/task-list.js +1 -0
- package/dist/task-list.js.map +1 -1
- package/dist/text-annotation.d.ts.map +1 -1
- package/dist/text-annotation.js +1 -0
- package/dist/text-annotation.js.map +1 -1
- package/dist/text-formats.d.ts.map +1 -1
- package/dist/text-formats.js +1 -0
- package/dist/text-formats.js.map +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +12 -1
- package/dist/theme.js.map +1 -1
- package/dist/thinking-orb.d.ts.map +1 -1
- package/dist/thinking-orb.js +1 -0
- package/dist/thinking-orb.js.map +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +1 -0
- package/dist/toast.js.map +1 -1
- package/dist/toggle-group.d.ts.map +1 -1
- package/dist/toggle-group.js +1 -0
- package/dist/toggle-group.js.map +1 -1
- package/dist/top-bar.d.ts.map +1 -1
- package/dist/top-bar.js +1 -0
- package/dist/top-bar.js.map +1 -1
- package/dist/top.d.ts.map +1 -1
- package/dist/top.js +4 -3
- package/dist/top.js.map +1 -1
- package/dist/tour.d.ts.map +1 -1
- package/dist/tour.js +1 -0
- package/dist/tour.js.map +1 -1
- package/dist/transfer-list.d.ts.map +1 -1
- package/dist/transfer-list.js +1 -0
- package/dist/transfer-list.js.map +1 -1
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -0
- package/dist/tree.js.map +1 -1
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +1 -0
- package/dist/upload-item.js.map +1 -1
- package/dist/virtual-list.d.ts.map +1 -1
- package/dist/virtual-list.js +1 -0
- package/dist/virtual-list.js.map +1 -1
- package/dist/voice-note.d.ts.map +1 -1
- package/dist/voice-note.js +1 -0
- package/dist/voice-note.js.map +1 -1
- package/package.json +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-family.d.ts","sourceRoot":"","sources":["../src/table-family.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table-family.d.ts","sourceRoot":"","sources":["../src/table-family.tsx"],"names":[],"mappings":"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"}
|
package/dist/table-family.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { useLayoutEffect, useRef } from "react";
|
|
3
4
|
import { dataTableFamilyRecipe, formatLineScoreCell, resolveComparisonRow, resolveLineScore, resolveMatrix, } from "@hjmds/design-contracts/components/data-table";
|
package/dist/table-family.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-family.js","sourceRoot":"","sources":["../src/table-family.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useLayoutEffect, useRef, type CSSProperties, type ReactNode } from \"react\";\nimport type { ColorReference } from \"@hjmds/design-contracts/color-references\";\nimport {\n dataTableFamilyRecipe, formatLineScoreCell, resolveComparisonRow, resolveLineScore, resolveMatrix,\n type ComparisonRow, type DataTableCellHeat, type DataTableCellTone, type LineScoreTeam, type MatrixCell,\n} from \"@hjmds/design-contracts/components/data-table\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\n/*\n * Table family companions (2026-10-14): layouts products kept hand-building next to DataTable.\n * LineScore follows MLB/ESPN game headers, MatrixTable a head-to-head cross table, ComparisonTable\n * the ESPN matchup rows. Geometry and rules live in the data-table contract; these only draw.\n */\n\nfunction kebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\n/** Recipe colors resolve through the provider's CSS variables so a theme switch repaints without re-rendering (same as Chart). */\nexport function tableCssColor(reference: ColorReference): string {\n const name = reference.source === \"theme\"\n ? `--hjm-color-${kebab(reference.key)}`\n : reference.source === \"accent\" ? `--hjm-accent-${kebab(reference.key)}` : `--hjm-accent-fill-${kebab(reference.key)}`;\n return reference.alpha === undefined || reference.alpha === 1\n ? `var(${name})`\n : `color-mix(in srgb, var(${name}) ${Math.round(reference.alpha * 100)}%, transparent)`;\n}\n\n/** Live period and \"my team\" row share the family highlight tint. */\nconst familyStyle = { \"--hjm-table-family-selected\": tableCssColor(dataTableFamilyRecipe.highlight.background) } as CSSProperties;\nconst withFamilyStyle = (layoutStyle: HjmCompositionStyleProp | undefined) => ({ ...familyStyle, ...layoutStyle }) as CSSProperties;\n\nexport type TableHeatColors = Readonly<{ high: string; low: string }>;\n\n/**\n * Cell emphasis as inline style. Heat paints a background *image* so pinned cells keep their opaque\n * canvas color underneath and scrolled content never shows through the translucent tint.\n */\nexport function tableCellEmphasis(\n decoration: Readonly<{ tone?: DataTableCellTone | null; heat?: DataTableCellHeat | null }> | null | undefined,\n heatColors?: TableHeatColors,\n): Readonly<{ style: CSSProperties; tone?: DataTableCellTone; heat?: string }> {\n if (!decoration) return { style: {} };\n const style: Record<string, string | number> = {};\n const tone = decoration.tone ?? undefined, heat = decoration.heat ?? null;\n if (tone) {\n style.color = tableCssColor(dataTableFamilyRecipe.tone[tone].color);\n style.fontWeight = dataTableFamilyRecipe.tone[tone].fontWeight;\n }\n if (heat) {\n const base = heatColors?.[heat.side] ?? tableCssColor(dataTableFamilyRecipe.heat[heat.side]);\n style[\"--hjm-data-table-heat\"] = `color-mix(in srgb, ${base} ${Math.round(dataTableFamilyRecipe.heatAlpha[heat.strength] * 100)}%, transparent)`;\n }\n return { style: style as CSSProperties, ...(tone ? { tone } : {}), ...(heat ? { heat: `${heat.side}-${heat.strength}` } : {}) };\n}\n\n/* ---------------------------------------------- Line score ------------------------------------- */\n\n/**\n * Team and total columns stay pinned while only the periods scroll, as on Native: at 402px the totals — the result —\n * scrolled off with the extra innings (2026-10-17 review E17). Totals have a fixed width so each can pin at its offset.\n */\nconst totalOffset = (count: number, index: number): CSSProperties => ({ insetInlineEnd: `calc(var(--hjm-line-score-total-width) * ${count - 1 - index})` });\n\nexport type LineScoreProps = Readonly<{\n teams: readonly LineScoreTeam[];\n /** Total column headers in order, e.g. [\"R\", \"H\", \"E\", \"B\"]. The first one decides the leader. */\n totals: readonly string[];\n /** Live period (1-based) to highlight. */\n currentPeriod?: number | null;\n minPeriods?: number;\n /** Optional leading content per team (logo/badge). */\n renderTeam?: (team: LineScoreTeam) => ReactNode;\n /** Accessible name of the table (prop name kept for Native parity). */\n accessibilityLabel: string;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function LineScore({ teams, totals, currentPeriod = null, minPeriods, renderTeam, accessibilityLabel, className, layoutStyle }: LineScoreProps) {\n const score = resolveLineScore(teams, { totals, currentPeriod, ...(minPeriods !== undefined ? { minPeriods } : {}) });\n const periods = score.columns.filter((column) => column.kind === \"period\");\n const totalColumns = score.columns.filter((column) => column.kind === \"total\");\n // Open the period strip at the live (or latest) period, as Native: starting at inning 1 hid extra innings behind the\n // pinned totals and read as a shorter game (2026-10-17 review N4). scroll-padding keeps it clear of the totals.\n const host = useRef<HTMLDivElement>(null);\n const focusPeriod = score.currentPeriod ?? periods.length;\n useLayoutEffect(() => {\n const container = host.current;\n if (!container || container.scrollWidth <= container.clientWidth) return;\n container.querySelector<HTMLElement>(`thead [data-period=\"${focusPeriod}\"]`)?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }, [focusPeriod, periods.length]);\n return (\n <div ref={host} className={classNames(\"hjm-table-family\", \"hjm-line-score\", className)} style={{ ...withFamilyStyle(layoutStyle), \"--hjm-line-score-total-count\": totalColumns.length } as CSSProperties}>\n <table className=\"hjm-line-score__table\" aria-label={accessibilityLabel}>\n <thead>\n <tr>\n <td className=\"hjm-line-score__team\" />\n {periods.map((column, index) => {\n const live = score.currentPeriod === index + 1;\n return <th key={column.id} scope=\"col\" className=\"hjm-line-score__period\" data-period={index + 1} aria-current={live ? \"true\" : undefined} data-current={live || undefined}>{column.header}</th>;\n })}\n {totalColumns.map((column, index) => (\n <th key={column.id} scope=\"col\" className={classNames(\"hjm-line-score__total\", index === 0 && \"hjm-line-score__total-edge\")} style={totalOffset(totalColumns.length, index)}>{column.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {teams.map((team) => (\n <tr key={team.id} data-leader={score.leaderId === team.id || undefined}>\n <th scope=\"row\" className=\"hjm-line-score__team\">\n <span className=\"hjm-line-score__team-content\">{renderTeam?.(team)}<span>{team.name}</span></span>\n </th>\n {periods.map((column, index) => {\n const value = team.periods[index];\n return <td key={column.id} className=\"hjm-line-score__period\" data-current={score.currentPeriod === index + 1 || undefined} data-scored={typeof value === \"number\" && value > 0 || undefined}>{formatLineScoreCell(value)}</td>;\n })}\n {totalColumns.map((column, index) => (\n <td key={column.id} className={classNames(\"hjm-line-score__total\", index === 0 && \"hjm-line-score__total-edge\")} style={totalOffset(totalColumns.length, index)}>{team.totals[column.header] ?? \"—\"}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n/* ---------------------------------------------- Matrix table ----------------------------------- */\n\nexport type MatrixTableProps<Key extends string = string> = Readonly<{\n ids: readonly Key[];\n /** Short header per id (team short name). */\n labelOf: (id: Key) => string;\n getCell: (row: Key, column: Key) => MatrixCell | null;\n /** Row id to highlight (my team). */\n highlightId?: Key | null;\n heatColors?: TableHeatColors;\n accessibilityLabel: string;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function MatrixTable<Key extends string = string>({ ids, labelOf, getCell, highlightId = null, heatColors, accessibilityLabel, className, layoutStyle }: MatrixTableProps<Key>) {\n const matrix = resolveMatrix(ids, getCell);\n return (\n <div className={classNames(\"hjm-table-family\", \"hjm-matrix-table\", className)} style={withFamilyStyle(layoutStyle)}>\n <table className=\"hjm-matrix-table__table\" aria-label={accessibilityLabel}>\n <thead>\n <tr>\n <td className=\"hjm-matrix-table__corner\" />\n {ids.map((id) => <th key={id} scope=\"col\">{labelOf(id)}</th>)}\n </tr>\n </thead>\n <tbody>\n {matrix.map((cells, rowIndex) => {\n const rowId = ids[rowIndex]!;\n return (\n <tr key={rowId} data-highlighted={rowId === highlightId || undefined}>\n <th scope=\"row\">{labelOf(rowId)}</th>\n {cells.map((cell, columnIndex) => {\n // The diagonal is a team against itself: blank and hidden, not \"no record\".\n if (cell === \"self\") return <td key={ids[columnIndex]} className=\"hjm-matrix-table__self\" aria-hidden=\"true\" />;\n const emphasis = tableCellEmphasis(cell, heatColors);\n return <td key={ids[columnIndex]} className={emphasis.heat ? \"hjm-table-family__heat\" : undefined} style={emphasis.style} data-tone={emphasis.tone} data-heat={emphasis.heat}>{cell?.label ?? \"—\"}</td>;\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n/* ---------------------------------------------- Comparison table ------------------------------- */\n\nexport type ComparisonTableProps = Readonly<{\n rows: readonly ComparisonRow[];\n /** Side names and accent colors (team colors). */\n sides: readonly [Readonly<{ name: string; color: string }>, Readonly<{ name: string; color: string }>];\n /** Hide duplicate visual names when the two sides are already identified above; spoken row labels retain them. */\n showSideNames?: boolean;\n accessibilityLabel: string;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function ComparisonTable({ rows, sides, showSideNames = true, accessibilityLabel, className, layoutStyle }: ComparisonTableProps) {\n return (\n <section className={classNames(\"hjm-table-family\", \"hjm-comparison-table\", className)} style={withFamilyStyle(layoutStyle)} aria-label={accessibilityLabel}>\n {showSideNames && <div className=\"hjm-comparison-table__sides\" aria-hidden=\"true\">\n {sides.map((side, index) => <span key={index} style={{ color: side.color }}>{side.name}</span>)}\n </div>}\n <ul className=\"hjm-comparison-table__rows\" role=\"list\">\n {rows.map((row) => {\n const { winner, shares } = resolveComparisonRow(row);\n const shown = row.display ?? [row.values[0] === null ? \"—\" : String(row.values[0]), row.values[1] === null ? \"—\" : String(row.values[1])];\n return (\n <li key={row.id} className=\"hjm-comparison-table__row\" data-winner={winner ?? undefined}>\n {/* One sentence for assistive tech; the visual grid and bars are decoration. */}\n <span className=\"hjm-visually-hidden\">{`${row.label} ${sides[0].name} ${shown[0]}, ${sides[1].name} ${shown[1]}`}</span>\n <div className=\"hjm-comparison-table__values\" aria-hidden=\"true\">\n <span data-win={winner === 0 || undefined}>{shown[0]}</span>\n <span className=\"hjm-comparison-table__label\">{row.label}</span>\n <span data-win={winner === 1 || undefined}>{shown[1]}</span>\n </div>\n <div className=\"hjm-comparison-table__bars\" aria-hidden=\"true\">\n {([0, 1] as const).map((index) => (\n <span key={index} className=\"hjm-comparison-table__track\" data-side={index}>\n <span\n className=\"hjm-comparison-table__bar\"\n style={{ inlineSize: `${Math.round(shares[index] * 1000) / 10}%`, background: sides[index].color, opacity: winner === null || winner === index ? 1 : 0.6 }}\n />\n </span>\n ))}\n </div>\n </li>\n );\n })}\n </ul>\n </section>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"table-family.js","sourceRoot":"","sources":["../src/table-family.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,eAAe,EAAE,MAAM,EAAsC,MAAM,OAAO,CAAC;AAEpF,OAAO,EACL,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,aAAa,GAElG,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C;;;;GAIG;AAEH,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,kIAAkI;AAClI,MAAM,UAAU,aAAa,CAAC,SAAyB;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO;QACvC,CAAC,CAAC,eAAe,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;QACvC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACzH,OAAO,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,CAAC;QAC3D,CAAC,CAAC,OAAO,IAAI,GAAG;QAChB,CAAC,CAAC,0BAA0B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC;AAC5F,CAAC;AAED,qEAAqE;AACrE,MAAM,WAAW,GAAG,EAAE,6BAA6B,EAAE,aAAa,CAAC,qBAAqB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAmB,CAAC;AAClI,MAAM,eAAe,GAAG,CAAC,WAAgD,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW,EAAE,CAAkB,CAAC;AAIpI;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAA6G,EAC7G,UAA4B;IAE5B,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACtC,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,SAAS,EAAE,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;IAC1E,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QACpE,KAAK,CAAC,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7F,KAAK,CAAC,uBAAuB,CAAC,GAAG,sBAAsB,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACnJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAsB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAClI,CAAC;AAED,qGAAqG;AAErG;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,KAAa,EAAiB,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,4CAA4C,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;AAiB5J,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAkB;IACnJ,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC/E,qHAAqH;IACrH,gHAAgH;IAChH,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1D,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW;YAAE,OAAO;QACzE,SAAS,CAAC,aAAa,CAAc,uBAAuB,WAAW,IAAI,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACxI,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,OAAO,CACL,cAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,8BAA8B,EAAE,YAAY,CAAC,MAAM,EAAmB,YACtM,iBAAO,SAAS,EAAC,uBAAuB,gBAAa,kBAAkB,aACrE,0BACE,yBACE,aAAI,SAAS,EAAC,sBAAsB,GAAG,EACtC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gCAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,KAAK,KAAK,GAAG,CAAC,CAAC;gCAC/C,OAAO,aAAoB,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,wBAAwB,iBAAc,KAAK,GAAG,CAAC,kBAAgB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,kBAAgB,IAAI,IAAI,SAAS,YAAG,MAAM,CAAC,MAAM,IAA1K,MAAM,CAAC,EAAE,CAAuK,CAAC;4BACnM,CAAC,CAAC,EACD,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CACnC,aAAoB,KAAK,EAAC,KAAK,EAAC,SAAS,EAAE,UAAU,CAAC,uBAAuB,EAAE,KAAK,KAAK,CAAC,IAAI,4BAA4B,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,YAAG,MAAM,CAAC,MAAM,IAAlL,MAAM,CAAC,EAAE,CAA+K,CAClM,CAAC,IACC,GACC,EACR,0BACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,6BAA+B,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,IAAI,SAAS,aACpE,aAAI,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,sBAAsB,YAC9C,gBAAM,SAAS,EAAC,8BAA8B,aAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAC,yBAAO,IAAI,CAAC,IAAI,GAAQ,IAAO,GAC/F,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gCAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gCAClC,OAAO,aAAoB,SAAS,EAAC,wBAAwB,kBAAe,KAAK,CAAC,aAAa,KAAK,KAAK,GAAG,CAAC,IAAI,SAAS,iBAAe,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,SAAS,YAAG,mBAAmB,CAAC,KAAK,CAAC,IAAzM,MAAM,CAAC,EAAE,CAAsM,CAAC;4BAClO,CAAC,CAAC,EACD,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CACnC,aAAoB,SAAS,EAAE,UAAU,CAAC,uBAAuB,EAAE,KAAK,KAAK,CAAC,IAAI,4BAA4B,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,YAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAA1L,MAAM,CAAC,EAAE,CAAuL,CAC1M,CAAC,KAVK,IAAI,CAAC,EAAE,CAWX,CACN,CAAC,GACI,IACF,GACJ,CACP,CAAC;AACJ,CAAC;AAiBD,MAAM,UAAU,WAAW,CAA8B,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAyB;IACnL,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,CACL,cAAK,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,YAChH,iBAAO,SAAS,EAAC,yBAAyB,gBAAa,kBAAkB,aACvE,0BACE,yBACE,aAAI,SAAS,EAAC,0BAA0B,GAAG,EAC1C,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,KAAK,EAAC,KAAK,YAAE,OAAO,CAAC,EAAE,CAAC,IAA5B,EAAE,CAAgC,CAAC,IAC1D,GACC,EACR,0BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;wBAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAE,CAAC;wBAC7B,OAAO,CACL,kCAAkC,KAAK,KAAK,WAAW,IAAI,SAAS,aAClE,aAAI,KAAK,EAAC,KAAK,YAAE,OAAO,CAAC,KAAK,CAAC,GAAM,EACpC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;oCAC/B,4EAA4E;oCAC5E,IAAI,IAAI,KAAK,MAAM;wCAAE,OAAO,aAA2B,SAAS,EAAC,wBAAwB,iBAAa,MAAM,IAAvE,GAAG,CAAC,WAAW,CAAC,CAA0D,CAAC;oCAChH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;oCACrD,OAAO,aAA2B,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,eAAa,QAAQ,CAAC,IAAI,eAAa,QAAQ,CAAC,IAAI,YAAG,IAAI,EAAE,KAAK,IAAI,GAAG,IAAjL,GAAG,CAAC,WAAW,CAAC,CAAuK,CAAC;gCAC1M,CAAC,CAAC,KAPK,KAAK,CAQT,CACN,CAAC;oBACJ,CAAC,CAAC,GACI,IACF,GACJ,CACP,CAAC;AACJ,CAAC;AAeD,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAwB;IACrI,OAAO,CACL,mBAAS,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,gBAAc,kBAAkB,aACvJ,aAAa,IAAI,cAAK,SAAS,EAAC,6BAA6B,iBAAa,MAAM,YAC9E,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,eAAkB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,YAAG,IAAI,CAAC,IAAI,IAA/C,KAAK,CAAkD,CAAC,GAC3F,EACN,aAAI,SAAS,EAAC,4BAA4B,EAAC,IAAI,EAAC,MAAM,YACnD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBAChB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1I,OAAO,CACL,cAAiB,SAAS,EAAC,2BAA2B,iBAAc,MAAM,IAAI,SAAS,aAErF,eAAM,SAAS,EAAC,qBAAqB,YAAE,GAAG,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAQ,EACxH,eAAK,SAAS,EAAC,8BAA8B,iBAAa,MAAM,aAC9D,2BAAgB,MAAM,KAAK,CAAC,IAAI,SAAS,YAAG,KAAK,CAAC,CAAC,CAAC,GAAQ,EAC5D,eAAM,SAAS,EAAC,6BAA6B,YAAE,GAAG,CAAC,KAAK,GAAQ,EAChE,2BAAgB,MAAM,KAAK,CAAC,IAAI,SAAS,YAAG,KAAK,CAAC,CAAC,CAAC,GAAQ,IACxD,EACN,cAAK,SAAS,EAAC,4BAA4B,iBAAa,MAAM,YAC1D,CAAC,CAAC,EAAE,CAAC,CAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAChC,eAAkB,SAAS,EAAC,6BAA6B,eAAY,KAAK,YACxE,eACE,SAAS,EAAC,2BAA2B,EACrC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAC1J,IAJO,KAAK,CAKT,CACR,CAAC,GACE,KAjBC,GAAG,CAAC,EAAE,CAkBV,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,IACG,CACX,CAAC;AACJ,CAAC","sourcesContent":["\"use client\";\n\nimport { useLayoutEffect, useRef, type CSSProperties, type ReactNode } from \"react\";\nimport type { ColorReference } from \"@hjmds/design-contracts/color-references\";\nimport {\n dataTableFamilyRecipe, formatLineScoreCell, resolveComparisonRow, resolveLineScore, resolveMatrix,\n type ComparisonRow, type DataTableCellHeat, type DataTableCellTone, type LineScoreTeam, type MatrixCell,\n} from \"@hjmds/design-contracts/components/data-table\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\n/*\n * Table family companions (2026-10-14): layouts products kept hand-building next to DataTable.\n * LineScore follows MLB/ESPN game headers, MatrixTable a head-to-head cross table, ComparisonTable\n * the ESPN matchup rows. Geometry and rules live in the data-table contract; these only draw.\n */\n\nfunction kebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\n/** Recipe colors resolve through the provider's CSS variables so a theme switch repaints without re-rendering (same as Chart). */\nexport function tableCssColor(reference: ColorReference): string {\n const name = reference.source === \"theme\"\n ? `--hjm-color-${kebab(reference.key)}`\n : reference.source === \"accent\" ? `--hjm-accent-${kebab(reference.key)}` : `--hjm-accent-fill-${kebab(reference.key)}`;\n return reference.alpha === undefined || reference.alpha === 1\n ? `var(${name})`\n : `color-mix(in srgb, var(${name}) ${Math.round(reference.alpha * 100)}%, transparent)`;\n}\n\n/** Live period and \"my team\" row share the family highlight tint. */\nconst familyStyle = { \"--hjm-table-family-selected\": tableCssColor(dataTableFamilyRecipe.highlight.background) } as CSSProperties;\nconst withFamilyStyle = (layoutStyle: HjmCompositionStyleProp | undefined) => ({ ...familyStyle, ...layoutStyle }) as CSSProperties;\n\nexport type TableHeatColors = Readonly<{ high: string; low: string }>;\n\n/**\n * Cell emphasis as inline style. Heat paints a background *image* so pinned cells keep their opaque\n * canvas color underneath and scrolled content never shows through the translucent tint.\n */\nexport function tableCellEmphasis(\n decoration: Readonly<{ tone?: DataTableCellTone | null; heat?: DataTableCellHeat | null }> | null | undefined,\n heatColors?: TableHeatColors,\n): Readonly<{ style: CSSProperties; tone?: DataTableCellTone; heat?: string }> {\n if (!decoration) return { style: {} };\n const style: Record<string, string | number> = {};\n const tone = decoration.tone ?? undefined, heat = decoration.heat ?? null;\n if (tone) {\n style.color = tableCssColor(dataTableFamilyRecipe.tone[tone].color);\n style.fontWeight = dataTableFamilyRecipe.tone[tone].fontWeight;\n }\n if (heat) {\n const base = heatColors?.[heat.side] ?? tableCssColor(dataTableFamilyRecipe.heat[heat.side]);\n style[\"--hjm-data-table-heat\"] = `color-mix(in srgb, ${base} ${Math.round(dataTableFamilyRecipe.heatAlpha[heat.strength] * 100)}%, transparent)`;\n }\n return { style: style as CSSProperties, ...(tone ? { tone } : {}), ...(heat ? { heat: `${heat.side}-${heat.strength}` } : {}) };\n}\n\n/* ---------------------------------------------- Line score ------------------------------------- */\n\n/**\n * Team and total columns stay pinned while only the periods scroll, as on Native: at 402px the totals — the result —\n * scrolled off with the extra innings (2026-10-17 review E17). Totals have a fixed width so each can pin at its offset.\n */\nconst totalOffset = (count: number, index: number): CSSProperties => ({ insetInlineEnd: `calc(var(--hjm-line-score-total-width) * ${count - 1 - index})` });\n\nexport type LineScoreProps = Readonly<{\n teams: readonly LineScoreTeam[];\n /** Total column headers in order, e.g. [\"R\", \"H\", \"E\", \"B\"]. The first one decides the leader. */\n totals: readonly string[];\n /** Live period (1-based) to highlight. */\n currentPeriod?: number | null;\n minPeriods?: number;\n /** Optional leading content per team (logo/badge). */\n renderTeam?: (team: LineScoreTeam) => ReactNode;\n /** Accessible name of the table (prop name kept for Native parity). */\n accessibilityLabel: string;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function LineScore({ teams, totals, currentPeriod = null, minPeriods, renderTeam, accessibilityLabel, className, layoutStyle }: LineScoreProps) {\n const score = resolveLineScore(teams, { totals, currentPeriod, ...(minPeriods !== undefined ? { minPeriods } : {}) });\n const periods = score.columns.filter((column) => column.kind === \"period\");\n const totalColumns = score.columns.filter((column) => column.kind === \"total\");\n // Open the period strip at the live (or latest) period, as Native: starting at inning 1 hid extra innings behind the\n // pinned totals and read as a shorter game (2026-10-17 review N4). scroll-padding keeps it clear of the totals.\n const host = useRef<HTMLDivElement>(null);\n const focusPeriod = score.currentPeriod ?? periods.length;\n useLayoutEffect(() => {\n const container = host.current;\n if (!container || container.scrollWidth <= container.clientWidth) return;\n container.querySelector<HTMLElement>(`thead [data-period=\"${focusPeriod}\"]`)?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }, [focusPeriod, periods.length]);\n return (\n <div ref={host} className={classNames(\"hjm-table-family\", \"hjm-line-score\", className)} style={{ ...withFamilyStyle(layoutStyle), \"--hjm-line-score-total-count\": totalColumns.length } as CSSProperties}>\n <table className=\"hjm-line-score__table\" aria-label={accessibilityLabel}>\n <thead>\n <tr>\n <td className=\"hjm-line-score__team\" />\n {periods.map((column, index) => {\n const live = score.currentPeriod === index + 1;\n return <th key={column.id} scope=\"col\" className=\"hjm-line-score__period\" data-period={index + 1} aria-current={live ? \"true\" : undefined} data-current={live || undefined}>{column.header}</th>;\n })}\n {totalColumns.map((column, index) => (\n <th key={column.id} scope=\"col\" className={classNames(\"hjm-line-score__total\", index === 0 && \"hjm-line-score__total-edge\")} style={totalOffset(totalColumns.length, index)}>{column.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {teams.map((team) => (\n <tr key={team.id} data-leader={score.leaderId === team.id || undefined}>\n <th scope=\"row\" className=\"hjm-line-score__team\">\n <span className=\"hjm-line-score__team-content\">{renderTeam?.(team)}<span>{team.name}</span></span>\n </th>\n {periods.map((column, index) => {\n const value = team.periods[index];\n return <td key={column.id} className=\"hjm-line-score__period\" data-current={score.currentPeriod === index + 1 || undefined} data-scored={typeof value === \"number\" && value > 0 || undefined}>{formatLineScoreCell(value)}</td>;\n })}\n {totalColumns.map((column, index) => (\n <td key={column.id} className={classNames(\"hjm-line-score__total\", index === 0 && \"hjm-line-score__total-edge\")} style={totalOffset(totalColumns.length, index)}>{team.totals[column.header] ?? \"—\"}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n/* ---------------------------------------------- Matrix table ----------------------------------- */\n\nexport type MatrixTableProps<Key extends string = string> = Readonly<{\n ids: readonly Key[];\n /** Short header per id (team short name). */\n labelOf: (id: Key) => string;\n getCell: (row: Key, column: Key) => MatrixCell | null;\n /** Row id to highlight (my team). */\n highlightId?: Key | null;\n heatColors?: TableHeatColors;\n accessibilityLabel: string;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function MatrixTable<Key extends string = string>({ ids, labelOf, getCell, highlightId = null, heatColors, accessibilityLabel, className, layoutStyle }: MatrixTableProps<Key>) {\n const matrix = resolveMatrix(ids, getCell);\n return (\n <div className={classNames(\"hjm-table-family\", \"hjm-matrix-table\", className)} style={withFamilyStyle(layoutStyle)}>\n <table className=\"hjm-matrix-table__table\" aria-label={accessibilityLabel}>\n <thead>\n <tr>\n <td className=\"hjm-matrix-table__corner\" />\n {ids.map((id) => <th key={id} scope=\"col\">{labelOf(id)}</th>)}\n </tr>\n </thead>\n <tbody>\n {matrix.map((cells, rowIndex) => {\n const rowId = ids[rowIndex]!;\n return (\n <tr key={rowId} data-highlighted={rowId === highlightId || undefined}>\n <th scope=\"row\">{labelOf(rowId)}</th>\n {cells.map((cell, columnIndex) => {\n // The diagonal is a team against itself: blank and hidden, not \"no record\".\n if (cell === \"self\") return <td key={ids[columnIndex]} className=\"hjm-matrix-table__self\" aria-hidden=\"true\" />;\n const emphasis = tableCellEmphasis(cell, heatColors);\n return <td key={ids[columnIndex]} className={emphasis.heat ? \"hjm-table-family__heat\" : undefined} style={emphasis.style} data-tone={emphasis.tone} data-heat={emphasis.heat}>{cell?.label ?? \"—\"}</td>;\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n/* ---------------------------------------------- Comparison table ------------------------------- */\n\nexport type ComparisonTableProps = Readonly<{\n rows: readonly ComparisonRow[];\n /** Side names and accent colors (team colors). */\n sides: readonly [Readonly<{ name: string; color: string }>, Readonly<{ name: string; color: string }>];\n /** Hide duplicate visual names when the two sides are already identified above; spoken row labels retain them. */\n showSideNames?: boolean;\n accessibilityLabel: string;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport function ComparisonTable({ rows, sides, showSideNames = true, accessibilityLabel, className, layoutStyle }: ComparisonTableProps) {\n return (\n <section className={classNames(\"hjm-table-family\", \"hjm-comparison-table\", className)} style={withFamilyStyle(layoutStyle)} aria-label={accessibilityLabel}>\n {showSideNames && <div className=\"hjm-comparison-table__sides\" aria-hidden=\"true\">\n {sides.map((side, index) => <span key={index} style={{ color: side.color }}>{side.name}</span>)}\n </div>}\n <ul className=\"hjm-comparison-table__rows\" role=\"list\">\n {rows.map((row) => {\n const { winner, shares } = resolveComparisonRow(row);\n const shown = row.display ?? [row.values[0] === null ? \"—\" : String(row.values[0]), row.values[1] === null ? \"—\" : String(row.values[1])];\n return (\n <li key={row.id} className=\"hjm-comparison-table__row\" data-winner={winner ?? undefined}>\n {/* One sentence for assistive tech; the visual grid and bars are decoration. */}\n <span className=\"hjm-visually-hidden\">{`${row.label} ${sides[0].name} ${shown[0]}, ${sides[1].name} ${shown[1]}`}</span>\n <div className=\"hjm-comparison-table__values\" aria-hidden=\"true\">\n <span data-win={winner === 0 || undefined}>{shown[0]}</span>\n <span className=\"hjm-comparison-table__label\">{row.label}</span>\n <span data-win={winner === 1 || undefined}>{shown[1]}</span>\n </div>\n <div className=\"hjm-comparison-table__bars\" aria-hidden=\"true\">\n {([0, 1] as const).map((index) => (\n <span key={index} className=\"hjm-comparison-table__track\" data-side={index}>\n <span\n className=\"hjm-comparison-table__bar\"\n style={{ inlineSize: `${Math.round(shares[index] * 1000) / 10}%`, background: sides[index].color, opacity: winner === null || winner === index ? 1 : 0.6 }}\n />\n </span>\n ))}\n </div>\n </li>\n );\n })}\n </ul>\n </section>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-sort-button.d.ts","sourceRoot":"","sources":["../src/table-sort-button.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table-sort-button.d.ts","sourceRoot":"","sources":["../src/table-sort-button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAI5F,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC;IACzG,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC7D,MAAM,EAAE,QAAQ,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAChE,CAAC,+BAKD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-sort-button.js","sourceRoot":"","sources":["../src/table-sort-button.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table-sort-button.js","sourceRoot":"","sources":["../src/table-sort-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAKb,8EAA8E;AAC9E,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAI5F;IACA,OAAO,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,SAAS,gBAAc,cAAc,EAAE,OAAO,EAAE,MAAM,aAC5F,yBAAO,MAAM,GAAQ,EACrB,8BAAkB,MAAM,YAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAQ,IACtE,CAAC;AACZ,CAAC","sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { DataTableSortDirection } from \"@hjmds/design-contracts/components/data-table\";\n\n// Both public tables need the same native button/hidden glyph semantics. Keep\n// their two-state/three-state policies and CSS separate rather than merging APIs.\nexport function TableSortButton({ header, direction, glyphs, className, accessibleName, onSort }: Readonly<{\n header: ReactNode; direction?: DataTableSortDirection | null;\n glyphs: Readonly<{ ascending: string; descending: string; none: string }>;\n className: string; accessibleName?: string; onSort: () => void;\n}>) {\n return <button type=\"button\" className={className} aria-label={accessibleName} onClick={onSort}>\n <span>{header}</span>\n <span aria-hidden=\"true\">{direction ? glyphs[direction] : glyphs.none}</span>\n </button>;\n}\n"]}
|
package/dist/tags-input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags-input.d.ts","sourceRoot":"","sources":["../src/tags-input.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tags-input.d.ts","sourceRoot":"","sources":["../src/tags-input.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,+CAA+C,CAAC;AAUvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC3C,gEAAgE;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC7C,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH,eAAO,MAAM,SAAS;WA/Bb,MAAM;WACN,SAAS,MAAM,EAAE;kBACV,SAAS,MAAM,EAAE;mBAChB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI;IAChD,6EAA6E;eAClE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI;IAClD;;;OAGG;oBACa,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;aAC9B,eAAe;iBACX,SAAS,kBAAkB,EAAE;IAC1C,gEAAgE;wBAC5C,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM;IAC3C;;;;OAIG;kBACW,SAAS,mBAAmB,EAAE;IAC5C,wDAAwD;uBACrC,MAAM;kBACX,MAAM;kBACN,MAAM;eACT,OAAO;gBACN,MAAM;IAClB,gGAAgG;kBAClF,uBAAuB;qDAiLrC,CAAC"}
|
package/dist/tags-input.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { removeTagAt, resolveTagsInputActiveSuggestion, resolveTagsInputCommit, tagsInputBehaviorDefaults, tagsInputRecipe, } from "@hjmds/design-contracts/components/tags-input";
|
|
3
4
|
import { forwardRef, useId, useRef, useState, } from "react";
|
package/dist/tags-input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags-input.js","sourceRoot":"","sources":["../src/tags-input.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n removeTagAt,\n resolveTagsInputActiveSuggestion,\n resolveTagsInputCommit,\n tagsInputBehaviorDefaults,\n tagsInputRecipe,\n type TagsInputCommitKey,\n type TagsInputCommitResult,\n type TagsInputPolicy,\n type TagsInputSuggestion,\n} from \"@hjmds/design-contracts/components/tags-input\";\nimport {\n forwardRef,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n} from \"react\";\nimport { classNames, composeRefs, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type TagsInputProps = Readonly<{\n label: string;\n tags?: readonly string[];\n defaultTags?: readonly string[];\n onTagsChange?: (tags: readonly string[]) => void;\n /** Fires when a value could not be committed, with the contract's reason. */\n onReject?: (result: TagsInputCommitResult) => void;\n /**\n * The text being typed. A product filtering `suggestions` cannot do it\n * without this — the draft lives here, not in the product's state.\n */\n onDraftChange?: (draft: string) => void;\n policy?: TagsInputPolicy;\n commitKeys?: readonly TagsInputCommitKey[];\n /** Composes one tag's remove-control name from the tag text. */\n composeRemoveLabel: (tag: string) => string;\n /**\n * Candidates for the current draft, already filtered by the product. Present\n * them and the field becomes the multi-select combobox case without a second\n * value shape.\n */\n suggestions?: readonly TagsInputSuggestion[];\n /** Localized accessible name for the candidate list. */\n suggestionsLabel?: string;\n placeholder?: string;\n description?: string;\n disabled?: boolean;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const TagsInput = forwardRef<HTMLInputElement, TagsInputProps>(function TagsInput(\n {\n label,\n tags: controlledTags,\n defaultTags,\n onTagsChange,\n onReject,\n onDraftChange,\n policy,\n commitKeys = tagsInputRecipe.defaults.commitKeys,\n suggestions,\n suggestionsLabel,\n composeRemoveLabel,\n placeholder,\n description,\n disabled = false,\n className,\n layoutStyle,\n },\n forwardedRef,\n) {\n const [tags, setTags] = useControllableState<readonly string[]>({\n ...(controlledTags === undefined ? {} : { value: controlledTags }),\n defaultValue: defaultTags ?? [],\n ...(onTagsChange === undefined ? {} : { onChange: onTagsChange }),\n });\n const [draft, setDraft] = useState(\"\");\n // Backspace on an empty field selects the last tag first; a second press\n // removes it. Removing on the first press loses work with no warning.\n const [armedIndex, setArmedIndex] = useState<number | null>(null);\n const [activeSuggestionId, setActiveSuggestionId] = useState<string | null>(null);\n const [suggestionsDismissed, setSuggestionsDismissed] = useState(false);\n const hasSuggestions = (suggestions?.length ?? 0) > 0 && draft.trim().length > 0;\n const openSuggestions = hasSuggestions && !suggestionsDismissed;\n const activeSuggestion = suggestions?.find((item) => item.id === activeSuggestionId && !item.disabled) ?? null;\n const inputRef = useRef<HTMLInputElement>(null);\n const id = `hjm-tags-${useId().replaceAll(\":\", \"\")}`;\n\n const changeDraft = (next: string) => {\n setDraft(next);\n setSuggestionsDismissed(false);\n onDraftChange?.(next);\n };\n const commit = (value: string) => {\n if (disabled) return;\n const result = resolveTagsInputCommit(tags, value, policy ?? {});\n if (!result.accepted) { onReject?.(result); return; }\n setTags([...tags, result.value]);\n setDraft(\"\");\n onDraftChange?.(\"\");\n setArmedIndex(null);\n setActiveSuggestionId(null);\n };\n const remove = (index: number) => {\n setTags(removeTagAt(tags, index));\n setArmedIndex(null);\n inputRef.current?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n // IME confirmation keys belong to the composition, not tag submission.\n if (disabled || event.nativeEvent.isComposing || event.keyCode === 229) return;\n const key = event.key;\n if (hasSuggestions && (key === \"ArrowDown\" || key === \"ArrowUp\")) {\n event.preventDefault();\n setSuggestionsDismissed(false);\n setActiveSuggestionId(resolveTagsInputActiveSuggestion(\n suggestions ?? [],\n activeSuggestionId,\n key === \"ArrowDown\" ? \"next\" : \"previous\",\n ));\n return;\n }\n if (key === \"Escape\" && openSuggestions) {\n // Dismissing the candidate list must not clear what the user typed.\n event.preventDefault();\n setSuggestionsDismissed(true);\n setActiveSuggestionId(null);\n return;\n }\n const isCommitKey =\n (key === \"Enter\" && commitKeys.includes(\"Enter\")) ||\n (key === \",\" && commitKeys.includes(\"Comma\")) ||\n (key === \" \" && commitKeys.includes(\"Space\"));\n if (isCommitKey) {\n event.preventDefault();\n // A highlighted candidate wins over the raw text; otherwise the typed\n // value commits, which is what makes this different from a Select.\n commit(activeSuggestion ? activeSuggestion.value ?? activeSuggestion.label : draft);\n return;\n }\n if (key !== \"Backspace\" || draft.length > 0 || tags.length === 0) {\n if (key !== \"Backspace\") setArmedIndex(null);\n return;\n }\n event.preventDefault();\n const last = tags.length - 1;\n if (armedIndex === last || tagsInputBehaviorDefaults.backspaceRemovesLastTag) remove(last);\n else setArmedIndex(last);\n };\n\n return (\n <div style={layoutStyle} className={classNames(\"hjm-tags-input\", className)} data-disabled={disabled || undefined}>\n <label className=\"hjm-tags-input__label\" htmlFor={id}>{label}</label>\n <div\n className=\"hjm-tags-input__frame\"\n style={{\n \"--hjm-tags-min-height\": `${tagsInputRecipe.frame.minHeight}px`,\n \"--hjm-tags-gap\": `${tagsInputRecipe.frame.gap}px`,\n \"--hjm-tags-tag-min-height\": `${tagsInputRecipe.tag.minHeight}px`,\n \"--hjm-tags-remove-target\": `${tagsInputRecipe.remove.minTouchTarget}px`,\n } as CSSProperties}\n onClick={() => inputRef.current?.focus()}\n >\n <ul className=\"hjm-tags-input__list\">\n {tags.map((tag, index) => (\n <li key={`${tag}-${index}`} className=\"hjm-tags-input__tag\" data-armed={armedIndex === index || undefined}>\n <span>{tag}</span>\n <button\n type=\"button\"\n aria-label={composeRemoveLabel(tag)}\n className=\"hjm-tags-input__remove\"\n disabled={disabled}\n onClick={() => remove(index)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n <input\n ref={composeRefs(inputRef, forwardedRef)}\n id={id}\n type=\"text\"\n className=\"hjm-tags-input__input\"\n value={draft}\n placeholder={placeholder}\n disabled={disabled}\n aria-describedby={description ? `${id}-description` : undefined}\n role={suggestions ? \"combobox\" : undefined}\n aria-expanded={suggestions ? openSuggestions : undefined}\n aria-controls={suggestions && openSuggestions ? `${id}-suggestions` : undefined}\n aria-activedescendant={openSuggestions && activeSuggestion ? `${id}-suggestion-${activeSuggestion.id}` : undefined}\n aria-autocomplete={suggestions ? \"list\" : undefined}\n onChange={(event) => { changeDraft(event.target.value); setArmedIndex(null); setActiveSuggestionId(null); }}\n onKeyDown={onKeyDown}\n onBlur={() => { if (commitKeys.includes(\"Blur\")) commit(draft); setArmedIndex(null); }}\n />\n </div>\n {openSuggestions ? (\n <ul id={`${id}-suggestions`} role=\"listbox\" aria-label={suggestionsLabel} className=\"hjm-tags-input__suggestions\">\n {(suggestions ?? []).map((item) => (\n <li\n key={item.id}\n id={`${id}-suggestion-${item.id}`}\n role=\"option\"\n aria-selected={item.id === activeSuggestionId}\n aria-disabled={item.disabled || undefined}\n className=\"hjm-tags-input__suggestion\"\n onMouseDown={(event) => {\n // Commit before blur so the draft is still there to replace.\n event.preventDefault();\n if (!disabled && !item.disabled) commit(item.value ?? item.label);\n }}\n onMouseEnter={() => { if (!item.disabled) setActiveSuggestionId(item.id); }}\n >\n {item.label}\n </li>\n ))}\n </ul>\n ) : null}\n {description ? <p id={`${id}-description`} className=\"hjm-tags-input__description\">{description}</p> : null}\n </div>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tags-input.js","sourceRoot":"","sources":["../src/tags-input.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport {\n removeTagAt,\n resolveTagsInputActiveSuggestion,\n resolveTagsInputCommit,\n tagsInputBehaviorDefaults,\n tagsInputRecipe,\n type TagsInputCommitKey,\n type TagsInputCommitResult,\n type TagsInputPolicy,\n type TagsInputSuggestion,\n} from \"@hjmds/design-contracts/components/tags-input\";\nimport {\n forwardRef,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n} from \"react\";\nimport { classNames, composeRefs, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type TagsInputProps = Readonly<{\n label: string;\n tags?: readonly string[];\n defaultTags?: readonly string[];\n onTagsChange?: (tags: readonly string[]) => void;\n /** Fires when a value could not be committed, with the contract's reason. */\n onReject?: (result: TagsInputCommitResult) => void;\n /**\n * The text being typed. A product filtering `suggestions` cannot do it\n * without this — the draft lives here, not in the product's state.\n */\n onDraftChange?: (draft: string) => void;\n policy?: TagsInputPolicy;\n commitKeys?: readonly TagsInputCommitKey[];\n /** Composes one tag's remove-control name from the tag text. */\n composeRemoveLabel: (tag: string) => string;\n /**\n * Candidates for the current draft, already filtered by the product. Present\n * them and the field becomes the multi-select combobox case without a second\n * value shape.\n */\n suggestions?: readonly TagsInputSuggestion[];\n /** Localized accessible name for the candidate list. */\n suggestionsLabel?: string;\n placeholder?: string;\n description?: string;\n disabled?: boolean;\n className?: string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nexport const TagsInput = forwardRef<HTMLInputElement, TagsInputProps>(function TagsInput(\n {\n label,\n tags: controlledTags,\n defaultTags,\n onTagsChange,\n onReject,\n onDraftChange,\n policy,\n commitKeys = tagsInputRecipe.defaults.commitKeys,\n suggestions,\n suggestionsLabel,\n composeRemoveLabel,\n placeholder,\n description,\n disabled = false,\n className,\n layoutStyle,\n },\n forwardedRef,\n) {\n const [tags, setTags] = useControllableState<readonly string[]>({\n ...(controlledTags === undefined ? {} : { value: controlledTags }),\n defaultValue: defaultTags ?? [],\n ...(onTagsChange === undefined ? {} : { onChange: onTagsChange }),\n });\n const [draft, setDraft] = useState(\"\");\n // Backspace on an empty field selects the last tag first; a second press\n // removes it. Removing on the first press loses work with no warning.\n const [armedIndex, setArmedIndex] = useState<number | null>(null);\n const [activeSuggestionId, setActiveSuggestionId] = useState<string | null>(null);\n const [suggestionsDismissed, setSuggestionsDismissed] = useState(false);\n const hasSuggestions = (suggestions?.length ?? 0) > 0 && draft.trim().length > 0;\n const openSuggestions = hasSuggestions && !suggestionsDismissed;\n const activeSuggestion = suggestions?.find((item) => item.id === activeSuggestionId && !item.disabled) ?? null;\n const inputRef = useRef<HTMLInputElement>(null);\n const id = `hjm-tags-${useId().replaceAll(\":\", \"\")}`;\n\n const changeDraft = (next: string) => {\n setDraft(next);\n setSuggestionsDismissed(false);\n onDraftChange?.(next);\n };\n const commit = (value: string) => {\n if (disabled) return;\n const result = resolveTagsInputCommit(tags, value, policy ?? {});\n if (!result.accepted) { onReject?.(result); return; }\n setTags([...tags, result.value]);\n setDraft(\"\");\n onDraftChange?.(\"\");\n setArmedIndex(null);\n setActiveSuggestionId(null);\n };\n const remove = (index: number) => {\n setTags(removeTagAt(tags, index));\n setArmedIndex(null);\n inputRef.current?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n // IME confirmation keys belong to the composition, not tag submission.\n if (disabled || event.nativeEvent.isComposing || event.keyCode === 229) return;\n const key = event.key;\n if (hasSuggestions && (key === \"ArrowDown\" || key === \"ArrowUp\")) {\n event.preventDefault();\n setSuggestionsDismissed(false);\n setActiveSuggestionId(resolveTagsInputActiveSuggestion(\n suggestions ?? [],\n activeSuggestionId,\n key === \"ArrowDown\" ? \"next\" : \"previous\",\n ));\n return;\n }\n if (key === \"Escape\" && openSuggestions) {\n // Dismissing the candidate list must not clear what the user typed.\n event.preventDefault();\n setSuggestionsDismissed(true);\n setActiveSuggestionId(null);\n return;\n }\n const isCommitKey =\n (key === \"Enter\" && commitKeys.includes(\"Enter\")) ||\n (key === \",\" && commitKeys.includes(\"Comma\")) ||\n (key === \" \" && commitKeys.includes(\"Space\"));\n if (isCommitKey) {\n event.preventDefault();\n // A highlighted candidate wins over the raw text; otherwise the typed\n // value commits, which is what makes this different from a Select.\n commit(activeSuggestion ? activeSuggestion.value ?? activeSuggestion.label : draft);\n return;\n }\n if (key !== \"Backspace\" || draft.length > 0 || tags.length === 0) {\n if (key !== \"Backspace\") setArmedIndex(null);\n return;\n }\n event.preventDefault();\n const last = tags.length - 1;\n if (armedIndex === last || tagsInputBehaviorDefaults.backspaceRemovesLastTag) remove(last);\n else setArmedIndex(last);\n };\n\n return (\n <div style={layoutStyle} className={classNames(\"hjm-tags-input\", className)} data-disabled={disabled || undefined}>\n <label className=\"hjm-tags-input__label\" htmlFor={id}>{label}</label>\n <div\n className=\"hjm-tags-input__frame\"\n style={{\n \"--hjm-tags-min-height\": `${tagsInputRecipe.frame.minHeight}px`,\n \"--hjm-tags-gap\": `${tagsInputRecipe.frame.gap}px`,\n \"--hjm-tags-tag-min-height\": `${tagsInputRecipe.tag.minHeight}px`,\n \"--hjm-tags-remove-target\": `${tagsInputRecipe.remove.minTouchTarget}px`,\n } as CSSProperties}\n onClick={() => inputRef.current?.focus()}\n >\n <ul className=\"hjm-tags-input__list\">\n {tags.map((tag, index) => (\n <li key={`${tag}-${index}`} className=\"hjm-tags-input__tag\" data-armed={armedIndex === index || undefined}>\n <span>{tag}</span>\n <button\n type=\"button\"\n aria-label={composeRemoveLabel(tag)}\n className=\"hjm-tags-input__remove\"\n disabled={disabled}\n onClick={() => remove(index)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n <input\n ref={composeRefs(inputRef, forwardedRef)}\n id={id}\n type=\"text\"\n className=\"hjm-tags-input__input\"\n value={draft}\n placeholder={placeholder}\n disabled={disabled}\n aria-describedby={description ? `${id}-description` : undefined}\n role={suggestions ? \"combobox\" : undefined}\n aria-expanded={suggestions ? openSuggestions : undefined}\n aria-controls={suggestions && openSuggestions ? `${id}-suggestions` : undefined}\n aria-activedescendant={openSuggestions && activeSuggestion ? `${id}-suggestion-${activeSuggestion.id}` : undefined}\n aria-autocomplete={suggestions ? \"list\" : undefined}\n onChange={(event) => { changeDraft(event.target.value); setArmedIndex(null); setActiveSuggestionId(null); }}\n onKeyDown={onKeyDown}\n onBlur={() => { if (commitKeys.includes(\"Blur\")) commit(draft); setArmedIndex(null); }}\n />\n </div>\n {openSuggestions ? (\n <ul id={`${id}-suggestions`} role=\"listbox\" aria-label={suggestionsLabel} className=\"hjm-tags-input__suggestions\">\n {(suggestions ?? []).map((item) => (\n <li\n key={item.id}\n id={`${id}-suggestion-${item.id}`}\n role=\"option\"\n aria-selected={item.id === activeSuggestionId}\n aria-disabled={item.disabled || undefined}\n className=\"hjm-tags-input__suggestion\"\n onMouseDown={(event) => {\n // Commit before blur so the draft is still there to replace.\n event.preventDefault();\n if (!disabled && !item.disabled) commit(item.value ?? item.label);\n }}\n onMouseEnter={() => { if (!item.disabled) setActiveSuggestionId(item.id); }}\n >\n {item.label}\n </li>\n ))}\n </ul>\n ) : null}\n {description ? <p id={`${id}-description`} className=\"hjm-tags-input__description\">{description}</p> : null}\n </div>\n );\n});\n"]}
|
package/dist/task-list.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../src/task-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../src/task-list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAI,EAAC,SAAS,EAAC,MAAI,OAAO,CAAC;AAClC,OAAM,EAAe,KAAK,QAAQ,EAAC,MAAI,mCAAmC,CAAC;AAE3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,aAAa,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,SAAS,QAAQ,EAAE,CAAC;IAAA,iBAAiB,EAAC,CAAC,EAAE,EAAC,MAAM,EAAC,SAAS,EAAC,OAAO,KAAG,IAAI,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IAAA,YAAY,CAAC,EAAC,SAAS,CAAC;IAC1K,yFAAyF;IACzF,gBAAgB,CAAC,EAAC,OAAO,GAAC,MAAM,CAAC;IACjC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,IAAI,EAAC,QAAQ,CAAC;QAAA,QAAQ,EAAC,OAAO,CAAA;KAAC,CAAC,KAAG,SAAS,CAAC;IAClF,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,KAAK,EAAC,SAAS,QAAQ,EAAE,CAAC;QAAA,UAAU,EAAC,CAAC,IAAI,EAAC,QAAQ,KAAG,SAAS,CAAA;KAAC,CAAC,KAAG,SAAS,CAAC;IACnH,kIAAkI;IAClI,WAAW,CAAC,EAAC,uBAAuB,CAAA;CAAC,CAAC,CAAC;AACxC,iHAAiH;AACjH,wBAAgB,QAAQ,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,iBAAiB,EAAC,QAAc,EAAC,YAAY,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,WAAW,EAAC,EAAC,aAAa,+BAQhK"}
|
package/dist/task-list.js
CHANGED
package/dist/task-list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-list.js","sourceRoot":"","sources":["../src/task-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-list.js","sourceRoot":"","sources":["../src/task-list.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAM,EAAC,aAAa,EAAe,MAAI,mCAAmC,CAAC;AAC3E,OAAM,EAAC,QAAQ,EAAC,MAAI,gBAAgB,CAAC;AAAA,OAAM,EAAC,IAAI,EAAC,MAAI,uBAAuB,CAAC;AAU7E,iHAAiH;AACjH,MAAM,UAAU,QAAQ,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,iBAAiB,EAAC,QAAQ,GAAC,KAAK,EAAC,YAAY,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,WAAW,EAAe;IAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAAA,IAAG,CAAC,KAAK,CAAC,IAAI,EAAE;QAAC,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAChQ,MAAM,UAAU,GAAC,CAAC,IAAa,EAAC,EAAE;QAAC,MAAM,OAAO,GAAC,KAAC,QAAQ,OAAK,CAAC,gBAAgB,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,YAAY,EAAC,gBAAgB,EAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAE,IAAI,CAAC,QAAQ,KAAG,IAAI,EAAE,eAAe,EAAE,SAAS,CAAA,EAAE,CAAA,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAC,SAAS,CAAC,KAAM,CAAC,IAAI,CAAC,WAAW,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,IAAI,CAAC,WAAW,EAAC,CAAC,GAAG,CAAC;QAAA,MAAM,MAAM,GAAC,gBAAgB,EAAE,CAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,IAAE,IAAI,CAAC,QAAQ,KAAG,IAAI,EAAC,CAAC,CAAC;QAClb,qHAAqH;QACrH,iHAAiH;QACjH,OAAO,eAAK,KAAK,EAAE,EAAC,OAAO,EAAC,MAAM,EAAC,mBAAmB,EAAC,MAAM,IAAE,IAAI,CAAA,CAAC,CAAA,gBAAgB,CAAA,CAAC,CAAA,qBAAqB,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,aAAG,OAAO,EAAE,MAAM,IAAO,CAAC;IAAA,CAAC,CAAC;IACrL,IAAG,KAAK,CAAC,MAAM,KAAG,CAAC;QAAC,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAM,CAAC,WAAW,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,CAAC,YAAG,YAAY,GAAQ,CAAC;IACrH,IAAG,gBAAgB;QAAC,OAAO,4BAAG,gBAAgB,CAAC,EAAC,KAAK,EAAC,UAAU,EAAC,CAAC,GAAI,CAAC;IACvE,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAC,SAAS,KAAK,CAAC,WAAW,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,CAAC,YAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,cAAmB,KAAK,EAAE,EAAC,OAAO,EAAC,qBAAqB,EAAC,YAAG,UAAU,CAAC,IAAI,CAAC,IAAlE,IAAI,CAAC,EAAE,CAAkE,CAAC,GAAQ,CAAC;AAC/M,CAAC","sourcesContent":["\"use client\";\n\nimport type{ReactNode}from'react';\nimport{validateTasks,type TaskItem}from'@hjmds/design-contracts/task-list';\nimport{Checkbox}from'./selection.js';import{List}from'./advanced-display.js';\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type TaskListProps=Readonly<{label:string;items:readonly TaskItem[];onCompletedChange:(id:string,completed:boolean)=>void;disabled?:boolean;emptyContent?:ReactNode;\n /** Use plain rows inside an enclosing surface; omission retains the Checkbox default. */\n itemPresentation?:\"plain\"|\"card\";\n /** Independent row action beside the checkbox; apply disabled to the supplied control. */\n renderItemAction?:(context:Readonly<{item:TaskItem;disabled:boolean}>)=>ReactNode;\n renderCollection?:(context:Readonly<{items:readonly TaskItem[];renderItem:(item:TaskItem)=>ReactNode}>)=>ReactNode;\n /** Canonical layout-only placement on the List root. With `renderCollection` the product owns the root, so place that instead. */\n layoutStyle?:HjmCompositionStyleProp}>;\n/** Canonical Checkbox/List own semantics; optional collection composition keeps drag peers out of this entry. */\nexport function TaskList({label,items,onCompletedChange,disabled=false,emptyContent,itemPresentation,renderItemAction,renderCollection,layoutStyle}:TaskListProps){validateTasks(items);if(!label.trim())throw new TypeError('TaskList needs a localized label');\n const renderItem=(item:TaskItem)=>{const control=<Checkbox {...(itemPresentation===undefined?{}:{presentation:itemPresentation})} label={item.label} checked={item.completed} disabled={disabled||item.disabled===true} onCheckedChange={completed=>onCompletedChange(item.id,completed)} {...(item.description===undefined?{}:{description:item.description})}/>;const action=renderItemAction?.({item,disabled:disabled||item.disabled===true});\n // The action sits beside Checkbox, never inside its label (pressing it must not toggle completion); long labels wrap\n // inside the checkbox column. A separate action line made each task two to three lines tall (2026-10-17 review).\n return <div style={{display:\"grid\",gridTemplateColumns:action==null?\"minmax(0, 1fr)\":\"minmax(0, 1fr) auto\",alignItems:\"center\",gap:\"var(--hjm-space-sm)\"}}>{control}{action}</div>;};\n if(items.length===0)return <List label={label} {...(layoutStyle===undefined?{}:{layoutStyle})}>{emptyContent}</List>;\n if(renderCollection)return <>{renderCollection({items,renderItem})}</>;\n return <List label={label} appearance=\"grouped\" {...(layoutStyle===undefined?{}:{layoutStyle})}>{items.map(item=><div key={item.id} style={{padding:\"var(--hjm-space-md)\"}}>{renderItem(item)}</div>)}</List>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-annotation.d.ts","sourceRoot":"","sources":["../src/text-annotation.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-annotation.d.ts","sourceRoot":"","sources":["../src/text-annotation.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA+D,KAAK,oBAAoB,EAA2B,MAAM,yCAAyC,CAAC;AAI1K;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,CAAC,CAAC;AAEH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAoB,EAAE,EAAE,mBAAmB,+BAmGrF"}
|
package/dist/text-annotation.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-annotation.js","sourceRoot":"","sources":["../src/text-annotation.tsx"],"names":[],"mappings":"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","sourcesContent":["import { motion } from '@hjmds/design-contracts/foundations';\nimport { mergeTextAnnotationFragments, resolveTextAnnotationGeometry, type TextAnnotationAction, type TextAnnotationRect } from '@hjmds/design-contracts/text-annotation';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { useHjmTheme } from './provider.js';\n\n/** Internal renderer while Native range measurement and the public API are\n * being developed. Kept out of package exports until both paths are reviewable.\n */\nexport type TextAnnotationProps = Readonly<{\n children: string;\n action?: TextAnnotationAction;\n}>;\n\nexport function TextAnnotation({ children, action = 'highlight' }: TextAnnotationProps) {\n const { environment } = useHjmTheme();\n const textRef = useRef<HTMLSpanElement>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const played = useRef<string | null>(null);\n const measured = useRef('');\n const [measurement, setMeasurement] = useState<{ content: string; lines: readonly TextAnnotationRect[] }>({ content: children, lines: [] });\n // A new string must not briefly receive paths measured for the old string.\n const lines = measurement.content === children ? measurement.lines : [];\n const geometry = resolveTextAnnotationGeometry(lines, action);\n const key = `${action}:${children}`;\n\n useLayoutEffect(() => {\n const text = textRef.current, anchor = anchorRef.current;\n if (!text || !anchor) return;\n let frame = 0, alive = true;\n const measure = () => {\n frame = 0;\n if (!alive) return;\n const origin = anchor.getBoundingClientRect();\n const range = document.createRange();\n range.selectNodeContents(text);\n // Range rectangles are actual shaped fragments, including mixed-direction\n // runs. An inline-block or character-width estimate changes line wrapping.\n const fragments = Array.from(range.getClientRects()).filter(rect => rect.width > 0 && rect.height > 0);\n const bands: { top: number; height: number }[] = [];\n const next = mergeTextAnnotationFragments(fragments.map(rect => {\n // Chromium splits a mixed Arabic/English line into adjacent bidi runs.\n // Separate outlines create interior seams (QA highlighter §11). Merge\n // only measured matching vertical bands; guessing by character order or\n // overlap alone could merge distinct lines with a tight line-height.\n let lineIndex = bands.findIndex(band => Math.abs(band.top - rect.top) < 0.01 && Math.abs(band.height - rect.height) < 0.01);\n if (lineIndex < 0) { lineIndex = bands.length; bands.push({ top: rect.top, height: rect.height }); }\n return { x: rect.left - origin.left, y: rect.top - origin.top, width: rect.width, height: rect.height, lineIndex };\n }));\n const signature = JSON.stringify([children, next]);\n if (measured.current !== signature) {\n measured.current = signature;\n setMeasurement({ content: children, lines: next });\n }\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(measure); };\n measure();\n const observer = new ResizeObserver(schedule);\n const mutation = new MutationObserver(records => {\n if (records.some(record => !anchor.contains(record.target))) schedule();\n });\n // Inline fragments themselves may not emit ResizeObserver notifications.\n // Observe ancestors too: a preceding sibling can move the first fragment\n // without changing its text or font.\n for (let element: Element | null = text; element; element = element.parentElement) {\n observer.observe(element);\n mutation.observe(element, { attributes: true, attributeFilter: ['style', 'class', 'dir'] });\n }\n const paragraph = text.closest('p, h1, h2, h3, h4, h5, h6, li') ?? text.parentElement?.parentElement;\n // Ignore our SVG's mutations; measuring it would create an observer loop.\n if (paragraph) mutation.observe(paragraph, { childList: true, characterData: true, subtree: true, attributes: true, attributeFilter: ['style', 'class', 'dir'] });\n document.fonts.addEventListener('loadingdone', schedule);\n void document.fonts.ready.then(() => { if (alive) schedule(); });\n window.addEventListener('resize', schedule);\n return () => { alive = false; cancelAnimationFrame(frame); observer.disconnect(); mutation.disconnect(); document.fonts.removeEventListener('loadingdone', schedule); window.removeEventListener('resize', schedule); };\n }, [children, environment.textScale, environment.direction]);\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg || !geometry.paths.length || played.current === key) return;\n played.current = key;\n // Geometry updates are not new content. Do not replay entry motion on every\n // ResizeObserver delivery, unlike the upstream hide/show-on-body-resize path.\n if (environment.reducedMotion || document.hidden) return;\n const animations: Animation[] = [];\n for (const path of svg.querySelectorAll('path')) {\n if (action === 'highlight') {\n const start = environment.direction === 'rtl' ? 'inset(0 0 0 100%)' : 'inset(0 100% 0 0)';\n animations.push(path.animate([{ clipPath: start }, { clipPath: 'inset(0 0 0 0)' }], { duration: motion.slow, easing: 'ease-out' }));\n } else {\n const length = path.getTotalLength();\n animations.push(path.animate([{ strokeDasharray: `${length}`, strokeDashoffset: length }, { strokeDasharray: `${length}`, strokeDashoffset: 0 }], { duration: motion.slow, easing: 'ease-out' }));\n }\n }\n const stop = () => { for (const animation of animations) animation.cancel(); };\n const visibility = () => { if (document.hidden) stop(); };\n document.addEventListener('visibilitychange', visibility);\n return () => { stop(); document.removeEventListener('visibilitychange', visibility); };\n }, [key, lines, action, environment.reducedMotion, environment.direction, geometry.paths.length]);\n\n const bounds = geometry.bounds;\n return <span data-hjm-text-annotation={action} style={{ display: 'inline', position: 'relative', isolation: 'isolate' }}>\n <span ref={anchorRef} aria-hidden=\"true\" style={{ position: 'absolute', left: 0, top: 0, width: 0, height: 0, pointerEvents: 'none' }}>\n {bounds ? <svg ref={svgRef} aria-hidden=\"true\" focusable=\"false\" width={bounds.width} height={bounds.height} viewBox={`${bounds.x} ${bounds.y} ${bounds.width} ${bounds.height}`} style={{ position: 'absolute', left: bounds.x, top: bounds.y, overflow: 'visible', pointerEvents: 'none' }}>\n {/* Marker ink stays behind unchanged foreground text. The experimental\n 20% wash avoids replacing its semantic foreground with a brand color;\n product-palette contrast still needs validation before promotion. */}\n {geometry.paths.map((path, index) => <path key={index} d={path.d} data-line={path.lineIndex} fill={path.paint === 'fill' ? 'var(--hjm-color-primary)' : 'none'} fillOpacity={path.paint === 'fill' ? 0.2 : 1} stroke={path.paint === 'stroke' ? 'var(--hjm-color-content-brand)' : 'none'} strokeWidth={path.strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\" />)}\n </svg> : null}\n </span>\n <span ref={textRef} data-hjm-annotation-text=\"\" style={{ position: 'relative' }}>{children}</span>\n </span>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"text-annotation.js","sourceRoot":"","sources":["../src/text-annotation.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { motion } from '@hjmds/design-contracts/foundations';\nimport { mergeTextAnnotationFragments, resolveTextAnnotationGeometry, type TextAnnotationAction, type TextAnnotationRect } from '@hjmds/design-contracts/text-annotation';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { useHjmTheme } from './provider.js';\n\n/** Internal renderer while Native range measurement and the public API are\n * being developed. Kept out of package exports until both paths are reviewable.\n */\nexport type TextAnnotationProps = Readonly<{\n children: string;\n action?: TextAnnotationAction;\n}>;\n\nexport function TextAnnotation({ children, action = 'highlight' }: TextAnnotationProps) {\n const { environment } = useHjmTheme();\n const textRef = useRef<HTMLSpanElement>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const played = useRef<string | null>(null);\n const measured = useRef('');\n const [measurement, setMeasurement] = useState<{ content: string; lines: readonly TextAnnotationRect[] }>({ content: children, lines: [] });\n // A new string must not briefly receive paths measured for the old string.\n const lines = measurement.content === children ? measurement.lines : [];\n const geometry = resolveTextAnnotationGeometry(lines, action);\n const key = `${action}:${children}`;\n\n useLayoutEffect(() => {\n const text = textRef.current, anchor = anchorRef.current;\n if (!text || !anchor) return;\n let frame = 0, alive = true;\n const measure = () => {\n frame = 0;\n if (!alive) return;\n const origin = anchor.getBoundingClientRect();\n const range = document.createRange();\n range.selectNodeContents(text);\n // Range rectangles are actual shaped fragments, including mixed-direction\n // runs. An inline-block or character-width estimate changes line wrapping.\n const fragments = Array.from(range.getClientRects()).filter(rect => rect.width > 0 && rect.height > 0);\n const bands: { top: number; height: number }[] = [];\n const next = mergeTextAnnotationFragments(fragments.map(rect => {\n // Chromium splits a mixed Arabic/English line into adjacent bidi runs.\n // Separate outlines create interior seams (QA highlighter §11). Merge\n // only measured matching vertical bands; guessing by character order or\n // overlap alone could merge distinct lines with a tight line-height.\n let lineIndex = bands.findIndex(band => Math.abs(band.top - rect.top) < 0.01 && Math.abs(band.height - rect.height) < 0.01);\n if (lineIndex < 0) { lineIndex = bands.length; bands.push({ top: rect.top, height: rect.height }); }\n return { x: rect.left - origin.left, y: rect.top - origin.top, width: rect.width, height: rect.height, lineIndex };\n }));\n const signature = JSON.stringify([children, next]);\n if (measured.current !== signature) {\n measured.current = signature;\n setMeasurement({ content: children, lines: next });\n }\n };\n const schedule = () => { if (!frame) frame = requestAnimationFrame(measure); };\n measure();\n const observer = new ResizeObserver(schedule);\n const mutation = new MutationObserver(records => {\n if (records.some(record => !anchor.contains(record.target))) schedule();\n });\n // Inline fragments themselves may not emit ResizeObserver notifications.\n // Observe ancestors too: a preceding sibling can move the first fragment\n // without changing its text or font.\n for (let element: Element | null = text; element; element = element.parentElement) {\n observer.observe(element);\n mutation.observe(element, { attributes: true, attributeFilter: ['style', 'class', 'dir'] });\n }\n const paragraph = text.closest('p, h1, h2, h3, h4, h5, h6, li') ?? text.parentElement?.parentElement;\n // Ignore our SVG's mutations; measuring it would create an observer loop.\n if (paragraph) mutation.observe(paragraph, { childList: true, characterData: true, subtree: true, attributes: true, attributeFilter: ['style', 'class', 'dir'] });\n document.fonts.addEventListener('loadingdone', schedule);\n void document.fonts.ready.then(() => { if (alive) schedule(); });\n window.addEventListener('resize', schedule);\n return () => { alive = false; cancelAnimationFrame(frame); observer.disconnect(); mutation.disconnect(); document.fonts.removeEventListener('loadingdone', schedule); window.removeEventListener('resize', schedule); };\n }, [children, environment.textScale, environment.direction]);\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg || !geometry.paths.length || played.current === key) return;\n played.current = key;\n // Geometry updates are not new content. Do not replay entry motion on every\n // ResizeObserver delivery, unlike the upstream hide/show-on-body-resize path.\n if (environment.reducedMotion || document.hidden) return;\n const animations: Animation[] = [];\n for (const path of svg.querySelectorAll('path')) {\n if (action === 'highlight') {\n const start = environment.direction === 'rtl' ? 'inset(0 0 0 100%)' : 'inset(0 100% 0 0)';\n animations.push(path.animate([{ clipPath: start }, { clipPath: 'inset(0 0 0 0)' }], { duration: motion.slow, easing: 'ease-out' }));\n } else {\n const length = path.getTotalLength();\n animations.push(path.animate([{ strokeDasharray: `${length}`, strokeDashoffset: length }, { strokeDasharray: `${length}`, strokeDashoffset: 0 }], { duration: motion.slow, easing: 'ease-out' }));\n }\n }\n const stop = () => { for (const animation of animations) animation.cancel(); };\n const visibility = () => { if (document.hidden) stop(); };\n document.addEventListener('visibilitychange', visibility);\n return () => { stop(); document.removeEventListener('visibilitychange', visibility); };\n }, [key, lines, action, environment.reducedMotion, environment.direction, geometry.paths.length]);\n\n const bounds = geometry.bounds;\n return <span data-hjm-text-annotation={action} style={{ display: 'inline', position: 'relative', isolation: 'isolate' }}>\n <span ref={anchorRef} aria-hidden=\"true\" style={{ position: 'absolute', left: 0, top: 0, width: 0, height: 0, pointerEvents: 'none' }}>\n {bounds ? <svg ref={svgRef} aria-hidden=\"true\" focusable=\"false\" width={bounds.width} height={bounds.height} viewBox={`${bounds.x} ${bounds.y} ${bounds.width} ${bounds.height}`} style={{ position: 'absolute', left: bounds.x, top: bounds.y, overflow: 'visible', pointerEvents: 'none' }}>\n {/* Marker ink stays behind unchanged foreground text. The experimental\n 20% wash avoids replacing its semantic foreground with a brand color;\n product-palette contrast still needs validation before promotion. */}\n {geometry.paths.map((path, index) => <path key={index} d={path.d} data-line={path.lineIndex} fill={path.paint === 'fill' ? 'var(--hjm-color-primary)' : 'none'} fillOpacity={path.paint === 'fill' ? 0.2 : 1} stroke={path.paint === 'stroke' ? 'var(--hjm-color-content-brand)' : 'none'} strokeWidth={path.strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\" />)}\n </svg> : null}\n </span>\n <span ref={textRef} data-hjm-annotation-text=\"\" style={{ position: 'relative' }}>{children}</span>\n </span>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-formats.d.ts","sourceRoot":"","sources":["../src/text-formats.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-formats.d.ts","sourceRoot":"","sources":["../src/text-formats.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAA6B,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC,GACvD,QAAQ,CAAC;IACP,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAQL;;;;GAIG;AACH,eAAO,MAAM,UAAU;UAjBb,cAAc;cACV,SAAS;IACnB,gGAAgG;kBAClF,uBAAuB;gDAgCvC,CAAC"}
|
package/dist/text-formats.js
CHANGED
package/dist/text-formats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-formats.js","sourceRoot":"","sources":["../src/text-formats.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-formats.js","sourceRoot":"","sources":["../src/text-formats.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAuC,MAAM,OAAO,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAW3C,MAAM,UAAU,GAA6C;IAC3D,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,YAAY;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAA+B,SAAS,UAAU,CACpF,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EACpD,YAAY;IAEZ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAAC,gCAAgC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,aAAa,CAClB,UAAU,CAAC,IAAI,CAAC,EAChB;QACE,GAAG,KAAK;QACR,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,WAAW,EAAE;QACzC,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC;QACnD,WAAW,EAAE,IAAI;KAClB,EACD,QAAQ,CACT,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["\"use client\";\n\nimport type { TextFormatKind } from \"@hjmds/design-contracts/components/text-formats\";\nimport { createElement, forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type TextFormatProps = HTMLAttributes<HTMLElement> &\n Readonly<{\n kind: TextFormatKind;\n children: ReactNode;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nconst elementFor: Readonly<Record<TextFormatKind, string>> = {\n kbd: \"kbd\",\n code: \"code\",\n quote: \"blockquote\",\n};\n\n/**\n * Each kind emits its own element, which is the entire point: `<kbd>`, `<code>`\n * and `<blockquote>` mean different things to assistive technology, and a\n * styled `<span>` means none of them.\n */\nexport const TextFormat = forwardRef<HTMLElement, TextFormatProps>(function TextFormat(\n { kind, children, className, layoutStyle, ...props },\n forwardedRef,\n) {\n if (!Object.prototype.hasOwnProperty.call(elementFor, kind)) {\n throw new TypeError(`Unsupported TextFormat kind: ${String(kind)}`);\n }\n return createElement(\n elementFor[kind],\n {\n ...props,\n style: { ...props.style, ...layoutStyle },\n ref: forwardedRef,\n className: classNames(\"hjm-text-format\", className),\n \"data-kind\": kind,\n },\n children,\n );\n});\n"]}
|
package/dist/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2DAA2D,CAAC;AAuBnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,aAAa,GACvC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAmB7C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,yBAAyB,GAC/B,aAAa,CA2Pf"}
|
package/dist/theme.js
CHANGED
|
@@ -4,7 +4,7 @@ import { resolveColorReference } from "@hjmds/design-contracts/color-references"
|
|
|
4
4
|
import { focusIndicatorContract } from "@hjmds/design-contracts/contracts";
|
|
5
5
|
import { visibleControlHeight, } from "@hjmds/design-contracts/components/design-system-provider";
|
|
6
6
|
import { buttonRecipe, fieldRecipe, resolveButtonEdgeOverhang } from "@hjmds/design-contracts/recipes/base";
|
|
7
|
-
import { bottomNavigationRecipe, iconButtonRecipe, resolveIconButtonEdgeOverhang, comboboxRecipe, dialogRecipe, listRecipe, listRowRecipe, menuRecipe, searchFieldRecipe, selectRecipe, sheetRecipe, skeletonRecipe, tooltipRecipe, switchRecipe, toastRecipe, textRecipe, } from "@hjmds/design-contracts/recipes";
|
|
7
|
+
import { bottomNavigationRecipe, iconButtonRecipe, resolveIconButtonBadgeOffset, resolveIconButtonEdgeOverhang, comboboxRecipe, dialogRecipe, listRecipe, listRowRecipe, choiceRowRecipe, dividerRecipe, menuRecipe, searchFieldRecipe, selectRecipe, sheetRecipe, skeletonRecipe, tooltipRecipe, switchRecipe, toastRecipe, textRecipe, } from "@hjmds/design-contracts/recipes";
|
|
8
8
|
function kebab(value) {
|
|
9
9
|
return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
|
|
10
10
|
}
|
|
@@ -76,6 +76,13 @@ export function createHjmThemeStyle(value) {
|
|
|
76
76
|
// does not carry a second copy of the same numbers.
|
|
77
77
|
style["--hjm-list-row-gap"] = rem(listRowRecipe.gap);
|
|
78
78
|
style["--hjm-list-row-leading-size"] = rem(listRowRecipe.leadingSize);
|
|
79
|
+
// Trailing value → disclosure chevron spacing (listRowRecipe.accessories), tighter than the row gap as on iOS.
|
|
80
|
+
style["--hjm-list-row-accessory-gap"] = rem(listRowRecipe.accessories.disclosure.gap);
|
|
81
|
+
// ChoiceRow sheet item pictures share the row leading box (choiceRowRecipe.itemLeading).
|
|
82
|
+
style["--hjm-choice-row-item-leading-size"] = rem(choiceRowRecipe.itemLeading.size);
|
|
83
|
+
// Dashed Divider rhythm (dividerRecipe.lineStyles.dashed) so the stylesheet keeps no copy of the numbers.
|
|
84
|
+
style["--hjm-divider-dash"] = rem(dividerRecipe.lineStyles.dashed.dash);
|
|
85
|
+
style["--hjm-divider-gap"] = rem(dividerRecipe.lineStyles.dashed.gap);
|
|
79
86
|
// Row text sits on the container content edge; the surface bleeds by this much (2026-10-17 user decision).
|
|
80
87
|
style["--hjm-list-row-surface-bleed"] = rem(listRowRecipe.surfaceBleed);
|
|
81
88
|
style["--hjm-list-grouped-padding-inline"] = rem(listRecipe.grouped.paddingInline);
|
|
@@ -247,6 +254,10 @@ export function createHjmThemeStyle(value) {
|
|
|
247
254
|
for (const size of Object.keys(iconButtonRecipe.sizes)) {
|
|
248
255
|
const visible = visibleControlHeight(iconButtonRecipe.sizes[size].diameter, environment.minimumVisualTarget);
|
|
249
256
|
style[`--hjm-icon-button-edge-${size}`] = `${resolveIconButtonEdgeOverhang("ghost", size, visible)}px`;
|
|
257
|
+
// Count badge (NotificationBell): offset from the button's top-end corner, tracking the same visible diameter.
|
|
258
|
+
const badge = resolveIconButtonBadgeOffset(size, visible);
|
|
259
|
+
style[`--hjm-icon-button-badge-block-start-${size}`] = `${badge.blockStart}px`;
|
|
260
|
+
style[`--hjm-icon-button-badge-inline-end-${size}`] = `${badge.inlineEnd}px`;
|
|
250
261
|
}
|
|
251
262
|
for (const size of Object.keys(buttonRecipe.sizes)) {
|
|
252
263
|
style[`--hjm-button-edge-${size}`] = `${resolveButtonEdgeOverhang("ghost", size)}px`;
|