@hjmds/design-contracts 1.20.0 → 1.22.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.
Files changed (131) hide show
  1. package/dist/authoring-tools.d.ts +38 -0
  2. package/dist/authoring-tools.d.ts.map +1 -0
  3. package/dist/authoring-tools.js +35 -0
  4. package/dist/authoring-tools.js.map +1 -0
  5. package/dist/behaviors.d.ts +33 -3
  6. package/dist/behaviors.d.ts.map +1 -1
  7. package/dist/behaviors.js +2 -0
  8. package/dist/behaviors.js.map +1 -1
  9. package/dist/calendar.d.ts +9 -1
  10. package/dist/calendar.d.ts.map +1 -1
  11. package/dist/calendar.js +4 -2
  12. package/dist/calendar.js.map +1 -1
  13. package/dist/catalog.d.ts +129 -2
  14. package/dist/catalog.d.ts.map +1 -1
  15. package/dist/catalog.js +6 -2
  16. package/dist/catalog.js.map +1 -1
  17. package/dist/chart.d.ts +398 -0
  18. package/dist/chart.d.ts.map +1 -0
  19. package/dist/chart.js +414 -0
  20. package/dist/chart.js.map +1 -0
  21. package/dist/collection-editing.d.ts +38 -0
  22. package/dist/collection-editing.d.ts.map +1 -0
  23. package/dist/collection-editing.js +53 -0
  24. package/dist/collection-editing.js.map +1 -0
  25. package/dist/communication.d.ts +29 -0
  26. package/dist/communication.d.ts.map +1 -0
  27. package/dist/communication.js +11 -0
  28. package/dist/communication.js.map +1 -0
  29. package/dist/component-definitions.d.ts +1 -0
  30. package/dist/component-definitions.d.ts.map +1 -1
  31. package/dist/component-definitions.js +1 -0
  32. package/dist/component-definitions.js.map +1 -1
  33. package/dist/data-table.d.ts +229 -5
  34. package/dist/data-table.d.ts.map +1 -1
  35. package/dist/data-table.js +242 -6
  36. package/dist/data-table.js.map +1 -1
  37. package/dist/data-workflows.d.ts +70 -0
  38. package/dist/data-workflows.d.ts.map +1 -0
  39. package/dist/data-workflows.js +109 -0
  40. package/dist/data-workflows.js.map +1 -0
  41. package/dist/dataviz.d.ts +7 -6
  42. package/dist/dataviz.d.ts.map +1 -1
  43. package/dist/dataviz.js +7 -6
  44. package/dist/dataviz.js.map +1 -1
  45. package/dist/gooey-navigation.d.ts +7 -0
  46. package/dist/gooey-navigation.d.ts.map +1 -1
  47. package/dist/gooey-navigation.js +10 -0
  48. package/dist/gooey-navigation.js.map +1 -1
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/media-transport.d.ts +16 -0
  54. package/dist/media-transport.d.ts.map +1 -0
  55. package/dist/media-transport.js +17 -0
  56. package/dist/media-transport.js.map +1 -0
  57. package/dist/recipes.d.ts +1 -0
  58. package/dist/recipes.d.ts.map +1 -1
  59. package/dist/recipes.js +1 -0
  60. package/dist/recipes.js.map +1 -1
  61. package/dist/showcase.d.ts.map +1 -1
  62. package/dist/showcase.js +3 -1
  63. package/dist/showcase.js.map +1 -1
  64. package/dist/social-compositions.d.ts +19 -0
  65. package/dist/social-compositions.d.ts.map +1 -0
  66. package/dist/social-compositions.js +33 -0
  67. package/dist/social-compositions.js.map +1 -0
  68. package/dist/streaming-answer.d.ts +18 -0
  69. package/dist/streaming-answer.d.ts.map +1 -0
  70. package/dist/streaming-answer.js +61 -0
  71. package/dist/streaming-answer.js.map +1 -0
  72. package/dist/task-controls.d.ts +31 -0
  73. package/dist/task-controls.d.ts.map +1 -0
  74. package/dist/task-controls.js +25 -0
  75. package/dist/task-controls.js.map +1 -0
  76. package/dist/toggle-feedback.d.ts +22 -0
  77. package/dist/toggle-feedback.d.ts.map +1 -0
  78. package/dist/toggle-feedback.js +32 -0
  79. package/dist/toggle-feedback.js.map +1 -0
  80. package/dist/transfer-task.d.ts +13 -0
  81. package/dist/transfer-task.d.ts.map +1 -0
  82. package/dist/transfer-task.js +13 -0
  83. package/dist/transfer-task.js.map +1 -0
  84. package/dist/version.d.ts +1 -1
  85. package/dist/version.js +1 -1
  86. package/dist/version.js.map +1 -1
  87. package/docs/authoring-tools.md +31 -0
  88. package/docs/calendar.md +3 -1
  89. package/docs/catalog-freeze.json +5 -0
  90. package/docs/chart.md +206 -0
  91. package/docs/collection-editing.md +83 -0
  92. package/docs/communication.md +35 -0
  93. package/docs/data-table.md +56 -6
  94. package/docs/data-workflows.md +26 -0
  95. package/docs/generated/component-maturity.md +6 -5
  96. package/docs/generated/renderer-evidence.json +95 -5
  97. package/docs/generated/renderer-evidence.md +6 -3
  98. package/docs/generated/showcase-manifest.json +66 -3
  99. package/docs/gooey-navigation.md +20 -0
  100. package/docs/library-gap-analysis.md +4 -2
  101. package/docs/media-transport.md +37 -0
  102. package/docs/social-compositions.md +51 -0
  103. package/docs/streaming-answer.md +57 -0
  104. package/docs/task-controls.md +38 -0
  105. package/docs/toggle-feedback.md +56 -0
  106. package/docs/transfer-task.md +33 -0
  107. package/docs/usage/README.md +15 -4
  108. package/docs/usage/components/activity-chip.md +2 -2
  109. package/docs/usage/components/button.md +39 -0
  110. package/docs/usage/components/calendar.md +4 -2
  111. package/docs/usage/components/chart.md +277 -0
  112. package/docs/usage/components/data-table.md +96 -18
  113. package/docs/usage/components/screen-layout.md +3 -1
  114. package/docs/usage/components/search-screen.md +1 -0
  115. package/docs/usage/components/tabs.md +25 -0
  116. package/docs/usage/components/toast.md +1 -1
  117. package/docs/usage/compositions/action-feedback.md +18 -2
  118. package/docs/usage/compositions/activity-status.md +2 -2
  119. package/docs/usage/compositions/authoring-tools.md +90 -0
  120. package/docs/usage/compositions/collection-editing.md +110 -0
  121. package/docs/usage/compositions/communication.md +100 -0
  122. package/docs/usage/compositions/data-workflows.md +91 -0
  123. package/docs/usage/compositions/media-transport.md +87 -0
  124. package/docs/usage/compositions/social-compositions.md +91 -0
  125. package/docs/usage/compositions/streaming-answer.md +97 -0
  126. package/docs/usage/compositions/task-controls.md +93 -0
  127. package/docs/usage/compositions/toggle-feedback.md +84 -0
  128. package/docs/usage/compositions/transfer-task.md +86 -0
  129. package/docs/usage/compositions/web-additions.md +2 -2
  130. package/docs/usage/screens/common-shell.md +4 -0
  131. package/package.json +67 -1
@@ -1 +1 @@
1
- {"version":3,"file":"showcase.js","sourceRoot":"","sources":["../src/showcase.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n componentCatalog,\n getComponentSurfaceStatus,\n type ComponentCatalogEntry,\n type ComponentStatus,\n type ComponentSurfaceMaturity,\n type ComponentSurfaceStatus,\n} from \"./catalog.js\";\nimport type { BehaviorName } from \"./behaviors.js\";\nimport type { ResolvedTheme } from \"./colors.js\";\nimport type {\n DesignSystemDirection,\n DesignSystemEnvironmentInput,\n DesignSystemTextScale,\n} from \"./design-system-provider.js\";\n\nexport type ShowcaseTheme = ResolvedTheme;\nexport type ShowcaseDirection = DesignSystemDirection;\n/** Closed fixture subset of the Provider's continuous text-scale signal. */\nexport type ShowcaseTextScale = 1 | 1.5 | 2;\nexport type ShowcaseMotionPreference = \"full\" | \"reduced\";\n\nexport type ShowcaseEnvironment = Readonly<{\n id: \"default\" | \"dark\" | \"large-text\" | \"rtl\" | \"reduced-motion\";\n label: string;\n theme: ShowcaseTheme;\n direction: ShowcaseDirection;\n textScale: ShowcaseTextScale;\n motion: ShowcaseMotionPreference;\n}>;\n\n/**\n * A small, deliberate environment matrix catches the high-risk differences\n * without multiplying every story into an unreadable Cartesian product.\n */\nexport const showcaseEnvironmentMatrix = [\n {\n id: \"default\",\n label: \"Light · LTR · 100%\",\n theme: \"light\",\n direction: \"ltr\",\n textScale: 1,\n motion: \"full\",\n },\n {\n id: \"dark\",\n label: \"Dark · LTR · 100%\",\n theme: \"dark\",\n direction: \"ltr\",\n textScale: 1,\n motion: \"full\",\n },\n {\n id: \"large-text\",\n label: \"Light · LTR · 200%\",\n theme: \"light\",\n direction: \"ltr\",\n textScale: 2,\n motion: \"full\",\n },\n {\n id: \"rtl\",\n label: \"Light · RTL · 100%\",\n theme: \"light\",\n direction: \"rtl\",\n textScale: 1,\n motion: \"full\",\n },\n {\n id: \"reduced-motion\",\n label: \"Light · LTR · Reduced motion\",\n theme: \"light\",\n direction: \"ltr\",\n textScale: 1,\n motion: \"reduced\",\n },\n] as const satisfies readonly ShowcaseEnvironment[];\n\n/** Bridges documentation fixtures to the same environment contract products consume. */\nexport function getShowcaseEnvironmentInput(\n environment: ShowcaseEnvironment,\n): DesignSystemEnvironmentInput {\n const textScale: DesignSystemTextScale = environment.textScale;\n return {\n theme: environment.theme,\n direction: environment.direction,\n textScale,\n reducedMotion: environment.motion === \"reduced\",\n };\n}\n\nexport type ShowcaseScenarioId =\n | \"contract\"\n | \"default\"\n | \"dark\"\n | \"long-copy\"\n | \"large-text\"\n | \"rtl\"\n | \"reduced-motion\"\n | \"accessibility\"\n | \"keyboard\"\n | \"native-actions\"\n | \"platform-parity\";\n\nexport type ShowcaseSurface = \"contract\" | \"web\" | \"native\";\n\nexport type ShowcaseScenario = Readonly<{\n id: ShowcaseScenarioId;\n label: string;\n description: string;\n}>;\n\nexport const showcaseScenarios = [\n {\n id: \"contract\",\n label: \"Contract\",\n description: \"Anatomy, defaults, supported axes, platform and maturity are visible.\",\n },\n {\n id: \"default\",\n label: \"Default\",\n description: \"The normal state renders using recipe defaults without product overrides.\",\n },\n {\n id: \"dark\",\n label: \"Dark\",\n description: \"Semantic colors remain legible on the dark theme.\",\n },\n {\n id: \"long-copy\",\n label: \"Long copy\",\n description: \"Long Korean and English copy wraps without clipping or hiding meaning.\",\n },\n {\n id: \"large-text\",\n label: \"200% text\",\n description: \"Text can grow to 200% without truncating required information.\",\n },\n {\n id: \"rtl\",\n label: \"RTL\",\n description: \"Logical start/end layout and directional icons mirror correctly.\",\n },\n {\n id: \"reduced-motion\",\n label: \"Reduced motion\",\n description: \"Motion follows the recipe reduced-motion fallback.\",\n },\n {\n id: \"accessibility\",\n label: \"Accessibility\",\n description: \"Names, states, relationships, contrast and touch targets are inspectable.\",\n },\n {\n id: \"keyboard\",\n label: \"Keyboard\",\n description: \"Focus order and documented keyboard behavior run as interaction tests.\",\n },\n {\n id: \"native-actions\",\n label: \"Native actions\",\n description: \"Accessible host actions and their state transitions run against the Native renderer.\",\n },\n {\n id: \"platform-parity\",\n label: \"Web / Native parity\",\n description: \"Adaptive renderers preserve intent while using platform-native behavior.\",\n },\n] as const satisfies readonly ShowcaseScenario[];\n\nconst plannedRequirements = [\"contract\"] as const satisfies readonly ShowcaseScenarioId[];\nconst rendererRequirements = [\n \"default\",\n \"dark\",\n \"long-copy\",\n \"large-text\",\n \"rtl\",\n \"reduced-motion\",\n \"accessibility\",\n] as const satisfies readonly Exclude<ShowcaseScenarioId, \"contract\">[];\n\nexport type ShowcaseComponentEntry = Readonly<{\n storyId: string;\n component: ComponentCatalogEntry;\n /** Resolved Web/Native renderer maturity, including legacy catalog inputs. */\n surfaceMaturity: ComponentSurfaceMaturity;\n requirements: readonly ShowcaseEvidenceRequirement[];\n requiredScenarios: readonly ShowcaseScenarioId[];\n requiredSurfaces: readonly ShowcaseSurface[];\n}>;\n\nexport type ShowcaseEvidenceRequirement = Readonly<{\n surface: ShowcaseSurface;\n scenarios: readonly ShowcaseScenarioId[];\n}>;\n\nexport type ShowcaseEvidenceEntry = Readonly<{\n storyId: string;\n surface: ShowcaseSurface;\n scenarios: readonly ShowcaseScenarioId[];\n}>;\n\nexport type ShowcaseCoverageEntry = Readonly<{\n storyId: string;\n component: ComponentCatalogEntry;\n missingEvidence: readonly Readonly<{\n surface: ShowcaseSurface;\n scenario: ShowcaseScenarioId;\n }>[];\n missingSurfaces: readonly ShowcaseSurface[];\n missingScenarios: readonly ShowcaseScenarioId[];\n complete: boolean;\n}>;\n\nexport function getShowcaseStoryId(entry: ComponentCatalogEntry): string {\n const slug = entry.name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLowerCase();\n return `${entry.category}/${slug}`;\n}\n\nexport function getRequiredShowcaseScenarios(\n entry: ComponentCatalogEntry,\n): readonly ShowcaseScenarioId[] {\n const activeSurfaces = ([\"web\", \"native\"] as const).filter((surface) =>\n isRendererMaturity(getComponentSurfaceStatus(entry, surface)),\n );\n if (activeSurfaces.length === 0) return plannedRequirements;\n\n const rendererScenarios = [...new Set(activeSurfaces.flatMap((surface) =>\n getRendererShowcaseScenarios(entry, surface),\n ))];\n return [\n \"contract\",\n ...rendererScenarios,\n ];\n}\n\nfunction isRendererMaturity(\n status: ComponentSurfaceStatus,\n): status is Extract<ComponentStatus, \"stable\" | \"beta\"> {\n return status === \"stable\" || status === \"beta\";\n}\n\n// These outputs expose no consumer-authored visible prose; default and accessibility proofs remain required.\nconst textlessComponentNames: ReadonlySet<string> = new Set([\n \"Icon\", \"IconButton\", \"Skeleton\", \"Spinner\", \"ThinkingOrb\", \"Divider\",\n \"Avatar\", \"Asset\", \"CounterBadge\", \"Image\", \"VisuallyHidden\", \"Pagination\",\n // These own form/range behavior but no long-form text slot; their child fields\n // and calendar cells own their copy, so duplicating that proof here misattributes it.\n \"Form\", \"DateRangePicker\",\n]);\n\n// These behaviors expose no interaction on either rendered surface.\nconst semanticOnlyBehaviors: ReadonlySet<NonNullable<ComponentCatalogEntry[\"behavior\"]>> = new Set([\n \"top\", \"authScreen\", \"heading\", \"bottomInfo\", \"nativePlatform\", \"textFormat\", \"asset\",\n]);\n\n// Keep surface capability lookup local: importing behaviorRegistry here would pull every\n// behavior contract into the lightweight showcase/evidence entry points. The alternative was\n// importing that registry; showcase.test.ts cross-checks these names against it to prevent drift.\nconst webKeyboardBehaviors: ReadonlySet<BehaviorName> = new Set([\n \"agreement\", \"alertDialog\", \"anchor\", \"authProviderButton\", \"bottomNavigation\", \"breadcrumb\",\n \"calendar\", \"carousel\", \"checkbox\", \"checkboxGroup\", \"chip\", \"collapsible\", \"combobox\",\n \"commandPalette\", \"contextMenu\", \"dataTable\", \"datePicker\", \"dateRange\", \"dialog\",\n \"disclosureGroup\", \"field\", \"filePicker\", \"floatingActionButton\", \"form\", \"layout\", \"link\",\n \"loadMore\", \"menu\", \"menubar\", \"numberField\", \"otpField\", \"pagination\", \"passwordField\",\n \"popover\", \"radioGroup\", \"searchField\", \"segmentedControl\", \"select\", \"sheet\", \"sidePanel\",\n \"sidebar\", \"skipNav\", \"slider\", \"splitter\", \"switch\", \"tabs\", \"tagsInput\", \"toast\",\n \"toggleGroup\", \"tooltip\", \"tour\", \"transferList\", \"tree\", \"uploadItem\",\n]);\nconst nativeActionBehaviors: ReadonlySet<BehaviorName> = new Set([\n \"agreement\", \"alertDialog\", \"authProviderButton\", \"bottomNavigation\", \"calendar\", \"carousel\",\n \"checkbox\", \"checkboxGroup\", \"chip\", \"collapsible\", \"combobox\", \"datePicker\", \"dateRange\",\n \"dialog\", \"disclosureGroup\", \"field\", \"filePicker\", \"floatingActionButton\", \"form\", \"link\",\n \"loadMore\", \"menu\", \"numberField\", \"otpField\", \"passwordField\", \"radioGroup\", \"searchField\",\n \"segmentedControl\", \"select\", \"sheet\", \"slider\", \"switch\", \"tabs\", \"tagsInput\", \"toast\",\n \"toggleGroup\", \"transferList\", \"uploadItem\",\n]);\n\nfunction getRendererShowcaseScenarios(\n entry: ComponentCatalogEntry,\n surface?: \"web\" | \"native\",\n): readonly Exclude<ShowcaseScenarioId, \"contract\">[] {\n const requirements: Exclude<ShowcaseScenarioId, \"contract\">[] = rendererRequirements.filter(\n (scenario) => scenario !== \"long-copy\" || !textlessComponentNames.has(entry.name),\n );\n // ColorPicker composes native form controls; its text commit/escape behavior still needs real keyboard proof.\n if (entry.name === \"ColorPicker\" && surface === \"web\") requirements.push(\"keyboard\");\n if (entry.behavior && !semanticOnlyBehaviors.has(entry.behavior)) {\n // Web owns DOM key bindings; Native declares host accessibility actions instead, so Pressable tests must not claim physical keyboard proof.\n if (surface === \"web\" && webKeyboardBehaviors.has(entry.behavior)) requirements.push(\"keyboard\");\n if (surface === \"native\" && nativeActionBehaviors.has(entry.behavior)) requirements.push(\"native-actions\");\n }\n return requirements;\n}\n\nexport function getRequiredShowcaseSurfaces(\n entry: ComponentCatalogEntry,\n): readonly ShowcaseSurface[] {\n return getRequiredShowcaseEvidence(entry).map(({ surface }) => surface);\n}\n\nexport function getRequiredShowcaseEvidence(\n entry: ComponentCatalogEntry,\n): readonly ShowcaseEvidenceRequirement[] {\n const requirements: ShowcaseEvidenceRequirement[] = [\n { surface: \"contract\", scenarios: [\"contract\"] },\n ];\n const activeSurfaces = ([\"web\", \"native\"] as const).filter((surface) =>\n isRendererMaturity(getComponentSurfaceStatus(entry, surface)),\n );\n for (const surface of activeSurfaces) {\n requirements.push({ surface, scenarios: getRendererShowcaseScenarios(entry, surface) });\n }\n return requirements;\n}\n\nexport function createShowcaseManifest(\n entries: readonly ComponentCatalogEntry[] = componentCatalog,\n): readonly ShowcaseComponentEntry[] {\n return entries.map((component) => ({\n storyId: getShowcaseStoryId(component),\n component,\n surfaceMaturity: {\n web: getComponentSurfaceStatus(component, \"web\"),\n native: getComponentSurfaceStatus(component, \"native\"),\n },\n requirements: getRequiredShowcaseEvidence(component),\n requiredScenarios: getRequiredShowcaseScenarios(component),\n requiredSurfaces: getRequiredShowcaseSurfaces(component),\n }));\n}\n\nexport const showcaseManifest = createShowcaseManifest();\n\nexport function createShowcaseCoverage(\n evidence: readonly ShowcaseEvidenceEntry[],\n manifest: readonly ShowcaseComponentEntry[] = showcaseManifest,\n): readonly ShowcaseCoverageEntry[] {\n return manifest.map(({ storyId, component, requirements }) => {\n const componentEvidence = evidence.filter((entry) => entry.storyId === storyId);\n const missingEvidence = requirements.flatMap(({ surface, scenarios }) =>\n scenarios\n .filter(\n (scenario) =>\n !componentEvidence.some(\n (entry) => entry.surface === surface && entry.scenarios.includes(scenario),\n ),\n )\n .map((scenario) => ({ surface, scenario })),\n );\n const missingSurfaces = [...new Set(missingEvidence.map(({ surface }) => surface))];\n const missingScenarios = [...new Set(missingEvidence.map(({ scenario }) => scenario))];\n return {\n storyId,\n component,\n missingEvidence,\n missingSurfaces,\n missingScenarios,\n complete: missingSurfaces.length === 0 && missingScenarios.length === 0,\n };\n });\n}\n\nexport function assertShowcaseCoverage(\n evidence: readonly ShowcaseEvidenceEntry[],\n manifest: readonly ShowcaseComponentEntry[] = showcaseManifest,\n): void {\n const missing = createShowcaseCoverage(evidence, manifest).filter(({ complete }) => !complete);\n if (missing.length === 0) return;\n const details = missing\n .map(({ storyId, missingEvidence }) =>\n `${storyId} (${missingEvidence.map(({ surface, scenario }) => `${surface}/${scenario}`).join(\", \") || \"none\"})`,\n )\n .join(\"\\n\");\n throw new Error(`Showcase evidence is incomplete:\\n${details}`);\n}\n\nexport function summarizeShowcaseMaturity(\n entries: readonly ComponentCatalogEntry[] = componentCatalog,\n): Readonly<Record<ComponentStatus, number>> {\n return entries.reduce<Record<ComponentStatus, number>>(\n (summary, entry) => {\n summary[entry.status] += 1;\n return summary;\n },\n { stable: 0, beta: 0, planned: 0, deprecated: 0 },\n );\n}\n"]}
1
+ {"version":3,"file":"showcase.js","sourceRoot":"","sources":["../src/showcase.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n componentCatalog,\n getComponentSurfaceStatus,\n type ComponentCatalogEntry,\n type ComponentStatus,\n type ComponentSurfaceMaturity,\n type ComponentSurfaceStatus,\n} from \"./catalog.js\";\nimport type { BehaviorName } from \"./behaviors.js\";\nimport type { ResolvedTheme } from \"./colors.js\";\nimport type {\n DesignSystemDirection,\n DesignSystemEnvironmentInput,\n DesignSystemTextScale,\n} from \"./design-system-provider.js\";\n\nexport type ShowcaseTheme = ResolvedTheme;\nexport type ShowcaseDirection = DesignSystemDirection;\n/** Closed fixture subset of the Provider's continuous text-scale signal. */\nexport type ShowcaseTextScale = 1 | 1.5 | 2;\nexport type ShowcaseMotionPreference = \"full\" | \"reduced\";\n\nexport type ShowcaseEnvironment = Readonly<{\n id: \"default\" | \"dark\" | \"large-text\" | \"rtl\" | \"reduced-motion\";\n label: string;\n theme: ShowcaseTheme;\n direction: ShowcaseDirection;\n textScale: ShowcaseTextScale;\n motion: ShowcaseMotionPreference;\n}>;\n\n/**\n * A small, deliberate environment matrix catches the high-risk differences\n * without multiplying every story into an unreadable Cartesian product.\n */\nexport const showcaseEnvironmentMatrix = [\n {\n id: \"default\",\n label: \"Light · LTR · 100%\",\n theme: \"light\",\n direction: \"ltr\",\n textScale: 1,\n motion: \"full\",\n },\n {\n id: \"dark\",\n label: \"Dark · LTR · 100%\",\n theme: \"dark\",\n direction: \"ltr\",\n textScale: 1,\n motion: \"full\",\n },\n {\n id: \"large-text\",\n label: \"Light · LTR · 200%\",\n theme: \"light\",\n direction: \"ltr\",\n textScale: 2,\n motion: \"full\",\n },\n {\n id: \"rtl\",\n label: \"Light · RTL · 100%\",\n theme: \"light\",\n direction: \"rtl\",\n textScale: 1,\n motion: \"full\",\n },\n {\n id: \"reduced-motion\",\n label: \"Light · LTR · Reduced motion\",\n theme: \"light\",\n direction: \"ltr\",\n textScale: 1,\n motion: \"reduced\",\n },\n] as const satisfies readonly ShowcaseEnvironment[];\n\n/** Bridges documentation fixtures to the same environment contract products consume. */\nexport function getShowcaseEnvironmentInput(\n environment: ShowcaseEnvironment,\n): DesignSystemEnvironmentInput {\n const textScale: DesignSystemTextScale = environment.textScale;\n return {\n theme: environment.theme,\n direction: environment.direction,\n textScale,\n reducedMotion: environment.motion === \"reduced\",\n };\n}\n\nexport type ShowcaseScenarioId =\n | \"contract\"\n | \"default\"\n | \"dark\"\n | \"long-copy\"\n | \"large-text\"\n | \"rtl\"\n | \"reduced-motion\"\n | \"accessibility\"\n | \"keyboard\"\n | \"native-actions\"\n | \"platform-parity\";\n\nexport type ShowcaseSurface = \"contract\" | \"web\" | \"native\";\n\nexport type ShowcaseScenario = Readonly<{\n id: ShowcaseScenarioId;\n label: string;\n description: string;\n}>;\n\nexport const showcaseScenarios = [\n {\n id: \"contract\",\n label: \"Contract\",\n description: \"Anatomy, defaults, supported axes, platform and maturity are visible.\",\n },\n {\n id: \"default\",\n label: \"Default\",\n description: \"The normal state renders using recipe defaults without product overrides.\",\n },\n {\n id: \"dark\",\n label: \"Dark\",\n description: \"Semantic colors remain legible on the dark theme.\",\n },\n {\n id: \"long-copy\",\n label: \"Long copy\",\n description: \"Long Korean and English copy wraps without clipping or hiding meaning.\",\n },\n {\n id: \"large-text\",\n label: \"200% text\",\n description: \"Text can grow to 200% without truncating required information.\",\n },\n {\n id: \"rtl\",\n label: \"RTL\",\n description: \"Logical start/end layout and directional icons mirror correctly.\",\n },\n {\n id: \"reduced-motion\",\n label: \"Reduced motion\",\n description: \"Motion follows the recipe reduced-motion fallback.\",\n },\n {\n id: \"accessibility\",\n label: \"Accessibility\",\n description: \"Names, states, relationships, contrast and touch targets are inspectable.\",\n },\n {\n id: \"keyboard\",\n label: \"Keyboard\",\n description: \"Focus order and documented keyboard behavior run as interaction tests.\",\n },\n {\n id: \"native-actions\",\n label: \"Native actions\",\n description: \"Accessible host actions and their state transitions run against the Native renderer.\",\n },\n {\n id: \"platform-parity\",\n label: \"Web / Native parity\",\n description: \"Adaptive renderers preserve intent while using platform-native behavior.\",\n },\n] as const satisfies readonly ShowcaseScenario[];\n\nconst plannedRequirements = [\"contract\"] as const satisfies readonly ShowcaseScenarioId[];\nconst rendererRequirements = [\n \"default\",\n \"dark\",\n \"long-copy\",\n \"large-text\",\n \"rtl\",\n \"reduced-motion\",\n \"accessibility\",\n] as const satisfies readonly Exclude<ShowcaseScenarioId, \"contract\">[];\n\nexport type ShowcaseComponentEntry = Readonly<{\n storyId: string;\n component: ComponentCatalogEntry;\n /** Resolved Web/Native renderer maturity, including legacy catalog inputs. */\n surfaceMaturity: ComponentSurfaceMaturity;\n requirements: readonly ShowcaseEvidenceRequirement[];\n requiredScenarios: readonly ShowcaseScenarioId[];\n requiredSurfaces: readonly ShowcaseSurface[];\n}>;\n\nexport type ShowcaseEvidenceRequirement = Readonly<{\n surface: ShowcaseSurface;\n scenarios: readonly ShowcaseScenarioId[];\n}>;\n\nexport type ShowcaseEvidenceEntry = Readonly<{\n storyId: string;\n surface: ShowcaseSurface;\n scenarios: readonly ShowcaseScenarioId[];\n}>;\n\nexport type ShowcaseCoverageEntry = Readonly<{\n storyId: string;\n component: ComponentCatalogEntry;\n missingEvidence: readonly Readonly<{\n surface: ShowcaseSurface;\n scenario: ShowcaseScenarioId;\n }>[];\n missingSurfaces: readonly ShowcaseSurface[];\n missingScenarios: readonly ShowcaseScenarioId[];\n complete: boolean;\n}>;\n\nexport function getShowcaseStoryId(entry: ComponentCatalogEntry): string {\n const slug = entry.name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLowerCase();\n return `${entry.category}/${slug}`;\n}\n\nexport function getRequiredShowcaseScenarios(\n entry: ComponentCatalogEntry,\n): readonly ShowcaseScenarioId[] {\n const activeSurfaces = ([\"web\", \"native\"] as const).filter((surface) =>\n isRendererMaturity(getComponentSurfaceStatus(entry, surface)),\n );\n if (activeSurfaces.length === 0) return plannedRequirements;\n\n const rendererScenarios = [...new Set(activeSurfaces.flatMap((surface) =>\n getRendererShowcaseScenarios(entry, surface),\n ))];\n return [\n \"contract\",\n ...rendererScenarios,\n ];\n}\n\nfunction isRendererMaturity(\n status: ComponentSurfaceStatus,\n): status is Extract<ComponentStatus, \"stable\" | \"beta\"> {\n return status === \"stable\" || status === \"beta\";\n}\n\n// These outputs expose no consumer-authored visible prose; default and accessibility proofs remain required.\nconst textlessComponentNames: ReadonlySet<string> = new Set([\n \"Icon\", \"IconButton\", \"Skeleton\", \"Spinner\", \"ThinkingOrb\", \"Divider\",\n \"Avatar\", \"Asset\", \"CounterBadge\", \"Image\", \"VisuallyHidden\", \"Pagination\",\n // These own form/range behavior but no long-form text slot; their child fields\n // and calendar cells own their copy, so duplicating that proof here misattributes it.\n \"Form\", \"DateRangePicker\",\n]);\n\n// These behaviors expose no interaction on either rendered surface.\nconst semanticOnlyBehaviors: ReadonlySet<NonNullable<ComponentCatalogEntry[\"behavior\"]>> = new Set([\n \"top\", \"authScreen\", \"heading\", \"bottomInfo\", \"nativePlatform\", \"textFormat\", \"asset\",\n]);\n\n// Keep surface capability lookup local: importing behaviorRegistry here would pull every\n// behavior contract into the lightweight showcase/evidence entry points. The alternative was\n// importing that registry; showcase.test.ts cross-checks these names against it to prevent drift.\nconst webKeyboardBehaviors: ReadonlySet<BehaviorName> = new Set([\n \"agreement\", \"alertDialog\", \"anchor\", \"authProviderButton\", \"bottomNavigation\", \"breadcrumb\",\n \"calendar\", \"carousel\", \"chart\", \"checkbox\", \"checkboxGroup\", \"chip\", \"collapsible\", \"combobox\",\n \"commandPalette\", \"contextMenu\", \"dataTable\", \"datePicker\", \"dateRange\", \"dialog\",\n \"disclosureGroup\", \"field\", \"filePicker\", \"floatingActionButton\", \"form\", \"layout\", \"link\",\n \"loadMore\", \"menu\", \"menubar\", \"numberField\", \"otpField\", \"pagination\", \"passwordField\",\n \"popover\", \"radioGroup\", \"searchField\", \"segmentedControl\", \"select\", \"sheet\", \"sidePanel\",\n \"sidebar\", \"skipNav\", \"slider\", \"splitter\", \"switch\", \"tabs\", \"tagsInput\", \"toast\",\n \"toggleGroup\", \"tooltip\", \"tour\", \"transferList\", \"tree\", \"uploadItem\",\n]);\nconst nativeActionBehaviors: ReadonlySet<BehaviorName> = new Set([\n \"agreement\", \"alertDialog\", \"authProviderButton\", \"bottomNavigation\", \"calendar\", \"carousel\",\n \"checkbox\", \"checkboxGroup\", \"chip\", \"collapsible\", \"combobox\", \"datePicker\", \"dateRange\",\n \"dialog\", \"disclosureGroup\", \"field\", \"filePicker\", \"floatingActionButton\", \"form\", \"link\",\n \"loadMore\", \"menu\", \"numberField\", \"otpField\", \"passwordField\", \"radioGroup\", \"searchField\",\n \"segmentedControl\", \"select\", \"sheet\", \"slider\", \"switch\", \"tabs\", \"tagsInput\", \"toast\",\n \"toggleGroup\", \"transferList\", \"uploadItem\",\n // 2026-10-14: Native DataTable sort/row actions and chart adjustable stepping.\n \"dataTable\", \"chart\",\n]);\n\nfunction getRendererShowcaseScenarios(\n entry: ComponentCatalogEntry,\n surface?: \"web\" | \"native\",\n): readonly Exclude<ShowcaseScenarioId, \"contract\">[] {\n const requirements: Exclude<ShowcaseScenarioId, \"contract\">[] = rendererRequirements.filter(\n (scenario) => scenario !== \"long-copy\" || !textlessComponentNames.has(entry.name),\n );\n // ColorPicker composes native form controls; its text commit/escape behavior still needs real keyboard proof.\n if (entry.name === \"ColorPicker\" && surface === \"web\") requirements.push(\"keyboard\");\n if (entry.behavior && !semanticOnlyBehaviors.has(entry.behavior)) {\n // Web owns DOM key bindings; Native declares host accessibility actions instead, so Pressable tests must not claim physical keyboard proof.\n if (surface === \"web\" && webKeyboardBehaviors.has(entry.behavior)) requirements.push(\"keyboard\");\n if (surface === \"native\" && nativeActionBehaviors.has(entry.behavior)) requirements.push(\"native-actions\");\n }\n return requirements;\n}\n\nexport function getRequiredShowcaseSurfaces(\n entry: ComponentCatalogEntry,\n): readonly ShowcaseSurface[] {\n return getRequiredShowcaseEvidence(entry).map(({ surface }) => surface);\n}\n\nexport function getRequiredShowcaseEvidence(\n entry: ComponentCatalogEntry,\n): readonly ShowcaseEvidenceRequirement[] {\n const requirements: ShowcaseEvidenceRequirement[] = [\n { surface: \"contract\", scenarios: [\"contract\"] },\n ];\n const activeSurfaces = ([\"web\", \"native\"] as const).filter((surface) =>\n isRendererMaturity(getComponentSurfaceStatus(entry, surface)),\n );\n for (const surface of activeSurfaces) {\n requirements.push({ surface, scenarios: getRendererShowcaseScenarios(entry, surface) });\n }\n return requirements;\n}\n\nexport function createShowcaseManifest(\n entries: readonly ComponentCatalogEntry[] = componentCatalog,\n): readonly ShowcaseComponentEntry[] {\n return entries.map((component) => ({\n storyId: getShowcaseStoryId(component),\n component,\n surfaceMaturity: {\n web: getComponentSurfaceStatus(component, \"web\"),\n native: getComponentSurfaceStatus(component, \"native\"),\n },\n requirements: getRequiredShowcaseEvidence(component),\n requiredScenarios: getRequiredShowcaseScenarios(component),\n requiredSurfaces: getRequiredShowcaseSurfaces(component),\n }));\n}\n\nexport const showcaseManifest = createShowcaseManifest();\n\nexport function createShowcaseCoverage(\n evidence: readonly ShowcaseEvidenceEntry[],\n manifest: readonly ShowcaseComponentEntry[] = showcaseManifest,\n): readonly ShowcaseCoverageEntry[] {\n return manifest.map(({ storyId, component, requirements }) => {\n const componentEvidence = evidence.filter((entry) => entry.storyId === storyId);\n const missingEvidence = requirements.flatMap(({ surface, scenarios }) =>\n scenarios\n .filter(\n (scenario) =>\n !componentEvidence.some(\n (entry) => entry.surface === surface && entry.scenarios.includes(scenario),\n ),\n )\n .map((scenario) => ({ surface, scenario })),\n );\n const missingSurfaces = [...new Set(missingEvidence.map(({ surface }) => surface))];\n const missingScenarios = [...new Set(missingEvidence.map(({ scenario }) => scenario))];\n return {\n storyId,\n component,\n missingEvidence,\n missingSurfaces,\n missingScenarios,\n complete: missingSurfaces.length === 0 && missingScenarios.length === 0,\n };\n });\n}\n\nexport function assertShowcaseCoverage(\n evidence: readonly ShowcaseEvidenceEntry[],\n manifest: readonly ShowcaseComponentEntry[] = showcaseManifest,\n): void {\n const missing = createShowcaseCoverage(evidence, manifest).filter(({ complete }) => !complete);\n if (missing.length === 0) return;\n const details = missing\n .map(({ storyId, missingEvidence }) =>\n `${storyId} (${missingEvidence.map(({ surface, scenario }) => `${surface}/${scenario}`).join(\", \") || \"none\"})`,\n )\n .join(\"\\n\");\n throw new Error(`Showcase evidence is incomplete:\\n${details}`);\n}\n\nexport function summarizeShowcaseMaturity(\n entries: readonly ComponentCatalogEntry[] = componentCatalog,\n): Readonly<Record<ComponentStatus, number>> {\n return entries.reduce<Record<ComponentStatus, number>>(\n (summary, entry) => {\n summary[entry.status] += 1;\n return summary;\n },\n { stable: 0, beta: 0, planned: 0, deprecated: 0 },\n );\n}\n"]}
@@ -0,0 +1,19 @@
1
+ /** Product-confirmed counts. No network, authentication or persistence lives here. */
2
+ export type FollowProfileState = Readonly<{
3
+ following: boolean;
4
+ count: number;
5
+ }>;
6
+ export type AttendanceChoice = Readonly<{
7
+ id: string;
8
+ label: string;
9
+ attending: boolean;
10
+ disabled?: boolean;
11
+ }>;
12
+ export type EventAttendanceState = Readonly<{
13
+ responseId: string | null;
14
+ count: number;
15
+ }>;
16
+ export declare function resolveFollowProposal(state: FollowProfileState, following: boolean): FollowProfileState;
17
+ export declare function resolveAttendanceChoice(choices: readonly AttendanceChoice[], id: string | null): AttendanceChoice | undefined;
18
+ export declare function resolveAttendanceProposal(state: EventAttendanceState, choices: readonly AttendanceChoice[], responseId: string | null): EventAttendanceState;
19
+ //# sourceMappingURL=social-compositions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-compositions.d.ts","sourceRoot":"","sources":["../src/social-compositions.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACjF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC/G,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAK1F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,GAAG,kBAAkB,CAIvG;AACD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB,GAAG,SAAS,CAU7H;AACD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,oBAAoB,CAK5J"}
@@ -0,0 +1,33 @@
1
+ function count(value) {
2
+ if (!Number.isSafeInteger(value) || value < 0)
3
+ throw new RangeError("Social counts must be nonnegative safe integers");
4
+ return value;
5
+ }
6
+ export function resolveFollowProposal(state, following) {
7
+ count(state.count);
8
+ if (state.following && state.count === 0)
9
+ throw new RangeError("A followed profile must include this follower in its count");
10
+ return Object.freeze({ following, count: count(state.count + Number(following) - Number(state.following)) });
11
+ }
12
+ export function resolveAttendanceChoice(choices, id) {
13
+ const ids = new Set();
14
+ for (const choice of choices) {
15
+ if (!choice.id.trim() || ids.has(choice.id))
16
+ throw new TypeError("Attendance choices need distinct nonempty ids");
17
+ ids.add(choice.id);
18
+ }
19
+ if (choices.length === 0)
20
+ throw new TypeError("Attendance choices must not be empty");
21
+ const choice = choices.find(choice => choice.id === id);
22
+ if (id !== null && !choice)
23
+ throw new TypeError("Unknown attendance response");
24
+ return choice;
25
+ }
26
+ export function resolveAttendanceProposal(state, choices, responseId) {
27
+ count(state.count);
28
+ const previous = resolveAttendanceChoice(choices, state.responseId), next = resolveAttendanceChoice(choices, responseId);
29
+ if (previous?.attending && state.count === 0)
30
+ throw new RangeError("An attending response must include this attendee in its count");
31
+ return Object.freeze({ responseId, count: count(state.count + Number(next?.attending === true) - Number(previous?.attending === true)) });
32
+ }
33
+ //# sourceMappingURL=social-compositions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-compositions.js","sourceRoot":"","sources":["../src/social-compositions.ts"],"names":[],"mappings":"AAIA,SAAS,KAAK,CAAC,KAAa;IAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,iDAAiD,CAAC,CAAC;IACvH,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,KAAyB,EAAE,SAAkB;IACjF,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4DAA4D,CAAC,CAAC;IAC7H,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/G,CAAC;AACD,MAAM,UAAU,uBAAuB,CAAC,OAAoC,EAAE,EAAiB;IAC7F,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;QAClH,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,yBAAyB,CAAC,KAA2B,EAAE,OAAoC,EAAE,UAAyB;IACpI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACzH,IAAI,QAAQ,EAAE,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,+DAA+D,CAAC,CAAC;IACpI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5I,CAAC","sourcesContent":["/** Product-confirmed counts. No network, authentication or persistence lives here. */\nexport type FollowProfileState = Readonly<{ following: boolean; count: number }>;\nexport type AttendanceChoice = Readonly<{ id: string; label: string; attending: boolean; disabled?: boolean }>;\nexport type EventAttendanceState = Readonly<{ responseId: string | null; count: number }>;\nfunction count(value: number) {\n if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(\"Social counts must be nonnegative safe integers\");\n return value;\n}\nexport function resolveFollowProposal(state: FollowProfileState, following: boolean): FollowProfileState {\n count(state.count);\n if (state.following && state.count === 0) throw new RangeError(\"A followed profile must include this follower in its count\");\n return Object.freeze({ following, count: count(state.count + Number(following) - Number(state.following)) });\n}\nexport function resolveAttendanceChoice(choices: readonly AttendanceChoice[], id: string | null): AttendanceChoice | undefined {\n const ids = new Set<string>();\n for (const choice of choices) {\n if (!choice.id.trim() || ids.has(choice.id)) throw new TypeError(\"Attendance choices need distinct nonempty ids\");\n ids.add(choice.id);\n }\n if (choices.length === 0) throw new TypeError(\"Attendance choices must not be empty\");\n const choice = choices.find(choice => choice.id === id);\n if (id !== null && !choice) throw new TypeError(\"Unknown attendance response\");\n return choice;\n}\nexport function resolveAttendanceProposal(state: EventAttendanceState, choices: readonly AttendanceChoice[], responseId: string | null): EventAttendanceState {\n count(state.count);\n const previous = resolveAttendanceChoice(choices, state.responseId), next = resolveAttendanceChoice(choices, responseId);\n if (previous?.attending && state.count === 0) throw new RangeError(\"An attending response must include this attendee in its count\");\n return Object.freeze({ responseId, count: count(state.count + Number(next?.attending === true) - Number(previous?.attending === true)) });\n}\n"]}
@@ -0,0 +1,18 @@
1
+ export type AnswerStreamEvent = Readonly<{
2
+ type: "delta";
3
+ text: string;
4
+ }> | Readonly<{
5
+ type: "done";
6
+ }>;
7
+ export type AnswerStreamResult = Readonly<{
8
+ phase: "complete" | "stopped";
9
+ text: string;
10
+ }>;
11
+ export type AnswerGenerationContext = Readonly<{
12
+ signal: AbortSignal;
13
+ previousText: string;
14
+ regenerate: boolean;
15
+ }>;
16
+ /** Consume actual provider events, never a timer or character-replay queue. */
17
+ export declare function consumeAnswerStream(source: AsyncIterable<AnswerStreamEvent>, signal: AbortSignal, previousText: string, report: (text: string) => void): Promise<AnswerStreamResult>;
18
+ //# sourceMappingURL=streaming-answer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-answer.d.ts","sourceRoot":"","sources":["../src/streaming-answer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACvG,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC3F,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAOnH,+EAA+E;AAC/E,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwB1L"}
@@ -0,0 +1,61 @@
1
+ async function closeIterator(iterator) {
2
+ if (!iterator.return)
3
+ return;
4
+ // Async generators can yield from finally; return() alone is not a closed-stream acknowledgement.
5
+ let result = await iterator.return();
6
+ while (!result.done)
7
+ result = await iterator.next();
8
+ }
9
+ /** Consume actual provider events, never a timer or character-replay queue. */
10
+ export async function consumeAnswerStream(source, signal, previousText, report) {
11
+ const iterator = source[Symbol.asyncIterator]();
12
+ let text = previousText, received = false, ended = false;
13
+ try {
14
+ while (true) {
15
+ // A provider must connect signal to its transport. return() acknowledges early stream closure.
16
+ if (signal.aborted && iterator.return) {
17
+ await closeIterator(iterator);
18
+ ended = true;
19
+ return { phase: "stopped", text };
20
+ }
21
+ const next = await iterator.next();
22
+ if (next.done) {
23
+ ended = true;
24
+ if (signal.aborted)
25
+ return { phase: "stopped", text };
26
+ throw new Error("Answer stream ended without its provider completion event");
27
+ }
28
+ if (next.value.type === "done")
29
+ return { phase: "complete", text: received ? text : "" };
30
+ if (signal.aborted)
31
+ continue;
32
+ if (next.value.type !== "delta" || typeof next.value.text !== "string")
33
+ throw new TypeError("Invalid answer stream event");
34
+ if (!next.value.text)
35
+ continue;
36
+ if (!received) {
37
+ text = "";
38
+ received = true;
39
+ }
40
+ text += next.value.text;
41
+ report(text);
42
+ }
43
+ }
44
+ catch (error) {
45
+ if (signal.aborted && error && typeof error === "object" && "name" in error && error.name === "AbortError")
46
+ return { phase: "stopped", text };
47
+ throw error;
48
+ }
49
+ finally {
50
+ if (!ended) {
51
+ try {
52
+ await closeIterator(iterator);
53
+ }
54
+ catch (error) {
55
+ if (!(signal.aborted && error && typeof error === "object" && "name" in error && error.name === "AbortError"))
56
+ throw error;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=streaming-answer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-answer.js","sourceRoot":"","sources":["../src/streaming-answer.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,aAAa,CAAC,QAA0C;IACrE,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO;IAC7B,kGAAkG;IAClG,IAAI,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,IAAI;QAAE,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AACD,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAwC,EAAE,MAAmB,EAAE,YAAoB,EAAE,MAA8B;IAC3J,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAAC,IAAI,IAAI,GAAG,YAAY,EAAE,QAAQ,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC;IAC1G,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,+FAA+F;YAC/F,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC;gBAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAAC,CAAC;YAC1H,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC;gBAAC,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAAC,CAAC;YACrK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACzF,IAAI,MAAM,CAAC,OAAO;gBAAE,SAAS;YAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAC3H,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,SAAS;YAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,IAAI,GAAG,EAAE,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC;YAAC,CAAC;YAC9C,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC9I,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC;gBAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YACtC,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;oBAAE,MAAM,KAAK,CAAC;YAAC,CAAC;QAC/I,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["export type AnswerStreamEvent = Readonly<{ type: \"delta\"; text: string }> | Readonly<{ type: \"done\" }>;\nexport type AnswerStreamResult = Readonly<{ phase: \"complete\" | \"stopped\"; text: string }>;\nexport type AnswerGenerationContext = Readonly<{ signal: AbortSignal; previousText: string; regenerate: boolean }>;\nasync function closeIterator(iterator: AsyncIterator<AnswerStreamEvent>) {\n if (!iterator.return) return;\n // Async generators can yield from finally; return() alone is not a closed-stream acknowledgement.\n let result = await iterator.return();\n while (!result.done) result = await iterator.next();\n}\n/** Consume actual provider events, never a timer or character-replay queue. */\nexport async function consumeAnswerStream(source: AsyncIterable<AnswerStreamEvent>, signal: AbortSignal, previousText: string, report: (text: string) => void): Promise<AnswerStreamResult> {\n const iterator = source[Symbol.asyncIterator](); let text = previousText, received = false, ended = false;\n try {\n while (true) {\n // A provider must connect signal to its transport. return() acknowledges early stream closure.\n if (signal.aborted && iterator.return) { await closeIterator(iterator); ended = true; return { phase: \"stopped\", text }; }\n const next = await iterator.next();\n if (next.done) { ended = true; if (signal.aborted) return { phase: \"stopped\", text }; throw new Error(\"Answer stream ended without its provider completion event\"); }\n if (next.value.type === \"done\") return { phase: \"complete\", text: received ? text : \"\" };\n if (signal.aborted) continue;\n if (next.value.type !== \"delta\" || typeof next.value.text !== \"string\") throw new TypeError(\"Invalid answer stream event\");\n if (!next.value.text) continue;\n if (!received) { text = \"\"; received = true; }\n text += next.value.text; report(text);\n }\n } catch (error) {\n if (signal.aborted && error && typeof error === \"object\" && \"name\" in error && error.name === \"AbortError\") return { phase: \"stopped\", text };\n throw error;\n } finally {\n if (!ended) {\n try { await closeIterator(iterator); }\n catch (error) { if (!(signal.aborted && error && typeof error === \"object\" && \"name\" in error && error.name === \"AbortError\")) throw error; }\n }\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ export type TaskChoice = Readonly<{
2
+ id: string;
3
+ label: string;
4
+ description?: string;
5
+ disabled?: boolean;
6
+ }>;
7
+ export declare function resolveTaskChoice<T extends TaskChoice>(choices: readonly T[], selectedId: string): T;
8
+ export type PasswordRule = Readonly<{
9
+ id: string;
10
+ label: string;
11
+ test: (value: string) => boolean;
12
+ }>;
13
+ /** Counts supplied requirements only; entropy and password security are not inferred. */
14
+ export declare function resolvePasswordRules(value: string, rules: readonly PasswordRule[]): {
15
+ rules: {
16
+ id: string;
17
+ label: string;
18
+ satisfied: boolean;
19
+ }[];
20
+ satisfied: number;
21
+ total: number;
22
+ };
23
+ export type PriceOption = TaskChoice & Readonly<{
24
+ amountMinor: number;
25
+ currency: string;
26
+ interval: "month" | "year";
27
+ intervalCount: number;
28
+ benefits: readonly string[];
29
+ }>;
30
+ export declare function resolvePriceOption(options: readonly PriceOption[], selectedId: string): PriceOption;
31
+ //# sourceMappingURL=task-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-controls.d.ts","sourceRoot":"","sources":["../src/task-controls.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC3G,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAKpG;AACD,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,CAAC,CAAC;AACrG,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE;;;;;;;;EAKjF;AACD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAC3K,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,eAMrF"}
@@ -0,0 +1,25 @@
1
+ import { assertDistinctIds } from "./collection-editing.js";
2
+ export function resolveTaskChoice(choices, selectedId) {
3
+ assertDistinctIds(choices);
4
+ const selected = choices.find(choice => choice.id === selectedId);
5
+ if (!selected)
6
+ throw new TypeError("The selected choice must exist");
7
+ return selected;
8
+ }
9
+ /** Counts supplied requirements only; entropy and password security are not inferred. */
10
+ export function resolvePasswordRules(value, rules) {
11
+ assertDistinctIds(rules);
12
+ if (!rules.length)
13
+ throw new TypeError("Password rules must not be empty");
14
+ const results = rules.map(rule => ({ id: rule.id, label: rule.label, satisfied: rule.test(value) }));
15
+ return { rules: results, satisfied: results.filter(rule => rule.satisfied).length, total: results.length };
16
+ }
17
+ export function resolvePriceOption(options, selectedId) {
18
+ const selected = resolveTaskChoice(options, selectedId);
19
+ for (const option of options) {
20
+ if (!Number.isSafeInteger(option.amountMinor) || option.amountMinor < 0 || !/^[A-Z]{3}$/.test(option.currency) || !Number.isSafeInteger(option.intervalCount) || option.intervalCount < 1 || !["month", "year"].includes(option.interval))
21
+ throw new RangeError("Price options require actual minor-unit amounts, currency and billing periods");
22
+ }
23
+ return selected;
24
+ }
25
+ //# sourceMappingURL=task-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-controls.js","sourceRoot":"","sources":["../src/task-controls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,UAAU,iBAAiB,CAAuB,OAAqB,EAAE,UAAkB;IAC/F,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAA8B;IAChF,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA+B,EAAE,UAAkB;IACpF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,+EAA+E,CAAC,CAAC;IACnV,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { assertDistinctIds } from \"./collection-editing.js\";\nexport type TaskChoice = Readonly<{ id: string; label: string; description?: string; disabled?: boolean }>;\nexport function resolveTaskChoice<T extends TaskChoice>(choices: readonly T[], selectedId: string): T {\n assertDistinctIds(choices);\n const selected = choices.find(choice => choice.id === selectedId);\n if (!selected) throw new TypeError(\"The selected choice must exist\");\n return selected;\n}\nexport type PasswordRule = Readonly<{ id: string; label: string; test: (value: string) => boolean }>;\n/** Counts supplied requirements only; entropy and password security are not inferred. */\nexport function resolvePasswordRules(value: string, rules: readonly PasswordRule[]) {\n assertDistinctIds(rules);\n if (!rules.length) throw new TypeError(\"Password rules must not be empty\");\n const results = rules.map(rule => ({ id: rule.id, label: rule.label, satisfied: rule.test(value) }));\n return { rules: results, satisfied: results.filter(rule => rule.satisfied).length, total: results.length };\n}\nexport type PriceOption = TaskChoice & Readonly<{ amountMinor: number; currency: string; interval: \"month\" | \"year\"; intervalCount: number; benefits: readonly string[] }>;\nexport function resolvePriceOption(options: readonly PriceOption[], selectedId: string) {\n const selected = resolveTaskChoice(options, selectedId);\n for (const option of options) {\n if (!Number.isSafeInteger(option.amountMinor) || option.amountMinor < 0 || !/^[A-Z]{3}$/.test(option.currency) || !Number.isSafeInteger(option.intervalCount) || option.intervalCount < 1 || ![\"month\", \"year\"].includes(option.interval)) throw new RangeError(\"Price options require actual minor-unit amounts, currency and billing periods\");\n }\n return selected;\n}\n"]}
@@ -0,0 +1,22 @@
1
+ export type ToggleFeedbackEffect = "ripple" | "ribbon" | "burst";
2
+ export type ToggleFeedbackState = Readonly<{
3
+ selected: boolean;
4
+ count: number;
5
+ }>;
6
+ /** The product confirms the resulting count; this immutable proposal is pending feedback only. */
7
+ export declare function resolveToggleFeedbackProposal(state: ToggleFeedbackState, selected: boolean): ToggleFeedbackState;
8
+ export declare const toggleFeedbackRecipe: {
9
+ readonly duration: 320;
10
+ readonly glyphSize: 24;
11
+ readonly effectSize: 40;
12
+ };
13
+ export declare const toggleFeedbackPaths: Readonly<Record<ToggleFeedbackEffect, string>>;
14
+ /** Host geometry only, never product state or a timer-driven counter. p=1 clears every transient. */
15
+ export declare function resolveToggleFeedbackFrame(effect: ToggleFeedbackEffect, progress: number): Readonly<{
16
+ radius: number;
17
+ opacity: number;
18
+ rays: string;
19
+ translateY: number;
20
+ scale: number;
21
+ }>;
22
+ //# sourceMappingURL=toggle-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-feedback.d.ts","sourceRoot":"","sources":["../src/toggle-feedback.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AACjE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACjF,kGAAkG;AAClG,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,GAAG,mBAAmB,CAKhH;AACD,eAAO,MAAM,oBAAoB;;;;CAAoE,CAAC;AACtG,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAI9E,CAAC;AACF,qGAAqG;AACrG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM;;;;;;GAWxF"}
@@ -0,0 +1,32 @@
1
+ import { motion } from "./foundations.js";
2
+ /** The product confirms the resulting count; this immutable proposal is pending feedback only. */
3
+ export function resolveToggleFeedbackProposal(state, selected) {
4
+ if (!Number.isSafeInteger(state.count) || state.count < 0 || (state.selected && state.count === 0))
5
+ throw new RangeError("Invalid confirmed selection count");
6
+ const count = state.count + Number(selected) - Number(state.selected);
7
+ if (!Number.isSafeInteger(count) || count < 0)
8
+ throw new RangeError("Invalid proposed selection count");
9
+ return Object.freeze({ selected, count });
10
+ }
11
+ export const toggleFeedbackRecipe = { duration: motion.slow, glyphSize: 24, effectSize: 40 };
12
+ export const toggleFeedbackPaths = {
13
+ ripple: "M6 10C6 2 18 2 18 10V15L20 18H4L6 15ZM9 21H15",
14
+ ribbon: "M6 3H18V21L12 17L6 21Z",
15
+ burst: "M12 21L3.8 12.8C-2 7 6 0 12 7C18 0 26 7 20.2 12.8Z",
16
+ };
17
+ /** Host geometry only, never product state or a timer-driven counter. p=1 clears every transient. */
18
+ export function resolveToggleFeedbackFrame(effect, progress) {
19
+ if (!Object.hasOwn(toggleFeedbackPaths, effect))
20
+ throw new TypeError("Unknown toggle feedback effect");
21
+ if (!Number.isFinite(progress))
22
+ throw new TypeError("Feedback progress must be finite");
23
+ const p = Math.min(1, Math.max(0, progress)), opacity = 1 - p;
24
+ const rays = Array.from({ length: 8 }, (_, index) => {
25
+ const a = index * Math.PI / 4, inner = 9 + 7 * p, outer = 12 + 7 * p;
26
+ return `M${20 + Math.cos(a) * inner} ${20 + Math.sin(a) * inner}L${20 + Math.cos(a) * outer} ${20 + Math.sin(a) * outer}`;
27
+ }).join(" ");
28
+ const pulse = p === 1 ? 0 : Math.sin(Math.PI * p);
29
+ return Object.freeze({ radius: 2 + p * 16, opacity: effect === "ribbon" ? 0 : opacity,
30
+ rays, translateY: effect === "ribbon" && pulse !== 0 ? -6 * pulse : 0, scale: effect === "ripple" ? 1 : 1 + .12 * pulse });
31
+ }
32
+ //# sourceMappingURL=toggle-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-feedback.js","sourceRoot":"","sources":["../src/toggle-feedback.ts"],"names":[],"mappings":"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","sourcesContent":["import { motion } from \"./foundations.js\";\nexport type ToggleFeedbackEffect = \"ripple\" | \"ribbon\" | \"burst\";\nexport type ToggleFeedbackState = Readonly<{ selected: boolean; count: number }>;\n/** The product confirms the resulting count; this immutable proposal is pending feedback only. */\nexport function resolveToggleFeedbackProposal(state: ToggleFeedbackState, selected: boolean): ToggleFeedbackState {\n if (!Number.isSafeInteger(state.count) || state.count < 0 || (state.selected && state.count === 0)) throw new RangeError(\"Invalid confirmed selection count\");\n const count = state.count + Number(selected) - Number(state.selected);\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(\"Invalid proposed selection count\");\n return Object.freeze({ selected, count });\n}\nexport const toggleFeedbackRecipe = { duration: motion.slow, glyphSize: 24, effectSize: 40 } as const;\nexport const toggleFeedbackPaths: Readonly<Record<ToggleFeedbackEffect, string>> = {\n ripple: \"M6 10C6 2 18 2 18 10V15L20 18H4L6 15ZM9 21H15\",\n ribbon: \"M6 3H18V21L12 17L6 21Z\",\n burst: \"M12 21L3.8 12.8C-2 7 6 0 12 7C18 0 26 7 20.2 12.8Z\",\n};\n/** Host geometry only, never product state or a timer-driven counter. p=1 clears every transient. */\nexport function resolveToggleFeedbackFrame(effect: ToggleFeedbackEffect, progress: number) {\n if (!Object.hasOwn(toggleFeedbackPaths, effect)) throw new TypeError(\"Unknown toggle feedback effect\");\n if (!Number.isFinite(progress)) throw new TypeError(\"Feedback progress must be finite\");\n const p = Math.min(1, Math.max(0, progress)), opacity = 1 - p;\n const rays = Array.from({ length: 8 }, (_, index) => {\n const a = index * Math.PI / 4, inner = 9 + 7 * p, outer = 12 + 7 * p;\n return `M${20 + Math.cos(a) * inner} ${20 + Math.sin(a) * inner}L${20 + Math.cos(a) * outer} ${20 + Math.sin(a) * outer}`;\n }).join(\" \");\n const pulse = p === 1 ? 0 : Math.sin(Math.PI * p);\n return Object.freeze({ radius: 2 + p * 16, opacity: effect === \"ribbon\" ? 0 : opacity,\n rays, translateY: effect === \"ribbon\" && pulse !== 0 ? -6 * pulse : 0, scale: effect === \"ripple\" ? 1 : 1 + .12 * pulse });\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export type TransferObservation = Readonly<{
2
+ completed: number;
3
+ total: number | null;
4
+ }>;
5
+ /** Actual transport counts only. Learning the total never manufactures completed work. */
6
+ export declare function resolveTransferObservation(next: TransferObservation, previous?: TransferObservation | null): TransferObservation;
7
+ export type TransferContext = Readonly<{
8
+ signal: AbortSignal;
9
+ report: (observation: TransferObservation) => void;
10
+ }>;
11
+ /** An abort request is not proof of cancellation: the adapter must reject with AbortError. */
12
+ export declare function isConfirmedTransferAbort(error: unknown, signal: AbortSignal): boolean;
13
+ //# sourceMappingURL=transfer-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-task.d.ts","sourceRoot":"","sources":["../src/transfer-task.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AACxF,0FAA0F;AAC1F,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,GAAE,mBAAmB,GAAG,IAAW,GAAG,mBAAmB,CAItI;AACD,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,CAAC,WAAW,EAAE,mBAAmB,KAAK,IAAI,CAAA;CAAE,CAAC,CAAC;AACpH,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAErF"}
@@ -0,0 +1,13 @@
1
+ /** Actual transport counts only. Learning the total never manufactures completed work. */
2
+ export function resolveTransferObservation(next, previous = null) {
3
+ if (!Number.isFinite(next.completed) || next.completed < 0 || (next.total !== null && (!Number.isFinite(next.total) || next.total <= 0 || next.completed > next.total)))
4
+ throw new RangeError("Transfer observations require nonnegative completed work and a positive known total");
5
+ if (previous && next.completed < previous.completed)
6
+ throw new RangeError("Transfer progress cannot rewind within one operation");
7
+ return Object.freeze({ completed: next.completed, total: next.total });
8
+ }
9
+ /** An abort request is not proof of cancellation: the adapter must reject with AbortError. */
10
+ export function isConfirmedTransferAbort(error, signal) {
11
+ return signal.aborted && error !== null && typeof error === "object" && "name" in error && error.name === "AbortError";
12
+ }
13
+ //# sourceMappingURL=transfer-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-task.js","sourceRoot":"","sources":["../src/transfer-task.ts"],"names":[],"mappings":"AACA,0FAA0F;AAC1F,MAAM,UAAU,0BAA0B,CAAC,IAAyB,EAAE,WAAuC,IAAI;IAC/G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,qFAAqF,CAAC,CAAC;IACrR,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;QAAE,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAC;IAClI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,wBAAwB,CAAC,KAAc,EAAE,MAAmB;IAC1E,OAAO,MAAM,CAAC,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AACzH,CAAC","sourcesContent":["export type TransferObservation = Readonly<{ completed: number; total: number | null }>;\n/** Actual transport counts only. Learning the total never manufactures completed work. */\nexport function resolveTransferObservation(next: TransferObservation, previous: TransferObservation | null = null): TransferObservation {\n if (!Number.isFinite(next.completed) || next.completed < 0 || (next.total !== null && (!Number.isFinite(next.total) || next.total <= 0 || next.completed > next.total))) throw new RangeError(\"Transfer observations require nonnegative completed work and a positive known total\");\n if (previous && next.completed < previous.completed) throw new RangeError(\"Transfer progress cannot rewind within one operation\");\n return Object.freeze({ completed: next.completed, total: next.total });\n}\nexport type TransferContext = Readonly<{ signal: AbortSignal; report: (observation: TransferObservation) => void }>;\n/** An abort request is not proof of cancellation: the adapter must reject with AbortError. */\nexport function isConfirmedTransferAbort(error: unknown, signal: AbortSignal): boolean {\n return signal.aborted && error !== null && typeof error === \"object\" && \"name\" in error && error.name === \"AbortError\";\n}\n"]}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export declare const designSystemVersion: "1.20.0";
2
+ export declare const designSystemVersion: "1.22.0";
3
3
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export const designSystemVersion = "1.20.0";
2
+ export const designSystemVersion = "1.22.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAiB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.20.0\" as const;\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAiB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.22.0\" as const;\n"]}
@@ -0,0 +1,31 @@
1
+ # 편집 도구 구성 계약
2
+
3
+ 검토일: 2026-10-15 · Lucian 116·141 · Storybook 배포 · npm 1.21.0
4
+
5
+ `@hjmds/design-contracts/authoring-tools`, `@hjmds/react/authoring-tools`,
6
+ `@hjmds/react-native/authoring-tools` 선택 subpath로 제공한다.
7
+
8
+ ## BezierEditor (Web·Native)
9
+
10
+ - `value`는 `[x1,y1,x2,y2]` controlled 초안이다. 두 제어점의 네 좌표를 모두 Slider로 편집한다.
11
+ - `x1,x2`는 CSS와 같은 `[0,1]`, y는 기본 `[-2,2]` 안에서 overshoot를 허용한다. `yRange`로 실제 제품 범위를 지정한다.
12
+ - `validateBezier`는 유한 좌표와 x 범위를, renderer는 yRange와 양의 유한 duration을 검사한다. `cubicBezierPoint`는 매개변수 t의 실제 기하 좌표이며 시간 기반 easing 출력과 혼동하지 않는다.
13
+ - 곡선에는 제어선과 두 제어점이 표시된다. 미리 보기 버튼은 현재 네 좌표로 실제 움직임을 한 번 재생한다. Web은 CSS cubic-bezier/WAAPI, Native는 Easing.bezier/Animated를 사용한다. 프레임마다 React state를 갱신하지 않는다.
14
+ - 좌표·duration·활성/disabled·reduced motion 변경, unmount, 백그라운드 진입에 재생을 멈춘다. reduced motion에서는 이동을 재생하지 않는다.
15
+ - 미리 보기 트랙은 이동을 내부에서 clip한다. y overshoot의 실제 easing을 유지하면서 좁은 편집 패널 밖으로 도형이 넘치지 않게 한다.
16
+ - 편집은 `onValueChange`만 호출한다. 제품 모션 토큰·저장소를 자동으로 수정하지 않는다. 제품이 별도 검토·저장 동작을 소유한다.
17
+
18
+ ## ShortcutRecorder (Web 전용)
19
+
20
+ - 명시적 기록 버튼으로 포커스 영역에서 실제 KeyboardEvent의 물리적 `code`와 Ctrl/Alt/Shift/Meta를 기록한다. 전역 listener를 자동 등록하지 않는다.
21
+ - IME 조합·반복·AltGraph·수정키 단독은 무시하고, 일반 입력/탐색키 단독은 거부한다. Escape는 기록을 취소하며 Tab은 포커스 이동을 유지한다. 영역을 벗어나면 기록이 종료된다.
22
+ - `platform`은 제품이 지정한다. 일반 브라우저/OS 예약 조합과 제품 `reserved`, 현재 `conflicts`를 검사한다. 등록 직전 최신 props로 다시 검사한다. OS가 브라우저에 보내지 않는 키는 기록할 수 없으며 예약 목록은 모든 OS/브라우저 조합의 완전한 목록이 아니다.
23
+ - `normalizeShortcut`의 예: `Ctrl+Shift+KeyK`. 화면 표기는 제품이 현재 키보드 레이아웃에 맞춰 `formatShortcut`으로 제공한다.
24
+ - 기록된 초안과 실제 등록값 `value`는 분리한다. 명시적 등록 버튼의 `onRegister`가 실제 앱 단축키 서비스를 호출한다. Promise 완료 전 초안을 지우지 않고 중복 요청을 막는다. 실패하면 초안·기존 등록값을 보존하고 중앙 오류를 표시한다.
25
+ - 등록 서비스의 실행 범위(계정·작업공간·문서)가 바뀌면 제품이 해당 식별자로 recorder host에 React `key`를 지정한다. unmount는 구성의 늦은 상태 갱신을 무시하지만 이미 호출한 외부 등록을 취소하지 않는다. 제품 서비스는 AbortSignal 또는 세대/범위 확인으로 늦은 등록 완료를 거부하고 이전 listener를 해제해야 한다.
26
+ - Native는 이 API를 내보내지 않는다. `authoringToolsCapabilities.shortcutRecorder === false`로 명시한다. 네이티브 하드웨어 키보드 등록은 플랫폼별 제품 adapter의 책임이다.
27
+
28
+ ## 근거와 확인 범위
29
+
30
+ 원본 116의 고정 둘째 제어점과 141의 표시 중심 기록을 실제 controlled 편집·등록 계약으로 확장했다. 기존 Slider/Button/Stack/Text와 비동기 action helper를 재사용한다.
31
+ 계약·Web browser·Native host targeted 검사는 실제 좌표 변경, 예약/충돌, 실패 보존·중복 요청, 실제 preview 호출을 확인한다. Native 기기 애니메이션과 실제 제품 단축키 서비스·토큰 저장·npm 게시는 별도다.
package/docs/calendar.md CHANGED
@@ -49,7 +49,7 @@ import { Calendar } from "@hjmds/react/calendar";
49
49
  />
50
50
  ```
51
51
 
52
- 두 renderer는 `size="medium" | "large"`, `renderCellContent`,
52
+ 두 renderer는 `size="compact" | "medium" | "large"`, `renderCellContent`,
53
53
  `ref.current.focusDate(date)`를 지원한다. focus 요청 날짜가 다음 렌더에서 도착하면 그때 적용한다.
54
54
  Web의 `autoFocus`는 기본 false이며 DatePicker가 열린 격자에만 true로 설정한다.
55
55
 
@@ -83,3 +83,5 @@ Native 테스트는 개별 날짜의 접근성·비활성·선택, 명시적 월
83
83
  기기나 하드웨어 키보드 탐색 검증을 뜻하지 않는다.
84
84
  DatePicker의 기존 선택·닫기·방향키 회귀와 controlled-open 읽기 전용/disabled 활성화 방지도 검사한다.
85
85
  전체 패키지·Showcase 검증 및 브라우저 확인은 `react-native-completion.md` 실행 기록에 남긴다.
86
+
87
+ `compact`는 2026-10-14 경기 달력의 날짜 원 크기 피드백을 반영한 선택지다. 날짜 원은 28px로 표시하고, 날짜 버튼의 최소 44px 터치 영역은 유지한다. 기존 medium·large의 모양은 바꾸지 않는다.
@@ -8,6 +8,11 @@
8
8
  "name": "ThinkingOrb",
9
9
  "date": "2026-09-29",
10
10
  "rationale": "사용자가 Thinking Orbs의 HJM 흡수를 명시적으로 요청함. 기존 Spinner를 교체하지 않는 AI 상태 표시이며 선택형 경로로 격리. docs/thinking-orb.md"
11
+ },
12
+ {
13
+ "name": "Chart",
14
+ "date": "2026-10-14",
15
+ "rationale": "사용자가 차트·표 라이브러리 흡수를 명시적으로 요청함. 2026-09-29 토큰만 남기고 지운 Chart를 되살려 Line·Bar·Pie·Radar·Scatter·Sparkline·ChartLegend를 한 계약의 동반 API로 둔다. Yajalal이 같은 스크럽 선 차트·막대를 직접 다시 만든 것이 근거. docs/chart.md"
11
16
  }
12
17
  ],
13
18
  "names": [