cleo_design_tokens 0.2.4 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b26b7b458c43724454d2827bf71e276857f7948f46dfade6a22c0a78ed068f3
4
- data.tar.gz: 13ff4a6a39778fe89c931a6cd1f01931e3d08b901262aa582bde3b054b366889
3
+ metadata.gz: 0a44c38f546ec1f31af8273066fa31c77538d6e9812225b0da0a763e5622afa6
4
+ data.tar.gz: 4a141717fc6df4973d260296903ce7e0f95525c6f9caee385ddf166877e7b615
5
5
  SHA512:
6
- metadata.gz: fa1dc9fec6338e93595ef7b0252bd96a7a427b810ef5a262669e89874ded5882377a2a2fa6318e13d335b721af4e45f1e3e959fb72355d9165101307998a96ad
7
- data.tar.gz: ff7a54aa890e5ebf7a3dce4d1364db1ce7e9ac6312f04fa7ac949d4f49582fce02218ddbebef0a1e0e77c093f88c82a235dc93f1a80480589a4f307681ee067b
6
+ metadata.gz: 9049839cd022f9c7cb925a3c443ccad2e0ae2145d68d463bfc19afc2cc55564e52b496f09c6c9cb93a3835a73d25cc975e3b6c8c078cdaa3afc02901abec67dc
7
+ data.tar.gz: 273d641074a554f32656ff6beabf7e723a19f7dff52506f1a57f7119b4821a3fcf6bbeb76a4d3bf7ec0c10d9edfcdd1bfd520284f1bc6bdcb2e882fde9187f87
@@ -48,9 +48,10 @@ module CleoDesignTokens
48
48
  private
49
49
 
50
50
  def build_palette(experience)
51
+ primitives = LookupBuilder.build_lookup(@primitives, experience: experience).freeze
51
52
  Palette.new(
52
- primitives: LookupBuilder.build_lookup(@primitives, experience: experience).freeze,
53
- semantic: LookupBuilder.build_semantic_lookup(@semantic, experience: experience).freeze,
53
+ primitives: primitives,
54
+ semantic: LookupBuilder.build_semantic_lookup(@semantic, experience: experience, primitives: primitives).freeze,
54
55
  )
55
56
  end
56
57
  end
@@ -21,8 +21,21 @@ module CleoDesignTokens
21
21
 
22
22
  # Flattens `semantic.json` into a key -> SemanticEntry lookup, one entry
23
23
  # per role — the theme axis lives inside the entry, not in the key.
24
- def self.build_semantic_lookup(tree, experience: :current)
25
- flatten_tree(tree) { |leaf, key| semantic_entry(experience_leaf(leaf, experience, key), experience, key) }
24
+ def self.build_semantic_lookup(tree, experience: :current, primitives: nil)
25
+ schema = tree["$schema"]
26
+ if tree.key?("$schema") && schema != "cleo-semantic-references/1"
27
+ raise UnknownExperienceError, "unsupported semantic schema: #{schema.inspect}"
28
+ end
29
+ references = schema == "cleo-semantic-references/1"
30
+ flatten_tree(tree) do |leaf, key|
31
+ snapshots = leaf["$experiences"]
32
+ if references && leaf.key?("$experiences") && !snapshots.is_a?(Hash)
33
+ raise UnknownExperienceError, "invalid semantic experiences for #{key.inspect}"
34
+ end
35
+ shared = references && (experience.to_s == "current" || !snapshots.is_a?(Hash) || !snapshots.key?("cleoRefresh"))
36
+ snapshot = shared ? leaf : experience_leaf(leaf, experience, key)
37
+ semantic_entry(snapshot, experience, key, primitives: primitives, references: references)
38
+ end
26
39
  end
27
40
 
28
41
  # Walks `tree`, turning each leaf into a lookup entry via the block —
@@ -70,20 +83,20 @@ module CleoDesignTokens
70
83
  end
71
84
  private_class_method :experience_leaf
72
85
 
73
- def self.semantic_entry(leaf, experience, key)
86
+ def self.semantic_entry(leaf, experience, key, primitives:, references:)
74
87
  themes = {}
75
88
  raw_themes = leaf["$themes"] || {}
76
89
  unless raw_themes.is_a?(Hash)
77
90
  raise UnknownExperienceError, "design token #{key.inspect} has invalid themes for experience #{experience.inspect}"
78
91
  end
79
92
  raw_themes.each do |theme, override|
80
- value = override.is_a?(Hash) ? override["$value"] : nil
93
+ value = override.is_a?(Hash) ? semantic_value(override, key, primitives: primitives, references: references) : nil
81
94
  unless value.is_a?(String)
82
95
  raise UnknownExperienceError, "design token #{key.inspect} has no value for theme #{theme.inspect} in experience #{experience.inspect}"
83
96
  end
84
97
  themes[theme] = value.freeze
85
98
  end
86
- value = leaf["$value"]
99
+ value = semantic_value(leaf, key, primitives: primitives, references: references)
87
100
  if (leaf.key?("$value") && !value.is_a?(String)) || (value.nil? && themes.empty?)
88
101
  raise UnknownExperienceError, "design token #{key.inspect} has no semantic values for experience #{experience.inspect}"
89
102
  end
@@ -93,5 +106,15 @@ module CleoDesignTokens
93
106
  SemanticEntry.new(value&.freeze, themes.freeze)
94
107
  end
95
108
  private_class_method :semantic_entry
109
+
110
+ def self.semantic_value(binding, key, primitives:, references:)
111
+ return binding["$value"] unless references && binding.key?("$ref")
112
+ ref = binding["$ref"]
113
+ if !ref.is_a?(String) || !primitives&.key?(ref) || binding.key?("$value")
114
+ raise UnknownExperienceError, "invalid primitive reference #{ref.inspect} for #{key.inspect}"
115
+ end
116
+ primitives.fetch(ref)
117
+ end
118
+ private_class_method :semantic_value
96
119
  end
97
120
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meetcleo/design-tokens",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "Canonical source of truth for Cleo's design tokens (DTCG JSON), plus a TypeScript reader.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",