@svadmin/surface 0.9.0 → 0.11.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 (145) hide show
  1. package/README.md +9 -3
  2. package/STYLING.md +4 -2
  3. package/compatibility.json +18 -7
  4. package/dist/agent-contract.d.ts +1 -1
  5. package/dist/agent-contract.js +5 -2
  6. package/dist/builtin-schemas.js +1 -1
  7. package/dist/business-data.d.ts +16 -0
  8. package/dist/business-data.js +42 -0
  9. package/dist/business-definitions.d.ts +28 -0
  10. package/dist/business-definitions.js +53 -0
  11. package/dist/business.d.ts +3 -0
  12. package/dist/business.js +17 -0
  13. package/dist/components/ActivityFeedWidget.svelte +34 -0
  14. package/dist/components/ActivityFeedWidget.svelte.d.ts +4 -0
  15. package/dist/components/MetricWidget.svelte +2 -1
  16. package/dist/components/MetricWidget.svelte.d.ts +1 -0
  17. package/dist/components/ResourceDetailWidget.svelte +56 -0
  18. package/dist/components/ResourceDetailWidget.svelte.d.ts +4 -0
  19. package/dist/components/ResourceFormBody.svelte +1 -1
  20. package/dist/components/ResourceTableWidget.svelte +2 -1
  21. package/dist/components/ResourceTableWidget.svelte.d.ts +1 -0
  22. package/dist/components/SurfaceEditPreview.svelte +1 -1
  23. package/dist/components/SurfaceRenderer.svelte +2 -1
  24. package/dist/components/SurfaceRenderer.svelte.d.ts +1 -0
  25. package/dist/design-contract.d.ts +2 -0
  26. package/dist/design-contract.js +2 -0
  27. package/dist/localization.d.ts +11 -1
  28. package/dist/localization.js +20 -0
  29. package/dist/openui.js +17 -1
  30. package/dist/recipes.d.ts +20 -0
  31. package/dist/recipes.js +20 -0
  32. package/dist/styles/{editor.generated.js → editor.js} +1 -1
  33. package/dist/styles.css +41 -1260
  34. package/dist/types.d.ts +1 -1
  35. package/dist/validation.js +12 -6
  36. package/dist/workflows/catalog.js +1 -1
  37. package/package.json +15 -8
  38. package/dist/styled-system/css/conditions.js +0 -36
  39. package/dist/styled-system/css/css.d.ts +0 -22
  40. package/dist/styled-system/css/css.js +0 -45
  41. package/dist/styled-system/css/cva.d.ts +0 -6
  42. package/dist/styled-system/css/cva.js +0 -87
  43. package/dist/styled-system/css/cx.d.ts +0 -5
  44. package/dist/styled-system/css/cx.js +0 -15
  45. package/dist/styled-system/css/index.d.ts +0 -5
  46. package/dist/styled-system/css/index.js +0 -4
  47. package/dist/styled-system/css/sva.d.ts +0 -4
  48. package/dist/styled-system/css/sva.js +0 -46
  49. package/dist/styled-system/design-contract.d.ts +0 -13
  50. package/dist/styled-system/design-contract.js +0 -11
  51. package/dist/styled-system/helpers.js +0 -316
  52. package/dist/styled-system/patterns/aspect-ratio.d.ts +0 -20
  53. package/dist/styled-system/patterns/aspect-ratio.js +0 -38
  54. package/dist/styled-system/patterns/bleed.d.ts +0 -21
  55. package/dist/styled-system/patterns/bleed.js +0 -24
  56. package/dist/styled-system/patterns/box.d.ts +0 -20
  57. package/dist/styled-system/patterns/box.js +0 -15
  58. package/dist/styled-system/patterns/center.d.ts +0 -20
  59. package/dist/styled-system/patterns/center.js +0 -21
  60. package/dist/styled-system/patterns/circle.d.ts +0 -20
  61. package/dist/styled-system/patterns/circle.js +0 -25
  62. package/dist/styled-system/patterns/container.d.ts +0 -20
  63. package/dist/styled-system/patterns/container.js +0 -21
  64. package/dist/styled-system/patterns/cq.d.ts +0 -21
  65. package/dist/styled-system/patterns/cq.js +0 -21
  66. package/dist/styled-system/patterns/divider.d.ts +0 -22
  67. package/dist/styled-system/patterns/divider.js +0 -25
  68. package/dist/styled-system/patterns/flex.d.ts +0 -26
  69. package/dist/styled-system/patterns/flex.js +0 -26
  70. package/dist/styled-system/patterns/float.d.ts +0 -23
  71. package/dist/styled-system/patterns/float.js +0 -52
  72. package/dist/styled-system/patterns/grid-item.d.ts +0 -25
  73. package/dist/styled-system/patterns/grid-item.js +0 -25
  74. package/dist/styled-system/patterns/grid.d.ts +0 -24
  75. package/dist/styled-system/patterns/grid.js +0 -27
  76. package/dist/styled-system/patterns/hstack.d.ts +0 -21
  77. package/dist/styled-system/patterns/hstack.js +0 -24
  78. package/dist/styled-system/patterns/index.d.ts +0 -21
  79. package/dist/styled-system/patterns/index.js +0 -20
  80. package/dist/styled-system/patterns/link-overlay.d.ts +0 -20
  81. package/dist/styled-system/patterns/link-overlay.js +0 -24
  82. package/dist/styled-system/patterns/spacer.d.ts +0 -20
  83. package/dist/styled-system/patterns/spacer.js +0 -25
  84. package/dist/styled-system/patterns/square.d.ts +0 -20
  85. package/dist/styled-system/patterns/square.js +0 -24
  86. package/dist/styled-system/patterns/stack.d.ts +0 -23
  87. package/dist/styled-system/patterns/stack.js +0 -24
  88. package/dist/styled-system/patterns/visually-hidden.d.ts +0 -20
  89. package/dist/styled-system/patterns/visually-hidden.js +0 -18
  90. package/dist/styled-system/patterns/vstack.d.ts +0 -21
  91. package/dist/styled-system/patterns/vstack.js +0 -24
  92. package/dist/styled-system/patterns/wrap.d.ts +0 -24
  93. package/dist/styled-system/patterns/wrap.js +0 -25
  94. package/dist/styled-system/recipes/content-header.d.ts +0 -31
  95. package/dist/styled-system/recipes/content-header.js +0 -65
  96. package/dist/styled-system/recipes/content-page.d.ts +0 -34
  97. package/dist/styled-system/recipes/content-page.js +0 -43
  98. package/dist/styled-system/recipes/create-recipe.js +0 -82
  99. package/dist/styled-system/recipes/index.d.ts +0 -17
  100. package/dist/styled-system/recipes/index.js +0 -16
  101. package/dist/styled-system/recipes/metric-block.d.ts +0 -34
  102. package/dist/styled-system/recipes/metric-block.js +0 -76
  103. package/dist/styled-system/recipes/product-list.d.ts +0 -31
  104. package/dist/styled-system/recipes/product-list.js +0 -73
  105. package/dist/styled-system/recipes/product-section.d.ts +0 -31
  106. package/dist/styled-system/recipes/product-section.js +0 -49
  107. package/dist/styled-system/recipes/product-settings-row.d.ts +0 -34
  108. package/dist/styled-system/recipes/product-settings-row.js +0 -58
  109. package/dist/styled-system/recipes/product-settings.d.ts +0 -31
  110. package/dist/styled-system/recipes/product-settings.js +0 -57
  111. package/dist/styled-system/recipes/product-status.d.ts +0 -34
  112. package/dist/styled-system/recipes/product-status.js +0 -45
  113. package/dist/styled-system/recipes/product-toolbar.d.ts +0 -31
  114. package/dist/styled-system/recipes/product-toolbar.js +0 -41
  115. package/dist/styled-system/recipes/product-workspace.d.ts +0 -34
  116. package/dist/styled-system/recipes/product-workspace.js +0 -58
  117. package/dist/styled-system/recipes/surface-metric.d.ts +0 -38
  118. package/dist/styled-system/recipes/surface-metric.js +0 -63
  119. package/dist/styled-system/recipes/surface-table.d.ts +0 -34
  120. package/dist/styled-system/recipes/surface-table.js +0 -62
  121. package/dist/styled-system/recipes/ui-badge.d.ts +0 -31
  122. package/dist/styled-system/recipes/ui-badge.js +0 -38
  123. package/dist/styled-system/recipes/ui-button.d.ts +0 -32
  124. package/dist/styled-system/recipes/ui-button.js +0 -43
  125. package/dist/styled-system/recipes/ui-input.d.ts +0 -31
  126. package/dist/styled-system/recipes/ui-input.js +0 -49
  127. package/dist/styled-system/recipes/ui-textarea.d.ts +0 -31
  128. package/dist/styled-system/recipes/ui-textarea.js +0 -24
  129. package/dist/styled-system/styles.css +0 -1257
  130. package/dist/styled-system/tokens/index.d.ts +0 -9
  131. package/dist/styled-system/tokens/index.js +0 -268
  132. package/dist/styled-system/tokens/tokens.d.ts +0 -36
  133. package/dist/styled-system/types/composition.d.ts +0 -227
  134. package/dist/styled-system/types/conditions.d.ts +0 -236
  135. package/dist/styled-system/types/csstype.d.ts +0 -22570
  136. package/dist/styled-system/types/index.d.ts +0 -6
  137. package/dist/styled-system/types/parts.d.ts +0 -8
  138. package/dist/styled-system/types/pattern.d.ts +0 -78
  139. package/dist/styled-system/types/prop-type.d.ts +0 -223
  140. package/dist/styled-system/types/recipe.d.ts +0 -181
  141. package/dist/styled-system/types/selectors.d.ts +0 -59
  142. package/dist/styled-system/types/static-css.d.ts +0 -56
  143. package/dist/styled-system/types/style-props.d.ts +0 -8088
  144. package/dist/styled-system/types/system-types.d.ts +0 -151
  145. /package/dist/styles/{editor.generated.d.ts → editor.d.ts} +0 -0
package/dist/types.d.ts CHANGED
@@ -88,7 +88,7 @@ export interface SurfaceResourcePolicy {
88
88
  export interface SurfacePolicy {
89
89
  readonly resources: Readonly<Record<string, SurfaceResourcePolicy>>;
90
90
  }
91
- export type SurfaceCatalogDataKind = 'none' | 'scalar' | 'items';
91
+ export type SurfaceCatalogDataKind = 'none' | 'scalar' | 'items' | 'record';
92
92
  export interface SurfaceWidgetDefinition {
93
93
  readonly type: string;
94
94
  readonly dataKind: SurfaceCatalogDataKind;
@@ -97,10 +97,15 @@ function propsContainForbiddenKey(props) {
97
97
  }
98
98
  function referencedFieldIssue(widget, widgetIndex, definition, source, policy) {
99
99
  if (!definition.getReferencedFields)
100
- return null;
100
+ return definition.dataKind === 'record'
101
+ ? { code: 'invalid_widget_props', path: `/widgets/${widgetIndex}/props`, message: 'Record widgets require an explicit field selector', widgetId: widget.id }
102
+ : null;
101
103
  let referencedFields;
102
104
  try {
103
105
  referencedFields = definition.getReferencedFields(widget.props);
106
+ if (!Array.isArray(referencedFields) || (definition.dataKind === 'record' && referencedFields.length === 0)) {
107
+ throw new Error('Record fields must be explicit');
108
+ }
104
109
  }
105
110
  catch {
106
111
  return {
@@ -111,13 +116,13 @@ function referencedFieldIssue(widget, widgetIndex, definition, source, policy) {
111
116
  };
112
117
  }
113
118
  const readableFields = resourcePolicyFor(policy, source.resource)?.readFields ?? [];
114
- const deniedField = referencedFields.find((field) => (typeof field !== "string" || !readableFields.includes(field)));
115
- return deniedField === undefined
119
+ const deniedIndex = referencedFields.findIndex((field) => (typeof field !== "string" || !readableFields.includes(field)));
120
+ return deniedIndex === -1
116
121
  ? null
117
122
  : {
118
123
  code: "field_denied",
119
124
  path: `/widgets/${widgetIndex}/props`,
120
- message: `Field "${String(deniedField)}" is not readable`,
125
+ message: `Field "${String(referencedFields[deniedIndex])}" is not readable`,
121
126
  widgetId: widget.id,
122
127
  sourceId: source.id,
123
128
  };
@@ -186,8 +191,9 @@ function widgetIssue(widget, widgetIndex, definition, sources, policy) {
186
191
  const resourceOneField = source.type === "resource-one" ? resourceOnePointerField(pointer) : null;
187
192
  const pointerIsValid = definition.dataKind === "items"
188
193
  ? source.type === "resource-list" && pointer === "/items"
189
- : (source.type === "resource-list" && pointer === "/total")
190
- || resourceOneField !== null;
194
+ : definition.dataKind === 'record'
195
+ ? source.type === 'resource-one' && pointer === ''
196
+ : definition.dataKind === 'scalar' && ((source.type === "resource-list" && pointer === "/total") || resourceOneField !== null);
191
197
  if (!pointerIsValid) {
192
198
  return {
193
199
  code: "invalid_binding_pointer",
@@ -1,5 +1,5 @@
1
1
  import { Type } from '@sinclair/typebox';
2
- import { surfaceDesignContract } from '../styled-system/design-contract.js';
2
+ import { surfaceDesignContract } from '../design-contract.js';
3
3
  import { validateSurfaceActionDescriptor } from './action-contracts.js';
4
4
  export const surfaceAppearanceSchema = Type.Object({
5
5
  tone: Type.Optional(Type.Union(surfaceDesignContract.metric.tone.map((tone) => Type.Literal(tone)))),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/surface",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Validated declarative surfaces for svadmin dashboards",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -42,6 +42,15 @@
42
42
  "svelte": "./dist/svar.js",
43
43
  "default": "./dist/svar.js"
44
44
  },
45
+ "./business-contracts": {
46
+ "types": "./dist/business-definitions.d.ts",
47
+ "default": "./dist/business-definitions.js"
48
+ },
49
+ "./business": {
50
+ "types": "./dist/business.d.ts",
51
+ "svelte": "./dist/business.js",
52
+ "default": "./dist/business.js"
53
+ },
45
54
  "./workflows": {
46
55
  "types": "./dist/workflows.d.ts",
47
56
  "default": "./dist/workflows.js"
@@ -65,15 +74,14 @@
65
74
  }
66
75
  },
67
76
  "peerDependencies": {
68
- "@svadmin/core": ">=0.34.2 <0.54.0",
69
- "@svadmin/ui": ">=0.40.6 <0.74.0",
70
- "svelte": "^5.56.8"
77
+ "@svadmin/core": ">=0.53.0 <0.56.0",
78
+ "@svadmin/ui": ">=0.73.0 <0.76.0",
79
+ "svelte": "^5.56.10"
71
80
  },
72
81
  "dependencies": {
73
82
  "@sinclair/typebox": "^0.34.52"
74
83
  },
75
84
  "devDependencies": {
76
- "@pandacss/dev": "1.12.1",
77
85
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
78
86
  "@testing-library/dom": "^10.4.1",
79
87
  "@testing-library/svelte": "^5.4.2",
@@ -83,11 +91,10 @@
83
91
  "vitest": "^4.1.11"
84
92
  },
85
93
  "scripts": {
86
- "build": "node scripts/build-editor-styles.mjs && node scripts/prepare-design.mjs && node ../../node_modules/@sveltejs/package/svelte-package.js -i src -o dist",
94
+ "build": "node ../../node_modules/@sveltejs/package/svelte-package.js -i src -o dist",
87
95
  "check": "svelte-check --tsgo-experimental-api --tsconfig ./tsconfig.check.json --threshold error",
88
96
  "test": "vitest run --config ./vitest.config.ts",
89
- "styles:build": "node scripts/build-editor-styles.mjs",
90
- "styles:check": "node scripts/build-editor-styles.mjs --check"
97
+ "styles:check": "node --experimental-strip-types --test scripts/styles.test.mjs"
91
98
  },
92
99
  "license": "MIT",
93
100
  "publishConfig": {
@@ -1,36 +0,0 @@
1
- import { withoutSpace } from '../helpers.js';
2
-
3
- const conditionsStr = "_hover,_focus,_focusWithin,_focusVisible,_disabled,_active,_visited,_target,_readOnly,_readWrite,_empty,_checked,_enabled,_expanded,_highlighted,_complete,_incomplete,_dragging,_before,_after,_firstLetter,_firstLine,_marker,_selection,_file,_backdrop,_first,_last,_only,_even,_odd,_firstOfType,_lastOfType,_onlyOfType,_peerFocus,_peerHover,_peerActive,_peerFocusWithin,_peerFocusVisible,_peerDisabled,_peerChecked,_peerInvalid,_peerExpanded,_peerPlaceholderShown,_groupFocus,_groupHover,_groupActive,_groupFocusWithin,_groupFocusVisible,_groupDisabled,_groupChecked,_groupExpanded,_groupInvalid,_indeterminate,_required,_valid,_invalid,_autofill,_inRange,_outOfRange,_placeholder,_placeholderShown,_pressed,_selected,_grabbed,_underValue,_overValue,_atValue,_default,_optional,_open,_closed,_fullscreen,_loading,_hidden,_current,_currentPage,_currentStep,_today,_unavailable,_rangeStart,_rangeEnd,_now,_topmost,_motionReduce,_motionSafe,_print,_landscape,_portrait,_dark,_light,_osDark,_osLight,_highContrast,_lessContrast,_moreContrast,_ltr,_rtl,_scrollbar,_scrollbarThumb,_scrollbarTrack,_horizontal,_vertical,_icon,_starting,_noscript,_invertedColors,base"
4
- const conditions = new Set(conditionsStr.split(','))
5
-
6
- const conditionRegex = /^@|&|&$/
7
-
8
- export function isCondition(value){
9
- return conditions.has(value) || conditionRegex.test(value)
10
- }
11
-
12
- const underscoreRegex = /^_/
13
- const conditionsSelectorRegex = /&|@/
14
-
15
- export function finalizeConditions(paths){
16
- return paths.map((path) => {
17
- if (conditions.has(path)){
18
- return path.replace(underscoreRegex, '')
19
- }
20
-
21
- if (conditionsSelectorRegex.test(path)){
22
- return `[${withoutSpace(path.trim())}]`
23
- }
24
-
25
- return path
26
- })}
27
-
28
- export function sortConditions(paths){
29
- return paths.sort((a, b) => {
30
- const aa = isCondition(a)
31
- const bb = isCondition(b)
32
- if (aa && !bb) return 1
33
- if (!aa && bb) return -1
34
- return 0
35
- })
36
- }
@@ -1,22 +0,0 @@
1
- /* eslint-disable */
2
- import type { SystemStyleObject } from '../types/index';
3
-
4
- type Styles = SystemStyleObject | undefined | null | false
5
-
6
- interface CssRawFunction {
7
- (styles: Styles): SystemStyleObject
8
- (styles: Styles[]): SystemStyleObject
9
- (...styles: Array<Styles | Styles[]>): SystemStyleObject
10
- (styles: Styles): SystemStyleObject
11
- }
12
-
13
- interface CssFunction {
14
- (styles: Styles): string
15
- (styles: Styles[]): string
16
- (...styles: Array<Styles | Styles[]>): string
17
- (styles: Styles): string
18
-
19
- raw: CssRawFunction
20
- }
21
-
22
- export declare const css: CssFunction;
@@ -1,45 +0,0 @@
1
- import { createCss, createMergeCss, hypenateProperty, withoutSpace } from '../helpers.js';
2
- import { sortConditions, finalizeConditions } from './conditions.js';
3
-
4
- const utilities = "aspectRatio:asp,boxDecorationBreak:bx-db,zIndex:z,boxSizing:bx-s,objectPosition:obj-p,objectFit:obj-f,overscrollBehavior:ovs-b,overscrollBehaviorX:ovs-bx,overscrollBehaviorY:ovs-by,position:pos/1,top:top,left:left,inset:inset,insetInline:inset-x/insetX,insetBlock:inset-y/insetY,insetBlockEnd:inset-be,insetBlockStart:inset-bs,insetInlineEnd:inset-e/insetEnd/end,insetInlineStart:inset-s/insetStart/start,right:right,bottom:bottom,float:float,visibility:vis,display:d,hideFrom:hide,hideBelow:show,flexBasis:flex-b,flex:flex,flexDirection:flex-d/flexDir,flexGrow:flex-g,flexShrink:flex-sh,gridTemplateColumns:grid-tc,gridTemplateRows:grid-tr,gridColumn:grid-c,gridRow:grid-r,gridColumnStart:grid-cs,gridColumnEnd:grid-ce,gridAutoFlow:grid-af,gridAutoColumns:grid-ac,gridAutoRows:grid-ar,gap:gap,gridGap:grid-g,gridRowGap:grid-rg,gridColumnGap:grid-cg,rowGap:rg,columnGap:cg,justifyContent:jc,alignContent:ac,alignItems:ai,alignSelf:as,padding:p/1,paddingLeft:pl/1,paddingRight:pr/1,paddingTop:pt/1,paddingBottom:pb/1,paddingBlock:py/1/paddingY,paddingBlockEnd:pbe,paddingBlockStart:pbs,paddingInline:px/paddingX/1,paddingInlineEnd:pe/1/paddingEnd,paddingInlineStart:ps/1/paddingStart,marginLeft:ml/1,marginRight:mr/1,marginTop:mt/1,marginBottom:mb/1,margin:m/1,marginBlock:my/1/marginY,marginBlockEnd:mbe,marginBlockStart:mbs,marginInline:mx/1/marginX,marginInlineEnd:me/1/marginEnd,marginInlineStart:ms/1/marginStart,spaceX:sx,spaceY:sy,outlineWidth:ring-w/ringWidth,outlineColor:ring-c/ringColor,outline:ring/1,outlineOffset:ring-o/ringOffset,focusRing:focus-ring,focusVisibleRing:focus-v-ring,focusRingColor:focus-ring-c,focusRingOffset:focus-ring-o,focusRingWidth:focus-ring-w,focusRingStyle:focus-ring-s,divideX:dvd-x,divideY:dvd-y,divideColor:dvd-c,divideStyle:dvd-s,width:w/1,inlineSize:w-is,minWidth:min-w/minW,minInlineSize:min-w-is,maxWidth:max-w/maxW,maxInlineSize:max-w-is,height:h/1,blockSize:h-bs,minHeight:min-h/minH,minBlockSize:min-h-bs,maxHeight:max-h/maxH,maxBlockSize:max-b,boxSize:size,color:c,fontFamily:ff,fontSize:fs,fontSizeAdjust:fs-a,fontPalette:fp,fontKerning:fk,fontFeatureSettings:ff-s,fontWeight:fw,fontSmoothing:fsmt,fontVariant:fv,fontVariantAlternates:fv-alt,fontVariantCaps:fv-caps,fontVariationSettings:fv-s,fontVariantNumeric:fv-num,letterSpacing:ls,lineHeight:lh,textAlign:ta,textDecoration:td,textDecorationColor:td-c,textEmphasisColor:te-c,textDecorationStyle:td-s,textDecorationThickness:td-t,textUnderlineOffset:tu-o,textTransform:tt,textIndent:ti,textShadow:tsh,textShadowColor:tsh-c/textShadowColor,WebkitTextFillColor:wktf-c,textOverflow:tov,verticalAlign:va,wordBreak:wb,textWrap:tw,truncate:trunc,lineClamp:lc,listStyleType:li-t,listStylePosition:li-pos,listStyleImage:li-img,listStyle:li-s,backgroundPosition:bg-p/bgPosition,backgroundPositionX:bg-p-x/bgPositionX,backgroundPositionY:bg-p-y/bgPositionY,backgroundAttachment:bg-a/bgAttachment,backgroundClip:bg-cp/bgClip,background:bg/1,backgroundColor:bg-c/bgColor,backgroundOrigin:bg-o/bgOrigin,backgroundImage:bg-i/bgImage,backgroundRepeat:bg-r/bgRepeat,backgroundBlendMode:bg-bm/bgBlendMode,backgroundSize:bg-s/bgSize,backgroundGradient:bg-grad/bgGradient,backgroundLinear:bg-linear/bgLinear,backgroundRadial:bg-radial/bgRadial,backgroundConic:bg-conic/bgConic,textGradient:txt-grad,gradientFromPosition:grad-from-pos,gradientToPosition:grad-to-pos,gradientFrom:grad-from,gradientTo:grad-to,gradientVia:grad-via,gradientViaPosition:grad-via-pos,borderRadius:bdr/rounded,borderTopLeftRadius:bdr-tl/roundedTopLeft,borderTopRightRadius:bdr-tr/roundedTopRight,borderBottomRightRadius:bdr-br/roundedBottomRight,borderBottomLeftRadius:bdr-bl/roundedBottomLeft,borderTopRadius:bdr-t/roundedTop,borderRightRadius:bdr-r/roundedRight,borderBottomRadius:bdr-b/roundedBottom,borderLeftRadius:bdr-l/roundedLeft,borderStartStartRadius:bdr-ss/roundedStartStart,borderStartEndRadius:bdr-se/roundedStartEnd,borderStartRadius:bdr-s/roundedStart,borderEndStartRadius:bdr-es/roundedEndStart,borderEndEndRadius:bdr-ee/roundedEndEnd,borderEndRadius:bdr-e/roundedEnd,border:bd,borderWidth:bd-w,borderTopWidth:bd-t-w,borderLeftWidth:bd-l-w,borderRightWidth:bd-r-w,borderBottomWidth:bd-b-w,borderBlockStartWidth:bd-bs-w,borderBlockEndWidth:bd-be-w,borderColor:bd-c,borderInline:bd-x/borderX,borderInlineWidth:bd-x-w/borderXWidth,borderInlineColor:bd-x-c/borderXColor,borderBlock:bd-y/borderY,borderBlockWidth:bd-y-w/borderYWidth,borderBlockColor:bd-y-c/borderYColor,borderLeft:bd-l,borderLeftColor:bd-l-c,borderInlineStart:bd-s/borderStart,borderInlineStartWidth:bd-s-w/borderStartWidth,borderInlineStartColor:bd-s-c/borderStartColor,borderRight:bd-r,borderRightColor:bd-r-c,borderInlineEnd:bd-e/borderEnd,borderInlineEndWidth:bd-e-w/borderEndWidth,borderInlineEndColor:bd-e-c/borderEndColor,borderTop:bd-t,borderTopColor:bd-t-c,borderBottom:bd-b,borderBottomColor:bd-b-c,borderBlockEnd:bd-be,borderBlockEndColor:bd-be-c,borderBlockStart:bd-bs,borderBlockStartColor:bd-bs-c,opacity:op,boxShadow:bx-sh/shadow,boxShadowColor:bx-sh-c/shadowColor,mixBlendMode:mix-bm,filter:filter,brightness:brightness,contrast:contrast,grayscale:grayscale,hueRotate:hue-rotate,invert:invert,saturate:saturate,sepia:sepia,dropShadow:drop-shadow,blur:blur,backdropFilter:bkdp,backdropBlur:bkdp-blur,backdropBrightness:bkdp-brightness,backdropContrast:bkdp-contrast,backdropGrayscale:bkdp-grayscale,backdropHueRotate:bkdp-hue-rotate,backdropInvert:bkdp-invert,backdropOpacity:bkdp-opacity,backdropSaturate:bkdp-saturate,backdropSepia:bkdp-sepia,borderCollapse:bd-cl,borderSpacing:bd-sp,borderSpacingX:bd-sx,borderSpacingY:bd-sy,tableLayout:tbl,transitionTimingFunction:trs-tmf,transitionDelay:trs-dly,transitionDuration:trs-dur,transitionProperty:trs-prop,transition:trs,animation:anim,animationName:anim-n,animationTimingFunction:anim-tmf,animationDuration:anim-dur,animationDelay:anim-dly,animationPlayState:anim-ps,animationComposition:anim-comp,animationFillMode:anim-fm,animationDirection:anim-dir,animationIterationCount:anim-ic,animationRange:anim-r,animationState:anim-s,animationRangeStart:anim-rs,animationRangeEnd:anim-re,animationTimeline:anim-tl,transformOrigin:trf-o,transformBox:trf-b,transformStyle:trf-s,transform:trf,rotate:rotate,rotateX:rotate-x,rotateY:rotate-y,rotateZ:rotate-z,scale:scale,scaleX:scale-x,scaleY:scale-y,translate:translate,translateX:translate-x/x,translateY:translate-y/y,translateZ:translate-z/z,accentColor:ac-c,caretColor:ca-c,scrollBehavior:scr-bhv,scrollbar:scr-bar,scrollbarColor:scr-bar-c,scrollbarGutter:scr-bar-g,scrollbarWidth:scr-bar-w,scrollMargin:scr-m,scrollMarginLeft:scr-ml,scrollMarginRight:scr-mr,scrollMarginTop:scr-mt,scrollMarginBottom:scr-mb,scrollMarginBlock:scr-my/scrollMarginY,scrollMarginBlockEnd:scr-mbe,scrollMarginBlockStart:scr-mbt,scrollMarginInline:scr-mx/scrollMarginX,scrollMarginInlineEnd:scr-me,scrollMarginInlineStart:scr-ms,scrollPadding:scr-p,scrollPaddingBlock:scr-py/scrollPaddingY,scrollPaddingBlockStart:scr-pbs,scrollPaddingBlockEnd:scr-pbe,scrollPaddingInline:scr-px/scrollPaddingX,scrollPaddingInlineEnd:scr-pe,scrollPaddingInlineStart:scr-ps,scrollPaddingLeft:scr-pl,scrollPaddingRight:scr-pr,scrollPaddingTop:scr-pt,scrollPaddingBottom:scr-pb,scrollSnapAlign:scr-sa,scrollSnapStop:scrs-s,scrollSnapType:scrs-t,scrollSnapStrictness:scrs-strt,scrollSnapMargin:scrs-m,scrollSnapMarginTop:scrs-mt,scrollSnapMarginBottom:scrs-mb,scrollSnapMarginLeft:scrs-ml,scrollSnapMarginRight:scrs-mr,scrollSnapCoordinate:scrs-c,scrollSnapDestination:scrs-d,scrollSnapPointsX:scrs-px,scrollSnapPointsY:scrs-py,scrollSnapTypeX:scrs-tx,scrollSnapTypeY:scrs-ty,scrollTimeline:scrtl,scrollTimelineAxis:scrtl-a,scrollTimelineName:scrtl-n,touchAction:tch-a,userSelect:us,overflow:ov,overflowWrap:ov-wrap,overflowX:ov-x,overflowY:ov-y,overflowAnchor:ov-a,overflowBlock:ov-b,overflowInline:ov-i,overflowClipBox:ovcp-bx,overflowClipMargin:ovcp-m,overscrollBehaviorBlock:ovs-bb,overscrollBehaviorInline:ovs-bi,fill:fill,stroke:stk,strokeWidth:stk-w,strokeDasharray:stk-dsh,strokeDashoffset:stk-do,strokeLinecap:stk-lc,strokeLinejoin:stk-lj,strokeMiterlimit:stk-ml,strokeOpacity:stk-op,srOnly:sr,debug:debug,appearance:ap,backfaceVisibility:bfv,clipPath:cp-path,hyphens:hy,mask:msk,maskImage:msk-i,maskSize:msk-s,textSizeAdjust:txt-adj,container:cq,containerName:cq-n,containerType:cq-t,cursor:cursor"
5
-
6
- const classNameByProp = new Map()
7
- const shorthands = new Map()
8
- utilities.split(',').forEach((utility) => {
9
- const [prop, meta] = utility.split(':')
10
- const [className, ...shorthandList] = meta.split('/')
11
- classNameByProp.set(prop, className)
12
- if (shorthandList.length) {
13
- shorthandList.forEach((shorthand) => {
14
- shorthands.set(shorthand === '1' ? className : shorthand, prop)
15
- })
16
- }
17
- })
18
-
19
- const resolveShorthand = (prop) => shorthands.get(prop) || prop
20
-
21
- const context = {
22
-
23
- conditions: {
24
- shift: sortConditions,
25
- finalize: finalizeConditions,
26
- breakpoints: { keys: ["base"] }
27
- },
28
- utility: {
29
- prefix: "svadmin",
30
- transform: (prop, value) => {
31
- const key = resolveShorthand(prop)
32
- const propKey = classNameByProp.get(key) || hypenateProperty(key)
33
- return { className: `${propKey}_${withoutSpace(value)}` }
34
- },
35
- hasShorthand: true,
36
- toHash: (path, hashFn) => hashFn(path.join(":")),
37
- resolveShorthand: resolveShorthand,
38
- }
39
- }
40
-
41
- const cssFn = createCss(context)
42
- export const css = (...styles) => cssFn(mergeCss(...styles))
43
- css.raw = (...styles) => mergeCss(...styles)
44
-
45
- export const { mergeCss, assignCss } = createMergeCss(context)
@@ -1,6 +0,0 @@
1
- /* eslint-disable */
2
- import type { RecipeCreatorFn } from '../types/recipe';
3
-
4
- export declare const cva: RecipeCreatorFn
5
-
6
- export type { RecipeVariant, RecipeVariantProps } from '../types/recipe';
@@ -1,87 +0,0 @@
1
- import { compact, mergeProps, memo, splitProps, uniq } from '../helpers.js';
2
- import { css, mergeCss } from './css.js';
3
-
4
- const defaults = (conf) => ({
5
- base: {},
6
- variants: {},
7
- defaultVariants: {},
8
- compoundVariants: [],
9
- ...conf,
10
- })
11
-
12
- export function cva(config) {
13
- const { base, variants, defaultVariants, compoundVariants } = defaults(config)
14
- const getVariantProps = (variants) => ({ ...defaultVariants, ...compact(variants) })
15
-
16
- function resolve(props = {}) {
17
- const computedVariants = getVariantProps(props)
18
- let variantCss = { ...base }
19
- for (const [key, value] of Object.entries(computedVariants)) {
20
- if (variants[key]?.[value]) {
21
- variantCss = mergeCss(variantCss, variants[key][value])
22
- }
23
- }
24
- const compoundVariantCss = getCompoundVariantCss(compoundVariants, computedVariants)
25
- return mergeCss(variantCss, compoundVariantCss)
26
- }
27
-
28
- function merge(__cva) {
29
- const override = defaults(__cva.config)
30
- const variantKeys = uniq(__cva.variantKeys, Object.keys(variants))
31
- return cva({
32
- base: mergeCss(base, override.base),
33
- variants: Object.fromEntries(
34
- variantKeys.map((key) => [key, mergeCss(variants[key], override.variants[key])]),
35
- ),
36
- defaultVariants: mergeProps(defaultVariants, override.defaultVariants),
37
- compoundVariants: [...compoundVariants, ...override.compoundVariants],
38
- })
39
- }
40
-
41
- function cvaFn(props) {
42
- return css(resolve(props))
43
- }
44
-
45
- const variantKeys = Object.keys(variants)
46
-
47
- function splitVariantProps(props) {
48
- return splitProps(props, variantKeys)
49
- }
50
-
51
- const variantMap = Object.fromEntries(Object.entries(variants).map(([key, value]) => [key, Object.keys(value)]))
52
-
53
- return Object.assign(memo(cvaFn), {
54
- __cva__: true,
55
- variantMap,
56
- variantKeys,
57
- raw: resolve,
58
- config,
59
- merge,
60
- splitVariantProps,
61
- getVariantProps
62
- })
63
- }
64
-
65
- export function getCompoundVariantCss(compoundVariants, variantMap) {
66
- let result = {}
67
- compoundVariants.forEach((compoundVariant) => {
68
- const isMatching = Object.entries(compoundVariant).every(([key, value]) => {
69
- if (key === 'css') return true
70
-
71
- const values = Array.isArray(value) ? value : [value]
72
- return values.some((value) => variantMap[key] === value)
73
- })
74
-
75
- if (isMatching) {
76
- result = mergeCss(result, compoundVariant.css)
77
- }
78
- })
79
-
80
- return result
81
- }
82
-
83
- export function assertCompoundVariant(name, compoundVariants, variants, prop) {
84
- if (compoundVariants.length > 0 && typeof variants?.[prop] === 'object') {
85
- throw new Error(`[recipe:${name}:${prop}] Conditions are not supported when using compound variants.`)
86
- }
87
- }
@@ -1,5 +0,0 @@
1
- /* eslint-disable */
2
- type Argument = string | boolean | null | undefined
3
-
4
- /** Conditionally join classNames into a single string */
5
- export declare function cx(...args: Argument[]): string
@@ -1,15 +0,0 @@
1
- function cx() {
2
- let str = '',
3
- i = 0,
4
- arg
5
-
6
- for (; i < arguments.length; ) {
7
- if ((arg = arguments[i++]) && typeof arg === 'string') {
8
- str && (str += ' ')
9
- str += arg
10
- }
11
- }
12
- return str
13
- }
14
-
15
- export { cx }
@@ -1,5 +0,0 @@
1
- /* eslint-disable */
2
- export * from './css';
3
- export * from './cx';
4
- export * from './cva';
5
- export * from './sva';
@@ -1,4 +0,0 @@
1
- export * from './css.js';
2
- export * from './cx.js';
3
- export * from './cva.js';
4
- export * from './sva.js';
@@ -1,4 +0,0 @@
1
- /* eslint-disable */
2
- import type { SlotRecipeCreatorFn } from '../types/recipe';
3
-
4
- export declare const sva: SlotRecipeCreatorFn
@@ -1,46 +0,0 @@
1
- import { compact, getSlotRecipes, memo, splitProps } from '../helpers.js';
2
- import { cva } from './cva.js';
3
- import { cx } from './cx.js';
4
-
5
- export function sva(config) {
6
- const slots = Object.entries(getSlotRecipes(config)).map(([slot, slotCva]) => [slot, cva(slotCva)])
7
- const defaultVariants = config.defaultVariants ?? {}
8
-
9
- const classNameMap = slots.reduce((acc, [slot, cvaFn]) => {
10
- if (config.className) acc[slot] = cvaFn.config.className
11
- return acc
12
- }, {})
13
-
14
- function svaFn(props) {
15
- const result = slots.map(([slot, cvaFn]) => [slot, cx(cvaFn(props), classNameMap[slot])])
16
- return Object.fromEntries(result)
17
- }
18
-
19
- function raw(props) {
20
- const result = slots.map(([slot, cvaFn]) => [slot, cvaFn.raw(props)])
21
- return Object.fromEntries(result)
22
- }
23
-
24
- const variants = config.variants ?? {};
25
- const variantKeys = Object.keys(variants);
26
-
27
- function splitVariantProps(props) {
28
- return splitProps(props, variantKeys);
29
- }
30
- const getVariantProps = (variants) => ({ ...defaultVariants, ...compact(variants) })
31
-
32
- const variantMap = Object.fromEntries(
33
- Object.entries(variants).map(([key, value]) => [key, Object.keys(value)])
34
- );
35
-
36
- return Object.assign(memo(svaFn), {
37
- __cva__: false,
38
- raw,
39
- config,
40
- variantMap,
41
- variantKeys,
42
- classNameMap,
43
- splitVariantProps,
44
- getVariantProps,
45
- })
46
- }
@@ -1,13 +0,0 @@
1
- /** 仅公开稳定语义;不向模型暴露 CSS、类名或内部 recipe 实现。 */
2
- export declare const surfaceDesignContract: {
3
- readonly version: "svadmin/design-v1";
4
- readonly metric: {
5
- readonly tone: readonly ["neutral", "success", "warning", "danger", "info"];
6
- readonly density: readonly ["comfortable", "compact"];
7
- };
8
- readonly table: {
9
- readonly density: readonly ["comfortable", "compact"];
10
- };
11
- };
12
- export type SurfaceTone = typeof surfaceDesignContract.metric.tone[number];
13
- export type SurfaceDensity = typeof surfaceDesignContract.metric.density[number];
@@ -1,11 +0,0 @@
1
- /** 仅公开稳定语义;不向模型暴露 CSS、类名或内部 recipe 实现。 */
2
- export const surfaceDesignContract = {
3
- version: 'svadmin/design-v1',
4
- metric: {
5
- tone: ['neutral', 'success', 'warning', 'danger', 'info'],
6
- density: ['comfortable', 'compact'],
7
- },
8
- table: {
9
- density: ['comfortable', 'compact'],
10
- },
11
- };