noecosystem-design 0.2.3 → 0.3.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 (49) hide show
  1. package/README.md +2 -2
  2. package/apps/storybook/stories/catalog/checkbox.stories.tsx +7 -2
  3. package/apps/storybook/stories/catalog/data-table.stories.tsx +226 -3
  4. package/docs/design-system/components.md +32 -0
  5. package/docs/design-system/inventory.md +1 -0
  6. package/docs/design-system/visual-qa.md +6 -0
  7. package/package.json +1 -1
  8. package/packages/data-ui/package.json +6 -1
  9. package/packages/data-ui/src/data-table.tsx +2 -99
  10. package/packages/data-ui/src/pagination.tsx +2 -2
  11. package/packages/data-ui/src/table/adapters/tanstack.test.ts +116 -0
  12. package/packages/data-ui/src/table/adapters/tanstack.ts +179 -0
  13. package/packages/data-ui/src/table/contracts.ts +133 -0
  14. package/packages/data-ui/src/table/data-table-visual.evidence.browser.test.tsx +157 -0
  15. package/packages/data-ui/src/table/data-table.browser.test.tsx +180 -0
  16. package/packages/data-ui/src/table/data-table.tsx +524 -0
  17. package/packages/design-tokens/src/tokens.css +10 -4
  18. package/packages/design-tokens/src/tokens.json +8 -4
  19. package/packages/design-tokens/src/tokens.mjs +8 -4
  20. package/packages/registry/catalog-index.json +2 -2
  21. package/packages/registry/manifest.json +60 -18
  22. package/packages/registry/r/activity-feed.json +1 -1
  23. package/packages/registry/r/agent-composer.json +7 -1
  24. package/packages/registry/r/agent-message.json +1 -1
  25. package/packages/registry/r/agent-plan.json +1 -1
  26. package/packages/registry/r/agent-workspace.json +1 -1
  27. package/packages/registry/r/approval-request.json +7 -1
  28. package/packages/registry/r/calendar.json +6 -5
  29. package/packages/registry/r/chart-frame.json +1 -1
  30. package/packages/registry/r/chart.json +1 -1
  31. package/packages/registry/r/dashboard-01.json +22 -2
  32. package/packages/registry/r/dashboard-02.json +22 -2
  33. package/packages/registry/r/dashboard-shell.json +1 -1
  34. package/packages/registry/r/data-table.json +22 -2
  35. package/packages/registry/r/date-picker.json +6 -5
  36. package/packages/registry/r/filter-bar.json +1 -1
  37. package/packages/registry/r/inline-cta.json +6 -6
  38. package/packages/registry/r/metric-card.json +1 -1
  39. package/packages/registry/r/pagination.json +7 -5
  40. package/packages/registry/r/run-inspector.json +1 -1
  41. package/packages/registry/r/tool-call.json +1 -1
  42. package/packages/registry/r/workflow-canvas.json +1 -1
  43. package/packages/registry/r/workflow-node.json +1 -1
  44. package/packages/registry/registry.json +12 -3
  45. package/packages/registry/search-index.json +23 -8
  46. package/packages/ui/package.json +5 -1
  47. package/packages/ui/src/checkbox.tsx +1 -1
  48. package/scripts/generate-manifest.mjs +71 -0
  49. package/vitest.config.ts +5 -0
@@ -119,6 +119,76 @@ function toTitle(id) {
119
119
 
120
120
  // Enrichment database — semantic, agent-friendly metadata per spec
121
121
  const enrichments = {
122
+ 'data-table': {
123
+ description:
124
+ 'Semantic data table with TanStack Table v9 as a headless engine behind the internal NOE adapter: sorting, NOE filter operators, controlled pagination, stable-id selection, loading skeletons and server mode.',
125
+ capabilityAliases: ['data table', 'sortable table', 'server-side table', 'grid'],
126
+ searchTerms: [
127
+ 'data-table',
128
+ 'table',
129
+ 'sorting',
130
+ 'filtering',
131
+ 'pagination',
132
+ 'selection',
133
+ 'server-side',
134
+ 'aria-sort',
135
+ ],
136
+ useWhen: [
137
+ 'tabular product data with sorting, filtering, pagination or row selection',
138
+ 'server-driven pages composed from toDataQuery against Django APIs',
139
+ ],
140
+ doNotUseWhen: [
141
+ 'spreadsheet-style cell editing grids',
142
+ 'static lists without tabular semantics',
143
+ ],
144
+ alternatives: ['DataList'],
145
+ variants: ['regular', 'compact'],
146
+ states: ['default', 'hover', 'loading', 'selected', 'empty', 'focus-visible'],
147
+ tokenContracts: [
148
+ 'color.border',
149
+ 'color.foreground',
150
+ 'color.muted-foreground',
151
+ 'surface.sunken',
152
+ 'muted',
153
+ ],
154
+ propsSummary: {
155
+ columns: 'DataColumn<Row>[]',
156
+ rows: 'Row[]',
157
+ caption: 'string',
158
+ empty: 'ReactNode',
159
+ sorting: 'readonly DataSort[]',
160
+ filters: 'readonly FilterSpec[]',
161
+ page: 'PageSpec',
162
+ selection: 'readonly RowId[]',
163
+ density: "'compact' | 'regular'",
164
+ loading: 'boolean',
165
+ manualSorting: 'boolean',
166
+ manualFiltering: 'boolean',
167
+ manualPagination: 'boolean',
168
+ totalRowCount: 'number',
169
+ },
170
+ accessibility: {
171
+ role: 'table',
172
+ keyboard: [
173
+ 'Tab moves into the scrollable region',
174
+ 'Enter/Space on header toggles sort',
175
+ 'Enter/Space on checkbox toggles row selection',
176
+ ],
177
+ announcements: ['aria-sort on sorted column headers', 'aria-live pagination status'],
178
+ focusBehavior: ['visible ring 2px', 'scroll container focusable for keyboard overflow'],
179
+ },
180
+ internationalization: {
181
+ messageKeys: [],
182
+ rtl: 'required',
183
+ bidiNotes: [
184
+ 'logical start/end alignment only',
185
+ 'technical cells render dir=ltr via TechnicalValue',
186
+ 'pagination controls use caller-provided accessible labels',
187
+ ],
188
+ },
189
+ relatedPatterns: ['filter-bar', 'pagination', 'empty-state'],
190
+ untitledMapping: null,
191
+ },
122
192
  'bidi-text': {
123
193
  description:
124
194
  'Mixed-direction content primitives for user text, URLs, hashes, commands and technical identifiers with explicit LTR isolation.',
@@ -815,6 +885,7 @@ function defaultEnrichment(auditItem) {
815
885
  const registryDeps = [];
816
886
  const peerDeps = ['react'];
817
887
  if (pkg === '@noe/data-ui') deps.push('@noe/ui');
888
+ if (auditItem.id === 'data-table') deps.push('@tanstack/react-table');
818
889
  if (pkg === '@noe/ai-ui') deps.push('@noe/ui');
819
890
  if (pkg === '@noe/workflow-ui') deps.push('@noe/ui');
820
891
  if (auditItem.id === 'pagination' || auditItem.id === 'fab' || auditItem.id === 'filter-bar')
package/vitest.config.ts CHANGED
@@ -2,6 +2,7 @@ import { dirname } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
 
4
4
  import react from '@vitejs/plugin-react';
5
+ import tailwindcss from '@tailwindcss/vite';
5
6
  import { playwright } from '@vitest/browser-playwright';
6
7
  import tsconfigPaths from 'vite-tsconfig-paths';
7
8
  import { defineConfig } from 'vitest/config';
@@ -46,6 +47,9 @@ export default defineConfig({
46
47
  },
47
48
  },
48
49
  {
50
+ // Tailwind expands `@import "tailwindcss"` so component browser tests and
51
+ // visual evidence render with the real NOE utility classes, matching Storybook.
52
+ plugins: [tailwindcss()],
49
53
  optimizeDeps: {
50
54
  entries: ['apps/**/*.browser.test.tsx', 'packages/**/*.browser.test.tsx'],
51
55
  },
@@ -83,6 +87,7 @@ export default defineConfig({
83
87
  provider: playwright(),
84
88
  headless: true,
85
89
  instances: [{ browser: 'chromium' }],
90
+ viewport: { width: 1280, height: 900 },
86
91
  },
87
92
  },
88
93
  },