@ds-mo/ui 14.12.0 → 14.14.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 (80) hide show
  1. package/NOTICE +10 -0
  2. package/dist/.package-ready.json +1 -1
  3. package/dist/agent-patterns.json +1 -1
  4. package/dist/agent.json +105 -5
  5. package/dist/angular/ds-input.d.ts +1 -1
  6. package/dist/angular/ds-input.js +3 -3
  7. package/dist/angular/ds-paper-texture.d.ts +12 -0
  8. package/dist/angular/ds-paper-texture.js +38 -0
  9. package/dist/angular/ds-shell-app.d.ts +1 -1
  10. package/dist/angular/ds-shell-app.js +3 -3
  11. package/dist/angular/index.d.ts +1 -1
  12. package/dist/angular/index.js +1 -0
  13. package/dist/angular/proxies.d.ts +1 -0
  14. package/dist/angular/proxies.js +1 -0
  15. package/dist/components/ds-bar-nav.js +1 -1
  16. package/dist/components/ds-bar-title.js +1 -1
  17. package/dist/components/ds-bar-workflow.js +1 -1
  18. package/dist/components/ds-bar-workflow.js.map +1 -1
  19. package/dist/components/ds-input.js +1 -1
  20. package/dist/components/ds-menu.js +1 -1
  21. package/dist/components/ds-mobile-header.js +1 -1
  22. package/dist/components/ds-mobile-section-switcher.js +1 -1
  23. package/dist/components/ds-panel-nav.js +1 -1
  24. package/dist/components/ds-paper-texture.d.ts +11 -0
  25. package/dist/components/ds-paper-texture.js +2 -0
  26. package/dist/components/ds-paper-texture.js.map +1 -0
  27. package/dist/components/ds-shell-app.js +1 -1
  28. package/dist/components/ds-shell-app.js.map +1 -1
  29. package/dist/components/ds-shell-page.js +1 -1
  30. package/dist/components/ds-shell-tools.js +1 -1
  31. package/dist/components/ds-swatch-picker.js +1 -1
  32. package/dist/components/ds-table-saved-views.js +1 -1
  33. package/dist/components/ds-table-saved-views.js.map +1 -1
  34. package/dist/components/ds-table-toolbar.js +1 -1
  35. package/dist/components/ds-table.js +1 -1
  36. package/dist/components/ds-toast.js +1 -1
  37. package/dist/components/ds-typing-indicator.js +1 -1
  38. package/dist/components/p-B80NfEqc.js +2 -0
  39. package/dist/components/p-B80NfEqc.js.map +1 -0
  40. package/dist/components/{p-BAStZzJu.js → p-C2n8A8NA.js} +2 -2
  41. package/dist/components/p-C5eosu67.js +2 -0
  42. package/dist/components/p-C5eosu67.js.map +1 -0
  43. package/dist/components/{p-iBuPFJL9.js → p-CKY989vF.js} +2 -2
  44. package/dist/components/p-CKY989vF.js.map +1 -0
  45. package/dist/components/{p-BHNFoHay.js → p-CWDmHPJC.js} +2 -2
  46. package/dist/components/{p-Bubs1_8P.js → p-Ck_VRQYi.js} +2 -2
  47. package/dist/components/{p-BZ3UTshV.js → p-Cyw9odJX.js} +2 -2
  48. package/dist/components/{p-DjqZWBnM.js → p-DL_5VENG.js} +2 -2
  49. package/dist/components/{p-Dh_p8OzP.js → p-DfyfrfHL.js} +2 -2
  50. package/dist/components/{p-DgWGfscR.js → p-Rfpd5mWO.js} +2 -2
  51. package/dist/components/p-URdgCwEs.js +2 -0
  52. package/dist/components/{p-GdlSIpHV.js.map → p-URdgCwEs.js.map} +1 -1
  53. package/dist/docs/components.json +186 -4
  54. package/dist/mcp-data/registry/bar-nav.json +1 -1
  55. package/dist/mcp-data/registry/input.json +55 -6
  56. package/dist/mcp-data/registry/panel-nav.json +1 -1
  57. package/dist/mcp-data/registry/paper-texture.json +141 -0
  58. package/dist/mcp-data/registry/registry.json +107 -4
  59. package/dist/mcp-data/registry/shell-app.json +25 -4
  60. package/dist/react/components.d.ts +1 -0
  61. package/dist/react/components.js +1 -0
  62. package/dist/react/ds-paper-texture.d.ts +9 -0
  63. package/dist/react/ds-paper-texture.js +12 -0
  64. package/dist/types/components/Input/Input.d.ts +7 -1
  65. package/dist/types/components/PaperTexture/PaperTexture.d.ts +19 -0
  66. package/dist/types/components/PaperTexture/paper-texture-types.d.ts +39 -0
  67. package/dist/types/components/ShellApp/ShellApp.d.ts +7 -0
  68. package/dist/types/components.d.ts +60 -0
  69. package/package.json +4 -2
  70. package/dist/components/p-DSuAHQRk.js +0 -2
  71. package/dist/components/p-DSuAHQRk.js.map +0 -1
  72. package/dist/components/p-GdlSIpHV.js +0 -2
  73. package/dist/components/p-iBuPFJL9.js.map +0 -1
  74. /package/dist/components/{p-BAStZzJu.js.map → p-C2n8A8NA.js.map} +0 -0
  75. /package/dist/components/{p-BHNFoHay.js.map → p-CWDmHPJC.js.map} +0 -0
  76. /package/dist/components/{p-Bubs1_8P.js.map → p-Ck_VRQYi.js.map} +0 -0
  77. /package/dist/components/{p-BZ3UTshV.js.map → p-Cyw9odJX.js.map} +0 -0
  78. /package/dist/components/{p-DjqZWBnM.js.map → p-DL_5VENG.js.map} +0 -0
  79. /package/dist/components/{p-Dh_p8OzP.js.map → p-DfyfrfHL.js.map} +0 -0
  80. /package/dist/components/{p-DgWGfscR.js.map → p-Rfpd5mWO.js.map} +0 -0
@@ -0,0 +1,141 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "paper-texture",
4
+ "title": "PaperTexture",
5
+ "description": "A decorative Paper Design WebGL2 paper texture surface with Storybook-tunable literal shader parameters and a static default frame.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/paper-texture",
11
+ "source": "src/wc/components/PaperTexture/PaperTexture.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "specialized",
15
+ "status": "experimental",
16
+ "summary": "A decorative Paper Design WebGL2 paper texture surface with Storybook-tunable literal shader parameters and a static default frame.",
17
+ "useWhen": [
18
+ "A shell or other visual surface needs a paper or cardboard texture layered above an existing background.",
19
+ "Designers need to tune paper texture parameters interactively before choosing a baked static asset."
20
+ ],
21
+ "avoidWhen": [
22
+ "The surface needs semantic content, interaction, or accessible information.",
23
+ "The target environment cannot provide WebGL2 and no pre-baked fallback asset is available.",
24
+ "A token-driven color treatment is required; this component accepts literal shader colors only."
25
+ ],
26
+ "alternatives": [],
27
+ "commonlyComposedWith": [
28
+ "component:ds-shell-app"
29
+ ],
30
+ "accessibility": [
31
+ "The texture is decorative and is hidden from assistive technology.",
32
+ "Keep all meaningful content in the owning surface above or beside the texture."
33
+ ],
34
+ "states": [
35
+ "The default speed is zero, so a texture renders one deterministic frame without a recurring animation loop.",
36
+ "Paper shader colors are literal CSS color strings and are not resolved from TokoMo tokens.",
37
+ "If WebGL2 or the noise texture is unavailable, the decorative layer removes itself without blocking the owning surface."
38
+ ],
39
+ "responsiveBehavior": [
40
+ "The shader observes its host dimensions and follows the owning surface through resize changes.",
41
+ "minPixelRatio and maxPixelCount are available for explicit quality/performance tuning."
42
+ ],
43
+ "frameworkCaveats": {
44
+ "customElements": [
45
+ "Assign config as a JavaScript property; nested shader values are not intended for serialized HTML attributes."
46
+ ],
47
+ "react": [
48
+ "Use the generated wrapper and pass the config object as a property."
49
+ ],
50
+ "angular": [
51
+ "Bind the config object as a property so nested shader values are preserved."
52
+ ]
53
+ },
54
+ "references": [
55
+ {
56
+ "label": "Storybook parameter playground",
57
+ "path": "src/wc/components/PaperTexture/PaperTexture.stories.ts"
58
+ }
59
+ ]
60
+ },
61
+ "api": {
62
+ "props": {
63
+ "config": {
64
+ "type": "PaperTextureConfig",
65
+ "resolvedType": "PaperTextureConfig",
66
+ "default": "{}",
67
+ "required": false,
68
+ "mutable": false,
69
+ "description": "Paper Design shader parameters. Set as a JavaScript property."
70
+ }
71
+ },
72
+ "events": [],
73
+ "methods": [],
74
+ "slots": []
75
+ },
76
+ "props": {
77
+ "config": {
78
+ "type": "PaperTextureConfig",
79
+ "resolvedType": "PaperTextureConfig",
80
+ "default": "{}",
81
+ "required": false,
82
+ "mutable": false,
83
+ "description": "Paper Design shader parameters. Set as a JavaScript property."
84
+ }
85
+ },
86
+ "events": [],
87
+ "methods": [],
88
+ "slots": [],
89
+ "exports": {
90
+ "customElement": "ds-paper-texture",
91
+ "react": "DsPaperTexture",
92
+ "angular": "DsPaperTexture"
93
+ },
94
+ "consumption": {
95
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
96
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
97
+ "customElements": {
98
+ "import": "import '@ds-mo/ui/dist/components/ds-paper-texture.js';",
99
+ "example": "<ds-paper-texture></ds-paper-texture>"
100
+ },
101
+ "react": {
102
+ "import": "import { DsPaperTexture } from '@ds-mo/ui/react';",
103
+ "example": "<DsPaperTexture />"
104
+ },
105
+ "angular": {
106
+ "import": "import { DsPaperTexture } from '@ds-mo/ui/angular/ds-paper-texture';",
107
+ "example": "<ds-paper-texture></ds-paper-texture>"
108
+ },
109
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: config.",
110
+ "peerDependencies": {
111
+ "required": [
112
+ "@ds-mo/tokens ^6.5.0",
113
+ "@ds-mo/icons ^7.0.0"
114
+ ],
115
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
116
+ }
117
+ }
118
+ },
119
+ "dependencies": [
120
+ "@ds-mo/ui",
121
+ "@ds-mo/tokens"
122
+ ],
123
+ "registryDependencies": [],
124
+ "files": [
125
+ {
126
+ "path": "src/wc/components/PaperTexture/PaperTexture.css",
127
+ "content": ":host {\n position: absolute;\n inset: 0;\n display: block;\n overflow: hidden;\n pointer-events: none;\n opacity: var(--ds-paper-texture-opacity, 1);\n}\n\n.paper-texture__mount {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n isolation: isolate;\n}\n\n.paper-texture__mount[data-paper-shader] canvas {\n z-index: 0;\n}\n\n:host([data-paper-texture-error]) {\n display: none;\n}\n",
128
+ "type": "registry:ui"
129
+ },
130
+ {
131
+ "path": "src/wc/components/PaperTexture/PaperTexture.tsx",
132
+ "content": "import { Component, Element, Host, Prop, Watch, h } from '@stencil/core';\nimport {\n emptyPixel,\n getShaderColorFromString,\n getShaderNoiseTexture,\n paperTextureFragmentShader,\n ShaderFitOptions,\n ShaderMount,\n type ShaderMountUniforms,\n} from '@paper-design/shaders';\nimport { DEFAULT_PAPER_TEXTURE_CONFIG, type PaperTextureConfig } from './paper-texture-types';\n\nlet emptyPixelPromise: Promise<HTMLImageElement> | undefined;\nlet noiseTexturePromise: Promise<HTMLImageElement> | undefined;\n\nfunction waitForImage(image: HTMLImageElement): Promise<HTMLImageElement> {\n if (image.complete) {\n return image.naturalWidth > 0\n ? Promise.resolve(image)\n : Promise.reject(new Error(`Paper texture image failed to load: ${image.src}`));\n }\n\n return new Promise((resolve, reject) => {\n const onLoad = () => {\n cleanup();\n resolve(image);\n };\n const onError = () => {\n cleanup();\n reject(new Error(`Paper texture image failed to load: ${image.src}`));\n };\n const cleanup = () => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n };\n\n image.addEventListener('load', onLoad, { once: true });\n image.addEventListener('error', onError, { once: true });\n });\n}\n\nfunction loadImage(source: HTMLImageElement | string | undefined): Promise<HTMLImageElement> {\n if (source instanceof HTMLImageElement) return waitForImage(source);\n\n const image = new Image();\n if (source && source !== emptyPixel) image.crossOrigin = 'anonymous';\n image.src = source || emptyPixel;\n return waitForImage(image);\n}\n\nfunction loadEmptyPixel(): Promise<HTMLImageElement> {\n emptyPixelPromise ??= loadImage(emptyPixel);\n return emptyPixelPromise;\n}\n\nfunction loadNoiseTexture(): Promise<HTMLImageElement> {\n noiseTexturePromise ??= Promise.resolve(getShaderNoiseTexture()).then(image => {\n if (!image) throw new Error('Paper texture noise texture is unavailable');\n return waitForImage(image);\n });\n return noiseTexturePromise;\n}\n\n@Component({\n tag: 'ds-paper-texture',\n styleUrl: 'PaperTexture.css',\n scoped: true,\n})\nexport class PaperTexture {\n @Element() el!: HTMLElement;\n\n /** Paper Design shader parameters. Set as a JavaScript property. */\n @Prop() config: PaperTextureConfig = {};\n\n private shaderMount?: ShaderMount;\n private syncGeneration = 0;\n private hasLoaded = false;\n\n componentDidLoad() {\n this.hasLoaded = true;\n void this.syncShader();\n }\n\n connectedCallback() {\n if (this.hasLoaded) void this.syncShader();\n }\n\n disconnectedCallback() {\n this.syncGeneration += 1;\n this.disposeShader();\n }\n\n @Watch('config')\n onConfigChange() {\n if (this.hasLoaded) void this.syncShader();\n }\n\n private resolvedConfig(): Required<Omit<PaperTextureConfig, 'image'>> &\n Pick<PaperTextureConfig, 'image'> {\n return {\n ...DEFAULT_PAPER_TEXTURE_CONFIG,\n ...(this.config ?? {}),\n };\n }\n\n private async syncShader() {\n const generation = ++this.syncGeneration;\n const config = this.resolvedConfig();\n\n try {\n const [image, noiseTexture] = await Promise.all([\n loadImage(config.image).catch(() => loadEmptyPixel()),\n loadNoiseTexture(),\n ]);\n\n if (generation !== this.syncGeneration || !this.el.isConnected) return;\n\n const uniforms = this.buildUniforms(config, image, noiseTexture);\n const mountElement = this.el.querySelector<HTMLElement>('.paper-texture__mount');\n if (!mountElement) return;\n\n if (!this.shaderMount) {\n this.shaderMount = new ShaderMount(\n mountElement,\n paperTextureFragmentShader,\n uniforms,\n undefined,\n config.speed,\n config.frame,\n config.minPixelRatio,\n config.maxPixelCount,\n ['u_image']\n );\n } else {\n this.shaderMount.setUniforms(uniforms);\n this.shaderMount.setSpeed(config.speed);\n this.shaderMount.setFrame(config.frame);\n this.shaderMount.setMinPixelRatio(config.minPixelRatio);\n this.shaderMount.setMaxPixelCount(config.maxPixelCount);\n }\n\n this.el.removeAttribute('data-paper-texture-error');\n } catch (error) {\n if (generation !== this.syncGeneration) return;\n this.disposeShader();\n this.el.querySelector<HTMLElement>('.paper-texture__mount')?.replaceChildren();\n this.el.setAttribute('data-paper-texture-error', 'unavailable');\n console.warn('[ds-paper-texture] WebGL2 paper texture unavailable.', error);\n }\n }\n\n private buildUniforms(\n config: Required<Omit<PaperTextureConfig, 'image'>> & Pick<PaperTextureConfig, 'image'>,\n image: HTMLImageElement,\n noiseTexture: HTMLImageElement\n ): ShaderMountUniforms {\n return {\n u_image: image,\n u_noiseTexture: noiseTexture,\n u_colorFront: getShaderColorFromString(config.colorFront),\n u_colorBack: getShaderColorFromString(config.colorBack),\n u_contrast: config.contrast,\n u_roughness: config.roughness,\n u_fiber: config.fiber,\n u_fiberSize: config.fiberSize,\n u_crumples: config.crumples,\n u_crumpleSize: config.crumpleSize,\n u_foldCount: config.foldCount,\n u_folds: config.folds,\n u_fade: config.fade,\n u_drops: config.drops,\n u_seed: config.seed,\n u_fit: ShaderFitOptions[config.fit],\n u_scale: config.scale,\n u_rotation: config.rotation,\n u_offsetX: config.offsetX,\n u_offsetY: config.offsetY,\n u_originX: config.originX,\n u_originY: config.originY,\n u_worldWidth: config.worldWidth,\n u_worldHeight: config.worldHeight,\n };\n }\n\n private disposeShader() {\n this.shaderMount?.dispose();\n this.shaderMount = undefined;\n }\n\n render() {\n const config = this.resolvedConfig();\n return (\n <Host aria-hidden=\"true\" style={{ '--ds-paper-texture-opacity': String(config.opacity) }}>\n <div class=\"paper-texture__mount\" />\n </Host>\n );\n }\n}\n",
133
+ "type": "registry:ui"
134
+ },
135
+ {
136
+ "path": "src/wc/components/PaperTexture/paper-texture-types.ts",
137
+ "content": "export type PaperTextureFit = 'none' | 'contain' | 'cover';\n\n/**\n * Literal parameters forwarded to Paper Design's paper texture shader.\n * Colors intentionally remain ordinary CSS color strings; they are not token\n * references and are parsed once into shader RGBA uniforms.\n */\nexport interface PaperTextureConfig {\n image?: HTMLImageElement | string;\n colorFront?: string;\n colorBack?: string;\n contrast?: number;\n roughness?: number;\n fiber?: number;\n fiberSize?: number;\n crumples?: number;\n crumpleSize?: number;\n folds?: number;\n foldCount?: number;\n fade?: number;\n drops?: number;\n seed?: number;\n fit?: PaperTextureFit;\n scale?: number;\n rotation?: number;\n originX?: number;\n originY?: number;\n offsetX?: number;\n offsetY?: number;\n worldWidth?: number;\n worldHeight?: number;\n speed?: number;\n frame?: number;\n minPixelRatio?: number;\n maxPixelCount?: number;\n /** CSS opacity applied after the shader has rendered. */\n opacity?: number;\n}\n\nexport const DEFAULT_PAPER_TEXTURE_CONFIG: Required<Omit<PaperTextureConfig, 'image'>> = {\n colorFront: '#b8b8b8',\n colorBack: '#ffffff',\n contrast: 0.3,\n roughness: 0.4,\n fiber: 0.3,\n fiberSize: 0.2,\n crumples: 0.3,\n crumpleSize: 0.35,\n folds: 0.65,\n foldCount: 5,\n fade: 0,\n drops: 0.2,\n seed: 5.8,\n fit: 'cover',\n scale: 0.6,\n rotation: 0,\n originX: 0.5,\n originY: 0.5,\n offsetX: 0,\n offsetY: 0,\n worldWidth: 0,\n worldHeight: 0,\n speed: 0,\n frame: 0,\n minPixelRatio: 2,\n maxPixelCount: 1920 * 1080 * 4,\n opacity: 1,\n};\n",
138
+ "type": "registry:ui"
139
+ }
140
+ ]
141
+ }
@@ -4197,7 +4197,7 @@
4197
4197
  {
4198
4198
  "name": "input",
4199
4199
  "title": "Input",
4200
- "description": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
4200
+ "description": "Form-associated single-line text and number field for primary and secondary application backgrounds, with native input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
4201
4201
  "type": "registry:ui",
4202
4202
  "meta": {
4203
4203
  "library": "@ds-mo/ui",
@@ -4208,9 +4208,9 @@
4208
4208
  "intent": {
4209
4209
  "audience": "general",
4210
4210
  "status": "stable",
4211
- "summary": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
4211
+ "summary": "Form-associated single-line text and number field for primary and secondary application backgrounds, with native input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
4212
4212
  "useWhen": [
4213
- "A user must enter or edit one line of text, an email address, telephone number, URL, search query, or password.",
4213
+ "A user must enter or edit one line of text, an email address, telephone number, URL, search query, password, or exact number.",
4214
4214
  "The value must participate in native, Angular, or React form state.",
4215
4215
  "A compact filter or toolbar needs a single-line search field that follows the shared control-density recipe."
4216
4216
  ],
@@ -4256,6 +4256,7 @@
4256
4256
  "Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
4257
4257
  "The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
4258
4258
  "Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
4259
+ "Number fields preserve native spinbutton semantics, stepping, and min/max constraint behavior while dsChange continues to report the native string value.",
4259
4260
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
4260
4261
  "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
4261
4262
  ],
@@ -4352,6 +4353,14 @@
4352
4353
  "type": "boolean",
4353
4354
  "required": false
4354
4355
  },
4356
+ "max": {
4357
+ "type": "number | undefined",
4358
+ "required": false
4359
+ },
4360
+ "min": {
4361
+ "type": "number | undefined",
4362
+ "required": false
4363
+ },
4355
4364
  "name": {
4356
4365
  "type": "string | undefined",
4357
4366
  "required": false
@@ -4376,6 +4385,10 @@
4376
4385
  "type": "InputSize",
4377
4386
  "required": false
4378
4387
  },
4388
+ "step": {
4389
+ "type": "number | undefined",
4390
+ "required": false
4391
+ },
4379
4392
  "type": {
4380
4393
  "type": "InputType",
4381
4394
  "required": false
@@ -6928,6 +6941,85 @@
6928
6941
  "tooltip"
6929
6942
  ]
6930
6943
  },
6944
+ {
6945
+ "name": "paper-texture",
6946
+ "title": "PaperTexture",
6947
+ "description": "A decorative Paper Design WebGL2 paper texture surface with Storybook-tunable literal shader parameters and a static default frame.",
6948
+ "type": "registry:ui",
6949
+ "meta": {
6950
+ "library": "@ds-mo/ui",
6951
+ "distribution": "npm",
6952
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/paper-texture",
6953
+ "source": "src/wc/components/PaperTexture/PaperTexture.tsx",
6954
+ "intentStatus": "complete",
6955
+ "intent": {
6956
+ "audience": "specialized",
6957
+ "status": "experimental",
6958
+ "summary": "A decorative Paper Design WebGL2 paper texture surface with Storybook-tunable literal shader parameters and a static default frame.",
6959
+ "useWhen": [
6960
+ "A shell or other visual surface needs a paper or cardboard texture layered above an existing background.",
6961
+ "Designers need to tune paper texture parameters interactively before choosing a baked static asset."
6962
+ ],
6963
+ "avoidWhen": [
6964
+ "The surface needs semantic content, interaction, or accessible information.",
6965
+ "The target environment cannot provide WebGL2 and no pre-baked fallback asset is available.",
6966
+ "A token-driven color treatment is required; this component accepts literal shader colors only."
6967
+ ],
6968
+ "alternatives": [],
6969
+ "commonlyComposedWith": [
6970
+ "component:ds-shell-app"
6971
+ ],
6972
+ "accessibility": [
6973
+ "The texture is decorative and is hidden from assistive technology.",
6974
+ "Keep all meaningful content in the owning surface above or beside the texture."
6975
+ ],
6976
+ "states": [
6977
+ "The default speed is zero, so a texture renders one deterministic frame without a recurring animation loop.",
6978
+ "Paper shader colors are literal CSS color strings and are not resolved from TokoMo tokens.",
6979
+ "If WebGL2 or the noise texture is unavailable, the decorative layer removes itself without blocking the owning surface."
6980
+ ],
6981
+ "responsiveBehavior": [
6982
+ "The shader observes its host dimensions and follows the owning surface through resize changes.",
6983
+ "minPixelRatio and maxPixelCount are available for explicit quality/performance tuning."
6984
+ ],
6985
+ "frameworkCaveats": {
6986
+ "customElements": [
6987
+ "Assign config as a JavaScript property; nested shader values are not intended for serialized HTML attributes."
6988
+ ],
6989
+ "react": [
6990
+ "Use the generated wrapper and pass the config object as a property."
6991
+ ],
6992
+ "angular": [
6993
+ "Bind the config object as a property so nested shader values are preserved."
6994
+ ]
6995
+ },
6996
+ "references": [
6997
+ {
6998
+ "label": "Storybook parameter playground",
6999
+ "path": "src/wc/components/PaperTexture/PaperTexture.stories.ts"
7000
+ }
7001
+ ]
7002
+ },
7003
+ "props": {
7004
+ "config": {
7005
+ "type": "PaperTextureConfig",
7006
+ "required": false
7007
+ }
7008
+ },
7009
+ "events": [],
7010
+ "slots": [],
7011
+ "exports": {
7012
+ "customElement": "ds-paper-texture",
7013
+ "react": "DsPaperTexture",
7014
+ "angular": "DsPaperTexture"
7015
+ }
7016
+ },
7017
+ "dependencies": [
7018
+ "@ds-mo/ui",
7019
+ "@ds-mo/tokens"
7020
+ ],
7021
+ "registryDependencies": []
7022
+ },
6931
7023
  {
6932
7024
  "name": "radio",
6933
7025
  "title": "Radio",
@@ -7515,7 +7607,8 @@
7515
7607
  "component:ds-mobile-bar-nav",
7516
7608
  "component:ds-shell-page",
7517
7609
  "component:ds-banner",
7518
- "component:ds-swatch-picker"
7610
+ "component:ds-swatch-picker",
7611
+ "component:ds-paper-texture"
7519
7612
  ],
7520
7613
  "patterns": [
7521
7614
  "pattern:application-shell",
@@ -7541,6 +7634,7 @@
7541
7634
  "Use composition=slotted only for advanced application architectures that intentionally own all lower-level chrome wiring.",
7542
7635
  "Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
7543
7636
  "The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
7637
+ "The optional paperTexture property adds a decorative Paper Design texture layer above the gradient or solid chrome frame; its color values are literal shader inputs rather than design tokens.",
7544
7638
  "Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
7545
7639
  "Replace navigation and pageChrome together from one completed route state.",
7546
7640
  "When pageChrome.showBack marks a detail depth, mobile chrome keeps the page heading as its identity and presents only local subsections; peer route tabs remain in desktop BarNav rather than replacing the detail heading.",
@@ -7561,20 +7655,24 @@
7561
7655
  "A slotted Banner remains below the top safe-area inset and above routed, navigation, fullscreen-tool, and mobile global-surface presentations.",
7562
7656
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
7563
7657
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
7658
+ "Paper texture chrome is desktop/tablet-only and follows the fixed viewport phase of the shell chrome; mobile remains a solid primary stage.",
7564
7659
  "Managed page-header capacity follows only the fixed shell breakpoint: roomy on desktop and compact on tablet. Opening PanelTools does not compact or constrain BarTitle.",
7565
7660
  "The bottom bar remains visible at all route and tool depths in the foundation release."
7566
7661
  ],
7567
7662
  "frameworkCaveats": {
7568
7663
  "customElements": [
7569
7664
  "Assign navigation, pageChrome, and tools as JavaScript properties on the managed ShellApp.",
7665
+ "Assign paperTexture as a JavaScript property when enabling the optional decorative layer.",
7570
7666
  "Stamp route-derived nav-style before components connect when deterministic first paint is required."
7571
7667
  ],
7572
7668
  "react": [
7573
7669
  "Use the generated ShellApp wrapper, structured object props, named tool-view slots, and stable routed children.",
7670
+ "Pass paperTexture as a structured property when the shell needs the optional texture layer.",
7574
7671
  "Resolve all shell inputs from one router state before rendering the composition."
7575
7672
  ],
7576
7673
  "angular": [
7577
7674
  "Use the generated standalone ShellApp adapter, bind structured object props, and preserve named tool-view slots.",
7675
+ "Bind paperTexture as a property so nested shader parameters are preserved.",
7578
7676
  "Bind complex inputs as properties and update navigation inputs atomically from one resolved router state.",
7579
7677
  "Bind both nav-style attributes and properties when deterministic first paint is required."
7580
7678
  ]
@@ -7627,6 +7725,10 @@
7627
7725
  "type": "ShellPageChromeConfig",
7628
7726
  "required": false
7629
7727
  },
7728
+ "paperTexture": {
7729
+ "type": "PaperTextureConfig",
7730
+ "required": false
7731
+ },
7630
7732
  "shortcutsEnabled": {
7631
7733
  "type": "boolean",
7632
7734
  "required": false
@@ -7713,6 +7815,7 @@
7713
7815
  "mobile-header",
7714
7816
  "mobile-sheet-nav",
7715
7817
  "panel-nav",
7818
+ "paper-texture",
7716
7819
  "shell-page",
7717
7820
  "shell-tools",
7718
7821
  "tooltip"