Skip to content

Skeleton catalog app #2404

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 150 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 146 commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
6c4ee97
add 1st pass model Mar 19 for listing into base
tintinthong Mar 19, 2025
9764fef
create 1st draft layout for catalog
lucaslyl Mar 20, 2025
21b3cbd
Merge branch 'main' into CS-8025-render-catalog-app-as-default-view-o…
lucaslyl Mar 20, 2025
5a6db91
create card-listing-container
lucaslyl Mar 20, 2025
9f2fa8f
create 3 column layout
lucaslyl Mar 20, 2025
2d679dd
create a top bar filter for spec
lucaslyl Mar 20, 2025
ff87f6c
Merge branch 'main' into CS-8211-move-catalog-from-base-to-catalog-realm
lucaslyl Mar 21, 2025
acc3010
move catalog from base to catalog realm
lucaslyl Mar 21, 2025
c3107e6
fix the overflow issue with container query
lucaslyl Mar 21, 2025
dc7cf2c
Cs 8209 create listing embedded view (#2319)
lucaslyl Mar 21, 2025
059d0a8
add catalog instance
tintinthong Mar 22, 2025
7e46249
Add access to grid for testing
tintinthong Mar 22, 2025
08066ff
can add spec to experiments (hardcoded)
tintinthong Mar 22, 2025
9ed65ed
add spec breakdown section
tintinthong Mar 22, 2025
0f5aa1c
Merge branch 'add-to-workspace-simple' into skeleton-catalog-app
tintinthong Mar 22, 2025
2fbcacd
remove catalog app
tintinthong Mar 22, 2025
7a7a080
add createCard command
tintinthong Mar 23, 2025
906c4bc
add butons in listing
tintinthong Mar 23, 2025
241683e
fix create to not use computed
tintinthong Mar 24, 2025
d1b3429
fix lint
tintinthong Mar 24, 2025
3f1eb77
add dropdown
tintinthong Mar 24, 2025
d3fcd84
revert remoteRef
tintinthong Mar 24, 2025
7865e7e
only allow create when there exists a at least one spec
tintinthong Mar 24, 2025
07c0f96
Merge pull request #2323 from cardstack/add-to-workspace-chris-option-a
tintinthong Mar 24, 2025
ce1c5c5
Cs 8215 create listing embedded view skeleton (#2327)
lucaslyl Mar 24, 2025
52511f1
Cs 8221 add showcase filter and create the skeleton layout (#2336)
lucaslyl Mar 25, 2025
7dfb49d
Merge remote-tracking branch 'origin/main' into skeleton-catalog-app
tintinthong Mar 26, 2025
732c7a9
add blog app to catalog
tintinthong Mar 26, 2025
a97d5be
remove too many uuids
tintinthong Mar 26, 2025
fe3e640
Merge pull request #2341 from cardstack/add-blog-app
tintinthong Mar 26, 2025
e2d2d2a
Cs 8231 create catalog layout (#2342)
lucaslyl Mar 26, 2025
1f590e0
unify isolated and embedded template
tintinthong Mar 26, 2025
5de329e
just make presentable go to grid button
tintinthong Mar 26, 2025
4d7b382
remove addToWorkspace args
tintinthong Mar 26, 2025
acf0a33
Merge pull request #2344 from cardstack/make-go-to-grid-into-boxel-bu…
tintinthong Mar 26, 2025
311838b
Merge pull request #2343 from cardstack/unify-isolated-and-embedded-t…
tintinthong Mar 26, 2025
9d82091
get showcase workign with onclick
tintinthong Mar 26, 2025
d6f369b
Merge pull request #2345 from cardstack/get-showcase-working
tintinthong Mar 26, 2025
01b2ae8
create listing fitted view
lucaslyl Mar 26, 2025
a4523d0
Merge pull request #2346 from cardstack/CS-8229-listing-tile-view-format
tintinthong Mar 26, 2025
4a0d99b
allow apps, cards, skills to be queried
tintinthong Mar 26, 2025
902f326
allow querying for apps, cards, skills, fields
tintinthong Mar 26, 2025
0939888
a weird handling of spec. I dono why async loading is an issue
tintinthong Mar 26, 2025
c995b7f
fix skill tabId
tintinthong Mar 26, 2025
49140ff
fix instances
tintinthong Mar 26, 2025
1ea8e3b
Merge branch 'skeleton-catalog-app' into get-querying-to-work
tintinthong Mar 26, 2025
8d804d1
Merge pull request #2347 from cardstack/get-querying-to-work
tintinthong Mar 26, 2025
ea2b2c1
export viewItem type in boxel ui compoent, current import ViewItem in…
lucaslyl Mar 27, 2025
05febf5
rename cardinstancelayout to more general name
lucaslyl Mar 27, 2025
b9300be
cleanup and enhance the code readability
lucaslyl Mar 27, 2025
db46da9
minor changes
lucaslyl Mar 27, 2025
a6d843b
Merge pull request #2349 from cardstack/CS-8272-clean-up-catalog-app-…
tintinthong Mar 27, 2025
bb981a2
Create Catalog App Category Component (#2352)
lucaslyl Mar 27, 2025
10d2473
CS-8204-filter-create-catalog-app-tags-group-filter (#2360)
lucaslyl Mar 28, 2025
d774e45
create filter search (#2361)
lucaslyl Mar 28, 2025
2d501c0
eliminate content-container component, replace with info-box class (#…
lucaslyl Mar 28, 2025
a32cb9b
call it query
tintinthong Mar 28, 2025
fc610e3
fix listingType to use subclass
tintinthong Mar 29, 2025
43807b6
use view grid rather than goToGrid
tintinthong Mar 29, 2025
acedd64
Merge branch 'main' into skeleton-catalog-app
tintinthong Apr 1, 2025
43fc59e
remove getters
tintinthong Apr 1, 2025
1f46d98
enable category querying
tintinthong Apr 1, 2025
b6b6ff7
add tag filter
tintinthong Apr 1, 2025
b803e6a
add search filter
tintinthong Apr 1, 2025
a918b8a
Merge branch 'main' into skeleton-catalog-app
richardhjtan Apr 2, 2025
a1f12b2
add missing task
tintinthong Apr 2, 2025
d4a30e5
add ability to copy a skill
tintinthong Apr 3, 2025
e9d68ce
improve some comment
tintinthong Apr 3, 2025
f8e3207
Merge pull request #2373 from cardstack/add-skill-listing
tintinthong Apr 3, 2025
30cca0e
Copy source action in operator mode
richardhjtan Apr 3, 2025
75fb870
fix spec path
tintinthong Apr 3, 2025
5945d23
Copy file operation in listing
richardhjtan Apr 3, 2025
2864f8f
Cs 8281 get screenshot to be inside the boundary of the fitted inside…
lucaslyl Apr 4, 2025
db09fcc
remove stale on listing (#2381)
lucaslyl Apr 4, 2025
4668c6e
Change way to remove leading path
richardhjtan Apr 4, 2025
8dccd82
Merge branch 'skeleton-catalog-app' into CS-8292-catalog-listing-inst…
richardhjtan Apr 4, 2025
7f38d2a
Introduce component spec type
richardhjtan Apr 7, 2025
b212efc
Add related specs on catalog blog listing
richardhjtan Apr 7, 2025
258bb13
Add to workspace improvement
richardhjtan Apr 7, 2025
298e1a8
enable copy example feature into a directory
tintinthong Apr 7, 2025
83ed830
fix lint
tintinthong Apr 7, 2025
cc381c2
fix bug
tintinthong Apr 7, 2025
01491e2
improve matches
tintinthong Apr 7, 2025
e49ae28
add preview function + improve naming conventions
tintinthong Apr 7, 2025
18ef1e8
add styling for action-buttons
lucaslyl Apr 7, 2025
6149ff5
fix lint
tintinthong Apr 7, 2025
1c04495
remove comment
tintinthong Apr 7, 2025
16acc1c
Add to workspace changes
richardhjtan Apr 7, 2025
64e8839
fix bug with request.url
tintinthong Apr 7, 2025
8d4b8be
fix lint
tintinthong Apr 7, 2025
b0c92f2
Merge pull request #2385 from cardstack/allow-copy-examples
tintinthong Apr 7, 2025
a271f70
fix publisher name
tintinthong Apr 8, 2025
51127a5
Merge remote-tracking branch 'origin/skeleton-catalog-app' into add-p…
tintinthong Apr 8, 2025
1ef589d
only show preview when there exists one example
tintinthong Apr 8, 2025
aebf643
remove code
tintinthong Apr 8, 2025
3dc89a9
remove Personal Organization
tintinthong Apr 8, 2025
cd22e3d
push new images
lucaslyl Apr 8, 2025
3a35f63
Merge pull request #2386 from cardstack/add-preview-button
tintinthong Apr 8, 2025
8e49c2c
Fix test
richardhjtan Apr 8, 2025
e121e3c
Merge branch 'skeleton-catalog-app' into CS-8292-catalog-listing-inst…
richardhjtan Apr 8, 2025
8233a20
Fix test
richardhjtan Apr 8, 2025
1712ff1
add remix button
lucaslyl Apr 8, 2025
a64f48d
Implement install button
richardhjtan Apr 8, 2025
dc65965
Merge pull request #2376 from cardstack/CS-8292-catalog-listing-insta…
richardhjtan Apr 8, 2025
ce5dcb6
enhancement
lucaslyl Apr 8, 2025
6ba9967
fix all lint with blackjack
tintinthong Apr 8, 2025
6de8116
Add mortgage calculator listing
richardhjtan Apr 8, 2025
4933cc9
Remove Invoice Generator listing
richardhjtan Apr 8, 2025
636735f
fix blackjack naming and add instnaces
tintinthong Apr 8, 2025
6818784
add summary
tintinthong Apr 8, 2025
4c88bc0
add thumbnail
tintinthong Apr 8, 2025
e920326
Merge pull request #2395 from cardstack/add-mortgage-calculator-listing
richardhjtan Apr 8, 2025
2e56833
create leaflet example (#2396)
lucaslyl Apr 8, 2025
2681cf6
add new blackjack listing
tintinthong Apr 8, 2025
4bfd9d2
Merge remote-tracking branch 'origin/main' into skeleton-catalog-app
tintinthong Apr 9, 2025
efe62fc
remove duplicate file watcher
tintinthong Apr 9, 2025
7996263
misc changes
tintinthong Apr 9, 2025
127bd6a
create map example (#2397)
lucaslyl Apr 9, 2025
5501f27
Contact Link field preview
richardhjtan Apr 9, 2025
33bc07a
Featured image field preview
richardhjtan Apr 9, 2025
b90311f
linked chess game (#2405)
lucaslyl Apr 9, 2025
80a9015
add cycling milesage log
tintinthong Apr 9, 2025
71f3665
Merge pull request #2406 from cardstack/add-cycling-mileage-log
tintinthong Apr 9, 2025
f4dc05d
misc fixes
tintinthong Apr 9, 2025
1a16727
fix lint
tintinthong Apr 9, 2025
797e696
fix more lint
tintinthong Apr 9, 2025
a3f2970
adjust category for map
tintinthong Apr 9, 2025
8d6ca2e
centering map
tintinthong Apr 9, 2025
fdfeca3
add examples for map
tintinthong Apr 9, 2025
09b17c9
Add images and readme summary on field listing
richardhjtan Apr 9, 2025
82e579d
Move field listing to proper instance folder
richardhjtan Apr 9, 2025
390e910
Merge branch 'polish-fields-listing' into skeleton-catalog-app
richardhjtan Apr 9, 2025
c92ff63
add better chess examples
tintinthong Apr 9, 2025
bdc1b12
update examples
tintinthong Apr 9, 2025
943767a
fix name
tintinthong Apr 9, 2025
d6d14fb
Merge remote-tracking branch 'origin/main' into skeleton-catalog-app
tintinthong Apr 9, 2025
8967935
Merge branch 'main' into skeleton-catalog-app
tintinthong Apr 9, 2025
168dc10
remove html comments
tintinthong Apr 10, 2025
047d9c5
fix lint
tintinthong Apr 10, 2025
9035710
Merge branch 'main' into skeleton-catalog-app
tintinthong Apr 14, 2025
f5f601a
Merge branch 'main' into skeleton-catalog-app
richardhjtan Apr 14, 2025
18c886f
Move catalog listing app into dev and staging environment
richardhjtan Apr 14, 2025
7528ea2
Reset catalog realm to original state
richardhjtan Apr 14, 2025
1e9bc24
Fix lint
richardhjtan Apr 14, 2025
6ff39d1
Fix tests
richardhjtan Apr 14, 2025
e792df3
Add tests about install and use catalog listing
richardhjtan Apr 15, 2025
3f2bcc6
Official card components listing publisher update
richardhjtan Apr 15, 2025
7239e39
Catalog app font weight tweaks
richardhjtan Apr 15, 2025
ccd44b1
Merge branch 'main' into skeleton-catalog-app
richardhjtan Apr 15, 2025
540737c
Merge branch 'main' into skeleton-catalog-app
richardhjtan Apr 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/base/command.gts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class SaveCardInput extends CardDef {

export class CopyCardInput extends CardDef {
@field sourceCard = linksTo(CardDef);
@field targetRealmUrl = contains(StringField);
@field targetUrl = contains(StringField);
@field targetStackIndex = contains(NumberField);
}

Expand Down
26 changes: 22 additions & 4 deletions packages/base/spec.gts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import Brain from '@cardstack/boxel-icons/brain';
import { use, resource } from 'ember-resources';
import { TrackedObject } from 'tracked-built-ins';

export type SpecType = 'card' | 'field' | 'app' | 'skill';
export type SpecType = 'card' | 'field' | 'component' | 'app' | 'skill';

class SpecTypeField extends StringField {
static displayName = 'Spec Type';
Expand All @@ -54,6 +54,9 @@ const PRIMITIVE_INCOMPATIBILITY_MESSAGE =

class Isolated extends Component<typeof Spec> {
get defaultIcon() {
if (!this.args.model) {
return;
}
return this.args.model.constructor?.icon;
}

Expand Down Expand Up @@ -111,7 +114,7 @@ class Isolated extends Component<typeof Spec> {
<div class='box header-icon-container'>
{{#if this.icon}}
<this.icon width='35' height='35' role='presentation' />
{{else}}
{{else if this.defaultIcon}}
<this.defaultIcon width='35' height='35' role='presentation' />
{{/if}}
</div>
Expand Down Expand Up @@ -304,6 +307,9 @@ class Isolated extends Component<typeof Spec> {

class Fitted extends Component<typeof Spec> {
get defaultIcon() {
if (!this.args.model) {
return;
}
return this.args.model.constructor?.icon;
}

Expand Down Expand Up @@ -336,7 +342,7 @@ class Fitted extends Component<typeof Spec> {
<div class='thumbnail-section'>
{{#if this.icon}}
<this.icon width='35' height='35' role='presentation' />
{{else}}
{{else if this.defaultIcon}}
<this.defaultIcon width='35' height='35' role='presentation' />
{{/if}}
</div>
Expand Down Expand Up @@ -563,6 +569,9 @@ class Fitted extends Component<typeof Spec> {

class Edit extends Component<typeof Spec> {
get defaultIcon() {
if (!this.args.model) {
return;
}
return this.args.model.constructor?.icon;
}

Expand Down Expand Up @@ -622,7 +631,7 @@ class Edit extends Component<typeof Spec> {
<div class='box header-icon-container'>
{{#if this.icon}}
<this.icon width='35' height='35' role='presentation' />
{{else}}
{{else if this.defaultIcon}}
<this.defaultIcon width='35' height='35' role='presentation' />
{{/if}}
</div>
Expand Down Expand Up @@ -903,6 +912,13 @@ export class Spec extends CardDef {
);
},
});

@field isComponent = contains(BooleanField, {
computeVia: function (this: Spec) {
return this.specType === 'component';
},
});

@field moduleHref = contains(StringField, {
computeVia: function (this: Spec) {
if (!this.ref || !this.ref.module) {
Expand Down Expand Up @@ -1021,6 +1037,8 @@ function getIcon(specType: string) {
return LayoutList;
case 'skill':
return Brain;
case 'component':
return LayoutList;
default:
return;
}
Expand Down
5 changes: 4 additions & 1 deletion packages/boxel-ui/addon/src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ import SkeletonPlaceholder from './components/skeleton-placeholder/index.gts';
import Switch from './components/switch/index.gts';
import TabbedHeader from './components/tabbed-header/index.gts';
import Tooltip from './components/tooltip/index.gts';
import ViewSelector from './components/view-selector/index.gts';
import ViewSelector, {
type ViewItem,
} from './components/view-selector/index.gts';

export {
Accordion,
Expand Down Expand Up @@ -117,5 +119,6 @@ export {
Switch,
TabbedHeader,
Tooltip,
ViewItem,
ViewSelector,
};
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
} from '../../icons.gts';
import RadioInput from '../radio-input/index.gts';

interface ViewItem {
export interface ViewItem {
icon: ComponentLike;
id: string;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"data": {
"type": "card",
"attributes": {
"name": "Blackjack Game",
"summary": "Classic casino Blackjack with authentic rules - hit, stand, or double down as you play against the dealer's AI. Features dynamic card scoring, 3:2 blackjack payouts, flexible betting options, and persistent statistics tracking.",
"images": [
"https://boxel-images.boxel.ai/app-assets/catalog/blackjack-listing/screenshot_02.png"
],
"description": null,
"thumbnailURL": "https://boxel-images.boxel.ai/app-assets/catalog/blackjack-listing/thumbnail.png"
},
"relationships": {
"specs.0": {
"links": {
"self": "../Spec/5cef210f-cb2d-43d5-83ee-d5144deb3671"
}
},
"publisher": {
"links": {
"self": "../Publisher/ae15f401-5340-4098-ba7f-ab23a3058dff"
}
},
"categories.0": {
"links": {
"self": "../Category/f6a67357-ba77-4e38-a5de-03e20fa46193"
}
},
"tags.0": {
"links": {
"self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893"
}
},
"tags.1": {
"links": {
"self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4"
}
},
"license": {
"links": {
"self": null
}
},
"examples.0": {
"links": {
"self": "../blackjack/BlackjackGame/7afce4bc-c331-48ca-bc53-3b9cc2e81333"
}
}
},
"meta": {
"adoptsFrom": {
"module": "../catalog-app/listing/listing",
"name": "CardListing"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"data": {
"type": "card",
"attributes": {
"name": "Mortgage Calculator",
"summary": "🏠 Mortgage Calculator\n\nEasily estimate your monthly mortgage payments and understand where your money goes — all in one simple, visual tool.\n\n💡 What It Does\n\nThis calculator helps you break down the full cost of homeownership. Just enter a few details about your potential home and loan, and you'll get:\n\nYour estimated monthly mortgage payment\n\nA clear view of how much goes to:\n- Principal & Interest\n- Property Taxes\n- Home Insurance\n- HOA Fees\n- Total lifetime costs over the life of the loan\n\n📋 What You Can Input\n- Home Price\n- Down Payment (%)\n- Loan Term (Years)\n- Interest Rate (%)\n- Monthly Property Tax\n- Monthly Insurance\n- Monthly HOA Fees\n\n📊 Visual Breakdown\n\nYou'll also see a colorful donut chart that shows exactly what portion of your monthly payment goes where — no guessing.\n\n🎯 Perfect For\n- First-time home buyers\n- Real estate agents helping clients compare options\n- Anyone planning for a big purchase\n\n⚙️ How It Helps\nKnow what to expect before you buy:\n- Set realistic budgets\n- Compare different scenarios\n- Understand the true cost of a mortgage",
"images": [
"https://boxel-images.boxel.ai/app-assets/catalog/mortgage-calculator-listing/screenshot_01.png"
],
"description": null,
"thumbnailURL": "https://boxel-images.boxel.ai/app-assets/catalog/mortgage-calculator-listing/thumbnail.png"
},
"relationships": {
"specs.0": {
"links": {
"self": "../Spec/mortgage-calculator"
}
},
"publisher": {
"links": {
"self": "../Publisher/acbb43d6-69c8-4833-8f2b-5539fb997d9c"
}
},
"categories.0": {
"links": {
"self": "../Category/67777a04-bec0-4f71-a1be-26a26bcdc314"
}
},
"tags.0": {
"links": {
"self": "../Tag/c1fe433a-b3df-41f4-bdcf-d98686ee42d7"
}
},
"license": {
"links": {
"self": null
}
},
"examples.0": {
"links": {
"self": "../mortgage-calculator/MortgageCalculator/example"
}
}
},
"meta": {
"adoptsFrom": {
"module": "../catalog-app/listing/listing",
"name": "CardListing"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"data": {
"type": "card",
"attributes": {
"name": "Leaflet Map",
"summary": "The Leaflet Map card is an interactive mapping component built using the Leaflet.js library. It accepts three key parameters: latitude and longitude coordinates for map positioning, and an optional custom tile server URL (defaulting to OpenStreetMap). The map is rendered in a full-width and full-height container, automatically loading the necessary Leaflet.js library and CSS from CDN.\n\nThe component centers the map on the specified coordinates with a default zoom level of 13, providing users with an interactive experience that includes panning and zooming capabilities. It supports both isolated and embedded views, though the embedded view functionality is currently not implemented. This makes it a versatile tool for displaying geographical data in various contexts.",
"images": [
"https://boxel-images.boxel.ai/app-assets/catalog/leaflet-listing/screenshot_02.png",
"https://boxel-images.boxel.ai/app-assets/catalog/leaflet-listing/screenshot_03.png",
"https://boxel-images.boxel.ai/app-assets/catalog/leaflet-listing/screenshot_01.png"
],
"description": null,
"thumbnailURL": "https://boxel-images.boxel.ai/app-assets/catalog/leaflet-listing/thumbnail.png "
},
"relationships": {
"specs.0": {
"links": {
"self": "../Spec/leaflet-map"
}
},
"publisher": {
"links": {
"self": "../Publisher/3e7ef86b-79d8-4814-beda-d24b176029b7"
}
},
"categories.0": {
"links": {
"self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de"
}
},
"tags": {
"links": {
"self": null
}
},
"license": {
"links": {
"self": null
}
},
"examples.0": {
"links": {
"self": "../leaflet-map/LeafletMap/new-york-city-leaflet-map"
}
},
"examples.1": {
"links": {
"self": "../leaflet-map/LeafletMap/singapore-leaflet-map"
}
},
"examples.2": {
"links": {
"self": "../leaflet-map/LeafletMap/winnipeg"
}
}
},
"meta": {
"adoptsFrom": {
"module": "../catalog-app/listing/listing",
"name": "CardListing"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{
"data": {
"type": "card",
"attributes": {
"name": "Cycling Mileage Log",
"summary": "Track your cycling progress with this elegant, feature-rich mileage logger. Set targets, log your rides with origin and destination details, and visualize your progress with beautiful charts. Perfect for casual cyclists and serious riders looking to achieve their distance goals.",
"images": [
"https://boxel-images.boxel.ai/app-assets/catalog/cycling-mileage-listing/screenshot_01.png ",
"https://boxel-images.boxel.ai/app-assets/catalog/cycling-mileage-listing/screenshot_02.png "
],
"description": null,
"thumbnailURL": "https://boxel-images.boxel.ai/app-assets/catalog/cycling-mileage-listing/thumbnail.png "
},
"relationships": {
"specs.0": {
"links": {
"self": "../Spec/74f2e937-553d-408f-b8fc-aba2fa844f98"
}
},
"publisher": {
"links": {
"self": "../Publisher/187c0111-8e4b-4af4-88d0-e6ea77abe0c1"
}
},
"categories.0": {
"links": {
"self": "../Category/f79a73f8-07f9-4944-83b3-54814b33d5b2"
}
},
"categories.1": {
"links": {
"self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de"
}
},
"tags.0": {
"links": {
"self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4"
}
},
"license": {
"links": {
"self": null
}
},
"examples.0": {
"links": {
"self": "../cycling-mileage/CyclingMileageLog/9fc98a27-ad5c-450d-843f-9c55730f0122"
}
},
"examples.1": {
"links": {
"self": "../cycling-mileage/CyclingMileageLog/866ddaf1-ea85-4a11-b012-7b2e9758a248"
}
},
"examples.2": {
"links": {
"self": "../cycling-mileage/CyclingMileageLog/e4f0c385-5558-4c68-acc9-3476baa61333"
}
}
},
"meta": {
"adoptsFrom": {
"module": "../catalog-app/listing/listing",
"name": "CardListing"
}
}
}
}
Loading