@gntik-ai/blocks 0.0.0-stage → 0.5.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/dist/index.d.ts +3494 -0
- package/dist/index.js +14911 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -3
- package/src/ai/AssistantCardGrid/AssistantCardGrid.test.tsx +32 -0
- package/src/ai/AssistantCardGrid/AssistantCardGrid.tsx +98 -0
- package/src/ai/AssistantCardGrid/block.meta.ts +10 -0
- package/src/ai/AssistantCardGrid/fixtures.ts +72 -0
- package/src/ai/EvaluationScorecard/EvaluationScorecard.test.tsx +39 -0
- package/src/ai/EvaluationScorecard/EvaluationScorecard.tsx +233 -0
- package/src/ai/EvaluationScorecard/block.meta.ts +10 -0
- package/src/ai/EvaluationScorecard/fixtures.ts +79 -0
- package/src/ai/ModelKeysList/ModelKeysList.test.tsx +44 -0
- package/src/ai/ModelKeysList/ModelKeysList.tsx +203 -0
- package/src/ai/ModelKeysList/block.meta.ts +10 -0
- package/src/ai/ModelKeysList/fixtures.ts +44 -0
- package/src/ai/PromptEditor/PromptEditor.test.tsx +97 -0
- package/src/ai/PromptEditor/PromptEditor.tsx +202 -0
- package/src/ai/PromptEditor/block.meta.ts +10 -0
- package/src/ai/PromptEditor/examples/controlled-variables.tsx +23 -0
- package/src/ai/PromptEditor/fixtures.ts +12 -0
- package/src/ai/TokenCostCard/TokenCostCard.test.tsx +36 -0
- package/src/ai/TokenCostCard/TokenCostCard.tsx +130 -0
- package/src/ai/TokenCostCard/block.meta.ts +9 -0
- package/src/ai/TokenCostCard/fixtures.ts +18 -0
- package/src/ai/TraceWaterfall/TraceWaterfall.test.tsx +119 -0
- package/src/ai/TraceWaterfall/TraceWaterfall.tsx +317 -0
- package/src/ai/TraceWaterfall/block.meta.ts +10 -0
- package/src/ai/TraceWaterfall/examples/no-details.tsx +6 -0
- package/src/ai/TraceWaterfall/examples/running.tsx +16 -0
- package/src/ai/TraceWaterfall/fixtures.ts +133 -0
- package/src/ai/TraceWaterfall/span-details.tsx +51 -0
- package/src/ai/index.ts +13 -0
- package/src/auth/ForgotPasswordForm/ForgotPasswordForm.test.tsx +209 -0
- package/src/auth/ForgotPasswordForm/ForgotPasswordForm.tsx +211 -0
- package/src/auth/ForgotPasswordForm/block.meta.ts +10 -0
- package/src/auth/ForgotPasswordForm/examples/UsernameOrEmail.tsx +24 -0
- package/src/auth/MfaChallenge/MfaChallenge.test.tsx +35 -0
- package/src/auth/MfaChallenge/MfaChallenge.tsx +170 -0
- package/src/auth/MfaChallenge/block.meta.ts +9 -0
- package/src/auth/ResetPasswordForm/ResetPasswordForm.test.tsx +27 -0
- package/src/auth/ResetPasswordForm/ResetPasswordForm.tsx +100 -0
- package/src/auth/ResetPasswordForm/block.meta.ts +10 -0
- package/src/auth/SignInForm/SignInForm.test.tsx +222 -0
- package/src/auth/SignInForm/SignInForm.tsx +226 -0
- package/src/auth/SignInForm/block.meta.ts +22 -0
- package/src/auth/SignInForm/examples/Username.tsx +26 -0
- package/src/auth/SignUpForm/SignUpForm.test.tsx +33 -0
- package/src/auth/SignUpForm/SignUpForm.tsx +154 -0
- package/src/auth/SignUpForm/block.meta.ts +9 -0
- package/src/auth/SsoButtons/SsoButtons.test.tsx +23 -0
- package/src/auth/SsoButtons/SsoButtons.tsx +52 -0
- package/src/auth/SsoButtons/block.meta.ts +9 -0
- package/src/auth/SsoButtons/fixtures.ts +15 -0
- package/src/auth/index.ts +15 -0
- package/src/auth/shared.tsx +113 -0
- package/src/billing/CostBreakdown/CostBreakdown.test.tsx +24 -0
- package/src/billing/CostBreakdown/CostBreakdown.tsx +95 -0
- package/src/billing/CostBreakdown/block.meta.ts +10 -0
- package/src/billing/CostBreakdown/fixtures.ts +9 -0
- package/src/billing/InvoiceTable/InvoiceTable.test.tsx +29 -0
- package/src/billing/InvoiceTable/InvoiceTable.tsx +130 -0
- package/src/billing/InvoiceTable/block.meta.ts +10 -0
- package/src/billing/InvoiceTable/fixtures.ts +38 -0
- package/src/billing/PaymentMethodCard/PaymentMethodCard.test.tsx +28 -0
- package/src/billing/PaymentMethodCard/PaymentMethodCard.tsx +103 -0
- package/src/billing/PaymentMethodCard/block.meta.ts +10 -0
- package/src/billing/PaymentMethodCard/fixtures.ts +12 -0
- package/src/billing/PlanCard/PlanCard.baseline.test.tsx +26 -0
- package/src/billing/PlanCard/PlanCard.summary.test.tsx +227 -0
- package/src/billing/PlanCard/PlanCard.test.tsx +27 -0
- package/src/billing/PlanCard/PlanCard.tsx +140 -0
- package/src/billing/PlanCard/PlanSummary.tsx +101 -0
- package/src/billing/PlanCard/README.md +23 -0
- package/src/billing/PlanCard/__snapshots__/PlanCard.baseline.test.tsx.snap +5 -0
- package/src/billing/PlanCard/block.meta.ts +60 -0
- package/src/billing/PlanCard/examples/SummaryActionsOnly.tsx +12 -0
- package/src/billing/PlanCard/examples/SummaryFeaturesOnly.tsx +14 -0
- package/src/billing/PlanCard/examples/SummaryFull.tsx +28 -0
- package/src/billing/PlanCard/examples/SummaryMinimal.tsx +5 -0
- package/src/billing/PlanCard/examples/SummaryPriceOnly.tsx +15 -0
- package/src/billing/PlanCard/examples/SummaryRenewalOnly.tsx +14 -0
- package/src/billing/PlanCard/examples/SummaryUnassigned.tsx +5 -0
- package/src/billing/PlanCard/examples/SummaryUnassignedNoLabel.tsx +5 -0
- package/src/billing/PlanCard/examples/SummaryZeroPrice.tsx +15 -0
- package/src/billing/PlanCard/fixtures.ts +19 -0
- package/src/billing/PlanDefinitionCard/PlanDefinitionCard.test.tsx +111 -0
- package/src/billing/PlanDefinitionCard/PlanDefinitionCard.tsx +86 -0
- package/src/billing/PlanDefinitionCard/README.md +29 -0
- package/src/billing/PlanDefinitionCard/block.meta.ts +46 -0
- package/src/billing/PlanDefinitionCard/examples/Compact.tsx +23 -0
- package/src/billing/PlanDefinitionCard/examples/Full.tsx +23 -0
- package/src/billing/PlanDefinitionCard/fixtures.ts +12 -0
- package/src/billing/QuotaMeters/QuotaMeters.test.tsx +23 -0
- package/src/billing/QuotaMeters/QuotaMeters.tsx +92 -0
- package/src/billing/QuotaMeters/block.meta.ts +10 -0
- package/src/billing/QuotaMeters/fixtures.ts +9 -0
- package/src/billing/SpendVsBudget/SpendVsBudget.test.tsx +24 -0
- package/src/billing/SpendVsBudget/SpendVsBudget.tsx +105 -0
- package/src/billing/SpendVsBudget/block.meta.ts +10 -0
- package/src/billing/SpendVsBudget/fixtures.ts +18 -0
- package/src/billing/format.ts +42 -0
- package/src/billing/index.ts +21 -0
- package/src/builders/CodePanel/CodePanel.test.tsx +280 -0
- package/src/builders/CodePanel/CodePanel.tsx +239 -0
- package/src/builders/CodePanel/block.meta.ts +10 -0
- package/src/builders/CodePanel/examples/controlled.tsx +15 -0
- package/src/builders/CodePanel/examples/diagnostics.tsx +40 -0
- package/src/builders/CodePanel/fixtures.ts +95 -0
- package/src/builders/CodePanel/marker-store.ts +90 -0
- package/src/builders/CodePanel/markers.ts +62 -0
- package/src/builders/FlowBuilder/FlowBuilder.test.tsx +480 -0
- package/src/builders/FlowBuilder/FlowBuilder.tsx +343 -0
- package/src/builders/FlowBuilder/block.meta.ts +20 -0
- package/src/builders/FlowBuilder/connections.ts +67 -0
- package/src/builders/FlowBuilder/decorated-nodes.ts +80 -0
- package/src/builders/FlowBuilder/examples/extensions.tsx +120 -0
- package/src/builders/FlowBuilder/extensions.ts +37 -0
- package/src/builders/FlowBuilder/fixtures.ts +80 -0
- package/src/builders/FlowBuilder/parts.tsx +196 -0
- package/src/builders/FlowBuilder/problems.tsx +40 -0
- package/src/builders/LogViewer/LogViewer.test.tsx +97 -0
- package/src/builders/LogViewer/LogViewer.tsx +253 -0
- package/src/builders/LogViewer/block.meta.ts +10 -0
- package/src/builders/LogViewer/fixtures.ts +49 -0
- package/src/builders/index.ts +15 -0
- package/src/data-display/ActivityFeed/ActivityFeed.test.tsx +62 -0
- package/src/data-display/ActivityFeed/ActivityFeed.tsx +118 -0
- package/src/data-display/ActivityFeed/block.meta.ts +10 -0
- package/src/data-display/ActivityFeed/fixtures.ts +29 -0
- package/src/data-display/ChartCard/ChartCard.ranges.test.tsx +282 -0
- package/src/data-display/ChartCard/ChartCard.test.tsx +54 -0
- package/src/data-display/ChartCard/ChartCard.tsx +218 -0
- package/src/data-display/ChartCard/block.meta.ts +10 -0
- package/src/data-display/ChartCard/examples/custom-ranges.tsx +37 -0
- package/src/data-display/ChartCard/examples/heatmap.tsx +20 -0
- package/src/data-display/ChartCard/examples/toolbar-owned-range.tsx +34 -0
- package/src/data-display/ChartCard/fixtures.ts +82 -0
- package/src/data-display/CommentThread/CommentThread.test.tsx +29 -0
- package/src/data-display/CommentThread/CommentThread.tsx +120 -0
- package/src/data-display/CommentThread/block.meta.ts +10 -0
- package/src/data-display/CommentThread/fixtures.ts +28 -0
- package/src/data-display/DescriptionListCard/DescriptionListCard.test.tsx +28 -0
- package/src/data-display/DescriptionListCard/DescriptionListCard.tsx +120 -0
- package/src/data-display/DescriptionListCard/block.meta.ts +9 -0
- package/src/data-display/DescriptionListCard/fixtures.ts +12 -0
- package/src/data-display/KpiRow/KpiRow.test.tsx +29 -0
- package/src/data-display/KpiRow/KpiRow.tsx +101 -0
- package/src/data-display/KpiRow/block.meta.ts +10 -0
- package/src/data-display/KpiRow/fixtures.ts +34 -0
- package/src/data-display/ResourceCardGrid/ResourceCardGrid.test.tsx +22 -0
- package/src/data-display/ResourceCardGrid/ResourceCardGrid.tsx +98 -0
- package/src/data-display/ResourceCardGrid/block.meta.ts +10 -0
- package/src/data-display/ResourceCardGrid/fixtures.ts +72 -0
- package/src/data-display/StatCard/StatCard.test.tsx +30 -0
- package/src/data-display/StatCard/StatCard.tsx +138 -0
- package/src/data-display/StatCard/block.meta.ts +10 -0
- package/src/data-display/StatCard/fixtures.ts +26 -0
- package/src/data-display/StatusTimeline/StatusTimeline.test.tsx +153 -0
- package/src/data-display/StatusTimeline/StatusTimeline.tsx +114 -0
- package/src/data-display/StatusTimeline/block.meta.ts +10 -0
- package/src/data-display/StatusTimeline/examples/Empty.tsx +6 -0
- package/src/data-display/StatusTimeline/fixtures.ts +62 -0
- package/src/data-display/index.ts +34 -0
- package/src/data-display/shared/TrendDelta.tsx +60 -0
- package/src/feedback/ConfirmDestructive/ConfirmDestructive.test.tsx +47 -0
- package/src/feedback/ConfirmDestructive/ConfirmDestructive.tsx +145 -0
- package/src/feedback/ConfirmDestructive/block.meta.ts +10 -0
- package/src/feedback/EmptyStates/EmptyStates.test.tsx +48 -0
- package/src/feedback/EmptyStates/EmptyStates.tsx +191 -0
- package/src/feedback/EmptyStates/block.meta.ts +10 -0
- package/src/feedback/EmptyStates/fixtures.ts +6 -0
- package/src/feedback/ErrorPanel/ErrorPanel.test.tsx +37 -0
- package/src/feedback/ErrorPanel/ErrorPanel.tsx +146 -0
- package/src/feedback/ErrorPanel/block.meta.ts +10 -0
- package/src/feedback/InlineCallout/InlineCallout.test.tsx +33 -0
- package/src/feedback/InlineCallout/InlineCallout.tsx +81 -0
- package/src/feedback/InlineCallout/block.meta.ts +9 -0
- package/src/feedback/Skeletons/Skeletons.test.tsx +25 -0
- package/src/feedback/Skeletons/Skeletons.tsx +142 -0
- package/src/feedback/Skeletons/block.meta.ts +10 -0
- package/src/feedback/SystemBanner/SystemBanner.test.tsx +29 -0
- package/src/feedback/SystemBanner/SystemBanner.tsx +105 -0
- package/src/feedback/SystemBanner/block.meta.ts +9 -0
- package/src/feedback/index.ts +14 -0
- package/src/feedback/types.ts +13 -0
- package/src/forms/CreateApiKeyDialog/CreateApiKeyDialog.test.tsx +36 -0
- package/src/forms/CreateApiKeyDialog/CreateApiKeyDialog.tsx +197 -0
- package/src/forms/CreateApiKeyDialog/block.meta.ts +10 -0
- package/src/forms/CreateApiKeyDialog/fixtures.ts +31 -0
- package/src/forms/CredentialDisclosureDialog/CredentialDisclosureDialog.test.tsx +339 -0
- package/src/forms/CredentialDisclosureDialog/CredentialDisclosureDialog.tsx +193 -0
- package/src/forms/CredentialDisclosureDialog/block.meta.ts +10 -0
- package/src/forms/CredentialDisclosureDialog/examples/Fresh.tsx +32 -0
- package/src/forms/CredentialDisclosureDialog/examples/ResponseGating.tsx +69 -0
- package/src/forms/CredentialDisclosureDialog/examples/Stored.tsx +32 -0
- package/src/forms/CredentialDisclosureDialog/fixtures.ts +14 -0
- package/src/forms/DangerZone/ConfirmDestructiveDialog.tsx +101 -0
- package/src/forms/DangerZone/DangerZone.test.tsx +28 -0
- package/src/forms/DangerZone/DangerZone.tsx +86 -0
- package/src/forms/DangerZone/block.meta.ts +10 -0
- package/src/forms/DangerZone/fixtures.ts +36 -0
- package/src/forms/DateRangeFilter/DateRangeFilter.test.tsx +26 -0
- package/src/forms/DateRangeFilter/DateRangeFilter.tsx +83 -0
- package/src/forms/DateRangeFilter/block.meta.ts +9 -0
- package/src/forms/DialogWizard/DialogWizard.test.tsx +95 -0
- package/src/forms/DialogWizard/DialogWizard.tsx +39 -0
- package/src/forms/DialogWizard/block.meta.ts +10 -0
- package/src/forms/DialogWizard/examples/CreateResource.tsx +65 -0
- package/src/forms/DialogWizard/fixtures.ts +20 -0
- package/src/forms/FileUploadPanel/FileUploadPanel.test.tsx +43 -0
- package/src/forms/FileUploadPanel/FileUploadPanel.tsx +244 -0
- package/src/forms/FileUploadPanel/block.meta.ts +10 -0
- package/src/forms/FileUploadPanel/fixtures.ts +66 -0
- package/src/forms/FormSection/FormSection.test.tsx +34 -0
- package/src/forms/FormSection/FormSection.tsx +77 -0
- package/src/forms/FormSection/block.meta.ts +9 -0
- package/src/forms/InviteMembersDialog/InviteMembersDialog.test.tsx +37 -0
- package/src/forms/InviteMembersDialog/InviteMembersDialog.tsx +183 -0
- package/src/forms/InviteMembersDialog/block.meta.ts +10 -0
- package/src/forms/InviteMembersDialog/fixtures.ts +14 -0
- package/src/forms/SettingsRow/SettingsRow.test.tsx +50 -0
- package/src/forms/SettingsRow/SettingsRow.tsx +74 -0
- package/src/forms/SettingsRow/block.meta.ts +9 -0
- package/src/forms/ValidationSummary/ValidationSummary.test.tsx +46 -0
- package/src/forms/ValidationSummary/ValidationSummary.tsx +75 -0
- package/src/forms/ValidationSummary/block.meta.ts +9 -0
- package/src/forms/ValidationSummary/fixtures.ts +13 -0
- package/src/forms/index.ts +27 -0
- package/src/index.ts +14 -0
- package/src/marketing/ComparisonTable/ComparisonTable.test.tsx +69 -0
- package/src/marketing/ComparisonTable/ComparisonTable.tsx +245 -0
- package/src/marketing/ComparisonTable/block.meta.ts +10 -0
- package/src/marketing/ComparisonTable/examples/options.tsx +48 -0
- package/src/marketing/ComparisonTable/fixtures.ts +83 -0
- package/src/marketing/Faq/Faq.test.tsx +25 -0
- package/src/marketing/Faq/Faq.tsx +68 -0
- package/src/marketing/Faq/block.meta.ts +10 -0
- package/src/marketing/Faq/fixtures.ts +32 -0
- package/src/marketing/FeatureGrid/FeatureGrid.test.tsx +19 -0
- package/src/marketing/FeatureGrid/FeatureGrid.tsx +79 -0
- package/src/marketing/FeatureGrid/block.meta.ts +10 -0
- package/src/marketing/FeatureGrid/fixtures.ts +36 -0
- package/src/marketing/Hero/Hero.test.tsx +33 -0
- package/src/marketing/Hero/Hero.tsx +107 -0
- package/src/marketing/Hero/block.meta.ts +10 -0
- package/src/marketing/PricingTable/PricingTable.test.tsx +92 -0
- package/src/marketing/PricingTable/PricingTable.tsx +323 -0
- package/src/marketing/PricingTable/block.meta.ts +10 -0
- package/src/marketing/PricingTable/fixtures.ts +34 -0
- package/src/marketing/actions.tsx +40 -0
- package/src/marketing/index.ts +15 -0
- package/src/meta.ts +23 -0
- package/src/page-chrome/BulkActionBar/BulkActionBar.test.tsx +34 -0
- package/src/page-chrome/BulkActionBar/BulkActionBar.tsx +76 -0
- package/src/page-chrome/BulkActionBar/block.meta.ts +9 -0
- package/src/page-chrome/PageHeader/PageHeader.test.tsx +68 -0
- package/src/page-chrome/PageHeader/PageHeader.tsx +152 -0
- package/src/page-chrome/PageHeader/block.meta.ts +10 -0
- package/src/page-chrome/PageHeader/fixtures.ts +29 -0
- package/src/page-chrome/PageToolbar/PageToolbar.test.tsx +38 -0
- package/src/page-chrome/PageToolbar/PageToolbar.tsx +138 -0
- package/src/page-chrome/PageToolbar/block.meta.ts +10 -0
- package/src/page-chrome/PageToolbar/fixtures.ts +8 -0
- package/src/page-chrome/SectionHeader/SectionHeader.test.tsx +28 -0
- package/src/page-chrome/SectionHeader/SectionHeader.tsx +73 -0
- package/src/page-chrome/SectionHeader/block.meta.ts +9 -0
- package/src/page-chrome/StickyActionBar/StickyActionBar.test.tsx +29 -0
- package/src/page-chrome/StickyActionBar/StickyActionBar.tsx +66 -0
- package/src/page-chrome/StickyActionBar/block.meta.ts +9 -0
- package/src/page-chrome/index.ts +13 -0
- package/src/page-chrome/types.ts +25 -0
- package/src/scheduling/AgendaList/AgendaList.test.tsx +28 -0
- package/src/scheduling/AgendaList/AgendaList.tsx +165 -0
- package/src/scheduling/AgendaList/block.meta.ts +10 -0
- package/src/scheduling/MonthCalendar/MonthCalendar.test.tsx +32 -0
- package/src/scheduling/MonthCalendar/MonthCalendar.tsx +223 -0
- package/src/scheduling/MonthCalendar/block.meta.ts +10 -0
- package/src/scheduling/TimeSlotPicker/TimeSlotPicker.test.tsx +26 -0
- package/src/scheduling/TimeSlotPicker/TimeSlotPicker.tsx +115 -0
- package/src/scheduling/TimeSlotPicker/block.meta.ts +10 -0
- package/src/scheduling/TimeSlotPicker/fixtures.ts +10 -0
- package/src/scheduling/WeekCalendar/WeekCalendar.test.tsx +27 -0
- package/src/scheduling/WeekCalendar/WeekCalendar.tsx +274 -0
- package/src/scheduling/WeekCalendar/block.meta.ts +10 -0
- package/src/scheduling/index.ts +11 -0
- package/src/scheduling/shared/CalendarHeader.tsx +54 -0
- package/src/scheduling/shared/EventTile.tsx +21 -0
- package/src/scheduling/shared/dates.ts +98 -0
- package/src/scheduling/shared/events.ts +90 -0
- package/src/scheduling/shared/fixtures.ts +54 -0
- package/src/shell/AppSidebar/AppSidebar.test.tsx +38 -0
- package/src/shell/AppSidebar/AppSidebar.tsx +226 -0
- package/src/shell/AppSidebar/block.meta.ts +10 -0
- package/src/shell/AppSidebar/fixtures.ts +58 -0
- package/src/shell/AppTopbar/AppTopbar.test.tsx +41 -0
- package/src/shell/AppTopbar/AppTopbar.tsx +82 -0
- package/src/shell/AppTopbar/block.meta.ts +19 -0
- package/src/shell/AppTopbar/fixtures.ts +22 -0
- package/src/shell/EnvironmentBadge/EnvironmentBadge.test.tsx +22 -0
- package/src/shell/EnvironmentBadge/EnvironmentBadge.tsx +55 -0
- package/src/shell/EnvironmentBadge/block.meta.ts +10 -0
- package/src/shell/GlobalSearch/GlobalSearch.test.tsx +28 -0
- package/src/shell/GlobalSearch/GlobalSearch.tsx +80 -0
- package/src/shell/GlobalSearch/block.meta.ts +10 -0
- package/src/shell/GlobalSearch/fixtures.ts +64 -0
- package/src/shell/index.ts +11 -0
- package/src/styles.css +2 -0
- package/src/tables/DataTable/DataTable.edit-views.test.tsx +249 -0
- package/src/tables/DataTable/DataTable.layout.test.tsx +188 -0
- package/src/tables/DataTable/DataTable.single-select.test.tsx +501 -0
- package/src/tables/DataTable/DataTable.test.tsx +268 -0
- package/src/tables/DataTable/DataTable.tsx +520 -0
- package/src/tables/DataTable/block.meta.ts +27 -0
- package/src/tables/DataTable/column-menu.tsx +109 -0
- package/src/tables/DataTable/column-sizing.ts +166 -0
- package/src/tables/DataTable/data-table-body.tsx +194 -0
- package/src/tables/DataTable/data-table-props.ts +156 -0
- package/src/tables/DataTable/data-table-row.tsx +220 -0
- package/src/tables/DataTable/data-table-utils.ts +195 -0
- package/src/tables/DataTable/density-toggle.tsx +30 -0
- package/src/tables/DataTable/editable-cell.tsx +274 -0
- package/src/tables/DataTable/examples/editable.tsx +71 -0
- package/src/tables/DataTable/examples/grouped.tsx +18 -0
- package/src/tables/DataTable/examples/resizable-pinned.tsx +20 -0
- package/src/tables/DataTable/examples/saved-views.tsx +61 -0
- package/src/tables/DataTable/examples/single-selection.tsx +55 -0
- package/src/tables/DataTable/examples/virtualized.tsx +20 -0
- package/src/tables/DataTable/fixtures.ts +119 -0
- package/src/tables/DataTable/header-cell.tsx +86 -0
- package/src/tables/DataTable/resize-handle.tsx +88 -0
- package/src/tables/DataTable/single-selection.tsx +149 -0
- package/src/tables/DataTable/use-table-views.ts +79 -0
- package/src/tables/DataTable/use-virtual-rows.ts +83 -0
- package/src/tables/DataTable/views.tsx +186 -0
- package/src/tables/FilterBar/FilterBar.test.tsx +43 -0
- package/src/tables/FilterBar/FilterBar.tsx +199 -0
- package/src/tables/FilterBar/block.meta.ts +10 -0
- package/src/tables/FilterBar/fixtures.ts +32 -0
- package/src/tables/InlineEditRow/InlineEditRow.test.tsx +41 -0
- package/src/tables/InlineEditRow/InlineEditRow.tsx +215 -0
- package/src/tables/InlineEditRow/block.meta.ts +10 -0
- package/src/tables/InlineEditRow/fixtures.ts +28 -0
- package/src/tables/PaginationFooter/PaginationFooter.test.tsx +29 -0
- package/src/tables/PaginationFooter/PaginationFooter.tsx +94 -0
- package/src/tables/PaginationFooter/block.meta.ts +10 -0
- package/src/tables/SubordinateList/SubordinateList.test.tsx +351 -0
- package/src/tables/SubordinateList/SubordinateList.tsx +140 -0
- package/src/tables/SubordinateList/block.meta.ts +10 -0
- package/src/tables/SubordinateList/examples/ResourceForm.tsx +129 -0
- package/src/tables/SubordinateList/examples/empty.tsx +5 -0
- package/src/tables/SubordinateList/examples/error.tsx +5 -0
- package/src/tables/SubordinateList/examples/loading.tsx +5 -0
- package/src/tables/TruncatedCollectionFooter/TruncatedCollectionFooter.test.tsx +159 -0
- package/src/tables/TruncatedCollectionFooter/TruncatedCollectionFooter.tsx +60 -0
- package/src/tables/TruncatedCollectionFooter/block.meta.ts +10 -0
- package/src/tables/TruncatedCollectionFooter/examples/exact.tsx +6 -0
- package/src/tables/TruncatedCollectionFooter/examples/has-more.tsx +12 -0
- package/src/tables/TruncatedCollectionFooter/fixtures.ts +2 -0
- package/src/tables/index.ts +45 -0
- package/src/team/MembersTable/MembersTable.test.tsx +29 -0
- package/src/team/MembersTable/MembersTable.tsx +141 -0
- package/src/team/MembersTable/block.meta.ts +9 -0
- package/src/team/MembersTable/fixtures.ts +19 -0
- package/src/team/NotificationMatrix/NotificationMatrix.test.tsx +36 -0
- package/src/team/NotificationMatrix/NotificationMatrix.tsx +144 -0
- package/src/team/NotificationMatrix/block.meta.ts +9 -0
- package/src/team/NotificationMatrix/fixtures.ts +43 -0
- package/src/team/PendingInvitations/PendingInvitations.test.tsx +30 -0
- package/src/team/PendingInvitations/PendingInvitations.tsx +132 -0
- package/src/team/PendingInvitations/block.meta.ts +9 -0
- package/src/team/PendingInvitations/fixtures.ts +39 -0
- package/src/team/ProfileHeader/ProfileHeader.test.tsx +29 -0
- package/src/team/ProfileHeader/ProfileHeader.tsx +106 -0
- package/src/team/ProfileHeader/block.meta.ts +10 -0
- package/src/team/ProfileHeader/fixtures.ts +28 -0
- package/src/team/SessionsDevices/SessionsDevices.test.tsx +30 -0
- package/src/team/SessionsDevices/SessionsDevices.tsx +126 -0
- package/src/team/SessionsDevices/block.meta.ts +10 -0
- package/src/team/SessionsDevices/fixtures.ts +58 -0
- package/src/team/index.ts +15 -0
- package/src/test/a11y.ts +18 -0
- package/src/test/heading-levels.test.tsx +69 -0
- package/src/test/setup.ts +36 -0
- package/README.md +0 -3
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Badge, Button, Timestamp, cn } from '@gntik-ai/ui';
|
|
2
|
+
import { LogOut, Monitor, Smartphone, Tablet, type LucideIcon } from '@gntik-ai/icons';
|
|
3
|
+
import { useId, useState, type ReactNode } from 'react';
|
|
4
|
+
import { deviceSessions, type DeviceKind, type DeviceSession } from './fixtures';
|
|
5
|
+
|
|
6
|
+
export type { DeviceKind, DeviceSession } from './fixtures';
|
|
7
|
+
|
|
8
|
+
const KIND_ICON: Record<DeviceKind, LucideIcon> = { desktop: Monitor, mobile: Smartphone, tablet: Tablet };
|
|
9
|
+
|
|
10
|
+
export interface SessionsDevicesProps {
|
|
11
|
+
sessions?: DeviceSession[];
|
|
12
|
+
onRevoke?: (session: DeviceSession) => void;
|
|
13
|
+
/** Signs out every session except the current one. */
|
|
14
|
+
onRevokeOthers?: (sessions: DeviceSession[]) => void;
|
|
15
|
+
title?: ReactNode;
|
|
16
|
+
description?: ReactNode;
|
|
17
|
+
headingLevel?: 'h2' | 'h3' | 'h4';
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Signed-in sessions and devices: client, location, last seen, the current one marked, and revoke. */
|
|
22
|
+
export function SessionsDevices({
|
|
23
|
+
sessions = deviceSessions,
|
|
24
|
+
onRevoke,
|
|
25
|
+
onRevokeOthers,
|
|
26
|
+
title = 'Sessions and devices',
|
|
27
|
+
description = "Places where you're signed in. Revoke anything you don't recognise.",
|
|
28
|
+
headingLevel: Heading = 'h2',
|
|
29
|
+
className,
|
|
30
|
+
}: SessionsDevicesProps) {
|
|
31
|
+
const id = useId();
|
|
32
|
+
const [revoked, setRevoked] = useState<string[]>([]);
|
|
33
|
+
const [announcement, setAnnouncement] = useState('');
|
|
34
|
+
const rows = sessions.filter((s) => !revoked.includes(s.id));
|
|
35
|
+
const others = rows.filter((s) => !s.current);
|
|
36
|
+
|
|
37
|
+
const revoke = (list: DeviceSession[]) => {
|
|
38
|
+
setRevoked((r) => [...r, ...list.map((s) => s.id)]);
|
|
39
|
+
setAnnouncement(list.length === 1 ? `Signed out of ${list[0]?.device}.` : `Signed out of ${list.length} sessions.`);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<section
|
|
44
|
+
aria-labelledby={`${id}-title`}
|
|
45
|
+
className={cn('rounded-lg border border-border bg-card shadow-sm', className)}
|
|
46
|
+
>
|
|
47
|
+
<div className="flex flex-col gap-3 border-b border-border px-5 py-4 sm:flex-row sm:items-start sm:justify-between">
|
|
48
|
+
<div className="min-w-0">
|
|
49
|
+
<Heading id={`${id}-title`} className="text-[14px] font-semibold tracking-tight text-foreground">
|
|
50
|
+
{title}
|
|
51
|
+
</Heading>
|
|
52
|
+
{description != null && <p className="mt-0.5 text-[12.5px] text-muted-foreground">{description}</p>}
|
|
53
|
+
</div>
|
|
54
|
+
<Button
|
|
55
|
+
variant="secondary"
|
|
56
|
+
size="sm"
|
|
57
|
+
icon={LogOut}
|
|
58
|
+
disabled={others.length === 0}
|
|
59
|
+
className="self-start"
|
|
60
|
+
onClick={() => {
|
|
61
|
+
revoke(others);
|
|
62
|
+
onRevokeOthers?.(others);
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
65
|
+
Sign out other sessions
|
|
66
|
+
</Button>
|
|
67
|
+
</div>
|
|
68
|
+
<ul className="divide-y divide-border">
|
|
69
|
+
{rows.map((s) => {
|
|
70
|
+
const KindIcon = KIND_ICON[s.kind];
|
|
71
|
+
return (
|
|
72
|
+
<li key={s.id} className="flex items-center gap-3 px-5 py-3.5">
|
|
73
|
+
<span
|
|
74
|
+
className={cn(
|
|
75
|
+
'grid size-9 shrink-0 place-items-center rounded-md',
|
|
76
|
+
s.current ? 'bg-primary/14 text-primary-chip-text' : 'bg-secondary text-muted-foreground',
|
|
77
|
+
)}
|
|
78
|
+
>
|
|
79
|
+
<KindIcon size={17} aria-hidden />
|
|
80
|
+
</span>
|
|
81
|
+
<div className="min-w-0 flex-1">
|
|
82
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
83
|
+
<span className="text-[13px] font-medium text-foreground">{s.device}</span>
|
|
84
|
+
{s.current && (
|
|
85
|
+
<Badge size="sm" tone="success" dot>
|
|
86
|
+
This device
|
|
87
|
+
</Badge>
|
|
88
|
+
)}
|
|
89
|
+
</div>
|
|
90
|
+
<div className="mt-0.5 truncate text-[12px] text-muted-foreground">
|
|
91
|
+
{s.client} · {s.location}
|
|
92
|
+
{s.ip && <span className="hidden font-mono sm:inline"> · {s.ip}</span>}
|
|
93
|
+
</div>
|
|
94
|
+
<div className="text-[12px] text-muted-foreground">
|
|
95
|
+
{s.current ? (
|
|
96
|
+
'Active now'
|
|
97
|
+
) : (
|
|
98
|
+
<>
|
|
99
|
+
Last seen <Timestamp value={s.lastSeen} tooltip={false} />
|
|
100
|
+
</>
|
|
101
|
+
)}
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
{!s.current && (
|
|
105
|
+
<Button
|
|
106
|
+
variant="ghost"
|
|
107
|
+
size="sm"
|
|
108
|
+
aria-label={`Revoke session on ${s.device}`}
|
|
109
|
+
onClick={() => {
|
|
110
|
+
revoke([s]);
|
|
111
|
+
onRevoke?.(s);
|
|
112
|
+
}}
|
|
113
|
+
>
|
|
114
|
+
Revoke
|
|
115
|
+
</Button>
|
|
116
|
+
)}
|
|
117
|
+
</li>
|
|
118
|
+
);
|
|
119
|
+
})}
|
|
120
|
+
</ul>
|
|
121
|
+
<span role="status" className="sr-only">
|
|
122
|
+
{announcement}
|
|
123
|
+
</span>
|
|
124
|
+
</section>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BlockMeta } from '../../meta';
|
|
2
|
+
|
|
3
|
+
export const meta: BlockMeta = {
|
|
4
|
+
name: 'Sessions and devices',
|
|
5
|
+
family: 'team',
|
|
6
|
+
status: 'stable',
|
|
7
|
+
description:
|
|
8
|
+
'Signed-in sessions with device, client, location, last seen and a current-device badge; revoke one or all others.',
|
|
9
|
+
uses: ['Badge', 'Timestamp', 'Button'],
|
|
10
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const ago = (minutes: number) => new Date(Date.now() - minutes * 60_000).toISOString();
|
|
2
|
+
|
|
3
|
+
export type DeviceKind = 'desktop' | 'mobile' | 'tablet';
|
|
4
|
+
|
|
5
|
+
export interface DeviceSession {
|
|
6
|
+
id: string;
|
|
7
|
+
/** Device name, e.g. "MacBook Pro". */
|
|
8
|
+
device: string;
|
|
9
|
+
/** Browser or client, e.g. "Chrome 128 on macOS". */
|
|
10
|
+
client: string;
|
|
11
|
+
kind: DeviceKind;
|
|
12
|
+
location: string;
|
|
13
|
+
ip?: string;
|
|
14
|
+
/** ISO date of the last request. */
|
|
15
|
+
lastSeen: string;
|
|
16
|
+
/** The session making this request. */
|
|
17
|
+
current?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const deviceSessions: DeviceSession[] = [
|
|
21
|
+
{
|
|
22
|
+
id: 's1',
|
|
23
|
+
device: 'MacBook Pro',
|
|
24
|
+
client: 'Chrome 128 on macOS',
|
|
25
|
+
kind: 'desktop',
|
|
26
|
+
location: 'Lisbon, Portugal',
|
|
27
|
+
ip: '192.0.2.14',
|
|
28
|
+
lastSeen: ago(0),
|
|
29
|
+
current: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 's2',
|
|
33
|
+
device: 'Pixel 8',
|
|
34
|
+
client: 'Mobile app 4.2',
|
|
35
|
+
kind: 'mobile',
|
|
36
|
+
location: 'Lisbon, Portugal',
|
|
37
|
+
ip: '198.51.100.7',
|
|
38
|
+
lastSeen: ago(42),
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 's3',
|
|
42
|
+
device: 'iPad Air',
|
|
43
|
+
client: 'Safari 17 on iPadOS',
|
|
44
|
+
kind: 'tablet',
|
|
45
|
+
location: 'Madrid, Spain',
|
|
46
|
+
ip: '203.0.113.88',
|
|
47
|
+
lastSeen: ago(60 * 30),
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 's4',
|
|
51
|
+
device: 'Workstation',
|
|
52
|
+
client: 'Firefox 130 on Linux',
|
|
53
|
+
kind: 'desktop',
|
|
54
|
+
location: 'Berlin, Germany',
|
|
55
|
+
ip: '203.0.113.5',
|
|
56
|
+
lastSeen: ago(60 * 24 * 12),
|
|
57
|
+
},
|
|
58
|
+
];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './MembersTable/MembersTable';
|
|
2
|
+
export { meta as membersTableMeta } from './MembersTable/block.meta';
|
|
3
|
+
export * from './NotificationMatrix/NotificationMatrix';
|
|
4
|
+
export { meta as notificationMatrixMeta } from './NotificationMatrix/block.meta';
|
|
5
|
+
export * from './PendingInvitations/PendingInvitations';
|
|
6
|
+
export { meta as pendingInvitationsMeta } from './PendingInvitations/block.meta';
|
|
7
|
+
export * from './ProfileHeader/ProfileHeader';
|
|
8
|
+
export { meta as profileHeaderMeta } from './ProfileHeader/block.meta';
|
|
9
|
+
export * from './SessionsDevices/SessionsDevices';
|
|
10
|
+
export { meta as sessionsDevicesMeta } from './SessionsDevices/block.meta';
|
|
11
|
+
export { members as sampleMembers } from './MembersTable/fixtures';
|
|
12
|
+
export { invitations as sampleInvitations } from './PendingInvitations/fixtures';
|
|
13
|
+
export { deviceSessions as sampleDeviceSessions } from './SessionsDevices/fixtures';
|
|
14
|
+
export { notificationChannels, notificationEvents, notificationDefaults } from './NotificationMatrix/fixtures';
|
|
15
|
+
export { profile as sampleProfile } from './ProfileHeader/fixtures';
|
package/src/test/a11y.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import axe from 'axe-core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Runs axe on a container and returns the violations. Colour contrast is checked in the
|
|
5
|
+
* browser suite (jsdom has no layout or computed colours), so it is disabled here.
|
|
6
|
+
*/
|
|
7
|
+
export async function axeViolations(container: Element = document.body) {
|
|
8
|
+
const result = await axe.run(container, {
|
|
9
|
+
rules: { 'color-contrast': { enabled: false }, region: { enabled: false } },
|
|
10
|
+
});
|
|
11
|
+
return result.violations.map((v) => `${v.id}: ${v.help} (${v.nodes.map((n) => n.target.join(' ')).join(', ')})`);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Asserts that a container has no axe violations. */
|
|
15
|
+
export async function expectNoAxeViolations(container: Element = document.body) {
|
|
16
|
+
const violations = await axeViolations(container);
|
|
17
|
+
if (violations.length) throw new Error('axe violations:\n' + violations.join('\n'));
|
|
18
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
import { AssistantCardGrid } from '../ai/AssistantCardGrid/AssistantCardGrid';
|
|
4
|
+
import { EvaluationScorecard } from '../ai/EvaluationScorecard/EvaluationScorecard';
|
|
5
|
+
import { ModelKeysList } from '../ai/ModelKeysList/ModelKeysList';
|
|
6
|
+
import { PromptEditor } from '../ai/PromptEditor/PromptEditor';
|
|
7
|
+
import { TokenCostCard } from '../ai/TokenCostCard/TokenCostCard';
|
|
8
|
+
import { TraceWaterfall } from '../ai/TraceWaterfall/TraceWaterfall';
|
|
9
|
+
import { CostBreakdown } from '../billing/CostBreakdown/CostBreakdown';
|
|
10
|
+
import { PaymentMethodCard } from '../billing/PaymentMethodCard/PaymentMethodCard';
|
|
11
|
+
import { PlanCard } from '../billing/PlanCard/PlanCard';
|
|
12
|
+
import { PlanDefinitionCard } from '../billing/PlanDefinitionCard/PlanDefinitionCard';
|
|
13
|
+
import { QuotaMeters } from '../billing/QuotaMeters/QuotaMeters';
|
|
14
|
+
import { SpendVsBudget } from '../billing/SpendVsBudget/SpendVsBudget';
|
|
15
|
+
import { LogViewer } from '../builders/LogViewer/LogViewer';
|
|
16
|
+
import { ActivityFeed } from '../data-display/ActivityFeed/ActivityFeed';
|
|
17
|
+
import { ChartCard } from '../data-display/ChartCard/ChartCard';
|
|
18
|
+
import { DescriptionListCard } from '../data-display/DescriptionListCard/DescriptionListCard';
|
|
19
|
+
import { ResourceCardGrid } from '../data-display/ResourceCardGrid/ResourceCardGrid';
|
|
20
|
+
import { StatCard } from '../data-display/StatCard/StatCard';
|
|
21
|
+
import { AgendaList } from '../scheduling/AgendaList/AgendaList';
|
|
22
|
+
|
|
23
|
+
/** Levels of every heading rendered, in document order. */
|
|
24
|
+
const levels = () => screen.queryAllByRole('heading').map((h) => Number(h.tagName.slice(1)));
|
|
25
|
+
|
|
26
|
+
const cases: Array<[string, (as: 'h2' | 'h4') => ReactElement]> = [
|
|
27
|
+
['ChartCard', (as) => <ChartCard titleAs={as} />],
|
|
28
|
+
['DescriptionListCard', (as) => <DescriptionListCard titleAs={as} />],
|
|
29
|
+
['StatCard', (as) => <StatCard titleAs={as} />],
|
|
30
|
+
['ResourceCardGrid', (as) => <ResourceCardGrid titleAs={as} />],
|
|
31
|
+
['PlanCard', (as) => <PlanCard titleAs={as} />],
|
|
32
|
+
['PlanCard summary', (as) => <PlanCard variant="summary" plan={{ name: 'Fixture Plan' }} titleAs={as} />],
|
|
33
|
+
['PlanDefinitionCard', (as) => <PlanDefinitionCard titleAs={as} />],
|
|
34
|
+
['QuotaMeters', (as) => <QuotaMeters titleAs={as} />],
|
|
35
|
+
['CostBreakdown', (as) => <CostBreakdown titleAs={as} />],
|
|
36
|
+
['SpendVsBudget', (as) => <SpendVsBudget titleAs={as} />],
|
|
37
|
+
['PaymentMethodCard', (as) => <PaymentMethodCard titleAs={as} />],
|
|
38
|
+
['TokenCostCard', (as) => <TokenCostCard titleAs={as} />],
|
|
39
|
+
['ModelKeysList', (as) => <ModelKeysList titleAs={as} />],
|
|
40
|
+
['EvaluationScorecard', (as) => <EvaluationScorecard titleAs={as} />],
|
|
41
|
+
['LogViewer', (as) => <LogViewer titleAs={as} />],
|
|
42
|
+
['TraceWaterfall', (as) => <TraceWaterfall titleAs={as} />],
|
|
43
|
+
['PromptEditor', (as) => <PromptEditor titleAs={as} />],
|
|
44
|
+
['AgendaList', (as) => <AgendaList titleAs={as} />],
|
|
45
|
+
['ActivityFeed', (as) => <ActivityFeed groupHeadingAs={as} />],
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
describe('heading levels (titleAs)', () => {
|
|
49
|
+
it.each(cases)('%s renders its title at the requested level', (_name, make) => {
|
|
50
|
+
const { unmount } = render(make('h2'));
|
|
51
|
+
const atTwo = levels();
|
|
52
|
+
expect(atTwo[0]).toBe(2);
|
|
53
|
+
expect(Math.max(...atTwo)).toBeLessThanOrEqual(3); // inner headings follow the title
|
|
54
|
+
unmount();
|
|
55
|
+
render(make('h4'));
|
|
56
|
+
expect(levels()[0]).toBe(4);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('AssistantCardGrid shifts its card names with the section title', () => {
|
|
60
|
+
render(<AssistantCardGrid titleAs="h3" />);
|
|
61
|
+
expect(levels()[0]).toBe(3);
|
|
62
|
+
expect(new Set(levels().slice(1))).toEqual(new Set([4]));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('keeps h3 as the default', () => {
|
|
66
|
+
render(<ChartCard />);
|
|
67
|
+
expect(levels()[0]).toBe(3);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import '@testing-library/jest-dom/vitest';
|
|
2
|
+
import { cleanup } from '@testing-library/react';
|
|
3
|
+
import { afterEach } from 'vitest';
|
|
4
|
+
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
cleanup();
|
|
7
|
+
document.documentElement.className = '';
|
|
8
|
+
try {
|
|
9
|
+
localStorage.clear();
|
|
10
|
+
} catch {}
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
// jsdom gaps that Base UI touches (positioning, animations, media queries).
|
|
14
|
+
if (!window.matchMedia) {
|
|
15
|
+
window.matchMedia = (query: string) =>
|
|
16
|
+
({
|
|
17
|
+
matches: false,
|
|
18
|
+
media: query,
|
|
19
|
+
onchange: null,
|
|
20
|
+
addListener: () => {},
|
|
21
|
+
removeListener: () => {},
|
|
22
|
+
addEventListener: () => {},
|
|
23
|
+
removeEventListener: () => {},
|
|
24
|
+
dispatchEvent: () => false,
|
|
25
|
+
}) as MediaQueryList;
|
|
26
|
+
}
|
|
27
|
+
if (!('ResizeObserver' in window)) {
|
|
28
|
+
(window as unknown as { ResizeObserver: unknown }).ResizeObserver = class {
|
|
29
|
+
observe() {}
|
|
30
|
+
unobserve() {}
|
|
31
|
+
disconnect() {}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (!Element.prototype.getAnimations) {
|
|
35
|
+
Element.prototype.getAnimations = () => [];
|
|
36
|
+
}
|
package/README.md
DELETED