@urbicon-ui/blocks 6.43.0 → 6.44.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 (57) hide show
  1. package/README.md +1 -1
  2. package/dist/components/Calendar/calendar.variants.d.ts +63 -63
  3. package/dist/components/Chat/ChatMessage/ChatMessage.svelte +93 -67
  4. package/dist/components/Chat/ChatMessage/chat-message.variants.d.ts +7 -0
  5. package/dist/components/Chat/ChatMessage/chat-message.variants.js +45 -12
  6. package/dist/components/Chat/ChatMessage/index.d.ts +20 -5
  7. package/dist/components/Chat/CodeBlock/CodeBlock.svelte +59 -33
  8. package/dist/components/Chat/CodeBlock/code-block.variants.d.ts +7 -0
  9. package/dist/components/Chat/CodeBlock/code-block.variants.js +28 -13
  10. package/dist/components/Chat/CodeBlock/index.d.ts +39 -4
  11. package/dist/components/Chat/PromptInput/PromptInput.svelte +9 -16
  12. package/dist/components/Chat/PromptInput/prompt-input.variants.js +16 -15
  13. package/dist/components/Chat/ToolCallCard/ToolCallCard.svelte +9 -4
  14. package/dist/components/Chat/ToolCallCard/index.d.ts +4 -3
  15. package/dist/components/Chat/ToolCallCard/tool-call-card.variants.d.ts +0 -3
  16. package/dist/components/Chat/ToolCallCard/tool-call-card.variants.js +4 -4
  17. package/dist/components/CopyButton/CopyButton.svelte +9 -19
  18. package/dist/components/CopyButton/copy-button.variants.d.ts +4 -4
  19. package/dist/components/FileUpload/fileUpload.variants.js +6 -1
  20. package/dist/components/PinInput/PinInput.svelte +12 -20
  21. package/dist/components/TimeInput/TimeInput.svelte +12 -20
  22. package/dist/i18n/index.d.ts +398 -2
  23. package/dist/internal/copy-state.svelte.d.ts +60 -0
  24. package/dist/internal/copy-state.svelte.js +76 -0
  25. package/dist/internal/core/CoreFieldMessage.svelte +81 -0
  26. package/dist/internal/core/CoreFieldMessage.svelte.d.ts +23 -0
  27. package/dist/internal/field-chrome.js +2 -2
  28. package/dist/primitives/Alert/alert.variants.d.ts +8 -8
  29. package/dist/primitives/Checkbox/Checkbox.svelte +10 -20
  30. package/dist/primitives/Checkbox/checkbox.variants.js +1 -1
  31. package/dist/primitives/Combobox/Combobox.svelte +16 -18
  32. package/dist/primitives/Combobox/combobox.variants.js +12 -5
  33. package/dist/primitives/Input/Input.svelte +10 -20
  34. package/dist/primitives/JourneyTimeline/journey-timeline.variants.d.ts +22 -22
  35. package/dist/primitives/RadioGroup/RadioGroup.svelte +10 -20
  36. package/dist/primitives/RadioGroup/radioGroup.variants.js +7 -2
  37. package/dist/primitives/Select/Select.svelte +10 -20
  38. package/dist/primitives/Select/select.variants.js +2 -2
  39. package/dist/primitives/Slider/Slider.svelte +10 -20
  40. package/dist/primitives/Spinner/spinner.variants.d.ts +16 -16
  41. package/dist/primitives/Stepper/stepper.variants.d.ts +11 -11
  42. package/dist/primitives/Stepper/stepper.variants.js +2 -1
  43. package/dist/primitives/Tab/tab.variants.js +5 -2
  44. package/dist/primitives/Textarea/Textarea.svelte +10 -15
  45. package/dist/primitives/Textarea/textarea.variants.js +2 -2
  46. package/dist/primitives/Toast/toast.variants.d.ts +12 -12
  47. package/dist/primitives/Toggle/Toggle.svelte +10 -20
  48. package/dist/primitives/Toggle/toggle.variants.js +9 -7
  49. package/dist/style/foundation.css +19 -9
  50. package/dist/style/semantic.css +59 -2
  51. package/dist/style/themes/forest.css +2 -2
  52. package/dist/style/themes/neutral.css +2 -2
  53. package/dist/style/themes/ocean.css +2 -2
  54. package/dist/style/themes/rose.css +2 -2
  55. package/dist/style/themes/sunset.css +2 -2
  56. package/dist/utils/figma-token-export.js +7 -3
  57. package/package.json +3 -3
@@ -18,7 +18,25 @@
18
18
  above the one below — themes can differentiate them by color (e.g.
19
19
  cream → lighter cream → near-white → white) or rely on shadows
20
20
  alone when the palette ceiling is reached (as in the neutral default
21
- where base and overlay are both white). */
21
+ where base and overlay are both white).
22
+
23
+ LIGHT-MODE SPREAD (2026-07). In light mode `base` sits at the white
24
+ ceiling, so every other rung has to differentiate DOWNWARD — and the
25
+ ramp gave it almost nothing to work with: quiet/elevated were ΔL 0.01
26
+ and 0.02 from base, against 0.03 and 0.08 in dark mode. A tinted
27
+ in-flow surface with no border and no shadow was therefore effectively
28
+ invisible in light mode, which is why components kept reaching for a
29
+ border just to make a surface visible at all (the chat bubble, the
30
+ table-cell progress track). Fixed at the ramp rather than per token —
31
+ `neutral-25` 0.99 → 0.985 and `neutral-50` 0.98 → 0.965 — so quiet,
32
+ elevated and subtle all gain spread without any semantic moving and
33
+ without a new token landing on an occupied value. All five themes share
34
+ those L values (only the hue differs), so the change reaches every
35
+ theme at once. Measured: text-tertiary on the new elevated is 11.32:1,
36
+ far above AA; style/contrast.test.ts is the gate. Guarded below by
37
+ style/semantic.test.ts, which asserts the reading surfaces stay
38
+ mutually distinct in BOTH modes — the failure mode here is silent, a
39
+ collapsed rung looks exactly like a working one in a screenshot. */
22
40
  /* L·1 — base: the page itself. Content, cards, and reading surfaces
23
41
  sit at this level. */
24
42
  --color-surface-base: light-dark(var(--color-neutral-0), var(--color-neutral-900));
@@ -31,11 +49,36 @@
31
49
  /* L·3 — overlay: highest surfaces (Dialog, Drawer, Sheet, Toast).
32
50
  Full shadow + backdrop dimming. */
33
51
  --color-surface-overlay: light-dark(var(--color-neutral-0), var(--color-neutral-850));
52
+ /* `surface-hover` / `-active` are the hover/press steps for elements resting
53
+ on a READING surface (base/quiet/elevated) — a menu item, a table row.
54
+ `surface-interactive` is a resting FILL one step in from the page (a filled
55
+ Input, a Slider track, the Tab list). Those two ladders start at different
56
+ rungs, so they need their own hover step: `surface-interactive` already sits
57
+ at neutral-100, which is exactly where `surface-hover` lands in light mode —
58
+ `bg-surface-interactive hover:bg-surface-hover` was a silent no-op, and in
59
+ dark mode `surface-active` collapses onto `surface-interactive` the same
60
+ way. `-interactive-hover` continues the fill's own ladder: one step further
61
+ from the page in light, one step toward the light in dark. Guarded by
62
+ style/semantic.test.ts so the pair can never collapse again. */
34
63
  --color-surface-interactive: light-dark(var(--color-neutral-100), var(--color-neutral-700));
64
+ --color-surface-interactive-hover: light-dark(
65
+ var(--color-neutral-200),
66
+ var(--color-neutral-650)
67
+ );
35
68
  --color-surface-hover: light-dark(var(--color-neutral-100), var(--color-neutral-750));
36
69
  --color-surface-active: light-dark(var(--color-neutral-200), var(--color-neutral-700));
37
70
  --color-surface-disabled: light-dark(var(--color-neutral-100), var(--color-neutral-800));
38
71
  --color-surface-selected: light-dark(var(--color-primary-50), var(--color-primary-900));
72
+ /* A RESTING tint only — never a hover step. It resolves to exactly
73
+ `surface-elevated`, so `hover:bg-surface-subtle` is invisible on every
74
+ elevated surface (Popover, Menu, Select dropdown, elevated Card). That
75
+ shipped across 8 components until 2026-07-26; the hover idiom moved to
76
+ `surface-hover`, and variants-lint now errors on any hover fill naming a
77
+ reading surface. Its in-page-zone role was superseded by `surface-quiet`
78
+ in v5 (MIGRATION-v5 "New tokens"), which is why it has no rung of its own
79
+ left — prefer `surface-quiet` for a tinted zone and `surface-elevated`
80
+ for a raised one. Kept for the resting uses that read correctly against
81
+ a border (readonly/disabled fields, list rows, code chips). */
39
82
  --color-surface-subtle: light-dark(var(--color-neutral-50), var(--color-neutral-800));
40
83
  --color-surface-inverted: light-dark(var(--color-neutral-900), var(--color-neutral-100));
41
84
  /* Skeleton wave-shimmer highlight (Skeleton animation="wave"). A translucent
@@ -61,7 +104,21 @@
61
104
  --color-text-secondary: light-dark(var(--color-neutral-700), var(--color-neutral-300));
62
105
  --color-text-tertiary: light-dark(var(--color-neutral-600), var(--color-neutral-300));
63
106
  --color-text-quaternary: light-dark(var(--color-neutral-500), var(--color-neutral-400));
64
- --color-text-disabled: light-dark(var(--color-neutral-300), var(--color-neutral-600));
107
+ /* Disabled text the same stop in both modes. WCAG 1.4.3 exempts inactive
108
+ controls, so the old value was not a violation, but at neutral-300 / -600 it
109
+ measured roughly 1.5:1 in light and 2:1 in dark: a disabled field's label is
110
+ the one part that still has to say what the field IS, and it was effectively
111
+ invisible. Now held to the 3:1 UI floor by style/contrast.test.ts across
112
+ every theme × mode × reading surface plus the disabled fill — that test is
113
+ the number, not this comment.
114
+
115
+ Deliberately still the weakest rung of the text ramp, so "disabled" stays
116
+ legible without stopping being a signal. Two consequences, both accepted:
117
+ it shares its light-mode value with text-quaternary (two roles, not two
118
+ steps of one ladder — but see the Calendar entry in technical-debt, where
119
+ they meet), and the floor covers the token alone, not what a component
120
+ composes on top of it (an `opacity-*` wrapper can undo it). */
121
+ --color-text-disabled: light-dark(var(--color-neutral-500), var(--color-neutral-500));
65
122
  /* The on-colors below pair text with a *fill* rather than a surface.
66
123
  text-on-dark and text-on-primary answer fills that are dark in light
67
124
  mode and light in dark mode, so the label has to travel the opposite
@@ -41,8 +41,8 @@
41
41
  * contrast stays unchanged. surface-*, text-* and border-* pick this up
42
42
  * automatically through semantic.css.
43
43
  */
44
- --color-neutral-25: oklch(0.99 0.002 150);
45
- --color-neutral-50: oklch(0.98 0.005 150);
44
+ --color-neutral-25: oklch(0.985 0.003 150);
45
+ --color-neutral-50: oklch(0.965 0.006 150);
46
46
  --color-neutral-100: oklch(0.95 0.008 150);
47
47
  --color-neutral-200: oklch(0.89 0.012 150);
48
48
  --color-neutral-300: oklch(0.83 0.014 150);
@@ -54,8 +54,8 @@
54
54
  * contrast stays unchanged. surface-*, text-* and border-* pick this up
55
55
  * automatically through semantic.css.
56
56
  */
57
- --color-neutral-25: oklch(0.99 0 0);
58
- --color-neutral-50: oklch(0.98 0 0);
57
+ --color-neutral-25: oklch(0.985 0 0);
58
+ --color-neutral-50: oklch(0.965 0 0);
59
59
  --color-neutral-100: oklch(0.95 0 0);
60
60
  --color-neutral-200: oklch(0.89 0 0);
61
61
  --color-neutral-300: oklch(0.83 0 0);
@@ -45,8 +45,8 @@
45
45
  * hue shifts — so WCAG contrast stays unchanged. surface-*, text-* and
46
46
  * border-* pick this up automatically through semantic.css.
47
47
  */
48
- --color-neutral-25: oklch(0.99 0.002 220);
49
- --color-neutral-50: oklch(0.98 0.005 220);
48
+ --color-neutral-25: oklch(0.985 0.003 220);
49
+ --color-neutral-50: oklch(0.965 0.006 220);
50
50
  --color-neutral-100: oklch(0.95 0.008 220);
51
51
  --color-neutral-200: oklch(0.89 0.012 220);
52
52
  --color-neutral-300: oklch(0.83 0.014 220);
@@ -41,8 +41,8 @@
41
41
  * stays unchanged. surface-*, text-* and border-* pick this up
42
42
  * automatically through semantic.css.
43
43
  */
44
- --color-neutral-25: oklch(0.99 0.002 350);
45
- --color-neutral-50: oklch(0.98 0.005 350);
44
+ --color-neutral-25: oklch(0.985 0.003 350);
45
+ --color-neutral-50: oklch(0.965 0.006 350);
46
46
  --color-neutral-100: oklch(0.95 0.008 350);
47
47
  --color-neutral-200: oklch(0.89 0.012 350);
48
48
  --color-neutral-300: oklch(0.83 0.014 350);
@@ -41,8 +41,8 @@
41
41
  * contrast stays unchanged. surface-*, text-* and border-* pick this up
42
42
  * automatically through semantic.css; no per-token overrides needed.
43
43
  */
44
- --color-neutral-25: oklch(0.99 0.002 50);
45
- --color-neutral-50: oklch(0.98 0.005 50);
44
+ --color-neutral-25: oklch(0.985 0.003 50);
45
+ --color-neutral-50: oklch(0.965 0.006 50);
46
46
  --color-neutral-100: oklch(0.95 0.008 50);
47
47
  --color-neutral-200: oklch(0.89 0.012 50);
48
48
  --color-neutral-300: oklch(0.83 0.014 50);
@@ -21,8 +21,8 @@
21
21
  const foundationColors = {
22
22
  neutral: {
23
23
  '0': 'oklch(1 0 0)',
24
- '25': 'oklch(0.99 0.002 240)',
25
- '50': 'oklch(0.98 0.005 240)',
24
+ '25': 'oklch(0.985 0.003 240)',
25
+ '50': 'oklch(0.965 0.006 240)',
26
26
  '100': 'oklch(0.95 0.008 240)',
27
27
  '200': 'oklch(0.89 0.012 240)',
28
28
  '300': 'oklch(0.83 0.014 240)',
@@ -139,6 +139,10 @@ const semanticTokens = {
139
139
  elevated: { value: '{color.neutral.50}', description: 'L2 — lifted surfaces (popover, menu)' },
140
140
  overlay: { value: '{color.neutral.0}', description: 'L3 — dialog/drawer/toast background' },
141
141
  interactive: { value: '{color.neutral.100}', description: 'Interactive control background' },
142
+ 'interactive-hover': {
143
+ value: '{color.neutral.200}',
144
+ description: 'Hover step for an interactive control fill'
145
+ },
142
146
  hover: { value: '{color.neutral.100}', description: 'Hover state background' },
143
147
  active: { value: '{color.neutral.200}', description: 'Active/pressed state background' },
144
148
  disabled: { value: '{color.neutral.100}', description: 'Disabled surface' },
@@ -152,7 +156,7 @@ const semanticTokens = {
152
156
  secondary: { value: '{color.neutral.700}', description: 'Secondary text' },
153
157
  tertiary: { value: '{color.neutral.600}', description: 'Tertiary text (WCAG AA on base)' },
154
158
  quaternary: { value: '{color.neutral.500}', description: 'Quaternary text (lowest emphasis)' },
155
- disabled: { value: '{color.neutral.300}', description: 'Disabled text' },
159
+ disabled: { value: '{color.neutral.500}', description: 'Disabled text' },
156
160
  'on-dark': { value: '{color.neutral.0}', description: 'Text on dark surfaces' },
157
161
  'on-primary': { value: '{color.neutral.0}', description: 'Text on primary color bg' },
158
162
  'on-warning': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urbicon-ui/blocks",
3
- "version": "6.43.0",
3
+ "version": "6.44.0",
4
4
  "description": "Svelte 5 UI component library with Tailwind CSS 4, OKLCH design tokens and zero runtime dependencies",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -93,8 +93,8 @@
93
93
  "@sveltejs/package": "^2.5.8",
94
94
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
95
95
  "@tailwindcss/vite": "^4.3.1",
96
- "@urbicon-ui/i18n": "6.43.0",
97
- "@urbicon-ui/shared-types": "6.43.0",
96
+ "@urbicon-ui/i18n": "6.44.0",
97
+ "@urbicon-ui/shared-types": "6.44.0",
98
98
  "prettier": "^3.8.4",
99
99
  "prettier-plugin-svelte": "^4.1.1",
100
100
  "prettier-plugin-tailwindcss": "^0.8.0",