Notes
Notes - notes.io |
import omit from 'lodash-es/omit';
import get from 'lodash-es/get';
import set from 'lodash-es/set';
import isEqual from 'lodash-es/isEqual';
import groupBy from 'lodash-es/groupBy';
import uniqBy from 'lodash-es/uniqBy';
import appState from '../../../stores/appState';
import techSpecs from '../tech-specs.json';
import renderConfig from '../renderConfig';
import api from '../../../api/api';
import getDisplayName from '../../utils/getDisplayName';
class TechSpecsCustomize {
zipCode = '';
currentKitInfo = null;
displayName = 'Customize';
showDebugView = false;
favoriteName = '';
favoriteNameEdit = '';
configureForm = {};
optionValuesWithFacets = [];
kits = [];
currentPriceQuote = {};
displayAddToBag = false;
decisionTree = null;
optionValuesSteps = [];
optionValuesSortOrder = null;
debugList = [];
initialDebugList = [];
optionValuesWithFacetsBeforeReorder = null;
selectedOptionGroupTypeToReset = null;
favoritesList = [];
selectedFavorite = null;
isImageGalleryModalOpen = false;
isLoadFavoriteConfirmModalOpen = false;
isDeleteFavoriteConfirmModalOpen = false;
isEditFavoriteConfirmModalOpen = false;
isReviewDecisionTreeModalOpen = false;
priceDeltas = {};
imagesForGallery = [];
_optionValuesSelectionMap = {};
_hiddenOptionValuesWithFacets = [];
collectionTitle = '';
productVariants = [];
optionGroupTypes = [];
optionGroupTypeLabels = {};
filters = [];
showDebugView = false;
debugList = [];
constructor() {
this.appState = appState;
this.techSpecs = techSpecs;
makeObservable(this, {
zipCode: observable,
displayName: observable,
showDebugView: observable,
favoriteName: observable,
favoriteNameEdit: observable,
debugList: observable,
optionValuesSteps: observable,
kits: observable,
currentPriceQuote: observable,
displayAddToBag: observable,
decisionTree: observable,
configureForm: observable,
optionValuesWithFacets: observable,
optionValuesSortOrder: observable,
favoritesList: observable,
selectedFavorite: observable,
isImageGalleryModalOpen: observable,
isLoadFavoriteConfirmModalOpen: observable,
isDeleteFavoriteConfirmModalOpen: observable,
isEditFavoriteConfirmModalOpen: observable,
isReviewDecisionTreeModalOpen: observable,
selectedOptionGroupTypeToReset: observable,
priceDeltas: observable,
initialize: action,
updateValue: action,
showDebugView: observable,
debugList: observable,
filters: observable,
productVariants: observable,
updateFilter: action,
updateValue: action,
resetFilters: action,
reset: action
});
}
async loadDisplayName() {
try {
const displayName = await getDisplayName(
this.techSpecs.configureForm.aosContainerParts,
{
segment: this.techSpecs.configureForm.segment,
geo: this.techSpecs.configureForm.geo,
language: this.techSpecs.configureForm.language,
channel: this.techSpecs.configureForm.channel
},
'Customize',
this.addDebugList
);
this.displayName = displayName;
} catch (error) {
console.log(error);
this.appState.handleNotification({
error,
message: 'Unable to get display name. Please try again.',
levelType: 'danger'
});
}
}
updateValue({key, value}) {
this[key] = value;
}
addDebugList = (req, res, title) => {
this.debugList.push({req, res, title});
};
reset() {
runInAction(() => {
this.displayName = 'Customize';
this.showDebugView = false;
this.favoriteName = '';
this.favoriteNameEdit = '';
this.debugList = [];
this.initialDebugList = [];
this.configureForm = {};
this.kits = [];
this.currentPriceQuote = {};
this.currentKitInfo = null;
this.displayAddToBag = false;
this.decisionTree = null;
this.optionValuesSteps = [];
this.optionValuesWithFacets = [];
this.optionValuesSortOrder = null;
this.priceDeltas = {};
this.optionValuesWithFacetsBeforeReorder = null;
this.favoritesList = [];
this.isImageGalleryModalOpen = false;
this.isLoadFavoriteConfirmModalOpen = false;
this.isDeleteFavoriteConfirmModalOpen = false;
this.isEditFavoriteConfirmModalOpen = false;
this.isReviewDecisionTreeModalOpen = false;
this.selectedOptionGroupTypeToReset = null;
this.selectedFavorite = null;
this._hiddenOptionValuesWithFacets = [];
this._optionValuesSelectionMap = {};
this.imagesForGallery = [];
this.showDebugView = false;
this.debugList = [];
this.collectionTitle = '';
this.productVariants = [];
this.optionGroupTypes = [];
this.optionGroupTypeLabels = {};
this.filters = [];
});
}
async initialize() {
const schema = omit(techSpecs?.product_variants[0], ['id', 'text']);
const schemaKeys = Object.keys(schema);
try {
const req = {
"method": "getTechSpecs",
"collectionId": "MBP_2024_COLLECTION",
"fixedVariants": {
"selectedVariants": [
{
"optionGroupTypeKey": "processor",
"fixedFacets": [
{
"variantValue": "10",
"variantKey": "gpuCoreCount"
},
{
"variantValue": "16",
"variantKey": "neuralEngineCoreCount"
},
{
"variantValue": "m4",
"variantKey": "dimensionChip"
},
{
"variantValue": "10",
"variantKey": "cpuCoreCount"
}
]
}
]
},
"marketingContext": {
"revision": "R20250601",
"segment": "consumer",
"geo": "US",
"language": "en-us",
"channel": "internet"
}
};
let res = (await api.fetchTechSpecs(req)).data;
console.log(res,'res')
}
catch (error) {
console.log(error, 'error');
this.appState.handleNotification({
error,
message: 'Unable to fetch comparison. Please try again.',
levelType: 'danger'
});
runInAction(() => {
this.appState.err = true;
this.appState.isInitializing = false;
});
}
this.optionGroupTypes = schemaKeys;
this.collectionTitle = techSpecs.product_collection.collection_id;
this.optionGroupTypeLabels = Object.entries(schema).reduce((res, item) => {
res[item[0]] = item[1].label;
return res;
}, {});
this.filters = schemaKeys
.filter(key => {
const variantSchema = techSpecs.product_variants?.[0]?.[key];
if (!variantSchema?.value) {
return false;
} else return true;
})
.reduce((res, key) => {
const ids = new Set();
const options = [];
techSpecs.product_variants.forEach(productVariant => {
const option = productVariant[key];
const accessor = renderConfig[key].group_key || 'id';
const id = option[accessor];
if (!ids.has(id)) {
ids.add(id);
options.push({
disabled: false,
label: option.text,
value: id
});
}
});
if (options.length > 1) {
res.push([key, {value: null, options}]);
}
return res;
}, []);
this.productVariants = this.dedupe_and_group_productVariants(techSpecs.product_variants);
this.debugList.push({title: this.collectionTitle, req: {}, res: this.productVariants});
}
dedupe_and_group_productVariants(productVariants) {
const deduped = this.optionGroupTypes.reduce((res, key) => {
const ids = new Set();
const variants = [];
productVariants.forEach(productVariant => {
const variant = productVariant[key];
let id =
'dupe_keys' in renderConfig[key]
? renderConfig[key].dupe_keys.map(path => get(variant, path)).join(',')
: variant.id;
if (!ids.has(id)) {
ids.add(id);
if ('context_path' in renderConfig[key]) {
variant.__context__ = get(productVariant, renderConfig[key]['context_path']);
}
variants.push(variant);
}
});
res[key] = variants;
return res;
}, {});
this.optionGroupTypes.forEach(key => {
const dupe_keys_merge = renderConfig[key]['dupe_keys_merge'];
if (dupe_keys_merge) {
const {dupe_keys, merge_path} = dupe_keys_merge;
const ids = {};
deduped[key].forEach(productVariant => {
const id = dupe_keys.map(path => get(productVariant, path)).join(',');
if (!(id in ids)) {
set(productVariant, merge_path, [get(productVariant, merge_path)]);
ids[id] = productVariant;
} else {
get(ids[id], merge_path).push(get(productVariant, merge_path));
}
});
deduped[key] = Object.values(ids);
}
});
this.optionGroupTypes.forEach(key => {
if ('group_key' in renderConfig[key]) {
const {group_key} = renderConfig[key];
let groups = Object.values(groupBy(deduped[key], group_key));
if (renderConfig[key]['merge_render_paths']) {
let render_paths = renderConfig[key]['render_paths'].map(rp => rp?.key || rp);
groups.forEach((group, idx) => {
if (group.length > 1) {
let base = group[0];
for (let i = 1; i < group.length; i++) {
render_paths.forEach(rp => {
let val = get(group[i], rp);
if (val) {
const baseVal = get(base, rp);
if (!isEqual(val, baseVal)) {
if (Array.isArray(baseVal) && Array.isArray(val)) {
val = uniqBy([...baseVal, ...val], 'id');
} else console.warn('unhandled scenario');
}
set(base, rp, val);
}
});
}
groups[idx] = [base];
}
});
}
deduped[key] = groups;
}
});
return deduped;
}
updateFilter(idx, value, debugTitle) {
this.filters[idx][1].value = value;
let validFilters = this.filters.filter(filter => !!filter[1].value && filter[1].value.length);
let filtered = techSpecs.product_variants;
if (validFilters.length)
filtered = techSpecs.product_variants.filter(productVariant => {
return validFilters.every(filter => {
const [key, obj] = filter;
const accessor = renderConfig[key].group_key || 'id';
const value = productVariant[key][accessor];
return obj.value.some(obj => obj.value === value);
});
});
this.productVariants = this.dedupe_and_group_productVariants(filtered);
this.debugList.push({title: debugTitle, req: {}, res: this.productVariants});
}
updateValue({key, value}) {
this[key] = value;
}
resetFilters() {
this.filters = this.filters.map(filter => [filter[0], {value: null, options: filter[1].options}]);
this.productVariants = this.dedupe_and_group_productVariants(techSpecs.product_variants);
this.debugList.push({title: 'Reset Filters', req: {}, res: this.productVariants});
}
}
export default new TechSpecsCustomize();
json we are providing is
{
"$schema": "./macbookpro_schema.json",
"product_collection": {
"collection_id": "macbookpro"
},
"product_variants": [
{
"id": "macbookpro~14inch~spaceblack~m4~10core~10core~16gb-512gb",
"screen_size": {
"id": "screen_size",
"value": "14inch",
"label": "Screen Size",
"text": "14-inch"
},
"finish": {
"id": "finish",
"value": "spaceblack",
"label": "Finish",
"text": "Spaceblack"
},
"chip": {
"id": "chip.m4",
"value": "m4",
"text": "Apple M4 Chip",
"label": "Chip",
"components": {
"cpu": {
"id": "chip.components.cpu.10core",
"value": "10core",
"text": "10-core CPU with 4 performance cores and 6 efficiency cores"
},
"gpu": {
"id": "chip.components.gpu.10core",
"value": "10core",
"text": "10-core GPU"
},
"neural_engine": {
"id": "chip.components.neural_engine.16core",
"value": "16core",
"text": "16-core Neural Engine"
},
"memory_bandwidth": {
"id": "chip.components.memory_bandwidth.120gbps",
"value": "120gbps",
"text": "120GB/s memory bandwidth"
},
"media_engine": {
"id": "chip.components.media_engine",
"text": "Media Engine",
"features": [
{
"id": "chip.media_engine.features.hardware_accelerated_H264_prores_proresraw",
"value": "hardware_accelerated_H264_prores_proresraw",
"text": "Hardware-accelerated H.264, HEVC, ProRes, and ProRes RAW"
},
{
"id": "chip.media_engine.features.video_decode_engine",
"value": "video_decode_engine",
"text": "Video decode engine"
},
{
"id": "chip.media_engine.features.video_encode_engine",
"value": "video_encode_engine",
"text": "Video encode engine"
},
{
"id": "chip.media_engine.features.prores_encode_decode_engine",
"value": "prores_encode_decode_engine",
"text": "ProRes encode and decode engine"
},
{
"id": "chip.media_engine.features.av1_decode",
"value": "av1_decode",
"text": "AV1 decode"
}
]
}
}
},
"memory": {
"id": "memory.16gb",
"value": "16gb",
"text": "16GB Unified Memory",
"label": "Memory"
},
"storage": {
"id": "storage.512gb",
"value": "512gb",
"text": "512GB SSD Storage",
"label": "Storage"
},
"apple_intelligence": {
"id": "apple_intelligence",
"text": "Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.",
"label": "Apple Intelligence"
},
"display": {
"id": "display",
"label": "Display",
"liquid_retina_xdr": {
"id": "display.liquid_retina_xdr",
"text": "Liquid Retina XDR display",
"screen_size": {
"id": "display.liquid_retina_xdr.screen_size.14.2inch",
"value": "14.2inch",
"text": "14.2-inch (diagonal) Liquid Retina XDR display"
},
"screen_resolution": {
"id": "display.liquid_retina_xdr.screen_resolution.3024-by-1964",
"value": "3024-by-1964",
"text": "3024-by-1964 native resolution at 254 pixels per inch"
}
},
"xdr": {
"id": "display.xdr",
"text": "XDR (Extreme Dynamic Range)",
"contrast_ratio": {
"id": "display.xdr.contrast_ratio.1,000,000:1",
"value": "1,000,000:1",
"text": "1,000,000:1 contrast ratio"
},
"xdr_brightness": {
"id": "display.xdr.xdr_brightness",
"text": "XDR brightness: 1000 nits sustained full-screen, 1600 nits peak (HDR content only)"
},
"sdr_brightness": {
"id": "display.xdr.sdr_brightness",
"text": "SDR brightness: up to 1000 nits (outdoor)"
}
},
"color": {
"id": "display.color",
"text": "Color",
"features": [
{
"id": "display.color.1billion",
"value": "1billion",
"text": "1 billion colors"
},
{
"id": "display.color.wide_color_p3",
"value": "wide_color_p3",
"text": "Wide color (P3)"
},
{
"id": "display.color.true_tone_tech",
"value": "true_tone_tech",
"text": "True Tone technology"
}
]
},
"refresh_rates": {
"id": "display.refresh_rates",
"text": "Refresh rates",
"adaptive": {
"id": "display.refresh_rates.adaptive",
"text": "ProMotion technology for adaptive refresh rates up to 120Hz",
"frequencies": ["120Hz"]
},
"fixed": {
"id": "display.refresh_rates.fixed",
"text": "Fixed refresh rates: 47.95Hz, 48.00Hz, 50.00Hz, 59.94Hz, 60.00Hz",
"frequencies": ["47.95Hz", "48.00Hz", "50.00Hz", "59.94Hz", "60.00Hz"]
}
}
},
"battery_and_power": {
"id": "battery_and_power.m4",
"label": "Battery and Power",
"text": "M4",
"battery_life": {
"id": "battery_and_power.battery_life",
"video_streaming": {
"id": "battery_and_power.battery_life.video_streaming.upto24hours",
"value": "upto24hours",
"text": "Up to 24 hours video streaming"
},
"wireless_web": {
"id": "battery_and_power.battery_life.wireless_web.upto16hours",
"value": "upto16hours",
"text": "Up to 16 hours wireless web"
}
},
"battery_power": {
"id": "battery_and_power.battery_power.72.4-watt-hour",
"value": "72.4-watt-hour",
"text": "72.4-watt-hour"
},
"battery_type": {
"id": "battery_and_power.battery_type.lithium_polymer",
"value": "lithium_polymer",
"text": "lithium-polymer battery"
},
"power_adapter": {
"options": [
{
"id": "battery_and_power.power_adapter.70w_usbc",
"value": "70w",
"type": "usbc",
"fast_charge_capable": false,
"text": "70W USB-C Power Adapter"
},
{
"id": "battery_and_power.power_adapter.96w_usbc",
"value": "96w",
"type": "usbc",
"fast_charge_capable": true,
"text": "Fast-charge capable with 96W USB-C Power Adapter"
}
]
},
"cable": {
"id": "battery_and_power.cable.usbc_magsafe3",
"value": "usbc_magsafe3",
"type": "usbc",
"text": "USB-C to MagSafe 3 Cable"
}
},
"charging_and_expansion": {
"id": "charging_and_expansion.m4",
"label": "Charging and Expansion",
"text": "M4",
"ports": {
"sdxc": {
"id": "charging_and_expansion.ports.sdxc",
"value": "sdxc",
"count": 1,
"text": "SDXC card slot"
},
"hdmi": {
"id": "charging_and_expansion.ports.hdmi",
"value": "hdmi",
"count": 1,
"text": "HDMI port"
},
"3.5mm_headphone_jack": {
"id": "charging_and_expansion.ports.3.5mm_headphone_jack",
"value": "3.5mm_headphone_jack",
"count": 1,
"text": "3.5 mm headphone jack"
},
"thunderbolt4": {
"id": "charging_and_expansion.ports.thunderbolt4",
"value": "thunderbolt4",
"count": 3,
"text": "Three Thunderbolt 4 (USB-C) ports",
"speed": "40gbps",
"type": "usb4",
"features": [
{
"id": "charging_and_expansion.ports.thunderbolt4.features.charging",
"text": "Charging"
},
{
"id": "charging_and_expansion.ports.thunderbolt4.features.displayport",
"text": "DisplayPort"
},
{
"id": "charging_and_expansion.ports.thunderbolt4.features.thunderbolt4_40gbps",
"text": "Thunderbolt 4 (up to 40Gb/s)"
},
{
"id": "charging_and_expansion.ports.thunderbolt4.features.usb4_40gbps",
"text": "USB 4 (up to 40Gb/s)"
}
]
}
}
},
"display_support": {
"id": "display_support.m4_m4pro",
"label": "Display Support",
"text": "M4 and M4 Pro",
"external_displays": [
{
"id": "display_support.m4_m4pro.two_external_displays",
"value": "two_external_displays",
"text": "Simultaneously supports full native resolution on the built-in display at 1 billion colors and: Up to two external displays with up to 6K resolution at 60Hz over Thunderbolt, or one external display with up to 6K resolution at 60Hz over Thunderbolt and one external display with up to 4K resolution at 144Hz over HDMI. One external display supported at 8K resolution at 60Hz or one external display at 4K resolution at 240Hz over HDMI"
}
],
"thunderbolt4": {
"id": "display_support.thunderbolt4",
"text": "Thunderbolt 4 digital video output",
"features": [
{
"id": "display_support.thunderbolt4.features",
"text": "Support for native DisplayPort 1.4 output over USB-C"
}
]
},
"thunderbolt5": {
"id": "display_support.thunderbolt5",
"text": "Thunderbolt 5 digital video output",
"features": [
{
"id": "display_support.thunderbolt5.features",
"text": "Support for native DisplayPort 2.1 output over USB‑C"
}
]
},
"hdmi": {
"id": "display_support.hdmi",
"text": "HDMI digital video output",
"features": [
{
"id": "display_support.hdmi.features",
"text": "Support for one display with up to 8K resolution at 60Hz or 4K resolution at 240Hz"
}
]
}
},
"video_playback": {
"id": "video_playback",
"label": "Video Playback",
"text": "Supported formats include HEVC, H.264, AV1, and ProRes HDR with Dolby Vision, HDR10+/HDR10, and HLG",
"supported_formats": ["HEVC", "H.264", "AV1", "ProResHDR with Dolby Vision", "HDR10+/HDR10", "HLG"]
},
"audio_playback": {
"id": "audio_playback",
"label": "Audio Playback",
"text": "Supported formats include AAC, MP3, Apple Lossless, FLAC, Dolby Digital, Dolby Digital Plus, and Dolby Atmos",
"supported_formats": [
"AAC",
"MP3",
"Apple Lossless",
"FLAC",
"Dolby Digital",
"Dolby Digital Plus",
"Dolby Atmos"
]
},
"keyboard_and_trackpad": {
"id": "keyboard_and_trackpad",
"label": "Keyboard and Trackpad",
"text": "Backlit Magic Keyboard",
"features": [
{
"id": "keyboard_and_trackpad.features.keys",
"text": "78 (U.S.) or 79 (ISO) keys including 12 full-height function keys and 4 arrow keys in an inverted‑T arrangement"
},
{
"id": "keyboard_and_trackpad.features.touchid",
"value": "touchid",
"text": "Touch ID"
},
{
"id": "keyboard_and_trackpad.features.ambient_light_sensor",
"value": "ambient_light_sensor",
"text": "Ambient light sensor"
},
{
"id": "keyboard_and_trackpad.features.force_touch_trackpad",
"value": "force_touch_trackpad",
"text": "Force Touch trackpad for precise cursor control and pressure-sensing capabilities; enables Force clicks, accelerators, pressure-sensitive drawing, and Multi-Touch gestures"
}
]
},
"wireless": {
"id": "wireless",
"label": "Wireless",
"wifi": {
"id": "wireless.wifi.wifi6",
"value": "wifi6",
"text": "Wi-Fi 6 (802.11ax)"
},
"bluetooth": {
"id": "wireless.bluetooth.bluetooth5.3",
"value": "bluetooth5.3",
"text": "Bluetooth 5.3"
}
},
"camera": {
"id": "camera",
"label": "Camera",
"resolution": "12MP",
"video_resolution": "1080p",
"features": [
{
"id": "camera.features.12mp",
"text": "12MP Center Stage camera with support for Desk View"
},
{
"id": "camera.features.1080p",
"text": "1080p HD video recording"
},
{
"id": "camera.features.image_signal_processor",
"text": "Advanced image signal processor with computational video"
}
]
},
"audio": {
"id": "audio",
"label": "Audio",
"features": [
{
"id": "audio.features.high-fidelity_six-speaker",
"text": "High-fidelity six-speaker sound system with force-cancelling woofers"
},
{
"id": "audio.features.wide_stereo_sound",
"text": "Wide stereo sound"
},
{
"id": "audio.features.spatial_audio_support",
"text": "Support for Spatial Audio when playing music or video with Dolby Atmos on built-in speakers"
},
{
"id": "audio.features.dynamic_headtracking",
"text": "Spatial Audio with dynamic head tracking when using AirPods 3, AirPods 4, AirPods Pro, AirPods Pro 2, and AirPods Max"
},
{
"id": "audio.features.three-mic_array",
"text": "Studio-quality three-mic array with high signal-to-noise ratio and directional beamforming"
},
{
"id": "audio.features.3_mm_headphone_jack",
"text": "3.5 mm headphone jack with advanced support for high_impedance headphones"
},
{
"id": "audio.features.hdmi",
"text": "HDMI port supports multichannel audio output"
}
]
},
"operating_requirement": {
"id": "operating_requirement",
"label": "Operating Requirements",
"line_voltage": {
"id": "operating_requirement.line_voltage.100v-240v",
"value": "100v-240v",
"text": "Line voltage: 100V to 240V AC"
},
"frequency": {
"id": "operating_requirement.frequency.50hz-60hz",
"value": "50hz-60hz",
"text": "Frequency: 50Hz to 60Hz"
},
"operating_temperature": {
"id": "operating_requirement.operating_temperature.50-90",
"value": "50-90",
"text": "Operating temperature: 50° to 95° F (10° to 35° C)"
},
"storage_temperature": {
"id": "operating_requirement.storage_temperature.min13-113f",
"value": "min13-113f",
"text": "Storage temperature: –13° to 113° F (–25° to 45° C)"
},
"relative_humidity": {
"id": "operating_requirement.relative_humidity.zero-90",
"value": "zero-90",
"text": "Relative humidity: 0% to 90% noncondensing"
},
"operating_altitude": {
"id": "operating_requirement.operating_altitude.tested_10kf",
"value": "tested_10kf",
"text": "Operating altitude: tested up to 10,000 feet (3000 meters)"
},
"max_storage_altitude": {
"id": "operating_requirement.max_storage_altitude.15kf",
"value": "15kf",
"text": "Maximum storage altitude: 15,000 feet"
},
"max_shipping_altitude": {
"id": "operating_requirement.max_shipping_altitude.35kf",
"value": "35kf",
"text": "Maximum shipping altitude: 35,000 feet"
}
},
"size_weight": {
"id": "size_weight",
"label": "Size and Weight",
"height": {
"id": "size_weight.height",
"value": 0.61,
"unit": "inch",
"text": "Height: 0.61 inch (1.55 cm)"
},
"width": {
"id": "size_weight.width",
"value": 12.31,
"unit": "inch",
"text": "Width: 12.31 inches (31.26 cm)"
},
"depth": {
"id": "size_weight.depth",
"value": 8.71,
"unit": "inch",
"text": "Depth: 8.71 inches (22.12 cm)"
},
"weight": {
"id": "size_weight.weight",
"value": 3.4,
"unit": "lbs",
"text": "Weight (M4): 3.4 pounds (1.55 kg)9"
}
},
"accessibility": {
"id": "accessibility",
"text": "Accessibility features help people with disabilities get the most out of their new MacBook Pro. With built-in support for vision, hearing, mobility, and learning, you can create and do amazing things.",
"label": "Accessibility",
"features": [
{
"id": "accessibility.features.voice_control",
"value": "voice_control",
"text": "Voice Control"
},
{
"id": "accessibility.features.voiceover",
"value": "voiceover",
"text": "Voiceover"
},
{
"id": "accessibility.features.zoom",
"value": "zoom",
"text": "Zoom"
},
{
"id": "accessibility.features.increase_contrast",
"value": "increase_contrast",
"text": "Increase Contrast"
},
{
"id": "accessibility.features.reduce_motion",
"value": "reduce_motion",
"text": "Reduce Motion"
},
{
"id": "accessibility.features.siri_and_dictation",
"value": "siri_and_dictation",
"text": "Siri and Dictation"
},
{
"id": "accessibility.features.switch_control",
"value": "switch_control",
"text": "Switch Control"
},
{
"id": "accessibility.features.closed_captions",
"value": "closed_captions",
"text": "Closed Captions"
},
{
"id": "accessibility.features.text_to_speech",
"value": "text_to_speech",
"text": "Text To Speech"
}
]
},
"built_in_apps": {
"id": "built_in_apps",
"label": "Built-in Apps",
"apps": [
[
{
"id": "built_in_apps.app_store",
"value": "app_store",
"text": "App Store"
},
{
"id": "built_in_apps.books",
"value": "books",
"text": "Books"
},
{
"id": "built_in_apps.calendar",
"value": "calendar",
"text": "Calendar"
},
{
"id": "built_in_apps.contacts",
"value": "contacts",
"text": "Contacts"
},
{
"id": "built_in_apps.facetime",
"value": "facetime",
"text": "FaceTime"
},
{
"id": "built_in_apps.find_my",
"value": "find_my",
"text": "Find My"
},
{
"id": "built_in_apps.freeform",
"value": "freeform",
"text": "Freeform"
},
{
"id": "built_in_apps.garageband",
"value": "garageband",
"text": "GarageBand"
},
{
"id": "built_in_apps.home",
"value": "home",
"text": "Home"
},
{
"id": "built_in_apps.imovie",
"value": "imovie",
"text": "iMovie"
},
{
"id": "built_in_apps.iphone_mirroring",
"value": "iphone_mirroring",
"text": "iPhone Mirroring"
},
{
"id": "built_in_apps.keynote",
"value": "keynote",
"text": "Keynote"
},
{
"id": "built_in_apps.mail",
"value": "mail",
"text": "Mail"
},
{
"id": "built_in_apps.maps",
"value": "maps",
"text": "Maps"
},
{
"id": "built_in_apps.messages",
"value": "messages",
"text": "Messages"
},
{
"id": "built_in_apps.music",
"value": "music",
"text": "Music"
},
{
"id": "built_in_apps.news",
"value": "news",
"text": "News"
},
{
"id": "built_in_apps.notes",
"value": "notes",
"text": "Notes"
},
{
"id": "built_in_apps.numbers",
"value": "numbers",
"text": "Numbers"
},
{
"id": "built_in_apps.pages",
"value": "pages",
"text": "Pages"
},
{
"id": "built_in_apps.passwords",
"value": "passwords",
"text": "Passwords"
},
{
"id": "built_in_apps.photo_booth",
"value": "photo_booth",
"text": "Photo Booth"
},
{
"id": "built_in_apps.photos",
"value": "photos",
"text": "Photos"
},
{
"id": "built_in_apps.podcasts",
"value": "podcasts",
"text": "Podcasts"
},
{
"id": "built_in_apps.preview",
"value": "preview",
"text": "Preview"
},
{
"id": "built_in_apps.quicktime_player",
"value": "quicktime_player",
"text": "QuickTime Player"
},
{
"id": "built_in_apps.reminders",
"value": "reminders",
"text": "Reminders"
},
{
"id": "built_in_apps.safari",
"value": "safari",
"text": "Safari"
},
{
"id": "built_in_apps.shortcuts",
"value": "shortcuts",
"text": "Shortcuts"
},
{
"id": "built_in_apps.stocks",
"value": "stocks",
"text": "Stocks"
},
{
"id": "built_in_apps.time_machine",
"value": "time_machine",
"text": "Time Machine"
},
{
"id": "built_in_apps.tips",
"value": "tips",
"text": "Tips"
},
{
"id": "built_in_apps.tv",
"value": "tv",
"text": "TV"
},
{
"id": "built_in_apps.voice_memos",
"value": "voice_memos",
"text": "Voice Memos"
},
{
"id": "built_in_apps.weather",
"value": "weather",
"text": "Weather"
}
]
]
},
"in-the-box": {
"id": "in-the-box",
"label": "In the Box",
"items": [
{
"id": "in-the-box.items.14inch_macbookpro",
"value": "14inch_macbookpro",
"text": "14-inch MacBook Pro"
},
{
"id": "in-the-box.items.70w_poweradapter",
"value": "70w_poweradapter",
"text": "70W USB-C Power Adapter"
},
{
"id": "in-the-box.items.usbc_to_magsafe_cable",
"value": "usbc_to_magsafe_cable",
"text": "USB-C to MagSafe 3 Cable (2 m)"
},
{
"id": "in-the-box.items.polishing_cloth",
"value": "polishing_cloth",
"text": "Polishing cloth (only with nano-texture display option)"
}
]
},
"text": "Macbook Pro 14inch Spaceblack M4 CPU (10core) GPU(10core) Memory(16gb) Storage(512gb)"
},
![]() |
Notes is a web-based application for online taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000+ notes created and continuing...
With notes.io;
- * You can take a note from anywhere and any device with internet connection.
- * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
- * You can quickly share your contents without website, blog and e-mail.
- * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
- * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.
Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.
Easy: Notes.io doesn’t require installation. Just write and share note!
Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )
Free: Notes.io works for 14 years and has been free since the day it was started.
You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;
Email: [email protected]
Twitter: http://twitter.com/notesio
Instagram: http://instagram.com/notes.io
Facebook: http://facebook.com/notesio
Regards;
Notes.io Team
