@dowel-ui/react 0.3.0 → 0.4.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 (71) hide show
  1. package/README.md +9 -8
  2. package/dist/components/ai-disclosure/ai-disclosure.d.ts +92 -0
  3. package/dist/components/ai-disclosure/ai-disclosure.d.ts.map +1 -0
  4. package/dist/components/ai-disclosure/ai-disclosure.js +122 -0
  5. package/dist/components/ai-disclosure/ai-disclosure.js.map +1 -0
  6. package/dist/components/ai-disclosure/index.d.ts +2 -0
  7. package/dist/components/ai-disclosure/index.js +2 -0
  8. package/dist/components/ai-disclosure/meta.js +17 -0
  9. package/dist/components/ai-disclosure/meta.js.map +1 -0
  10. package/dist/components/avatar/avatar.d.ts +1 -1
  11. package/dist/components/date-picker/date-picker.js +1 -1
  12. package/dist/components/diff-viewer/diff-model.d.ts +69 -0
  13. package/dist/components/diff-viewer/diff-model.d.ts.map +1 -0
  14. package/dist/components/diff-viewer/diff-model.js +180 -0
  15. package/dist/components/diff-viewer/diff-model.js.map +1 -0
  16. package/dist/components/diff-viewer/diff-viewer.d.ts +42 -0
  17. package/dist/components/diff-viewer/diff-viewer.d.ts.map +1 -0
  18. package/dist/components/diff-viewer/diff-viewer.js +212 -0
  19. package/dist/components/diff-viewer/diff-viewer.js.map +1 -0
  20. package/dist/components/diff-viewer/index.d.ts +3 -0
  21. package/dist/components/diff-viewer/index.js +3 -0
  22. package/dist/components/diff-viewer/meta.js +17 -0
  23. package/dist/components/diff-viewer/meta.js.map +1 -0
  24. package/dist/components/log-viewer/index.d.ts +3 -0
  25. package/dist/components/log-viewer/index.js +3 -0
  26. package/dist/components/log-viewer/log-stream.d.ts +68 -0
  27. package/dist/components/log-viewer/log-stream.d.ts.map +1 -0
  28. package/dist/components/log-viewer/log-stream.js +120 -0
  29. package/dist/components/log-viewer/log-stream.js.map +1 -0
  30. package/dist/components/log-viewer/log-viewer.d.ts +51 -0
  31. package/dist/components/log-viewer/log-viewer.d.ts.map +1 -0
  32. package/dist/components/log-viewer/log-viewer.js +284 -0
  33. package/dist/components/log-viewer/log-viewer.js.map +1 -0
  34. package/dist/components/log-viewer/meta.js +17 -0
  35. package/dist/components/log-viewer/meta.js.map +1 -0
  36. package/dist/components/spinner/spinner.d.ts +1 -1
  37. package/dist/components/time-range-picker/index.d.ts +3 -0
  38. package/dist/components/time-range-picker/index.js +3 -0
  39. package/dist/components/time-range-picker/meta.js +22 -0
  40. package/dist/components/time-range-picker/meta.js.map +1 -0
  41. package/dist/components/time-range-picker/time-expression.d.ts +88 -0
  42. package/dist/components/time-range-picker/time-expression.d.ts.map +1 -0
  43. package/dist/components/time-range-picker/time-expression.js +335 -0
  44. package/dist/components/time-range-picker/time-expression.js.map +1 -0
  45. package/dist/components/time-range-picker/time-range-picker.d.ts +65 -0
  46. package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -0
  47. package/dist/components/time-range-picker/time-range-picker.js +377 -0
  48. package/dist/components/time-range-picker/time-range-picker.js.map +1 -0
  49. package/dist/index.d.ts +12 -1
  50. package/dist/index.js +9 -2
  51. package/dist/registry/components.d.ts.map +1 -1
  52. package/dist/registry/components.js +58 -50
  53. package/dist/registry/components.js.map +1 -1
  54. package/package.json +6 -4
  55. package/src/components/ai-disclosure/ai-disclosure.tsx +244 -0
  56. package/src/components/ai-disclosure/index.ts +9 -0
  57. package/src/components/ai-disclosure/meta.ts +23 -0
  58. package/src/components/diff-viewer/diff-model.ts +256 -0
  59. package/src/components/diff-viewer/diff-viewer.tsx +339 -0
  60. package/src/components/diff-viewer/index.ts +17 -0
  61. package/src/components/diff-viewer/meta.ts +20 -0
  62. package/src/components/log-viewer/index.ts +21 -0
  63. package/src/components/log-viewer/log-stream.ts +176 -0
  64. package/src/components/log-viewer/log-viewer.tsx +424 -0
  65. package/src/components/log-viewer/meta.ts +21 -0
  66. package/src/components/time-range-picker/index.ts +25 -0
  67. package/src/components/time-range-picker/meta.ts +22 -0
  68. package/src/components/time-range-picker/time-expression.ts +491 -0
  69. package/src/components/time-range-picker/time-range-picker.tsx +522 -0
  70. package/src/index.ts +4 -0
  71. package/src/registry/components.ts +8 -0
@@ -6,55 +6,59 @@ import { meta as meta$3 } from "../components/ai-agent-plan/meta.js";
6
6
  import { meta as meta$4 } from "../components/ai-agent-status/meta.js";
7
7
  import { meta as meta$5 } from "../components/ai-approval-request/meta.js";
8
8
  import { meta as meta$6 } from "../components/ai-conversation/meta.js";
9
- import { meta as meta$7 } from "../components/ai-inline-completion/meta.js";
10
- import { meta as meta$8 } from "../components/ai-message/meta.js";
11
- import { meta as meta$9 } from "../components/ai-model-selector/meta.js";
12
- import { meta as meta$10 } from "../components/ai-prompt-input/meta.js";
13
- import { meta as meta$11 } from "../components/ai-reasoning/meta.js";
14
- import { meta as meta$12 } from "../components/ai-response/meta.js";
15
- import { meta as meta$13 } from "../components/ai-sources/meta.js";
16
- import { meta as meta$14 } from "../components/ai-structured-output/meta.js";
17
- import { meta as meta$15 } from "../components/ai-token-usage/meta.js";
18
- import { meta as meta$16 } from "../components/ai-tool/meta.js";
19
- import { meta as meta$17 } from "../components/alert/meta.js";
20
- import { meta as meta$18 } from "../components/avatar/meta.js";
21
- import { meta as meta$19 } from "../components/badge/meta.js";
22
- import { meta as meta$20 } from "../components/button/meta.js";
23
- import { meta as meta$21 } from "../components/calendar/meta.js";
24
- import { meta as meta$22 } from "../components/card/meta.js";
25
- import { meta as meta$23 } from "../components/checkbox/meta.js";
26
- import { meta as meta$24 } from "../components/code-block/meta.js";
27
- import { meta as meta$25 } from "../components/combobox/meta.js";
28
- import { meta as meta$26 } from "../components/command/meta.js";
29
- import { meta as meta$27 } from "../components/data-table/meta.js";
30
- import { meta as meta$28 } from "../components/date-picker/meta.js";
31
- import { meta as meta$29 } from "../components/dialog/meta.js";
32
- import { meta as meta$30 } from "../components/drawer/meta.js";
33
- import { meta as meta$31 } from "../components/dropdown-menu/meta.js";
34
- import { meta as meta$32 } from "../components/empty-state/meta.js";
35
- import { meta as meta$33 } from "../components/file-upload/meta.js";
36
- import { meta as meta$34 } from "../components/form/meta.js";
37
- import { meta as meta$35 } from "../components/input/meta.js";
38
- import { meta as meta$36 } from "../components/label/meta.js";
39
- import { meta as meta$37 } from "../components/meter/meta.js";
40
- import { meta as meta$38 } from "../components/metric-delta/meta.js";
41
- import { meta as meta$39 } from "../components/pagination/meta.js";
42
- import { meta as meta$40 } from "../components/popover/meta.js";
43
- import { meta as meta$41 } from "../components/progress/meta.js";
44
- import { meta as meta$42 } from "../components/radio-group/meta.js";
45
- import { meta as meta$43 } from "../components/record-diff/meta.js";
46
- import { meta as meta$44 } from "../components/select/meta.js";
47
- import { meta as meta$45 } from "../components/separator/meta.js";
48
- import { meta as meta$46 } from "../components/sheet/meta.js";
49
- import { meta as meta$47 } from "../components/skeleton/meta.js";
50
- import { meta as meta$48 } from "../components/slider/meta.js";
51
- import { meta as meta$49 } from "../components/spinner/meta.js";
52
- import { meta as meta$50 } from "../components/switch/meta.js";
53
- import { meta as meta$51 } from "../components/table/meta.js";
54
- import { meta as meta$52 } from "../components/tabs/meta.js";
55
- import { meta as meta$53 } from "../components/tags-input/meta.js";
56
- import { meta as meta$54 } from "../components/toast/meta.js";
57
- import { meta as meta$55 } from "../components/tooltip/meta.js";
9
+ import { meta as meta$7 } from "../components/ai-disclosure/meta.js";
10
+ import { meta as meta$8 } from "../components/ai-inline-completion/meta.js";
11
+ import { meta as meta$9 } from "../components/ai-message/meta.js";
12
+ import { meta as meta$10 } from "../components/ai-model-selector/meta.js";
13
+ import { meta as meta$11 } from "../components/ai-prompt-input/meta.js";
14
+ import { meta as meta$12 } from "../components/ai-reasoning/meta.js";
15
+ import { meta as meta$13 } from "../components/ai-response/meta.js";
16
+ import { meta as meta$14 } from "../components/ai-sources/meta.js";
17
+ import { meta as meta$15 } from "../components/ai-structured-output/meta.js";
18
+ import { meta as meta$16 } from "../components/ai-token-usage/meta.js";
19
+ import { meta as meta$17 } from "../components/ai-tool/meta.js";
20
+ import { meta as meta$18 } from "../components/alert/meta.js";
21
+ import { meta as meta$19 } from "../components/avatar/meta.js";
22
+ import { meta as meta$20 } from "../components/badge/meta.js";
23
+ import { meta as meta$21 } from "../components/button/meta.js";
24
+ import { meta as meta$22 } from "../components/calendar/meta.js";
25
+ import { meta as meta$23 } from "../components/card/meta.js";
26
+ import { meta as meta$24 } from "../components/checkbox/meta.js";
27
+ import { meta as meta$25 } from "../components/code-block/meta.js";
28
+ import { meta as meta$26 } from "../components/combobox/meta.js";
29
+ import { meta as meta$27 } from "../components/command/meta.js";
30
+ import { meta as meta$28 } from "../components/data-table/meta.js";
31
+ import { meta as meta$29 } from "../components/date-picker/meta.js";
32
+ import { meta as meta$30 } from "../components/dialog/meta.js";
33
+ import { meta as meta$31 } from "../components/diff-viewer/meta.js";
34
+ import { meta as meta$32 } from "../components/drawer/meta.js";
35
+ import { meta as meta$33 } from "../components/dropdown-menu/meta.js";
36
+ import { meta as meta$34 } from "../components/empty-state/meta.js";
37
+ import { meta as meta$35 } from "../components/file-upload/meta.js";
38
+ import { meta as meta$36 } from "../components/form/meta.js";
39
+ import { meta as meta$37 } from "../components/input/meta.js";
40
+ import { meta as meta$38 } from "../components/label/meta.js";
41
+ import { meta as meta$39 } from "../components/log-viewer/meta.js";
42
+ import { meta as meta$40 } from "../components/meter/meta.js";
43
+ import { meta as meta$41 } from "../components/metric-delta/meta.js";
44
+ import { meta as meta$42 } from "../components/pagination/meta.js";
45
+ import { meta as meta$43 } from "../components/popover/meta.js";
46
+ import { meta as meta$44 } from "../components/progress/meta.js";
47
+ import { meta as meta$45 } from "../components/radio-group/meta.js";
48
+ import { meta as meta$46 } from "../components/record-diff/meta.js";
49
+ import { meta as meta$47 } from "../components/select/meta.js";
50
+ import { meta as meta$48 } from "../components/separator/meta.js";
51
+ import { meta as meta$49 } from "../components/sheet/meta.js";
52
+ import { meta as meta$50 } from "../components/skeleton/meta.js";
53
+ import { meta as meta$51 } from "../components/slider/meta.js";
54
+ import { meta as meta$52 } from "../components/spinner/meta.js";
55
+ import { meta as meta$53 } from "../components/switch/meta.js";
56
+ import { meta as meta$54 } from "../components/table/meta.js";
57
+ import { meta as meta$55 } from "../components/tabs/meta.js";
58
+ import { meta as meta$56 } from "../components/tags-input/meta.js";
59
+ import { meta as meta$57 } from "../components/time-range-picker/meta.js";
60
+ import { meta as meta$58 } from "../components/toast/meta.js";
61
+ import { meta as meta$59 } from "../components/tooltip/meta.js";
58
62
  import { blockMetas } from "./blocks.js";
59
63
  //#region src/registry/components.ts
60
64
  /**
@@ -124,7 +128,11 @@ const componentMetas = [
124
128
  meta$52,
125
129
  meta$53,
126
130
  meta$54,
127
- meta$55
131
+ meta$55,
132
+ meta$56,
133
+ meta$57,
134
+ meta$58,
135
+ meta$59
128
136
  ];
129
137
  //#endregion
130
138
  export { COMPONENT_CATEGORIES, COMPONENT_STATUSES, blockMetas, componentMetas };
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","names":["accordionMeta","activityFeedMeta","aiActionLedgerMeta","aiAgentPlanMeta","aiAgentStatusMeta","aiApprovalRequestMeta","aiConversationMeta","aiInlineCompletionMeta","aiMessageMeta","aiModelSelectorMeta","aiPromptInputMeta","aiReasoningMeta","aiResponseMeta","aiSourcesMeta","aiStructuredOutputMeta","aiTokenUsageMeta","aiToolMeta","alertMeta","avatarMeta","badgeMeta","buttonMeta","calendarMeta","cardMeta","checkboxMeta","codeBlockMeta","comboboxMeta","commandMeta","dataTableMeta","datePickerMeta","dialogMeta","drawerMeta","dropdownMenuMeta","emptyStateMeta","fileUploadMeta","formMeta","inputMeta","labelMeta","meterMeta","metricDeltaMeta","paginationMeta","popoverMeta","progressMeta","radioGroupMeta","recordDiffMeta","selectMeta","separatorMeta","sheetMeta","skeletonMeta","sliderMeta","spinnerMeta","switchMeta","tableMeta","tabsMeta","tagsInputMeta","toastMeta","tooltipMeta"],"sources":["../../src/registry/components.ts"],"sourcesContent":["import type { ComponentMeta } from \"./schema\";\n\nimport { meta as accordionMeta } from \"@/components/accordion/meta\";\nimport { meta as activityFeedMeta } from \"@/components/activity-feed/meta\";\nimport { meta as aiActionLedgerMeta } from \"@/components/ai-action-ledger/meta\";\nimport { meta as aiAgentPlanMeta } from \"@/components/ai-agent-plan/meta\";\nimport { meta as aiAgentStatusMeta } from \"@/components/ai-agent-status/meta\";\nimport { meta as aiApprovalRequestMeta } from \"@/components/ai-approval-request/meta\";\nimport { meta as aiConversationMeta } from \"@/components/ai-conversation/meta\";\nimport { meta as aiInlineCompletionMeta } from \"@/components/ai-inline-completion/meta\";\nimport { meta as aiMessageMeta } from \"@/components/ai-message/meta\";\nimport { meta as aiModelSelectorMeta } from \"@/components/ai-model-selector/meta\";\nimport { meta as aiPromptInputMeta } from \"@/components/ai-prompt-input/meta\";\nimport { meta as aiReasoningMeta } from \"@/components/ai-reasoning/meta\";\nimport { meta as aiResponseMeta } from \"@/components/ai-response/meta\";\nimport { meta as aiSourcesMeta } from \"@/components/ai-sources/meta\";\nimport { meta as aiStructuredOutputMeta } from \"@/components/ai-structured-output/meta\";\nimport { meta as aiTokenUsageMeta } from \"@/components/ai-token-usage/meta\";\nimport { meta as aiToolMeta } from \"@/components/ai-tool/meta\";\nimport { meta as alertMeta } from \"@/components/alert/meta\";\nimport { meta as avatarMeta } from \"@/components/avatar/meta\";\nimport { meta as badgeMeta } from \"@/components/badge/meta\";\nimport { meta as buttonMeta } from \"@/components/button/meta\";\nimport { meta as calendarMeta } from \"@/components/calendar/meta\";\nimport { meta as cardMeta } from \"@/components/card/meta\";\nimport { meta as checkboxMeta } from \"@/components/checkbox/meta\";\nimport { meta as codeBlockMeta } from \"@/components/code-block/meta\";\nimport { meta as comboboxMeta } from \"@/components/combobox/meta\";\nimport { meta as commandMeta } from \"@/components/command/meta\";\nimport { meta as dataTableMeta } from \"@/components/data-table/meta\";\nimport { meta as datePickerMeta } from \"@/components/date-picker/meta\";\nimport { meta as dialogMeta } from \"@/components/dialog/meta\";\nimport { meta as drawerMeta } from \"@/components/drawer/meta\";\nimport { meta as dropdownMenuMeta } from \"@/components/dropdown-menu/meta\";\nimport { meta as emptyStateMeta } from \"@/components/empty-state/meta\";\nimport { meta as fileUploadMeta } from \"@/components/file-upload/meta\";\nimport { meta as formMeta } from \"@/components/form/meta\";\nimport { meta as inputMeta } from \"@/components/input/meta\";\nimport { meta as labelMeta } from \"@/components/label/meta\";\nimport { meta as meterMeta } from \"@/components/meter/meta\";\nimport { meta as metricDeltaMeta } from \"@/components/metric-delta/meta\";\nimport { meta as paginationMeta } from \"@/components/pagination/meta\";\nimport { meta as popoverMeta } from \"@/components/popover/meta\";\nimport { meta as progressMeta } from \"@/components/progress/meta\";\nimport { meta as radioGroupMeta } from \"@/components/radio-group/meta\";\nimport { meta as recordDiffMeta } from \"@/components/record-diff/meta\";\nimport { meta as selectMeta } from \"@/components/select/meta\";\nimport { meta as separatorMeta } from \"@/components/separator/meta\";\nimport { meta as sheetMeta } from \"@/components/sheet/meta\";\nimport { meta as skeletonMeta } from \"@/components/skeleton/meta\";\nimport { meta as sliderMeta } from \"@/components/slider/meta\";\nimport { meta as spinnerMeta } from \"@/components/spinner/meta\";\nimport { meta as switchMeta } from \"@/components/switch/meta\";\nimport { meta as tableMeta } from \"@/components/table/meta\";\nimport { meta as tabsMeta } from \"@/components/tabs/meta\";\nimport { meta as tagsInputMeta } from \"@/components/tags-input/meta\";\nimport { meta as toastMeta } from \"@/components/toast/meta\";\nimport { meta as tooltipMeta } from \"@/components/tooltip/meta\";\n\n/**\n * Every component in the registry.\n *\n * An explicit list rather than a glob: the registry build runs in plain Node,\n * where bundler-only globbing is unavailable, and a static list is also what\n * lets the bundle tree-shake. `meta.test.ts` fails if a component directory\n * exists that is missing from here, so it cannot silently fall out of date.\n *\n * Identifiers carry a `Meta` suffix because component names include reserved\n * words — `switch` cannot be a binding name.\n */\nexport const componentMetas: ComponentMeta[] = [\n accordionMeta,\n activityFeedMeta,\n aiActionLedgerMeta,\n aiAgentPlanMeta,\n aiAgentStatusMeta,\n aiApprovalRequestMeta,\n aiConversationMeta,\n aiInlineCompletionMeta,\n aiMessageMeta,\n aiModelSelectorMeta,\n aiPromptInputMeta,\n aiReasoningMeta,\n aiResponseMeta,\n aiSourcesMeta,\n aiStructuredOutputMeta,\n aiTokenUsageMeta,\n aiToolMeta,\n alertMeta,\n avatarMeta,\n badgeMeta,\n buttonMeta,\n calendarMeta,\n cardMeta,\n checkboxMeta,\n codeBlockMeta,\n comboboxMeta,\n commandMeta,\n dataTableMeta,\n datePickerMeta,\n dialogMeta,\n drawerMeta,\n dropdownMenuMeta,\n emptyStateMeta,\n fileUploadMeta,\n formMeta,\n inputMeta,\n labelMeta,\n meterMeta,\n metricDeltaMeta,\n paginationMeta,\n popoverMeta,\n progressMeta,\n radioGroupMeta,\n recordDiffMeta,\n selectMeta,\n separatorMeta,\n sheetMeta,\n skeletonMeta,\n sliderMeta,\n spinnerMeta,\n switchMeta,\n tableMeta,\n tabsMeta,\n tagsInputMeta,\n toastMeta,\n tooltipMeta,\n];\n\n// This file is the `@dowel-ui/react/registry` entry point, so the block barrel is\n// re-exported here — the registry build reads both through one import.\nexport { blockMetas } from \"./blocks\";\nexport { COMPONENT_CATEGORIES, COMPONENT_STATUSES } from \"./schema\";\nexport type { ComponentCategory, ComponentMeta, ComponentStatus } from \"./schema\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,MAAa,iBAAkC;CAC7CA;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;AACF"}
1
+ {"version":3,"file":"components.js","names":["accordionMeta","activityFeedMeta","aiActionLedgerMeta","aiAgentPlanMeta","aiAgentStatusMeta","aiApprovalRequestMeta","aiConversationMeta","aiDisclosureMeta","aiInlineCompletionMeta","aiMessageMeta","aiModelSelectorMeta","aiPromptInputMeta","aiReasoningMeta","aiResponseMeta","aiSourcesMeta","aiStructuredOutputMeta","aiTokenUsageMeta","aiToolMeta","alertMeta","avatarMeta","badgeMeta","buttonMeta","calendarMeta","cardMeta","checkboxMeta","codeBlockMeta","comboboxMeta","commandMeta","dataTableMeta","datePickerMeta","dialogMeta","diffViewerMeta","drawerMeta","dropdownMenuMeta","emptyStateMeta","fileUploadMeta","formMeta","inputMeta","labelMeta","logViewerMeta","meterMeta","metricDeltaMeta","paginationMeta","popoverMeta","progressMeta","radioGroupMeta","recordDiffMeta","selectMeta","separatorMeta","sheetMeta","skeletonMeta","sliderMeta","spinnerMeta","switchMeta","tableMeta","tabsMeta","tagsInputMeta","timeRangePickerMeta","toastMeta","tooltipMeta"],"sources":["../../src/registry/components.ts"],"sourcesContent":["import type { ComponentMeta } from \"./schema\";\n\nimport { meta as accordionMeta } from \"@/components/accordion/meta\";\nimport { meta as activityFeedMeta } from \"@/components/activity-feed/meta\";\nimport { meta as aiActionLedgerMeta } from \"@/components/ai-action-ledger/meta\";\nimport { meta as aiAgentPlanMeta } from \"@/components/ai-agent-plan/meta\";\nimport { meta as aiAgentStatusMeta } from \"@/components/ai-agent-status/meta\";\nimport { meta as aiApprovalRequestMeta } from \"@/components/ai-approval-request/meta\";\nimport { meta as aiConversationMeta } from \"@/components/ai-conversation/meta\";\nimport { meta as aiDisclosureMeta } from \"@/components/ai-disclosure/meta\";\nimport { meta as aiInlineCompletionMeta } from \"@/components/ai-inline-completion/meta\";\nimport { meta as aiMessageMeta } from \"@/components/ai-message/meta\";\nimport { meta as aiModelSelectorMeta } from \"@/components/ai-model-selector/meta\";\nimport { meta as aiPromptInputMeta } from \"@/components/ai-prompt-input/meta\";\nimport { meta as aiReasoningMeta } from \"@/components/ai-reasoning/meta\";\nimport { meta as aiResponseMeta } from \"@/components/ai-response/meta\";\nimport { meta as aiSourcesMeta } from \"@/components/ai-sources/meta\";\nimport { meta as aiStructuredOutputMeta } from \"@/components/ai-structured-output/meta\";\nimport { meta as aiTokenUsageMeta } from \"@/components/ai-token-usage/meta\";\nimport { meta as aiToolMeta } from \"@/components/ai-tool/meta\";\nimport { meta as alertMeta } from \"@/components/alert/meta\";\nimport { meta as avatarMeta } from \"@/components/avatar/meta\";\nimport { meta as badgeMeta } from \"@/components/badge/meta\";\nimport { meta as buttonMeta } from \"@/components/button/meta\";\nimport { meta as calendarMeta } from \"@/components/calendar/meta\";\nimport { meta as cardMeta } from \"@/components/card/meta\";\nimport { meta as checkboxMeta } from \"@/components/checkbox/meta\";\nimport { meta as codeBlockMeta } from \"@/components/code-block/meta\";\nimport { meta as comboboxMeta } from \"@/components/combobox/meta\";\nimport { meta as commandMeta } from \"@/components/command/meta\";\nimport { meta as dataTableMeta } from \"@/components/data-table/meta\";\nimport { meta as datePickerMeta } from \"@/components/date-picker/meta\";\nimport { meta as dialogMeta } from \"@/components/dialog/meta\";\nimport { meta as diffViewerMeta } from \"@/components/diff-viewer/meta\";\nimport { meta as drawerMeta } from \"@/components/drawer/meta\";\nimport { meta as dropdownMenuMeta } from \"@/components/dropdown-menu/meta\";\nimport { meta as emptyStateMeta } from \"@/components/empty-state/meta\";\nimport { meta as fileUploadMeta } from \"@/components/file-upload/meta\";\nimport { meta as formMeta } from \"@/components/form/meta\";\nimport { meta as inputMeta } from \"@/components/input/meta\";\nimport { meta as labelMeta } from \"@/components/label/meta\";\nimport { meta as logViewerMeta } from \"@/components/log-viewer/meta\";\nimport { meta as meterMeta } from \"@/components/meter/meta\";\nimport { meta as metricDeltaMeta } from \"@/components/metric-delta/meta\";\nimport { meta as paginationMeta } from \"@/components/pagination/meta\";\nimport { meta as popoverMeta } from \"@/components/popover/meta\";\nimport { meta as progressMeta } from \"@/components/progress/meta\";\nimport { meta as radioGroupMeta } from \"@/components/radio-group/meta\";\nimport { meta as recordDiffMeta } from \"@/components/record-diff/meta\";\nimport { meta as selectMeta } from \"@/components/select/meta\";\nimport { meta as separatorMeta } from \"@/components/separator/meta\";\nimport { meta as sheetMeta } from \"@/components/sheet/meta\";\nimport { meta as skeletonMeta } from \"@/components/skeleton/meta\";\nimport { meta as sliderMeta } from \"@/components/slider/meta\";\nimport { meta as spinnerMeta } from \"@/components/spinner/meta\";\nimport { meta as switchMeta } from \"@/components/switch/meta\";\nimport { meta as tableMeta } from \"@/components/table/meta\";\nimport { meta as tabsMeta } from \"@/components/tabs/meta\";\nimport { meta as tagsInputMeta } from \"@/components/tags-input/meta\";\nimport { meta as timeRangePickerMeta } from \"@/components/time-range-picker/meta\";\nimport { meta as toastMeta } from \"@/components/toast/meta\";\nimport { meta as tooltipMeta } from \"@/components/tooltip/meta\";\n\n/**\n * Every component in the registry.\n *\n * An explicit list rather than a glob: the registry build runs in plain Node,\n * where bundler-only globbing is unavailable, and a static list is also what\n * lets the bundle tree-shake. `meta.test.ts` fails if a component directory\n * exists that is missing from here, so it cannot silently fall out of date.\n *\n * Identifiers carry a `Meta` suffix because component names include reserved\n * words — `switch` cannot be a binding name.\n */\nexport const componentMetas: ComponentMeta[] = [\n accordionMeta,\n activityFeedMeta,\n aiActionLedgerMeta,\n aiAgentPlanMeta,\n aiAgentStatusMeta,\n aiApprovalRequestMeta,\n aiConversationMeta,\n aiDisclosureMeta,\n aiInlineCompletionMeta,\n aiMessageMeta,\n aiModelSelectorMeta,\n aiPromptInputMeta,\n aiReasoningMeta,\n aiResponseMeta,\n aiSourcesMeta,\n aiStructuredOutputMeta,\n aiTokenUsageMeta,\n aiToolMeta,\n alertMeta,\n avatarMeta,\n badgeMeta,\n buttonMeta,\n calendarMeta,\n cardMeta,\n checkboxMeta,\n codeBlockMeta,\n comboboxMeta,\n commandMeta,\n dataTableMeta,\n datePickerMeta,\n dialogMeta,\n diffViewerMeta,\n drawerMeta,\n dropdownMenuMeta,\n emptyStateMeta,\n fileUploadMeta,\n formMeta,\n inputMeta,\n labelMeta,\n logViewerMeta,\n meterMeta,\n metricDeltaMeta,\n paginationMeta,\n popoverMeta,\n progressMeta,\n radioGroupMeta,\n recordDiffMeta,\n selectMeta,\n separatorMeta,\n sheetMeta,\n skeletonMeta,\n sliderMeta,\n spinnerMeta,\n switchMeta,\n tableMeta,\n tabsMeta,\n tagsInputMeta,\n timeRangePickerMeta,\n toastMeta,\n tooltipMeta,\n];\n\n// This file is the `@dowel-ui/react/registry` entry point, so the block barrel is\n// re-exported here — the registry build reads both through one import.\nexport { blockMetas } from \"./blocks\";\nexport { COMPONENT_CATEGORIES, COMPONENT_STATUSES } from \"./schema\";\nexport type { ComponentCategory, ComponentMeta, ComponentStatus } from \"./schema\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EA,MAAa,iBAAkC;CAC7CA;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;AACF"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@dowel-ui/react",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
- "description": "Source-first React components for SaaS and AI products — 56 accessible components you install as code you own, not as a dependency.",
5
+ "description": "Source-first React components for SaaS and AI products — 60 accessible components you install as code you own, not as a dependency.",
6
6
  "keywords": [
7
7
  "react",
8
8
  "ui",
@@ -63,8 +63,10 @@
63
63
  },
64
64
  "dependencies": {
65
65
  "@tanstack/react-table": "9.2.4",
66
+ "@tanstack/react-virtual": "3.14.10",
66
67
  "class-variance-authority": "0.7.1",
67
68
  "clsx": "2.1.1",
69
+ "diff": "9.0.0",
68
70
  "radix-ui": "1.6.7",
69
71
  "react-day-picker": "10.0.1",
70
72
  "tailwind-merge": "3.6.0"
@@ -93,8 +95,8 @@
93
95
  "vite": "8.2.2",
94
96
  "vitest": "4.1.10",
95
97
  "zod": "4.5.4",
96
- "@dowel-ui/themes": "0.3.0",
97
- "@dowel-ui/config": "0.3.0"
98
+ "@dowel-ui/config": "0.4.0",
99
+ "@dowel-ui/themes": "0.4.0"
98
100
  },
99
101
  "scripts": {
100
102
  "build": "tsdown",
@@ -0,0 +1,244 @@
1
+ "use client";
2
+
3
+ import { cva, type VariantProps } from "class-variance-authority";
4
+ import type { ComponentPropsWithRef, ReactNode } from "react";
5
+
6
+ import { Popover, PopoverContent, PopoverTrigger } from "@/components/popover";
7
+ import { focusRing, iconSlot } from "@/lib/styles";
8
+ import { cn } from "@/lib/utils";
9
+
10
+ /**
11
+ * Telling someone they are looking at AI.
12
+ *
13
+ * Not one registry ships this — not AI Elements, assistant-ui, prompt-kit,
14
+ * CopilotKit or shadcn — while every one of them ships the chat surface that
15
+ * needs it. The gap is the reason this exists.
16
+ *
17
+ * The four `kind`s are not invented. They are the four human-visible situations
18
+ * the EU AI Act's Article 50 actually creates, which has applied since 2 August
19
+ * 2026: you are talking to a machine (50(1)); this media was generated or
20
+ * manipulated and resembles something real (50(4), "deep fakes"); this text was
21
+ * published to inform the public (50(4)); and the assisted case, which the same
22
+ * paragraph exempts where there is human review or editorial control — worth
23
+ * saying out loud rather than leaving to inference.
24
+ *
25
+ * What this cannot do, and what no React component can: Article 50(2) requires
26
+ * synthetic output to be marked *in a machine-readable format*, in the artifact
27
+ * itself, by whoever generated it. Rendering a badge does not do that, and a
28
+ * component that let you believe otherwise would be worse than none. Read the
29
+ * accessibility note and the docs page: this is a disclosure control, not a
30
+ * compliance product, and nothing here is legal advice.
31
+ */
32
+
33
+ export type DisclosureKind = "interaction" | "generated" | "manipulated" | "assisted";
34
+
35
+ /**
36
+ * What each kind says by default.
37
+ *
38
+ * Phrased for a reader rather than for a lawyer, and every one of them is
39
+ * overridable — the Act says the disclosure must be clear, not that it must use
40
+ * these words, and the right words depend on the product.
41
+ */
42
+ const DEFAULT_LABEL: Record<DisclosureKind, string> = {
43
+ interaction: "You are chatting with an AI assistant",
44
+ generated: "Generated by AI",
45
+ manipulated: "This media was altered by AI",
46
+ assisted: "AI-assisted, reviewed by a person",
47
+ };
48
+
49
+ const disclosureVariants = cva(
50
+ cn(
51
+ "inline-flex w-fit items-center gap-1.5 font-medium",
52
+ "[&_svg:not([class*='size-'])]:size-3.5",
53
+ iconSlot,
54
+ ),
55
+ {
56
+ variants: {
57
+ variant: {
58
+ /** Sits beside the thing it describes. */
59
+ inline: "rounded-full border border-border-strong px-2 py-0.5 text-xs",
60
+ /** Above a conversation, where Article 50(1) usually belongs. */
61
+ banner:
62
+ "w-full rounded-lg border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground",
63
+ /**
64
+ * Over the corner of an image or video. `--overlay` is a dark scrim in
65
+ * every shipped theme, so the text is white on purpose rather than
66
+ * following the theme — a label that inverts over a photograph is
67
+ * unreadable on half of them.
68
+ */
69
+ overlay: "rounded-md bg-overlay px-2 py-1 text-2xs text-white backdrop-blur-sm",
70
+ },
71
+ },
72
+ defaultVariants: { variant: "inline" },
73
+ },
74
+ );
75
+
76
+ function SparkIcon() {
77
+ return (
78
+ <svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
79
+ <path
80
+ d="M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9L12 3Z"
81
+ stroke="currentColor"
82
+ strokeWidth="2"
83
+ strokeLinejoin="round"
84
+ />
85
+ </svg>
86
+ );
87
+ }
88
+
89
+ export interface AIDisclosureProps
90
+ extends
91
+ Omit<ComponentPropsWithRef<"div">, "children">,
92
+ VariantProps<typeof disclosureVariants> {
93
+ kind: DisclosureKind;
94
+ /** Replaces the default wording. The default is a starting point, not a rule. */
95
+ label?: ReactNode;
96
+ /**
97
+ * Replaces the mark. The Commission publishes three icons for this and lets
98
+ * anyone use them without attribution — they are deliberately not bundled
99
+ * here, because an official mark shipped inside a component library ends up
100
+ * on content nobody checked. Bring your own, and the Commission's own words
101
+ * apply: using them "does not establish legal compliance by itself".
102
+ */
103
+ icon?: ReactNode;
104
+ /** A provenance panel, or anything else that belongs after the label. */
105
+ children?: ReactNode;
106
+ }
107
+
108
+ /**
109
+ * A disclosure, in words.
110
+ *
111
+ * The icon is decorative and the text is the disclosure. A sparkle alone is not
112
+ * a notice — it is a decoration that a sighted reader may or may not decode and
113
+ * that a screen reader passes over in silence, which is the failure mode the
114
+ * whole component exists to avoid.
115
+ */
116
+ export function AIDisclosure({
117
+ className,
118
+ kind,
119
+ variant,
120
+ label,
121
+ icon,
122
+ children,
123
+ ...props
124
+ }: AIDisclosureProps) {
125
+ return (
126
+ <div
127
+ data-slot="ai-disclosure"
128
+ data-kind={kind}
129
+ className={cn(disclosureVariants({ variant }), className)}
130
+ {...props}
131
+ >
132
+ {icon ?? <SparkIcon />}
133
+ <span>{label ?? DEFAULT_LABEL[kind]}</span>
134
+ {children}
135
+ </div>
136
+ );
137
+ }
138
+
139
+ /* ------------------------------------------------------------------ */
140
+ /* Provenance */
141
+ /* ------------------------------------------------------------------ */
142
+
143
+ export interface ProvenanceClaim {
144
+ label: string;
145
+ value: ReactNode;
146
+ }
147
+
148
+ export interface AIDisclosureProvenanceProps extends Omit<
149
+ ComponentPropsWithRef<"button">,
150
+ "children"
151
+ > {
152
+ /**
153
+ * What is being claimed about this content, and by whom.
154
+ *
155
+ * Claims, not findings. They arrive as data — from a C2PA manifest your
156
+ * server read, from your own pipeline, from a vendor — and this renders them.
157
+ */
158
+ claims: ProvenanceClaim[];
159
+ /** Who asserts the claims. Named, because an unattributed claim is a rumour. */
160
+ source?: string;
161
+ /**
162
+ * Whether something you trust checked the claims, and said so.
163
+ *
164
+ * Supplied, never computed. Verifying a C2PA manifest means parsing signed
165
+ * COSE and walking a certificate chain; doing that in the browser would mean
166
+ * a wasm blob you cannot read, and "you own the source" would stop being
167
+ * true. It also cannot be trusted client-side even when it succeeds, because
168
+ * the page doing the checking is the page making the claim. Verify on a
169
+ * server and pass the answer down. Left undefined, this says so.
170
+ */
171
+ verified?: boolean;
172
+ triggerLabel?: string;
173
+ }
174
+
175
+ type CheckStatus = "verified" | "failed" | "unchecked";
176
+
177
+ function statusText(status: CheckStatus, source?: string): string {
178
+ const by = source ? ` by ${source}` : "";
179
+ if (status === "verified") return `Checked${by} and the claims matched.`;
180
+ if (status === "failed") return `Checked${by} and the claims did not match.`;
181
+ return "Not checked. These are claims made about the content, not findings.";
182
+ }
183
+
184
+ /**
185
+ * The metadata behind a disclosure, presented as claims rather than proof.
186
+ *
187
+ * The distinction is the entire point. "Made with Model X on 3 September" looks
188
+ * like a fact and is a string somebody put in a file. Rendering it beside a
189
+ * checkmark would launder an assertion into evidence, so the panel names who is
190
+ * asserting and states plainly whether anyone checked.
191
+ */
192
+ export function AIDisclosureProvenance({
193
+ className,
194
+ claims,
195
+ source,
196
+ verified,
197
+ triggerLabel = "Content details",
198
+ ...props
199
+ }: AIDisclosureProvenanceProps) {
200
+ const status = verified === undefined ? "unchecked" : verified ? "verified" : "failed";
201
+
202
+ return (
203
+ <Popover>
204
+ <PopoverTrigger asChild>
205
+ <button
206
+ type="button"
207
+ data-slot="ai-disclosure-provenance-trigger"
208
+ className={cn(
209
+ "rounded-sm underline decoration-dotted underline-offset-2 hover:decoration-solid",
210
+ focusRing,
211
+ className,
212
+ )}
213
+ {...props}
214
+ >
215
+ {triggerLabel}
216
+ </button>
217
+ </PopoverTrigger>
218
+ <PopoverContent aria-label={triggerLabel} className="w-80 text-xs">
219
+ <dl className="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5">
220
+ {claims.map((claim) => (
221
+ <div key={claim.label} className="contents">
222
+ <dt className="text-muted-foreground">{claim.label}</dt>
223
+ <dd className="break-words">{claim.value}</dd>
224
+ </div>
225
+ ))}
226
+ </dl>
227
+ {/* Said in text, and last, so it qualifies everything above it rather
228
+ than being a tick a reader has to interpret. */}
229
+ <p
230
+ data-slot="ai-disclosure-provenance-status"
231
+ data-status={status}
232
+ className={cn(
233
+ "mt-3 border-t border-border pt-2",
234
+ status === "failed" ? "text-destructive" : "text-muted-foreground",
235
+ )}
236
+ >
237
+ {statusText(status, source)}
238
+ </p>
239
+ </PopoverContent>
240
+ </Popover>
241
+ );
242
+ }
243
+
244
+ export { disclosureVariants };
@@ -0,0 +1,9 @@
1
+ export {
2
+ AIDisclosure,
3
+ AIDisclosureProvenance,
4
+ disclosureVariants,
5
+ type AIDisclosureProps,
6
+ type AIDisclosureProvenanceProps,
7
+ type DisclosureKind,
8
+ type ProvenanceClaim,
9
+ } from "./ai-disclosure";
@@ -0,0 +1,23 @@
1
+ import { defineMeta } from "@/registry/schema";
2
+
3
+ export const meta = defineMeta({
4
+ name: "ai-disclosure",
5
+ title: "AI Disclosure",
6
+ description: "Tells a reader they are looking at AI, and what is actually known about it.",
7
+ category: "ai",
8
+ status: "stable",
9
+ dependencies: ["class-variance-authority"],
10
+ registryDependencies: ["popover"],
11
+ files: ["ai-disclosure.tsx"],
12
+ a11y:
13
+ "The text is the disclosure and the icon is decoration, marked aria-hidden — a sparkle alone " +
14
+ "is a mark a sighted reader may not decode and a screen reader passes over in silence, which " +
15
+ "is the exact failure this component exists to prevent. Each of the four kinds carries " +
16
+ "wording of its own, so the distinction between generated, manipulated and human-reviewed " +
17
+ "survives for anyone who cannot see the styling. The provenance panel states in words " +
18
+ "whether anyone checked the claims and who, rather than implying it with a tick, and its " +
19
+ "three states are told apart by their sentences rather than by colour. " +
20
+ "Scope: this renders the human-visible disclosures of EU AI Act Article 50(1) and 50(4). " +
21
+ "It cannot satisfy 50(2), which requires machine-readable marking inside the artifact by " +
22
+ "whoever generated it, and no React component can. Not legal advice.",
23
+ });